Compare commits

..

1339 Commits

Author SHA1 Message Date
Huong Nguyen 71f4153316 weekly release 5.0.6+ 2026-03-27 15:40:52 +07:00
Huong Nguyen e0b5cab5f0 NOBUG: Add upgrade notes 2026-03-27 15:40:51 +07:00
Huong Nguyen a110695eaa Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2026-03-27 15:40:38 +07:00
Huong Nguyen 5db546886a Merge branch 'MDL-81241-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2026-03-26 10:51:22 +07:00
Huong Nguyen 1ce9d9fc64 Merge branch 'MDL-88279-500' of https://github.com/meirzamoodle/moodle into MOODLE_500_STABLE 2026-03-26 07:49:36 +07:00
AMOS bot 7a07b77216 Automatically generated installer lang files 2026-03-26 00:07:45 +00:00
Huong Nguyen 978614b029 Merge branch 'MDL-77558-500' of https://github.com/davewoloszyn/moodle into MOODLE_500_STABLE 2026-03-25 14:38:06 +07:00
Huong Nguyen ad191cfbb8 Merge branch 'MDL-85451-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2026-03-25 14:30:07 +07:00
Huong Nguyen 72d5be5541 Merge branch 'MDL-87560-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-25 14:27:36 +07:00
David Woloszyn 04aef8439d MDL-77558 mod_forum: Mark posts as read in forum grader 2026-03-25 17:38:48 +11:00
Huong Nguyen e41ba343d3 Merge branch 'MDL-87548-500' of https://github.com/andimendunia/moodle into MOODLE_500_STABLE 2026-03-25 10:50:31 +07:00
Huong Nguyen ca82ae7821 Merge branch 'MDL-88197-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-25 09:22:57 +07:00
Huong Nguyen a333518751 Merge branch 'MDL-88076-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-25 09:15:53 +07:00
Huong Nguyen c5c3a666aa Merge branch 'MDL-87626-500' of https://github.com/davewoloszyn/moodle into MOODLE_500_STABLE 2026-03-25 09:04:34 +07:00
Huong Nguyen 4f1c7bd20f Merge branch 'MDL-87803-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-25 08:59:33 +07:00
Huong Nguyen de6aebd83b Merge branch 'MDL-87580-task-autolinking-MOODLE_500_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_500_STABLE 2026-03-25 08:48:37 +07:00
Paul Holden c378ea7409 MDL-87560 assignsubmission_onlinetext: indicate truncated summary.
Only when the submission has been truncated should we show the
"View more" link, otherwise it appears to not do anything for already
short text.
2026-03-24 12:48:08 +00:00
meirzamoodle 61be76a0cb MDL-88279 core_session: fix cluster test retry count assertion
Update session_redis_cluster_test to expect 3 connection attempts
instead of 5, matching the $maxretries default value in redis.php.
2026-03-24 14:39:44 +07:00
Huong Nguyen 636b899df7 Merge branch 'MDL-88070-500' of https://github.com/sh-csg/moodle into MOODLE_500_STABLE 2026-03-24 08:40:31 +07:00
Huong Nguyen c6c0fab232 Merge branch 'MDL-87748-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2026-03-24 08:37:53 +07:00
Huong Nguyen 1838b227de Merge branch 'MDL-51152-500' of https://github.com/christianabila/moodle into MOODLE_500_STABLE 2026-03-24 08:32:37 +07:00
Huong Nguyen bc3c9538a9 Merge branch 'MDL-66415-500' of https://github.com/raortegar/moodle into MOODLE_500_STABLE 2026-03-23 13:46:20 +07:00
Huong Nguyen 44e38356b1 Merge branch 'MDL-87941-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-23 13:41:49 +07:00
Huong Nguyen f90654eef6 Merge branch 'MDL-87438-500' of https://github.com/muhammadarnaldo/moodle into MOODLE_500_STABLE 2026-03-23 13:37:13 +07:00
David Woloszyn acad3aa672 MDL-87626 core_search: Fix typo in input value check
Co-authored-by: Uli Wessmann
2026-03-23 13:42:38 +11:00
AMOS bot cb1a01e6ff Automatically generated installer lang files 2026-03-21 00:07:49 +00:00
Luca Bösch 2d21be7a4f MDL-87748 assign: format checkbox with Bootstrap classes. 2026-03-20 08:56:02 +01:00
Mihail Geshoski 4f5d0ad9b0 Merge branch 'MDL-88122-navbar_empty-breadcrumb-M5.0' of https://github.com/stopfstedt/moodle into MOODLE_500_STABLE 2026-03-20 15:35:34 +08:00
Mihail Geshoski c7ef374f46 Merge branch 'MDL-87320-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2026-03-20 15:25:48 +08:00
Mihail Geshoski f6ef9913d8 Merge branch 'MDL-84780-500' of https://github.com/sh-csg/moodle into MOODLE_500_STABLE 2026-03-20 15:21:16 +08:00
Mihail Geshoski 7d23b29321 Merge branch 'MDL-83459_500_create_submission_switchids_cmid' of https://github.com/sharpchi/moodle into MOODLE_500_STABLE 2026-03-20 15:16:15 +08:00
Shamim Rezaie 961d7cea4f weekly release 5.0.6+ 2026-03-20 15:11:21 +11:00
Shamim Rezaie 941a996dfe NOBUG: Add upgrade notes 2026-03-20 15:11:20 +11:00
Shamim Rezaie 733db470a2 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2026-03-20 15:11:04 +11:00
Stefan Hanauska 876a6ed947 MDL-84780 course: Disabled modules are not allowed 2026-03-19 20:47:24 +01:00
Luca Bösch de5ea7e700 MDL-87320 forum: Correctly escape group names. 2026-03-19 17:44:02 +01:00
Brendan Heywood a7ad739746 MDL-87580 task: Fix task output autolinking 2026-03-20 01:42:31 +11:00
Jun Pataleta f5f18cec27 MDL-81241 theme_boost: Accessibility test for the footer region links 2026-03-19 20:31:02 +08:00
Jun Pataleta bd236e173b MDL-81241 theme_boost: Ensure footer links have sufficient spacing 2026-03-19 20:31:01 +08:00
Safat 890b4aae57 MDL-87959 tool_installaddon: Fix behats for activity chooser footer 2026-03-19 12:14:54 +07:00
Mihail Geshoski 41c7b8d641 Merge branch 'MDL-87321-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-19 10:49:40 +08:00
Huong Nguyen 569efeb343 Merge branch 'MDL-88080-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-19 09:11:31 +07:00
Huong Nguyen d78ddaebc5 Merge branch 'MDL-88054-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-19 08:58:13 +07:00
Mihail Geshoski a234c3bea9 Merge branch 'MDL-87810-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2026-03-19 09:50:13 +08:00
Huong Nguyen 2613dc5b8e Merge branch 'MDL-87935-500' of https://github.com/yusufwib01/moodle into MOODLE_500_STABLE 2026-03-19 08:23:43 +07:00
Huong Nguyen 5e4c29a948 Merge branch 'MDL-87592-500' of https://github.com/andimendunia/moodle into MOODLE_500_STABLE 2026-03-19 08:19:07 +07:00
Mark Sharp e5ef8781a9 MDL-83459 mod_assign: change switchids to use cmid 2026-03-18 15:45:07 +00:00
Ilya Tregubov 8dbd5bde8f Merge branch 'MDL-75067-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-18 14:02:12 +01:00
Mihail Geshoski 6dcd98ae8d Merge branch 'MDL-87096-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-18 17:36:49 +08:00
Andi Permana cd9aa203b3 MDL-87592 auth_email: preserve wantsurl through MFA email confirmation 2026-03-18 16:06:09 +07:00
Raquel Ortega 41cf49bee1 MDL-66415 core_message: Improve bulk messaging result handling 2026-03-18 09:35:49 +01:00
Jun Pataleta fb5e982a90 MDL-85451 block_timeline: Add accessibility Behat test coverage 2026-03-18 13:24:39 +08:00
Jun Pataleta adb609a38d MDL-85451 block_timeline: Group the due date filter options
To ensure that the filter options for the day filter menu matches
the menu pattern and pass accessibility checks, we need to:
* Group the due date filter options, labelled by the "Due date"
"heading".
* Set the "Due date" heading with a presentation role to prevent
assistive technologies from announcing it when the user goes through
the menu options.
2026-03-18 13:24:38 +08:00
Jun Pataleta 8189c4b741 MDL-85451 block_timeline: Fix heading levels 2026-03-18 13:24:38 +08:00
Paul Holden 6d519e67ba Merge branch 'MDL-88226-500' of https://github.com/dravek/moodle into MOODLE_500_STABLE 2026-03-17 10:29:46 +00:00
David Carrillo 5b1955c073 MDL-88226 phpunit: Fix fragile tests using adhoc task manager
- Reset task manager state when resetting all data
- mod_quiz: Fix fragile adhoc task manager tests
- mod_assign: Fix fragile adhoc task manager tests
2026-03-16 16:38:59 +01:00
Paul Holden 179a1604d9 MDL-88076 tool_mfa: improved parsing of redirect exclusions config.
Ensure all permutations of EOL markers are covered/trimmed.
2026-03-16 11:36:42 +00:00
Huong Nguyen eda03a322b Merge branch 'MDL-86839-MOODLE_500_STABLE' of https://github.com/PhMemmel/moodle into MOODLE_500_STABLE 2026-03-16 16:33:32 +07:00
Shamim Rezaie 4d0e4b7875 Merge branch 'MDL-82625-500' of https://github.com/cameron1729/moodle into MOODLE_500_STABLE 2026-03-16 18:28:19 +11:00
Huong Nguyen ac1d781d5e Merge branch 'MDL-87795-500' of https://github.com/albertgasset/moodle into MOODLE_500_STABLE 2026-03-16 09:46:06 +07:00
Huong Nguyen dff82484c8 Merge branch 'MDL-82439_500' of https://github.com/jonof/moodle into MOODLE_500_STABLE 2026-03-16 08:49:04 +07:00
Jake Dallimore bceaf184ba Merge branch 'MDL-83096-500' of https://github.com/jason-platts/moodle into MOODLE_500_STABLE 2026-03-16 09:43:13 +08:00
yusufwib01 7e9f571573 MDL-87935 aiprovider_ollama: fix incorrect error response handling 2026-03-14 02:48:18 +07:00
Sara Arjona 1768c5e66c Merge branch 'MDL-88211-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-13 15:25:02 +01:00
Paul Holden 4605729d45 MDL-88211 backup: remove redundant usage of task manager from tests.
The asynchronouse backup/restore tests are only concerned with testing
the implementation of the accompanying task class directly. When they
try to do so at a distance via the task manager API they introduce
random failures by failing to account for different queued tasks that
come from other components (e.g. Workplace).
2026-03-13 12:40:16 +00:00
Daniel Poggenpohl d446b2b831 MDL-83096 mod_lti: Register view completion when launching in new window 2026-03-13 09:02:54 +00:00
Mihail Geshoski 8ac692cab7 Merge branch 'MDL-87516-500' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_500_STABLE 2026-03-13 15:36:10 +08:00
Huong Nguyen 520a9a99a9 Merge branch 'MDL-87959-500' of https://github.com/safatshahin/moodle into MOODLE_500_STABLE 2026-03-13 14:05:56 +07:00
Philipp Memmel 2bd5cb2531 MDL-86839 grunt: Make grunt watch respect --force option 2026-03-13 07:34:08 +01:00
Sara Arjona 27e17c32a6 Merge branch 'MDL-88109-500' of https://github.com/sarjona/moodle into MOODLE_500_STABLE 2026-03-13 06:45:34 +01:00
Safat 927bae14c6 MDL-87959 admin: Add marketplace availability in notifications 2026-03-13 15:55:44 +11:00
Safat 3d37413b84 MDL-87959 tool_installaddon: Add support for marketplace 2026-03-13 15:55:44 +11:00
Mihail Geshoski 8405e26f4e Merge branch 'MDL-81608-500-2' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2026-03-13 09:54:19 +08:00
Huong Nguyen 59443e629b Merge branch 'MDL-87100-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-13 08:39:16 +07:00
Huong Nguyen d1aeafe3ba Merge branch 'MDL-86843-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2026-03-13 08:29:12 +07:00
Jonathon Fowler e247226574 MDL-82439 iplookup: catch and handle GeoIp2 exceptions 2026-03-13 07:42:19 +10:00
Albert Gasset 3486d93e2d MDL-87795 message_airnotifier: Handle 404 (unregistered token) responses 2026-03-12 11:51:54 +01:00
Paul Holden 195eb54c1d MDL-88197 customfield_number: observe required field configuration. 2026-03-12 09:19:38 +00:00
Huong Nguyen 449286a45a MDL-86843 tool_task: style tables correctly. 2026-03-12 09:51:35 +01:00
Andi Permana 5c1d657758 MDL-87548 repository_wikimedia: Handle HTTP 429 rate limiting 2026-03-12 15:29:37 +07:00
Huong Nguyen f04e80afcb Merge branch 'MDL-86616_500' of https://github.com/timhunt/moodle into MOODLE_500_STABLE 2026-03-12 14:43:53 +07:00
Mihail Geshoski 37aacf4078 Merge branch 'MDL-74519-500' of https://github.com/AnupamaSarjoshi/moodle into MOODLE_500_STABLE 2026-03-12 14:08:57 +08:00
Mihail Geshoski b569462cd3 Merge branch 'MDL-85637-500' of https://github.com/izendegi/moodle into MOODLE_500_STABLE 2026-03-12 14:03:56 +08:00
Safat 416cda978f Merge branch 'MDL-87708-500' of https://github.com/HuongNV13/moodle into MOODLE_500_STABLE 2026-03-12 15:14:46 +11:00
Huong Nguyen 208f519e18 MDL-87708 tool_moodlenet: Remove post install task 2026-03-12 10:47:50 +07:00
Huong Nguyen cb00b13745 MDL-87708 admin: Improve MoodleNet removal warnings message 2026-03-12 10:15:44 +07:00
Andi Permana 7afd9fa73a MDL-87708 tool_moodlenet: Clean up moodle.net configs in stable
Part of MDL-87351

- Discourage tool_moodlenet unless pointing to custom installation
- Clear activity chooser footer if set to MoodleNet
- Cleanup happens for: moodle.net URL, www.moodle.net, or empty config
- Preserves custom/local MoodleNet installations
2026-03-12 10:15:44 +07:00
hieuvu 59cdf4341d MDL-87516 core_question: update behaviour when update question attempt. 2026-03-12 09:17:41 +07:00
Stefan Topfstedt 0a9a626b65 MDL-88122 navigation: omit empty breadcrumb container in output. 2026-03-11 17:45:36 -07:00
Sara Arjona c08ab3ca54 MDL-88109 router: Use unencoded URL for location redirect 2026-03-11 16:46:22 +01:00
Hai Nguyen Van 2f1da3e9e8 MDL-86616 filepicker: link restrictions to input via aria-describedby 2026-03-11 11:03:08 +00:00
Iñigo Zendegi 8a27867a0d MDL-85637 question: Optimize max question version SQL query 2026-03-11 11:46:47 +01:00
Anupama Sarjoshi f89c4550fe MDL-74519 badges: Fix date validation in course completion criteria
Ensures that badge awarding correctly evaluates the configured by-date
condition in course and course set completion criteria.

Co-authored by: Diego Campos
2026-03-11 10:02:54 +05:30
Mihail Geshoski 1fedd03d02 Merge branch 'MDL-87955-500-2' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2026-03-11 11:55:41 +08:00
AMOS bot da1991815a Automatically generated installer lang files 2026-03-11 00:09:28 +00:00
Jun Pataleta 974afeccd5 MDL-81608 quiz: Add Add menu spacing to prevent overlap 2026-03-10 17:58:58 +08:00
Jun Pataleta 8209259991 MDL-81608 quiz: Set more meaningful button labels
* Add/remove page break buttons
* Move question buttons
2026-03-10 17:58:57 +08:00
Jun Pataleta 9596fe1a83 MDL-81608 core: Add alt text to the YUI spinner image
The accessibility Behat test added to the quiz editing page uncovered
that the loading spinner icon does not have an appropriate alt text.
2026-03-10 17:58:57 +08:00
Jun Pataleta f2f26105d5 MDL-81608 quiz: Adjust size and spacing for the quiz edit page buttons
* In order to meet WCAG 2.2 criterion for minimum target size and make
it easier for users who have mobility limitations to use the quiz
editing page, we need to use the Bootstrap icon button styles and
increase the size and the spacing for the following buttons:
  * Add/remove page break button
  * Lock/unlock question dependency button
* This commit also makes the icons within the buttons as decorative and
moves the accessible name to the button elements themselves via the
aria-label attribute.
* Adjust Behat tests for checking the dependency buttons.
* Add accessibility Behat coverage for the quiz edit page.
2026-03-10 17:58:57 +08:00
Jun Pataleta d062f46eea MDL-81608 core: Label YUI dragdrop handles appropriately
The YUI dragdrop handles rely on the button's title attribute for its
accessible label. We should label it appropriately using the
aria-label attribute.
2026-03-10 17:58:56 +08:00
Huong Nguyen f71a7c928f Merge branch 'MDL-86698-500' of https://github.com/mickhawkins/moodle into MOODLE_500_STABLE 2026-03-10 08:26:26 +07:00
Paul Holden 84c053eca8 MDL-88080 admin: initially focus the form element failing validation.
This appears to replicate what the ancient admin_externalpage_print_header
method did prior to being deprecated in db785816, however its replacement
didn't support the same $focus argument - hence doing so manually now.
2026-03-09 11:58:05 +00:00
Huong Nguyen 854558c727 Merge branch 'MDL-88093-failed-task-lang-MOODLE_500_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_500_STABLE 2026-03-09 09:11:09 +07:00
Huong Nguyen 681bc5f284 Merge branch 'MDL-87883-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-09 09:06:27 +07:00
Huong Nguyen 2802c659fe Merge branch 'MDL-79324-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2026-03-09 09:03:28 +07:00
Paul Holden 6c453d0f15 MDL-87803 blocks: set ARIA label to string content value.
Previously it was a string instance, which meant it wasn't encoded
correctly when used as part of the delete block confirmation.
2026-03-06 14:46:13 +00:00
Michael Hawkins 2dbbfd945f MDL-86698 core: Update security.txt expiry 2026-03-06 19:09:54 +08:00
Luca Bösch 557c0f54c4 MDL-79324 quiz: Don't show "Back" button in secure layout. 2026-03-06 11:07:09 +01:00
Jake Dallimore 2baad2002f weekly release 5.0.6+ 2026-03-06 12:10:19 +08:00
Jake Dallimore c9195c5ef7 NOBUG: Add upgrade notes 2026-03-06 12:10:19 +08:00
Jake Dallimore 20b33578e3 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2026-03-06 12:10:14 +08:00
Brendan Heywood 63e1d9c227 MDL-88093 task: Send task failure messages in correct language 2026-03-05 22:04:52 +11:00
Muhammad Arnaldo 7299e4dcb6 MDL-87438 core: Fix multiselect saving with empty choices 2026-03-05 14:23:19 +07:00
Jake Dallimore af9d221360 Merge branch 'MDL-86154_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2026-03-05 11:56:09 +08:00
Adrian Greeve 6b3619dab9 Merge branch 'MDL-88009-500' of https://github.com/andrewnicols/moodle into MOODLE_500_STABLE 2026-03-05 10:55:49 +08:00
Huong Nguyen 4ec4d94d95 Merge branch 'MDL-87657-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-05 09:22:54 +07:00
Mihail Geshoski 872f2c1f01 Merge branch 'MDL-86691_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2026-03-05 09:44:32 +08:00
Jun Pataleta bfe8192363 MDL-87810 quiz: Accessibility Behat coverage for quiz attempt 2026-03-05 08:47:40 +08:00
Jun Pataleta 57fdeaedd7 MDL-87810 question: Fix colour contrast issues on question view
* Lighten the background for the question formulation container.
* Lighten the background for the question feedback container while
  slightly darkening the text font as well.
2026-03-05 08:47:39 +08:00
Jun Pataleta 475777e2dd Merge branch 'MDL-87949-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-04 21:26:09 +08:00
Jun Pataleta 7ddc61c4a3 MDL-87955 mod_forum: Manage subscribers accessibility improvements
* Replace the layout table with responsive Bootstrap columns.
* Add accessible labels for the existing and potential subscribers
  select boxes.
* Add accessibility Behat coverage.
* Remove unused CSS styles
2026-03-04 12:58:11 +08:00
Huong Nguyen 3b446e0dcc Merge branch 'MDL-85322-500' of https://github.com/durenadev/moodle into MOODLE_500_STABLE 2026-03-04 09:20:15 +07:00
Huong Nguyen 1c3d548e5c Merge branch 'MDL-86112_500' of https://github.com/jonof/moodle into MOODLE_500_STABLE 2026-03-04 08:55:16 +07:00
Huong Nguyen 0109cbd42d Merge branch 'MDL-87905-m500' of https://github.com/sammarshallou/moodle into MOODLE_500_STABLE 2026-03-04 08:50:09 +07:00
AMOS bot eda93c16c8 Automatically generated installer lang files 2026-03-04 00:07:47 +00:00
Daniel Ureña 0e397a294c MDL-85322 block_html: trust dashboard content in WS context 2026-03-03 11:52:39 +01:00
Sara Arjona d729e47c38 Merge branch 'MDL-87980-500' of https://github.com/laurentdavid/moodle into MOODLE_500_STABLE 2026-03-03 10:30:02 +01:00
Mihail Geshoski 3fe4bb91ac Merge branch 'MDL-87315_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2026-03-03 16:37:37 +08:00
Safat 9bb22640b4 Merge branch 'MDL-88030-500' of https://github.com/HuongNV13/moodle into MOODLE_500_STABLE 2026-03-03 14:49:44 +11:00
Jonathon Fowler 0ceeee464b MDL-86112 courseformat: avoid a JS error modal when marking as done
When viewing an "available but not shown" cm with self-completion set,
then clicking the 'Mark as done' button in the activity header.
2026-03-03 11:40:45 +10:00
Huong Nguyen 0b99cbdf78 Merge branch 'MDL-87993-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2026-03-03 08:36:22 +07:00
Huong Nguyen 1490960fd4 Merge branch 'MDL-87945-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-03 08:33:35 +07:00
Huong Nguyen 0d59764b12 Merge branch 'MDL-60912-500' of https://github.com/AnupamaSarjoshi/moodle into MOODLE_500_STABLE 2026-03-03 08:30:59 +07:00
Huong Nguyen 28e1177c9d Merge branch 'MDL-87710-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-03-03 08:28:33 +07:00
Paul Holden 824b1ed336 MDL-75067 behat: always interact with filepicker inside active dialogue.
This allows for tests to interact with multiple elements of this type
during scenarios, whereas previously Behat would always try to interact
with the first (even when referring to latter file managers).
2026-03-02 11:04:15 +00:00
Mark Johnson 541790a5d2 MDL-86154 questions: Delete unused questions after restore
After restoring an activity using shared questions without the question
bank they belong to, we may have left over question categories in the
target course context. These were being deleted, but any questions they
contained weren't.

This replaces the bulk delete of question category records with a call
to `question_category_delete_safe()` for each category, which will also
delete the questions they contain.
2026-02-27 14:36:19 +00:00
Mark Johnson 1890a0b94d MDL-87315 backup: Update set reference question category ID on restore.
When a question bank is restored along with a quiz that uses a random question from that bank,
the set reference for the random question should now point to the category in the restored bank,
rather than original.

This uses the question bank context IDs recorded using the method added in MDL-86136
to decide if the set reference's question context is being restored, and update it
accordingly.

This required adding a new restore step in the restore_root_task, since when a restore is
performed asynchronously, the temp IDs table is deleted after the prechecks are performed
when the task is queued. Adding this step allows the IDs to be recorded again when the restore
runs.
2026-02-27 13:44:30 +00:00
Laurent David 0eb03badc3 MDL-87980 mod_assign: Fix empty description display 2026-02-27 11:46:18 +01:00
Paul Holden 4ca9b8a9d5 MDL-88054 tool_mfa: ensure factor preference icons are circular.
They were once, but then weren't. Probably same cause as that fixed
in 0ff8f7b2 for all emoticons.
2026-02-27 09:57:39 +00:00
Ilya Tregubov d3d1fc39bf Merge branch 'MDL-87967-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-02-27 09:05:19 +01:00
Ilya Tregubov 60df7d8c30 Merge branch 'MDL-29421-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-02-27 08:52:53 +01:00
Huong Nguyen abfa0b8d72 weekly release 5.0.6+ 2026-02-27 09:39:01 +07:00
Huong Nguyen 0412afcc77 NOBUG: Add upgrade notes 2026-02-27 09:39:00 +07:00
Huong Nguyen da90a405af Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2026-02-27 09:38:48 +07:00
AMOS bot 9d0f61412e Automatically generated installer lang files 2026-02-27 00:07:39 +00:00
Mark Johnson b5fd7946f0 MDL-86691 questions: Fix incorrect set reference category contexts
During the upgrade to 5.x, question categories are moved to new
mod_qbank module contexts, and any set references using those categories
are updated using `move_question_set_references()`. However, this
function wasn't updating the `cat` arribute of the set reference's
filter condition, leaving it pointing at the original context ID.

This change update `move_question_set_references()` so that when a set
reference is moved (during the 5.x upgrade, or otherwise) the `cat`
parameter will be updated correctly.

For sites that have already gone through the 5.x upgrade, this fix also
adds a CLI script to find and fix incorrect question_set_reference
records. I considered adding this as an upgrade step, but it potentially
has a lot of records to check, and it's redundant if the site is being
upgraded to 5.x with this fix already in place.
2026-02-26 15:50:02 +00:00
sam marshall 643b66ede7 MDL-87905 Behat: pause incorrectly thinks terminal not interactive
When run from behat/cli/run.php, the pause command may fail because
it thinks the terminal is not interactive, even if the input and
output is passed through from an interactive terminal run.
2026-02-26 09:36:51 +00:00
Anupama Sarjoshi 48520cfc6a MDL-60912 core_completion: Fix course completion percentage calculation
This change ensures that course completion percentage calculations
include only completion activities visible to the user on the course
home page. Hidden or unavailable activities, and those in hidden
sections, are no longer included in the calculation.
2026-02-26 12:38:51 +05:30
Huong Nguyen 70aeabb6d6 Merge branch 'MDL-86866-500' of https://github.com/andrewnicols/moodle into MOODLE_500_STABLE 2026-02-26 09:16:34 +07:00
Huong Nguyen f3428e3933 Merge branch 'MDL-87588-500' of https://github.com/muhammadarnaldo/moodle into MOODLE_500_STABLE 2026-02-26 09:10:03 +07:00
Huong Nguyen 37ae90cf99 Merge branch 'MDL-88020-500' of https://github.com/rxdelacruz/moodle into MOODLE_500_STABLE 2026-02-26 09:03:25 +07:00
Huong Nguyen 61cfded4ec Merge branch 'MDL-88036-500' of https://github.com/mioyu-ubiq/moodle into MOODLE_500_STABLE 2026-02-26 09:01:40 +07:00
Mihail Geshoski 8ec5407f42 Merge branch 'MDL-85902-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2026-02-26 09:57:37 +08:00
Mihail Geshoski bc793b7735 Merge branch 'MDL-86524_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2026-02-26 09:44:41 +08:00
AMOS bot 81eb6b9787 Automatically generated installer lang files 2026-02-26 00:07:38 +00:00
Paul Holden 6cbc2c3437 MDL-29421 forms: return formatted frozen content for editor element.
This was partly addressed in 82d491ca, however formatted content and
embedded images were rendered incorrectly.
2026-02-25 17:08:51 +00:00
Paul Holden f53b072070 MDL-87949 gradingform_rubric: accessible "Click to edit" colour.
Darken it to meet the WCAG AA standards for accessible text. This
colour is also consistent with the accompanying buttons.
2026-02-25 16:25:47 +00:00
Ilya Tregubov f4115d8e93 Merge branch 'MDL-78112-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-02-25 12:07:34 +01:00
Stefan Hanauska df7d605f21 MDL-88070 javascript: Respect removeOnClose 2026-02-25 12:06:27 +01:00
Mark Johnson 3421b5b90d MDL-86524 quiz: Update restore test with current tag filter format
The test for restoring a random question from Moodle 3.9 using tags was
still testing for the pre-4.3 filtercondition format. This needed
updating to look for the current format.
2026-02-25 09:00:40 +00:00
Mark Johnson fe6c60dc3c MDL-86524 qbank_tagquestion: Map qtagids filter to restored tag IDs
When restoring a set reference containing a qtagids filter, check that
the tag ID still exists. If not, or we're restoring to a different site,
replace the ID in the filter with the mapped ID from the restore.

If a tag ID is not found, it is removed from the filter. If no matching
tags are found, the entire filter is removed.
2026-02-25 09:00:40 +00:00
Mark Johnson be0160ae03 MDL-86524 qbank_managecateories: Fix questionscontextid on restore
If a backup contains a set reference where the questionscontextid does
not match the context of the question category (as the category was
moved, but the reference was not updated correctly), then we might end
up restoring a quiz with a broken question.

This change ensures that we update the context to match the question
category during the restore.
2026-02-25 09:00:38 +00:00
rxdelacruz 0c88053c19 MDL-88020 enrol_self: Add Behat test for cohort restriction 2026-02-25 14:55:50 +08:00
mioyu-ubiq 97db9427a4 MDL-88036 mod_scorm: Fix duplicate scenario name 2026-02-25 14:34:59 +08:00
Huong Nguyen 230309cc82 Merge branch 'MDL-87190-500' of https://github.com/timhunt/moodle into MOODLE_500_STABLE 2026-02-25 10:58:13 +07:00
Mihail Geshoski 6063d99a54 Merge branch 'mdl-84045_500' of https://github.com/james-cnz/moodle into MOODLE_500_STABLE 2026-02-25 10:50:51 +08:00
Mihail Geshoski 783f804fb2 MDL-87492 mod_quiz: Fix improper version bump 2026-02-25 09:45:11 +08:00
Hai Nguyen Van 657ab15897 MDL-87190 filepicker: clarify error when dragging a folder into picker 2026-02-24 20:44:21 +00:00
Andrew Nicols 57ba40811f MDL-86866 core: Do not log route errors
Doing so leads to excessive noise in logs and unit tests.

At the moment we have no way to control these logs. This will change
when we bring in a PSR-4 logger and can use that instead, but at the
moment we do not have any such logger in core.
2026-02-24 22:14:20 +08:00
Andrew Nicols 9ae6a4d75e MDL-86866 router: Use response_aware handler for status code 2026-02-24 22:14:19 +08:00
Jun Pataleta e8389198e8 MDL-85902 course: Better labeling of activity navigation components
* The arrow icons produced by the `$OUTPUT->larrow()` and
`$OUTPUT->rarrow()` functions are announced by screen readers, and they
do not make sense when heard by screen reader users. To fix this,
we need to override the accessible names of the previous and next
activity links using the `aria-label` attribute and specify whether the
activity links point to the previous or next activities.
* The label for the jump menu "Jump to" is not informative enough to
convey the element's purpose. Let's improve it's accessible label to
"Jump to activity".
2026-02-24 22:04:18 +08:00
Jun Pataleta f0f0d51c66 MDL-85902 course: Convert activity navigation to a navigation landmark 2026-02-24 20:59:58 +08:00
Mihail Geshoski 0fc56b0ceb Merge branch 'MDL-87492_MOODLE_500_STABLE' of https://github.com/cwarwicker/moodle into MOODLE_500_STABLE 2026-02-24 14:33:58 +08:00
Mihail Geshoski dbc8211c14 Merge branch 'MDL-87452-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2026-02-24 14:17:37 +08:00
Huong Nguyen 9e54fcaabf Merge branch 'MDL-86809-500' of https://github.com/davewoloszyn/moodle into MOODLE_500_STABLE 2026-02-24 11:04:28 +07:00
Huong Nguyen 1e3ebca248 Merge branch 'MDL-87442-500' of https://github.com/andimendunia/moodle into MOODLE_500_STABLE 2026-02-24 10:44:55 +07:00
Huong Nguyen af0256f3d4 Merge branch 'MDL-87456-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2026-02-24 09:50:13 +07:00
AMOS bot a531684b78 Automatically generated installer lang files 2026-02-24 00:07:40 +00:00
Mark Johnson 310083d206 MDL-86524 questions: Update set reference context after category move
When a category is restored, it is first created in the course context,
them moved it its module context once that has been restored.

When this happens, we also need to update set references that refer to
that category to use the new context. However, this was using the legacy
category fields so was not updating them correctly. It now does.
2026-02-23 11:38:42 +00:00
Mark Johnson b82be2ab8c MDL-86524 questions: Delegate filter condition restore to plugins
The core backup code was taking sole responsibility for conversion and
mapping of IDs in set reference filter conditions during restores.
However, it was only actually processing category conditions, not tags
or any of the more recently added conditions.

This adds a new `restore_filtercondition` method to the
`core_question\local\bank\condition` class which can be overridden by
each condition to convert IDs and add mappings during the restore
process.

It also adds a new `maptags` option to
`convert_legacy_set_reference_filter_condition`, so that if we are
doing the conversion during a restore, we don't also create or map
the tags as they are converted. We record ID mappings of the tags
as the are restored, then these can be used by the
`qbank_tagquestions` plugins later to map the converted condition.
2026-02-23 11:38:42 +00:00
Huong Nguyen 4d4066a3c4 MDL-88030 library: Bump Behat and PHPUnit
- Bump Behat to 3.29.0
 - Bump PHPUnit to 11.5.55

Generated with PHP 8.2, following the instructions at:
https://moodledev.io/general/development/tools/composer
2026-02-23 16:22:04 +07:00
Luca Bösch 6359406461 MDL-87456 workshop: Amend action links to switch phase. 2026-02-20 20:47:40 +01:00
Luca Bösch fbad1615c8 MDL-87452 lesson: Align the checkboxes and labels with BS5. 2026-02-20 19:51:53 +01:00
Andi Permana f5a2c05b85 MDL-87442 theme_boost: Fix "With selected" select in mod_choice 2026-02-20 16:32:48 +07:00
Jun Pataleta 8feb15fa41 MDL-87993 core: Use visually hidden core/toast for the srlogger 2026-02-20 16:13:10 +08:00
Jun Pataleta a7e9ac30a9 MDL-87993 core: Allow toasts to be visually hidden 2026-02-20 16:13:10 +08:00
Juan Segarra Montesinos d0b6e9bdc1 MDL-86809 completion: Disable receiveagradegroup when marked as done
Co-authored-by: Yusuf Wibisono <yusuf.wibisono@moodle.com>
2026-02-20 15:12:58 +11:00
Mihail Geshoski 15557a5fc2 weekly release 5.0.6+ 2026-02-20 09:17:34 +08:00
Mihail Geshoski 10e7d8d63d Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2026-02-20 09:17:22 +08:00
james-cnz f2ab1fd1d0 MDL-84045 core_courseformat: Restore section return functionality 2026-02-19 22:35:28 +13:00
Andrew Nicols 10654bff5b MDL-88009 theme_boost: Disable input sanitisation for footer
The footer popover contains content that we have curated from a range of
places and which does not include user-provided content. It should be
safe to use the content unsanitised.
2026-02-19 15:37:30 +08:00
Andrew Nicols 843611eb27 MDL-86866 core: Web 404 responses should generate HTML not JSON 2026-02-19 12:17:22 +08:00
Huong Nguyen 85a3f34d07 Merge branch 'MDL-87441-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2026-02-19 08:54:38 +07:00
Huong Nguyen 94b89f4503 Merge branch 'mdl-87187-50' of https://github.com/matthewhilton/moodle into MOODLE_500_STABLE 2026-02-19 08:50:57 +07:00
Huong Nguyen ae59573047 Merge branch 'MDL-85301-500' of https://github.com/davewoloszyn/moodle into MOODLE_500_STABLE 2026-02-19 08:47:43 +07:00
AMOS bot 0b6ee85461 Automatically generated installer lang files 2026-02-19 00:07:39 +00:00
Huong Nguyen 9995c0edff Merge branch 'MDL-87482-500' of https://github.com/HuongNV13/moodle into MOODLE_500_STABLE 2026-02-18 15:40:14 +07:00
Mihail Geshoski 8ff8053bac Merge branch 'MDL-85111-500' of https://github.com/muhammadarnaldo/moodle into MOODLE_500_STABLE 2026-02-18 10:08:07 +08:00
AMOS bot d9c347382a Automatically generated installer lang files 2026-02-18 00:07:42 +00:00
Sara Arjona fa790afa94 Merge branch 'MDL-87919-500' of https://github.com/aanabit/moodle into MOODLE_500_STABLE 2026-02-17 16:54:59 +01:00
Amaia Anabitarte cdee3646dd MDL-87919 theme: Fix restricted selected subsections in course index 2026-02-17 15:27:41 +01:00
Luca Bösch e24d3713e1 MDL-87441 user: Align the "With selected users..." label with BS5. 2026-02-17 08:21:50 +01:00
Shamim Rezaie 2f9c784b34 weekly release 5.0.6+ 2026-02-17 12:56:01 +11:00
Shamim Rezaie 10fdde228d Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2026-02-17 12:55:49 +11:00
Matthew Hilton 946739dd23 MDL-87187 bigbluebuttonbn: Fix record time during backup/restore 2026-02-17 09:10:14 +10:00
Paul Holden 29afbfbbba MDL-87967 output: ensure disabled toggle elements show tooltip. 2026-02-16 14:37:15 +00:00
Muhammad Arnaldo 814b0640b4 MDL-87588 mod_bigbluebuttonbn: Fix missing recordings_deleted column 2026-02-16 17:47:53 +07:00
Paul Holden fc5e318864 MDL-78112 forms: support frozen filemanager form elements.
Replace editable content with a list of files stored in the file area.
2026-02-16 10:21:00 +00:00
Trisha Milan 4ac81d6a66 MDL-82625 navigation: Add disableactive flag to combobox widget
- Introduced disableactive flag to prevent setting active state on combobox items when a page redirect occurs.
This resolves the issue where incorrect checkmarks remain after using the browser's back button due to bfcache.
- Added Behat test cases to verify correct checkmark behaviour in tertiary navigation when navigating and using
the browser's back/forward buttons.
2026-02-16 16:51:38 +08:00
Mihail Geshoski 8166f959e5 Merge branch 'MDL-85658-500' of https://github.com/HuongNV13/moodle into MOODLE_500_STABLE 2026-02-16 13:47:27 +08:00
Mihail Geshoski 9633fcbf4b Merge branch 'MDL-87338-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2026-02-16 13:38:48 +08:00
Mihail Geshoski 5e8b19eee7 Merge branch 'MDL-87552-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2026-02-16 13:29:49 +08:00
Andre Krueger 07c33cd2c3 MDL-85301 aiprovider_ollama: Fix basic authentication 2026-02-16 08:07:19 +11:00
Jun Pataleta c7978215ec Merge branch 'MDL-87450-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2026-02-13 20:34:43 +08:00
Huong Nguyen a7d7f41bff Merge branch 'MDL-87597-500' of https://github.com/yusufwib01/moodle into MOODLE_500_STABLE 2026-02-13 15:08:55 +07:00
Mihail Geshoski b88c7a1dbb Merge branch 'MDL-87600-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2026-02-13 14:18:02 +08:00
Jun Pataleta f49005139a Merge branch 'MDL-76437-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-02-13 13:49:31 +08:00
Huong Nguyen 25ee88a4b7 Merge branch 'MDL-86985-500' of https://github.com/davewoloszyn/moodle into MOODLE_500_STABLE 2026-02-13 11:10:38 +07:00
Jun Pataleta 7ac8908b0c Merge branch 'MDL-87946-500' of https://github.com/andrewnicols/moodle into MOODLE_500_STABLE 2026-02-13 11:59:39 +08:00
Luca Bösch 2d517fbc74 MDL-86985 mod_data: Stripe and hover effect restored to presets table 2026-02-13 14:56:11 +11:00
Luca Bösch 72e41fa58a MDL-87450 forum: Remove Bootstrap 5 table borders. 2026-02-13 11:05:09 +08:00
Huong Nguyen 14c226b4a5 Merge branch 'MDL-87458-500' of https://github.com/jfederico/moodle into MOODLE_500_STABLE 2026-02-13 09:53:25 +07:00
Huong Nguyen 3e8ba76fc1 Merge branch 'MDL-87075-500' of https://github.com/raortegar/moodle into MOODLE_500_STABLE 2026-02-13 09:50:20 +07:00
Huong Nguyen c705fef94a Merge branch 'MDL-81441-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-02-13 09:46:02 +07:00
Huong Nguyen 8504e1facb Merge branch 'MDL-77209-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2026-02-13 09:42:31 +07:00
Andrew Nicols 29f2b34e00 MDL-87946 github: Update GHA Database connections
Both the pgsql and mysql steps we were using use `docker:stable`, which
has been abandoned and is not a recommended approach. They are also both
abandoned.

This commit moves to using a service entry for postgres; and a manual
step for mysql.

We can't use the services entry for MySQL because GHA does not support
providing arguments to service containers.
2026-02-13 10:33:31 +08:00
Huong Nguyen 5f83a0a0ab MDL-87482 core: Better text comparison 2026-02-13 09:32:06 +07:00
Andi Permana 435ce7fbe1 MDL-87482 core_message: Fix compatibility with libxml2 >= 2.14.0 2026-02-13 09:32:06 +07:00
Muhammad Arnaldo 980a99c6d5 MDL-85111 qtype_essay: improve word counting logic
Improve handling of < (less-than) symbol when it's attached to a non-HTML word.

Co-authored-by: Tim Hunt <T.J.Hunt@open.ac.uk>
2026-02-13 09:14:40 +07:00
Huong Nguyen e4afd807a7 MDL-85658 core_h5p: Implement contentLoaded event handler
This improvement will help to avoid random errors
because H5P content needs time to be rendered.
2026-02-13 08:54:56 +07:00
Huong Nguyen 76934ad945 MDL-85658 behat: Wait until the iframe is completely loaded 2026-02-13 08:54:56 +07:00
Paul Holden a4e790fbaa MDL-87941 core: handle param validation of boolean type false. 2026-02-12 17:34:29 +00:00
Paul Holden bb0390c606 MDL-87657 cohort: fix permission check for viewing system cohorts.
The problem manifested itself in custom reports using the corresponding
cohort field filter, which didn't reload current form values due to
incorrect context tree comparison.
2026-02-12 17:01:27 +00:00
Paul Holden fa189b24da MDL-87945 webservice: handle invalid functions when adding to service.
Same thing as we did for API docs in 6e9e73aba0.
2026-02-12 16:05:25 +00:00
Christian Abila e8c7d8cd41 MDL-87075 core: Filter roles to include visibility permissions 2026-02-12 14:52:05 +01:00
Huong Nguyen 926a474613 Merge branch 'MDL-87095-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2026-02-12 10:24:37 +07:00
Huong Nguyen da8b875b14 Merge branch 'MDL-83325_500' of https://github.com/timhunt/moodle into MOODLE_500_STABLE 2026-02-12 10:21:06 +07:00
Huong Nguyen f0069655b7 Merge branch 'MDL-87113-500' of https://github.com/timhunt/moodle into MOODLE_500_STABLE 2026-02-12 08:59:55 +07:00
Huong Nguyen d29c43c555 Merge branch 'MDL-87358-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-02-12 08:57:00 +07:00
Simey Lameze 4b6ffc5064 MDL-87095 behat: reorganize lesson question importing tests 2026-02-12 09:51:00 +08:00
Kim Jared Lucas ef2dde6f11 MDL-87095 mod_lesson: add behat test for importing questions into lesson 2026-02-12 09:49:35 +08:00
Huong Nguyen 77c1bd1458 Merge branch 'MDL-78343-500' of https://github.com/davewoloszyn/moodle into MOODLE_500_STABLE 2026-02-12 08:46:48 +07:00
AMOS bot 7eaa5573c4 Automatically generated installer lang files 2026-02-12 00:09:35 +00:00
jfedericobn 83ae101436 MDL-87458 bigbluebuttonbn: reset removes local recording references only 2026-02-11 16:40:41 +00:00
yusufwib01 757f0d1a44 MDL-87597 core_message: Fix double-click to reopen message drawer 2026-02-11 23:28:59 +07:00
Michael Kotlyar a8e1540a82 MDL-87492 mod_quiz: Add grade_submission task
This task simply calls $attempt->process_grade_submission for a quiz
attempt. The need for this task has arisen due to some instances of
moodle sites needing to process many and/or complex quiz attempts. This
change only utilises this task for the mod_quiz upgrade script.
2026-02-11 10:02:30 +00:00
Huong Nguyen 1b56e5c622 Merge branch 'MDL-86659-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-02-11 17:01:49 +07:00
Hai Nguyen Van c5b011bb9c MDL-87113 filepicker: fix progress stuck after invalid upload 2026-02-11 09:58:05 +00:00
Sara Arjona 07dd973f44 Merge branch 'MDL-87874-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-02-11 07:08:05 +01:00
Huong Nguyen 77753e861b Merge branch 'MDL-87448-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2026-02-11 12:54:12 +07:00
Huong Nguyen d91aed29c2 Merge branch 'MDL-87535-500_take2' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2026-02-11 11:48:04 +07:00
Huong Nguyen abdfe22bd0 Merge branch 'MDL-86714-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-02-11 11:45:53 +07:00
Huong Nguyen 1679f8b767 Merge branch 'MDL-68062-500' of https://github.com/sh-csg/moodle into MOODLE_500_STABLE 2026-02-11 11:24:50 +07:00
Huong Nguyen e6505da61a Moodle release 5.0.6 2026-02-11 08:44:56 +07:00
Huong Nguyen 55d43fe137 weekly release 5.0.5+ 2026-02-10 08:41:45 +07:00
Shamim Rezaie 8f07ef57be Merge branch 'MDL-87892-500' of https://github.com/HuongNV13/moodle into MOODLE_500_STABLE 2026-02-09 21:07:33 +11:00
Huong Nguyen 8fe771bb9f MDL-87892 admin: Fix MoodleNet check 2026-02-09 16:33:27 +07:00
Shamim Rezaie caaa3a4824 Merge branch 'MDL-87892-500' of https://github.com/HuongNV13/moodle into MOODLE_500_STABLE 2026-02-09 19:36:52 +11:00
Huong Nguyen fb3565e79b MDL-87892 admin: Fix MoodleNet removal warning
Instead of introducing a new optional parameter,
we will make all the changes in the Admin Renderer
2026-02-09 09:05:03 +07:00
Paul Holden 862bf7b443 MDL-87874 customfield: expand size of decimal data field type.
This change now makes the decimal field size equivalent to that of
the corresponding integer field size.
2026-02-06 15:57:31 +00:00
Paul Holden fe2572647f MDL-87874 customfield_number: validation for maximum size constraints. 2026-02-06 15:53:20 +00:00
Michael Kotlyar 1509236178 MDL-87492 mod_quiz: 'autosubmit' quiz attempt handling fix
Some quiz attempts throw an exception when they are being processed and
are stuck in a 'submitted' state. This change wraps the process in a
transaction so that there are no partial changes made in such cases.
2026-02-06 14:14:16 +00:00
Paul Holden cb590fdedc MDL-87883 core: correct license page link in project readme. 2026-02-06 09:09:10 +00:00
Jun Pataleta 55bf752d79 MDL-77209 core: Make More help links open on a new tab 2026-02-06 10:56:28 +08:00
David Woloszyn 306b3b897b MDL-78343 core_table: Improved HTML tag detection in format_text 2026-02-06 13:38:00 +11:00
Huong Nguyen e1c3872f65 Moodle release 5.0.5 2026-02-06 09:16:50 +07:00
Huong Nguyen cbd5285963 NOBUG: Add upgrade notes 2026-02-06 09:16:50 +07:00
Luca Bösch 69817cc74e MDL-87448 qbank: put margins to the end of the buttons to align better. 2026-02-05 17:41:16 +01:00
Luca Bösch 2dd0f54dbf MDL-87552 groupings: Striped hovering lines table with BS 5. 2026-02-05 17:25:22 +01:00
Luca Bösch 348498c0b7 MDL-87338 core_table: avoid string concatenation. 2026-02-05 17:21:21 +01:00
Mihail Geshoski 6dd7b7e490 weekly release 5.0.4+ 2026-02-05 20:23:41 +08:00
Mihail Geshoski 16b222ce6e NOBUG: Add upgrade notes 2026-02-05 20:23:41 +08:00
Mihail Geshoski 244efc0522 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2026-02-05 20:23:25 +08:00
Paul Holden 503411d6b6 MDL-87870 admin: tighten up validation of colour picker values. 2026-02-05 17:26:33 +07:00
Paul Holden 82f8c9f6c6 MDL-87870 filter_tex: escape background argument content. 2026-02-05 17:26:32 +07:00
Huong Nguyen dc74dfcac4 Merge branch 'MDL-87352-500' of https://github.com/andimendunia/moodle into MOODLE_500_STABLE 2026-02-05 17:26:32 +07:00
Mihail Geshoski f9f0033ce4 Merge branch 'MDL-87258-500' of https://github.com/rjnl/moodle into MOODLE_500_STABLE 2026-02-05 17:26:32 +07:00
Jun Pataleta de33246b7b Merge branch 'MDL-87757-500' of https://github.com/muhammadarnaldo/moodle into MOODLE_500_STABLE 2026-02-05 17:26:32 +07:00
Luca Bösch ba5ab0ff06 MDL-87535 quiz: Quiz dates shouldn't show on secure page. 2026-02-05 07:52:21 +01:00
yusufwib01 5d0eab1555 MDL-86785 tiny_equation: Add timeout handling for mimetex execution 2026-02-05 12:03:16 +08:00
Mihail Geshoski 05b4ca7dac Merge branch 'MDL-86437-500' of https://github.com/snake/moodle into MOODLE_500_STABLE 2026-02-05 12:03:16 +08:00
Huong Nguyen 40af5cd52d MDL-87843 filter_tex: Switch to use Colour picker setting
This will allow users to easily choose the background colour
and prevent invalid input values
2026-02-05 12:03:16 +08:00
Paul Holden ea1b0eb4e1 MDL-87612 repository: safer unserializing of file source data. 2026-02-05 12:03:16 +08:00
Mihail Geshoski 071504114a Merge branch 'MDL-87789-500' of https://github.com/snake/moodle into MOODLE_500_STABLE 2026-02-05 12:03:16 +08:00
Shamim Rezaie 77637bfb26 Merge branch 'MDL-86444_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2026-02-05 12:03:15 +08:00
Jun Pataleta 68ab52d55d MDL-87600 gradereport_overview: Fix heading levels on the index page 2026-02-04 18:49:45 +08:00
Muhammad Arnaldo ed57a7c2c7 MDL-87757 block_myoverview: Remove navigation role and behat update
- Removal of the navigation role on main and zero-state template
- Add accessibility extra tests for the block_overview
2026-02-04 10:11:46 +07:00
Muhammad Arnaldo 1c17ab4277 MDL-87757 block_myoverview: fix the heading-order 2026-02-04 10:11:46 +07:00
Andi Permana 119cb76523 MDL-87352 admin: Add MoodleNet removal warnings 2026-02-04 10:06:33 +07:00
AMOS bot 2ae0229827 Automatically generated installer lang files 2026-02-04 00:07:38 +00:00
Jun Pataleta 5f7e9e3c6b Merge branch 'MDL-83984_500' of https://github.com/santoshndev/moodle into MOODLE_500_STABLE 2026-02-03 17:06:37 +08:00
Jake Dallimore 77ce015cc4 Merge branch 'MDL-85535-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2026-02-03 16:59:33 +08:00
Jun Pataleta de163f6f42 Merge branch 'MDL-87185-500' of https://github.com/durenadev/moodle into MOODLE_500_STABLE 2026-02-03 16:50:03 +08:00
Jun Pataleta f98ff41818 Merge branch 'MDL-87593-500-enfix' of https://github.com/mudrd8mz/moodle into MOODLE_500_STABLE 2026-02-03 16:47:36 +08:00
Jun Pataleta e03bd88e9a Merge branch 'MDL-77162-filepicker-a11y-tab-order-repository-keyboard-selection-M5.0' of https://github.com/stopfstedt/moodle into MOODLE_500_STABLE 2026-02-03 16:44:05 +08:00
Jun Pataleta bd3bae8b9c Merge branch 'MDL-87694-course-participant-profile-missing-heading-M5.0' of https://github.com/stopfstedt/moodle into MOODLE_500_STABLE 2026-02-03 15:18:08 +08:00
Rajneel Totaram 47a7db0a69 MDL-87258 mod_lti: request access for PNA
Since Chrome 142, public servers accessing resources on local networks
gets blocked by default. Users need to allow access for such requests
to proceed.

This patch introduces a new config setting `ltiallowlocalnetwork`.
This determines if the local-network-access flag should be added to LTI
iframes so that Chrome users get prompted when a local network access
is being made.
2026-02-03 18:49:01 +12:00
Mihail Geshoski cd55b35362 Merge branch 'MDL-87606_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2026-02-03 14:22:36 +08:00
Mihail Geshoski 049c2636c0 Merge branch 'MDL-86609_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2026-02-03 14:10:55 +08:00
Mihail Geshoski 3e2824d0df Merge branch 'MOODLE_500_STABLE_MDL-84966' of https://github.com/niko-hoogeveen/moodle into MOODLE_500_STABLE 2026-02-03 13:44:57 +08:00
Mihail Geshoski 07109510c7 Merge branch 'MDL-85653_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2026-02-03 13:36:38 +08:00
Mihail Geshoski d8372d7ecd Merge branch 'MDL-87029-500' of https://github.com/cameron1729/moodle into MOODLE_500_STABLE 2026-02-03 13:26:55 +08:00
Huong Nguyen 91f05629cd Merge branch 'MDL-87334-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-02-03 11:07:50 +07:00
Huong Nguyen 431138556e Merge branch 'MDL-87289-500' of https://github.com/raortegar/moodle into MOODLE_500_STABLE 2026-02-03 10:43:59 +07:00
Huong Nguyen a7c18aaee7 Merge branch 'MDL-87396-500' of https://github.com/izendegi/moodle into MOODLE_500_STABLE 2026-02-03 10:37:16 +07:00
Huong Nguyen 94bc33b976 Merge branch 'MDL-87520-500-branch-number' of https://github.com/mudrd8mz/moodle into MOODLE_500_STABLE 2026-02-03 10:32:43 +07:00
Huong Nguyen c872aad808 Merge branch 'MDL-86905-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2026-02-03 10:27:12 +07:00
Huong Nguyen 00143faad5 Merge branch 'MDL-87675-500' of https://github.com/nvhai248/moodle into MOODLE_500_STABLE 2026-02-03 10:23:43 +07:00
AMOS bot d268a60e1e Automatically generated installer lang files 2026-02-03 00:07:52 +00:00
Stefan Topfstedt a23bd2ad53 MDL-87694 core: prevent empty heading in context header. 2026-02-02 10:38:14 -08:00
Stefan Topfstedt 4f2deeadf0 MDL-87694 profile: change page title to "Login required".
This realigns the page title with user/view.php.
2026-02-02 10:23:24 -08:00
Stefan Topfstedt 76cb6c49b0 MDL-87694 profile: set top level heading when accessed as guest user. 2026-02-02 10:13:40 -08:00
Jun Pataleta 35b132b2c2 MDL-87694 core: headinglevel display option for $OUTPUT->confirm()
`\core\output\core_renderer::confirm()`'s `$displayoptions` parameter
now also accepts a `headinglevel` option that developers can use to
specify the heading level of the confirmation's heading. If not
specified, the confirmation heading will be rendered in an `h4` tag.
2026-02-02 09:19:34 -08:00
Paul Holden 4bbd54b415 MDL-86714 mod_scorm: parse reference file post-restore/import.
Ensure the SCORM reference file is setup and ready to use after
restoring from backup file. Additional support for ancient 1.9
backups.
2026-02-02 10:29:01 +00:00
Paul Holden b0f3314cb1 MDL-76437 gradingform_rubric: consistent styles for add buttons.
Remove duplication/redundancy for same elements from the theme.
2026-02-02 10:28:09 +00:00
Paul Holden 630b762a0e MDL-87096 enrol_database: observe activity dates display in courses.
Co-authored-by: Owen Herbert <owenherbert@catalyst-au.net>
2026-02-02 10:27:16 +00:00
cescobedo d70634a418 Merge branch 'MDL-87761-500' of https://github.com/sarjona/moodle into MOODLE_500_STABLE 2026-02-02 11:15:41 +01:00
Jun Pataleta 389c5e2eb5 MDL-86905 core: Use proper link markup for email links 2026-02-02 18:05:03 +08:00
Huong Nguyen d677363483 Merge branch 'MDL-78342-500' of https://github.com/davewoloszyn/moodle into MOODLE_500_STABLE 2026-02-02 08:50:04 +07:00
Safat 0a1b2845a5 Merge branch 'MDL-86601-adhoc-index-MOODLE_500_STABLE' of https://github.com/bwalkerl/moodle into MOODLE_500_STABLE 2026-02-02 12:13:00 +11:00
Cameron Ball 003fea1634 MDL-87029 quiz: Refetch attempts in overdue task to avoid stale submits
The update_overdue_attempts scheduled task iterated attempts from a recordset
and could act on stale attempt data if the web request finished an attempt
before cron processed it, causing duplicate submissions.

Change get_list_of_overdue_attempts() to return only attempt ids plus computed user
timeclose/timelimit, and refetch each attempt by id inside the task loop before
constructing quiz_attempt. This keeps quiz_attempt APIs unchanged and ensures cron
operates on current state
2026-01-31 15:38:43 +08:00
AMOS bot 24b230e284 Automatically generated installer lang files 2026-01-31 00:07:43 +00:00
David Mudrák 0f61bd060e MDL-87520 core: Fix interpretation of CFG->branch in update API client
Starting in version 3.10, Moodle started to use a different format for
the $CFG->branch that has not been fixed here. This is to make sure that
we request the correct version of the plugin.
2026-01-30 14:20:21 +01:00
Benjamin Walker 226aee577d MDL-86601 core_task: Add index for scheduled task lastruntime 2026-01-30 22:52:20 +10:00
Benjamin Walker 4a2cf5131b MDL-86601 core_task: Add index for large adhoc task queues 2026-01-30 22:52:19 +10:00
Sara Arjona 4f3ecdf095 MDL-87761 course: Add warning for phasing out subsection descriptions
The Description field within the Subsection edit form has been deprecated since Moodle 5.2 onwards (see MDL-87279).
To ensure a smooth transition and avoid data loss for our users, the XD team have prepared a solution to notify them
of this upcoming change in stable versions.
2026-01-30 12:25:55 +01:00
Iñigo Zendegi 12bcb9a569 MDL-87396 mod_assign: Add availability check to notifications 2026-01-30 12:02:12 +01:00
Paul Holden fb3e6c2e8c MDL-87334 course: looser check for empty return field editing course.
When the course format switcher reloads the form, the `$returnto`
parameter is of type string: "0", rather of type integer per initial
load.

In this case the `empty(...)` check is verifying all of empty string,
0 (integer) and "0" (string). Hurrah for PHP type checking.
2026-01-30 10:37:55 +00:00
Paul Holden 708160cb4a MDL-87321 courseformat: explicit empty string check renaming module. 2026-01-30 10:36:50 +00:00
Huong Nguyen 59fd844136 weekly release 5.0.4+ 2026-01-30 15:39:35 +07:00
Huong Nguyen f0d72a138f Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2026-01-30 15:39:24 +07:00
Andrew Nicols 8c50614860 NOBUG: Bump composer.lock 2026-01-30 13:07:12 +08:00
Daniel Ureña 18192b6ea0 MDL-87185 block_site_main_menu: Add required library 2026-01-29 13:12:52 +01:00
fgo c624f40635 MDL-86437 enrol_lti: Cast scoreGiven to float for LTI compliance
scoreGiven was being passed as a string (e.g. "8.0"), which caused
validation errors in some LMS implementations such as Rustici Engine.
According to the LTI specification, scoreGiven must be numeric if
present.

Co-authored-by: Jake Dallimore <jake@moodle.com>
2026-01-29 14:59:14 +08:00
Jake Dallimore ec28b3530a MDL-87789 libraries: patch lti1p3 for certification support
https://github.com/packbackbooks/lti-1-3-php-library/issues/169 blocks
us from using the new build.1edtech certification tooling. This issue
commits that fix as a library customisation/hack for stables, so the
suite can be used for annual/bi-annual re-certification.
2026-01-29 13:26:32 +08:00
Huong Nguyen bb4d7e6ee4 Merge branch 'MDL-87521_500' of https://github.com/timhunt/moodle into MOODLE_500_STABLE 2026-01-29 11:03:47 +07:00
Huong Nguyen 68398f16c7 Merge branch 'MDL-87087-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2026-01-29 11:01:41 +07:00
Huong Nguyen 68b06af0f8 Merge branch 'MDL-86994-500' of https://github.com/mioyu-ubiq/moodle into MOODLE_500_STABLE 2026-01-29 10:58:30 +07:00
Huong Nguyen 3481a9d19e Merge branch 'MDL-87018-500' of https://github.com/bhect0/moodle into MOODLE_500_STABLE 2026-01-29 10:55:12 +07:00
Huong Nguyen 9db5a7f3fe Merge branch 'MDL-87104-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-01-29 10:46:38 +07:00
Huong Nguyen 9f5fedee5f Merge branch 'MDL-87323-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-01-29 10:41:40 +07:00
Huong Nguyen 2d8d1e8dcf Merge branch 'MDL-86988-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-01-29 10:39:20 +07:00
Angelia Dela Cruz bd27e15147 MDL-87087 tool_dataprivacy: Test data request by authorized user 2026-01-29 11:09:13 +08:00
AMOS bot bcd7b651b8 Automatically generated installer lang files 2026-01-29 00:07:41 +00:00
David Mudrák 85c1213a5e MDL-87593 lang: Fix strings order 2026-01-28 21:45:08 +01:00
Tim Hunt 800a766aee MDL-83325 filepicker: tidy up display of restrictions 2026-01-28 20:13:44 +00:00
Tim Hunt 7ede51f863 MDL-87521 behat: better error reporting if an adhoc task fails 2026-01-28 14:58:49 +00:00
Paul Holden 2cc0ff9b26 Merge branch 'MDL-87437-500' of https://github.com/tasiobg/moodle into MOODLE_500_STABLE 2026-01-28 14:16:28 +00:00
Jun Pataleta 63cb8772ae Merge branch 'MDL-86639-500' of https://github.com/yusufwib01/moodle into MOODLE_500_STABLE 2026-01-28 16:17:18 +08:00
mioyu-ubiq 56ab46e236 MDL-86994 mod_assign: Behat to test permitted users can edit submission 2026-01-28 13:55:21 +08:00
Hai Nguyen Van 2b73a96232 MDL-87675 core: Add delay for displaying the YUI alert dialogue message
* Add a slight delay for displaying the message content of the YUI
alert dialogue's ARIA live container to allow screen readers to
announce the alert message accordingly.
2026-01-28 03:18:14 +00:00
David Mudrák 9b3f75c5c7 MDL-87593 lang: Use the fixed strings in tests 2026-01-27 21:44:46 +01:00
Helen Foster 408a058083 MDL-87593 lang: Import fixed English strings (en_fix) 2026-01-27 21:42:43 +01:00
Mark Johnson 4d89422fc8 MDL-87606 backup: Include child questions in backups
Since MDL-41924, because we are not always including the whole category
of each question being used in a backup, we have been missing some child
questions.

This expands the query selecting questions belonging to categories
where only annotated questions are being included, to also select any
children of those questions.
2026-01-27 14:53:37 +00:00
Paul Holden 09d17c943b MDL-87100 core: infer upgrade note issue number from current branch. 2026-01-27 10:55:05 +00:00
Paul Holden aab0e6cc57 MDL-87710 behat: move upgrade notes into the correct location.
They were put in the wrong location by MDL-87443 (my bad).
2026-01-27 10:45:56 +00:00
Paul Holden 64ef2fe631 MDL-86659 enrol_flatfile: remove spurious get_config parameters. 2026-01-27 10:40:26 +00:00
Paul Holden 215d9d623c MDL-87104 message: remove border from contact request sent profile info. 2026-01-27 10:26:07 +00:00
Raquel Ortega 986a201e6c MDL-87289 mod_forum: Disable mediaplugin filter in emails 2026-01-26 21:33:30 +01:00
Niko Hoogeveen 74c67b4f30 MDL-84966 core_question: Updated question bank tag filter
Fixes a bug where filtering questions by tag the 'NONE'
option was not being respected. Automated testing was also added
to cover tag filtering conditions in the question bank
2026-01-26 11:21:28 -05:00
Paul Holden a2f8649326 MDL-81441 tiny_media: broaden content search for used draft files.
Changes in 47f9106c (upon which this code is based) assumed used files
were always enclosed within quote marks. However this isn't the case
for embedded H5P files which output the filepath directly and rely on
subsequent filtering to turn into appropriate markup.
2026-01-26 10:53:07 +00:00
Huong Nguyen efb090fa3f Merge branch 'MDL-84862-500-test' of https://github.com/yusufwib01/moodle into MOODLE_500_STABLE 2026-01-26 15:32:39 +07:00
Huong Nguyen 94db3eae21 weekly release 5.0.4+ 2026-01-26 10:39:17 +07:00
Huong Nguyen c7511914d4 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2026-01-26 10:39:05 +07:00
Héctor Benedicte 641bb41063 MDL-87018 qtype_essay: Add unit tests for un_summarise_response(). 2026-01-23 19:25:23 +01:00
AMOS bot 8c0d5df95b Automatically generated installer lang files 2026-01-23 00:07:58 +00:00
Safat 862d57ca12 Merge branch 'MDL-86527-500' of https://github.com/HuongNV13/moodle into MOODLE_500_STABLE 2026-01-22 15:40:02 +11:00
Huong Nguyen ac4a2a427f Merge branch 'MDL-87188-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-01-22 11:02:53 +07:00
Huong Nguyen f7892080c5 Merge branch 'MDL-87317-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2026-01-22 10:53:05 +07:00
Huong Nguyen 29cc6da010 Merge branch 'MDL-87318-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2026-01-22 10:46:28 +07:00
Huong Nguyen 8de8070c46 Merge branch 'MDL-86797-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-01-22 10:44:30 +07:00
Huong Nguyen b04d0c86f1 Merge branch 'MDL-87092-500' of https://github.com/Kredelirious/moodle into MOODLE_500_STABLE 2026-01-22 10:37:05 +07:00
Huong Nguyen 9fd37ca5c6 Merge branch 'MDL-87090-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2026-01-22 10:32:56 +07:00
Jun Pataleta 80ced0eddc Merge branch 'MDL-86136_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2026-01-22 08:32:34 +08:00
Jun Pataleta 238eb6b945 Merge branch 'MDL-87478_500' of https://github.com/mohdtahseen1/moodle into MOODLE_500_STABLE 2026-01-22 08:22:33 +08:00
Mark Johnson ca0efffb05 MDL-86136 question: Amend version restore test
Restoring a whole course will now restore the backed-up questions to a
new qbank instance. This means the test to restore versions was not
restoring the deleted versions to the original question bank entires,
but to a new question bank entry in the new qbank.

Updating the test to just backup and restore the quiz resolves this.
2026-01-21 09:30:07 +00:00
Mark Johnson 2785d6f2bd MDL-86136 qbank: Restore entire activity when it is in the backup
When restoring a backup containing a question bank, we were always
trying to match questions to an existing category on the target course
if once existed. This meant that when duplicating a qbank on the same
course, or importing the same qbank to another course multiple times,
only one of the restored qbanks would end up with questions in it.

This adds a mechanism to record any activities in the backup which
support `FEATURE_PUBLISHES_QUESTIONS`. Then when we restore the
questions, we check if we will be restoring the original activity they
belong to, and skip trying to match them to an existing category. This
means a new copy of each question will be created, and moved to the new
copy of the qbank once it is created.
2026-01-21 09:30:06 +00:00
Muhammad Arnaldo 1bf68468ef MDL-86527 behat: Avoid element-click-intercepted failures
Adjusts the window size to accommodate wide tables.
This ensures that columns which were previously clipped
are now visible and accessible to the Behat driver.
2026-01-21 15:05:12 +07:00
Muhammad Arnaldo 38375adf4d MDL-86527 behat: Fix random failures when toggling edit mode 2026-01-21 15:05:12 +07:00
Adrian Greeve 4e1053e6ce Merge branch 'MDL-87625-500' of https://github.com/andrewnicols/moodle into MOODLE_500_STABLE 2026-01-21 14:20:35 +08:00
Adrian Greeve 24c97bd603 Merge branch 'MDL-87659-500' of https://github.com/andrewnicols/moodle into MOODLE_500_STABLE 2026-01-21 13:15:07 +08:00
Andrew Nicols 8be48fd41e MDL-87659 core: Hide "Details" section of checks Table when there are none 2026-01-21 13:01:41 +08:00
Huong Nguyen 64f95b61c1 Merge branch 'MDL-79221-MOODLE_500_STABLE' of https://github.com/PhMemmel/moodle into MOODLE_500_STABLE 2026-01-21 10:14:21 +07:00
Huong Nguyen 014580bbdd Merge branch 'MDL-51447-500' of https://github.com/AnupamaSarjoshi/moodle into MOODLE_500_STABLE 2026-01-21 10:10:50 +07:00
AMOS bot 1bb491d769 Automatically generated installer lang files 2026-01-21 00:08:05 +00:00
Yusuf Wibisono fbc30b007b MDL-86639 groups: Wrap group names in grade report group selector 2026-01-21 03:34:57 +07:00
Ilya Tregubov f245bdaf24 Merge branch 'MDL-76975-500' of https://github.com/yerairogo/moodle into MOODLE_500_STABLE 2026-01-20 19:46:11 +02:00
Paul Holden 2b4d264cb1 MDL-86797 courseformat: account for hidden delegated section info. 2026-01-20 09:56:45 +00:00
Kim Jared Lucas 2a6955e490 MDL-87092 tool_uploaduser: suspend enrolments via CSV upload 2026-01-20 11:20:03 +08:00
Mihail Geshoski 0a30b72921 Merge branch 'MDL-87287_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2026-01-20 10:37:20 +08:00
AMOS bot 173f24702f Automatically generated installer lang files 2026-01-20 00:08:06 +00:00
Anupama Sarjoshi 1944075f31 MDL-51447 block_completionstatus: Show only user-visible activities
This change ensures that the completion details page displays only the
activities that are visible to the user on the course home page.
Activities that are hidden, unavailable or  located in hidden sections
are no longer shown in the completion details view.

Co-authored by: ewallah <info@ewallah.net>
2026-01-19 17:57:01 +05:30
Anupama Sarjoshi c4f303b42a MDL-51447 core_completion: Get visible activities with completion on 2026-01-19 17:57:01 +05:30
Simey Lameze b898bff306 MDL-87090 behat: improve new test 2026-01-19 14:13:16 +08:00
mioyu-ubiq 6b08248cfa MDL-87090 mod_assign : Teacher can override assignment deadlines 2026-01-19 14:13:14 +08:00
David Woloszyn fedc27f80e MDL-78342 core_table: Remove line break conversion in format_text 2026-01-19 13:07:56 +11:00
Mark Johnson 194caa005d MDL-86609 qbank_bulkmove: Select the current category by default 2026-01-16 14:36:20 +00:00
Nicolas Dunand bf73761ff8 MDL-86609 qbank_bulkmove: Target qbank categoryid fix. 2026-01-16 14:35:56 +00:00
Luca Bösch 781cdd65f4 MDL-87318 gradereport_grader: No over-thick table borders with BS 5. 2026-01-16 11:01:31 +01:00
Luca Bösch 0deaaf6e18 MDL-87317 report_progress: Striped hovering table rows with BS 5. 2026-01-16 11:00:37 +01:00
Jake Dallimore 3d8e9b8444 weekly release 5.0.4+ 2026-01-16 16:38:28 +08:00
Jake Dallimore 07c19b9ce7 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2026-01-16 16:38:22 +08:00
Paul Holden d33164d9c4 MDL-85300 grade: account for tooltip size in bulk move dialogue.
Now that it actually works, it obscures some elements required in
Behat scenarios. Resize the icon, and place it to the right.
2026-01-16 15:26:53 +08:00
Jake Dallimore 0f56b6d72b Merge branch 'MDL-87634-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-01-16 15:26:53 +08:00
Huong Nguyen b27b9b4031 Merge branch 'MDL-86802-500' of https://github.com/Jayce0808/moodle into MOODLE_500_STABLE 2026-01-16 15:26:53 +08:00
Jake Dallimore 8d12694488 Merge branch 'MDL-86423-500' of https://github.com/martygilbert/moodle into MOODLE_500_STABLE 2026-01-16 15:26:53 +08:00
Jake Dallimore fb293a5750 Merge branch 'MDL-87635-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-01-16 15:26:53 +08:00
Jake Dallimore 301e373ffa Merge branch 'MDL-86869_500-single-view-overload' of https://github.com/alexkeel/moodle into MOODLE_500_STABLE 2026-01-16 15:26:53 +08:00
Paul Holden b8bd4e8604 MDL-50364 forms: consistent access to language strings from JS. 2026-01-16 15:26:53 +08:00
Paul Holden 54b42e04af Merge branch 'MDL-50364-500' of https://github.com/Jayce0808/moodle into MOODLE_500_STABLE 2026-01-16 15:26:53 +08:00
Ilya Tregubov 80709ededb Merge branch 'MDL-85300-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-01-16 15:26:53 +08:00
Huong Nguyen 8af6c40ab0 Merge branch 'MDL-86017-500' of https://github.com/mijiaa/moodle into MOODLE_500_STABLE 2026-01-16 15:26:53 +08:00
Huong Nguyen 2bd3f9f058 Merge branch 'MDL-87070-500' of https://github.com/andelacruz/moodle into MOODLE_500_STABLE 2026-01-16 15:26:53 +08:00
Huong Nguyen e9fbd3db48 Merge branch 'MDL-85431_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2026-01-16 15:26:53 +08:00
Huong Nguyen 7ccd3a62d9 Merge branch 'MDL-87443-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-01-16 15:26:53 +08:00
Huong Nguyen be210d1ed2 Merge branch 'MDL-87229-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2026-01-16 15:26:52 +08:00
Huong Nguyen b9d71a4a47 Merge branch 'MDL-87056-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-01-16 15:26:52 +08:00
Huong Nguyen 31fd12db29 Merge branch 'MDL-86565-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-01-16 15:26:52 +08:00
Huong Nguyen cf22cbe371 Merge branch 'MDL-87120-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2026-01-16 15:26:51 +08:00
Paul Holden 73c0ee2162 MDL-87358 h5plib_v127: add unicode modifier to title matching regex.
See https://github.com/h5p/h5p-php-library/issues/276

Co-authored-by: Фидан Сынбулатов
2026-01-15 11:05:04 +00:00
Mark Johnson 855d0901ea MDL-85653 qbank_editquestion: Display static status when not editable 2026-01-14 15:42:40 +00:00
Mark Johnson 7bd7ca8d83 MDL-86444 questions: Fix question categories with incorrect top parents 2026-01-14 10:11:40 +00:00
Paul Holden ed571424f9 MDL-87634 core: exclude fixtures from Github actions "one-by-one" job.
This is consistent with the PHPUnit general configuration in 20aa9d05.
2026-01-14 09:25:34 +00:00
Yerai Rodríguez 5f075b79be MDL-76975 admin: Move AMD dependencies to data attribute to fix overflow
Since there is a 1024 length limit on arguments passed through
js_call_amd(), we pass it through a HTML element dataset to avoid
this limit.
2026-01-14 08:34:06 +01:00
Guest 5093d3bfe7 MDL-87478 mod_quiz: Make pre-create attempts work with previews 2026-01-13 15:10:45 +05:30
AMOS bot 22e13a4463 Automatically generated installer lang files 2026-01-13 00:08:00 +00:00
Andrew Nicols 072658a276 MDL-87625 core: Use the /r.php basepath to guess routes 2026-01-13 08:06:38 +08:00
Paul Holden d873307bf8 MDL-87635 backup: ensure required test libraries are loaded. 2026-01-12 17:22:26 +00:00
Simey Lameze 602e40f054 MDL-87088 behat: add missing @javascript tags to required tests 2026-01-12 13:37:59 +07:00
Angelia Dela Cruz 8507bc2716 MDL-87070 mod_glossary: Behat to confirm glossary autolinking works 2026-01-12 11:59:14 +08:00
Huong Nguyen 3e398810f2 Merge branch 'MDL-87088-500' of https://github.com/andelacruz/moodle into MOODLE_500_STABLE 2026-01-12 09:53:25 +07:00
Huong Nguyen 1352482b39 Merge branch 'MDL-86058-allow-enable-disable-tasks-backport-MOODLE-500-STABLE' of https://github.com/duyhuynhdev/moodle into MOODLE_500_STABLE 2026-01-12 09:44:32 +07:00
Stefan Topfstedt 27a36e6fae MDL-77162 filepicker: default to selecting first repository available. 2026-01-09 08:14:14 -08:00
Paul Holden 4c4e77ba26 MDL-87443 reportbuilder: use Toast selector in Behat scenarios. 2026-01-09 12:08:19 +00:00
Paul Holden fdd9f2e022 MDL-87443 behat: define new Toast message named selector. 2026-01-09 12:08:19 +00:00
Mark Johnson cffa9a1008 MDL-87287 qbank_deletequestion: Update behat test for tag deletion
Now that deleting a tagged question correctly deletes it tag instances,
the tag is no longer available for re-selection after all the tagged
questions are deleted.
2026-01-09 10:42:39 +00:00
Mark Johnson 0ff87413b5 MDL-87287 mod_qbank: De-duplicate tags when migrating questions
In the migration from old-style question banks to mod_qbank, if a
question had the same tag from multiple contexts, when it was moved to
its new question bank context, the migration tried to set multiple tag
instances for the same tag to the same context, which caused a unique
key violation.

This add some checking to the
`question_move_question_tags_to_new_context` function to identify any
tag instances to be moved that will trigger this key violation, and
delte any duplicates before the move so we end up with a single instance
of the tag in the new context. This is done in a transaction that will
only be committed once the remaining tags have been moved.

This required adding the `tiuserid` field to the data returned by
`core_tag_tag::get_items_tag` so we can assemble the unique key without
having to do additional queries.

This also extends the test coverage for the `transfer_questions` task
to ensure tags are moved to the new contexts, and tags on stale questions
are deleted.
2026-01-09 10:42:07 +00:00
Mark Johnson 8bd6c40a0c MDL-87287 qbank_tagquestion: Remove all tags from deleted questions
When we deleted a question, we were including the userid of the user who
performed the delete when checking for question tags. This means that if
user A tagged the question, and user B deleted the question, it might
leave the tags behind.

This fixes the issue by deleting tags regardless of the user, and adds
an upgrade step to find and remove orphaned tag instances.
2026-01-09 10:42:07 +00:00
Tasio e95a118087 MDL-87437 course: Make course cached image entries domain-agnostic 2026-01-09 10:10:23 +01:00
Luca Bösch 80e0d1818a MDL-87229 course: Show nice "Other users" table in courses. 2026-01-09 07:12:42 +01:00
Jayce Birrell a38ed9f2a3 MDL-50364 forms: calendar header renderer uses translated months 2026-01-09 13:52:59 +10:30
Angelia Dela Cruz 3ff7a1a4b7 MDL-87088 core_grades: Behat to view grades from user menu 2026-01-09 10:40:30 +08:00
Huong Nguyen 9699514341 weekly release 5.0.4+ 2026-01-09 08:41:40 +07:00
Huong Nguyen c04d745016 NOBUG: Add upgrade notes 2026-01-09 08:41:40 +07:00
Christian Abila 426b0a0138 MDL-51152 Enrolments: clarify web service 2026-01-08 09:30:16 +01:00
Christian Abila 7e29055181 MDL-51152 Enrolments: remove unused parameter roleid 2026-01-08 09:30:16 +01:00
Jun Pataleta 4c2ac777f1 MDL-85535 forum: Render discussion navigation at the bottom only 2026-01-08 11:35:00 +08:00
Jun Pataleta b6f5584c4d MDL-85535 forum: Label discussion navigation 2026-01-08 11:35:00 +08:00
Marty cd80e0ae07 MDL-86423 mod_assign: Reduce duesoon/overdue notifications.
Students shouldn't receive overdue notifications if there is nothing to
submit in Moodle.

Students shouldn't receive due soon notifications if they a) already
have a grade or b) meet activity completion status.
2026-01-07 12:20:51 -05:00
Paul Holden 7a2a319bbd MDL-87120 course: observe activity dates display in course requests.
Upgrade step to ensure the default value for this field in the schema
matches the default value used in the interface itself.
2026-01-07 16:43:26 +00:00
Jun Pataleta f1784eba65 Merge branch 'MDL-86436-navigation-accessibility-page-heading-menu-visible-on-larger-screens-even-if-empty-M5.0' of https://github.com/stopfstedt/moodle into MOODLE_500_STABLE 2026-01-07 11:18:05 +08:00
Jun Pataleta c3114ff21a Merge branch 'MDL-87416-glossary-entry-page-title-missing-M5.0' of https://github.com/stopfstedt/moodle into MOODLE_500_STABLE 2026-01-07 11:13:54 +08:00
Santosh Nagargoje 4c53960c75 MDL-83984 core: Fixed subpanel show/hide issue 2026-01-06 16:19:21 +05:30
Adrian Greeve 9841148790 Merge branch 'MDL-87526-500' of https://github.com/andrewnicols/moodle into MOODLE_500_STABLE 2026-01-06 09:10:36 +08:00
Stefan Topfstedt fe15e9f6c3 MDL-87416 glossary: set page title on glossary entry details page. 2026-01-05 11:31:48 -08:00
Mark Johnson fbf2963387 MDL-85431 questions: Fix access checks on Question banks page
Users who could not manage activities on a course, but did have
permission to access particular question banks, could not access the
Question banks page.

This modifies the permission checks on that page to allow access if the
user can either manage activities, or has access to at least one
activity that publishes questions. Some additional changes to the output
were required to prevent non-editing users adding banks.

It also modifies the navigation hook to add the Question banks
navigation node if the user can access any activitiy that publishes
questions on the course. This is all based on cached modinfo and
permissions data so should remain performant.
2026-01-05 15:20:51 +00:00
Paul Holden fa94598fe0 Merge branch 'MDL-87288-500' of https://github.com/ilyatregubov/moodle into MOODLE_500_STABLE 2026-01-05 09:46:54 +00:00
Huong Nguyen 39ca46780a Merge branch 'MDL-81882-500' of https://github.com/yusufwib01/moodle into MOODLE_500_STABLE 2025-12-29 13:51:48 +07:00
Matt Porritt 926ac9ed31 MDL-84862 AI: Stop provider instance creataion when no provider plugins
Prevents calls to action to create an AI provider instance from
being displayed to users when there are no AI provider plugins
installed in the instance.

Co-Authored-By: Yusuf Wibisono <yusuf.wibisono@moodle.com>
2025-12-29 12:03:43 +07:00
Huong Nguyen 426ffb42da Merge branch 'MDL-87433-500' of https://github.com/muhammadarnaldo/moodle into MOODLE_500_STABLE 2025-12-29 09:54:47 +07:00
yusufwib01 49dcdcadba MDL-81882 core: Optimize block instance deletion with batch processing
Improve upgrade execution by gathering block instance IDs upfront
and processing deletions of related records in context, block_positions, user_preferences, and block_instances tables in batches.
2025-12-29 09:30:48 +07:00
Muhammad Arnaldo 2482ea9af6 MDL-87433 course: Add sorting to get_nearest_editable_subcategory
Add ORDER BY to the query to ensure categories are returned in
consistent order. This fixes random test failures, especially
on PostgreSQL.
2025-12-24 16:14:26 +07:00
Alex Keel 09a7591042 MDL-86869 gradereport_singleview: Raises memory limit 2025-12-23 12:20:20 +00:00
Mihail Geshoski b81abb8578 Merge branch 'MDL-86798_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2025-12-23 16:11:38 +08:00
Andrew Nicols c9529535bb MDL-87526 core: Specify composer project type 2025-12-23 11:50:05 +08:00
Andrew Nicols 164376014e MDL-87526 core: Moodle provides moodle/lms 2025-12-23 11:50:05 +08:00
Mark Johnson 976456a6f1 MDL-86798 questions: Check original context is on the same site
When checking if the original context exists during a restore, we need
to check that we're looking at the context on the same site, not one on
a different site that happens to have the same ID.
2025-12-19 09:28:23 +00:00
Mark Johnson a364395d8e MDL-86798 questions: Track next version for question bank entries
This adds a new "nextversion" field to `question_bank_entries` to track
which version number the next version of the question should have. This
ensures that version numbers are not re-used if the latest version is
deleted.

To use this field, you must call
`\core_question\versions::get_next_version()`. This will initialise the
field to the correct value if it is currently null.

If you create a new version using this value, you must then call
`\core_question\versions::increment_next_version()` to increment the
counter.
2025-12-19 09:28:23 +00:00
Mark Johnson fb9f3ee58c MDL-86798 questions: Restore backups containing deleted versions
If the latest version of a question is deleted, and then a new one
created, the new one will currently re-use the version number of the
deleted version. If the original version was backed up before it was
deleted, then restored later, we end up with two questions in one
question bank entry that have the same version.

To resolve this, when restoring a question, we check if there is already
a version with the same version number, then bump it and any higher
versions up by 1. We also check for any references specifically using
these versions and bump those up by 1. Any references using "always
latest" will be fine, as the latest version will still be the latest.

Additionally, if deleting a version made it hidden, and the backup
contains the same version in "ready" state, restoring the backup will
restore it to "ready" state.
2025-12-19 09:26:15 +00:00
Huong Nguyen 6e82b46a48 weekly release 5.0.4+ 2025-12-19 09:04:41 +07:00
Ilya Tregubov 29e9471a66 MDL-87288 output: Fix pagination in small containers. 2025-12-18 09:37:49 +01:00
Huong Nguyen 6e1e877bb6 Merge branch 'MDL-87340-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2025-12-18 11:45:27 +08:00
Huong Nguyen b5d6d847cf Merge branch 'MDL-86420-500' of https://github.com/muhammadarnaldo/moodle into MOODLE_500_STABLE 2025-12-18 11:45:27 +08:00
Huong Nguyen 02a6973793 Merge branch 'MDL-86086-500' of https://github.com/andimendunia/moodle into MOODLE_500_STABLE 2025-12-18 11:45:27 +08:00
Huong Nguyen 2ceffeba8a Merge branch 'MDL-87094-500' of https://github.com/andelacruz/moodle into MOODLE_500_STABLE 2025-12-18 11:45:27 +08:00
Mihail Geshoski f77a71f18f Merge branch 'MDL-72833_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2025-12-18 11:45:27 +08:00
Andi Permana 3df3f8c96c MDL-86086 theme_boost: Add visual distinction for readonly form inputs 2025-12-17 19:07:52 +07:00
Mihail Geshoski 627fdd0bfd Merge branch 'MDL-86416-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-12-17 12:15:05 +08:00
Paul Holden 5355c46c43 MDL-85300 output: ensure Bootstrap tooltips load for dynamic content.
Prior to this change, tooltips would only load for elements in the
initial page DOM without considering those elements subsequently added
dynamically (e.g. via AJAX).

Co-authored-by: Sebastian Gundersen <sebastian@sgundersen.com>
2025-12-16 13:30:20 +00:00
Alex Keel 48020125d1 MDL-86869 gradereport_singleview: Lower the max per page limit
Review actions
2025-12-15 14:48:36 +00:00
Amaia Anabitarte 8a9707b653 Merge branch 'MDL-87436-500' of https://github.com/laurentdavid/moodle into MOODLE_500_STABLE 2025-12-15 13:42:36 +01:00
Mark Johnson 9ad6d20b70 MDL-72833 quiz: Respect locale in maxmark setting
Editing maxmarks in quiz slots was not respecting the decimal separator
from the set language's locale, meaning if your language formats numbers
like 1,10 editing didn't work correctly.

This sets the correct parameter to ensure the locale is respected.
2025-12-15 11:46:52 +00:00
Jun Pataleta 3c56b3b7c0 Merge branch 'MDL-87341_500' of https://github.com/TomoTsuyuki/moodle into MOODLE_500_STABLE 2025-12-15 18:48:35 +08:00
Angelia Dela Cruz d6f5a3fa89 MDL-87094 core_course: Behat to restrict available activities/resources 2025-12-15 12:06:06 +08:00
Huong Nguyen e7f3feac7e Merge branch 'MOODLE_500_STABLE_MDL-73396' of https://github.com/niko-hoogeveen/moodle into MOODLE_500_STABLE 2025-12-15 08:55:46 +07:00
Huong Nguyen 08b7aafce2 Merge branch 'MDL-86679-500' of https://github.com/andimendunia/moodle into MOODLE_500_STABLE 2025-12-15 08:47:53 +07:00
Tomo Tsuyuki 89b2aac22c MDL-87341 javascript: Fix aria label issue for navigation bar 2025-12-15 10:27:41 +11:00
Stefan Topfstedt d3500faa9b MDL-86436 navigation: hide empty page heading menu.
Co-authored-by: Jun Pataleta <jun@moodle.com>
2025-12-12 18:05:36 -08:00
Stefan Topfstedt 61b4aaf199 MDL-87415 profile: set page title when accessed as guest user. 2025-12-12 13:43:38 -08:00
Philipp Memmel 36caae7105 MDL-79221 core_grade: Fix fetching context for disabled mod plugins
Activity plugins that are disabled on the site are not included in
the modinfo cache. That's why their context must not be fetched via
modinfo cache.
2025-12-12 06:43:00 +01:00
Philipp Memmel 9af25198fd MDL-79221 core_completion: Do not update state for disabled plugins 2025-12-12 06:43:00 +01:00
Shamim Rezaie f878d036dd weekly release 5.0.4+ 2025-12-12 14:06:34 +11:00
Shamim Rezaie 9ccb749a18 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2025-12-12 14:06:24 +11:00
Mihail Geshoski a6d0cb3cc1 MDL-87412 qbank_managecategories: Use single quotes in scenario name 2025-12-12 09:46:25 +07:00
Huong Nguyen 40d438dac1 Merge branch 'MDL-84736-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2025-12-12 09:46:25 +07:00
Huong Nguyen 94b842021c Merge branch 'MDL-86830-500' of https://github.com/andimendunia/moodle into MOODLE_500_STABLE 2025-12-12 09:46:25 +07:00
Huong Nguyen 7a567ed194 Merge branch 'MDL-86808-500' of https://github.com/muhammadarnaldo/moodle into MOODLE_500_STABLE 2025-12-12 09:46:25 +07:00
Luca Bösch 5e6e675fb9 MDL-86677 mod_quiz: Make the attempt summary table striped 2025-12-12 09:46:24 +07:00
Mihail Geshoski 9054263ecd Merge branch 'MDL-87182-500' of https://github.com/srobotta/moodle into MOODLE_500_STABLE 2025-12-12 09:46:24 +07:00
Mihail Geshoski 0dbb57ece9 Merge branch 'MDL-87121_500' of https://github.com/santoshndev/moodle into MOODLE_500_STABLE 2025-12-12 09:46:24 +07:00
Mihail Geshoski b9be456bc6 Merge branch 'MDL-87412_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2025-12-12 09:46:24 +07:00
Mihail Geshoski 2c6fd6d4ac Merge branch 'MDL-87142-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-12-12 09:46:24 +07:00
Jun Pataleta 84c34ff230 Merge branch 'MDL-86807-500' of https://github.com/muhammadarnaldo/moodle into MOODLE_500_STABLE 2025-12-12 09:46:24 +07:00
Jun Pataleta 06a0eb182b Merge branch 'MDL-86805-500' of https://github.com/andimendunia/moodle into MOODLE_500_STABLE 2025-12-12 09:46:24 +07:00
Huong Nguyen c0fefda2fc Merge branch 'MDL-86593-500' of https://github.com/christianabila/moodle into MOODLE_500_STABLE 2025-12-12 09:46:24 +07:00
Muhammad Arnaldo be74828054 MDL-86420 enrol_database: avoid duplicate key violations 2025-12-11 10:25:24 +07:00
AMOS bot 984a280583 Automatically generated installer lang files 2025-12-11 00:08:02 +00:00
Niko Hoogeveen fb6a0f6444 MDL-73396 auth_oauth2: link non-suspended account on oauth login
Added checks to link non-suspended user accounts to OAuth2, when logging
in. Also added an additional check to prevent users from using OAuth2
to login if their account is suspended in Moodle.
2025-12-10 14:21:51 -05:00
Niko Hoogeveen 307ed32403 MDL-73396 core_user: prioritize active users when retrieving by email
Updated get_users_by_email() to return active users at the
start of the returned array, suspended users last.
2025-12-10 14:21:51 -05:00
Laurent David e30b97f3b8 MDL-87436 core_courseformat: Fix id collision when testing
* When testing using phpunit/sqlsrv the ids of sections and cm are colliding
so we need to make sure we separate them as a reference to a cm can be the
same as a reference to a section
2025-12-10 12:10:12 +01:00
Simey Lameze 187cc673c9 MDL-84736 behat: add custom step to edit a criterion
This commit also improves the existing tests and add a new scenario to
verify the 'Do not mark for regrade' behavior.
2025-12-09 17:23:21 +08:00
Angelia Dela Cruz 59bd9c5da6 MDL-84736 gradingform : Behat for editing guide with graded submissions 2025-12-09 17:23:20 +08:00
Stefan Topfstedt fa50aa22b9 MDL-86416 navigation: Render the more menu only when it's not empty
Co-authored-by: Jun Pataleta <jun@moodle.com>
2025-12-09 11:15:29 +08:00
Huong Nguyen 917b9a0e32 Merge branch 'MDL-87379_500' of https://github.com/santoshndev/moodle into MOODLE_500_STABLE 2025-12-09 09:28:29 +07:00
Mihail Geshoski 4388a17c2b Merge branch 'MDL-82281-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-12-09 09:45:59 +08:00
Mihail Geshoski 95bce73f7c Merge branch 'MDL-86677-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-12-09 09:29:03 +08:00
Mihail Geshoski a1390072c3 Merge branch 'mdl-87356_500' of https://github.com/james-cnz/moodle into MOODLE_500_STABLE 2025-12-09 09:17:50 +08:00
Simey Lameze 8a3093377a MDL-87340 mod_quiz: make test_question_shuffle more robust
This commit improves test_question_shuffle by retrying if questions
remains in the same order after shuffling.
2025-12-09 07:34:12 +08:00
Stephan Robotta 8137ccc608 MDL-87182 quiz: no CBM metric when no data available 2025-12-08 08:46:02 +01:00
Muhammad Arnaldo becef1c899 MDL-86807 core_courseformat: RTL chevron in move activity modal 2025-12-08 11:50:37 +07:00
Andi Permana e9688d295f MDL-86830 calendar: Fix double encoding in event title attributes 2025-12-08 10:44:07 +07:00
Luca Bösch c3be940177 MDL-87142 question: dropdown-toggle class for question format select 2025-12-07 20:12:44 +01:00
Luca Bösch 9ae5248089 MDL-86677 mod_quiz: let the summary of attempt table be striped 2025-12-07 20:11:49 +01:00
Luca Bösch 580ab8704e MDL-82281 quiz: Amend test to circumvent modinfo cache fails. 2025-12-07 20:10:59 +01:00
Huong Nguyen a5b3ac7e43 Moodle release 5.0.4 2025-12-07 08:06:17 +07:00
Huong Nguyen a7bbd44304 NOBUG: Add upgrade notes 2025-12-07 08:06:16 +07:00
Andi Permana c15d798502 MDL-86805 courseindex: Fix RTL keyboard navigation in tree 2025-12-06 01:09:24 +07:00
Mark Johnson a4d8076384 MDL-87412 qbank_managecategories: Fix "new child" drop target
This fixes the CSS rule that reveals the "as new child of" drop target
shown when dragging a category over another category which has no
children.

We can't behat test the actual drag-drop reordering behaviour with behat
as reactive DragDrop components aren't testable, but we can trigger the
CSS to add a regression test for the drop target's appearance.
2025-12-05 14:18:20 +00:00
Santosh Nagargoje 8a23b61990 MDL-87379 theme_classic: Fixed mobile responsiveness issue 2025-12-05 15:25:33 +05:30
Muhammad Arnaldo e27fe53bc3 MDL-86808 theme_boost: misaligned footer popover in RTL
Limit the fallback placement vertically.
2025-12-05 16:28:00 +07:00
Andi Permana 65008c9e74 MDL-86679 core: Fix MS field mappings in upgrade script 2025-12-05 15:48:31 +07:00
Andi Permana 87eef1669d MDL-86679 oauth2: Support MS personal and work account names 2025-12-05 15:44:23 +07:00
Huong Nguyen 5a34bf72d6 weekly release 5.0.3+ 2025-12-05 08:08:56 +07:00
Huong Nguyen 3cf30be0f1 NOBUG: Add upgrade notes 2025-12-05 08:08:56 +07:00
Huong Nguyen 0c04f1921f MDL-81304 Performance: Add notes for CTE 2025-12-04 21:12:23 +07:00
Huong Nguyen b61eb194ef Merge branch 'MDL-87068-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2025-12-04 20:59:59 +07:00
Santosh Nagargoje 7cee7c5692 MDL-87121 quiz: Fixed random question performance issue 2025-12-04 17:27:37 +05:30
James C d36616757c MDL-87356 qtype_random: orphaned random questions should be deleted
This patch reinstates the task from MDL-63260 and MDL-66273.
2025-12-04 23:00:49 +13:00
Christian Abila 4d8bcbece8 MDL-86593 Course completion: Disabled modules not returned as criteria
- Filter out disabled modules
- Update get_criteria method signature
- Fix code style
2025-12-04 07:07:18 +01:00
Angelia Dela Cruz 1c9c017fa5 MDL-87068 contentbank_h5p: Behat for restoring course contentbank 2025-12-04 10:33:49 +08:00
Huong Nguyen ae27d04332 Merge branch 'MDL-83485-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-12-04 09:19:07 +07:00
Huong Nguyen 460089df2f Merge branch 'MDL-82232-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-12-04 09:13:09 +07:00
Huong Nguyen b33724c13e MDL-72744 table: Improve PHPUnit test 2025-12-04 08:57:58 +07:00
David Woloszyn 50b527ad2d MDL-72744 core_grades: Escape formulas when exporting spreadsheets 2025-12-04 08:57:58 +07:00
David Woloszyn bcf67dd1cb MDL-72744 dataformat: Escape formulas when exporting spreadsheets
Co-authored-by: Huong Nguyen <huongnv13@gmail.com>
2025-12-04 08:57:58 +07:00
Mihail Geshoski 09a76fcb45 Merge branch 'MDL-85534-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-12-04 09:45:20 +08:00
Huong Nguyen 05b0e7c0eb MDL-86087 core: Use correct required version 2025-12-04 08:36:40 +07:00
Mihail Geshoski 148a0c6459 Merge branch 'MDL-87299-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-12-04 09:22:12 +08:00
Mihail Geshoski 7e131d5b33 Merge branch 'MDL-87245-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-12-03 23:50:18 +08:00
Mihail Geshoski 9afb3db588 Merge branch 'MOODLE_500_STABLE_MDL-81304' of https://github.com/mattporritt/moodle into MOODLE_500_STABLE 2025-12-03 23:38:48 +08:00
Jun Pataleta b63c72dccd MDL-87245 scorm: Indicate when the SCORM package opens in a new window 2025-12-03 23:36:26 +08:00
Jun Pataleta 877e43b6ee MDL-87245 lang: Add a bracketed form of the opensinnewwindow lang string 2025-12-03 23:36:25 +08:00
Mihail Geshoski 18e8714eb4 Merge branch 'MDL-85858-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-12-03 23:28:37 +08:00
Jun Pataleta 1c9f9eed15 MDL-85534 forum: Set appropriate heading levels for the discussion page 2025-12-03 17:33:51 +08:00
Huong Nguyen a2d7d9bd05 Merge branch 'MDL-87091-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2025-12-03 16:11:33 +07:00
mioyu-ubiq 01ed555cad MDL-87091 behat: Test authloginviaemail setting behavior 2025-12-03 15:55:56 +08:00
Huong Nguyen e27c62ed44 MDL-87353 core: Safer unserializing of file references 2025-12-03 14:17:23 +08:00
Jun Pataleta b9465bbd1d Merge branch 'MDL-86087-500' of https://github.com/HuongNV13/moodle into MOODLE_500_STABLE 2025-12-03 14:10:04 +08:00
Stefan Hanauska 0722f5dc62 MDL-86960 mod_glossary: Check user 2025-12-03 13:42:17 +08:00
Stefan Hanauska 8f7d361597 MDL-86960 mod_data: Check user 2025-12-03 13:42:10 +08:00
Stefan Hanauska c05961c8da MDL-86960 mod_forum: Check user 2025-12-03 13:42:03 +08:00
Huong Nguyen 822dd5aeb7 Merge branch 'MDL-87339-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-12-03 12:15:02 +07:00
Jake Dallimore 60e6410c73 MDL-87286 enrol_lti: prevent suspended user account auth in legacy LTI 2025-12-03 15:50:09 +11:00
Jake Dallimore 6cf403f23e MDL-87286 auth_lti: prevent suspended user account auth in LTI1p3 2025-12-03 15:50:09 +11:00
Matt Porritt fbf71949dc MDL-81304 Performance: Improve performance of my courses.
Refactor get_nearest_editable_subcategory to improve performance.

This refactor maintains functionality and signature of
get_nearest_editable_subcategory but improves perofrmance
for varied datasets. This makes rendering of the
my courses page.
2025-12-03 15:49:41 +11:00
raortegar 83ee815775 MDL-87267 aiplacement_courseassist: Improve response formatting 2025-12-03 11:16:44 +07:00
Mihail Geshoski 672b2a9074 MDL-82808 assign: Use blindid during submission removal in blind marking 2025-12-03 03:14:20 +00:00
Rajneel Totaram bf6fb596dc MDL-82808 mod_assign: replace userid with blindid in anonymous marking 2025-12-03 03:14:20 +00:00
David Woloszyn 8565f480a3 MDL-86544 lib: Adjust checks on local URL params 2025-12-03 03:14:20 +00:00
Eric Merrill 8c9068eb5d MDL-80317 auth_oauth2: Restrict login redirect to local url 2025-12-03 03:14:20 +00:00
Stefan Hanauska 664191aa93 MDL-86507 badge: Check if role is assigned 2025-12-03 03:14:20 +00:00
David Woloszyn 9438f2af46 MDL-85557 tiny_equation: Sanitise equation preview input 2025-12-03 03:14:20 +00:00
yusufwib01 6d2eefe372 MDL-86326 auth: Enhance validation logic in resend_confirmation_email 2025-12-03 03:14:20 +00:00
Mihail Geshoski 545f94bbbc Merge branch 'MDL-86749_500' of https://github.com/santoshndev/moodle into MOODLE_500_STABLE 2025-12-03 11:06:23 +08:00
Huong Nguyen a0e4237954 Merge branch 'MDL-78442-500' of https://github.com/andimendunia/moodle into MOODLE_500_STABLE 2025-12-03 09:55:53 +07:00
Mihail Geshoski a92402e067 Merge branch 'MDL-87066_cleanstring_500' of https://github.com/skodak/moodle into MOODLE_500_STABLE 2025-12-03 09:47:36 +08:00
Jun Pataleta b4a12fcc30 MDL-82232 behat: Fix breadcrumb navigation on Behat 2025-12-02 19:22:10 +08:00
Jun Pataleta 3140d11871 MDL-82232 core: Change the breadcrumb lang string to Breadcrumb 2025-12-02 19:22:10 +08:00
Andi Permana fe98642103 MDL-78442 antivirus_clamav: Try SCAN first, then INSTREAM as fallback 2025-12-02 15:46:43 +07:00
Andi Permana da7ce0c6e2 MDL-78442 tool_moodlenet: Fix directory path passed to antivirus scanner 2025-12-02 15:46:43 +07:00
Mihail Geshoski 9ff7da25f1 Merge branch 'MDL-86806-500' of https://github.com/muhammadarnaldo/moodle into MOODLE_500_STABLE 2025-12-02 15:11:03 +08:00
Mihail Geshoski adbdfc59ca Merge branch 'MDL-86523-MOODLE_500_STABLE_invalidcategoryid' of https://github.com/loewis/moodle into MOODLE_500_STABLE 2025-12-02 15:03:57 +08:00
Mihail Geshoski 4425af045f Merge branch 'MDL-86844-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-12-02 14:50:31 +08:00
Mihail Geshoski 11d65e4c0b MDL-85405 core: Bump version to update cache 2025-12-02 14:27:50 +08:00
Mihail Geshoski 7fd581312c Merge branch 'MDL-85405_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2025-12-02 14:20:09 +08:00
Huong Nguyen f9ec46708e Merge branch 'MDL-84898-prohibitjoin-50' of https://github.com/leonstr/moodle into MOODLE_500_STABLE 2025-12-02 10:38:24 +07:00
Huong Nguyen bd4730f673 Merge branch 'MDL-86425-500' of https://github.com/sh-csg/moodle into MOODLE_500_STABLE 2025-12-02 10:32:39 +07:00
Huong Nguyen 47f6947f32 Merge branch 'MDL-87218-500-enfix' of https://github.com/mudrd8mz/moodle into MOODLE_500_STABLE 2025-12-02 10:30:59 +07:00
Muhammad Arnaldo 1f68dba5c2 MDL-86806 core_courseformat: Fix RTL keyboard navigation
Ensure consistent navigation experience across LTR and
RTL interfaces in activity chooser.
2025-12-02 10:20:50 +07:00
David Mudrák 64e7610026 MDL-87218 lang: Use the fixed strings in tests, too 2025-12-01 19:46:29 +01:00
Helen Foster 44549616db MDL-87218 lang: Import fixed English strings (en_fix) 2025-12-01 19:46:29 +01:00
Jun Pataleta e3cc7953eb MDL-85858 mod_scorm: Fix Table of Contents toggle button's accessibility
* Set proper label via `aria-label`.
* Instead of changing the button's label to 'Show'/'Hide', set the
button's `aria-expanded` attribute accordingly.
* Remove unnecessary event handling for the toggle button when pressing
Enter or Space key. This is already natively supported and triggers
the click event.
* Adjust Behat tests accordingly.
2025-11-28 21:01:20 +08:00
Jun Pataleta 3902dd9df6 MDL-85858 mod_scorm: Use semantic heading for the Preview mode 2025-11-28 21:01:19 +08:00
Jun Pataleta 8b9a7fdb15 MDL-85858 mod_scorm: Set page and iframe titles for the SCORM player 2025-11-28 21:01:19 +08:00
Luca Bösch fbc330cf89 MDL-86844 qbank: style question bank table as in Moodle 4.5. 2025-11-28 10:40:16 +01:00
Huong Nguyen c4d054cfbf MDL-86087 core: Fix PHPUnit 11.5.43+ compatibility
Adjust tests to comply with updated PHPUnit lifecycle behaviour
 - Initialise typed test properties (e.g. core_session memcached test) or make them nullable
 - Add `isset()` checks to avoid accessing properties before initialisation
 - Ensure resetAfterTest() is called before modifying DB or `$USER`
2025-11-28 09:10:34 +07:00
Huong Nguyen d25846cb41 MDL-86087 core: Define environment requirements for Moodle 5.2 2025-11-28 09:10:34 +07:00
Paul Holden f2ca4d59b2 MDL-87339 hook: ensure cache directory present/writeable for use.
Avoids PHP warnings during Behat initialisation:

- file_put_contents(...): Failed to open stream: No such file or directory;
- rename(...): No such file or directory
2025-11-27 19:06:14 +00:00
Paul Holden 08d0f1021a MDL-87323 report_outline: fix report viewed event URL. 2025-11-27 17:28:56 +00:00
Mark Johnson 4317b656ae MDL-85405 course: Fix indentation and line wrapping 2025-11-27 15:13:46 +00:00
Luca Bösch d0c0e5a635 MDL-85405 modinfo: Don't show modules without FEATURE_CAN_DISPLAY
Question banks were displaying in places they shouldn't, because
FEATURE_CAN_DISPLAY wasn't fully implemented. This broadens its
usage in the following areas:

- Availability info - Not relevant to qbank. However you could feasibly
have some module which isn't shown to students, but the teacher can
use
  it to track completion, so dont display the link.
- Activities block - links to each activity's index page. We already
have
the Question banks page in the secondary nav. No need to have it here
too.
- Overview report - It doesn't make sense to display question banks
here,
  as they're not an activity students can participate in, they wont have
  dates etc.
- Externallib - Return with candisplay = false. The app needs to handle
  this correctly.
- Visibility options, moodleform_mod, modvisible and visibility
selector.
Not relevant for qbank since it doesn't include the standard
coursemodule
  options, but if an activity with without CAN_DISPLAY did display a
  visibility setting, "Hidden" should be the only option.
- Activity names filter - we dont want automatic links to question
banks.
2025-11-27 15:13:45 +00:00
Petr Skoda a16fc54eb3 MDL-87066 core: add upgrade note for clean_string() 2025-11-27 14:59:00 +01:00
Petr Skoda f00eecb062 MDL-87066 core: add clean_string() to solve double encoding in Mustache
The idea is to prevent double escaping in s()
and mustache.escape() by using numeric html
entities to sanitise result of format_string(),
get_string() and similar.
2025-11-27 14:59:00 +01:00
Luca Bösch a36c4548be MDL-87299 qtype_match: Remove Bootstrap 5 table borders. 2025-11-27 13:59:07 +01:00
Mihail Geshoski 299b171191 weekly release 5.0.3+ 2025-11-27 19:40:25 +08:00
Mihail Geshoski 446d364a02 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2025-11-27 19:40:11 +08:00
Stefan Hanauska 7bce94b05f MDL-86425 backup: Reset nullcontent flag in xml_writer 2025-11-27 06:11:56 +01:00
Jun Pataleta bcba5e2b27 MDL-83485 core: Add bottom margin on preference links
To meet the WCAG 2.2 Level AA requirement for minimum target size,
we need to add a bit of spacing between the links on the user
preferences page.

More information:
https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html
2025-11-27 11:37:04 +08:00
Jun Pataleta 08564c803b MDL-83485 core: Add accessibility Behat coverage to the preferences page 2025-11-27 11:37:03 +08:00
Jun Pataleta 2fac37a527 MDL-83485 core: Fix heading level for preferences groups 2025-11-27 11:37:03 +08:00
Jun Pataleta 0d53dbc128 MDL-83485 core: Render preferences groups as lists 2025-11-27 11:37:03 +08:00
Andrew Nicols 3f64d0da2f Merge branch 'MDL-86255-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-27 11:11:06 +08:00
Andrew Nicols dcec803f0a Merge branch 'MDL-86955-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-27 11:08:30 +08:00
Jake Dallimore 707eef0930 Merge branch 'MDL-86840-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-11-27 09:43:58 +08:00
Paul Holden ae44f84ffa MDL-86988 mod_resource: ensure required library always present.
The `resourcelib` library is explicitly required by the modules
own local library, and neither the add/update methods use it
directly.
2025-11-26 15:11:12 +00:00
Paul Holden 773823a082 MDL-87188 gradereport_grader: prevent overlapping collapsed columns. 2025-11-26 11:40:35 +00:00
Mihail Geshoski 50cfa1884c Merge branch 'MDL-87259-500' of https://github.com/x-iy/moodle into MOODLE_500_STABLE 2025-11-26 18:02:27 +08:00
Mihail Geshoski 19c613902d Merge branch 'MDL-86668-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-11-26 17:51:36 +08:00
Mihail Geshoski 4893a3ca55 Merge branch 'MDL-86975-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-26 17:43:50 +08:00
Mihail Geshoski 09b4598628 Merge branch 'MDL-87149-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-11-26 17:30:00 +08:00
david adamson a9ab17b82e MDL-87259 course: Correct content item user cache key 2025-11-26 14:36:19 +11:00
Paul Holden b01cffa8c7 Merge branch 'MDL-87046-500' of https://github.com/andrewnicols/moodle into MOODLE_500_STABLE 2025-11-25 15:25:23 +00:00
Andrew Nicols 045967e885 MDL-86018 tool_xmldb: Check XML content in reconciler 2025-11-25 15:02:18 +00:00
Paul Holden a158a2043a Merge branch 'MDL-85306-500' of https://github.com/vinod404/moodle into MOODLE_500_STABLE 2025-11-25 14:38:05 +00:00
Andrew Nicols 880f41ef50 Merge branch 'MDL-86656-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-25 21:14:08 +08:00
Andrew Nicols a20783157a Merge branch 'MDL-86419-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-25 21:08:21 +08:00
Andrew Nicols 0edf1c226c Merge branch 'MDL-86279-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-25 21:04:36 +08:00
Andrew Nicols a8c5fd81c9 Merge branch 'MDL-87166-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-25 20:58:19 +08:00
Andrew Nicols e6f215292e Merge branch 'MDL-86765-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-25 20:52:26 +08:00
Leon Stringer d371441c62 MDL-84898 core: Improve prohibit performance
Change the query used to check if a user has a capability but is
assigned a role that prohibits that capability.  This is based on the
query added by Petr Skoda for MDL-57027.
2025-11-25 11:34:46 +00:00
Huong Nguyen 40544a33b5 Merge branch 'MDL-87017-500-frontpage-block-any-page' of https://github.com/danowar2k/moodle into MOODLE_500_STABLE 2025-11-25 10:42:18 +07:00
Huong Nguyen 88e4536aff Merge branch 'MDL-87194-500' of https://github.com/albertgasset/moodle into MOODLE_500_STABLE 2025-11-25 10:40:04 +07:00
Huong Nguyen db8823ef36 Merge branch 'MDL-86161-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-11-25 10:38:13 +07:00
Huong Nguyen 8318a966f5 Merge branch 'MDL-87031_500' of https://github.com/santoshndev/moodle into MOODLE_500_STABLE 2025-11-25 10:35:28 +07:00
Jun Pataleta ea032c7045 Merge branch 'MDL-86547-500' of https://github.com/muhammadarnaldo/moodle into MOODLE_500_STABLE 2025-11-25 11:09:46 +08:00
Huong Nguyen d19fcae54b Merge branch 'MDL-85930-500' of https://github.com/andimendunia/moodle into MOODLE_500_STABLE 2025-11-25 08:51:57 +07:00
Muhammad Arnaldo 53d459e674 MDL-86547 theme_boost: Override the code-color
Increase the contrast by overriding the existing code color to match the one on default.scss
2025-11-24 19:27:36 +07:00
Jun Pataleta 91fbd8048b Merge branch 'MDL-86547-500' of https://github.com/muhammadarnaldo/moodle into MOODLE_500_STABLE 2025-11-24 15:55:19 +08:00
Muhammad Arnaldo 55c2214ee3 MDL-86547 theme_boost: Improve inline code contrast in editor
Changed the background color of highlighted inline code for better accessibility.
2025-11-24 14:26:15 +07:00
AMOS bot 25d176c1bb Automatically generated installer lang files 2025-11-23 00:08:22 +00:00
Santosh Nagargoje 83356beefa MDL-87031 gradereport: Fixed clear button issue 2025-11-21 23:37:09 +05:30
Martin v. Löwis aee6e963f2 MDL-86523 backup: update context only if also updating category. 2025-11-21 15:47:08 +01:00
Luca Bösch bb1926ee95 MDL-86668 course: Support filter in scale names. 2025-11-21 10:46:27 +01:00
Luca Bösch 78629fc48a MDL-86161 groups: Correct picture title and alt text. 2025-11-21 10:46:11 +01:00
Huong Nguyen 91febb5f8e weekly release 5.0.3+ 2025-11-21 14:33:34 +07:00
Huong Nguyen cafdda4428 NOBUG: Add upgrade notes 2025-11-21 14:33:34 +07:00
Mihail Geshoski 3503f27db7 Merge branch 'MDL-86984-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-11-21 08:11:18 +07:00
Mihail Geshoski ed5aa97fc9 Merge branch 'MDL-86069-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-21 08:11:18 +07:00
Mihail Geshoski ec879bb46b Merge branch 'MDL-87011-500' of https://github.com/rjnl/moodle into MOODLE_500_STABLE 2025-11-21 08:11:17 +07:00
Huong Nguyen 7336d00a9d Merge branch 'MDL-86323_500' of https://github.com/PhilippImhof/moodle into MOODLE_500_STABLE 2025-11-21 08:11:17 +07:00
Huong Nguyen f95ba7e3aa Merge branch 'MDL-87048-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2025-11-21 08:11:17 +07:00
Huong Nguyen 33216607a5 Merge branch 'MDL-84735-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2025-11-21 08:11:17 +07:00
Andrew Nicols a5a6c1f554 MDL-87046 core: Fix shutdown manager early return
If the `\core_shutdown_manager::initialize` method is called multiple
times, it should only succeed once.

Unfortunately whilst logging existed, the shutdown manager did not
actually exit.
2025-11-21 08:53:03 +08:00
Huong Nguyen d75c674d3a Merge branch 'MDL-85373-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-20 13:30:41 +07:00
Mihail Geshoski 21778ac0c0 Merge branch 'MDL-86967_500' of https://github.com/Chocolate-lightning/moodle into MOODLE_500_STABLE 2025-11-20 13:30:41 +07:00
Huong Nguyen c8cfd00a3f Merge branch 'MDL-86272-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-20 13:30:41 +07:00
Amaia Anabitarte 95a394d41b Merge branch 'MDL-87198-500' of https://github.com/sarjona/moodle into MOODLE_500_STABLE 2025-11-20 13:30:41 +07:00
Huong Nguyen 3fd6c503ce Merge branch 'MDL-82511-cache-cron-MOODLE_500_STABLE' of https://github.com/bwalkerl/moodle into MOODLE_500_STABLE 2025-11-20 13:30:41 +07:00
Huong Nguyen aff6b93390 Merge branch '86320-fix-qr-code-unit-test-500' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_500_STABLE 2025-11-20 13:30:41 +07:00
Huong Nguyen 54683a0468 Merge branch 'MDL-86907-500' of https://github.com/mioyu-ubiq/moodle into MOODLE_500_STABLE 2025-11-20 13:30:41 +07:00
Huong Nguyen cbe8aca481 Merge branch 'MDL-72608-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-20 13:30:40 +07:00
Huong Nguyen f6f24f266d Merge branch 'MDL-85835-500' of https://github.com/plasger-uni-siegen/moodle into MOODLE_500_STABLE 2025-11-20 13:30:40 +07:00
Huong Nguyen fbcefd88b2 Merge branch 'MDL-86998-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-11-20 13:30:40 +07:00
Simey Lameze 0594d87148 MDL-87050 behat: use src for img xpath selector 2025-11-20 13:30:40 +07:00
Mihail Geshoski 00205a5453 Merge branch 'MDL-85049-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-11-20 13:30:40 +07:00
Mihail Geshoski 56d34f5a47 Merge branch 'MDL-86817_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2025-11-20 13:30:40 +07:00
Angelia Dela Cruz 323458a3a8 MDL-87048 tool_lp: Behat for synchronising cohort with learning plan 2025-11-20 10:10:31 +08:00
Angelia Dela Cruz 071658ba28 MDL-84735 gradingform: Behat for modifying marking guide criterion 2025-11-20 07:50:09 +08:00
Paul Holden c1860dad87 MDL-86272 tool_policy: verify current user before store policy agreed. 2025-11-18 11:47:59 +00:00
Santosh Nagargoje 6f62b7eaa5 MDL-86749 questions: Added index on hashcode column
Identified performance bottlenecks in clear_cached_data() from
mod/quiz/report/statistics/report.php. The delete_records() calls on
question_statistics, question_response_analysis, and quiz_statistics tables
use the hashcode column for filtering, which becomes inefficient with large
datasets.
2025-11-18 16:56:47 +05:30
Paul Holden 4e85aecde8 MDL-86565 courseformat: don't link to sections user cannot see. 2025-11-18 10:32:01 +00:00
Mathew May 0b6ac8dc94 MDL-86967 theme_classic: Correct orange & yellow vars + warning 2025-11-18 15:06:50 +08:00
Mathew May 40f7285bbb MDL-86967 theme_boost: Correct orange & yellow vars + warning 2025-11-18 15:06:45 +08:00
mioyu-ubiq fba03e9ee5 MDL-86907 mod_choice: Behat test for adding multiple choice responses 2025-11-18 15:01:54 +08:00
Mihail Geshoski 9e26d529c4 Merge branch 'MDL-86099_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2025-11-17 22:28:35 +08:00
Andi Permana b21e7b56a6 MDL-85930 tiny_media: Fix adding video from Youtube repo 2025-11-17 19:10:13 +07:00
Paul Holden f1d0e24258 MDL-86279 core: fix deprecation emitting/annotation in AWS helpers. 2025-11-17 11:01:03 +00:00
Paul Holden 6213577e08 MDL-86955 tool_task: ensure tasks are runnable in adhoc table output. 2025-11-17 10:56:49 +00:00
Huong Nguyen 06a1c95afa Merge branch 'MDL-85235-500' of https://github.com/safatshahin/moodle into MOODLE_500_STABLE 2025-11-17 16:02:01 +07:00
Huong Nguyen d3096b658b Merge branch 'MDL-87050-500' of https://github.com/andelacruz/moodle into MOODLE_500_STABLE 2025-11-17 15:58:14 +07:00
Huong Nguyen eb07f79220 Merge branch 'MDL-87111-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-17 15:31:42 +07:00
Huong Nguyen 146c3da68f Merge branch 'MDL-86810-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-17 15:27:42 +07:00
Huong Nguyen c47d471e3b Merge branch 'MDL-86159-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-17 14:56:03 +07:00
Huong Nguyen df3ef9a8e7 Merge branch 'MDL-85764-quiz-notification-MOODLE_500_STABLE' of https://github.com/bwalkerl/moodle into MOODLE_500_STABLE 2025-11-17 14:50:48 +07:00
vinod404 b362a6d1ed MDL-85306 core/toggle: Move tooltip/title to input to show tooltips.
The title and tooltip attributes are now moved to the input element, ensuring tooltips appear.
2025-11-17 12:14:16 +05:30
Jun Pataleta 83d2dc180f MDL-87149 mod_feedback: Accessibility Behat test coverage
* Check the accessibility of the questionnaire, especially when
there are dependent questions.
* Use generators for a more efficient and faster test execution.
2025-11-17 12:45:01 +08:00
Jun Pataleta a14c44374a MDL-87149 mod_feedback: Generate dependent questions
Allow the generator to create questions that depend on other questions.
2025-11-17 12:45:01 +08:00
Jun Pataleta e6d4f54e23 MDL-87149 theme_boost: Remove the .feedback_is_dependent class
It's no longer being used. So, just remove it.
2025-11-17 12:45:00 +08:00
Jun Pataleta ad733468ef MDL-87149 mod_feedback: Do not use .feedback_is_dependent anymore
Making a visual distinction for dependent questions compared to other
questions does not add much value in the perspective of users. We should
just stop adding the `.feedback_is_dependent` class for dependent
questions.
2025-11-17 12:45:00 +08:00
Huong Nguyen 3a7525ed2f Merge branch 'MDL-87107-500' of https://github.com/andrewnicols/moodle into MOODLE_500_STABLE 2025-11-17 09:09:02 +07:00
Mark Johnson 377bce2895 MDL-86099 questions: Check for empty bank names
If we call `question_bank_helper::create_default_open_instance` with an
empty `$bankname` parameter, it will currently create a new instance
with no name. This leads to exceptions being thrown when we try to load
the course it belongs to.

This adds some validation to ensure the name being passed is not empty.
Once the issue is resolved, and the bank is created with a proper name,
the course will work as normal.
2025-11-14 16:51:21 +00:00
Albert Gasset d0fdcd6528 MDL-87194 tool_mobile: Fix subscription requests 2025-11-14 16:17:03 +01:00
Albert Gasset 6e173777e9 MDL-87194 message_airnotifier: Fix access key requests 2025-11-14 16:16:54 +01:00
Sara Arjona 17d26daac7 MDL-87198 course_format: Consider section name visibility in Overview 2025-11-14 15:56:49 +01:00
Daniel Poggenpohl 3dfe385f07 MDL-87017 blocks: Provide page context to page_type_list functions
- The current context may be necessary when deleting a frontpage block displayed on every page with javascript disabled
- The current context may be necessary when a frontpage block is displayed on every page and the question bank is viewed
- Also handle a NULL currentcontext for question_page_type_list() correctly
2025-11-14 15:37:58 +01:00
Paul Holden bada9f3efa MDL-72608 output: define default popover region template lang string. 2025-11-14 13:04:50 +00:00
Paul Holden c0d57476a5 MDL-86419 enrol_ldap: define plugin's own copy of configuration strings.
AMOS BEGIN
 CPY [ignorehiddencourses,enrol_database],[ignorehiddencourses,enrol_ldap]
 CPY [ignorehiddencourses_desc,enrol_database],[ignorehiddencourses_desc,enrol_ldap]
AMOS END
2025-11-14 13:03:56 +00:00
Benjamin Walker 5afac60e42 MDL-85764 mod_quiz: Improve performance of quiz notifications task 2025-11-14 20:04:14 +10:00
Benjamin Walker 724e5b45e3 MDL-82511 cachestore_redis: Reduce blocking when finding keys 2025-11-14 20:03:43 +10:00
Benjamin Walker fd6b14286a MDL-82511 cache: Improve performance of cleanup in cache_cron_task 2025-11-14 20:03:43 +10:00
Paul Holden 2fada9ae2d MDL-86159 mod_bigbluebuttonbn: consistent/correct course name format. 2025-11-14 07:57:59 +00:00
Philipp Imhof edc2f17f54 MDL-86323 editor_tiny: allow svg attributes
Co-authored-by: Petr Skoda <commits@skodak.org>
2025-11-14 08:50:29 +01:00
Luca Bösch 0349b88a58 MDL-86984 book: remove borders in print page top table. 2025-11-13 17:06:59 +01:00
Luca Bösch 19df1c7ea2 MDL-85049 question: complete border around table row for newest question 2025-11-13 17:02:25 +01:00
Mihail Geshoski e6593a6e73 weekly release 5.0.3+ 2025-11-13 18:49:03 +08:00
Mark Johnson 458be6f714 MDL-86817 qbank: Prevent unique key violations during migration
When fixing categories with broken parents, if the resulting changes
would have led to categories with the same stamp or idnumber being in
the same context, the task failed due to violations of the unique keys
on contextid-stamp and contextid-idnumber.

This checks for violations before moving categories, and either
generates a new stamp or nulls the idnumber on the category being moved,
following the method used in MDL-85869.
2025-11-13 10:35:16 +00:00
Angelia Dela Cruz 1d8531f7d5 MDL-87050 mod_folder: Behat for preventing forced file downloads 2025-11-13 15:53:07 +08:00
Mihail Geshoski 1e2310781e Merge branch 'MDL-86397_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2025-11-13 12:16:20 +08:00
Huong Nguyen 8715e6ddab Merge branch 'MDL-86845-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-11-13 11:12:12 +07:00
Huong Nguyen 86574edf57 Merge branch 'MDL-86895-500' of https://github.com/mioyu-ubiq/moodle into MOODLE_500_STABLE 2025-11-13 10:44:05 +07:00
Huong Nguyen 739d59d8d3 Merge branch 'MDL-79249-500' of https://github.com/andelacruz/moodle into MOODLE_500_STABLE 2025-11-13 10:20:36 +07:00
Huong Nguyen d51f19869f Merge branch 'MDL-87047-500' of https://github.com/andelacruz/moodle into MOODLE_500_STABLE 2025-11-13 10:16:53 +07:00
Huong Nguyen 1cfae4692b Merge branch 'MDL-78973-500' of https://github.com/andelacruz/moodle into MOODLE_500_STABLE 2025-11-13 08:52:54 +07:00
Huong Nguyen 904d4637ef Merge branch 'MDL-84967-M500_recordset-not-closed-in-core_analytics_local_analyser_by_course_get_analysables_iterator' of https://github.com/ziegenberg/moodle into MOODLE_500_STABLE 2025-11-13 08:47:36 +07:00
Huong Nguyen e72988cdf3 Merge branch 'MDL-82867-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-13 08:44:42 +07:00
Mark Johnson 8c35bcb50e MDL-86397 calendar: Filter user courses
In the calendar API, `raw_event_retrieval_strategy` accepts a list of
courses to return events for. If one or more users are also specified,
it will find the courses the are enrolled in, then call
`calendar_set_filters()` to return a sorted list of those courses, and
any groups within those courses that they can see events for. The list
of courses in then filtered to those passed to
`raw_event_retrieval_strategy`.

If the user is enrolled on lots of courses, but is only viewing the
caledar for one course, this results in a lot of redundant work to fetch
group data for their courses which is then not used. This either
involves a lot of extra complex queries, or results in an unncessary
cache hit for each course.

This change re-orders the code so that the list of enrolled courses is
filtered to just those courses being viewed, before it is passed to
`calendar_set_filters()`. This means we are only fetching group data for
those courses we will be showing events for.
2025-11-12 14:25:40 +00:00
Mihail Geshoski b00abeda20 Merge branch 'MDL-87130-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-12 17:26:23 +08:00
Mihail Geshoski c8b6f031cd Merge branch 'MDL-86963-500' of https://github.com/andelacruz/moodle into MOODLE_500_STABLE 2025-11-12 17:15:00 +08:00
Mihail Geshoski 31b09beaa8 Merge branch 'MDL-85686-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2025-11-12 16:59:57 +08:00
Angelia Dela Cruz dca942ad3e MDL-87047 tool_lp: Behat optimisation 2025-11-12 16:37:50 +08:00
Mihail Geshoski eafa526b2b Merge branch 'MDL-86886-500' of https://github.com/andelacruz/moodle into MOODLE_500_STABLE 2025-11-12 16:37:26 +08:00
Angelia Dela Cruz eb9e540a7f MDL-87047 tool_lp: Behat to complete a learning plan and alter it 2025-11-12 16:34:53 +08:00
Angelia Dela Cruz be198feadf MDL-86963 tool_lp: Behat to perform CRUD operations on competencies 2025-11-12 10:33:24 +08:00
Luca Bösch 80d90fd53d MDL-86845 admin: Striped hovering plugins + course format table w/ BS 5. 2025-11-12 00:22:01 +01:00
Safat e29cfb15d2 MDL-85235 tool_mobile: Implement the augmentation hooks for apps 2025-11-12 10:11:16 +11:00
Safat 79950edcd1 MDL-85235 tool_mobile: Add extend ios app banner hook 2025-11-12 10:11:03 +11:00
Paul Holden a32e1d6000 MDL-87130 dml: fix SQL debugging test assertions on Windows.
Ensure that the Windows directory separator ('\') isn't confused
for regular expression control character.
2025-11-11 15:50:41 +00:00
Jun Pataleta 8d4bef06c3 MDL-86840 forum: Add accessibility Behat coverage
* Add accessibility Behat coverage on the Advanced forum search page.
2025-11-11 21:14:11 +08:00
Jun Pataleta ccff76264a MDL-86840 forum: Do not use layout table for the search form 2025-11-11 21:14:10 +08:00
Jun Pataleta 73d4148143 MDL-86840 forum: Fix heading structure of search form 2025-11-11 21:14:10 +08:00
Paul Holden 84caa44014 MDL-86765 forms: disable calendar icon if element disabled.
This is similar to change in ec89abc5 which updated the icon state
if the corresponding checkbox was unchecked. Here we're doing the
same if the entire date/time element itself is disabled.
2025-11-11 12:49:46 +00:00
Paul Holden 365649a8b7 MDL-86656 task: remove spurious mtrace parameters in calling code.
Co-authored-by: Jason Lees <jlees@arden.ac.uk>
2025-11-11 12:48:16 +00:00
Paul Holden b6f7d9b192 MDL-87056 enrol: update instance modified date when toggling status. 2025-11-11 12:36:26 +00:00
Paul Holden 24523358c0 MDL-87111 filter_tex: remove border-radius of rendered expression. 2025-11-11 12:18:23 +00:00
Paul Holden 0352940fbf MDL-87166 communication: verify user feature support on user deletion. 2025-11-11 11:45:40 +00:00
Jun Pataleta 89951b89c5 MDL-86998 message: Fix accessibility issues in notification settings
* Fix missing labels for the checkboxes that enable notification plugins
* Add an accessible name for the Default notification preferences table
* Fix missing table header for the preference column of the Default
  notification preferences table.
* Accessibility Behat test coverage for the Notification settings
  admin page
* Remove the unnecessary title attributes for the visually hidden labels
2025-11-11 17:28:49 +08:00
Jun Pataleta 57c4780ead MDL-86998 message: Fix accessibility issues in notification preferences
* Fix missing column heading for the preference column
* Fix incorrect label for the toggle controls
* Make the preference name a table heading with a row scope so that the
  toggle controls will be programmatically associated to it.
* Apply a col scope for the processor column headings to
  programmatically associate the toggle controls to their respective
  columns.
2025-11-11 17:28:49 +08:00
Angelia Dela Cruz 234fd43581 MDL-86886 tool_lp: Behat to move and cross-reference competencies 2025-11-11 15:54:46 +08:00
Simon Plasger ba629c5b41 MDL-85835 TinyMCE: Fix not working tabs on TinyMCE in quiz mode 2025-11-11 07:32:13 +01:00
Angelia Dela Cruz 479738e0ff MDL-78973 Behat: Behat coverage for invalid file upload in data activity 2025-11-11 13:16:49 +08:00
Simey Lameze cd4c824f6e MDL-85686 mod_quiz: unit test coverage for questions shuffle 2025-11-11 11:18:04 +08:00
Mio Yu ccb3653e7e MDL-86895 core_grades: Behat to verify listing and grading submissions 2025-11-11 09:51:55 +08:00
Safat 5637b4f6ed MDL-85235 core: Add extend url hook 2025-11-10 22:07:39 +11:00
Safat 1eb3e7781d MDL-85235 tool_mobile: Make mobile manifest cookieless and cacheable 2025-11-10 22:07:39 +11:00
Huong Nguyen b6a4b81ae8 Merge branch 'MDL-85627-500' of https://github.com/jleyva/moodle into MOODLE_500_STABLE 2025-11-10 10:17:19 +07:00
Huong Nguyen c615ae3949 Merge branch 'MDL-86999-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-11-10 10:13:11 +07:00
Huong Nguyen bf52e60dce Merge branch 'MDL-81604-500' of https://github.com/t-schroeder/moodle into MOODLE_500_STABLE 2025-11-10 10:08:14 +07:00
Shamim Rezaie 04b7ec3506 Merge branch 'MDL-86965-500' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_500_STABLE 2025-11-10 13:44:24 +11:00
Luca Bösch b038b9ad2d MDL-86999 customfield: Striped hovering fields table with BS 5. 2025-11-07 13:11:19 +01:00
Andrew Nicols f3702d06e0 MDL-87107 core: Stop using MUC for hook manager caching 2025-11-07 17:19:09 +08:00
Huong Nguyen 7838e3f247 weekly release 5.0.3+ 2025-11-07 14:49:05 +07:00
Huong Nguyen 6f5c9fdcee NOBUG: Add upgrade notes 2025-11-07 14:49:05 +07:00
Huong Nguyen 758b273d33 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2025-11-07 14:48:54 +07:00
Huong Nguyen 32824dd691 Merge branch 'MDL-86701-500-fix' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-11-07 08:46:41 +07:00
Juan Leyva 5b1c5c47e5 MDL-85627 mod_bigbluebuttonbn: Remove unused class 2025-11-06 13:14:32 +01:00
Jun Pataleta d603e78896 MDL-86701 behat: Update Behat tests to press edit/delete buttons 2025-11-06 18:40:22 +08:00
Huong Nguyen 8c399ba7f9 MDL-69226 environment: filter extension required for 4.1 2025-11-06 18:21:33 +08:00
hieuvu adf6199966 MDL-86965 core_question: Fix get_bank_instances query. 2025-11-06 16:52:09 +07:00
Mihail Geshoski 2699e5f3c2 Merge branch 'MDL-87073-500' of https://github.com/HuongNV13/moodle into MOODLE_500_STABLE 2025-11-06 17:07:52 +08:00
Huong Nguyen cbe0abe1be MDL-87073 PHPUnit: Use non-DST timezone for comparing
Including in this commit
 - Use America/New_York instead of US/Eastern
2025-11-06 15:47:13 +07:00
Huong Nguyen 54272a7269 Merge branch 'MDL-86908-500' of https://github.com/andelacruz/moodle into MOODLE_500_STABLE 2025-11-06 15:42:27 +07:00
Huong Nguyen 525c6541bc Merge branch 'MDL-87049-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2025-11-06 15:40:31 +07:00
Huong Nguyen b80d614961 Merge branch 'MDL-87079-500' of https://github.com/andrewnicols/moodle into MOODLE_500_STABLE 2025-11-06 15:37:29 +07:00
Jake Dallimore a8ad58cc07 Merge branch 'MDL-86379-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2025-11-06 14:30:05 +08:00
Mihail Geshoski 37c7760c98 Merge branch 'MDL-86010_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2025-11-06 11:53:07 +08:00
Huong Nguyen 2ab3f1088f Merge branch 'MDL-87019-redis-bloat-MOODLE_500_STABLE' of https://github.com/bwalkerl/moodle into MOODLE_500_STABLE 2025-11-06 10:35:11 +07:00
Jake Dallimore cfa5f8a60d Merge branch 'MDL-86534-500' of https://github.com/andrewnicols/moodle into MOODLE_500_STABLE 2025-11-06 11:33:50 +08:00
Huong Nguyen 41ad1a67f9 Merge branch 'MDL-86701-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-11-06 10:27:21 +07:00
Huong Nguyen 2d17eeb6c8 Merge branch 'MDL-86332-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-06 10:20:33 +07:00
Huong Nguyen 6ab0bdd7f7 Merge branch 'mdl-85036_500' of https://github.com/james-cnz/moodle into MOODLE_500_STABLE 2025-11-06 10:53:56 +08:00
Jake Dallimore f4f445d54a Merge branch 'MDL-87004_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2025-11-06 10:53:56 +08:00
Simey Lameze 280a604e4d MDL-87049 behat: read showcampaigncontent setting when running behat 2025-11-06 08:20:52 +08:00
Angelia Dela Cruz 95304962da MDL-87049 core: Behat to toggle campaign content banner display 2025-11-06 08:20:51 +08:00
AMOS bot 323ee9aa02 Automatically generated installer lang files 2025-11-06 00:07:58 +00:00
Angelia Dela Cruz 7ca19e9c32 MDL-86908 core_contentbank: Behat to set supported files of contentbank 2025-11-05 18:00:23 +08:00
Simey Lameze 8de0e64544 MDL-86379 mod_quiz: move create_test_quiz function into generator 2025-11-05 11:50:11 +08:00
Andrew Nicols 7e9255978b MDL-87079 core: Call existing pcntl handlers
Whilst `register_shutdown_function` works as a queue, `pcntl_signal`
does not.

To preserve the behaviour of existing signal handlers, as are typically
found in CLI wrappers like PHPUnit and Behat, we should store any
existing handler
2025-11-05 08:52:34 +08:00
Ilya Tregubov 33483246d1 Merge branch 'MDL-86953-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-04 16:46:33 +01:00
Stefan Hanauska b458318d13 MDL-68062 badges: Allow revoke by every user with the correct role
Co-authored-by: Rajneel Totaram <rjnlfj@yahoo.com>
2025-11-04 14:12:42 +01:00
James C 69957f8a3b MDL-85036 completion: Properly initialize cm_info for user completion 2025-11-04 20:53:29 +13:00
Jake Dallimore 5b848f2964 Merge branch 'MDL-85391-m500' of https://github.com/NeillM/moodle into MOODLE_500_STABLE 2025-11-04 14:14:48 +08:00
Jake Dallimore ac3f6fc4d3 Merge branch 'MDL-86855-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-11-04 14:09:54 +08:00
Ilya Tregubov bd132c995d Merge branch 'MDL-86952-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-11-03 12:14:42 +01:00
Jun Pataleta c24afe888c MDL-86701 customfield: Better naming of custom field action buttons
Include the category and field names for accessible names of the delete
and action buttons to help assistive technology users better understand
the buttons' purpose.
2025-11-03 12:12:32 +08:00
Jun Pataleta c11f67bdb4 MDL-86701 customfield: Improve action buttons accessibility
* Use native HTML buttons for the edit and delete buttons. This provides
default button behaviours which helps keyboard users activate the
buttons using either the Space or Enter key.
* Move the accessible label out of the pix icon and to the action button
itself.
* Style buttons to ensure that they have a minimum clickable size of
24x24 pixels to sufficiently meet WCAG 2.2 SC 2.5.8 - Target Size
(Minimum) (Level AA).
2025-11-03 11:59:40 +08:00
Angelia Dela Cruz 2ca2aeaf03 MDL-79249 core_filepicker: Cancel file and folder upload using X button 2025-11-03 10:44:38 +08:00
Huong Nguyen 9a7a484e69 Merge branch 'MDL-69226-M500_verify-that-the-filter-php-extension-is-present' of https://github.com/ziegenberg/moodle into MOODLE_500_STABLE 2025-11-03 09:02:15 +07:00
AMOS bot fdc195ce67 Automatically generated installer lang files 2025-11-01 00:07:57 +00:00
Benjamin Walker 2530e564b1 MDL-87019 redis: Avoid storing userhashkey for non-login users 2025-10-31 16:20:34 +10:00
Huong Nguyen 8449b9ac6f Merge branch 'MDL-86235-500' of https://github.com/andimendunia/moodle into MOODLE_500_STABLE 2025-10-31 09:34:55 +07:00
Mihail Geshoski 8316503864 weekly release 5.0.3+ 2025-10-30 18:11:16 +08:00
Mihail Geshoski 158fa68cdf Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2025-10-30 18:11:00 +08:00
Neill Magill ee5126a88e MDL-85391 course: Handle null course urls
Course urls may be null when navigation is set to true.

The return value from course_get_url being null was not being handled before
this change, which could lead to an exception causing the page not to load.

It also handles null urls in the course index in Boost so that they are
not a link to what ever the current page is.

If either the first or last section in a format did not a
return a url under the Classic theme there would still be
a link displayed with a link to the current page the user
is on.

After this change no link would be displayed in this case.
2025-10-29 08:16:34 +00:00
Huong Nguyen 88b6baa6af Merge branch 'mdl85075-50' of https://github.com/matthewhilton/moodle into MOODLE_500_STABLE 2025-10-29 09:31:20 +07:00
Mihail Geshoski 06463ce66a Merge branch 'MDL-86894-500' of https://github.com/Kredelirious/moodle into MOODLE_500_STABLE 2025-10-29 10:18:31 +08:00
Mihail Geshoski d3d2107e2c Merge branch 'MDL-82190-500' of https://github.com/danghieu1407/moodle into MOODLE_500_STABLE 2025-10-29 10:11:34 +08:00
Daniel Ziegenberg 4eded4dca4 MDL-69226 environment: filter extension required
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-10-28 19:31:14 +01:00
Kim Jared Lucas f9a738f3cf MDL-86894 mod_forum: Behat to verify default forum RSS settings 2025-10-28 13:02:58 +08:00
AMOS bot aacdf287f5 Automatically generated installer lang files 2025-10-28 00:09:47 +00:00
Rajneel Totaram eb3731e9b2 MDL-87011 mod_assign: Replace deprecated CSS style 2025-10-27 22:25:50 +12:00
Adrian Greeve 5190731af4 Merge branch 'MDL-85774-500-3' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-10-27 09:03:21 +08:00
Daniel Ziegenberg ab33219f38 MDL-84967 analytics: close recordset when it's not needed anymore
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-10-24 21:02:59 +02:00
ferran 5b5ef5c66f Merge branch 'MDL-86430-Bad-Display-Of-Scale-Grading-500' of https://github.com/birdy1976/moodle into MOODLE_500_STABLE 2025-10-24 12:15:36 +02:00
Andi Permana 2a4b767402 MDL-86235 core: Add table-hover class to admintable and generaltable 2025-10-24 15:50:06 +07:00
Mark Johnson da518313d6 MDL-87004 backup: Ensure backups include all random questions
Backing up quizzes containing random questions from multiple different
categories was only including one of the categories in the backup.

This was due to doing $array + $array instead of array_merge(), meaning
items in the second array with keys that were already present in the
first did not get added to the result.
2025-10-24 09:45:31 +01:00
Jun Pataleta d158fc8819 MDL-86855 qbank_columnsortorder: Render disabled columns as a list
* Lists must be marked up with the proper semantics.
2025-10-24 12:02:54 +08:00
Jun Pataleta 83ffdd7a71 MDL-86855 qbank_columnsortorder: Fix accessibility issues
* Fix empty column heading in admin settings page
* Add accessible labels for the move buttons
* Fix drag and drop Behat test
* Add accessibility Behat coverage
2025-10-24 12:02:54 +08:00
Huong Nguyen 1beae326aa weekly release 5.0.3+ 2025-10-24 11:00:15 +07:00
Huong Nguyen 89cd360c83 NOBUG: Add upgrade notes 2025-10-24 11:00:15 +07:00
Martin Vögeli 719921b93a MDL-86430 theme_boost: Fix display of scale grading when title too long 2025-10-23 17:14:51 +02:00
danghieu1407 9765721e10 MDL-82190 Quiz: Fix quiz preview crash on question version removal 2025-10-23 13:32:47 +07:00
Jun Pataleta 52ec42bb01 MDL-85774 login: Check for username/password fields before moving focus
When the login form is not shown but $CFG->loginautofocus is turned on,
we need to verify first that the username and password fields exist
before we move the focus. Otherwise, the JS will break.
2025-10-23 11:28:48 +08:00
Jun Pataleta 4c66cdde04 MDL-85774 login: Remove visually-hidden links
Visually hidden links on login error/info disrupt tab order. We must
remove them.

Instead, announce the div containing the login error/info messages on
page reload.

The visually hidden signup link has also been removed.
2025-10-23 11:28:48 +08:00
Huong Nguyen 5be6382221 Merge branch 'MDL-86986-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-10-23 09:57:31 +07:00
Huong Nguyen f50b0661ef Merge branch 'MDL-80524-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-23 09:29:27 +07:00
Mihail Geshoski 7b443d6bf0 Merge branch 'MOODLE_500_STABLE' of https://github.com/aneno-m-e/moodle into MOODLE_500_STABLE 2025-10-23 10:23:12 +08:00
Matthew Hilton bd500af20e MDL-85075 files: Use core security helper first 2025-10-23 12:21:17 +10:00
Andrew Nicols a429bfbdac Merge branch 'MDL-81804-500-first' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-10-23 09:12:45 +08:00
Amaia Anabitarte f8cc4eeea9 Merge branch 'MDL-86434-invalidusertitle-500' of https://github.com/leonstr/moodle into MOODLE_500_STABLE 2025-10-22 23:12:54 +02:00
Luca Bösch 635b7f6bdf MDL-81804 dml: Passing parameters with -c key=val on PostgreSQL.
Co-authored-by: Marcos Dos Santos De Oliveira <marcos.s.oliveira@fiesc.com.br>
2025-10-22 16:20:25 +02:00
Jun Pataleta ded6e7e9b2 MDL-86986 core: Add aria-label to the drag handle button 2025-10-22 20:14:38 +08:00
ferran 66a094dc77 Merge branch 'wip_MDL-86435_m50' of https://github.com/gjb2048/moodle into MOODLE_500_STABLE 2025-10-22 12:55:56 +02:00
Mihail Geshoski e9ad1731cb Merge branch 'MDL-85474_500' of https://github.com/jonof/moodle into MOODLE_500_STABLE 2025-10-22 16:46:56 +08:00
Paul Holden a3c171eeb8 MDL-80524 rating: preserve activity idnumber when adding rating.
See also e9a5485f for context regarding similar problem with grade
updates.

Co-authored-by: Julian Tovar
2025-10-22 09:43:39 +01:00
Mihail Geshoski 79cf123335 Merge branch 'MDL-86282-500' of https://github.com/srobotta/moodle into MOODLE_500_STABLE 2025-10-22 16:31:09 +08:00
Noemie Ariste 0fb17449f6 MDL-75764 mod_assign: remove capability check for bulk downloads 2025-10-22 16:50:14 +13:00
Mihail Geshoski 1e44685774 Merge branch 'MDL-86217-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-22 11:41:19 +08:00
Mihail Geshoski 8c2b54410e Merge branch 'MDL-86225-500' of https://github.com/josepico01/moodle into MOODLE_500_STABLE 2025-10-22 11:03:21 +08:00
Mihail Geshoski ba4ffb5881 Merge branch 'MDL-86063-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-22 10:21:45 +08:00
Huong Nguyen 2f4f624b19 Merge branch '83543-xls-form-500' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_500_STABLE 2025-10-22 09:12:55 +07:00
Huong Nguyen c8d7e0cf64 Merge branch '77137-proxybypass-on-multiple-curl-queries-500' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_500_STABLE 2025-10-22 09:07:17 +07:00
Paul Holden 84e9482367 MDL-86975 mod_book: fix alignment of chapter editing delete icon.
Mis-aligned since changes to previously used action icon in df486967.
2025-10-22 00:26:42 +01:00
Amaia Anabitarte 60950923a6 Merge branch 'MDL-85796-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-10-21 19:56:09 +02:00
Paul Holden fd5aa44763 MDL-86255 behat: implement methods to assert date/time field value. 2025-10-21 11:34:43 +01:00
Shamim Rezaie e36f16ec13 Merge branch 'MDL-85592-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-21 17:10:33 +11:00
Huong Nguyen 1125b4ada6 Merge branch 'MDL-85168-MOODLE_500_STABLE' of https://github.com/phmemmel/moodle into MOODLE_500_STABLE 2025-10-21 10:36:34 +07:00
Huong Nguyen 974b18b09e Merge branch 'MDL-85633-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-10-21 09:47:25 +07:00
Huong Nguyen e465d5432f Merge branch 'MDL-85511-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-10-21 09:44:49 +07:00
Huong Nguyen 5194cad1b5 Merge branch 'MDL-85287-m500' of https://github.com/sammarshallou/moodle into MOODLE_500_STABLE 2025-10-21 09:42:07 +07:00
Huong Nguyen 2849cf39dc Merge branch 'MDL-86559-500' of https://github.com/andimendunia/moodle into MOODLE_500_STABLE 2025-10-21 09:39:32 +07:00
Jonathon Fowler 06417ba66a MDL-85474 assign: fix call to undefined 'view_error_page' method
And while doing so, fix $notices parameters that ought to be call-by-
reference to collect notices produced during calls to
process_submit_other_for_grading() and process_submit_for_grading().
2025-10-21 10:30:42 +10:00
Paul Holden cf8d527e11 Merge branch 'MDL-86455-500' of https://github.com/yerairogo/moodle into MOODLE_500_STABLE 2025-10-20 16:51:06 +01:00
Sara Arjona 4be1d94f50 Merge branch 'MDL-86598-500' of https://github.com/aanabit/moodle into MOODLE_500_STABLE 2025-10-20 16:59:08 +02:00
Amaia Anabitarte 50ee96071a MDL-86598 course: Render HTML in activity overview section name mustache 2025-10-20 16:16:52 +02:00
Amaia Anabitarte 7c767af54b Merge branch 'MDL-86011-500' of https://github.com/sarjona/moodle into MOODLE_500_STABLE 2025-10-20 16:01:45 +02:00
Amaia Anabitarte e5f5854999 Merge branch 'MDL-86912-500' of https://github.com/sarjona/moodle into MOODLE_500_STABLE 2025-10-20 13:33:44 +02:00
Luca Bösch 8c7fd86a7d MDL-85633 course: Move away from YUI navigation.
Co-authored-by: Mikel Martín Corrales <mikel@moodle.com>
2025-10-20 11:25:14 +02:00
sam marshall 227e4a4e28 MDL-85287 User tours: Avoid scrolling while backdrop is displayed
If the page scrolls while the backdrop is displayed, it looks
incorrect because the backdrop does not scroll with page content.
To avoid this, don't show the backdrop until scrolling has finished.
2025-10-20 09:58:30 +01:00
Sara Arjona df800f94e2 MDL-86912 assign: Prevent admin submitting unless enrolled as student 2025-10-20 09:47:27 +02:00
Sara Arjona ef2bce431e MDL-86912 assign: Adjust display of Status column in Overview 2025-10-20 09:47:27 +02:00
Luca Bösch 1003a27252 MDL-85511 course: back button for course management course search. 2025-10-20 08:03:57 +02:00
Mihail Geshoski 66ff71cbe8 Merge branch 'MDL-85696-500' of https://github.com/andelacruz/moodle into MOODLE_500_STABLE 2025-10-20 10:28:03 +08:00
Huong Nguyen 96906b853e Merge branch 'mdl-85917_500' of https://github.com/james-cnz/moodle into MOODLE_500_STABLE 2025-10-20 08:48:46 +07:00
Huong Nguyen 514417a376 Merge branch 'MDL-85975_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2025-10-20 08:45:59 +07:00
Paul Holden f9f4c49fd2 MDL-86063 customfield: internally validate numeric data in persistent.
Move previous validation from the data controller, added in 89dbe63d,
into the persistent class itself so that it can internally validate
itself rather than relying on callers.

This resolves problems with empty/null numeric fields contained within
course backups (e.g. during course copy).
2025-10-19 16:53:17 +01:00
Paul Holden 01a3c146c3 MDL-86217 badges: gracefully handle missing recipient data. 2025-10-19 16:50:16 +01:00
Gareth Barnard cf1e0e962f MDL-86435 course: i/groupn.svg is not the same size as other icons. 2025-10-17 16:49:24 +01:00
Paul Holden 5a3bcf7b82 MDL-86953 blocks: constrain block controls menu on narrow screens.
Extension of work in 93cadaba that constrained the dropdown menu,
we now set a breakpoint to account for overflowing when narrow.
2025-10-17 14:49:48 +01:00
Ilya Tregubov 520ae9c00d Merge branch 'MDL-80422-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-17 15:37:33 +02:00
Paul Holden 70f1993958 MDL-86952 output: truncate long text in drag/drop dialog options. 2025-10-17 14:12:31 +01:00
Paul Holden cdc9d7e3ff MDL-86952 output: truncate long text in modal/dialog title element. 2025-10-17 14:12:10 +01:00
Amaia Anabitarte 0306be834e Merge branch 'MDL-85887-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-17 13:47:48 +02:00
Paul Holden 95c789fc1d MDL-86810 completion: update module completion data correctly.
Ensure we check the correct field to determine form value.
2025-10-17 12:13:01 +01:00
Paul Holden f8f309800c MDL-85373 admin: update site installation page referenced favicon. 2025-10-17 12:06:27 +01:00
Angelia Dela Cruz 123b1a1193 MDL-85696 mod_quiz: Behat to attempt password and time restricted quiz 2025-10-17 16:19:36 +08:00
Huong Nguyen 7518095d59 Merge branch 'MDL-85418-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-17 10:28:04 +07:00
Huong Nguyen dd2de75ad4 Merge branch 'MDL-85312-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-17 10:19:09 +07:00
Andrew Nicols b286e6c65a Merge branch 'm500-86376' of https://github.com/danmarsden/moodle into MOODLE_500_STABLE 2025-10-17 11:04:40 +08:00
Andrew Nicols 611008d6eb Merge branch 'MDL-85366-500' of https://github.com/djarran/moodle into MOODLE_500_STABLE 2025-10-17 08:47:05 +08:00
Andrew Nicols 30a482b220 Merge branch 'MDL-86822-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-17 08:34:39 +08:00
Andrew Nicols 240ea09d61 Merge branch 'MDL-85554-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-17 08:27:42 +08:00
Andrew Nicols 7927f8d058 weekly release 5.0.3+ 2025-10-17 06:50:42 +08:00
Andrew Nicols 2e78b280b8 NOBUG: Add upgrade notes 2025-10-17 06:50:42 +08:00
Andrew Nicols fbfba415e6 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2025-10-17 06:50:21 +08:00
Paul Holden 39bfcbbc9a MDL-85554 user: fix class attribute spacing for profile categories.
Update to use non-aliased html_writer class.
2025-10-16 22:29:19 +01:00
Yerai Rodríguez 7dfbf9582f MDL-86455 forms: disable all modal submit buttons on button click
To provide visual feedback and prevent multiple clicks
on no-submit buttons, all submit buttons within a modal
form will be disabled once any of them is clicked.
2025-10-16 15:59:36 +02:00
Mihail Geshoski d8577022cd Merge branch 'MDL-85874_500' of https://github.com/cwarwicker/moodle into MOODLE_500_STABLE 2025-10-16 16:53:43 +08:00
Mihail Geshoski 29a1ccdcd0 Merge branch 'MDL-85729-group-images-MOODLE_500_STABLE' of https://github.com/bwalkerl/moodle into MOODLE_500_STABLE 2025-10-16 16:14:09 +08:00
Jun Pataleta 7db7c26280 MDL-85796 core: Remove unnecessary title attribute on profile links
The title attribute with value "View profile" on profile links is
not necessary as the user's name on the link itself is sufficient
to convey the purpose of the link.
2025-10-16 15:51:01 +08:00
Dan Marsden fb9d6e718d MDL-86376 core: Make public static functions more resilient
a
2025-10-16 20:45:50 +13:00
Andrew Nicols 3b0a9293b3 Merge branch 'MDL-85348-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-16 13:48:50 +08:00
Andrew Nicols 209ea54fca Merge branch 'MDL-84745-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-16 13:44:36 +08:00
Andrew Nicols 360cb2d370 Merge branch 'MDL-85736-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-16 13:39:55 +08:00
Andrew Nicols 3b91765090 Merge branch 'MDL-86053-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-16 13:33:22 +08:00
Andrew Nicols 04b2b22112 Merge branch 'MDL-86293-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-16 13:25:01 +08:00
Andrew Nicols 4d135c1c53 Merge branch 'MDL-86648-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-16 13:15:20 +08:00
Mihail Geshoski cd8fbc5af0 Merge branch 'MDL-85988-500' of https://github.com/rjnl/moodle into MOODLE_500_STABLE 2025-10-16 10:38:12 +08:00
Jarad Barker da9daf4437 MDL-84483 core_files: Always fire after_file_created hook 2025-10-16 09:04:09 +07:00
Mihail Geshoski 7956cebf42 Merge branch 'MDL-85618-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-15 23:39:22 +08:00
hieuvu ef3cc1d8b9 MDL-86621 core_question: Add capability checking for question bank node 2025-10-15 23:18:58 +08:00
ferran b6a1859fea Merge branch 'MDL-86003-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-15 15:40:14 +02:00
ferran b820cade16 Merge branch 'MDL-85486-500' of https://github.com/roland04/moodle into MOODLE_500_STABLE 2025-10-15 15:15:21 +02:00
ferran 8dd5b60a81 Merge branch 'MDL-66579-500' of https://github.com/rjnl/moodle into MOODLE_500_STABLE 2025-10-15 15:07:18 +02:00
Andrew Nicols 06c110488b Merge branch 'MDL-86369-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-15 17:12:58 +08:00
Andrew Nicols 2538b7df54 Merge branch 'MDL-86627-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-15 17:03:38 +08:00
Andrew Nicols f92d05c33e Merge branch 'MDL-86645-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-15 17:01:48 +08:00
Sara Arjona de47113316 Merge branch 'MDL-86879-500' of https://github.com/ferranrecio/moodle into MOODLE_500_STABLE 2025-10-15 11:00:04 +02:00
Andrew Nicols e3e6b67b07 Merge branch 'MDL-86646-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-15 16:57:31 +08:00
Andrew Nicols 1d7dc95e25 Merge branch 'MDL-86147-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-15 15:53:18 +08:00
Andrew Nicols 545e742dbf Merge branch 'MDL-86186-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2025-10-15 15:49:42 +08:00
Philipp Memmel d80cf37b0e MDL-81263 grunt: Respect local .eslintignore and .stylelintignore 2025-10-15 15:19:48 +08:00
Andrew Nicols 329ed8a83f Merge branch 'MDL-86767-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-10-15 15:13:29 +08:00
Andrew Nicols 93a62aae94 Merge branch '86322-fix-example-phpdoc-500' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_500_STABLE 2025-10-15 15:10:55 +08:00
Andrew Nicols 7e22374591 Merge branch 'MDL-85495-500' of https://github.com/muhammadarnaldo/moodle into MOODLE_500_STABLE 2025-10-15 15:05:44 +08:00
Andrew Nicols f09e9afaad Merge branch 'MDL-86762-500' of https://github.com/HuongNV13/moodle into MOODLE_500_STABLE 2025-10-15 14:59:11 +08:00
Mihail Geshoski a0622c21ee Merge branch 'MDL-81514_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2025-10-15 11:05:39 +08:00
Mihail Geshoski b6c07ab1ed Merge branch 'MDL-86621-500' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_500_STABLE 2025-10-15 09:49:09 +08:00
AMOS bot ae942c292a Automatically generated installer lang files 2025-10-15 00:09:33 +00:00
Paul Holden 2a40043b1c MDL-86627 cohort: format name correctly in report entity column. 2025-10-14 15:04:58 +01:00
Mikel Martín 944d37ead3 MDL-85486 theme_boost: Fix single section page inplace editor
When course format is displayed as single section per page, the inplace editable
in the section page heading was incorrectly displaye, and the instructions panel
was not displayed.
Adding some specific styles to fix that behaviour.
2025-10-14 11:40:32 +02:00
Stephan Robotta a6d59403ec MDL-86282 navigation: Main navigation corrected for XMLDB tool 2025-10-14 10:50:14 +02:00
Sara Arjona aefaca7bd7 MDL-86011 feedback: Prevent admin answering unless enrolled as student 2025-10-14 07:09:58 +02:00
Sara Arjona 26eb19151e MDL-86011 feedback: Adjust display of Responded column in Overview 2025-10-13 17:08:11 +02:00
hieuvu d785312c06 MDL-86621 core_question: remove incorrect navigation nodes. 2025-10-13 15:05:26 +07:00
Andi Permana 4ea394146d MDL-86559 filter_activitynames: Fix auto links with double spaces 2025-10-13 11:48:28 +07:00
Julien Boulen 95d763d24f MDL-77137 filelib: Honour proxybypass option for multiple Curl queries 2025-10-12 22:16:58 +02:00
Julien Boulen 157e5af983 MDL-86320 core: Fix unit test qrcode_test 2025-10-12 21:55:21 +02:00
Julien Boulen aeb3794af4 MDL-86322 phpdoc: Fix the given example in the phpdoc 2025-10-12 21:49:15 +02:00
Julien Boulen 50d583d951 MDL-83543 core: Move download complete status handling to Excel library
When a form is validated, all validation buttons are automatically
locked to prevent them from being sent twice by mistake. When the form
returns a file instead of redirecting to a new HTML page, a mechanism
(\core_form\util::form_download_complete()) must be called to
reactivate the form's validation buttons.

This mechanism is called for CSV files (file lib/csvlib.class.php), but
not when downloading xls files. The mechanism is only called when
downloading grades in Excel format (file
grade/export/xls/grade_export_xls.php).

The patch proposes to call this mechanism globally for all Excel file
downloads (file lib/excellib.class.php), and not just for grade
downloads (file grade/export/xls/grade_export_xls.php).
2025-10-12 21:35:03 +02:00
ferran 06fef3b872 MDL-86879 core_course: optimise subsections loading 2025-10-10 14:08:25 +02:00
Jun Pataleta e040a192c0 MDL-85820 lib: Update pear/readme_moodle.txt 2025-10-10 11:01:51 +08:00
Tim Hunt af619f925b MDL-85820 formslib: don't add '-' to client-side valiation 2025-10-10 11:01:51 +08:00
Luca Bösch 8d7e88efff MDL-86767 forum: let forum use standard buttons. 2025-10-09 21:05:32 +02:00
Huong Nguyen 7abebfa820 weekly release 5.0.3+ 2025-10-09 21:59:44 +07:00
Huong Nguyen 9c9a144a7a Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2025-10-09 21:59:03 +07:00
Huong Nguyen 8bf9b64078 Merge branch 'MDL-86777-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-09 08:47:49 +07:00
Huong Nguyen 02b3d90ab1 Merge branch 'MDL-86736-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-09 08:43:52 +07:00
Huong Nguyen 7cdeda9093 Merge branch 'MDL-86654-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-10-09 08:41:33 +07:00
Huong Nguyen 6318c0bf80 Merge branch 'MDL-86575-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-09 08:20:33 +07:00
Huong Nguyen 962cabf1b2 Merge branch 'MDL-86574-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-09 08:15:21 +07:00
AMOS bot 3972f16c85 Automatically generated installer lang files 2025-10-09 00:09:12 +00:00
Rajneel Totaram 97284b10c7 MDL-85988 mod_book: Fix chapter content overlaps navigation buttons 2025-10-09 11:05:10 +12:00
Rajneel Totaram 86f293fb27 MDL-66579 mod_book: Make chapter numbering consistent 2025-10-09 10:18:59 +12:00
Mihail Geshoski 8e0c904526 Merge branch 'MDL-78495-500_exclude_badges_from_recyclebin' of https://github.com/sharpchi/moodle into MOODLE_500_STABLE 2025-10-08 23:39:26 +08:00
Paul Holden ebc79d11de MDL-82867 output: consistently space external link pixicon. 2025-10-08 16:17:56 +01:00
Mark Sharp 8533b0a132 MDL-78495 Badges: Exclude badges from recycle bin
- co-authored by: Sara Arjona

Add badges to recycle bin test
2025-10-08 11:04:48 +01:00
Mihail Geshoski e558a6bfaf Merge branch 'MDL-86382-MOODLE_500_STABLE' of https://github.com/PhMemmel/moodle into MOODLE_500_STABLE 2025-10-08 13:35:51 +08:00
Mihail Geshoski 0f2443cddb Merge branch 'MDL-86300-500' of https://github.com/sh-csg/moodle into MOODLE_500_STABLE 2025-10-08 13:27:22 +08:00
Mihail Geshoski d2269b1a8b Merge branch 'mdl-83511_500' of https://github.com/james-cnz/moodle into MOODLE_500_STABLE 2025-10-08 13:13:36 +08:00
Paul Holden 37be3e8bdd MDL-86332 completion: remove criteria only from current course on save. 2025-10-07 12:23:42 +01:00
Paul Holden 846b814f94 MDL-86069 blog: verify success state of RSS file before processing.
Avoids subsequent errors in the SimplePie library when trying to
process invalid feed content, triggering numerous PHP deprecation
notices.

See: https://github.com/simplepie/simplepie/issues/810
2025-10-07 12:19:27 +01:00
Jun Pataleta 000468f2d7 Merge branch 'MDL-86450-forum-accessibility-check-boxes-in-advanced-search-form-not-labeled-corrected-M5.0' of https://github.com/stopfstedt/moodle into MOODLE_500_STABLE 2025-10-07 14:07:39 +08:00
james-cnz e2a4283c3e MDL-85917 course: Relocate section title update code 2025-10-07 12:56:20 +13:00
Jun Pataleta ddeec0c02b MDL-86654 customfield: Show drag handles only when necessary
* Show category drag handles when there are 2 or more categories
* Show custom field drag handles when there are a total of 2 or more
fields on the page.
2025-10-06 16:01:46 +08:00
Paul Holden d1394d878b MDL-86777 customfield: show formatted category name in move dialog. 2025-10-06 08:11:12 +01:00
Muhammad Arnaldo 0e7b17b7bf MDL-85495 core_course/activitychooser: consistent starred state 2025-10-06 11:30:25 +07:00
James C 82643aadf9 MDL-83511 course: Add activities by section ID 2025-10-06 12:57:21 +13:00
Huong Nguyen 1b2d270397 Moodle release 5.0.3 2025-10-04 09:03:15 +07:00
Huong Nguyen dc1a579507 NOBUG: Add upgrade notes 2025-10-04 09:03:14 +07:00
AMOS bot ca3e9a2bbd Automatically generated installer lang files 2025-10-04 00:08:01 +00:00
Mark Johnson b6bb37d133 MDL-85975 backup: Handle nulls and arrays in restored questiondata
unset_excluded_fields() was using isset() to determine if the field
targeted for removal is present in the provided data structure. However,
isset() returns false if the field exists, but contains null. This means
the field will not be unset when it should be.

This resolves this by changing the isset() to a property_exists() check
for objects, and array_key_exists() check for arrays. It also expands
the function to properly handle arrays of arrays, or arrays of values,
which was not fully covered before and is used by some third-party
question types.
2025-10-03 15:48:13 +01:00
Paul Holden 63798cf9f3 MDL-80422 auth_oauth2: honour site/user preferred homepage post-login.
Co-authored-by: Markus Kwaśnicki <markus.kwasnicki@uni-mainz.de>
2025-10-03 14:19:22 +01:00
Shamim Rezaie 2800280c8f weekly release 5.0.2+ 2025-10-03 20:02:12 +10:00
Mihail Geshoski 19116f09d1 MDL-75087 mod_assign: Fix failing behat tests in classic 2025-10-03 14:22:12 +07:00
Paul Holden 31fb5cd4f5 MDL-86822 mod_h5pactivity: fix block page type list method parameters.
Similar was done before in 7a77493b.
2025-10-02 12:13:13 +01:00
Mihail Geshoski 9e8766590f MDL-75087 mod_assign: Fix failing unit test 2025-10-02 18:09:13 +07:00
Huong Nguyen f9b66b57df MDL-86762 repository_flickr: Fix Flickr fetching and downloading 2025-10-02 17:46:39 +07:00
Jayce Birrell 161837e393 MDL-86802 core: make CURLOPT_USERPWD optional for put()
Microsoft does not always allow an Authorization header when using PUT but the put() method sets one
by default - https://learn.microsoft.com/en-us/graph/api/driveitem-createuploadsession?view=graph-rest-1.0#remarks.
I've included an optional argument to prevent this, but the default
value will maintain the pre-existing logic to avoid other regressions.
2025-10-02 15:50:55 +09:30
Rajneel Totaram 36b84257fd MDL-75087 mod_assign: Respect assignment timer
This patch has better handling of timed assignments.
Users cannot directly access the submission page without
confirming to begin a timed assignment.
2025-10-02 11:04:08 +08:00
raortegar 26235b018f MDL-86253 mod_assign: Respect enrollment status in notifications 2025-10-02 08:15:12 +07:00
raortegar 022bfbfb56 MDL-86253 mod_quiz: Respect enrollment status in notifications 2025-10-02 08:15:12 +07:00
Mihail Geshoski 7c1276b014 Merge branch 'MDL-86791-500' of https://github.com/Jayce0808/moodle into MOODLE_500_STABLE 2025-10-02 00:24:25 +08:00
Jake Dallimore 5551ae8e6c Merge branch 'MDL-86413-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-10-01 19:54:26 +08:00
Jake Dallimore 90f29377d6 Merge branch 'MDL-86364-500' of https://github.com/mihailges/moodle into MOODLE_500_STABLE 2025-10-01 15:51:45 +08:00
Mihail Geshoski dd6c1b84fb MDL-86364 calendar: Fix calendar table styles 2025-10-01 14:39:03 +08:00
David Woloszyn 0aaacc446a MDL-86494 router: Display error details only when debugging is on 2025-10-01 06:24:16 +00:00
David Woloszyn a2c9b6cef7 MDL-86335 router: Hide detailed payload data for non-admins 2025-10-01 06:24:16 +00:00
yusufwib01 1390d0544a MDL-86353 mod_assign: Sync exception handling in PdfType and PdfReader 2025-10-01 06:24:16 +00:00
Paul Holden 8d1e4e53d3 MDL-85421 cohort: limit requests for all cohorts to system context. 2025-10-01 06:24:16 +00:00
Paul Holden a3f3636a04 MDL-86426 course: access checks in course overview fragment callback. 2025-10-01 06:24:16 +00:00
David Woloszyn f05afac26a MDL-86327 auth_webservice: Stricter check on login 2025-10-01 06:24:16 +00:00
yusufwib01 2cff8bf6a1 MDL-86261 calendar: Improve event form to show accessible groups 2025-10-01 06:24:16 +00:00
raortegar cc020510fe MDL-86334 tool_mfa: Improve multi-factor authentication validation. 2025-10-01 06:24:16 +00:00
Jake Dallimore 784b4793f0 Merge branch 'MDL-86800-500' of https://github.com/mihailges/moodle into MOODLE_500_STABLE 2025-10-01 14:21:34 +08:00
Mihail Geshoski bf51eae60e MDL-86392 theme_boost: Prevent bootstrap style reset on YUI DataTable 2025-10-01 13:57:41 +08:00
Mihail Geshoski 690d7483f5 Merge branch 'MDL-86162-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-10-01 13:42:53 +08:00
Mihail Geshoski bdfd09fd16 MDL-86800 report_outline: Fix incorrect table borders 2025-10-01 11:26:45 +08:00
Mihail Geshoski 7fab2bf446 MDL-86800 rating: Fix incorrect table borders 2025-10-01 11:26:45 +08:00
Mihail Geshoski 7ef1e09a87 MDL-86800 mod_workshop: Fix incorrect table borders 2025-10-01 11:26:45 +08:00
Mihail Geshoski 3eeb180502 MDL-86800 mod_scorm: Fix incorrect table borders 2025-10-01 11:26:45 +08:00
Mihail Geshoski 608042ed10 MDL-86800 mod_forum: Fix incorrect table borders 2025-10-01 11:26:44 +08:00
Mihail Geshoski ca572033a7 MDL-86800 mod_folder: Fix incorrect table borders 2025-10-01 11:26:44 +08:00
Mihail Geshoski f8c628459e MDL-86800 mod_data: Fix incorrect table borders 2025-10-01 11:26:44 +08:00
Mihail Geshoski 5391ca467a MDL-86800 profiling: Fix incorrect table borders 2025-10-01 11:26:44 +08:00
Mihail Geshoski 1c4a9a1944 MDL-86800 grade: Fix incorrect table borders 2025-10-01 11:26:43 +08:00
Mihail Geshoski a5159fea31 MDL-86800 block_rss_client: Fix incorrect table borders 2025-10-01 11:26:43 +08:00
Mihail Geshoski d152c7bed0 MDL-86800 block_completionstatus: Fix incorrect table borders 2025-10-01 11:26:43 +08:00
Mihail Geshoski 2aebabf132 MDL-86800 block_activity_results: Fix incorrect table borders 2025-10-01 11:26:43 +08:00
Mihail Geshoski 92670010cb MDL-86800 badges: Fix incorrect table borders 2025-10-01 11:26:43 +08:00
Mihail Geshoski e4b2899604 MDL-86800 tool_xmldb: Fix incorrect table borders 2025-10-01 11:26:42 +08:00
Mihail Geshoski 2006e87ae3 MDL-86800 tool_capability: Fix incorrect table borders 2025-10-01 11:26:42 +08:00
Mihail Geshoski 131586afe2 MDL-86800 mnet: Fix incorrect table borders 2025-10-01 11:26:42 +08:00
Jayce Birrell 7935afc657 MDL-86791 core_analytics: include filelib in processor 2025-10-01 11:40:36 +09:30
Huong Nguyen 0bcb02697a Merge branch 'MDL-85546-500' of https://github.com/raortegar/moodle into MOODLE_500_STABLE 2025-10-01 08:21:52 +07:00
Huong Nguyen c3bdb06c9e Merge branch 'MDL-86725-500' of https://github.com/stevandoMoodle/moodle into MOODLE_500_STABLE 2025-10-01 08:14:30 +07:00
Stefan Topfstedt 828708e376 MDL-86450 Forum: adds missing IDs to advanced search form elements. 2025-09-30 11:44:06 -07:00
Mihail Geshoski 48fec6e420 Merge branch 'MDL-86417_50' of https://github.com/andrewhancox/moodle into MOODLE_500_STABLE 2025-10-01 01:26:51 +08:00
raortegar b23112b7c4 MDL-85546 tool_mfa: Improve handling of require MFA conditions 2025-09-30 11:13:15 +02:00
Mihail Geshoski c421b3d856 Merge branch 'MDL-86688-500' of https://github.com/Jayce0808/moodle into MOODLE_500_STABLE 2025-09-30 11:19:26 +08:00
Stefan Hanauska 91e676ebde MDL-86300 backup: Save old id of top category
Co-authored-by: Paola Maneggia <paola.maneggia@isb.bayern.de>
2025-09-29 19:22:01 +02:00
Huong Nguyen e652e5b0aa Merge branch 'MDL-86667-500' of https://github.com/stevandoMoodle/moodle into MOODLE_500_STABLE 2025-09-29 13:36:46 +07:00
Stevani Andolo 75ddc0ea33 MDL-86725 grade_report: Fixed invisible search box on mobile view 2025-09-29 10:33:16 +08:00
Stevani Andolo 052d50f8a4 MDL-86667 registration: Unset fields after site being unregistered 2025-09-29 10:32:34 +08:00
Philipp Memmel cd54407e40 MDL-86382 qbank_bulkmove: Fix selecting placeholder in qbank selector
@Co-authored-by: Luca Bösch <luca.boesch@bfh.ch>
2025-09-26 13:54:57 +00:00
Luca Bösch 1894130564 MDL-86413 backup: Fix backup tables styles 2025-09-26 14:25:09 +02:00
cescobedo 237dfaa868 weekly release 5.0.2+ 2025-09-26 13:44:07 +02:00
cescobedo 2173e6d77f NOBUG: Add upgrade notes 2025-09-26 13:44:07 +02:00
cescobedo 7ae3e23570 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2025-09-26 13:43:53 +02:00
Sara Arjona 022e9bb53c MDL-86488 core: Fix to remove whitespaces 2025-09-26 13:19:36 +02:00
Paul Holden 19a794db63 MDL-86736 block_myoverview: remove stray template content.
Changes made in c530e4c4 left some stray elements in the templates,
which manifested themselves as displaying misplaced pipe characters
depending on unrelated site config (`$CFG->courselistshortnames`).
2025-09-26 11:41:49 +01:00
Jayce Birrell 6ed9af04eb MDL-86688 tool_brickfield: Include cmid in url to edit qbank 2025-09-26 17:48:42 +09:30
Huong Nguyen 605c6ac271 Merge branch 'MDL-86511-500' of https://github.com/andimendunia/moodle into MOODLE_500_STABLE 2025-09-26 11:15:46 +07:00
Andi Permana 423f7fec62 MDL-86511 tiny_link: TinyMCE fails to insert a link using enter key 2025-09-26 11:13:27 +07:00
Mihail Geshoski a5132bc695 Merge branch 'MDL-86177-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-26 12:02:57 +08:00
Jun Pataleta f6c443393a Merge branch 'MDL-85684-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-26 11:31:03 +08:00
Huong Nguyen 0d39faed51 Merge branch 'mdl-84491_redis_connection_500' of https://github.com/ngandrass/moodle into MOODLE_500_STABLE 2025-09-26 10:20:51 +07:00
Mihail Geshoski e76b0ccb69 Merge branch 'MDL-85803-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-26 11:18:13 +08:00
Jun Pataleta 092250723d Merge branch 'MDL-86363-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-26 11:07:55 +08:00
Mihail Geshoski 97832a039c Merge branch 'MDL-86259-M500_transfer_question_categories-task-resilience' of https://github.com/ziegenberg/moodle into MOODLE_500_STABLE 2025-09-26 10:34:21 +08:00
Jun Pataleta 8354c16995 Merge branch 'MDL-86383-500-enfix' of https://github.com/mudrd8mz/moodle into MOODLE_500_STABLE 2025-09-26 09:48:19 +08:00
Huong Nguyen 616341f6b3 Merge branch 'MDL-85419-500' of https://github.com/sharpchi/moodle into MOODLE_500_STABLE 2025-09-26 08:46:54 +07:00
Huong Nguyen 41db1fd9ae Merge branch 'MDL-80447-500-4' of https://github.com/raortegar/moodle into MOODLE_500_STABLE 2025-09-26 08:25:01 +07:00
Mark Johnson 8e004afafb MDL-81514 assign: Show non-participation groups in activity menu
This sets the flag in the activity menu for selecting the grade
summaries for each groups, to include non-participation groups as well.
2025-09-25 16:40:20 +01:00
Mark Johnson 7e0d7bf9b5 MDL-81514 assign: Enable filtering by non-participation groups
This adds non-participation groups to the group menu on the Submissions
screen, so that submissions can be filtered by these groups.
2025-09-25 16:40:20 +01:00
Mark Johnson 66328d8428 MDL-81514 groups: Add participationonly option to activity group menu
groups_print_activity_menu() and groups_get_activity_group() now include
an additional $participationonly parameter,
which is true by default. This can be set false when we want the user to
be able to select a non-participation group within
an activity, for example if a teacher wants to filter assignment
submissions by non-participation groups. It should never be
used when the menu is displayed to students, as this may allow them to
participate using non-participation groups.

groups_sort_menu_options() now has a $splitparticipation parameter,
which will split non-participation groups out into their own optgroup at
the end of the menu.
2025-09-25 16:40:20 +01:00
Paul Holden 195e0ac4c4 MDL-85803 mod_scorm: re-define language string for deleting attempts.
The previous version was re-purposed in 22cc9757 so lost meaning and
context elsewhere. Define new string for course reset elements.
2025-09-25 16:03:27 +01:00
Andrew Hancox 599c11c1b7 MDL-86417 quiz: Fix for legacy question_set_references on backup 2025-09-25 15:59:02 +01:00
Huong Nguyen a1d7a7e03b MDL-80447 repository_googledocs: Add missing fields 2025-09-25 15:34:56 +02:00
Huong Nguyen 9b0f8e110a MDL-80447 repository_googledocs: Switch to use core/pubsub 2025-09-25 15:34:56 +02:00
Tony Butler 86e8aaa9f6 MDL-58001 mod_assign: Return early if no grade items are available 2025-09-25 12:03:27 +02:00
Amaia Anabitarte 91d31e815a MDL-58001 core_grades: New is_gradable() function in gradelib
Backported from main, introduced in MDL-85837.
2025-09-25 12:03:21 +02:00
Mihail Geshoski 5ce8b33ea8 Merge branch 'MDL-86432-500' of https://github.com/timhunt/moodle into MOODLE_500_STABLE 2025-09-25 14:12:59 +08:00
Mihail Geshoski 2ced55d848 Merge branch 'MDL-86424-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-09-25 13:10:04 +08:00
Benjamin Walker 049b172e00 MDL-85729 group: Lazy load group image urls in search box 2025-09-25 14:25:10 +10:00
Jun Pataleta 13fffeebdb Merge branch 'MDL-86599_500' of https://github.com/timhunt/moodle into MOODLE_500_STABLE 2025-09-25 12:08:43 +08:00
Mihail Geshoski dceb85db15 Merge branch 'MDL-85675-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2025-09-25 11:54:22 +08:00
Mihail Geshoski 647980d1f9 Merge branch 'MDL-84085-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-25 09:58:22 +08:00
AMOS bot 2545cc4db6 Automatically generated installer lang files 2025-09-25 00:07:56 +00:00
Andrew Nicols c146d00c9f MDL-86432 qtype_ordering: Fix broken data provider 2025-09-24 17:52:06 +01:00
Andrew Nicols db8a5b2f7a MDL-86432 phpunit: Ensure that data providers do not modify state 2025-09-24 16:53:30 +01:00
Amaia Anabitarte f1cd14825e Merge branch 'MDL-86738-500' of https://github.com/sarjona/moodle into MOODLE_500_STABLE 2025-09-24 17:28:45 +02:00
Amaia Anabitarte 00cb0cdff3 Merge branch 'MDL-86488-500-2' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-09-24 17:17:55 +02:00
Sara Arjona cb44b19c2d MDL-86738 badges: Relocate upgrade notes from MDL-86174
The upgrade notes were incorrectly placed outside the .upgradenotes/ directory
in MDL-86174. This commit moves them to the correct location.
2025-09-24 13:11:10 +02:00
raortegar 18bea2a880 MDL-80447 repository_googledocs: Update Google Drive OAuth2 scope tests 2025-09-24 11:23:01 +02:00
raortegar 0ab1cc4f48 MDL-80447 repository_googledocs: Update Google Drive OAuth2 scope
Updated the Google Drive integration to use the drive.file scope instead
of the broader drive scope. This change removes support for shared drives,
which rely on full access. As a result, unit tests were updated to reflect
this behavior by bypassing shared drive checks and expectations.
2025-09-24 11:23:00 +02:00
raortegar be840bc26f MDL-80447 core_repository: Add upload button to filepicker repository 2025-09-24 11:22:09 +02:00
Mihail Geshoski 52899bd164 Merge branch 'MDL-83462-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-24 16:16:30 +08:00
Mihail Geshoski e807bf8d35 Merge branch 'MDL-86297-MOODLE_500_STABLE' of https://github.com/PhMemmel/moodle into MOODLE_500_STABLE 2025-09-24 11:49:39 +08:00
Mihail Geshoski 9d4b2a8dd7 Merge branch 'MDL-85682-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-24 10:20:59 +08:00
David Mudrák 889c86ee3f MDL-86383 lang: Use the fixed strings in tests, too 2025-09-23 20:43:32 +02:00
Helen Foster 0cbb52b295 MDL-86383 lang: Import fixed English strings (en_fix) 2025-09-23 20:41:54 +02:00
Sara Arjona 089f43cfd8 weekly release 5.0.2+ 2025-09-23 17:21:03 +02:00
Sara Arjona c9af8f6768 NOBUG: Add upgrade notes 2025-09-23 17:21:03 +02:00
Huong Nguyen b2bf044363 Merge branch 'MDL-84504-maintenance-log-MOODLE_500_STABLE' of https://github.com/bwalkerl/moodle into MOODLE_500_STABLE 2025-09-23 18:37:10 +08:00
Huong Nguyen ecb89f1e41 Merge branch 'MDL-86586-500-choice-dropdown' of https://github.com/sharpchi/moodle into MOODLE_500_STABLE 2025-09-23 08:43:27 +07:00
Sara Arjona 1c8c1d2b28 Merge branch 'MDL-86596-integration-500' of https://github.com/mihailges/moodle into MOODLE_500_STABLE 2025-09-22 10:12:47 +02:00
Paul Holden 3e5d11a046 MDL-86369 mod_scorm: fix attempt deletion behaviour on submit/redirect.
Standard after a POST submission is to redirect back to where user came
from (in this case), to avoid awkward page reload behaviour. Also fix
bug where deleting an attempt for a user, where the attempt didn't exist
would delete all attempts for that user.
2025-09-22 09:06:17 +01:00
Paul Holden d737b9ad07 MDL-86574 tool_cohortroles: format cohort data during privacy export. 2025-09-22 09:00:34 +01:00
Mihail Geshoski 53d06b4504 Merge branch 'MDL-86512-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-09-22 15:08:08 +08:00
Mihail Geshoski a245413353 MDL-86596 tool_profiling: Revert string removal without deprecation 2025-09-22 13:09:39 +08:00
Mihail Geshoski 506e9e10d0 Merge branch 'MDL-85766-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-22 10:56:54 +08:00
Huong Nguyen 949f9570a0 Merge branch 'MDL-84870-500' of https://github.com/andimendunia/moodle into MOODLE_500_STABLE 2025-09-22 08:28:36 +07:00
Huong Nguyen c856b78f05 Merge branch 'MDL-83066-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-22 08:24:18 +07:00
Brendan Heywood 86456b6f38 MDL-84504 cli: Add config logging for cli maintenance mode 2025-09-22 10:15:30 +10:00
Brendan Heywood a3209bb547 MDL-84504 core: Allow setting config and logging with one call 2025-09-22 10:15:17 +10:00
Mihail Geshoski 83ec402da6 Merge branch 'MDL-83080-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-21 22:48:10 +08:00
Mihail Geshoski 348c0c1899 Merge branch 'MDL-86596-500' of https://github.com/yerairogo/moodle into MOODLE_500_STABLE 2025-09-21 22:29:59 +08:00
Amaia Anabitarte 0eee5e17ff Merge branch 'MDL-86174-500' of https://github.com/sarjona/moodle into MOODLE_500_STABLE 2025-09-19 16:12:54 +02:00
Mark Sharp 72a2bc2962 MDL-86586 core_form: Fixed dropdown JS error if no element found 2025-09-19 14:41:15 +01:00
Sara Arjona 410e16bb89 MDL-86174 badges: Add Canvas Credentials paid plan alert 2025-09-19 15:34:30 +02:00
Luca Bösch d8b71caf11 MDL-86424 quiz: Question type icon square within add question in quiz. 2025-09-19 10:28:13 +01:00
Yerai Rodríguez d6714f3367 MDL-86596 Profiling: add breadcrumb node to profiling detail page
Boost theme removes the last item action.
This adds an extra node so the profile run details page breadcrumb is clickable in both Classic and Boost themes.
2025-09-19 10:53:26 +02:00
Huong Nguyen 11db03e2ae weekly release 5.0.2+ 2025-09-19 15:33:36 +07:00
Huong Nguyen 48b1491c02 NOBUG: Add upgrade notes 2025-09-19 15:33:36 +07:00
Huong Nguyen 67a2930cd8 MDL-80053 core_grade: Fix illegal whitespaces 2025-09-19 15:14:55 +07:00
Huong Nguyen 6ad7562f51 Merge branch 'MDL-83991_500' of https://github.com/panchalrohit/moodle into MOODLE_500_STABLE 2025-09-19 08:57:06 +07:00
Mihail Geshoski 7ab3565b4c Merge branch 'mdl-83857_500' of https://github.com/james-cnz/moodle into MOODLE_500_STABLE 2025-09-19 09:54:02 +08:00
Huong Nguyen bf69f70d29 Merge branch 'MDL-86592-500' of https://github.com/davewoloszyn/moodle into MOODLE_500_STABLE 2025-09-19 08:21:56 +07:00
Shamim Rezaie fbd05827c9 Merge branch 'MDL-86021-500' of https://github.com/laurentdavid/moodle into MOODLE_500_STABLE 2025-09-19 10:49:34 +10:00
James C f3b9b01401 MDL-83857 course: Use set_sectionid not num 2025-09-19 11:39:35 +12:00
Paul Holden e3a4f4faf2 Merge branch 'MDL-85616-500_glossary_undefined_variable' of https://github.com/davidherney/moodle into MOODLE_500_STABLE 2025-09-18 19:23:22 +01:00
Sara Arjona 3e72f5aad1 Merge branch 'MDL-86173-500' of https://github.com/aanabit/moodle into MOODLE_500_STABLE 2025-09-18 17:55:58 +02:00
Jun Pataleta 55968b2e35 MDL-86488 componentlibrary: Improved documentation for the action menu 2025-09-18 19:27:37 +08:00
Jun Pataleta 937115ff3a MDL-86488 mod_subsection: Click on the menu button itself, not the icon 2025-09-18 19:27:36 +08:00
Jun Pataleta ee2783a4c6 MDL-86488 behat: Click on the menu button itself, not the icon 2025-09-18 19:27:36 +08:00
Jun Pataleta e419d66acf MDL-86488 qbank_columnsortorder: Use action menu Behat steps 2025-09-18 19:27:36 +08:00
Jun Pataleta 11607a0a57 MDL-86488 behat: Update xpath for action menu trigger's label 2025-09-18 19:27:36 +08:00
Jun Pataleta 47493f3bba MDL-86488 mod_data: Fix Behat tests for checking action menu items 2025-09-18 19:27:36 +08:00
Jun Pataleta fd11665611 MDL-86488 mod_feedback: Move menu trigger label outside the pix icon
* The pix icons must be decorative, and the label be put within
the menu trigger itself as a visually hidden text.
* Also make the pix icons beside the action menu items as decorative.
2025-09-18 19:27:35 +08:00
ferran c568d9db64 MDL-86021 core_course: Sort modules in the course listing order
When sections contains submodules, the list of course modules should appear
in the right order (the order displayed in the course page)
2025-09-18 12:24:14 +02:00
Jun Pataleta e6c113e4a0 MDL-86488 grade: Move menu trigger label outside the pix icon
* The pix icons must be decorative, and the label be put within
the menu trigger itself as a visually hidden text.
2025-09-18 17:25:37 +08:00
Jun Pataleta 8674dac8da MDL-86488 course: Set action menu icon for category actions menu 2025-09-18 17:25:37 +08:00
Jun Pataleta cf41ddbfad MDL-86488 mod_lti: Move menu trigger label outside the pix icon 2025-09-18 17:25:36 +08:00
Jun Pataleta f1b25ca028 MDL-86512 mod_assign: Make the select column header name more accessible 2025-09-18 13:56:22 +08:00
David Herney 92f455dc9e MDL-85616 mod_glossary: The existence of the variable is controlled 2025-09-17 13:08:48 -05:00
Mihail Geshoski 2e468618c4 Merge branch 'MDL-80053-500' of https://github.com/Jayce0808/moodle into MOODLE_500_STABLE 2025-09-17 23:33:43 +08:00
Paul Holden d20833ddc0 Merge branch 'MDL-86454-500' of https://github.com/sh-csg/moodle into MOODLE_500_STABLE 2025-09-17 16:04:34 +01:00
Paul Holden 371b19bc2b MDL-86648 mod_assign: refer to selected user when calculating override.
The selected user is either that chosen for a new override, or the saved
value when editing/loading an existing override.
2025-09-17 15:37:43 +01:00
Amaia Anabitarte fc84a849d5 MDL-86173 grade: Checking the grade item is gradable 2025-09-17 16:16:56 +02:00
Paul Holden ca93788b50 Merge branch 'MDL-86431-500' of https://github.com/andrewnicols/moodle into MOODLE_500_STABLE 2025-09-17 12:39:06 +01:00
Paul Holden 39f1775180 Merge branch 'MDL-86541-500' of https://github.com/dfelipemonroy/moodle into MOODLE_500_STABLE 2025-09-17 11:52:55 +01:00
Amaia Anabitarte 9bfaabbe7b Merge branch 'MDL-86490-500-2' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-09-17 11:52:57 +02:00
Jun Pataleta e8dd16f7fd MDL-86488 output: Make the icon in action menu triggers decorative
* Set the action label properly.
* Set the kebab icon as a decorative icon.
* Move the title attribute to the menu button itself instead of the
kebab icon.
2025-09-17 15:16:34 +08:00
Andrew Nicols b2c991e3c9 MDL-86431 phpunit: Rename test teardown method 2025-09-17 13:58:16 +08:00
Conn Warwicker 39137cf98f MDL-85874 core_grade: Fix grade category toggle JS error. 2025-09-16 15:43:50 +01:00
Jun Pataleta 280d9de9c3 MDL-86512 core: Ensure bulk action selection count announcement
When the bulk actions are first rendered, the item count in the
aria-live region will not be announced by screen readers as aria-live
regions need to be present in the DOM and changed before screen readers
can announce their content.

This commit ensures that the item selection count will be announced
when the bulk actions get added to the DOM by calling
`updateBulkItemSelection()` after rendering the bulk actions HTML. This
removes the non-breaking space in the template, effectively causing a
change in DOM without affecting the visuals, and allowing screen readers
to announce the contents of the item count.
2025-09-16 22:39:00 +08:00
Jun Pataleta 09999184d4 MDL-86512 core: Assign status role for the number of selected items
Add a status role for the container containing the number of selected
items for bulk actions so that screen readers will announce this
number when an item gets selected for bulk action.
2025-09-16 22:39:00 +08:00
Jun Pataleta 678b4aa851 MDL-86490 tool: Click on the action link itself and not on its icon 2025-09-16 22:35:49 +08:00
Jun Pataleta 5bc4eb67b3 MDL-86490 output: Mark icon in action_icon as decorative 2025-09-16 22:35:49 +08:00
Huong Nguyen 93aa033801 weekly release 5.0.2+ 2025-09-16 20:58:40 +07:00
Paul Holden d9e0ff18c6 MDL-86646 gradereport_user: ensure table rowspan always populated. 2025-09-16 13:21:38 +01:00
Paul Holden 001d0f72a7 MDL-86645 grade: account for text grade types determining element icon. 2025-09-16 10:07:33 +01:00
David Woloszyn 8b1826591a MDL-86592 analytics: Modify processor checking in admin setting
Remove processor checks when calling write_setting. This prevents
configuration errors displaying when processors are not yet configured
when admin defaults are applied.
2025-09-16 15:02:42 +10:00
Jun Pataleta cdbe0ac5b2 Merge branch 'MDL-86495-500-patch' of https://github.com/HuongNV13/moodle into MOODLE_500_STABLE 2025-09-16 10:15:47 +08:00
Jayce 711c780fe4 MDL-80053 core_grade: fixed exception message appearing
- Fixing the exceptions shows an incorrectly formatted table
- The filler cell is only used to take space on the left rows but when the right rows are empty, it is not needed.
2025-09-16 11:29:24 +09:30
Mihail Geshoski 303eaaab75 Merge branch 'MDL-86558-500' of https://github.com/rjnl/moodle into MOODLE_500_STABLE 2025-09-16 09:55:46 +08:00
Huong Nguyen 93f7bc45bf MDL-86495 core: Improve PHPUnit for IPLookup 2025-09-16 08:47:28 +07:00
Amaia Anabitarte a9beb7258e Merge branch 'MDL-85541-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-15 14:56:56 +02:00
Amaia Anabitarte 1c29339b5c Merge branch 'MDL-86157-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-15 14:50:30 +02:00
Paul Holden 7804f01ad1 MDL-86157 mod_glossary: correctly format entry page title. 2025-09-15 12:00:40 +01:00
Paul Holden 1cdfee56d9 MDL-85418 user: prevent default click event/scroll in user sub-menus. 2025-09-15 10:41:23 +01:00
Paul Holden 3995498467 MDL-83080 message: handle core\url instance data as contexturl. 2025-09-15 10:40:23 +01:00
Paul Holden 1041103f2d MDL-86147 block_myoverview: consistent zero-state view styling.
Make the zero state template consistent with the populated course
template from 6415776d, specifically in regards to borders.
2025-09-15 10:39:36 +01:00
Shamim Rezaie c75a926f68 Merge branch 'MDL-86604-500' of https://github.com/mihailges/moodle into MOODLE_500_STABLE 2025-09-15 18:24:26 +10:00
Andi Permana e5b53cfe81 MDL-84870 core: Update security.txt expiry 2025-09-15 14:30:49 +07:00
Huong Nguyen 1adbdfced4 Merge branch 'MDL-79362-500' of https://github.com/abias/moodle into MOODLE_500_STABLE 2025-09-15 11:40:54 +07:00
Jun Pataleta af7ff3cacc Merge branch 'MDL-86495-500' of https://github.com/HuongNV13/moodle into MOODLE_500_STABLE 2025-09-15 10:25:34 +08:00
Tim Hunt 29d621c8fb MDL-86599 assignment: add hidden captions to the table in the assign UI
This helps screen-reader users trying to navigate quickly to the right table.
2025-09-12 15:31:03 +01:00
Paul Holden 0a92183a94 MDL-85887 tag: style search form using common Bootstrap controls. 2025-09-12 11:38:49 +01:00
Paul Holden 509c029923 MDL-84085 mod_h5pactivity: account for missing ra table join alias. 2025-09-12 11:38:18 +01:00
Shamim Rezaie 6bc92d4ba4 weekly release 5.0.2+ 2025-09-12 18:34:48 +10:00
Shamim Rezaie 4deced0a3e NOBUG: Add upgrade notes 2025-09-12 18:34:48 +10:00
Mihail Geshoski cd8b087792 MDL-86604 mod_feedback: Remove unwanted table borders 2025-09-11 23:43:25 +08:00
Mihail Geshoski f7bda3c089 MDL-86548 mod_glossary: Remove unwanted table borders 2025-09-11 23:43:24 +08:00
Mihail Geshoski e19d167738 MDL-86548 theme_boost: Option to avoid the _reboot.scss reset for tables
MDL-85659 introduced a reset of the Bootstrap _reboot.scss table styles.
This reset is applied to most tables (except those using the .table
class) and in some cases resulted in regressions such as unwanted
borders.
To address this, the .table-reboot class has been introduced as an
option to bypass the reset applied by MDL-85659 in undo.scss. Tables
affected by this regression can include this class, which is
intentionally styleless and preserves the original _reboot.scss styles
while preventing the addition of unwanted styling (borders).
2025-09-11 23:43:24 +08:00
Jun Pataleta 2c6ac63b02 Merge branch 'MDL-86294-M500_document-db-options' of https://github.com/ziegenberg/moodle into MOODLE_500_STABLE 2025-09-11 17:12:32 +08:00
Jake Dallimore 308cc2bd51 Merge branch 'MDL-86548-500' of https://github.com/mihailges/moodle into MOODLE_500_STABLE 2025-09-11 16:30:29 +08:00
Mihail Geshoski 3063e942f0 MDL-86548 mod_glossary: Remove unwanted table borders 2025-09-11 13:51:50 +08:00
Mihail Geshoski 095c638ca6 MDL-86548 theme_boost: Option to avoid the _reboot.scss reset for tables
MDL-85659 introduced a reset of the Bootstrap _reboot.scss table styles.
This reset is applied to most tables (except those using the .table
class) and in some cases resulted in regressions such as unwanted
borders.
To address this, the .table-reboot class has been introduced as an
option to bypass the reset applied by MDL-85659 in undo.scss. Tables
affected by this regression can include this class, which is
intentionally styleless and preserves the original _reboot.scss styles
while preventing the addition of unwanted styling (borders).
2025-09-11 13:51:49 +08:00
Paul Holden 5982990339 Merge branch 'MDL-86330-500' of https://github.com/yerairogo/moodle into MOODLE_500_STABLE 2025-09-10 16:26:44 +01:00
Paul Holden dd1d29ddae Merge branch 'MDL-86501-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-09-10 16:10:26 +01:00
Paul Holden ac818d5a8c Merge branch 'MDL-86447_MOODLE_500_STABLE' of https://github.com/dcmexy/moodle into MOODLE_500_STABLE 2025-09-10 15:49:56 +01:00
Mihail Geshoski e47a6356ad Merge branch 'MDL-86479-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-09-10 22:18:06 +08:00
Paul Holden aea9a49b28 Merge branch 'MDL-86489-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-09-10 15:04:06 +01:00
Diego Monroy 72940def9d MDL-86541 blocks: validate allowing block title to be '0' (zero). 2025-09-10 12:32:21 +02:00
Mihail Geshoski b3bedd324b Merge branch 'MDL-86498-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-09-10 17:44:24 +08:00
Amaia Anabitarte 9d078cd0bd Merge branch 'MDL-86531-500' of https://github.com/roland04/moodle into MOODLE_500_STABLE 2025-09-10 10:37:53 +02:00
Jun Pataleta 3ec9e79d42 MDL-86501 form: Fix unit tests
The change in the calendar button from an `<a>` tag to a native
`<button>` tag means the `\HTML_QuickForm_group::getValue()` will have
a different result and the `test_onquickformevent()` tests must be
adjusted accordingly.
2025-09-10 11:28:06 +08:00
Huong Nguyen 0d3ecd8267 Merge branch 'MDL-84076-MOODLE_500_STABLE' of https://github.com/PhMemmel/moodle into MOODLE_500_STABLE 2025-09-10 09:10:10 +07:00
Huong Nguyen c18ab7c188 Merge branch 'MDL-85270-m50' of https://github.com/micaherne/moodle into MOODLE_500_STABLE 2025-09-10 09:08:21 +07:00
Huong Nguyen 80ded1a69e Merge branch 'MDL-85266-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-10 09:05:43 +07:00
Paul Holden 31a633534c Merge branch 'MDL-86521-500' of https://github.com/abias/moodle into MOODLE_500_STABLE 2025-09-09 14:25:01 +01:00
Paul Holden 0df18c7432 Merge branch 'MDL-86499-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-09-09 14:15:33 +01:00
Paul Holden db2a0ea4aa Merge branch 'MDL-86501-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-09-09 14:01:01 +01:00
Jun Pataleta c8ac5fd27d MDL-86498 badges: Empty string for empty links 2025-09-09 18:18:29 +08:00
Jun Pataleta 6c06b5f1ef MDL-86498 badges: Add label for badge navigation url_select 2025-09-09 18:18:29 +08:00
Jun Pataleta f380f3f560 MDL-86498 badges: Accessibility coverage for badge details and overview 2025-09-09 18:18:29 +08:00
Jake Dallimore 5b1731077e weekly release 5.0.2+ 2025-09-09 15:06:18 +08:00
Jake Dallimore 77e643b914 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2025-09-09 15:06:12 +08:00
Huong Nguyen b71a12b73e Merge branch 'MDL-83003-M500_INFO-command-not-compatible-with-envoy-proxy-redis' of https://github.com/ziegenberg/moodle into MOODLE_500_STABLE 2025-09-09 09:28:51 +07:00
Huong Nguyen 3b4b80ba1e MDL-86495 core: Better errors handling for IP Lookup
- Since `Geoplugin` is not free anymore, a new admin setting called `GeoPlugin API key` has been added for user to input
  their API key if they still want to use `Geoplugin` service.
- The `iplookup_find_location()` method has been improved to handle error responses more effectively.
2025-09-09 08:44:53 +07:00
Rajneel Totaram 416992c5b2 MDL-86558 mod_quiz: Fix styles for sticky columns 2025-09-09 10:07:56 +12:00
Michael Aherne bfcc1cf4ec MDL-85270 output: Export url_select for template. 2025-09-08 10:24:13 +01:00
Mark Sharp e0f02aab9e MDL-85419 core_courseformat: Move event trigger to after cm cache purge 2025-09-08 10:01:03 +01:00
Huong Nguyen 3d67d7b889 Merge branch 'MDL-85335-500' of https://github.com/gbarat87/moodle into MOODLE_500_STABLE 2025-09-08 08:30:22 +07:00
Mihail Geshoski bcd723868f Merge branch 'MDL-86374-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-08 09:23:21 +08:00
Mihail Geshoski 128bcf4b9e Merge branch 'MDL-86317-500' of https://github.com/rjnl/moodle into MOODLE_500_STABLE 2025-09-08 09:17:12 +08:00
Paul Holden 028ed9c60e MDL-86575 cohort: format cohort names in external service return data. 2025-09-07 19:31:31 +02:00
Paul Holden bd0a861e5d MDL-86003 datafield_textarea: define missing media/subtitle options.
In order to insert multimedia using the editor, we need a "subtitle"
filepicker option.
2025-09-07 10:53:03 +02:00
AMOS bot e18a4d5d6f Automatically generated installer lang files 2025-09-06 00:08:01 +00:00
Huong Nguyen a2f7f13d7c weekly release 5.0.2+ 2025-09-05 23:53:53 +07:00
Huong Nguyen af08c2b925 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2025-09-05 23:53:42 +07:00
Philipp Memmel cbb7382c86 MDL-84076 core_templates: Avoid manipulation of template context object 2025-09-05 09:59:06 +02:00
Yerai Rodríguez f15afac206 MDL-86330 enrol: remove time rounding to avoid missing active enrolments
Rounding time could lead to newest enrolments being excluded, resulting in
these courses not appearing under the "My courses" tab in the Dashboard until the rounded time aligned with the actual time.

enrol_get_all_users_courses() now uses the PSR-20 clock to provide stable
and testable time values.
2025-09-05 08:21:32 +02:00
Huong Nguyen 3b8769886e Merge branch 'MDL-83628-m500' of https://github.com/sammarshallou/moodle into MOODLE_500_STABLE 2025-09-05 09:21:55 +07:00
Simey Lameze 03df64668d MDL-85675 behat: add timefinish to quiz attempt generator
Adds support for the timefinish attribute to the quiz attempt
generator allowing Behat scenarios to specify the exact completion
time of an attempt.

This is necessary to simulate a scenario where the student finished
the attempt few minutes ago for example.

This commit also adds two scenarios that automates MDLQA-307.
2025-09-05 10:09:28 +08:00
Mihail Geshoski 92d88969a0 Merge branch 'MDL-85869-M500' of https://github.com/ziegenberg/moodle into MOODLE_500_STABLE 2025-09-04 23:55:07 +08:00
Mihail Geshoski ed40f8f422 Merge branch 'MDL-74046-500' of https://github.com/muhammadarnaldo/moodle into MOODLE_500_STABLE 2025-09-04 23:47:03 +08:00
ferran e50d272c5f Merge branch 'MDL-85416_500' of https://github.com/timhunt/moodle into MOODLE_500_STABLE 2025-09-04 16:31:25 +02:00
ferran 868659f644 Merge branch 'MDL-72956-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-04 16:10:19 +02:00
Huong Nguyen 101136c8b4 Merge branch 'MDL-86230-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-04 15:44:21 +07:00
Huong Nguyen e9ffc9458e Merge branch 'MDL-72511-500' of https://github.com/junpataleta/moodle into MOODLE_500_STABLE 2025-09-04 15:42:09 +07:00
ferran ccb0099b13 Merge branch 'MDL-85641-500' of https://github.com/rjnl/moodle into MOODLE_500_STABLE 2025-09-04 10:11:15 +02:00
ferran 33a0aa6625 Merge branch 'MDL-86248-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-04 10:03:55 +02:00
Muhammad Arnaldo 77c9a9d83d MDL-74046 tool_lp: new-tab for competency frameworks repo link 2025-09-04 14:28:15 +07:00
Rajneel Totaram cfffecddb5 MDL-86317 core: Replace deprecated bootstrap class 2025-09-04 10:19:55 +12:00
Rajneel Totaram a0562f11d8 MDL-85641 mod_feedback: Use full width for reponses page 2025-09-04 09:58:31 +12:00
Leon Stringer 59bbfa4cc0 MDL-86434 core: Page title for invalid user ID 2025-09-03 16:14:01 +02:00
Alexander Bias 5d60bb2c4b MDL-86521 block_myoverview: Fix overflow of filter bar 2025-09-03 15:03:40 +02:00
Daniel Ziegenberg 0d89eada8b MDL-85869 qbank: Fix duplicate category stamps and idnumbers
Migrating from Moodle 4.5 to Moodle 5.0 the adhoc task
\mod_qbank\task\transfer_question_categories should transfer question
categories into new question bank instances.

The code for rescuing 'lost' categories where the linked contextid
no longer exists was failing. It moved all these categories to the
system context, which could lead to unique key violations.

To fix this, we check for duplicates, and if neccessary change the
stamp, or remove the idnumber. Since these questions were formerly
'lost', this is OK.

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
Co-authored-by: Tim Hunt <T.J.Hunt@open.ac.uk>
2025-09-03 13:26:59 +02:00
Mikel Martín 52629d951c MDL-86531 course: Fix overview table overflow 2025-09-03 13:14:36 +02:00
Andrew Nicols f3c89b4ab3 MDL-86534 mod_forum: Only run bulk action JS if they are enabled 2025-09-03 12:46:08 +02:00
Paul Holden b8f7791612 Merge branch 'MDL-85619-500' of https://github.com/mihailges/moodle into MOODLE_500_STABLE 2025-09-03 12:38:31 +02:00
toanlamt e9e5c098e3 MDL-84982 tiny_media: Fix excessive data passed to the usedfiles JS file 2025-09-03 12:30:37 +02:00
Paul Holden df4f173fd9 Merge branch 'MDL-86187-MOODLE_500_STABLE' of https://github.com/phmemmel/moodle into MOODLE_500_STABLE 2025-09-03 12:16:17 +02:00
Daniel Ziegenberg 42f1ac842e MDL-86259 qbank: Make transfer_question_categories more resilient
Migrating from Moodle 4.5 to Moodle 5.0 queues an adhoc task
`\mod_qbank\task\transfer_question_categories` which is supposed to
spawn a lot of adhoc tasks `\mod_qbank\task\transfer_questions`.

However, the task `\mod_qbank\task\transfer_question_categories` is
built in a way that the adhoc tasks to spawn are stored in memory in an
array. So if the task at some point crashes which is not as unlikely as
one would think (temporary database connection loss, leftover rubbish in
question table, all kinds of possible errors, see MDL-86226 or
MDL-85869) all these `\mod_qbank\task\transfer_questions` tasks WILL NOT
BE SPAWNED ANYMORE leaving the whole platform in a mess from which you
will not be able to recover from: Question categories have been migrated
to new contexts, but the questions have not, because the adhoc tasks
never have been created.

We fix this by moving the creation of the adhoc tasks
`\mod_qbank\task\transfer_questions` inside the delegated database
transaction where the question categories are being moved. So after a
category is moved but before it get's deleted, we create the
corresponding `\mod_qbank\task\transfer_questions` task and queue it for
execution.

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-09-03 10:02:42 +02:00
Mihail Geshoski 9fb8d2664c Merge branch 'MDL-82244-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-03 12:21:41 +08:00
Mihail Geshoski 854e8c7841 Merge branch 'MDL-73671-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-03 12:15:47 +08:00
Mihail Geshoski 351df6c160 Merge branch 'MDL-83474-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-03 12:08:07 +08:00
AMOS bot 478aae8790 Automatically generated installer lang files 2025-09-03 00:07:56 +00:00
ferran c89543f2cb Merge branch 'MDL-71786-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-09-02 17:03:42 +02:00
Tim Hunt f6c4de3c4c MDL-85416 assignment: fix date format in messages
For no very obvious reason, the date in the 'You have just
submitted your assignemnt' message was formatted differently
from the default display used on-screen.

This commit makes it consistent.
2025-09-02 15:33:43 +02:00
Michael Hawkins 4e5151db5f weekly release 5.0.2+ 2025-09-02 20:32:05 +08:00
Michael Hawkins 985563f5d8 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2025-09-02 20:31:38 +08:00
Mihail Geshoski 9c18bba7f5 Merge branch 'mdl-84975_500' of https://github.com/james-cnz/moodle into MOODLE_500_STABLE 2025-09-02 09:44:26 +08:00
Mihail Geshoski e74db295a9 Merge branch 'MDL-85551_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2025-09-02 09:23:05 +08:00
Mihail Geshoski cd1ae95751 Merge branch 'MDL-86339-500' of https://github.com/rjnl/moodle into MOODLE_500_STABLE 2025-09-02 09:16:36 +08:00
Mihail Geshoski e3743c2b68 Merge branch 'MDL-86366-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-09-01 23:21:14 +08:00
Mihail Geshoski 8f07f08c91 Merge branch 'MDL-86362-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-09-01 23:11:22 +08:00
Paul Holden 3e56c24239 MDL-71786 mod_assign: shift activity grade reminder dates during reset.
Co-authored-by: aneno-m-e <43393997+aneno-m-e@users.noreply.github.com>
2025-09-01 17:07:03 +02:00
Paul Holden 80dd589366 MDL-73671 mod_forum: shift activity due/cutoff dates during reset. 2025-09-01 16:55:09 +02:00
Mihail Geshoski b25b9a5505 Merge branch 'MDL-85018_500_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_500_STABLE 2025-09-01 22:29:02 +08:00
Mihail Geshoski d83b4469f7 Merge branch 'MDL-73417-500' of https://github.com/rjnl/moodle into MOODLE_500_STABLE 2025-09-01 22:18:50 +08:00
Jun Pataleta b17e1036ff MDL-86501 form: Fix date selector calendar button mark up
* Make the calendar icon decorative.
* Mark up the calendar button accordingly:
  - Render it as a `<button type="button">`
  - Add label using `aria-label`.
  - Use a more suitable label of "Date picker" rather than "Calendar"
  - Add a `title` attribute to show a tooltip for sighted users.
  - Disable/enable it accordingly by setting/removing the `disabled`
    attribute.
2025-09-01 16:08:13 +08:00
Philipp Memmel 6b9b6ea399 MDL-86297 core_question: Fix limit when retrieving qbank instances 2025-09-01 08:43:46 +02:00
AMOS bot c5652816a2 Automatically generated installer lang files 2025-09-01 00:07:52 +00:00
Luca Bösch 57f15efcdb MDL-86366 quiz: Description shouldn't show each secure page, but title. 2025-08-31 17:29:42 +02:00
Luca Bösch 140ec8196d MDL-86362 questions: Fix question bank table styles 2025-08-30 14:59:58 +02:00
Paul Holden 3597ec7916 MDL-86177 task: ensure tasks are runnable in indicator output.
Also fix case where task indicator progress data no longer exists,
which lead to exceptions when encountered, breaking the gradebook.
2025-08-29 15:51:25 +01:00
Paul Holden 31518baf30 MDL-85266 tool_uploaduser: correctly key bulk users session array. 2025-08-29 15:50:08 +01:00
Jun Pataleta 208e2b68fa MDL-86479 course: Add accessibility coverage for course index options 2025-08-29 21:10:49 +08:00
cescobedo 3ca7c6bf32 weekly release 5.0.2+ 2025-08-29 15:00:54 +02:00
cescobedo a23ae5fd00 NOBUG: Add upgrade notes 2025-08-29 15:00:54 +02:00
Jun Pataleta fc7f5e6155 MDL-86489 mod_feedback: Add accessibility coverage for Questions tab
* Also fix the heading level issue found by the test.
2025-08-29 20:49:53 +08:00
Jun Pataleta 6529caf402 MDL-86499 core: Make table sort icons decorative 2025-08-29 12:24:36 +08:00
Huong Nguyen ba7aef3b44 Merge branch 'MDL-86343-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-08-29 11:03:57 +07:00
Huong Nguyen 453da3a159 Merge branch 'MDL-85743-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-08-29 11:00:43 +07:00
Mihail Geshoski 1cd2424b6d Merge branch 'MDL-83256-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-08-29 11:32:45 +08:00
Huong Nguyen 6754b63a6d Merge branch 'MDL-86452-500' of https://github.com/andrewnicols/moodle into MOODLE_500_STABLE 2025-08-29 08:46:14 +07:00
Huong Nguyen 314b56d36b Merge branch 'MDL-86301-500' of https://github.com/andrewnicols/moodle into MOODLE_500_STABLE 2025-08-29 08:41:22 +07:00
Paul Holden 03e50cb759 MDL-82244 course: use site default course visibility in external call. 2025-08-28 17:40:03 +01:00
Paul Holden 558fccee57 MDL-86248 theme_boost: consistently apply dropdown item spacing.
Replace previous ad-hoc fixes for active item spacing in dropdown
menu items.

Changes to Javascript are due to the following bug in our SCSS
compiler, preventing a simpler `&:has([...])` selector:

https://github.com/scssphp/scssphp/issues/606

Co-authored-by: Mikel Martín <mikel@moodle.com>
2025-08-28 16:56:44 +01:00
Amaia Anabitarte 63d5ead68c Merge branch 'MDL-86280-500' of https://github.com/lucaboesch/moodle into MOODLE_500_STABLE 2025-08-28 11:16:46 +02:00
Jun Pataleta 9af958b434 MDL-86489 mod_feedback: Mark required icon as decorative
* Set `alt` param as empty, but add `title` attribute for the sake of
sighted users.
* Add a visually hidden string that indicates the element is required.
2025-08-28 16:53:10 +08:00
Jun Pataleta 20148b07a5 MDL-86479 theme_boost: Fix a11y issues on the course index options
* Add aria-label for the options menu button.
* Add proper menu and menuitem roles for the options menu.
2025-08-28 13:44:36 +08:00
Andrew Nicols 303b8a4bc1 MDL-86452 core: Reset navigation data between tests 2025-08-28 13:13:05 +08:00
Stefan Hanauska 2c021bd81e MDL-86454 badges: Hide revoke button if not available 2025-08-27 10:09:13 +02:00
Rajneel Totaram 46892613b0 MDL-86339 qtype_numeric: Coding style improvements 2025-08-27 16:24:39 +12:00
Rajneel Totaram facdd9c203 MDL-86339 qtype_numeric: Display units dropdown on the same line 2025-08-27 16:24:39 +12:00
Dean Chimezie 81d2d088ef MDL-86447 tool_mfa: Restore setup lang string 2025-08-26 13:38:25 -04:00
Luca Bösch 14bf865905 MDL-86280 mod: Do not filter help text in activity chooser.
Co-authored-by: Ferran Recio <ferran@moodle.com>
2025-08-26 18:19:36 +02:00
cescobedo 5764f8ee38 weekly release 5.0.2+ 2025-08-26 15:53:51 +02:00
cescobedo c93b644c94 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2025-08-26 15:53:39 +02:00
Mihail Geshoski 576d0230a0 Merge branch 'MDL-85677-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2025-08-26 11:57:27 +08:00
Mihail Geshoski c8fd816a90 Merge branch 'MDL-85229-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-08-26 11:49:20 +08:00
Huong Nguyen 223b4065d5 Merge branch 'MDL-86315-500' of https://github.com/davewoloszyn/moodle into MOODLE_500_STABLE 2025-08-26 09:23:25 +07:00
Simey Lameze d9bd1a8c0a MDL-85677 behat: test to verify SEB download link visibility 2025-08-26 09:13:27 +08:00
Mihail Geshoski 6b775cf705 Merge branch 'MDL-85676-500' of https://github.com/lameze/moodle into MOODLE_500_STABLE 2025-08-26 00:43:58 +08:00
Andrew Nicols 55d7b7b935 MDL-86301 core: Create autoloadable externallib_testcase 2025-08-25 15:14:03 +08:00
Simey Lameze 71d66a1c5f MDL-85676 behat: validate SEB attempt message 2025-08-25 14:03:45 +08:00
AMOS bot 3f9923d756 Automatically generated installer lang files 2025-08-24 00:10:01 +00:00
Mihail Geshoski 3674a5854a weekly release 5.0.2+ 2025-08-22 20:40:04 +08:00
Mihail Geshoski 812e4d86c5 NOBUG: Add upgrade notes 2025-08-22 20:40:04 +08:00
Huong Nguyen 7b2049a602 MDL-73845 enrol_database: Fix MySQL issue 2025-08-22 13:00:30 +08:00
Huong Nguyen ecaf13fd45 Merge branch 'MDL-86231-500' of https://github.com/andrewnicols/moodle into MOODLE_500_STABLE 2025-08-22 08:46:49 +07:00
Paul Holden 36e4118e2d MDL-85592 output: export missing node sort attribute for template. 2025-08-21 13:06:24 +01:00
Paul Holden 1c4e61ec4a MDL-85618 filter_displayh5p: change regular expression delimeter.
Ensure we don't confuse the expression parser when supplied "Allowed
source" contains coincidental control characters in the URL, e.g. '/'
and '#'.

Note that `preg_quote(...)` isn't appropriate here, because the given
URL may indeed contain genuine control characters already.
2025-08-21 13:00:49 +01:00
Jun Pataleta c16b55dce9 MDL-81455 behat: Add accessibility coverage to default start page tests 2025-08-21 17:51:03 +08:00
Jun Pataleta 2d2fa81a6c Merge branch 'MDL-81455-500' of https://github.com/rajutm25/moodle into MOODLE_500_STABLE 2025-08-21 17:48:12 +08:00
Jun Pataleta aa7cc0f7a2 Merge branch 'MDL-86202-500' of https://github.com/rjnl/moodle into MOODLE_500_STABLE 2025-08-21 15:20:54 +08:00
Rajneel Totaram 0fb340f187 MDL-86202 mod_lesson: Use correct heading level 2025-08-21 18:39:19 +12:00
Mihail Geshoski a9c6cab95e Merge branch 'MDL-84850-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-08-21 11:46:20 +08:00
Huong Nguyen c77e19c8ac Merge branch 'MDL-86311-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-08-21 09:30:10 +07:00
Huong Nguyen b231e98b91 Merge branch 'MDL-80611-500' of https://github.com/marinaglancy/moodle into MOODLE_500_STABLE 2025-08-21 08:54:51 +07:00
Mihail Geshoski f905120964 Merge branch 'MDL-84739-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-08-20 17:23:51 +08:00
Paul Holden 7f18673266 MDL-85684 mod_assign: format course/assignment notification content. 2025-08-20 09:14:49 +01:00
Paul Holden 95a76b29a8 MDL-85348 cohort: disable report bulk deletion for managed cohorts. 2025-08-20 09:09:27 +01:00
Paul Holden 55b8c665e9 MDL-83474 webservice: fix empty/zero $itemid handling in text format. 2025-08-20 09:08:25 +01:00
Mihail Geshoski ad15f0f2b8 Merge branch 'MDL-86015-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-08-20 09:54:36 +08:00
Huong Nguyen a93baa4d34 Merge branch 'MDL-73845-500' of https://github.com/HuongNV13/moodle into MOODLE_500_STABLE 2025-08-20 08:41:36 +07:00
Paul Holden 85a64a433b MDL-86374 report_outline: use formatted activity name in report. 2025-08-20 00:37:00 +01:00
Paul Holden 984e1b8954 MDL-85743 user: correct debugging for missing user picture fields. 2025-08-19 17:12:33 +01:00
Paul Holden 8cd752c0df MDL-85736 core: don't double escape page URL in meta refresh tag.
Co-authored-by: Clay Cross <claycross@gmail.com>
2025-08-19 17:11:52 +01:00
Paul Holden 8284ea1914 MDL-84850 tag: ensure course tags enabled before adding to navigation. 2025-08-19 17:10:54 +01:00
Shamim Rezaie bb70c36bee weekly release 5.0.2+ 2025-08-20 00:45:36 +10:00
Shamim Rezaie b25db071d8 Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2025-08-20 00:45:25 +10:00
rajutm25 60c5f790ed MDL-81455 core: Fix welcome message heading in dashboard
The welcome message on login was incorrectly replacing the dashboard
page header.The change ensures the welcome message appears as a
paragraph while maintaining the dashboard page heading.
2025-08-19 19:47:25 +05:30
Paul Holden 02f8a46063 MDL-86363 completion: ensure module viewed completion data is cleaned.
The privacy provider should ensure it removes said data consistently.
2025-08-19 11:17:28 +01:00
Mi Jia Looi 05bfc0432d MDL-73845 enrol_database: Add lock to prevent race condition 2025-08-19 15:33:03 +07:00
Paul Holden e908a04251 MDL-86311 core: ensure component is normalised prior to comparison. 2025-08-19 09:17:07 +01:00
Paul Holden 0182b73e82 MDL-86311 question: fixes for PHPUnit related warnings/notices.
* Correct component generator name;
* Add missing required object properties;
* Assert expected debugging messages
2025-08-19 09:16:53 +01:00
Paul Holden 531eb2f489 MDL-86311 phpunit: update default configuration to fail on warnings.
This restores pre-PHPUnit 10 behaviour, and ensures that warnings
emitted by PHP during test execution will cause the test to fail.
2025-08-19 09:16:36 +01:00
Jun Pataleta 9d6eb92b0a MDL-72511 calendar: Better calendar navigation labelling
* Make the accessible labels of the previous and next month links more
informative by indicating the name of the previous/next months.
* Make titles on the previous and next month links reflect the actual
month and show titles only when the calendar is rendered within a block.
This is because the title attribute is only used for the sake for
sighted users who may need to know the meaning of the previous/next
month links, especially when the calendar is displayed in compact form
where the previous/next month name is not shown.
2025-08-19 11:25:55 +08:00
Jun Pataleta ba51ff55bb MDL-72511 calendar: Fix month_mini navigation
* Hide arrow icons from assistive technologies.
* Add a more sensible aria-label for the previous/next
month links.
2025-08-19 11:25:55 +08:00
Huong Nguyen 729ddade19 Merge branch 'MDL-86109-500' of https://github.com/stevandoMoodle/moodle into MOODLE_500_STABLE 2025-08-19 09:53:38 +07:00
Mihail Geshoski f369e3ca75 Merge branch 'MDL-83772-500' of https://github.com/srobotta/moodle into MOODLE_500_STABLE 2025-08-19 10:27:49 +08:00
Paul Holden 7d11f4350d MDL-86343 reportbuilder: fix course groupmode column type value.
Per a3c386af, this column does not produce numeric output. Also cleanup
redundancy in the default branch of corresponding switch statement.
2025-08-18 17:05:34 +01:00
Paul Holden ad8919f266 MDL-84739 gradingform_rubric: consistently style rubric table icons. 2025-08-18 08:57:54 +01:00
Paul Holden 04e12674fa MDL-83256 user: account for course context instances of teacher fields. 2025-08-18 08:57:01 +01:00
Paul Holden 1921c75407 MDL-85229 mod_url: observe description appearance setting on display.
Correctly determine whether said description is in fact "empty".
2025-08-18 08:55:45 +01:00
Paul Holden 7a3eb1805b MDL-84745 cohort: capability check prior to bulk deletion button. 2025-08-18 08:51:05 +01:00
Paul Holden 30060fec33 MDL-83066 blocks: restore deletion warning for "sticky" blocks.
It was lost when switching to modal delete configuration in 529c5c2e.
2025-08-18 08:49:30 +01:00
Daniel Ziegenberg 3319f52182 MDL-86294 core: Document missing dboptions in config-dist.php
For the full list of database config settings, the config-dist.php file
referred to https://docs.moodle.org/en/Database_settings, which in turn
pointed back to
https://github.com/moodle/moodle/blob/master/config-dist.php. We should
not play hide and seek with our configuration options, so let's document
them.

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-08-17 17:05:35 +02:00
AMOS bot 9b1aacec11 Automatically generated installer lang files 2025-08-16 00:07:57 +00:00
Paul Holden 2ec1d258ce MDL-86293 communication: queue/execute membership task if appropriate.
Avoid doing so if the current instance does not support user features.
2025-08-15 14:04:49 +01:00
Philipp Memmel 8960fc331f MDL-86187 core_ddl: Add reserved keywords for MySQL 8.4 2025-08-15 11:17:43 +00:00
Paul Holden 368af2780a MDL-86015 mod_assign: preserve advanced grading modal dropdown state.
Don't autoclose it when clicking inside the dropdown element. Fixes
change of behaviour during the Bootstrap 5 upgrade.
2025-08-15 11:07:39 +01:00
Paul Holden 3ad4e6bb69 MDL-86015 output: support autoclose behaviour in dropdown dialog. 2025-08-15 11:07:39 +01:00
Paul Holden ad9bb66f9e MDL-85682 mod_assign: account for absence of workflow select filter. 2025-08-15 10:48:15 +01:00
David Woloszyn 7f38d50aee MDL-86315 registration: Unset emails in hub when dependant value not set 2025-08-15 12:29:26 +10:00
Huong Nguyen 60e348ff05 weekly release 5.0.2+ 2025-08-15 09:26:41 +07:00
Huong Nguyen 66d863f09a Merge branch 'install_500_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_500_STABLE 2025-08-15 09:26:28 +07:00
Stevani Andolo 7431612b20 MDL-86109 tiny_media: Fix selected subtitles and captions language
Ensures the selected subtitle or caption language is correctly retained
and dispalyed.
2025-08-15 09:49:52 +08:00
Paul Holden 406bc9a9dd MDL-72956 mod_feedback: remove session access for started activities. 2025-08-14 11:27:35 +01:00
Rajneel Totaram 46565b8a67 MDL-73417 mod_assign: Remove duplicate array key 2025-08-14 14:34:33 +12:00
AMOS bot bbbc68d16b Automatically generated installer lang files 2025-08-14 00:08:04 +00:00
Paul Holden e65ccd7ea3 MDL-86053 mod_assign: account for lack of global scales in settings. 2025-08-13 10:15:08 +01:00
AMOS bot 9b5b77cf2d Automatically generated installer lang files 2025-08-13 00:08:05 +00:00
Mark Johnson ed6e1c2db9 MDL-85551 questions: Creating a default category with a questions mod
When a new module that publishes questions is created, it does not have
a default question category created until it is viewed. This means that
other parts of the system that want to use the bank while its empty
(such as bulk moving questions) cannot see it.

This adds a step to the common edit_module_post_actions() function so
that any module supporting the FEATURE_PUBLISHES_QUESTIONS feature will
have its default category created with the module instance.

This can be overridden by setting skipdefaultcategory to true
in the $moduleinfo argument to edit_post_module_actions().
2025-08-12 14:04:04 +01:00
Paul Holden c93da59bb5 MDL-85312 profilefield_menu: remove locked field option formatting.
We shouldn't be formatting the option key when setting constant
value, because that isn't formatted - only the option value is.
2025-08-12 08:34:33 +01:00
Mihail Geshoski aa6358a8f6 Merge branch 'MDL-85652-500' of https://github.com/paulholden/moodle into MOODLE_500_STABLE 2025-08-12 13:55:21 +08:00
guillaumebarat baac1c57b9 MDL-85335 cli: Allow uninstall of sub-plugin when parent missing 2025-08-12 15:04:32 +10:00
James C ed3000a3dc MDL-84975 course: Handle tags in section and activity move dialogues 2025-08-12 13:23:29 +12:00
Mark Johnson 5c3eb2c535 MDL-85018 questionlib: Update broken question test
A multianswer question with a missing database record no longer throws
an exception, so doesn't work for the "broken question" test, so switch
to ddwtos.
2025-08-11 10:09:11 +01:00
Mark Johnson f94db1c8e8 MDL-85018 qtype_multianswer: Prevent errors on backup/restore
If a multianswer question has its question_multianswer record missing
for some reason, attempting to backup and restore a bank containing the
question will result a dml_missing_record exception.

The qtype_multianswer::get_question_options() method already copes with
the sequence from this record being empty, so we can just remove the
MUST_EXIST check and let it fall back to that.
2025-08-11 10:09:11 +01:00
Paul Holden 0c8a596ba3 MDL-85541 gradereport_history: show user country value correctly. 2025-08-11 09:17:38 +01:00
Stephan Robotta 063beea7d2 MDL-83772 mod_data: Fixed autosave bug in text areas with same name 2025-08-11 08:52:11 +02:00
Jose Pico e419f36236 MDL-86225 plagiarism: Update data type from object to array 2025-08-11 16:06:26 +10:00
Mark Johnson 223da4833a MDL-86010 tool_lp: Test fetching evidence works after cm deletion 2025-08-08 16:03:11 +01:00
Michael Kotlyar 57b29b7a55 MDL-86010 competency: Delete competency evidence on cm delete
Evidence recorded against course module competencies was not deleted
with the course module. This led to errors when attempting to view the
competency record on a learning plan.

This change will delete associated evidence records with the cm, and
will clean up any existing orphaned records on upgrade.

Co-Authored-By: Mark Johnson <mark.johnson@catalyst-eu.net>
2025-08-08 16:03:11 +01:00
Andrew Nicols 134156a18a MDL-86231 behat: Support array callable syntax in execute method 2025-08-08 11:42:30 +08:00
dustinhuynh 29d322526f MDL-86058 core_task: enable disable tasks with a pending upgrade 2025-08-06 15:47:41 +10:00
Paul Holden 4c68ce0888 MDL-86230 admin: fix site registration link to Moodle app.
Broken by 5d316201.
2025-08-06 00:35:53 +01:00
Simey Lameze cd2c6b7def MDL-86186 behat: enlarge window size before asserting 2025-08-04 11:27:21 +08:00
Paul Holden 61cd9a2449 MDL-83462 mod_page: observe page description display in popup. 2025-08-01 17:04:17 +01:00
Paul Holden 981870f7b1 MDL-86162 h5p: fix content type/library page table layout. 2025-07-30 15:40:43 +01:00
Paul Holden 59e21e6b3d MDL-85766 block_glossary_random: reset keys of retrieved entries. 2025-07-30 13:05:04 +01:00
Rohit Panchal c823bcc990 MDL-83991 tag: Optimized tag sql query 2025-07-23 01:04:42 +05:30
Mi Jia Looi f3fd9b1836 MDL-86017 mod_folder: Cast customdata to object in folder_cm_info_view() 2025-07-22 13:42:45 +10:00
djarrancotleanu e00381381a MDL-85366 core: Add proper PHPMailer handling of .ics files 2025-07-08 17:07:07 +10:00
Paul Holden 7074b2d85f MDL-85652 block_site_main_menu: correct page course comparison.
We can only use the "Add activity" control when on site page.
2025-07-07 17:04:21 +01:00
Tim Schroeder f95266a84c MDL-81604 Files: Fix broken file serving w/ Apache + PHP-FPM + PHP >=8.1 2025-07-04 20:03:26 +02:00
Daniel Ziegenberg c4ee9493d8 MDL-83003 core: Add error check for envoy proxy
Checking the redis server version is also simplified; once ought to be
enough :)

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-06-30 09:32:21 +02:00
Marina Glancy 1ca95eeeb3 MDL-80611 general: do not translate url in help links 2025-06-16 18:09:16 +01:00
Niels Gandraß 5fbde2c00c MDL-84491 core_session: Fix redis connection in CLI / scheduled task 2025-06-05 10:26:36 +02:00
Mihail Geshoski 8f8671022b MDL-85619 mod_assign: Preserve default modal behaviour on save
Removes the preventDefault() call that previously prevented the
save/cancel modal from automatically closing when the 'Save' action
is applied for a specific bulk action on the assignment submissions
page.
2025-06-04 17:34:47 +08:00
Philipp Memmel 2304462b47 MDL-85168 lib: Move courseid filter to participants_filter.js 2025-05-09 07:21:02 +02:00
Alexander Bias 896cff35f8 MDL-79362 auth_ldap: Close transaction when user fails to create 2025-04-28 10:55:39 +02:00
sam marshall ed19a42ddc MDL-83628 message: message_provider_uninstall slow
This function was slow because using case-insensitive LIKE on the large
user_preferences table means that Postgres does not use its index and
has to sequential-scan the table.
2025-04-24 13:05:40 +01:00
1332 changed files with 25889 additions and 6101 deletions
+1 -1
View File
@@ -51,7 +51,7 @@ jobs:
chunk=$(((($count % $chunks)) + 1))
echo "$testname $testfile" >> ./chunk_$chunk.txt
done < <(grep "function test_" "${testfile}" | sed -r "s/^.*function (test_[a-zA-Z0-9_]+).*/\1/")
done < <(find . -name "*_test.php")
done < <(find . -name "*_test.php" -not -path "*/fixtures/*")
# Generate the matrix to run tests.
echo "matrix=$(ls -1 chunk_*.txt | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT
echo "$count individual tests collected in $chunks files"
+21 -20
View File
@@ -56,6 +56,14 @@ jobs:
image: redis
ports:
- 6379:6379
postgres:
image: ${{ matrix.db == 'pgsql' && 'postgres:14' || '' }}
env:
POSTGRES_DB: test
POSTGRES_USER: test
POSTGRES_PASSWORD: test
ports:
- 5432:5432
strategy:
fail-fast: false
matrix:
@@ -71,27 +79,20 @@ jobs:
db: pgsql
steps:
- name: Setting up DB mysql
- name: Run MySQL Server
if: ${{ matrix.db == 'mysqli' }}
uses: moodlehq/mysql-action@v1
with:
collation server: utf8mb4_bin
mysql version: 8.4
mysql database: test
mysql user: test
mysql password: test
use tmpfs: true
tmpfs size: '1024M'
extra conf: --skip-log-bin
- name: Setting up DB pgsql
if: ${{ matrix.db == 'pgsql' }}
uses: m4nu56/postgresql-action@v1
with:
postgresql version: 14
postgresql db: test
postgresql user: test
postgresql password: test
run: |
docker run --rm \
-e MYSQL_DATABASE=test \
-e MYSQL_USER=test \
-e MYSQL_PASSWORD=test \
-e MYSQL_ROOT_PASSWORD=test \
-p 3306:3306 \
-d \
--tmpfs /var/lib/mysql:rw,noexec,nosuid,size=1024M \
mysql:8.4 \
--skip-log-bin \
--collation-server=utf8mb4_bin
- name: Configuring git vars
uses: rlespinasse/github-slug-action@v4
+2 -2
View File
@@ -18,7 +18,7 @@ import inquirer from 'inquirer';
import chalk from 'chalk';
import { createNote } from './note.mjs';
import { getInitialValues } from './helpers.mjs';
import { getInitialValues, getIssueNumberFromBranchName } from './helpers.mjs';
import * as Prompts from './prompts.mjs';
import logger from './logger.mjs';
@@ -29,7 +29,7 @@ export default async (options) => {
// Fetch information.
const messages = [];
const { issueNumber } = await inquirer.prompt([
Prompts.getIssuePrompt(),
Prompts.getIssuePrompt(getIssueNumberFromBranchName()),
], initialValues);
let selection = {};
+14
View File
@@ -14,6 +14,7 @@
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
import chalk from 'chalk';
import branchName from 'current-git-branch';
import { isStandardComponent, isCommunityComponent, rewritePlugintypeAsSubsystem } from './components.mjs';
import { isValidNoteName } from './noteTypes.mjs';
import logger from './logger.mjs';
@@ -59,6 +60,19 @@ export const formatIssueNumber = (input) => {
return input;
};
/**
* Get the issue number, based off current git branch name
*
* @returns {string|null}
*/
export const getIssueNumberFromBranchName = () => {
const issueNumber = String(branchName()).match(/^[a-zA-Z]*-\d+/);
if (issueNumber) {
return formatIssueNumber(issueNumber[0]);
}
return null;
};
/**
* Validate a component.
*
+41 -2
View File
@@ -58,6 +58,31 @@ module.exports = grunt => {
}) + "\n");
};
/**
* Extracts ignore entries from a local ignore file.
*
* @param {string} componentPath the file path to the component, relative to the code base directory
* @param {string} ignoreFilePath the path to the ignore file
* @return {array} array of ignore paths to be included in the global ignore files
*/
const getEntriesFromLocalIgnoreFile = (componentPath, ignoreFilePath) => {
const ignorePaths = [];
if (grunt.file.exists(ignoreFilePath)) {
const ignoreFile = grunt.file.read(ignoreFilePath);
const entries = ignoreFile.split('\n');
entries.forEach(entry => {
entry = entry.trim();
if (entry.length > 0 && !entry.startsWith('#') && !entry.startsWith('!')) {
while (entry.startsWith('/')) {
entry = entry.substring(1);
}
ignorePaths.push(componentPath + '/' + entry);
}
});
}
return ignorePaths;
};
/**
* Generate ignore files (utilising thirdpartylibs.xml data)
*/
@@ -67,6 +92,20 @@ module.exports = grunt => {
// An array of paths to third party directories.
const thirdPartyPaths = ComponentList.getThirdPartyPaths();
const localStylelintIgnorePaths = [];
const localEslintIgnorePaths = [];
ComponentList.getComponentPaths(process.cwd() + '/').forEach(componentPath => {
const localEslintIgnorePath = process.cwd() + '/' + componentPath + '/.eslintignore';
const localEslintIgnoreEntries = getEntriesFromLocalIgnoreFile(componentPath, localEslintIgnorePath);
if (localEslintIgnoreEntries.length > 0) {
localEslintIgnorePaths.push(...localEslintIgnoreEntries);
}
const localStylelintIgnorePath = process.cwd() + '/' + componentPath + '/.stylelintignore';
const localStylelintIgnoreEntries = getEntriesFromLocalIgnoreFile(componentPath, localStylelintIgnorePath);
if (localStylelintIgnoreEntries.length > 0) {
localStylelintIgnorePaths.push(...localStylelintIgnoreEntries);
}
});
// Generate .eslintignore.
const eslintIgnores = [
@@ -77,7 +116,7 @@ module.exports = grunt => {
// Ignore all yui/src meta directories and build directories.
'*/**/yui/src/*/meta/',
'*/**/build/',
].concat(thirdPartyPaths);
].concat(thirdPartyPaths).concat(localEslintIgnorePaths);
grunt.file.write('.eslintignore', eslintIgnores.join('\n') + '\n');
// Generate .stylelintignore.
@@ -88,7 +127,7 @@ module.exports = grunt => {
'theme/classic/style/moodle.css',
'jsdoc/styles/*.css',
'admin/tool/componentlibrary/hugo/dist/css/docs.css',
].concat(thirdPartyPaths);
].concat(thirdPartyPaths).concat(localStylelintIgnorePaths);
grunt.file.write('.stylelintignore', stylelintIgnores.join('\n') + '\n');
phpcsIgnore(thirdPartyPaths);
+5 -1
View File
@@ -49,6 +49,10 @@ module.exports = grunt => {
// Spawn the task in a child process so that it doesn't kill this one
// if it failed.
var args = [task, filesOption];
if (grunt.option('force')) {
args.push('--force');
}
grunt.util.spawn(
{
// Spawn with the grunt bin.
@@ -58,7 +62,7 @@ module.exports = grunt => {
cwd: grunt.moodleEnv.fullRunDir,
stdio: 'inherit'
},
args: [task, filesOption]
args: args
},
function(err, res, code) {
if (code !== 0) {
@@ -0,0 +1,7 @@
issueNumber: MDL-51152
notes:
enrol_manual:
- message: >-
The unused parameter 'roleid' has been removed from the external
function `unenrol_users()`
type: removed
@@ -0,0 +1,8 @@
issueNumber: MDL-75067
notes:
tool_behat:
- message: >-
The `behat_session_trait::ensure_element_[does_not_]exists(...)` methods
now accept optional `$container` parameter to define the parent node to
look within
type: improved
@@ -0,0 +1,8 @@
issueNumber: MDL-85322
notes:
block_html:
- message: >-
Treat Dashboard (pagetype 'my-index') as trusted in web services so
get_content_for_external preserves embedded HTML (e.g. iframes) on user
Dashboard.
type: changed
@@ -0,0 +1,12 @@
issueNumber: MDL-86524
notes:
core_question:
- message: >-
During restore of a question_set_reference, mapping of IDs in the
filtercondition is now delegated to qbank plugins.
If your qbank plugin defines a filter condition that uses database
IDs, add an override of `restore_filtercondition()` to the `condition`
class, which checks the condition's data and replaces the IDs with
mapped values if required. See
`qbank_managecategories\category_condition` for an example.
type: improved
@@ -0,0 +1,10 @@
issueNumber: MDL-86839
notes:
core:
- message: >
"grunt watch" now accepts a force flag. Run "grunt watch -f" or "grunt
watch --force" to prevent grunt from cancelling builds when errors
occur. This is especially useful during development, because js build
files will be built even if, for example, jslint errors are still
present in the files.
type: improved
@@ -0,0 +1,7 @@
issueNumber: MDL-87100
notes:
core:
- message: >-
When creating upgrade notes, the issue number will be inferred from the
current Git branch name by default
type: improved
@@ -0,0 +1,7 @@
issueNumber: MDL-87443
notes:
core:
- message: >-
There is a new Behat `toast_message` named selector to more easily
assert the presence of Toast messages on the page
type: improved
@@ -0,0 +1,7 @@
issueNumber: MDL-87795
notes:
core_user:
- message: >-
Added new optional parameter `userid` to the `user_remove_user_device`
function.
type: improved
@@ -0,0 +1,8 @@
issueNumber: MDL-87993
notes:
core:
- message: >-
The `core/toast` JS module now accepts a `visuallyHidden` configuration
parameter to render visually hidden toast messages for screen reader
users.
type: improved
+1 -1
View File
@@ -32,7 +32,7 @@ Moodle also offers hosting through both [MoodleCloud][11], and our [partner netw
## License
Moodle is provided freely as open source software, under version 3 of the GNU General Public License. For more information on our license see
Moodle is provided freely as open source software, under version 3 of the GNU General Public License. See our [license page][12] for more information.
[1]: https://moodle.org
[2]: https://moodle.com
+217
View File
@@ -6,6 +6,223 @@ More detailed information on key changes can be found in the [Developer update n
The format of this change log follows the advice given at [Keep a CHANGELOG](https://keepachangelog.com).
## 5.0.6+
### core
#### Added
- "grunt watch" now accepts a force flag. Run "grunt watch -f" or "grunt watch --force" to prevent grunt from cancelling builds when errors occur. This is especially useful during development, because js build files will be built even if, for example, jslint errors are still present in the files.
For more information see [MDL-86839](https://tracker.moodle.org/browse/MDL-86839)
- When creating upgrade notes, the issue number will be inferred from the current Git branch name by default
For more information see [MDL-87100](https://tracker.moodle.org/browse/MDL-87100)
- There is a new Behat `toast_message` named selector to more easily assert the presence of Toast messages on the page
For more information see [MDL-87443](https://tracker.moodle.org/browse/MDL-87443)
- The `core/toast` JS module now accepts a `visuallyHidden` configuration parameter to render visually hidden toast messages for screen reader users.
For more information see [MDL-87993](https://tracker.moodle.org/browse/MDL-87993)
### core_question
#### Added
- During restore of a question_set_reference, mapping of IDs in the filtercondition is now delegated to qbank plugins. If your qbank plugin defines a filter condition that uses database IDs, add an override of `restore_filtercondition()` to the `condition` class, which checks the condition's data and replaces the IDs with mapped values if required. See `qbank_managecategories\category_condition` for an example.
For more information see [MDL-86524](https://tracker.moodle.org/browse/MDL-86524)
### core_user
#### Added
- Added new optional parameter `userid` to the `user_remove_user_device` function.
For more information see [MDL-87795](https://tracker.moodle.org/browse/MDL-87795)
### block_html
#### Changed
- Treat Dashboard (pagetype 'my-index') as trusted in web services so get_content_for_external preserves embedded HTML (e.g. iframes) on user Dashboard.
For more information see [MDL-85322](https://tracker.moodle.org/browse/MDL-85322)
### enrol_manual
#### Removed
- The unused parameter 'roleid' has been removed from the external function `unenrol_users()`
For more information see [MDL-51152](https://tracker.moodle.org/browse/MDL-51152)
### tool_behat
#### Added
- The `behat_session_trait::ensure_element_[does_not_]exists(...)` methods now accept optional `$container` parameter to define the parent node to look within
For more information see [MDL-75067](https://tracker.moodle.org/browse/MDL-75067)
## 5.0.5
### core
#### Changed
- `\core\output\core_renderer::confirm()`'s `$displayoptions` parameter now also accepts a `headinglevel` option that developers can use to specify the heading level of the confirmation's heading. If not specified, the confirmation heading will be rendered in an `h4` tag.
For more information see [MDL-87694](https://tracker.moodle.org/browse/MDL-87694)
### core_question
#### Fixed
- In order to prevent re-use of question version numbers after a version is deleted, the `nextversion` column was added to `question_bank_entries`. This serves as a counter incremented each time a version is created.
Do not query this field directly. Instead use `core_question\versions::get_next_version()` to read the value, which will initialise it based on the existing versions if it is not set yet. By default, it will increment the version number automatically, unless you pass `increment: false`. Because of this, it is advisable to call it inside a transaction, that is only committed after the version number is used in a `question_versions` record.
For more information see [MDL-86798](https://tracker.moodle.org/browse/MDL-86798)
## 5.0.4
### core
#### Added
- Added clean_string() that prevents double escaping in Mustache templates
For more information see [MDL-87066](https://tracker.moodle.org/browse/MDL-87066)
#### Changed
- The Hook Manager now uses localcache instead of caching via MUC.
For more information see [MDL-87107](https://tracker.moodle.org/browse/MDL-87107)
#### Fixed
- `restore_qtype_plugin::unset_excluded_fields` now returns the modified questiondata structure,
in order to support structures that contain arrays.
If your qtype plugin overrides `restore_qtype_plugin::remove_excluded_question_data` without
calling the parent method, you may need to modify your overridden method to use the returned
value.
For more information see [MDL-85975](https://tracker.moodle.org/browse/MDL-85975)
- When responding to pcntl signals, call existing signal handlers.
For more information see [MDL-87079](https://tracker.moodle.org/browse/MDL-87079)
### core_completion
#### Changed
- The `completion_info::clear_criteria` method takes an optional `$removetypecriteria` to determine whether to remove course type criteria from other courses that refer to the current course
For more information see [MDL-86332](https://tracker.moodle.org/browse/MDL-86332)
### core_course
#### Added
- The external function `core_course_get_course_contents` now includes the `candisplay` property for each returned module. If this is false, the module should not be displayed on the course page (for example, for question banks).
For more information see [MDL-85405](https://tracker.moodle.org/browse/MDL-85405)
### core_group
#### Added
- `groups_print_activity_menu()` and `groups_get_activity_group()` now include an additional `$participationonly` parameter, which is true by default. This can be set false when we want the user to be able to select a non-participation group within an activity, for example if a teacher wants to filter assignment submissions by non-participation groups. It should never be used when the menu is displayed to students, as this may allow them to participate using non-participation groups. Non-participation groups are labeled as such.
For more information see [MDL-81514](https://tracker.moodle.org/browse/MDL-81514)
### mod_glossary
#### Added
- Function mod_glossary_rating_can_see_item_ratings is now implemented for checking permissions to view ratings.
For more information see [MDL-86960](https://tracker.moodle.org/browse/MDL-86960)
## 5.0.3
### core
#### Added
- The Behat `::execute()` method now accepts an array-style callable in addition to the string `classname::method` format.
The following formats are now accepted:
```php
// String format:
$this->execute('behat_general::i_click_on', [...]);
// Array format:
$this->execute([behat_general::class,' i_click_on'], [...]);
```
For more information see [MDL-86231](https://tracker.moodle.org/browse/MDL-86231)
- The `\externallib_advanced_testcase` has been replaced by `\core_external\tests\externallib_testcase` and is now autoloadable.
For more information see [MDL-86283](https://tracker.moodle.org/browse/MDL-86283)
#### Changed
- The `\core\output\local\dropdown\dialog` class constructor now accepts a `$definition['autoclose']` parameter to define autoclose behaviour of the element
For more information see [MDL-86015](https://tracker.moodle.org/browse/MDL-86015)
- The default PHPUnit configuration now enables the following properties, ensuring PHP warnings will cause test failures (restoring pre-PHPUnit version 10 behaviour):
* `failOnDeprecation`
* `failOnWarning`
For more information see [MDL-86311](https://tracker.moodle.org/browse/MDL-86311)
### core_badges
#### Added
- A number of new static methods have been added to `core_badges\backpack_api` to support the new Canvas Credentials backpack provider. These methods allow you to retrieve lists of providers and regions, check if Canvas Credentials fields should be displayed, and get a region URL or API URL based on a given region ID. The new methods include `get_providers`, `get_regions`, `display_canvas_credentials_fields`, `get_region_url`, `get_region_api_url`, `get_regionid_from_url`, and `is_canvas_credentials_region`.
For more information see [MDL-86174](https://tracker.moodle.org/browse/MDL-86174)
### core_courseformat
#### Added
- Add a new modinfo::get_instance_of() to retrieve an instance of a cm via its name and instance id. Add a new modinfo::sort_cm_array() to sort an array of cms in their order of appearance in the course page. Replaces calls to get_course_and_cm_from_instance() and get_instances_of() whenever it was just used to retrieve a single instance of a cm.
For more information see [MDL-86021](https://tracker.moodle.org/browse/MDL-86021)
### core_grades
#### Added
- New 'is_gradable()' function has been created to return whether the item has any gradeitem that is GRADE_TYPE_VALUE or GRADE_TYPE_SCALE.
For more information see [MDL-85837](https://tracker.moodle.org/browse/MDL-85837)
- - New grade_item::is_gradable function has been created to return whether the grade item is GRADE_TYPE_VALUE or GRADE_TYPE_SCALE.
For more information see [MDL-86173](https://tracker.moodle.org/browse/MDL-86173)
### core_message
#### Added
- The `contexturl` property to `\core\message\message` instances can now contain `\core\url` values in addition to plain strings
For more information see [MDL-83080](https://tracker.moodle.org/browse/MDL-83080)
### theme_boost
#### Added
- Tables affected by unwanted styling (e.g., borders) from the reset of Bootstrap _reboot.scss styles can now opt out and preserve the original behavior by adding the styleless .table-reboot class.
For more information see [MDL-86548](https://tracker.moodle.org/browse/MDL-86548)
## 5.0.2
### core
+2 -2
View File
@@ -119,8 +119,8 @@ foreach ($settingspage->children as $childpage) {
$outputhtml .= html_writer::tag('div', '<!-- -->', array('class' => 'clearer'));
$outputhtml .= $setting->output_html($data);
if ($childpage->has_dependencies()) {
$opts = ['dependencies' => $childpage->get_dependencies_for_javascript()];
$PAGE->requires->js_call_amd('core/showhidesettings', 'init', [$opts]);
$context = ['dependencies' => json_encode($childpage->get_dependencies_for_javascript())];
echo $OUTPUT->render_from_template('core_admin/settings_showhide', $context);
}
}
$outputhtml .= html_writer::end_tag('fieldset');
@@ -0,0 +1,74 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_admin\admin;
use admin_setting;
/**
* Render a notification as part of other admin settings.
*
* @package core_admin
* @subpackage admin
* @copyright 2025 Matt Porritt <matt.porritt@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class admin_setting_notification extends admin_setting {
/**
* Constructor.
*
* @param string $name The name of the setting.
* @param string $notification The notification to display.
* @param string $type The type of notification.
* @param bool $cancelable Whether the notification can be canceled.
*/
public function __construct(
string $name,
/** @var string The notification to display. */
protected string $notification,
/** @var string The type of notification. */
protected string $type = 'info',
/** @var bool Whether the notification can be canceled. */
protected bool $cancelable = false
) {
$this->nosave = true;
parent::__construct($name, '', '', '');
}
#[\Override]
public function get_setting(): bool {
return true;
}
#[\Override]
public function get_defaultsetting(): bool {
return true;
}
#[\Override]
public function write_setting($data): string {
// Do not write any setting.
return '';
}
#[\Override]
public function output_html($data, $query = ''): string {
global $OUTPUT;
return $OUTPUT->notification($this->notification, $this->type, $this->cancelable);
}
}
+18 -9
View File
@@ -69,7 +69,7 @@ if ($options['enablelater']) {
}
$time = time() + ($options['enablelater']*60);
set_config('maintenance_later', $time);
set_config('maintenance_later', $time, null, true);
echo get_string('clistatusenabledlater', 'admin', userdate($time))."\n";
return 0;
@@ -77,23 +77,32 @@ if ($options['enablelater']) {
} else if ($options['enable']) {
if (file_exists("$CFG->dataroot/climaintenance.html")) {
// The maintenance is already enabled, nothing to do.
} else {
enable_cli_maintenance_mode();
exit(0);
}
enable_cli_maintenance_mode();
set_config('maintenance_enabled', 'cli mode', null, true);
if (isset($CFG->maintenance_later)) {
unset_config('maintenance_later', null, true);
}
set_config('maintenance_enabled', 0);
unset_config('maintenance_later');
echo get_string('sitemaintenanceoncli', 'admin')."\n";
exit(0);
} else if ($options['enableold']) {
set_config('maintenance_enabled', 1);
unset_config('maintenance_later');
set_config('maintenance_enabled', 1, null, true);
if (isset($CFG->maintenance_later)) {
unset_config('maintenance_later', null, true);
}
echo get_string('sitemaintenanceon', 'admin')."\n";
exit(0);
} else if ($options['disable']) {
set_config('maintenance_enabled', 0);
unset_config('maintenance_later');
if ($CFG->maintenance_enabled !== '0') {
set_config('maintenance_enabled', 0, null, true);
}
if (isset($CFG->maintenance_later)) {
unset_config('maintenance_later', null, true);
}
if (file_exists("$CFG->dataroot/climaintenance.html")) {
unlink("$CFG->dataroot/climaintenance.html");
}
+5 -5
View File
@@ -125,11 +125,6 @@ if ($options['list']) {
exit(0);
}
if (moodle_needs_upgrading()) {
mtrace("Moodle upgrade pending, cannot manage tasks.");
exit(1);
}
if ($disable = $options['disable']) {
if (!$task = \core\task\manager::get_scheduled_task($disable)) {
mtrace("Task '$disable' not found");
@@ -157,6 +152,11 @@ if ($disable = $options['disable']) {
exit(1);
}
} else if ($execute = $options['execute']) {
if (moodle_needs_upgrading()) {
mtrace("Moodle upgrade pending, cannot execute tasks.");
exit(1);
}
if (!$task = \core\task\manager::get_scheduled_task($execute)) {
mtrace("Task '$execute' not found");
exit(1);
+3 -3
View File
@@ -158,13 +158,13 @@ if ($options['plugins']) {
if (is_null($plugin)) {
cli_writeln('Unknown plugin: ' . $component);
} else {
$pluginstring = $plugin->component . "\t" . $plugin->displayname;
$pluginstring = $component . "\t" . $plugin->displayname;
if ($pluginman->can_uninstall_plugin($plugin->component)) {
if ($pluginman->can_uninstall_plugin($component)) {
if ($options['run']) {
cli_writeln('Uninstalling: ' . $pluginstring);
$progress = new progress_trace_buffer(new text_progress_trace(), true);
$pluginman->uninstall_plugin($plugin->component, $progress);
$pluginman->uninstall_plugin($component, $progress);
$progress->finished();
cli_write($progress->get_buffer());
} else {
+209
View File
@@ -3835,6 +3835,7 @@
<PHP_EXTENSION name="fileinfo" level="required"/>
<PHP_EXTENSION name="sodium" level="optional"/>
<PHP_EXTENSION name="exif" level="optional"/>
<PHP_EXTENSION name="filter" level="required"/>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="96M" level="required">
@@ -4411,6 +4412,7 @@
<PHP_EXTENSION name="fileinfo" level="required"/>
<PHP_EXTENSION name="sodium" level="required"/>
<PHP_EXTENSION name="exif" level="optional"/>
<PHP_EXTENSION name="filter" level="required"/>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="96M" level="required">
@@ -4607,6 +4609,7 @@
<PHP_EXTENSION name="fileinfo" level="required"/>
<PHP_EXTENSION name="sodium" level="required"/>
<PHP_EXTENSION name="exif" level="optional"/>
<PHP_EXTENSION name="filter" level="required"/>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="96M" level="required">
@@ -4802,6 +4805,7 @@
<PHP_EXTENSION name="fileinfo" level="required"/>
<PHP_EXTENSION name="sodium" level="required"/>
<PHP_EXTENSION name="exif" level="optional"/>
<PHP_EXTENSION name="filter" level="required"/>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="96M" level="required">
@@ -4997,6 +5001,7 @@
<PHP_EXTENSION name="fileinfo" level="required"/>
<PHP_EXTENSION name="sodium" level="required"/>
<PHP_EXTENSION name="exif" level="optional"/>
<PHP_EXTENSION name="filter" level="required"/>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="96M" level="required">
@@ -5100,4 +5105,208 @@
</CUSTOM_CHECK>
</CUSTOM_CHECKS>
</MOODLE>
<MOODLE version="5.2" requires="4.4">
<UNICODE level="required">
<FEEDBACK>
<ON_ERROR message="unicoderequired" />
</FEEDBACK>
</UNICODE>
<DATABASE level="required">
<VENDOR name="mariadb" version="10.11.0" />
<VENDOR name="mysql" version="8.4" />
<VENDOR name="postgres" version="16" />
<VENDOR name="mssql" version="15.0" />
<VENDOR name="auroramysql" version="8.0" />
</DATABASE>
<PHP version="8.3.0" level="required">
</PHP>
<PCREUNICODE level="optional">
<FEEDBACK>
<ON_CHECK message="pcreunicodewarning" />
</FEEDBACK>
</PCREUNICODE>
<PHP_EXTENSIONS>
<PHP_EXTENSION name="iconv" level="required">
<FEEDBACK>
<ON_ERROR message="iconvrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="mbstring" level="required">
<FEEDBACK>
<ON_ERROR message="mbstringrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="curl" level="required">
<FEEDBACK>
<ON_ERROR message="curlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="openssl" level="required">
<FEEDBACK>
<ON_ERROR message="opensslrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="tokenizer" level="optional">
<FEEDBACK>
<ON_CHECK message="tokenizerrecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="soap" level="optional">
<FEEDBACK>
<ON_CHECK message="soaprecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="ctype" level="required">
<FEEDBACK>
<ON_ERROR message="ctyperequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="zip" level="required">
<FEEDBACK>
<ON_ERROR message="ziprequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="zlib" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="gd" level="required">
<FEEDBACK>
<ON_ERROR message="gdrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="simplexml" level="required">
<FEEDBACK>
<ON_ERROR message="simplexmlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="spl" level="required">
<FEEDBACK>
<ON_ERROR message="splrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="pcre" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="dom" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="xml" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="xmlreader" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="intl" level="required">
<FEEDBACK>
<ON_ERROR message="intlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="json" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="hash" level="required"/>
<PHP_EXTENSION name="fileinfo" level="required"/>
<PHP_EXTENSION name="sodium" level="required"/>
<PHP_EXTENSION name="exif" level="optional"/>
<PHP_EXTENSION name="filter" level="required"/>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="96M" level="required">
<FEEDBACK>
<ON_ERROR message="settingmemorylimit" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="file_uploads" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="settingfileuploads" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="opcache.enable" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="opcacherecommended" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="zend.exception_ignore_args" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="settingzendexceptionignoreargs" />
</FEEDBACK>
</PHP_SETTING>
</PHP_SETTINGS>
<CUSTOM_CHECKS>
<CUSTOM_CHECK function="\core\environment::check_composer_dependencies_installed" level="optional" />
<CUSTOM_CHECK function="\core\environment::check_composer_developer_dependencies_not_installed" level="optional" />
<CUSTOM_CHECK function="\core\environment::check_composer_dependencies_optimised" level="optional" />
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_storage_engine" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbstorageengine" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="question/engine/upgrade/upgradelib.php" function="quiz_attempts_upgraded" level="required">
<FEEDBACK>
<ON_ERROR message="quizattemptsupgradedmessage" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_slasharguments" level="optional">
<FEEDBACK>
<ON_CHECK message="slashargumentswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_tables_row_format" level="optional">
<FEEDBACK>
<ON_CHECK message="unsupporteddbtablerowformat" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_unoconv_version" level="optional">
<FEEDBACK>
<ON_CHECK message="unoconvwarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_libcurl_version" level="optional">
<FEEDBACK>
<ON_CHECK message="libcurlwarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_file_format" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbfileformat" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_file_per_table" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbfilepertable" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_large_prefix" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddblargeprefix" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_is_https" level="optional">
<FEEDBACK>
<ON_CHECK message="ishttpswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_incomplete_unicode_support" level="optional">
<FEEDBACK>
<ON_CHECK message="incompleteunicodesupport" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_sixtyfour_bits" level="required">
<FEEDBACK>
<ON_ERROR message="sixtyfourbitsrequired" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_max_input_vars" level="optional">
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_admin_dir_usage" level="optional">
<FEEDBACK>
<ON_CHECK message="iscustomadminwarnings" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_xmlrpc_usage" level="optional">
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mod_assignment" level="required">
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_db_prefix_length" level="required">
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_async_backup" level="recommended">
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_aurora_version" level="optional">
</CUSTOM_CHECK>
</CUSTOM_CHECKS>
</MOODLE>
</COMPATIBILITY_MATRIX>
+1 -1
View File
@@ -121,7 +121,7 @@ $table = new html_table();
$table->head = [get_string('filter'), get_string('isactive', 'filters'),
get_string('order'), get_string('applyto', 'filters'), get_string('settings'), get_string('uninstallplugin', 'core_admin')];
$table->colclasses = array ('leftalign', 'leftalign', 'centeralign', 'leftalign', 'leftalign', 'leftalign');
$table->attributes['class'] = 'admintable generaltable';
$table->attributes['class'] = 'admintable generaltable table table-hover';
$table->id = 'filterssetting';
$table->data = [];
+32 -8
View File
@@ -916,8 +916,14 @@ if (empty($CFG->disabledevlibdirscheck) && (is_dir($CFG->dirroot.'/vendor') || i
// Check if the site is being foced onto ssl.
$overridetossl = !empty($CFG->overridetossl);
// Check if moodle campaign content setting is enabled or not.
$showcampaigncontent = !isset($CFG->showcampaigncontent) || $CFG->showcampaigncontent;
if (defined('BEHAT_SITE_RUNNING') && BEHAT_SITE_RUNNING) {
// We need to add this in order to be able to verify the showcampaigncontent setting behaviour during behat tests.
$showcampaigncontent = get_config('core', 'showcampaigncontent');
$showcampaigncontent = $showcampaigncontent === 'true';
} else {
// Check if moodle campaign content setting is enabled or not.
$showcampaigncontent = !isset($CFG->showcampaigncontent) || $CFG->showcampaigncontent;
}
// Encourage admins to enable the user feedback feature if it is not enabled already.
$showfeedbackencouragement = empty($CFG->enableuserfeedback);
@@ -935,9 +941,27 @@ admin_externalpage_setup('adminnotifications');
$output = $PAGE->get_renderer('core', 'admin');
echo $output->admin_notifications_page($maturity, $insecuredataroot, $errorsdisplayed, $cronoverdue, $dbproblems,
$maintenancemode, $availableupdates, $availableupdatesfetch, $buggyiconvnomb,
$registered, $cachewarnings, $eventshandlers, $themedesignermode, $devlibdir,
$mobileconfigured, $overridetossl, $invalidforgottenpasswordurl, $croninfrequent,
$showcampaigncontent, $showfeedbackencouragement, $servicesandsupportcontent,
$xmlrpcwarning);
echo $output->admin_notifications_page(
$maturity,
$insecuredataroot,
$errorsdisplayed,
$cronoverdue,
$dbproblems,
$maintenancemode,
$availableupdates,
$availableupdatesfetch,
$buggyiconvnomb,
$registered,
$cachewarnings,
$eventshandlers,
$themedesignermode,
$devlibdir,
$mobileconfigured,
$overridetossl,
$invalidforgottenpasswordurl,
$croninfrequent,
$showcampaigncontent,
$showfeedbackencouragement,
$servicesandsupportcontent,
$xmlrpcwarning
);
+4 -4
View File
@@ -98,10 +98,10 @@
echo $OUTPUT->header();
?>
<form method="post" action="index.php">
<table align="center" width="635" class="generaltable" border="0" cellpadding="5" cellspacing="0">
<table align="center" width="635" class="generaltable table table-hover" border="0" cellpadding="5" cellspacing="0">
<tr>
<td class="generalboxcontent">
<table cellpadding="9" cellspacing="0" >
<table cellpadding="9" cellspacing="0" class="table-reboot">
<tr valign="top">
<td colspan="2" class="header"><?php print_string('aboutyourhost', 'mnet'); ?></td>
</tr>
@@ -119,10 +119,10 @@
</table>
</form>
<form method="post" action="index.php">
<table align="center" width="635" class="generaltable" border="0" cellpadding="5" cellspacing="0">
<table align="center" width="635" class="generaltable table table-hover" border="0" cellpadding="5" cellspacing="0">
<tr>
<td class="generalboxcontent">
<table cellpadding="9" cellspacing="0" >
<table cellpadding="9" cellspacing="0" class="table-reboot">
<tr valign="top">
<td colspan="2" class="header"><?php print_string('expireyourkey', 'mnet'); ?></td>
</tr>
+1 -1
View File
@@ -54,7 +54,7 @@ $table = new html_table();
$table->head = array($txt->name, $txt->version, $txt->uninstall, $txt->settings);
$table->colclasses = array('mdl-left', 'mdl-align', 'mdl-align', 'mdl-align');
$table->data = array();
$table->attributes['class'] = 'manageplagiarismtable generaltable';
$table->attributes['class'] = 'manageplagiarismtable generaltable table table-hover';
// Iterate through auth plugins and add to the display table.
$authcount = count($plagiarismplugins);
+57 -10
View File
@@ -282,13 +282,30 @@ class core_admin_renderer extends plugin_renderer_base {
*
* @return string HTML to output.
*/
public function admin_notifications_page($maturity, $insecuredataroot, $errorsdisplayed,
$cronoverdue, $dbproblems, $maintenancemode, $availableupdates, $availableupdatesfetch,
$buggyiconvnomb, $registered, array $cachewarnings = array(), $eventshandlers = 0,
$themedesignermode = false, $devlibdir = false, $mobileconfigured = false,
$overridetossl = false, $invalidforgottenpasswordurl = false, $croninfrequent = false,
$showcampaigncontent = false, bool $showfeedbackencouragement = false, bool $showservicesandsupport = false,
$xmlrpcwarning = '') {
public function admin_notifications_page(
$maturity,
$insecuredataroot,
$errorsdisplayed,
$cronoverdue,
$dbproblems,
$maintenancemode,
$availableupdates,
$availableupdatesfetch,
$buggyiconvnomb,
$registered,
array $cachewarnings = [],
$eventshandlers = 0,
$themedesignermode = false,
$devlibdir = false,
$mobileconfigured = false,
$overridetossl = false,
$invalidforgottenpasswordurl = false,
$croninfrequent = false,
$showcampaigncontent = false,
bool $showfeedbackencouragement = false,
bool $showservicesandsupport = false,
$xmlrpcwarning = ''
) {
global $CFG;
$output = '';
@@ -313,6 +330,8 @@ class core_admin_renderer extends plugin_renderer_base {
$output .= $this->mobile_configuration_warning($mobileconfigured);
$output .= $this->forgotten_password_url_warning($invalidforgottenpasswordurl);
$output .= $this->mnet_deprecation_warning($xmlrpcwarning);
$output .= $this->moodlenet_removal_warning();
$output .= $this->marketplace_integration_notice();
$output .= $this->userfeedback_encouragement($showfeedbackencouragement);
$output .= $this->services_and_support_content($showservicesandsupport);
$output .= $this->campaign_content($showcampaigncontent);
@@ -1809,6 +1828,7 @@ class core_admin_renderer extends plugin_renderer_base {
$table = new html_table();
$table->id = 'plugins-control-panel';
$table->attributes['class'] = 'generaltable table table-striped table-hover';
$table->head = array(
get_string('displayname', 'core_plugin'),
get_string('version', 'core_plugin'),
@@ -2063,7 +2083,7 @@ class core_admin_renderer extends plugin_renderer_base {
get_string('status'),
);
$servertable->colclasses = array('centeralign name', 'centeralign info', 'leftalign report', 'leftalign plugin', 'centeralign status');
$servertable->attributes['class'] = 'table table-striped admintable environmenttable generaltable table-sm';
$servertable->attributes['class'] = 'table table-striped admintable environmenttable generaltable table-sm table-hover';
$servertable->id = 'serverstatus';
$serverdata = array('ok'=>array(), 'warn'=>array(), 'error'=>array());
@@ -2076,7 +2096,7 @@ class core_admin_renderer extends plugin_renderer_base {
get_string('status'),
);
$othertable->colclasses = array('aligncenter info', 'alignleft report', 'alignleft plugin', 'aligncenter status');
$othertable->attributes['class'] = 'table table-striped admintable environmenttable generaltable table-sm';
$othertable->attributes['class'] = 'table table-striped admintable environmenttable generaltable table-sm table-hover';
$othertable->id = 'otherserverstatus';
$otherdata = array('ok'=>array(), 'warn'=>array(), 'error'=>array());
@@ -2276,7 +2296,7 @@ class core_admin_renderer extends plugin_renderer_base {
public function moodleorg_registration_message() {
$a = new stdClass();
$a->moreinformation = '#id_sitestats'; // More information anchor.
$a->moodleapp = HUB_MOODLEORGHUBURL . '/solutions/moodle-app/';
$a->moodleapp = MOODLE_PRODUCTURL . '/solutions/moodle-app/';
$out = format_text(get_string('registerwithmoodleorginfo', 'core_hub', $a), FORMAT_MARKDOWN);
$out .= html_writer::link(
@@ -2325,6 +2345,33 @@ class core_admin_renderer extends plugin_renderer_base {
return $this->warning($xmlrpcwarning);
}
/**
* Display a warning about the removal of MoodleNet integration.
*
* @return string HTML to output.
*/
protected function moodlenet_removal_warning(): string {
$moodlenetenabled = get_config('tool_moodlenet', 'enablemoodlenet');
if (!empty($moodlenetenabled)) {
$moodlenetwarning = get_string('moodlenetremovalwarning', 'admin');
return $this->warning($moodlenetwarning);
}
return '';
}
/**
* Display a notice about Moodle Marketplace integration.
*
* @return string HTML to output.
*/
protected function marketplace_integration_notice(): string {
$installer = tool_installaddon_installer::instance();
$url = $installer->get_marketplace_url();
$notice = get_string('marketplaceavailablenotice', 'admin', $url->out());
return $this->warning($notice, 'info');
}
/**
* Renders the theme selector list.
*
+1 -1
View File
@@ -263,7 +263,7 @@ if (($action == 'edit') || ($action == 'new')) {
$table->colclasses = array('leftalign', 'centeralign', 'centeralign', 'centeralign', 'centeralign', 'centeralign');
$table->id = 'repositoriessetting';
$table->data = array();
$table->attributes['class'] = 'admintable generaltable';
$table->attributes['class'] = 'admintable generaltable table table-hover';
// Get list of used plug-ins
$repositorytypes = repository::get_types();
+1 -1
View File
@@ -179,7 +179,7 @@ echo $OUTPUT->header();
<div>
<input type="hidden" name="sesskey" value="<?php p(sesskey()); ?>" />
<table class="generaltable generalbox groupmanagementtable boxaligncenter" summary="">
<table class="generaltable generalbox groupmanagementtable boxaligncenter table table-hover" summary="">
<tr>
<td id='existingcell'>
<p>
+2 -2
View File
@@ -228,7 +228,7 @@ if ($roleid) {
<form id="assignform" method="post" action="<?php echo $assignurl ?>"><div>
<input type="hidden" name="sesskey" value="<?php echo sesskey() ?>" />
<table id="assigningrole" summary="" class="admintable roleassigntable generaltable" cellspacing="0">
<table id="assigningrole" summary="" class="admintable roleassigntable generaltable table table-hover" cellspacing="0">
<tr>
<td id="existingcell">
<p><label for="removeselect"><?php print_string('extusers', 'core_role'); ?></label></p>
@@ -322,7 +322,7 @@ if ($roleid) {
$table->id = 'assignrole';
$table->head = array(get_string('role'), get_string('description'), get_string('userswiththisrole', 'core_role'));
$table->colclasses = array('leftalign role', 'leftalign', 'centeralign userrole');
$table->attributes['class'] = 'admintable generaltable';
$table->attributes['class'] = 'admintable generaltable table table-hover';
if ($showroleholders) {
$table->headspan = array(1, 1, 2);
$table->colclasses[] = 'leftalign roleholder';
+1 -1
View File
@@ -153,7 +153,7 @@ require('managetabs.php');
$table = new html_table();
$table->colclasses = array('leftalign', 'leftalign', 'leftalign', 'leftalign');
$table->id = 'roles';
$table->attributes['class'] = 'admintable generaltable';
$table->attributes['class'] = 'admintable generaltable table table-hover';
$table->head = array(
get_string('role') . ' ' . $OUTPUT->help_icon('roles', 'core_role'),
get_string('description'),
+2 -3
View File
@@ -32,7 +32,6 @@ $adminroot = admin_get_root(); // need all settings here
$adminroot->search = $query; // So we can reference it in search boxes later in this invocation
$statusmsg = '';
$errormsg = '';
$focus = '';
// now we'll deal with the case that the admin has submitted the form with changed settings
if ($data = data_submitted() and confirm_sesskey() and isset($data->action) and $data->action == 'save-settings') {
@@ -41,7 +40,7 @@ if ($data = data_submitted() and confirm_sesskey() and isset($data->action) and
if (!empty($adminroot->errors)) {
$errormsg = get_string('errorwithsettings', 'admin');
$firsterror = reset($adminroot->errors);
$focus = $firsterror->id;
$PAGE->set_focuscontrol($firsterror->id);
} else {
// No errors. Did we change any setting? If so, then redirect with success.
if ($count) {
@@ -55,7 +54,7 @@ $PAGE->set_primary_active_tab('siteadminnode');
// and finally, if we get here, then there are matching settings and we have to print a form
// to modify them
echo $OUTPUT->header($focus);
echo $OUTPUT->header();
// Display a warning if site is not registered.
if (empty($query)) {
+3 -4
View File
@@ -72,6 +72,7 @@ if ($data = data_submitted() and confirm_sesskey() and isset($data->action) and
} else {
$errormsg = get_string('errorwithsettings', 'admin');
$firsterror = reset($adminroot->errors);
$PAGE->set_focuscontrol($firsterror->id);
}
$settingspage = $adminroot->locate($section, true);
}
@@ -165,10 +166,8 @@ if (empty($SITE->fullname)) {
$PAGE->requires->js_call_amd('core_form/changechecker', 'watchFormById', ['adminsettings']);
if ($settingspage->has_dependencies()) {
$opts = [
'dependencies' => $settingspage->get_dependencies_for_javascript()
];
$PAGE->requires->js_call_amd('core/showhidesettings', 'init', [$opts]);
$context = ['dependencies' => json_encode($settingspage->get_dependencies_for_javascript())];
echo $OUTPUT->render_from_template('core_admin/settings_showhide', $context);
}
echo $OUTPUT->footer();
+18 -8
View File
@@ -32,19 +32,29 @@ if ($hassiteconfig) {
$providers->add(new admin_setting_heading('availableproviders',
get_string('availableproviders', 'core_ai'),
get_string('availableproviders_desc', 'core_ai')));
// Add call to action to add a new provider.
$providers->add(new \core_admin\admin\admin_setting_template_render(
name: 'addnewprovider',
templatename: 'core_ai/admin_add_provider',
context: ['addnewproviderurl' => new moodle_url('/ai/configure.php')]
));
$providers->add(new \core_ai\admin\admin_setting_provider_manager(
if (!empty(core_plugin_manager::instance()->get_plugins_of_type("aiprovider"))) {
// Add call to action to add a new provider.
$providers->add(new \core_admin\admin\admin_setting_template_render(
name: 'addnewprovider',
templatename: 'core_ai/admin_add_provider',
context: ['addnewproviderurl' => new moodle_url('/ai/configure.php')]
));
$providers->add(new \core_ai\admin\admin_setting_provider_manager(
'aiprovider',
\core_ai\table\aiprovider_management_table::class,
'manageaiproviders',
new lang_string('manageaiproviders', 'core_ai'),
));
));
} else {
$providers->add(new \core_admin\admin\admin_setting_notification(
name:'noproviderplugins',
notification: get_string('noproviderplugins', 'core_ai'),
type: 'danger'
));
}
$ADMIN->add('ai', $providers);
// Add settings page for AI placement settings.
+24 -6
View File
@@ -69,19 +69,37 @@ if ($hassiteconfig && \core_analytics\manager::is_analytics_enabled()) {
$ADMIN->add('analytics', $settings);
if ($ADMIN->fulltree) {
// Select the site prediction's processor.
$predictionprocessors = \core_analytics\manager::get_all_prediction_processors();
$predictors = array();
$predictors = [];
foreach ($predictionprocessors as $fullclassname => $predictor) {
$pluginname = substr($fullclassname, 1, strpos($fullclassname, '\\', 1) - 1);
$predictors[$fullclassname] = new lang_string('pluginname', $pluginname);
}
$settings->add(new \core_analytics\admin_setting_predictor('analytics/predictionsprocessor',
new lang_string('defaultpredictionsprocessor', 'analytics'), new lang_string('predictionsprocessor_help', 'analytics'),
\core_analytics\manager::default_mlbackend(), $predictors)
$settings->add(
new \core_analytics\admin_setting_predictor(
'analytics/predictionsprocessor',
new lang_string('defaultpredictionsprocessor', 'analytics'),
new lang_string('predictionsprocessor_help', 'analytics'),
\core_analytics\manager::default_mlbackend(),
$predictors,
)
);
// Warn if current processor is not configured.
// We are avoiding doing this check in write_config because it is likely the default
// mlbackend_python plugin is not configured and will output warnings during install.
$currentprocessor = get_config('analytics', 'predictionsprocessor');
if (!empty($currentprocessor)) {
$currentprocessor = new $currentprocessor;
$currentprocessorisready = $currentprocessor->is_ready();
if ($currentprocessorisready !== true) {
$settings->add(new admin_setting_description(
'processornotready',
'',
html_writer::tag('div', $currentprocessorisready, ['class' => 'alert alert-danger'])
));
}
}
// Log store.
$logmanager = get_log_manager();
+15
View File
@@ -65,6 +65,21 @@ if (($hassiteconfig || has_any_capability(array(
new lang_string('allowexternalbackpack', 'badges'),
new lang_string('allowexternalbackpack_desc', 'badges'), 1));
$defaultcanvasregions = [
'Australia|https://au.badgr.io|https://api.au.badgr.io/v2',
'Canada|https://ca.badgr.io|https://api.ca.badgr.io/v2',
'Europe|https://eu.badgr.io|https://api.eu.badgr.io/v2',
'Singapore|https://sg.badgr.io|https://api.sg.badgr.io/v2',
'United States|https://badgr.io|https://api.badgr.io/v2',
];
$globalsettings->add(new admin_setting_configtextarea(
'badges_canvasregions',
new lang_string('canvasregions', 'badges'),
new lang_string('canvasregions_desc', 'badges'),
implode("\n", $defaultcanvasregions),
PARAM_RAW,
));
$ADMIN->add('badges', $globalsettings);
$ADMIN->add('badges',
+8
View File
@@ -70,6 +70,14 @@ if ($hassiteconfig) {
$temp->add(new admin_setting_configtext('googlemapkey3', new lang_string('googlemapkey3', 'core_admin'),
new lang_string('googlemapkey3_help', 'core_admin'), '', PARAM_RAW, 60));
$temp->add(new admin_setting_configtext(
'geopluginapikey',
new lang_string('geopluginapikey', 'core_admin'),
new lang_string('geopluginapikey_desc', 'core_admin'),
'',
PARAM_TEXT,
));
}
$ADMIN->add('location', $temp);
@@ -0,0 +1,51 @@
{{!
This file is part of Moodle - http://moodle.org/
Moodle is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Moodle is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Moodle. If not, see <http://www.gnu.org/licenses/>.
}}
{{!
@template core_admin/settings_showhide
Passes the necessary data to show/hide dependant settings.
Context variables required for this template:
* dependencies - JSON-serialized data structure describing the dependencies between settings
Example context (json):
{
"dependencies": {
"s__setting1":{
"eq":[
[
"s__setting0"
]
]
},
"s__setting2":{
"eq":[
[
"s__setting1"
]
]
}
}
}
}}
<span id="settings-showhide-{{uniqid}}" data-dependencies="{{dependencies}}"></span>
{{#js}}
require(['core/showhidesettings'], function(ShowHideSettings) {
ShowHideSettings.init("settings-showhide-{{uniqid}}");
});
{{/js}}
+2 -1
View File
@@ -79,7 +79,7 @@ Feature: An administrator can browse user accounts
Scenario: Delete a user account
Given I navigate to "Users > Accounts > Browse list of users" in site administration
And I press "Delete" action in the "User One" report row
And I should see "Are you absolutely sure you want to completely delete the user User One" in the "Delete user" "dialogue"
And I should see "Are you sure you want to delete user User One" in the "Delete user" "dialogue"
And I click on "Delete" "button" in the "Delete user" "dialogue"
Then I should see "Deleted user User One"
And I should not see "User One" in the "reportbuilder-table" "table"
@@ -90,6 +90,7 @@ Feature: An administrator can browse user accounts
| username | firstname | lastname | email | confirmed |
| user3 | User | Three | three@example.com | 0 |
And I navigate to "Users > Accounts > Browse list of users" in site administration
And I change window size to "large"
Then I should see "Confirmation pending" in the "User Three" "table_row"
And I press "Resend confirmation email" action in the "User Three" report row
And I should see "Confirmation email sent successfully"
@@ -0,0 +1,17 @@
@core @core_admin
Feature: Toggle campaign banner visibility
In order to control the visibility of the campaign banner content
As an admin
I need to be able to disable the campaign banner display
Scenario Outline: Admin can disable the campaign banner display
Given the following config values are set as admin:
| showcampaigncontent | <showcampaigncontent> |
And I log in as "admin"
When I navigate to "Notifications" in site administration
Then "//iframe[@id='campaign-content']" "xpath_element" <display> exist
Examples:
| showcampaigncontent | display |
| true | should |
| false | should not |
+1 -1
View File
@@ -47,7 +47,7 @@ $table->head = array(
get_string('thirdpartylibrarylocation', 'core_admin'), get_string('license'));
$table->align = array('left', 'left', 'left', 'left');
$table->id = 'thirdpartylibs';
$table->attributes['class'] = 'admintable generaltable';
$table->attributes['class'] = 'admintable generaltable table table-hover';
$table->data = array();
foreach ($files as $component => $xmlpath) {
@@ -20,9 +20,9 @@ Feature: I can apply presets
And I navigate to "Plugins > Course formats > Manage course formats" in site administration
And "Disable" "icon" should exist in the "Social" "table_row"
And I navigate to "Plugins > Question behaviours > Manage question behaviours" in site administration
And "Enabled" "icon" should exist in the "Immediate feedback with CBM" "table_row"
And "Enabled" "link" should exist in the "Immediate feedback with CBM" "table_row"
And I navigate to "Plugins > Question types > Manage question types" in site administration
And "Enabled" "icon" should exist in the "Calculated multichoice" "table_row"
And "Enabled" "link" should exist in the "Calculated multichoice" "table_row"
When I navigate to "Site admin presets" in site administration
And I press "Review settings and apply" action in the "Starter" report row
And I should see "Setting changes"
@@ -111,9 +111,9 @@ Feature: I can apply presets
And I navigate to "Plugins > Course formats > Manage course formats" in site administration
And "Disable" "icon" should not exist in the "Social" "table_row"
And I navigate to "Plugins > Question behaviours > Manage question behaviours" in site administration
And "Enabled" "icon" should not exist in the "Immediate feedback with CBM" "table_row"
And "Enabled" "link" should not exist in the "Immediate feedback with CBM" "table_row"
And I navigate to "Plugins > Question types > Manage question types" in site administration
And "Enabled" "icon" should not exist in the "Calculated multichoice" "table_row"
And "Enabled" "link" should not exist in the "Calculated multichoice" "table_row"
Scenario: Re-applying Starter Moodle preset does not display setting changes
# Apply Starter preset.
@@ -27,9 +27,9 @@ Feature: I can revert changes after a load
And I navigate to "Plugins > Course formats > Manage course formats" in site administration
And "Disable" "icon" should not exist in the "Social" "table_row"
And I navigate to "Plugins > Question behaviours > Manage question behaviours" in site administration
And "Enabled" "icon" should not exist in the "Immediate feedback with CBM" "table_row"
And "Enabled" "link" should not exist in the "Immediate feedback with CBM" "table_row"
And I navigate to "Plugins > Question types > Manage question types" in site administration
And "Enabled" "icon" should not exist in the "Calculated multichoice" "table_row"
And "Enabled" "link" should not exist in the "Calculated multichoice" "table_row"
And I navigate to "Site admin presets" in site administration
And I press "Show version history" action in the "Starter" report row
When I click on "Restore this version" "link"
@@ -45,6 +45,6 @@ Feature: I can revert changes after a load
And I navigate to "Plugins > Course formats > Manage course formats" in site administration
And "Disable" "icon" should exist in the "Social" "table_row"
And I navigate to "Plugins > Question behaviours > Manage question behaviours" in site administration
And "Enabled" "icon" should exist in the "Immediate feedback with CBM" "table_row"
And "Enabled" "link" should exist in the "Immediate feedback with CBM" "table_row"
And I navigate to "Plugins > Question types > Manage question types" in site administration
And "Enabled" "icon" should exist in the "Calculated multichoice" "table_row"
And "Enabled" "link" should exist in the "Calculated multichoice" "table_row"
+8
View File
@@ -1,5 +1,13 @@
# tool_behat Upgrade notes
## 5.0.6+
### Added
- The `behat_session_trait::ensure_element_[does_not_]exists(...)` methods now accept optional `$container` parameter to define the parent node to look within
For more information see [MDL-75067](https://tracker.moodle.org/browse/MDL-75067)
## 5.0
### Added
+5 -1
View File
@@ -224,6 +224,11 @@ if (empty($parallelrun)) {
$cmds['singlerun'] = $runtestscommand;
echo "Running single behat site:" . PHP_EOL;
// The inner PHP process is not marked as having an interactive terminal even if it's passed
// through from this one which does, so we need to pass it through as an environment variable.
if (function_exists('posix_isatty') && posix_isatty(STDOUT)) {
putenv('MOODLE_BEHAT_RUNNING_IN_TTY=1');
}
passthru("php $runtestscommand", $status);
$exitcodes['singlerun'] = $status;
chdir($cwd);
@@ -525,4 +530,3 @@ function get_status_lines_from_run_op(Symfony\Component\Process\Process $process
return $statusstr;
}
@@ -153,14 +153,20 @@ abstract class base extends area_base {
*/
public static function get_edit_url(\stdClass $componentinfo): \moodle_url {
$questionid = $componentinfo->itemid;
$context = \context::instance_by_id($componentinfo->contextid);
$cmid = $context->instanceid;
// Question answers are editable on main question page.
// Hence, use refid for these links.
if ($componentinfo->tablename === 'question_answers') {
$questionid = $componentinfo->refid;
}
// Default to SITEID if courseid is null, i.e. system or category level questions.
$thiscourseid = ($componentinfo->courseid !== null) ? $componentinfo->courseid : SITEID;
return new \moodle_url('/question/bank/editquestion/question.php', ['courseid' => $thiscourseid, 'id' => $questionid]);
return new \moodle_url(
'/question/bank/editquestion/question.php',
[
'id' => $questionid,
'cmid' => $cmid,
]
);
}
/**
+1 -1
View File
@@ -140,7 +140,7 @@ function print_report_tree($contextid, $contexts, $allroles) {
// If there are any role overrides here, print them.
if (!empty($contexts[$contextid]->rolecapabilities)) {
$rowcounter = 0;
echo '<table class="generaltable table-striped"><tbody>';
echo '<table class="generaltable table-striped table table-hover"><tbody>';
foreach ($allroles as $role) {
if (isset($contexts[$contextid]->rolecapabilities[$role->id])) {
$permission = $contexts[$contextid]->rolecapabilities[$role->id];
+1 -1
View File
@@ -86,7 +86,7 @@ class tool_capability_renderer extends plugin_renderer_base {
}
$table = new html_table();
$table->attributes['class'] = 'comparisontable';
$table->attributes['class'] = 'comparisontable table-reboot';
$table->head = array('&nbsp;');
foreach ($roles as $role) {
$url = new moodle_url('/admin/roles/define.php', array('action' => 'view', 'roleid' => $role->id));
@@ -166,10 +166,12 @@ class provider implements
// Retrieve the tool_cohortroles records created for the user.
$sql = "SELECT cr.id as cohortroleid,
cr.cohortid,
c.name as cohortname,
c.idnumber as cohortidnumber,
c.description as cohortdescription,
c.contextid as contextid,
c.description,
c.descriptionformat,
c.contextid,
r.shortname as roleshortname,
cr.userid as userid,
cr.timecreated as timecreated,
@@ -185,27 +187,39 @@ class provider implements
$cohortroles = $DB->get_records_sql($sql, $params);
foreach ($cohortroles as $cohortrole) {
$context = \context::instance_by_id($cohortrole->contextid);
// The tool_cohortroles data export is organised in:
// {User Context}/Cohort roles management/{cohort name}/{role shortname}/data.json.
$subcontext = [
get_string('pluginname', 'tool_cohortroles'),
$cohortrole->cohortname,
format_string($cohortrole->cohortname, options: ['context' => $context]),
$cohortrole->roleshortname
];
$data = (object) [
'cohortname' => $cohortrole->cohortname,
'cohortname' => format_string($cohortrole->cohortname, options: ['context' => $context]),
'cohortidnumber' => $cohortrole->cohortidnumber,
'cohortdescription' => $cohortrole->cohortdescription,
'cohortdescription' => format_text(
writer::with_context($context)->rewrite_pluginfile_urls(
$subcontext,
'cohort',
'description',
$cohortrole->cohortid,
$cohortrole->description,
),
$cohortrole->descriptionformat,
['context' => $context],
),
'roleshortname' => $cohortrole->roleshortname,
'userid' => transform::user($cohortrole->userid),
'timecreated' => transform::datetime($cohortrole->timecreated),
'timemodified' => transform::datetime($cohortrole->timemodified)
];
$context = \context::instance_by_id($cohortrole->contextid);
writer::with_context($context)->export_data($subcontext, $data);
writer::with_context($context)
->export_area_files($subcontext, 'cohort', 'description', $cohortrole->cohortid)
->export_data($subcontext, $data);
}
}
@@ -39,7 +39,7 @@ The component output classes can render an action menu entirely in PHP. The step
The following code is a basic example of an action menu:
{{< php >}}
```php
/** @var core_renderer $output*/
$output = $PAGE->get_renderer('core');
@@ -54,11 +54,11 @@ $menu->add(new action_menu_link(
));
echo $output->render($menu);
{{< / php >}}
```
And this is the same example but passing the items in the creation:
{{< php >}}
```php
/** @var core_renderer $output*/
$output = $PAGE->get_renderer('core');
@@ -72,32 +72,64 @@ $menu = new action_menu([
]);
echo $output->render($menu);
{{< / php >}}
```
### Setup the menu trigger
By default, the action menu trigger is a cog icon. However, the class has methods to convert it to a kebab menu or even display any arbitrary content.
By default, the action menu trigger is a button that uses the `t/edit_menu` icon and is displayed with a caret. However, the class has methods to convert it to a kebab menu or even display any arbitrary content.
Example of a kebab menu:
#### Example of a kebab menu
{{< php >}}
```php
/** @var core_renderer $output*/
$output = $PAGE->get_renderer('core');
$menu = new action_menu();
$menu->set_kebab_trigger(get_string('edit'), $output);
$menu->set_additional_classes('fields-actions');
{{< / php >}}
```
Example of a custom trigger:
#### Customising the menu trigger
{{< php >}}
/** @var core_renderer $output*/
$output = $PAGE->get_renderer('core');
##### Trigger with a text label
```php
// This example displays an "Edit" label for the trigger.
$menu = new action_menu();
$menu->set_menu_trigger(get_string('edit'));
{{< / php >}}
```
##### Trigger with an icon
This example displays an icon for the trigger. When rendering the menu trigger button as an icon button, ensure that the icon is rendered as a decorative image. If you are using a `pix_icon`, pass an empty `$alt` parameter to make the icon decorative.
The accessible name of the icon button should be set within the button element itself. You can set an accessible name for the icon trigger button either by:
* Using the `::set_action_label()` method.
```php
$menu = new action_menu();
// Make sure the pix icon is rendered as a decorative image by passing an empty alt parameter.
$icon = $output->pix_icon('t/edit', '');
$menu->set_menu_trigger($icon);
$menu->set_action_label(get_string('edit'));
```
* Or alternatively, by adding a visually hidden text alongside the icon.
```php
$menu = new action_menu();
// Make sure the pix icon is rendered as a decorative image by passing an empty alt parameter.
$icon = $output->pix_icon('t/edit', '');
// Add a visually hidden text label for the trigger button.
$icon .= html_writer::span(get_string('edit'), 'visually-hidden');
$menu->set_menu_trigger($icon);
```
##### Removing the caret symbol
You may also remove the caret symbol by adding a `no-caret` class to the `triggerextraclasses` property.
```php
$menu->triggerextraclasses = 'no-caret';
```
### Add items
@@ -108,7 +140,7 @@ Secondary items: are displayed inside the action menu dropdown.
The item location must be configured before adding the element. The following example shows different ways to add primary and secondary menu items.
{{< php >}}
```php
// Primary items examples.
$menu->add(new action_menu_link(
new moodle_url($PAGE->url),
@@ -134,7 +166,7 @@ $menu->add(new action_menu_link_secondary(
new pix_icon('t/user', ''),
'Action link example',
));
{{< / php >}}
```
## Types of items
@@ -178,7 +210,7 @@ Construct params:
The following example creates a subpanel using a renderable choicelist instance:
{{< php >}}
```php
/** @var core_renderer $output*/
$output = $PAGE->get_renderer('core');
@@ -205,7 +237,7 @@ $menu->add(new core\output\local\action_menu\subpanel(
));
echo $output->render($menu);
{{< / php >}}
```
### HTML string
@@ -77,7 +77,7 @@ echo '<p><strong>Important note:</strong> actions menus are not prepared
to be displayed inside iframes. You may need to scroll to see the
action menu options.</p>';
echo $output->heading("Action menu default example", 4);
echo $output->heading("Action menu default example", 3);
$menu = new action_menu();
@@ -87,11 +87,11 @@ $menu->add($subpanel);
$menu->add($basicactionlink);
echo '<div class="border m-3 p-3 d-flex flex-row">';
echo '<div class="flex-fill">Example of default an action menu</div><div>';
echo '<div class="flex-fill">An action menu rendered without customisation</div><div>';
echo $OUTPUT->render($menu);
echo '</div></div>';
echo $output->heading("Kebab menu example", 4);
echo $output->heading("Kebab menu example", 3);
$menu = new action_menu();
$menu->set_kebab_trigger(get_string('edit'), $output);
@@ -106,11 +106,11 @@ $menu->add(new core\output\local\action_menu\subpanel(
$menu->add($basicactionlink);
echo '<div class="border m-3 p-3 d-flex flex-row">';
echo '<div class="flex-fill">Example of kebab menu</div><div>';
echo '<div class="flex-fill">An action menu with a kebab menu trigger button</div><div>';
echo $OUTPUT->render($menu);
echo '</div></div>';
echo $output->heading("Custom trigger menu example", 4);
echo $output->heading("Custom trigger menu examples", 3);
$menu = new action_menu();
$menu->set_menu_trigger(get_string('edit'));
@@ -124,11 +124,53 @@ $menu->add(new core\output\local\action_menu\subpanel(
$menu->add($basicactionlink);
echo '<div class="border m-3 p-3 d-flex flex-row">';
echo '<div class="flex-fill">Example of kebab menu</div><div>';
echo '<div class="flex-fill">An action menu with a menu trigger button with a custom text label</div><div>';
echo $OUTPUT->render($menu);
echo '</div></div>';
echo $output->heading("Primary actions menu example", 4);
$links = [
$basicactionlink,
$basicactionlink,
];
$moreicon = $OUTPUT->pix_icon('i/moremenu', '');
$editicon = $OUTPUT->pix_icon('t/edit', '');
$menu = new action_menu($links);
$menu->set_menu_trigger($moreicon);
$menu->set_action_label(get_string('moremenu'));
$menu->triggerattributes = [
'title' => get_string('moremenu'),
];
echo '<div class="border m-3 p-3 d-flex flex-row">';
echo '<div class="flex-fill">An action menu with only an icon for its custom menu trigger button</div>';
echo html_writer::div($OUTPUT->render($menu));
echo '</div>';
echo '<div class="border m-3 p-3 d-flex flex-row">';
echo '<div class="flex-fill">An action menu with only an icon for its custom menu trigger button with the caret removed</div>';
$menu->triggerextraclasses = 'no-caret';
echo html_writer::div($OUTPUT->render($menu));
echo '</div>';
$menu = new action_menu($links);
$menu->set_menu_trigger($editicon . ' ' . get_string('edit'));
echo '<div class="border m-3 p-3 d-flex flex-row">';
echo '<div class="flex-fill">An action menu with an icon and visible text for its custom menu trigger button</div>';
echo html_writer::div($OUTPUT->render($menu));
echo '</div>';
$menu = new action_menu($links);
$menu->set_menu_trigger($editicon . ' ' . html_writer::span(get_string('edit'), 'visually-hidden'));
echo '<div class="border m-3 p-3 d-flex flex-row">';
echo '<div class="flex-fill">An action menu with an icon and visually hidden text for its custom menu trigger button</div>';
echo html_writer::div($OUTPUT->render($menu));
echo '</div>';
echo $output->heading("Primary actions menu example", 3);
$menu = new action_menu();
$menu->set_menu_trigger(get_string('edit'));
@@ -162,7 +162,7 @@ class data_requests_table extends table_sql {
*/
public function col_userid($data) {
$user = $data->foruser;
return html_writer::link($user->profileurl, $user->fullname, ['title' => get_string('viewprofile')]);
return html_writer::link($user->profileurl, $user->fullname);
}
/**
@@ -183,7 +183,7 @@ class data_requests_table extends table_sql {
*/
public function col_requestedby($data) {
$user = $data->requestedbyuser;
return html_writer::link($user->profileurl, $user->fullname, ['title' => get_string('viewprofile')]);
return html_writer::link($user->profileurl, $user->fullname);
}
/**
@@ -138,7 +138,7 @@
}}>
<td>{{typename}}</td>
<td>{{#userdate}} {{timecreated}}, {{#str}} strftimedatetime, core_langconfig {{/str}} {{/userdate}}</td>
<td><a href="{{requestedbyuser.profileurl}}" title="{{#str}}viewprofile{{/str}}">{{requestedbyuser.fullname}}</a></td>
<td><a href="{{requestedbyuser.profileurl}}">{{requestedbyuser.fullname}}</a></td>
<td>
<span class="badge {{statuslabelclass}}" title="{{statuslabeltitle}}">{{statuslabel}}</span>
</td>
@@ -62,7 +62,7 @@
</div>
<div class="flex-grow-1 ms-3">
<h4 class="mt-0 mb-1">
<a href="{{foruser.profileurl}}" title="{{#str}}viewprofile{{/str}}">{{foruser.fullname}}</a>
<a href="{{foruser.profileurl}}">{{foruser.fullname}}</a>
</h4>
<a href="mailto:{{foruser.email}}">{{foruser.email}}</a>
<div class="clearfix mt-1 mb-1">
@@ -76,7 +76,7 @@
</span>
<span class="float-start me-1">
<strong>{{#str}}requestbydetail, tool_dataprivacy{{/str}}</strong>
<span><a href="{{requestedbyuser.profileurl}}" title="{{#str}}viewprofile{{/str}}">{{requestedbyuser.fullname}}</a></span>
<span><a href="{{requestedbyuser.profileurl}}">{{requestedbyuser.fullname}}</a></span>
</span>
</div>
{{#canreview}}
@@ -0,0 +1,100 @@
@tool @tool_dataprivacy
Feature: Authorized users can request others personal data
In order to export or access another users data
As a designated role
I need the correct permissions
Background:
Given the following "users" exist:
| username | firstname | lastname | email |
| user1 | User1 | One | user1@example.com |
| user2 | User2 | Two | user2@example.com |
| officer1 | Officer1 | One | officer1@example.com |
# Create Privacy Officer Role.
And the following "role" exists:
| shortname | privacyofficer |
| name | Privacy Officer |
| context_system | 1 |
| tool/dataprivacy:managedataregistry | allow |
| tool/dataprivacy:managedatarequests | allow |
| tool/dataprivacy:makedatarequestsforchildren | allow |
| moodle/site:configview | allow |
| moodle/category:viewhiddencategories | allow |
| moodle/course:viewhiddencourses | allow |
| moodle/course:viewhiddenactivities | allow |
| moodle/course:view | allow |
# Create Parent Role.
And the following "role" exists:
| shortname | parentrole |
| name | Parent Role |
| context_user | 1 |
| moodle/user:viewdetails | allow |
| moodle/user:viewalldetails | allow |
| moodle/user:readuserblogs | allow |
| moodle/user:readuserposts | allow |
| moodle/user:viewuseractivitiesreport | allow |
| moodle/user:editprofile | allow |
| tool/policy:acceptbehalf | allow |
| tool/dataprivacy:makedatarequestsforchildren | allow |
# Add permission to allow parent to make requests on behalf of child user.
And the following config values are set as admin:
| contactdataprotectionofficer | 1 | tool_dataprivacy |
And I log in as "admin"
@javascript
Scenario: Privacy officer can request for other user's personal data
Given I navigate to "Users > Permissions > Assign system roles" in site administration
# Assign Privacy Officer role to officer1.
And I follow "Privacy Officer"
And I set the field "addselect_searchtext" to "Officer1"
And I set the field "addselect" to "Officer1 One (officer1@example.com)"
And I press "Add"
# Navigate to home in order to navigate properly to Privacy settings.
And I am on site homepage
# Select Privacy officer in the Orivacy officer role mapping setting.
And I navigate to "Users > Privacy and policies > Privacy settings" in site administration
And I click on "Privacy Officer" "checkbox"
And I press "Save changes"
And I log in as "officer1"
And I navigate to "Users > Privacy and policies > Data requests" in site administration
# Create a new request as the designated privacy officer.
When I follow "New request"
And I set the field "User" to "User1 One"
And I set the field "Comment" to "User One data"
And I press "Save changes"
# Confirm that the new data request is successfully created for selected user with status "Awaiting approval".
Then the following should exist in the "generaltable" table:
| Type | User | Requested by | Status | Message |
| Export | User1 One | Officer1 One | Awaiting approval | User One data |
@javascript
Scenario: Parent user can request data on behalf of child user
Given I navigate to "Users > Accounts > Browse list of users" in site administration
And I follow "User1 One"
And I click on "Preferences" "link" in the ".profile_tree" "css_element"
# Assign user2 as parent for user1.
And I follow "Assign roles relative to this user"
And I follow "Parent"
And I set the field "Potential users" to "User2 Two (user2@example.com)"
And I click on "Add" "button" in the "#page-content" "css_element"
And I log in as "user2"
And I follow "Profile" in the user menu
And I follow "Data requests"
# As parent, create a data request for a child user.
And I follow "New request"
And I click on "User" "field"
When I type "User1 One"
# Confirm that only the parent's child users can be searched and selected.
Then I should see "User1 One"
And I type "User2 Two"
And I should see "No suggestions"
And I type "Officer1 One"
And I should see "No suggestions"
And I set the field "Search" to "User1"
And I set the field "Comment" to "This is a comment"
And I press "Save changes"
# Confirm that data request was successfully made by parent on behalf of child user.
And I should see "Your request has been submitted to the privacy officer"
And the following should exist in the "generaltable" table:
| Type | Requested by | Status | Message |
| Export all of my personal data (User1 One) | User2 Two | Awaiting approval | This is a comment |
+10
View File
@@ -0,0 +1,10 @@
define("tool_installaddon/footer",["exports","jquery","core_course/local/activitychooser/selectors"],(function(_exports,_jquery,_selectors){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}
/**
* Activity chooser footer handlers for tool_installaddon.
*
* @module tool_installaddon/footer
* @copyright 2026 Safat Shahin <safat.shahin@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.footerClickListener=void 0,_jquery=_interopRequireDefault(_jquery),_selectors=_interopRequireDefault(_selectors);_exports.footerClickListener=(e,footerData,modal)=>{const closeOption=e.target.closest(_selectors.default.actions.closeOption);if(!closeOption)return;const moduleName=closeOption.dataset.modname;if(!moduleName)return;const carousel=(0,_jquery.default)(modal.getBody()[0].querySelector(_selectors.default.regions.carousel));carousel.carousel("prev"),modal.setFooter(footerData.customfootertemplate),carousel.one("slid.bs.carousel",(()=>{const caller=modal.getBody()[0].querySelector(_selectors.default.regions.modules).querySelector(_selectors.default.regions.getModuleSelector(moduleName));caller&&caller.focus()}))}}));
//# sourceMappingURL=footer.min.js.map
@@ -0,0 +1 @@
{"version":3,"file":"footer.min.js","sources":["../src/footer.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Activity chooser footer handlers for tool_installaddon.\n *\n * @module tool_installaddon/footer\n * @copyright 2026 Safat Shahin <safat.shahin@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport selectors from 'core_course/local/activitychooser/selectors';\n\n/**\n * Handle clicks in the chooser footer when installaddon is the active footer plugin.\n *\n * @param {Event} e The event being triggered\n * @param {Object} footerData The footer data generated for the chooser\n * @param {Object} modal The chooser modal\n */\nexport const footerClickListener = (e, footerData, modal) => {\n const closeOption = e.target.closest(selectors.actions.closeOption);\n\n if (!closeOption) {\n return;\n }\n\n const moduleName = closeOption.dataset.modname;\n\n if (!moduleName) {\n return;\n }\n\n const carousel = $(modal.getBody()[0].querySelector(selectors.regions.carousel));\n\n // Trigger the transition between 'pages'.\n carousel.carousel('prev');\n modal.setFooter(footerData.customfootertemplate);\n carousel.one('slid.bs.carousel', () => {\n const allModules = modal.getBody()[0].querySelector(selectors.regions.modules);\n const caller = allModules.querySelector(selectors.regions.getModuleSelector(moduleName));\n if (caller) {\n caller.focus();\n }\n });\n};\n"],"names":["e","footerData","modal","closeOption","target","closest","selectors","actions","moduleName","dataset","modname","carousel","getBody","querySelector","regions","setFooter","customfootertemplate","one","caller","modules","getModuleSelector","focus"],"mappings":";;;;;;;oNAiCmC,CAACA,EAAGC,WAAYC,eACzCC,YAAcH,EAAEI,OAAOC,QAAQC,mBAAUC,QAAQJ,iBAElDA,yBAICK,WAAaL,YAAYM,QAAQC,YAElCF,wBAICG,UAAW,mBAAET,MAAMU,UAAU,GAAGC,cAAcP,mBAAUQ,QAAQH,WAGtEA,SAASA,SAAS,QAClBT,MAAMa,UAAUd,WAAWe,sBAC3BL,SAASM,IAAI,oBAAoB,WAEvBC,OADahB,MAAMU,UAAU,GAAGC,cAAcP,mBAAUQ,QAAQK,SAC5CN,cAAcP,mBAAUQ,QAAQM,kBAAkBZ,aACxEU,QACAA,OAAOG"}
+59
View File
@@ -0,0 +1,59 @@
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Activity chooser footer handlers for tool_installaddon.
*
* @module tool_installaddon/footer
* @copyright 2026 Safat Shahin <safat.shahin@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
import $ from 'jquery';
import selectors from 'core_course/local/activitychooser/selectors';
/**
* Handle clicks in the chooser footer when installaddon is the active footer plugin.
*
* @param {Event} e The event being triggered
* @param {Object} footerData The footer data generated for the chooser
* @param {Object} modal The chooser modal
*/
export const footerClickListener = (e, footerData, modal) => {
const closeOption = e.target.closest(selectors.actions.closeOption);
if (!closeOption) {
return;
}
const moduleName = closeOption.dataset.modname;
if (!moduleName) {
return;
}
const carousel = $(modal.getBody()[0].querySelector(selectors.regions.carousel));
// Trigger the transition between 'pages'.
carousel.carousel('prev');
modal.setFooter(footerData.customfootertemplate);
carousel.one('slid.bs.carousel', () => {
const allModules = modal.getBody()[0].querySelector(selectors.regions.modules);
const caller = allModules.querySelector(selectors.regions.getModuleSelector(moduleName));
if (caller) {
caller.focus();
}
});
};
@@ -70,6 +70,25 @@ class tool_installaddon_installer {
$url = 'https://moodle.org/plugins/get.php';
}
return $this->get_external_service_url($url);
}
/**
* Returns URL to Moodle Marketplace.
*
* @return moodle_url
*/
public function get_marketplace_url(): moodle_url {
return $this->get_external_service_url('https://marketplace.moodle.com/');
}
/**
* Returns URL to external service with optional encoded site information.
*
* @param string $url The external service base URL.
* @return moodle_url
*/
protected function get_external_service_url(string $url): moodle_url {
if (!$this->should_send_site_info()) {
return new moodle_url($url);
}
@@ -16,20 +16,23 @@
declare(strict_types=1);
namespace tool_moodlenet\task;
namespace tool_installaddon\task;
/**
* Ad-hoc task to perform post install tasks.
* We use this to set the active activity chooser footer plugin to tool_moodlenet.
* We use this to set the active activity chooser footer plugin to tool_installaddon.
* We couldn't do this directly in install.php, because there is an admin_apply_default_settings() call after all plugins are
* installed and that would reset whatever value we had set earlier to 'hidden'.
*
* @package tool_moodlenet
* @copyright 2022 Shamim Rezaie <shamim@moodle.com>
* @package tool_installaddon
* @copyright 2026 Safat Shahin <safat.shahin@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class post_install extends \core\task\adhoc_task {
public function execute() {
set_config('activitychooseractivefooter', 'tool_moodlenet');
/**
* Sets the active activity chooser footer plugin after install defaults are applied.
*/
public function execute(): void {
set_config('activitychooseractivefooter', 'tool_installaddon');
}
}
+37
View File
@@ -0,0 +1,37 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Install script for tool_installaddon.
*
* @package tool_installaddon
* @copyright 2026 Safat Shahin <safat.shahin@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* Perform the post-install procedures.
*/
function xmldb_tool_installaddon_install(): void {
// Use an ad-hoc task to set the active activity chooser footer plugin to tool_installaddon.
// We couldn't do this in admin/settings/courses.php for 2 reasons:
// - First, because it would be a breach of component communications principles to do so there.
// - Second, because we can't call get_plugins_with_function() during install and upgrade (or it will return []).
// We couldn't do this directly here either, because there is an admin_apply_default_settings() call after all plugins are
// installed and that would reset whatever value we set here to 'hidden'.
$postinstall = new tool_installaddon\task\post_install();
core\task\manager::queue_adhoc_task($postinstall);
}
+41
View File
@@ -0,0 +1,41 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Upgrade script for tool_installaddon.
*
* @package tool_installaddon
* @copyright 2026 Safat Shahin <safat.shahin@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* Upgrade the plugin.
*
* @param int $oldversion
* @return bool always true
*/
function xmldb_tool_installaddon_upgrade(int $oldversion): bool {
if ($oldversion < 2025041401) {
// Set the activity chooser active footer to include marketplace regardless of the previous setting.
// We are deliberately setting this to increase awareness of marketplace.
set_config('activitychooseractivefooter', 'tool_installaddon');
upgrade_plugin_savepoint(true, 2025041401, 'tool', 'installaddon');
}
return true;
}
@@ -28,6 +28,7 @@ defined('MOODLE_INTERNAL') || die();
$string['acknowledgement'] = 'Acknowledgement';
$string['acknowledgementtext'] = 'I understand that it is my responsibility to have full backups of this site prior to installing additional plugins. I accept and understand that plugins (especially but not only those originating in unofficial sources) may contain security holes, can make the site unavailable, or cause private data leaks or loss.';
$string['activitychooserfootertext'] = 'Browse more activities on';
$string['featuredisabled'] = 'The plugin installer is disabled on this site.';
$string['installaddon'] = 'Install plugin!';
$string['installaddons'] = 'Install plugins';
@@ -44,6 +45,8 @@ $string['installfromzipsubmit'] = 'Install plugin from the ZIP file';
$string['installfromziptype'] = 'Plugin type';
$string['installfromziptype_help'] = 'For plugins that correctly declare their component name, the installer is able to detect the plugin type automatically. If the auto-detection fails, choose the correct type of plugin manually. Warning: The installation procedure can fail badly if an incorrect plugin type is specified.';
$string['installfromziptype_link'] = 'Development:Plugins';
$string['marketplaceadminlinktext'] = 'Browse new plugins';
$string['marketplacelink'] = 'Moodle Marketplace';
$string['permcheck'] = 'Make sure the plugin type root location is writable by the web server process.';
$string['permcheckerror'] = 'Error while checking for write permission';
$string['permcheckprogress'] = 'Checking for write permission ...';
+48
View File
@@ -0,0 +1,48 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Public API for tool_installaddon.
*
* @package tool_installaddon
* @copyright 2026 Safat Shahin <safat.shahin@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use core_course\local\entity\activity_chooser_footer;
/**
* Build activity chooser footer content for Marketplace.
*
* @param int $courseid The selected course id.
* @param int $sectionid The selected section id.
* @return activity_chooser_footer
*/
function tool_installaddon_custom_chooser_footer(int $courseid, int $sectionid): activity_chooser_footer {
global $OUTPUT;
$installer = tool_installaddon_installer::instance();
$marketplaceurl = $installer->get_marketplace_url();
$renderedfooter = $OUTPUT->render_from_template('tool_installaddon/chooser_footer', [
'url' => $marketplaceurl->out(false),
]);
return new activity_chooser_footer(
'tool_installaddon/footer',
$renderedfooter
);
}
+6
View File
@@ -26,6 +26,12 @@
defined('MOODLE_INTERNAL') || die();
if ($hassiteconfig and empty($CFG->disableupdateautodeploy)) {
$installer = tool_installaddon_installer::instance();
$ADMIN->add('modules', new admin_externalpage(
'tool_installaddon_marketplace',
get_string('marketplaceadminlinktext', 'tool_installaddon'),
$installer->get_marketplace_url()->out(false)
), 'modsettings');
$ADMIN->add('modules', new admin_externalpage('tool_installaddon_index',
get_string('installaddons', 'tool_installaddon'),
@@ -0,0 +1,30 @@
{{!
This file is part of Moodle - http://moodle.org/
Moodle is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Moodle is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Moodle. If not, see <http://www.gnu.org/licenses/>.
}}
{{!
@template tool_installaddon/chooser_footer
Activity chooser footer link to Marketplace.
Example context (json):
{
"url": "https://marketplace.moodle.com/?site=hash"
}
}}
<div class="w-100 d-flex px-2">
<span class="my-auto me-1">{{#str}} activitychooserfootertext, tool_installaddon {{/str}}</span>
{{> tool_installaddon/marketplace_link }}
</div>
@@ -0,0 +1,36 @@
{{!
This file is part of Moodle - http://moodle.org/
Moodle is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Moodle is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Moodle. If not, see <http://www.gnu.org/licenses/>.
}}
{{!
@template tool_installaddon/marketplace_link
Reusable link to Moodle Marketplace.
Example context (json):
{
"url": "https://marketplace.moodle.com/?site=hash"
}
}}
<a class="d-inline my-auto" href="{{url}}" target="_blank" rel="noopener noreferrer">
{{#str}} marketplacelink, tool_installaddon {{/str}}
<i
class="fa fa-external-link"
role="img"
aria-label="{{#str}} opensinnewwindow, core {{/str}}"
title="{{#str}} opensinnewwindow, core {{/str}}"
>
</i>
</a>
@@ -0,0 +1,37 @@
@tool @tool_installaddon @javascript
Feature: Marketplace activity chooser footer
In order to browse plugins from the activity chooser
As a teacher
I need to see the Marketplace footer link when installaddon is the active footer plugin
Background:
Given the following config values are set as admin:
| activitychooseractivefooter | tool_installaddon |
And the following "users" exist:
| username | firstname | lastname | email |
| teacher1 | Teacher | 1 | teacher1@example.com |
And the following "courses" exist:
| fullname | shortname | category | format |
| Course 1 | C1 | 0 | topics |
And the following "course enrolments" exist:
| user | course | role |
| teacher1 | C1 | editingteacher |
Scenario: Activity chooser footer includes Marketplace link
Given I log in as "teacher1"
When I am on "Course 1" course homepage with editing mode on
And I open the activity chooser
Then "Browse more activities on" "text" should exist in the "Add an activity or resource" "dialogue"
And "Marketplace" "link" should exist in the "Add an activity or resource" "dialogue"
Scenario: Back button works from activity help when the Marketplace footer is active
Given I log in as "teacher1"
When I am on "Course 1" course homepage with editing mode on
And I open the activity chooser
And I click on "Information about the Assignment activity" "button" in the "Add an activity or resource" "dialogue"
Then "help" "core_course > Activity chooser screen" should be visible
When I click on "Back" "button" in the "Add an activity or resource" "dialogue"
Then "modules" "core_course > Activity chooser screen" should be visible
And "help" "core_course > Activity chooser screen" should not be visible
And "Marketplace" "link" should exist in the "Add an activity or resource" "dialogue"
And "Back" "button" should not exist in the "Add an activity or resource" "dialogue"
@@ -0,0 +1,46 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Provides a mock testable_tool_installaddon_installer_without_site_info class.
*
* @package tool_installaddon
* @subpackage fixtures
* @category test
* @copyright 2026 Safat Shahin <safat.shahin@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
require_once(__DIR__ . '/testable_installer.php');
/**
* Testable subclass with site-info sharing disabled.
*
* @copyright 2026 Safat Shahin <safat.shahin@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class testable_tool_installaddon_installer_without_site_info extends testable_tool_installaddon_installer {
/**
* Disable site info sharing.
*
* @return bool
*/
protected function should_send_site_info() {
return false;
}
}
@@ -18,12 +18,14 @@
namespace tool_installaddon;
use testable_tool_installaddon_installer;
use testable_tool_installaddon_installer_without_site_info;
use tool_installaddon_installer;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once(__DIR__.'/fixtures/testable_installer.php');
require_once(__DIR__ . '/fixtures/testable_installer.php');
require_once(__DIR__ . '/fixtures/testable_installer_without_site_info.php');
/**
* Unit tests for the {@link tool_installaddon_installer} class
@@ -32,16 +34,14 @@ require_once(__DIR__.'/fixtures/testable_installer.php');
* @category test
* @copyright 2013 David Mudrak <david@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @covers \tool_installaddon_installer
*/
final class installer_test extends \advanced_testcase {
public function test_get_addons_repository_url(): void {
$installer = testable_tool_installaddon_installer::instance();
$url = $installer->get_addons_repository_url();
$query = parse_url($url, PHP_URL_QUERY);
$this->assertEquals(1, preg_match('~^site=(.+)$~', $query, $matches));
$site = rawurldecode($matches[1]);
$site = json_decode(base64_decode($site), true);
$site = $this->decode_site_info_from_url($url);
$this->assertIsArray($site);
$this->assertEquals(3, count($site));
$this->assertSame('Nasty site', $site['fullname']);
@@ -49,6 +49,34 @@ final class installer_test extends \advanced_testcase {
$this->assertSame("2.5'; DROP TABLE mdl_user; --", $site['majorversion']);
}
/**
* Tests that marketplace URL includes expected host, scheme and site payload.
*/
public function test_get_marketplace_url(): void {
$installer = testable_tool_installaddon_installer::instance();
$addonsurl = $installer->get_addons_repository_url();
$marketplaceurl = $installer->get_marketplace_url();
$this->assertSame('marketplace.moodle.com', parse_url($marketplaceurl, PHP_URL_HOST));
$this->assertSame('https', parse_url($marketplaceurl, PHP_URL_SCHEME));
$this->assertSame(
$this->decode_site_info_from_url($addonsurl),
$this->decode_site_info_from_url($marketplaceurl),
);
}
/**
* Tests that marketplace URL has no query string when site info is unavailable.
*/
public function test_get_marketplace_url_without_site_info(): void {
$installer = testable_tool_installaddon_installer_without_site_info::instance();
$marketplaceurl = $installer->get_marketplace_url();
$this->assertSame('marketplace.moodle.com', parse_url($marketplaceurl, PHP_URL_HOST));
$this->assertSame('https', parse_url($marketplaceurl, PHP_URL_SCHEME));
$this->assertEmpty(parse_url($marketplaceurl, PHP_URL_QUERY));
}
public function test_decode_remote_request(): void {
$installer = testable_tool_installaddon_installer::instance();
@@ -132,7 +160,7 @@ $plugin->version = 2014121300;
$versionphp = file_get_contents($fixtures.'/github/moodle-repository_mahara-master/version.php');
$this->assertEquals('repository_mahara', $installer->testable_detect_plugin_component_from_versionphp($versionphp));
$versionphp = file_get_contents($fixtures.'/nocomponent/baz/version.php');
$versionphp = file_get_contents($fixtures . '/nocomponent/baz/version.php');
$this->assertFalse($installer->testable_detect_plugin_component_from_versionphp($versionphp));
}
@@ -143,15 +171,28 @@ $plugin->version = 2014121300;
$storage1 = $installer->make_installfromzip_storage();
$this->assertTrue(is_dir($storage1));
$this->assertTrue(is_writable($storage1));
file_put_contents($storage1.'/hello.txt', 'Find me if you can!');
file_put_contents($storage1 . '/hello.txt', 'Find me if you can!');
// Check we get unique directory on each call.
$storage2 = $installer->make_installfromzip_storage();
$this->assertTrue(is_dir($storage2));
$this->assertTrue(is_writable($storage2));
$this->assertFalse(file_exists($storage2.'/hello.txt'));
$this->assertFalse(file_exists($storage2 . '/hello.txt'));
// Check both are in the same parent directory.
$this->assertEquals(dirname($storage1), dirname($storage2));
}
/**
* Decodes the encoded 'site' URL query parameter.
*
* @param moodle_url $url
* @return array
*/
private function decode_site_info_from_url(\moodle_url $url): array {
$query = parse_url($url, PHP_URL_QUERY);
$this->assertEquals(1, preg_match('~^site=(.+)$~', $query, $matches));
$site = rawurldecode($matches[1]);
return json_decode(base64_decode($site), true);
}
}
@@ -0,0 +1,53 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Unit tests for tool_installaddon lib.
*
* @package tool_installaddon
* @copyright 2026 Safat Shahin <safat.shahin@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_installaddon;
use core_course\local\entity\activity_chooser_footer;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot . '/admin/tool/installaddon/lib.php');
/**
* Test installaddon lib functions.
*/
final class lib_test extends \advanced_testcase {
/**
* Tests chooser footer generation for marketplace link content.
*
* @covers ::tool_installaddon_custom_chooser_footer
*/
public function test_tool_installaddon_custom_chooser_footer(): void {
$this->resetAfterTest();
$footer = \tool_installaddon_custom_chooser_footer(1, 1);
$this->assertInstanceOf(activity_chooser_footer::class, $footer);
$this->assertSame('tool_installaddon/footer', $footer->get_footer_js_file());
$this->assertStringContainsString('https://marketplace.moodle.com/', $footer->get_footer_template());
$this->assertStringContainsString('site=', $footer->get_footer_template());
}
}
@@ -0,0 +1,47 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
declare(strict_types=1);
namespace tool_installaddon\task;
/**
* Unit tests for the post install task.
*
* @package tool_installaddon
* @category test
* @copyright 2026 Safat Shahin <safat.shahin@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @covers \tool_installaddon\task\post_install
*/
final class post_install_test extends \advanced_testcase {
/**
* Tests that the task sets the activity chooser footer plugin to tool_installaddon.
*/
public function test_execute_sets_activitychooseractivefooter_config(): void {
$this->resetAfterTest();
set_config('activitychooseractivefooter', 'hidden');
$task = new post_install();
$task->execute();
$this->assertSame(
'tool_installaddon',
get_config('core', 'activitychooseractivefooter'),
);
}
}
+1 -1
View File
@@ -24,6 +24,6 @@
defined('MOODLE_INTERNAL') || die();
$plugin->component = 'tool_installaddon';
$plugin->version = 2025041400;
$plugin->version = 2025041401;
$plugin->requires = 2025040800;
$plugin->maturity = MATURITY_STABLE;
@@ -80,7 +80,7 @@ class table implements \renderable {
'text-center',
];
$table->id = 'manage-licenses';
$table->attributes['class'] = 'admintable generaltable';
$table->attributes['class'] = 'admintable generaltable table table-hover';
$table->data = [];
$rownumber = 0;
@@ -137,7 +137,7 @@ class tool_log_setting_managestores extends admin_setting {
$table->colclasses = array('leftalign', 'centeralign', 'centeralign', 'centeralign', 'centeralign', 'centeralign',
'centeralign');
$table->id = 'logstoreplugins';
$table->attributes['class'] = 'admintable generaltable';
$table->attributes['class'] = 'admintable generaltable table table-hover';
$table->data = array();
// Iterate through store plugins and add to the display table.
@@ -28,10 +28,12 @@ use renderable;
use templatable;
use renderer_base;
use single_button;
use action_link;
use stdClass;
use moodle_url;
use context;
use context_system;
use core\output\local\properties\button;
use core_competency\api;
use core_competency\competency_framework;
use core_competency\external\competency_framework_exporter;
@@ -65,6 +67,8 @@ class manage_competency_frameworks_page implements renderable, templatable {
* @param context $pagecontext The page context
*/
public function __construct(context $pagecontext) {
global $OUTPUT;
$this->pagecontext = $pagecontext;
if (competency_framework::can_manage_context($this->pagecontext)) {
@@ -74,10 +78,13 @@ class manage_competency_frameworks_page implements renderable, templatable {
'get'
);
$this->navigation[] = $addpage;
$competenciesrepository = new single_button(
$icon = $OUTPUT->pix_icon('i/externallink', get_string('opensinnewwindow'), 'moodle', ['class' => 'ms-1']);
$competenciesrepository = new action_link(
new moodle_url('https://moodle.net/search', ['q' => 'competency frameworks']),
get_string('competencyframeworksrepository', 'tool_lp'),
'get'
get_string('competencyframeworksrepository', 'tool_lp') . $icon,
null,
['target' => '_blank', 'class' => button::SECONDARY->classes() . ' ms-sm-2'],
);
$this->navigation[] = $competenciesrepository;
}
@@ -49,7 +49,7 @@
}
}}
<span>
<a href="{{profileurl}}" title="{{#str}}viewprofile{{/str}}">
<a href="{{profileurl}}">
<img height="18" src="{{profileimageurlsmall}}" alt="">
<span>{{fullname}}</span>
{{#hasidentity}}
@@ -0,0 +1,77 @@
@tool @tool_lp @tool_lp_framework
Feature: Manage CRUD operations for competencies
In order to perform CRUD operations on competencies
As a manager
I need to be able to create, read, update and delete competencies
Background:
Given the following "core_competency > frameworks" exist:
| shortname | idnumber |
| CF1 | CF1 |
And the following "core_competency > competencies" exist:
| shortname | competencyframework | idnumber | description |
| C1 | CF1 | C1ID | C1 description |
And I log in as "admin"
And I navigate to "Competencies > Competency frameworks" in site administration
And I click on "CF1 (CF1)" "link"
@javascript
Scenario: Create a new competency
# Targets the `CF1` element to make `Add competency` button visible and accessible to avoid ambiguity with the other 'CF1' element on the screen.
Given I click on "//span[text()='CF1']" "xpath_element"
When I press "Add competency"
And I set the field "Name" to "C2"
And I set the field "Description" to "C2 description"
And I set the field "ID number" to "C2ID"
And I press "Save changes"
# Access the newly created competencies to ensure that correct information was registered.
Then "Competency created" "text" should exist
And "C2" "text" should appear after "C1" "text"
And I select "C2" of the competency tree
And "C2ID" "text" should exist
And "C2 description" "text" should exist
@javascript
Scenario: Read a competency
When I select "C1" of the competency tree
# Confirm that selected competency info displayed matches registered info.
Then "C1ID" "text" should exist
And "C1 description" "text" should exist
# Targets the unique 'Edit' link needed to open the menu, avoiding ambiguity with the other 'Edit' link.
And I click on "//a[@href='#' and text()='Edit']" "xpath_element"
# Similar to the previous step, to avoid ambiguity with the competency framework "Edit", target css element with data-action=edit.
And I click on "[data-action=edit]" "css_element"
# Confirm that the details displayed when accessing edit screen values match registered data.
And the field "Name" matches value "C1"
And the field "Description" matches value "C1 description"
And the field "ID number" matches value "C1ID"
@javascript
Scenario: Update a competency
Given I select "C1" of the competency tree
# Targets the unique 'Edit' link needed to open the menu, avoiding ambiguity with the other 'Edit' link.
And I click on "//a[@href='#' and text()='Edit']" "xpath_element"
# Similar to the previous step, to avoid ambiguity with the competency framework "Edit", target css element with data-action=edit.
When I click on "[data-action=edit]" "css_element"
And I set the field "Name" to "C2"
And I set the field "Description" to "C2 description"
And I set the field "ID number" to "C2ID"
And I press "Save changes"
Then "Competency updated" "text" should exist
And "C1" "text" should not exist
And "C2" "text" should exist
And I select "C2" of the competency tree
And "C2ID" "text" should exist
And "C1ID" "text" should not exist
And "C2 description" "text" should exist
And "C1 description" "text" should not exist
@javascript
Scenario: Delete a competency
Given I select "C1" of the competency tree
# Targets the unique 'Edit' link needed to open the menu, avoiding ambiguity with the other 'Edit' link.
And I click on "//a[@href='#' and text()='Edit']" "xpath_element"
When I click on "Delete" "link"
And I click on "Delete" "button" in the "Confirm" "dialogue"
# Confirm that "C1" competency was successfully deleted.
Then "C1" "text" should not exist
@@ -0,0 +1,63 @@
@tool @tool_lp @tool_lp_framework
Feature: Move and cross-reference competencies
In order to move and cross-reference competencies
As a manager
I need to be open the competency's menu items.
Background:
Given the following "core_competency > frameworks" exist:
| shortname | idnumber |
| CF1 | CF1 |
And the following "core_competency > competencies" exist:
| shortname | competencyframework |
| C1 | CF1 |
| C2 | CF1 |
| C3 | CF1 |
| C4 | CF1 |
And I log in as "admin"
And I navigate to "Competencies > Competency frameworks" in site administration
And I click on "CF1 (CF1)" "link"
@javascript
Scenario: Move a competency using Move up/Move down menu items
Given I select "C1" of the competency tree
# Targets the unique 'Edit' link needed to open the menu, avoiding ambiguity with the other 'Edit' link.
And I click on "//a[@href='#' and text()='Edit']" "xpath_element"
When I click on "Move down" "link"
Then "C1" "text" should appear after "C2" "text"
# Targets the unique 'Edit' link needed to open the menu, avoiding ambiguity with the other 'Edit' link.
And I click on "//a[@href='#' and text()='Edit']" "xpath_element"
And I click on "Move up" "link"
And "C1" "text" should appear before "C2" "text"
@javascript
Scenario: Move a competency using Relocate menu item
Given I select "C3" of the competency tree
# Targets the unique 'Edit' link needed to open the menu, avoiding ambiguity with the other 'Edit' link.
And I click on "//a[@href='#' and text()='Edit']" "xpath_element"
When I click on "Relocate" "link"
And I click on "C1" "text" in the "Move competency" "dialogue"
And I click on "Move" "button" in the "Move competency" "dialogue"
Then "C1" "text" should appear before "C3" "text"
And "C3" "text" should appear before "C2" "text"
And I select "C3" of the competency tree
# Targets the unique 'Edit' link needed to open the menu, avoiding ambiguity with the other 'Edit' link.
And I click on "//a[@href='#' and text()='Edit']" "xpath_element"
# Similar to the previous step, to avoid ambiguity with the competency framework "Edit", target css element with data-action=edit.
And I click on "[data-action=edit]" "css_element"
And "C1" "text" should exist
And "No parent (top-level competency)" "text" should not exist
And I press "Cancel"
And "C1" "text" should appear before "C3" "text"
And "C3" "text" should appear before "C2" "text"
@javascript
Scenario: Cross-reference a competency
Given I select "C1" of the competency tree
# Targets the unique 'Edit' link needed to open the menu, avoiding ambiguity with the other 'Edit' link.
And I click on "//a[@href='#' and text()='Edit']" "xpath_element"
When I click on "Add cross-referenced competency" "link"
And I click on "C2" "text" in the "Competency picker" "dialogue"
And I click on "Add" "button" in the "Competency picker" "dialogue"
Then "Cross-referenced competencies:" "text" should exist
And I should see "C2 cmp2"
+71 -23
View File
@@ -16,16 +16,10 @@ Feature: Manage plan workflow
| usermanageownplan | User manage own plan role | user |
| manageplan | Manager all plans role | manager |
And the following "role capabilities" exist:
| role | moodle/competency:planmanageowndraft | moodle/competency:planmanageown |
| usermanageowndraftplan | allow | |
| usermanageownplan | allow | allow |
| manageplan | allow | allow |
And the following "role capability" exists:
| role | manageplan |
| moodle/competency:planmanage | allow |
| moodle/competency:planview | allow |
| moodle/competency:planreview | allow |
| moodle/competency:planrequestreview | allow |
| role | moodle/competency:planmanageowndraft | moodle/competency:planmanageown | moodle/competency:planmanage | moodle/competency:planview | moodle/competency:planreview | moodle/competency:planrequestreview |
| usermanageowndraftplan | allow | | | | | |
| usermanageownplan | allow | allow | | | | |
| manageplan | allow | allow | allow | allow | allow | allow |
And the following "role assigns" exist:
| user | role | contextlevel | reference |
| user1 | usermanageowndraftplan | System | |
@@ -53,8 +47,7 @@ Feature: Manage plan workflow
| lp | System | 1 | my-index | content |
Scenario: User can manages his own plan draft
Given I log in as "user1"
And I follow "Profile" in the user menu
Given I am on the "user1" "user > profile" page logged in as user1
When I follow "Learning plans"
Then I should see "List of learning plans"
And I should see "Test-Plan1"
@@ -63,11 +56,9 @@ Feature: Manage plan workflow
And I should see "Waiting for review"
And I click on "Cancel review" of edit menu in the "Test-Plan1" row
And I should see "Draft"
And I log out
Scenario: User can manages his own plan
Given I log in as "user2"
And I follow "Profile" in the user menu
Given I am on the "user2" "user > profile" page logged in as user2
When I follow "Learning plans"
Then I should see "List of learning plans"
And I should see "Test-Plan2"
@@ -82,11 +73,11 @@ Feature: Manage plan workflow
And I should see "Active"
And I click on "Complete this learning plan" of edit menu in the "Test-Plan2" row
And I click on "Complete this learning plan" "button" in the "Confirm" "dialogue"
And I wait until the page is ready
And I should see "Complete"
And I click on "Reopen this learning plan" of edit menu in the "Test-Plan2" row
And I click on "Reopen this learning plan" "button" in the "Confirm" "dialogue"
And I should see "Active"
And I log out
Scenario: Manager can see learning plan with status waiting for review
Given the following "core_competency > plans" exist:
@@ -96,7 +87,6 @@ Feature: Manage plan workflow
When I log in as "manager1"
Then I should see "Test-Plan3"
And I should not see "Test-Plan4"
And I log out
Scenario: Manager can start review of learning plan with status waiting for review
Given the following "core_competency > plans" exist:
@@ -108,7 +98,6 @@ Feature: Manage plan workflow
And I should see "Test-Plan3"
When I follow "Start review"
Then I should see "In review"
And I log out
Scenario: Manager can reject a learning plan with status in review
Given the following "core_competency > plans" exist:
@@ -121,7 +110,6 @@ Feature: Manage plan workflow
And I should see "In review"
When I follow "Finish review"
Then I should see "Draft"
And I log out
Scenario: Manager can accept a learning plan with status in review
Given the following "core_competency > plans" exist:
@@ -134,7 +122,6 @@ Feature: Manage plan workflow
And I should see "In review"
When I follow "Make active"
Then I should see "Active"
And I log out
Scenario: Manager send back to draft an active learning plan
Given the following "core_competency > plans" exist:
@@ -150,7 +137,6 @@ Feature: Manage plan workflow
And I follow "Learning plans"
Then I should see "Draft"
And I should not see "Active"
And I log out
Scenario: Manager change an active learning plan to completed
Given the following "core_competency > plans" exist:
@@ -169,7 +155,6 @@ Feature: Manage plan workflow
And I follow "Learning plans"
Then I should see "Complete"
And I should not see "Active"
And I log out
Scenario: Manager reopen a complete learning plan
Given the following "core_competency > plans" exist:
@@ -187,4 +172,67 @@ Feature: Manage plan workflow
And I follow "Learning plans"
Then I should see "Active"
And I should not see "Complete"
And I log out
Scenario: Student learning plan derived from templates can be completed
Given the following "core_competency > templates" exist:
| shortname |
| LPT1 |
And the following "core_competency > template_competencies" exist:
| template | competency |
| LPT1 | Test-Comp1 |
And I log in as "admin"
And I navigate to "Competencies > Learning plan templates" in site administration
# Select 1 user to assign to create learning plans for using template.
And I click on ".template-userplans" "css_element" in the "LPT1" "table_row"
And I set the field "Select users" to "user1"
And I press "Create learning plans"
And I click on "LPT1" "link" in the "LPT1" "table_row"
When I click on "Complete this learning plan" "link"
And I click on "Complete this learning plan" "button" in the "Confirm" "dialogue"
# Add a short wait to ensure the page has loaded before checking that "Complete" "text" exists.
And I wait until the page is ready
# Confirm that student's learning plan template is marked as Completed.
Then "Complete" "text" should exist
And "Reopen this learning plan" "link" should exist
Scenario: Learning plan template updates are not reflected on plans already completed
Given the following "core_competency > templates" exist:
| shortname |
| LPT1 |
And the following "core_competency > template_competencies" exist:
| template | competency |
| LPT1 | Test-Comp1 |
And I log in as "admin"
And I navigate to "Competencies > Learning plan templates" in site administration
# Select 2 users to assign to create learning plans for using template.
And I click on ".template-userplans" "css_element" in the "LPT1" "table_row"
And I set the field "Select users" to "user1"
And I press "Create learning plans"
And I set the field "Select users" to "user2"
And I press "Create learning plans"
# Complete the learning plan for User 1.
And I click on "LPT1" "link" in the "User 1" "table_row"
And I click on "Complete this learning plan" "link"
And I click on "Complete this learning plan" "button" in the "Confirm" "dialogue"
# Add another competency to the learning plan template.
And the following "core_competency > template_competencies" exist:
| template | competency |
| LPT1 | Test-Comp2 |
# Navigate back to the list of Learning plan templates in order to access User 1's learning plan.
And I navigate to "Competencies > Learning plan templates" in site administration
And I click on ".template-userplans" "css_element" in the "LPT1" "table_row"
# Confirm that only the first competency is reflected on User 1's learning plan since it's already completed.
When I click on "LPT1" "link" in the "User 1" "table_row"
Then "Test-Comp2" "link" should not exist
And "Test-Comp2" "text" should not exist
And "Test-Comp1" "link" should exist
And "Test-Comp1" "text" should exist
# Navigate back to list of Learning plan templates in order to access User 2's learning plan.
And I navigate to "Competencies > Learning plan templates" in site administration
And I click on ".template-userplans" "css_element" in the "LPT1" "table_row"
# Confirm that both competencies are reflected on User 2's learning plan since it's not yet completed.
And I click on "LPT1" "link" in the "User 2" "table_row"
And "Test-Comp2" "link" should exist
And "Test-Comp2" "text" should exist
And "Test-Comp1" "link" should exist
And "Test-Comp1" "text" should exist
@@ -0,0 +1,60 @@
@tool @tool_lp @core_cohort
Feature: Cohorts can be synchronized with learning plans
In order to create learning plans for cohort members
As an admin
I need to be able to synchronise cohorts with learning plans
Background:
Given the following "users" exist:
| username | firstname | lastname | email |
| user1 | User | One | user1@example.com |
| user2 | User | Two | user2@example.com |
And the following "cohorts" exist:
| name | idnumber |
| Cohort 1 | CH1 |
And the following "cohort members" exist:
| user | cohort |
| user1 | CH1 |
| user2 | CH1 |
And the following "core_competency > frameworks" exist:
| shortname | idnumber |
| CF1 | CF1 |
And the following "core_competency > competencies" exist:
| shortname | competencyframework | idnumber |
| C1 | CF1 | C1 |
And the following "core_competency > templates" exist:
| shortname |
| LPT1 |
And the following "core_competency > template_competencies" exist:
| template | competency |
| LPT1 | C1 |
@javascript
Scenario: Cohorts can be synchronised with learning plans
Given I log in as "admin"
# Navigate to the list of learning plan templates in order to add cohorts.
And I navigate to "Competencies > Learning plan templates" in site administration
When I click on "Add cohorts to sync" of edit menu in the "LPT1" row
And I set the field "Select cohorts to sync" to "Cohort 1"
And I press "Add cohorts"
And I wait until the page is ready
# Confirm that 2 learning plans were created for members of the cohort.
Then "2 learning plans were created" "text" should exist
# Confirm current screen is still "Cohorts synced to this learning plan template screen"
And "Cohorts synced to this learning plan template" "text" should exist
# Confirm that the cohort is now added to the learning plan template.
And the following should exist in the "generaltable" table:
| Name | Cohort ID |
| Cohort 1 | CH1 |
# Navigate back to the list of learning plan templates to view updated list.
And I navigate to "Competencies > Learning plan templates" in site administration
# Confirm that the added cohort and learning plans are now reflected on the list of Learning plan templates.
And the following should exist in the "generaltable" table:
| Name | Category | Cohorts | Learning plans |
| LPT1 | System | 1 | 2 |
And I click on ".template-userplans" "css_element" in the "LPT1" "table_row"
# Confirm that learning plans were created for all cohort members.
And the following should exist in the "generaltable" table:
| Name | First name / Last name | Email address |
| LPT1 | User One | user1@example.com |
| LPT1 | User Two | user2@example.com |
+75
View File
@@ -17,6 +17,7 @@
namespace tool_lp;
use core_competency\api;
use core_competency\competency;
use core_external\external_api;
use externallib_advanced_testcase;
@@ -432,6 +433,80 @@ final class externallib_test extends externallib_advanced_testcase {
$this->assertEquals('A', $summary->usercompetencysummary->evidence[1]->gradename);
}
/**
* Evidence stored against a course module competency is deleted if the CM is deleted.
* @covers \tool_lp\external::data_for_user_competency_summary_in_plan
*/
public function test_data_for_user_competency_summary_in_plan_deleted_cm(): void {
$this->setUser($this->creator);
$dg = $this->getDataGenerator();
$lpg = $dg->get_plugin_generator('core_competency');
$f1 = $lpg->create_framework();
$c1 = $lpg->create_competency(['competencyframeworkid' => $f1->get('id')]);
$c2 = $lpg->create_competency(['competencyframeworkid' => $f1->get('id')]);
$tpl = $lpg->create_template();
$lpg->create_template_competency(['templateid' => $tpl->get('id'), 'competencyid' => $c1->get('id')]);
$lpg->create_template_competency(['templateid' => $tpl->get('id'), 'competencyid' => $c2->get('id')]);
$plan = $lpg->create_plan(['userid' => $this->user->id, 'templateid' => $tpl->get('id'), 'name' => 'Evil']);
$course = $dg->create_course();
$assign1 = $dg->create_module('assign', ['course' => $course->id]);
$assign2 = $dg->create_module('assign', ['course' => $course->id]);
$lpg->create_course_module_competency(['competencyid' => $c1->get('id'), 'cmid' => $assign1->cmid]);
$lpg->create_course_module_competency(['competencyid' => $c2->get('id'), 'cmid' => $assign1->cmid]);
api::add_evidence(
$this->user->id,
$c1->get('id'),
\core\context\module::instance($assign1->cmid),
competency::OUTCOME_COMPLETE,
'evidence_competencyrule',
'core_competency',
);
api::add_evidence(
$this->user->id,
$c2->get('id'),
\core\context\module::instance($assign2->cmid),
competency::OUTCOME_COMPLETE,
'evidence_competencyrule',
'core_competency',
);
// Confirm we have evidence for 2 course module competencies.
$summary1 = external::data_for_user_competency_summary_in_plan($c1->get('id'), $plan->get('id'));
$this->assertEquals('Evil', $summary1->plan->name);
$this->assertEquals(
get_string('evidence_competencyrule', 'core_competency'),
$summary1->usercompetencysummary->evidence[0]->description
);
$summary2 = external::data_for_user_competency_summary_in_plan($c2->get('id'), $plan->get('id'));
$this->assertEquals('Evil', $summary2->plan->name);
$this->assertEquals(
get_string('evidence_competencyrule', 'core_competency'),
$summary2->usercompetencysummary->evidence[0]->description
);
// Delete one course module.
course_delete_module($assign1->cmid);
// The evidence for the deleted course module should have been deleted. Other evidence should remain.
$summary1 = external::data_for_user_competency_summary_in_plan($c1->get('id'), $plan->get('id'));
$this->assertEquals('Evil', $summary1->plan->name);
$this->assertFalse(array_key_exists(0, $summary1->usercompetencysummary->evidence));
$summary2 = external::data_for_user_competency_summary_in_plan($c2->get('id'), $plan->get('id'));
$this->assertEquals('Evil', $summary2->plan->name);
$this->assertEquals(
get_string('evidence_competencyrule', 'core_competency'),
$summary2->usercompetencysummary->evidence[0]->description
);
}
public function test_data_for_user_competency_summary(): void {
$this->setUser($this->creator);
+1 -1
View File
@@ -56,7 +56,7 @@ class tool_messageinbound_renderer extends plugin_renderer_base {
$enabled,
$edit,
);
$table->attributes['class'] = 'admintable generaltable messageinboundhandlers';
$table->attributes['class'] = 'admintable generaltable messageinboundhandlers table table-hover';
$yes = get_string('yes');
$no = get_string('no');
+25 -29
View File
@@ -50,7 +50,7 @@ class manager {
],
'tool_mfa' => [
'guidance',
]
],
];
/**
@@ -74,7 +74,7 @@ class manager {
get_string('achievedweight', 'tool_mfa'),
get_string('status'),
];
$table->attributes['class'] = 'admintable generaltable table table-bordered';
$table->attributes['class'] = 'admintable generaltable table table-bordered table-hover';
$table->colclasses = [
'text-end',
'',
@@ -441,6 +441,21 @@ class manager {
$url = new \moodle_url($url);
}
// Admin not setup.
if (!empty($CFG->adminsetuppending)) {
return self::NO_REDIRECT;
}
// Honor prevent_redirect.
if ($preventredirect) {
return self::NO_REDIRECT;
}
// Login as.
if (\core\session\manager::is_loggedinas()) {
return self::NO_REDIRECT;
}
// Check for pluginfile.php urls.
$pluginfileurl = new \moodle_url('/pluginfile.php');
if ($url->compare($pluginfileurl)) {
@@ -485,22 +500,6 @@ class manager {
}
}
// Admin not setup.
if (!empty($CFG->adminsetuppending)) {
return self::NO_REDIRECT;
}
// Initial installation.
// We get this for free from get_plugins_with_function.
// Upgrade check.
// We get this for free from get_plugins_with_function.
// Honor prevent_redirect.
if ($preventredirect) {
return self::NO_REDIRECT;
}
// User not properly setup.
if (user_not_fully_set_up($USER)) {
return self::NO_REDIRECT;
@@ -516,11 +515,6 @@ class manager {
return self::NO_REDIRECT;
}
// Login as.
if (\core\session\manager::is_loggedinas()) {
return self::NO_REDIRECT;
}
// Site policy.
if (isset($USER->policyagreed) && !$USER->policyagreed) {
$manager = new \core_privacy\local\sitepolicy\manager();
@@ -538,11 +532,8 @@ class manager {
}
// WS/AJAX check.
// Prevents any potential bypassing of multi-factor authentication.
if (WS_SERVER || AJAX_SCRIPT) {
if (isset($SESSION->mfa_pending) && !empty($SESSION->mfa_pending)) {
// Allow AJAX and WS, but never from auth.php.
return self::NO_REDIRECT;
}
return self::REDIRECT_EXCEPTION;
}
@@ -607,6 +598,10 @@ class manager {
$urls = [
new \moodle_url('/login/logout.php'),
new \moodle_url('/admin/tool/mfa/guide.php'),
// Allow email self-registration confirmation to complete so that
// auth_email can restore wantsurl from the auth_email_wantsurl user
// preference before MFA intercepts on the next request.
new \moodle_url('/login/confirm.php'),
];
foreach ($factors as $factor) {
$urls = array_merge($urls, $factor->get_no_redirect_urls());
@@ -614,8 +609,9 @@ class manager {
// Allow forced redirection exclusions.
if ($exclusions = get_config('tool_mfa', 'redir_exclusions')) {
foreach (explode("\n", $exclusions) as $exclusion) {
$urls[] = new \moodle_url($exclusion);
$exclusions = preg_split('/\n|\r/', $exclusions, -1, PREG_SPLIT_NO_EMPTY);
foreach ($exclusions as $exclusion) {
$urls[] = new \moodle_url(trim($exclusion));
}
}
+4 -4
View File
@@ -174,7 +174,7 @@ class renderer extends \plugin_renderer_base {
$table = new \html_table();
$table->id = 'active_factors';
$table->attributes['class'] = 'generaltable table table-bordered';
$table->attributes['class'] = 'generaltable table table-bordered table-hover';
$table->head = [
$headers->devicename,
$headers->added,
@@ -348,7 +348,7 @@ class renderer extends \plugin_renderer_base {
$table = new \html_table();
$table->head = $displaynames;
$table->align = $colclasses;
$table->attributes['class'] = 'generaltable table table-bordered w-auto';
$table->attributes['class'] = 'generaltable table table-bordered w-auto table-hover';
$table->attributes['style'] = 'width: auto; min-width: 50%; margin-bottom: 0;';
// Manually handle Total users and MFA users.
@@ -461,7 +461,7 @@ class renderer extends \plugin_renderer_base {
$table = new \html_table();
$table->attributes['class'] = 'generaltable table table-bordered w-auto';
$table->attributes['class'] = 'generaltable table table-bordered w-auto table-hover';
$table->attributes['style'] = 'width: auto; min-width: 50%';
$table->head = [
@@ -513,7 +513,7 @@ class renderer extends \plugin_renderer_base {
global $DB;
$table = new \html_table();
$table->attributes['class'] = 'generaltable table table-bordered w-auto';
$table->attributes['class'] = 'generaltable table table-bordered w-auto table-hover';
$table->attributes['style'] = 'width: auto; min-width: 50%';
$table->head = [
'userid' => get_string('userid', 'grades'),
@@ -131,7 +131,7 @@ class admin_setting_managemfa extends \core_admin\table\plugin_management_table
$txt = get_strings(['combination', 'totalweight'], 'tool_mfa');
$table = new \html_table();
$table->id = 'mfacombinations';
$table->attributes['class'] = 'admintable generaltable table table-bordered';
$table->attributes['class'] = 'admintable generaltable table table-bordered table-hover';
$table->head = [$txt->combination, $txt->totalweight];
$table->data = [];
@@ -28,6 +28,6 @@ $string['pluginname'] = 'Authentication type';
$string['privacy:metadata'] = 'The Authentication type factor plugin does not store any personal data.';
$string['settings:description'] = 'Automatically verify users based on their authentication type.';
$string['settings:goodauth'] = 'Factor authentication types';
$string['settings:goodauth_help'] = 'Select all authentication types to use as a factor for MFA. Any types not selected will not be treated as a FAIL in MFA.';
$string['settings:goodauth_help'] = 'Select all authentication types that will gain the points from this factor. Other authentication types will not be treated as a fail in MFA, but will not gain this factor\'s weight points.';
$string['settings:shortdescription'] = 'Allow users to bypass extra authentication steps based on their authentication type.';
$string['summarycondition'] = 'has an authentication type of {$a}';
@@ -195,7 +195,7 @@ class factor extends object_factor_base {
$manualtable = new \html_table();
$manualtable->id = 'manualattributes';
$manualtable->attributes['class'] = 'generaltable table table-bordered table-sm w-auto';
$manualtable->attributes['class'] = 'generaltable table table-bordered table-sm w-auto table-hover';
$manualtable->attributes['style'] = 'width: auto;';
$manualtable->data = [
[get_string('setupfactor:key', 'factor_totp'), $secret],
+1
View File
@@ -149,6 +149,7 @@ $string['settings:redir_exclusions'] = 'URLS which should not redirect the MFA c
$string['settings:redir_exclusions_help'] = 'Each new line is a relative URL from the siteroot for which the MFA check will not redirect from';
$string['settings:weight'] = 'Factor weight';
$string['settings:weight_help'] = 'The weight of this factor if passed. A user needs at least 100 points to log in.';
$string['setup'] = 'Setup';
$string['setupfactor'] = 'Set up factor';
$string['setupfactorbuttonadditional'] = 'Add additional factor';
$string['state:fail'] = 'Fail';
+5
View File
@@ -38,3 +38,8 @@ input.tool-mfa-verification-code,
.mfa-verify-form .form-group.fitem > span > input {
width: 100%;
}
#mfalist .icon-circle .icon {
width: 64px;
height: 64px;
}
+48 -21
View File
@@ -20,6 +20,7 @@ namespace tool_mfa;
* Tests for MFA manager class.
*
* @package tool_mfa
* @covers \tool_mfa\manager
* @author Peter Burnett <peterburnett@catalyst-au.net>
* @copyright Catalyst IT
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
@@ -30,9 +31,6 @@ final class manager_test extends \advanced_testcase {
/**
* Tests getting the factor total weight
*
* @covers ::get_total_weight
* @covers ::setup_user_factor
*/
public function test_get_total_weight(): void {
$this->resetAfterTest(true);
@@ -76,8 +74,6 @@ final class manager_test extends \advanced_testcase {
/**
* Tests getting the factor status
*
* @covers ::get_status
*/
public function test_get_status(): void {
$this->resetAfterTest(true);
@@ -117,8 +113,6 @@ final class manager_test extends \advanced_testcase {
/**
* Tests checking if passed enough factors
*
* @covers ::passed_enough_factors
*/
public function test_passed_enough_factors(): void {
$this->resetAfterTest(true);
@@ -151,6 +145,30 @@ final class manager_test extends \advanced_testcase {
$this->assertEquals(true, \tool_mfa\manager::passed_enough_factors());
}
/**
* Test reading no redirect URLs configuration
*/
public function test_get_no_redirect_urls(): void {
$this->resetAfterTest();
$this->setAdminUser();
// Ensure all EOL markers are covered.
$config = "/user/profile.php\r" .
"/course/index.php\n" .
"/admin/settings.php\r\n" .
"/mod/bar/view.php ";
set_config('redir_exclusions', $config, 'tool_mfa');
// Cast URLs to string for simpler comparison.
$noredirecturls = array_map(fn(\moodle_url $url) => (string) $url, manager::get_no_redirect_urls());
$this->assertContains((string) (new \moodle_url('/user/profile.php')), $noredirecturls);
$this->assertContains((string) (new \moodle_url('/course/index.php')), $noredirecturls);
$this->assertContains((string) (new \moodle_url('/admin/settings.php')), $noredirecturls);
$this->assertContains((string) (new \moodle_url('/mod/bar/view.php')), $noredirecturls);
}
/**
* The data provider for whether urls should be redirected or not
*
@@ -178,7 +196,6 @@ final class manager_test extends \advanced_testcase {
/**
* Tests whether it should require mfa
*
* @covers ::should_require_mfa
* @param string $urlstring
* @param string $webroot
* @param bool $status
@@ -197,8 +214,6 @@ final class manager_test extends \advanced_testcase {
/**
* Tests whether it should require the mfa checks
*
* @covers ::should_require_mfa
*/
public function test_should_require_mfa_checks(): void {
// Setup test and user.
@@ -285,8 +300,6 @@ final class manager_test extends \advanced_testcase {
/**
* Tests should require the mfa redirection loop
*
* @covers ::should_require_mfa
*/
public function test_should_require_mfa_redirection_loop(): void {
// Setup test and user.
@@ -341,9 +354,6 @@ final class manager_test extends \advanced_testcase {
/**
* Tests checking for possible setup factor
*
* @covers ::possible_factor_setup
* @covers ::setup_user_factor
*/
public function test_possible_factor_setup(): void {
// Setup test and user.
@@ -377,8 +387,6 @@ final class manager_test extends \advanced_testcase {
/**
* Tests checking if a factor is ready
*
* @covers ::is_ready
*/
public function test_is_ready(): void {
// Setup test and user.
@@ -419,9 +427,6 @@ final class manager_test extends \advanced_testcase {
/**
* Tests core hooks
*
* @covers ::mfa_config_hook_test
* @covers ::mfa_login_hook_test
*/
public function test_core_hooks(): void {
// Setup test and user.
@@ -438,9 +443,31 @@ final class manager_test extends \advanced_testcase {
}
/**
* Tests circular redirect auth
* Tests that /login/confirm.php is excluded from MFA redirection.
*
* When a user follows an email self-registration confirmation link, MFA must
* not intercept the request before auth_email::user_confirm() has had a chance
* to restore the wantsurl from the auth_email_wantsurl user preference.
*
* @covers ::should_require_mfa
* @covers ::get_no_redirect_urls
*/
public function test_confirm_url_no_redirect(): void {
$this->resetAfterTest(true);
$user = $this->getDataGenerator()->create_user();
$this->setUser($user);
$confirmurl = new \moodle_url('/login/confirm.php');
$this->assertEquals(
\tool_mfa\manager::NO_REDIRECT,
\tool_mfa\manager::should_require_mfa($confirmurl, false),
'/login/confirm.php must not trigger an MFA redirect so that auth_email can ' .
'restore wantsurl from the auth_email_wantsurl user preference first.'
);
}
/**
* Tests circular redirect auth
*/
public function test_circular_redirect_auth(): void {
// Setup test and user.
+1 -1
View File
@@ -817,7 +817,7 @@ class api {
$credentials[] = ['type' => 'airnotifieraccesskey', 'value' => $CFG->airnotifieraccesskey];
}
if (\core\hub\registration::is_registered()) {
$credentials[] = ['type' => 'siteid', 'value' => $CFG->siteidentifier];
$credentials[] = ['type' => 'siteid', 'value' => \core\hub\registration::get_secret()];
}
// Generate a hash key for validating that the request is coming from this site via WS.
$key = complex_random_string(32);
+35 -15
View File
@@ -16,7 +16,10 @@
namespace tool_mobile;
use core\hook\output\extend_url;
use html_writer;
use moodle_url;
use tool_mobile\local\hooks\before_extend_ios_app_banner;
/**
* Allows plugins to add any elements to the footer.
@@ -35,22 +38,39 @@ class hook_callbacks {
\core\hook\output\before_standard_head_html_generation $hook,
): void {
global $CFG, $PAGE;
// Smart App Banners meta tag is only displayed if mobile services are enabled and configured.
if (!empty($CFG->enablemobilewebservice)) {
$mobilesettings = get_config('tool_mobile');
if (!empty($mobilesettings->enablesmartappbanners)) {
if (!empty($mobilesettings->iosappid)) {
$hook->add_html(
'<meta name="apple-itunes-app" content="app-id=' . s($mobilesettings->iosappid) . ', ' .
'app-argument=' . $PAGE->url->out() . '"/>'
);
}
// Only emit mobile app metadata when mobile services are enabled + configured.
if (empty($CFG->enablemobilewebservice)) {
return;
}
$mobilesettings = get_config('tool_mobile');
if (empty($mobilesettings->enablesmartappbanners)) {
return;
}
// IOS with hook-based app id and argument augmentation.
if (!empty($mobilesettings->iosappid)) {
$appid = (string)$mobilesettings->iosappid;
$appargument = $PAGE->url->out();
// Hook to allow modification of ios smart app banner fields.
$ioshook = new before_extend_ios_app_banner($appid, $appargument);
\core\di::get(\core\hook\manager::class)->dispatch($ioshook);
$appid = $ioshook->get_appid();
$appargument = $ioshook->get_appargument();
// Add the meta tag.
$hook->add_html(
'<meta name="apple-itunes-app" content="app-id=' . s($appid) .
', app-argument=' . s($appargument) . '"/>'
);
}
if (!empty($mobilesettings->androidappid)) {
$mobilemanifesturl = "$CFG->wwwroot/$CFG->admin/tool/mobile/mobile.webmanifest.php";
$hook->add_html('<link rel="manifest" href="' . $mobilemanifesturl . '" />');
}
}
// Android with hook-based URL augmentation.
if (!empty($mobilesettings->androidappid)) {
$url = new moodle_url('/admin/tool/mobile/mobile.webmanifest.php');
$urlhook = new extend_url($url);
\core\di::get(\core\hook\manager::class)->dispatch($urlhook);
$url = $urlhook->get_url();
// Add the link tag.
$hook->add_html('<link rel="manifest" href="' . $url->out(false) . '" />');
}
}
@@ -0,0 +1,78 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace tool_mobile\local\hooks;
/**
* Allow adjustment of ios smart app banner fields.
*
* @package tool_mobile
* @copyright 2025 Safat Shahin <safat.shahin@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
#[\core\attribute\label('Allow adjustment of ios smart app banner fields')]
#[\core\attribute\tags('mobile')]
final class before_extend_ios_app_banner {
/**
* Create a new instance of the hook.
*
* @param string $appid The app id for the ios smart banner
* @param string $appargument The app argument for the ios smart banner
*/
public function __construct(
/** @var string $appid The app id for the ios smart banner */
private string $appid,
/** @var string $appargument The app argument for the ios smart banner */
private string $appargument,
) {
}
/**
* Get the appid.
*
* @return string
*/
public function get_appid(): string {
return $this->appid;
}
/**
* Set the appid.
*
* @param string $appid
*/
public function set_appid(string $appid): void {
$this->appid = $appid;
}
/**
* Get the appargument.
*
* @return string
*/
public function get_appargument(): string {
return $this->appargument;
}
/**
* Set the appargument.
*
* @param string $appargument
*/
public function set_appargument(string $appargument): void {
$this->appargument = $appargument;
}
}
+3
View File
@@ -28,10 +28,13 @@
*/
define('NO_DEBUG_DISPLAY', true);
define('NO_MOODLE_COOKIES', true);
require_once(__DIR__ . '/../../../config.php');
header('Content-Type: application/json; charset: utf-8');
header('Cache-Control: public, max-age=' . HOURSECS . ', no-transform');
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + HOURSECS) . ' GMT');
$mobilesettings = get_config('tool_mobile');
// Display manifest contents only if all the required conditions are met.
@@ -86,7 +86,7 @@ class import_backup_helper {
}
[$filepath, $filename] = $this->remoteresource->download_to_requestdir();
\core\antivirus\manager::scan_file($filepath, $filename, true);
\core\antivirus\manager::scan_file($filepath . DIRECTORY_SEPARATOR . $filename, $filename, true);
// Check the final size of file against the user upload limits.
$localsize = filesize(sprintf('%s/%s', $filepath, $filename));
@@ -78,7 +78,7 @@ class import_strategy_file implements import_strategy {
// Download the file into a request directory and scan it.
[$filepath, $filename] = $resource->download_to_requestdir();
avmanager::scan_file($filepath, $filename, true);
avmanager::scan_file($filepath . DIRECTORY_SEPARATOR . $filename, $filename, true);
// Check the final size of file against the user upload limits.
$localsize = filesize(sprintf('%s/%s', $filepath, $filename));
+1 -8
View File
@@ -28,12 +28,5 @@ declare(strict_types=1);
* Perform the post-install procedures.
*/
function xmldb_tool_moodlenet_install() {
// Use an ad-hoc task to set the active activity chooser footer plugin to tool_moodlenet.
// We couldn't do this in admin/settings/courses.php for 2 reasons:
// - First, because it would be a breach of component communications principles to do so there.
// - Second, because we can't call get_plugins_with_function() during install and upgrade (or it will return []).
// We couldn't do this directly here either, because there is an admin_apply_default_settings() call after all plugins are
// installed and that would reset whatever value we set here to 'hidden'.
$postinstall = new tool_moodlenet\task\post_install();
core\task\manager::queue_adhoc_task($postinstall);
}
@@ -38,6 +38,9 @@ $string['defaultmoodlenet_desc'] = 'The URL of the MoodleNet instance available
$string['defaultmoodlenetname'] = "MoodleNet instance name";
$string['defaultmoodlenetnamevalue'] = 'MoodleNet Central';
$string['defaultmoodlenetname_desc'] = 'The name of the MoodleNet instance available via the activity chooser.';
$string['removalwarning_feature'] = 'If you need to continue using MoodleNet, contact your site administrator about setting up a self-hosted MoodleNet instance.';
$string['removalwarning_service'] = 'After the date, you will no longer be able to browse or add content from MoodleNet Central.';
$string['removalwarning_title'] = 'The MoodleNet service will be shut down on 20 April 2026.';
$string['enablemoodlenet'] = 'Enable MoodleNet integration (inbound)';
$string['enablemoodlenet_desc'] = 'If enabled, a user with the capability to create and manage activities can browse MoodleNet via the activity chooser and import MoodleNet resources into their course. In addition, a user with the capability to restore backups can select a backup file on MoodleNet and restore it into Moodle.';
$string['errorduringdownload'] = 'An error occurred while downloading the file: {$a}';

Some files were not shown because too many files have changed in this diff Show More