Compare commits

..

1252 Commits

Author SHA1 Message Date
Huong Nguyen 6b4d33a98f Moodle release 4.5.9 2026-02-06 09:16:09 +07:00
Huong Nguyen 506a4a33d4 NOBUG: Add upgrade notes 2026-02-06 09:16:09 +07:00
Mihail Geshoski afe3c2b88f weekly release 4.5.8+ 2026-02-05 20:24:01 +08:00
Mihail Geshoski 1a8415f1f1 NOBUG: Add upgrade notes 2026-02-05 20:24:01 +08:00
Mihail Geshoski caab968624 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2026-02-05 20:23:47 +08:00
Paul Holden f3748c1006 MDL-87870 admin: tighten up validation of colour picker values. 2026-02-05 17:27:27 +07:00
Paul Holden 72f49e4c76 MDL-87870 filter_tex: escape background argument content. 2026-02-05 17:27:27 +07:00
Huong Nguyen 4e8e5ca6ca Merge branch 'MDL-87352-405' of https://github.com/andimendunia/moodle into MOODLE_405_STABLE 2026-02-05 17:27:27 +07:00
yusufwib01 3cf9457a36 MDL-87594 composer: Upgrade symfony/process to v6.4.33 2026-02-05 17:27:27 +07:00
Mihail Geshoski 31d96fb54f Merge branch 'MDL-87258-405' of https://github.com/rjnl/moodle into MOODLE_405_STABLE 2026-02-05 17:27:27 +07:00
Jun Pataleta 43874f1138 Merge branch 'MDL-87757-405' of https://github.com/muhammadarnaldo/moodle into MOODLE_405_STABLE 2026-02-05 17:27:27 +07:00
Andi Permana e5269918b5 MDL-87352 admin: Add MoodleNet removal warnings 2026-02-04 11:30:54 +07:00
yusufwib01 857c90735e MDL-86785 tiny_equation: Add timeout handling for mimetex execution 2026-02-04 10:22:22 +07:00
Muhammad Arnaldo 1d95966c57 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:12:52 +07:00
Muhammad Arnaldo f9a2bb1125 MDL-87757 block_myoverview: fix the heading-order 2026-02-04 10:11:51 +07:00
Mihail Geshoski cba59e58ec Merge branch 'MDL-86437-405' of https://github.com/snake/moodle into MOODLE_405_STABLE 2026-02-04 10:38:41 +08:00
Huong Nguyen 6d92262ecb 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-04 10:33:56 +08:00
Paul Holden f3227bee2e MDL-87612 repository: safer unserializing of file source data. 2026-02-04 09:24:47 +07:00
Mihail Geshoski b1ba8e672e Merge branch 'MDL-87789-405' of https://github.com/snake/moodle into MOODLE_405_STABLE 2026-02-04 10:19:17 +08:00
AMOS bot 1ecd11e72e Automatically generated installer lang files 2026-02-04 00:07:34 +00:00
Jake Dallimore 3e2dbf557b Merge branch 'MDL-85535-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2026-02-03 16:59:56 +08:00
Jun Pataleta 50c2251ef2 Merge branch 'MDL-77162-filepicker-a11y-tab-order-repository-keyboard-selection-M4.5' of https://github.com/stopfstedt/moodle into MOODLE_405_STABLE 2026-02-03 16:44:00 +08:00
Jake Dallimore 4dce7cdcd0 Merge branch 'MDL-87638-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2026-02-03 16:18:29 +08:00
Rajneel Totaram 1241a17d4b 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 19:37:09 +12:00
Jun Pataleta d3ec08f146 Merge branch 'MDL-87694-course-participant-profile-missing-heading-M4.5' of https://github.com/stopfstedt/moodle into MOODLE_405_STABLE 2026-02-03 15:18:03 +08:00
Huong Nguyen c2bd37c0ec Merge branch 'MDL-86905-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2026-02-03 10:27:16 +07:00
Huong Nguyen 417c399bf6 Merge branch 'MDL-87675-405' of https://github.com/nvhai248/moodle into MOODLE_405_STABLE 2026-02-03 10:23:52 +07:00
AMOS bot ffb5bfee38 Automatically generated installer lang files 2026-02-03 00:07:48 +00:00
Stefan Topfstedt 6f84540075 MDL-87694 core: prevent empty heading in context header. 2026-02-02 11:34:20 -08:00
Stefan Topfstedt c6d921e53a MDL-87694 profile: set page title to "Login required".
This realigns the page title with user/view.php.
2026-02-02 11:05:28 -08:00
Stefan Topfstedt 890849b3e1 MDL-87694 profile: set top level heading when accessed as guest user. 2026-02-02 10:15:08 -08:00
Jun Pataleta f3b0bb1896 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:24:53 -08:00
Jun Pataleta a528f9ca2e MDL-86905 core: Use proper link markup for email links 2026-02-02 18:06:21 +08:00
AMOS bot 1768ae93e8 Automatically generated installer lang files 2026-01-31 00:07:36 +00:00
Huong Nguyen aa24806a89 weekly release 4.5.8+ 2026-01-30 15:39:52 +07:00
Huong Nguyen 156d7a5845 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2026-01-30 15:39:42 +07:00
fgo 6bf10930c7 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 15:00:09 +08:00
Jake Dallimore adfde92245 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:29:59 +08:00
Huong Nguyen 641639c0a7 Merge branch 'MDL-87521_405' of https://github.com/timhunt/moodle into MOODLE_405_STABLE 2026-01-29 11:03:40 +07:00
Huong Nguyen f4254a24ad Merge branch 'MDL-87087-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2026-01-29 11:01:46 +07:00
Huong Nguyen cbeefb6854 Merge branch 'MDL-86994-405' of https://github.com/mioyu-ubiq/moodle into MOODLE_405_STABLE 2026-01-29 10:58:35 +07:00
Huong Nguyen 5567567e5b Merge branch 'MDL-87018-405' of https://github.com/bhect0/moodle into MOODLE_405_STABLE 2026-01-29 10:55:18 +07:00
Angelia Dela Cruz ec6551ce80 MDL-87087 tool_dataprivacy: Test data request by authorized user 2026-01-29 11:09:48 +08:00
AMOS bot 9118477079 Automatically generated installer lang files 2026-01-29 00:07:37 +00:00
Tim Hunt 53f41838e7 MDL-87521 behat: better error reporting if an adhoc task fails 2026-01-28 14:59:13 +00:00
Jun Pataleta 1b56df014c Merge branch 'MDL-86639-405' of https://github.com/yusufwib01/moodle into MOODLE_405_STABLE 2026-01-28 16:17:13 +08:00
mioyu-ubiq 2edd3e1155 MDL-86994 mod_assign: Behat to test permitted users can edit submission 2026-01-28 14:23:55 +08:00
Hai Nguyen Van a68bc9319a 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:34:01 +00:00
Huong Nguyen e4c595aac8 weekly release 4.5.8+ 2026-01-26 10:39:32 +07:00
Huong Nguyen d3eaf24089 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2026-01-26 10:39:22 +07:00
Héctor Benedicte 39012d0b09 MDL-87018 qtype_essay: Add unit tests for un_summarise_response(). 2026-01-23 19:20:42 +01:00
AMOS bot 3dcfe6520b Automatically generated installer lang files 2026-01-23 00:07:54 +00:00
Safat d4c569d95e Merge branch 'MDL-86527-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2026-01-22 15:40:16 +11:00
Huong Nguyen 35ad89a715 Merge branch 'MDL-87092-405' of https://github.com/Kredelirious/moodle into MOODLE_405_STABLE 2026-01-22 10:37:12 +07:00
Huong Nguyen f557352f22 Merge branch 'MDL-87090-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2026-01-22 10:33:01 +07:00
Muhammad Arnaldo 894f2f161e 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:19 +07:00
Muhammad Arnaldo f6c8f4a098 MDL-86527 behat: Fix random failures when toggling edit mode 2026-01-21 15:05:19 +07:00
AMOS bot 93045eb621 Automatically generated installer lang files 2026-01-21 00:08:01 +00:00
Yusuf Wibisono 5bff1a62b1 MDL-86639 groups: Wrap group names in grade report group selector 2026-01-21 03:09:49 +07:00
Kim Jared Lucas e195cb3905 MDL-87092 tool_uploaduser: suspend enrolments via CSV upload 2026-01-20 11:21:27 +08:00
AMOS bot 3c3f130d2c Automatically generated installer lang files 2026-01-20 00:08:02 +00:00
Simey Lameze 99809ba681 MDL-87090 behat: improve new test 2026-01-19 14:14:01 +08:00
mioyu-ubiq 9c9b31658d MDL-87090 mod_assign : Teacher can override assignment deadlines 2026-01-19 14:14:01 +08:00
Jake Dallimore 23ad73ee56 weekly release 4.5.8+ 2026-01-16 16:38:38 +08:00
Jake Dallimore 9ce4d3a2de Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2026-01-16 16:38:32 +08:00
Jake Dallimore b17cba4ef7 Merge branch 'MDL-87634-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2026-01-15 09:58:59 +08:00
Paul Holden f0c84172fb 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:36 +00:00
Huong Nguyen c9913935bf Merge branch 'MDL-87443-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2026-01-13 10:15:59 +07:00
AMOS bot 72fb26ef25 Automatically generated installer lang files 2026-01-13 00:07:57 +00:00
Jun Pataleta 8e40b622bd MDL-87638 feedback: Fix usage of sortable list
The sortable list module in 4.5 still depends on jQuery instead of
native events. We need to adjust the usage of sortable list for the
edit questions page of the feedback activity accordingly.
2026-01-12 17:24:44 +08:00
Jun Pataleta f009e8e887 MDL-85535 forum: Render discussion navigation at the bottom only 2026-01-12 15:04:46 +08:00
Jun Pataleta e46b6a53ed MDL-85535 forum: Label discussion navigation 2026-01-12 15:04:46 +08:00
Simey Lameze 1646ab8620 MDL-87088 behat: add missing @javascript tags to required tests 2026-01-12 13:38:03 +07:00
Huong Nguyen 4290c0db02 Merge branch 'MDL-87088-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2026-01-12 09:53:30 +07:00
Stefan Topfstedt 61dc480cfa MDL-77162 filepicker: default to selecting first repository available. 2026-01-09 08:05:18 -08:00
Angelia Dela Cruz c13c75342f MDL-87088 core_grades: Behat to view grades from user menu 2026-01-09 10:52:25 +08:00
Huong Nguyen e394149084 weekly release 4.5.8+ 2026-01-09 08:41:57 +07:00
Paul Holden b275637a13 Merge branch 'MDL-87288-405' of https://github.com/ilyatregubov/moodle into MOODLE_405_STABLE 2026-01-07 08:55:54 +00:00
Ilya Tregubov 771e06bb2f MDL-87288 output: Fix pagination in small containers. 2026-01-07 10:19:14 +02:00
Jun Pataleta e3a4f45aa7 Merge branch 'MDL-86436-navigation-accessibility-page-heading-menu-visible-on-larger-screens-even-if-empty-M4.5' of https://github.com/stopfstedt/moodle into MOODLE_405_STABLE 2026-01-07 11:18:01 +08:00
Jun Pataleta 794b06cf63 Merge branch 'MDL-87416-glossary-entry-page-title-missing-M4.5' of https://github.com/stopfstedt/moodle into MOODLE_405_STABLE 2026-01-07 11:13:48 +08:00
Stefan Topfstedt f833fba135 MDL-87416 glossary: set page title on glossary entry details page. 2026-01-05 11:32:57 -08:00
Huong Nguyen 8fec0dc9e6 Merge branch 'MDL-81882-405' of https://github.com/yusufwib01/moodle into MOODLE_405_STABLE 2025-12-29 13:51:56 +07:00
Huong Nguyen df9acfa2ec Merge branch 'MDL-87433-405' of https://github.com/muhammadarnaldo/moodle into MOODLE_405_STABLE 2025-12-29 09:54:51 +07:00
yusufwib01 52ef39651d 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:33:29 +07:00
Muhammad Arnaldo c03ad2f40d 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:38:25 +07:00
Huong Nguyen 9e2daa9d6c weekly release 4.5.8+ 2025-12-19 09:05:00 +07:00
Huong Nguyen 6eb5c80e75 Merge branch 'MDL-87340-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-12-18 10:22:56 +07:00
Jun Pataleta d807b51210 Merge branch 'MDL-87428-405' of https://github.com/muhammadarnaldo/moodle into MOODLE_405_STABLE 2025-12-18 10:53:50 +08:00
Huong Nguyen 6880fa0c12 Merge branch 'MDL-86420-405' of https://github.com/muhammadarnaldo/moodle into MOODLE_405_STABLE 2025-12-18 09:30:09 +07:00
Huong Nguyen 31c83f8aa5 Merge branch 'MDL-87094-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-12-17 14:15:33 +07:00
Mihail Geshoski 1ef32165a0 Merge branch 'MDL-86416-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-12-17 12:15:40 +08:00
Jun Pataleta ede9478779 Merge branch 'MDL-87341_405' of https://github.com/TomoTsuyuki/moodle into MOODLE_405_STABLE 2025-12-15 18:48:29 +08:00
Angelia Dela Cruz c083984fd0 MDL-87094 core_course: Behat to restrict available activities/resources 2025-12-15 12:07:28 +08:00
Tomo Tsuyuki 7049a8334c MDL-87341 javascript: Fix aria label issue for navigation bar 2025-12-15 10:37:52 +11:00
Stefan Topfstedt 2025178343 MDL-86436 navigation: hide empty page heading menu.
Co-authored-by: Jun Pataleta <jun@moodle.com>
2025-12-12 18:04:44 -08:00
Stefan Topfstedt 0620c07639 MDL-87415 profile: set page title when accessed as guest user. 2025-12-12 13:44:02 -08:00
Paul Holden 39096ac3d1 MDL-87443 reportbuilder: use Toast selector in Behat scenarios. 2025-12-12 10:30:18 +00:00
Paul Holden d404adf500 MDL-87443 behat: define new Toast message named selector. 2025-12-12 10:12:57 +00:00
Muhammad Arnaldo dd9b7e8deb MDL-87428 core_course: Fix RTL keyboard navigation
Ensure consistent navigation experience across LTR and
RTL interfaces in activity chooser.
2025-12-12 11:01:54 +07:00
Shamim Rezaie b357491d00 weekly release 4.5.8+ 2025-12-12 14:06:51 +11:00
Shamim Rezaie 6139a04b64 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-12-12 14:06:41 +11:00
Muhammad Arnaldo 9ebe2f8676 MDL-86420 enrol_database: avoid duplicate key violations 2025-12-11 10:25:31 +07:00
Huong Nguyen a2aaba5f5d Merge branch 'MDL-84736-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-12-11 10:19:30 +07:00
AMOS bot 4112aa8957 Automatically generated installer lang files 2025-12-11 00:07:58 +00:00
Simey Lameze 39026940b3 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:58 +08:00
Angelia Dela Cruz 0e0bdbdd76 MDL-84736 gradingform : Behat for editing guide with graded submissions 2025-12-09 17:23:58 +08:00
Jun Pataleta 5a40f5524e Merge branch 'MDL-86807-405' of https://github.com/muhammadarnaldo/moodle into MOODLE_405_STABLE 2025-12-09 16:43:04 +08:00
Jun Pataleta 806b3f2d69 Merge branch 'MDL-86805-405' of https://github.com/andimendunia/moodle into MOODLE_405_STABLE 2025-12-09 16:36:07 +08:00
Muhammad Arnaldo 3d812fe6c3 MDL-86807 core_courseformat: RTL chevron in move activity modal 2025-12-09 15:23:21 +07:00
Andi Permana 367a2a7678 MDL-86805 courseindex: Fix RTL keyboard navigation in tree 2025-12-09 15:20:23 +07:00
Stefan Topfstedt 70ba060e57 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:16:37 +08:00
Mihail Geshoski f5fc38f35a Merge branch 'MDL-82281-405' of https://github.com/lucaboesch/moodle into MOODLE_405_STABLE 2025-12-09 09:46:35 +08:00
Mihail Geshoski dcd55b53a7 Merge branch 'mdl-87356_405' of https://github.com/james-cnz/moodle into MOODLE_405_STABLE 2025-12-09 09:18:17 +08:00
Simey Lameze a45cfb7c7b 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:19 +08:00
Luca Bösch c300545e9e MDL-82281 quiz: Amend test to circumvent modinfo cache fails. 2025-12-07 19:54:07 +01:00
Huong Nguyen 48c9857449 Moodle release 4.5.8 2025-12-07 08:05:13 +07:00
Huong Nguyen 70c14d4d22 NOBUG: Add upgrade notes 2025-12-07 08:05:13 +07:00
Huong Nguyen 66cf248632 weekly release 4.5.7+ 2025-12-05 08:09:13 +07:00
Huong Nguyen 4cff8eeaa2 NOBUG: Add upgrade notes 2025-12-05 08:09:13 +07:00
Huong Nguyen edfb86e638 MDL-81304 Performance: Add notes for CTE 2025-12-04 21:12:44 +07:00
Huong Nguyen 54d4e61c7f Merge branch 'MDL-87068-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-12-04 21:00:46 +07:00
James C 66a22969e1 MDL-87356 qtype_random: orphaned random questions should be deleted
This patch reinstates the task from MDL-63260 and MDL-66273.
2025-12-04 22:58:52 +13:00
Angelia Dela Cruz 6bc1159c89 MDL-87068 contentbank_h5p: Behat for restoring course contentbank 2025-12-04 10:34:14 +08:00
Huong Nguyen 2268d3d2f7 Merge branch 'MDL-83485-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-12-04 09:19:13 +07:00
Huong Nguyen 7a4926411e Merge branch 'MDL-82232-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-12-04 09:13:14 +07:00
Huong Nguyen 187195c9e1 MDL-72744 table: Improve PHPUnit test 2025-12-04 08:57:29 +07:00
David Woloszyn 6dead7e7cb MDL-72744 core_grades: Escape formulas when exporting spreadsheets 2025-12-04 08:57:29 +07:00
David Woloszyn 377a2c30f4 MDL-72744 dataformat: Escape formulas when exporting spreadsheets
Co-authored-by: Huong Nguyen <huongnv13@gmail.com>
2025-12-04 08:57:29 +07:00
Mihail Geshoski 4fcf6aa947 Merge branch 'MDL-85534-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-12-04 09:46:47 +08:00
Huong Nguyen 7a8f504640 MDL-86087 core: Use correct required version 2025-12-04 08:37:02 +07:00
Mihail Geshoski 8aececb06e Merge branch 'MDL-87245-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-12-03 23:50:40 +08:00
Mihail Geshoski 4b36673cd5 Merge branch 'MOODLE_405_STABLE_MDL-81304' of https://github.com/mattporritt/moodle into MOODLE_405_STABLE 2025-12-03 23:39:25 +08:00
Jun Pataleta be8600ab99 MDL-87245 scorm: Indicate when the SCORM package opens in a new window 2025-12-03 23:37:32 +08:00
Mihail Geshoski 5bac9da882 Merge branch 'MDL-85858-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-12-03 23:29:14 +08:00
Jun Pataleta 5f854f895d MDL-85534 forum: Set appropriate heading levels for the discussion page 2025-12-03 17:34:00 +08:00
Huong Nguyen 7e8bef4959 Merge branch 'MDL-87091-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-12-03 16:11:37 +07:00
mioyu-ubiq 02a0f72a8d MDL-87091 behat: Test authloginviaemail setting behavior 2025-12-03 15:56:25 +08:00
Huong Nguyen e7cf3f225a MDL-87353 core: Safer unserializing of file references 2025-12-03 14:17:46 +08:00
Jun Pataleta 8a6832f499 Merge branch 'MDL-86087-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-12-03 14:09:59 +08:00
Stefan Hanauska 0d0d8eed03 MDL-86960 mod_glossary: Check user 2025-12-03 13:43:34 +08:00
Stefan Hanauska 5cc31e17d4 MDL-86960 mod_data: Check user 2025-12-03 13:43:25 +08:00
Stefan Hanauska 7d789a5a4a MDL-86960 mod_forum: Check user 2025-12-03 13:43:18 +08:00
Huong Nguyen 65605f10b0 Merge branch 'MDL-87339-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-12-03 12:15:07 +07:00
Jake Dallimore e5bc55a7e4 MDL-87286 enrol_lti: prevent suspended user account auth in legacy LTI 2025-12-03 15:50:59 +11:00
Jake Dallimore 78a1885ed9 MDL-87286 auth_lti: prevent suspended user account auth in LTI1p3 2025-12-03 15:50:59 +11:00
Matt Porritt 1d51a21af3 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:48:27 +11:00
raortegar 0df615a945 MDL-87267 aiplacement_courseassist: Improve response formatting 2025-12-03 11:17:21 +07:00
Mihail Geshoski f5a401c0a5 MDL-82808 assign: Use blindid during submission removal in blind marking 2025-12-03 09:49:38 +08:00
Rajneel Totaram f5f42602f2 MDL-82808 mod_assign: replace userid with blindid in anonymous marking 2025-12-03 09:49:37 +08:00
Jun Pataleta c80a2a4009 MDL-82232 behat: Fix breadcrumb navigation on Behat 2025-12-02 19:22:20 +08:00
Jun Pataleta cdff966713 MDL-82232 core: Change the breadcrumb lang string to Breadcrumb 2025-12-02 19:22:19 +08:00
David Woloszyn c4fa1575a2 MDL-86544 lib: Adjust checks on local URL params 2025-12-02 03:40:19 +00:00
Eric Merrill 2737ed2183 MDL-80317 auth_oauth2: Restrict login redirect to local url 2025-12-02 03:40:19 +00:00
David Woloszyn 5caa509d87 MDL-85557 atto_equation: Sanitise equation preview input 2025-12-02 03:40:19 +00:00
David Woloszyn a94f9cd373 MDL-85557 tiny_equation: Sanitise equation preview input 2025-12-02 03:40:19 +00:00
Stefan Hanauska e0a5d727dd MDL-86507 badge: Check if role is assigned 2025-12-02 03:40:19 +00:00
yusufwib01 795b2a90c5 MDL-86326 auth: Enhance validation logic in resend_confirmation_email 2025-12-02 03:40:19 +00:00
Huong Nguyen 6aeb97c555 Merge branch 'MDL-84898-prohibitjoin-45' of https://github.com/leonstr/moodle into MOODLE_405_STABLE 2025-12-02 10:38:30 +07:00
Huong Nguyen 22cd43751f Merge branch 'MDL-87332-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-12-02 10:14:55 +07:00
Jun Pataleta c6e762b243 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:29 +08:00
Jun Pataleta a485e9e125 MDL-85858 mod_scorm: Use semantic heading for the Preview mode 2025-11-28 21:01:29 +08:00
Jun Pataleta f237faf8fd MDL-85858 mod_scorm: Set page and iframe titles for the SCORM player 2025-11-28 21:01:28 +08:00
Huong Nguyen 97dea969f5 MDL-86087 core: Define environment requirements for Moodle 5.2 2025-11-28 09:09:53 +07:00
Paul Holden 31bbed6697 MDL-87332 message: make notification preference toggles visible.
They were inadvertently hidden in changes from a6373334 against
the 4.5 branch only (due to Bootstrap differences from 5.0 onwards).
2025-11-27 20:30:49 +00:00
Paul Holden e800f30163 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:07:59 +00:00
Mihail Geshoski f308518c76 weekly release 4.5.7+ 2025-11-27 19:40:46 +08:00
Mihail Geshoski 0ceef6ded6 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-11-27 19:40:32 +08:00
Jun Pataleta b646b9fde2 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:14 +08:00
Jun Pataleta 391b88f628 MDL-83485 core: Add accessibility Behat coverage to the preferences page 2025-11-27 11:37:13 +08:00
Jun Pataleta 7c7d31011e MDL-83485 core: Fix heading level for preferences groups 2025-11-27 11:37:13 +08:00
Jun Pataleta 1e1eb4f592 MDL-83485 core: Render preferences groups as lists 2025-11-27 11:37:13 +08:00
Andrew Nicols df3a81046d Merge branch 'MDL-86255-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-11-27 11:11:41 +08:00
Jake Dallimore ea4c9193df Merge branch 'MDL-86840-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-11-27 09:45:14 +08:00
Mihail Geshoski 5c8f1e4bf9 Merge branch 'MDL-87149-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-11-26 17:30:26 +08:00
Paul Holden 22c0f4e15f Merge branch 'MDL-87046-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-11-25 15:25:25 +00:00
Leon Stringer 0f5d368eb2 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:39:53 +00:00
Huong Nguyen c86e79b0b7 Merge branch 'MDL-87017-405-frontpage-block-any-page' of https://github.com/danowar2k/moodle into MOODLE_405_STABLE 2025-11-25 10:42:22 +07:00
Huong Nguyen 209aba758e Merge branch 'MDL-87194-405' of https://github.com/albertgasset/moodle into MOODLE_405_STABLE 2025-11-25 10:40:09 +07:00
Jun Pataleta 1edd0e6a65 Merge branch 'MDL-86547-405' of https://github.com/muhammadarnaldo/moodle into MOODLE_405_STABLE 2025-11-25 11:09:41 +08:00
Muhammad Arnaldo f18f512e23 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:34:40 +07:00
Jun Pataleta 1f16a6fa95 Merge branch 'MDL-86547-405' of https://github.com/muhammadarnaldo/moodle into MOODLE_405_STABLE 2025-11-24 15:55:14 +08:00
Muhammad Arnaldo a3d38b036a 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:27:08 +07:00
AMOS bot c90320d471 Automatically generated installer lang files 2025-11-23 00:08:19 +00:00
Huong Nguyen 357864383e weekly release 4.5.7+ 2025-11-21 14:33:50 +07:00
Huong Nguyen 233a9bc2ac NOBUG: Add upgrade notes 2025-11-21 14:33:50 +07:00
Huong Nguyen 011fee9440 Merge branch 'MDL-87048-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-11-21 08:13:45 +07:00
Huong Nguyen a7813201d1 Merge branch 'MDL-84735-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-11-21 08:13:45 +07:00
Andrew Nicols ab6a201b2c 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
Jun Pataleta e2f1a37ab5 MDL-87245 lang: Add a bracketed form of the opensinnewwindow lang string 2025-11-20 17:28:37 +08:00
Angelia Dela Cruz 9229bd7fac MDL-87048 tool_lp: Behat for synchronising cohort with learning plan 2025-11-20 10:28:15 +08:00
Angelia Dela Cruz 90a486a697 MDL-84735 gradingform: Behat for modifying marking guide criterion 2025-11-20 07:58:25 +08:00
Huong Nguyen da267624c5 Merge branch 'MDL-82511-cache-cron-MOODLE_405_STABLE' of https://github.com/bwalkerl/moodle into MOODLE_405_STABLE 2025-11-19 11:02:13 +07:00
Julien Boulen dfc522ccbb MDL-86320 core: Fix unit test qrcode_test 2025-11-19 10:05:46 +07:00
Huong Nguyen 0fa4c468c9 Merge branch 'MDL-86907-405' of https://github.com/mioyu-ubiq/moodle into MOODLE_405_STABLE 2025-11-19 10:03:21 +07:00
Huong Nguyen 946340aa07 Merge branch 'MDL-86998-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-11-19 08:36:34 +07:00
mioyu-ubiq 162c0597d5 MDL-86907 mod_choice: Behat test for adding multiple choice responses 2025-11-18 15:03:40 +08:00
Simey Lameze d900d4f97b MDL-87050 behat: use src for img xpath selector 2025-11-18 10:50:36 +07:00
Huong Nguyen 66c3ff069a Merge branch 'MDL-85235-405' of https://github.com/safatshahin/moodle into MOODLE_405_STABLE 2025-11-17 16:02:06 +07:00
Huong Nguyen e44a13957c Merge branch 'MDL-87050-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-11-17 15:58:19 +07:00
Huong Nguyen 40b64c14be Merge branch 'MDL-85764-quiz-notification-MOODLE_405_STABLE' of https://github.com/bwalkerl/moodle into MOODLE_405_STABLE 2025-11-17 14:50:53 +07:00
Jun Pataleta 9341e5c73f 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:46:19 +08:00
Jun Pataleta 2ee07eeeb5 MDL-87149 mod_feedback: Generate dependent questions
Allow the generator to create questions that depend on other questions.
2025-11-17 12:46:19 +08:00
Jun Pataleta b71683f20b MDL-87149 theme_boost: Remove the .feedback_is_dependent class
It's no longer being used. So, just remove it.
2025-11-17 10:59:30 +08:00
Jun Pataleta df9eaaff5b 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 10:58:15 +08:00
Huong Nguyen c39ab02a05 Merge branch 'MDL-87107-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-11-17 09:09:09 +07:00
Albert Gasset 81b9c1e625 MDL-87194 tool_mobile: Fix subscription requests 2025-11-14 16:17:44 +01:00
Albert Gasset 655ca834be MDL-87194 message_airnotifier: Fix access key requests 2025-11-14 16:17:39 +01:00
Daniel Poggenpohl cd23b1d465 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:40:05 +01:00
Mihail Geshoski 7a075f6f4f weekly release 4.5.7+ 2025-11-13 18:49:22 +08:00
Angelia Dela Cruz c2e068cfc6 MDL-87050 mod_folder: Behat for preventing forced file downloads 2025-11-13 16:29:05 +08:00
Huong Nguyen 8e9c4bfdab Merge branch 'MDL-86895-405' of https://github.com/mioyu-ubiq/moodle into MOODLE_405_STABLE 2025-11-13 10:44:10 +07:00
Huong Nguyen 13222eb585 Merge branch 'MDL-79249-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-11-13 10:20:42 +07:00
Huong Nguyen 54b3164035 Merge branch 'MDL-87047-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-11-13 10:16:59 +07:00
Huong Nguyen 1a7975c762 Merge branch 'MDL-78973-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-11-13 08:53:00 +07:00
Mihail Geshoski 3f33e07952 Merge branch 'MDL-86963-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-11-12 17:16:13 +08:00
Mihail Geshoski 1999f2020b Merge branch 'MDL-85686-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-11-12 17:00:44 +08:00
Angelia Dela Cruz a838a2a97e MDL-87047 tool_lp: Behat optimisation 2025-11-12 16:38:23 +08:00
Mihail Geshoski 8cd0734f14 Merge branch 'MDL-86886-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-11-12 16:38:12 +08:00
Angelia Dela Cruz 46fddd22f0 MDL-87047 tool_lp: Behat to complete a learning plan and alter it 2025-11-12 16:34:57 +08:00
Jun Pataleta d28895b921 MDL-86840 forum: Add accessibility Behat coverage
* Add accessibility Behat coverage on the Advanced forum search page.
2025-11-12 11:41:27 +08:00
Jun Pataleta 3248bea893 MDL-86840 forum: Do not use layout table for the search form 2025-11-12 11:41:26 +08:00
Angelia Dela Cruz 688a742017 MDL-86963 tool_lp: Behat to perform CRUD operations on competencies 2025-11-12 10:35:32 +08:00
Safat 5dc927426b MDL-85235 tool_mobile: Implement the augmentation hooks for apps 2025-11-12 10:13:48 +11:00
Safat b56963d92d MDL-85235 tool_mobile: Add extend ios app banner hook 2025-11-12 10:13:02 +11:00
Safat 10cef5e611 MDL-85235 core: Add extend url hook 2025-11-12 10:13:02 +11:00
Safat 86bac36c84 MDL-85235 tool_mobile: Make mobile manifest cookieless and cacheable 2025-11-12 10:13:02 +11:00
Jun Pataleta bc5e19b626 MDL-86840 forum: Fix heading structure of search form 2025-11-11 21:14:33 +08:00
Jun Pataleta bc607ceb0b 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:29:54 +08:00
Jun Pataleta a637333419 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:29:54 +08:00
Angelia Dela Cruz 55417a7ef6 MDL-86886 tool_lp: Behat to move and cross-reference competencies 2025-11-11 15:57:57 +08:00
Simey Lameze 9b3855222d MDL-85686 mod_quiz: unit test coverage for questions shuffle 2025-11-11 14:20:36 +08:00
Angelia Dela Cruz 279c1925e1 MDL-78973 Behat: Behat coverage for invalid file upload in data activity 2025-11-11 13:20:40 +08:00
Huong Nguyen 981b69b0ca Merge branch 'MDL-81604-405' of https://github.com/t-schroeder/moodle into MOODLE_405_STABLE 2025-11-11 09:29:11 +07:00
Mio Yu bcf8806a82 MDL-86895 core_grades: Behat to verify listing and grading submissions 2025-11-11 09:55:58 +08:00
Shamim Rezaie 5e9e3cfd8b Merge branch 'MDL-87026-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-11-10 13:38:57 +11:00
Andrew Nicols 700724363e MDL-87107 core: Stop using MUC for hook manager caching 2025-11-07 17:19:09 +08:00
Huong Nguyen 9fd9388e2a weekly release 4.5.7+ 2025-11-07 14:49:26 +07:00
Huong Nguyen 7562615cd2 NOBUG: Add upgrade notes 2025-11-07 14:49:25 +07:00
Huong Nguyen d42486ced8 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-11-07 14:49:13 +07:00
Huong Nguyen 0113f57641 Merge branch 'MDL-86701-405-fix' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-11-07 08:46:59 +07:00
Jun Pataleta 826ed6ace0 MDL-86701 behat: Update Behat tests to press edit/delete buttons 2025-11-06 18:40:32 +08:00
Huong Nguyen 8a371c2bc8 MDL-69226 environment: filter extension required for 4.1 2025-11-06 18:22:12 +08:00
Mihail Geshoski 0c9ad85a06 Merge branch 'MDL-87073-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-11-06 17:08:22 +08:00
Huong Nguyen 9b6573ad64 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:18 +07:00
Huong Nguyen e1142f89ea Merge branch 'MDL-86908-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-11-06 15:42:42 +07:00
Huong Nguyen 37e24ebcaf Merge branch 'MDL-87049-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-11-06 15:40:37 +07:00
Huong Nguyen 812a0873b9 Merge branch 'MDL-87079-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-11-06 15:37:32 +07:00
Jake Dallimore 451d088cac Merge branch 'MDL-86379-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-11-06 14:30:26 +08:00
Huong Nguyen b6ef7fdfe0 Merge branch 'MDL-87019-redis-bloat-MOODLE_405_STABLE' of https://github.com/bwalkerl/moodle into MOODLE_405_STABLE 2025-11-06 10:35:16 +07:00
Huong Nguyen 9288446a93 Merge branch 'MDL-86701-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-11-06 10:27:28 +07:00
Simey Lameze a26a02d746 MDL-87049 behat: read showcampaigncontent setting when running behat 2025-11-06 08:21:37 +08:00
Angelia Dela Cruz 4b739bdcbf MDL-87049 core: Behat to toggle campaign content banner display 2025-11-06 08:21:37 +08:00
AMOS bot b22b1dbd31 Automatically generated installer lang files 2025-11-06 00:07:54 +00:00
Angelia Dela Cruz 72dc3343bb MDL-86908 core_contentbank: Behat to set supported files of contentbank 2025-11-05 18:37:15 +08:00
Simey Lameze ccd7e02f0e MDL-86379 mod_quiz: move create_test_quiz function into generator 2025-11-05 11:52:38 +08:00
Andrew Nicols 1cd558bc1a 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
Jake Dallimore 7653430489 Merge branch 'MDL-86855-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-11-04 14:10:08 +08:00
Angelia Dela Cruz 20acf53b3d MDL-79249 core_filepicker: Cancel file and folder upload using X button 2025-11-03 10:57:28 +08:00
Jun Pataleta fa4f770b87 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 10:43:17 +08:00
Jun Pataleta 95f16b20ec MDL-86701 customfield: Return category name for template reload WS 2025-11-03 10:41:58 +08:00
Jun Pataleta 3015d5b74e 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 10:41:54 +08:00
Huong Nguyen 8fc0b91868 Merge branch 'MDL-69226-M405_verify-that-the-filter-php-extension-is-present' of https://github.com/ziegenberg/moodle into MOODLE_405_STABLE 2025-11-03 09:02:20 +07:00
AMOS bot a313647a92 Automatically generated installer lang files 2025-11-01 00:07:54 +00:00
Benjamin Walker 59433cc60e MDL-87019 redis: Avoid storing userhashkey for non-login users 2025-10-31 16:20:33 +10:00
Mihail Geshoski d2cf28d3c8 weekly release 4.5.7+ 2025-10-30 18:11:35 +08:00
Mihail Geshoski db78394b90 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-10-30 18:11:21 +08:00
Huong Nguyen 198039e1c6 MDL-87026 core_course: optimise subsections loading
Co-authored-by: ferran <ferranrecio@gmail.com>
2025-10-29 09:45:04 +07:00
Mihail Geshoski 1e6639141f Merge branch 'MDL-86894-405' of https://github.com/Kredelirious/moodle into MOODLE_405_STABLE 2025-10-29 10:18:55 +08:00
Daniel Ziegenberg 60e6d71df8 MDL-69226 environment: filter extension required
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-10-28 19:34:28 +01:00
Kim Jared Lucas 3eac771791 MDL-86894 mod_forum: Behat to verify default forum RSS settings 2025-10-28 13:10:00 +08:00
AMOS bot 0530955961 Automatically generated installer lang files 2025-10-28 00:09:44 +00:00
Adrian Greeve d73a6d2c1a Merge branch 'MDL-85774-405-3' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-10-27 09:04:16 +08:00
Jun Pataleta c7ea0da70d MDL-86855 qbank_columnsortorder: Render disabled columns as a list
* Lists must be marked up with the proper semantics.
2025-10-24 12:03:54 +08:00
Jun Pataleta 4a7f3166a4 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:03:54 +08:00
Huong Nguyen 7b6856793f weekly release 4.5.7+ 2025-10-24 11:00:34 +07:00
Huong Nguyen 48913b2b0e NOBUG: Add upgrade notes 2025-10-24 11:00:34 +07:00
Jun Pataleta 53a9a3f108 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:37:41 +08:00
Jun Pataleta 8ed65942cb 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:37:37 +08:00
Huong Nguyen a3c6263c2e Merge branch 'MDL-86986-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-10-23 09:57:34 +07:00
Jun Pataleta a89db0244b MDL-86986 core: Add aria-label to the drag handle button 2025-10-22 20:14:46 +08:00
Amaia Anabitarte 20e1d63562 Merge branch 'MDL-85796-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-10-21 19:56:36 +02:00
Paul Holden dc8d401481 MDL-86255 behat: implement methods to assert date/time field value. 2025-10-21 11:34:52 +01:00
Huong Nguyen df4189d1fd Merge branch 'MDL-85975_405_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_405_STABLE 2025-10-21 09:31:06 +07:00
Mihail Geshoski 52b76e2fcd Merge branch 'MDL-85696-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-10-20 10:29:02 +08:00
Angelia Dela Cruz 2bf213cfb2 MDL-85696 mod_quiz: Behat to attempt password and time restricted quiz 2025-10-17 16:32:47 +08:00
Paul Holden b945d89a41 MDL-86822 mod_h5pactivity: fix block page type list method parameters.
Similar was done before in 7a77493b.
2025-10-17 08:34:54 +08:00
Andrew Nicols 0dd1c8137f weekly release 4.5.7+ 2025-10-17 06:51:11 +08:00
Andrew Nicols cfe63e8642 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-10-17 06:50:52 +08:00
Jun Pataleta f7879992dd 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:49:44 +08:00
Jarad Barker 0b7b9b453e MDL-84483 core_files: Always fire after_file_created hook 2025-10-16 09:04:28 +07:00
Paul Holden 923ce84983 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-10-15 17:13:27 +08:00
Andrew Nicols 3c5c9f37ff Merge branch 'MDL-86186-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-10-15 15:49:27 +08:00
AMOS bot 1ff7230f76 Automatically generated installer lang files 2025-10-15 00:09:30 +00:00
Jun Pataleta 9053f4c192 MDL-85820 lib: Update pear/readme_moodle.txt 2025-10-10 11:05:45 +08:00
Tim Hunt e6ff7d02d8 MDL-85820 formslib: don't add '-' to client-side valiation 2025-10-10 11:04:42 +08:00
Huong Nguyen 1c155f2fa0 weekly release 4.5.7+ 2025-10-09 22:00:32 +07:00
Huong Nguyen d89332888e Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-10-09 21:59:50 +07:00
AMOS bot 5bf35c535e Automatically generated installer lang files 2025-10-09 00:09:09 +00:00
Jun Pataleta 86799dab96 Merge branch 'MDL-86450-forum-accessibility-check-boxes-in-advanced-search-form-not-labeled-corrected-M4.5' of https://github.com/stopfstedt/moodle into MOODLE_405_STABLE 2025-10-07 14:07:34 +08:00
Huong Nguyen d1321ff0d5 Moodle release 4.5.7 2025-10-04 09:03:40 +07:00
Huong Nguyen e25fbec380 NOBUG: Add upgrade notes 2025-10-04 09:03:40 +07:00
AMOS bot 8464ca1b72 Automatically generated installer lang files 2025-10-04 00:07:57 +00:00
Mark Johnson c476ebe695 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:50 +01:00
Shamim Rezaie 03429740d2 weekly release 4.5.6+ 2025-10-03 20:02:28 +10:00
Mihail Geshoski 32897778cd MDL-75087 mod_assign: Fix failing behat tests in classic 2025-10-03 14:22:34 +07:00
Mihail Geshoski 1e2dcb145f MDL-75087 mod_assign: Fix failing unit test 2025-10-02 18:09:35 +07:00
Rajneel Totaram df9109fa9e 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:02:50 +08:00
raortegar ecc53ae6a1 MDL-86253 mod_assign: Respect enrollment status in notifications 2025-10-02 08:15:28 +07:00
raortegar e37eadb84b MDL-86253 mod_quiz: Respect enrollment status in notifications 2025-10-02 08:15:28 +07:00
David Woloszyn d893d639d0 MDL-86494 router: Display error details only when debugging is on 2025-10-01 01:30:20 +00:00
yusufwib01 8d365edffe MDL-86353 mod_assign: Sync exception handling in PdfType and PdfReader 2025-10-01 01:30:20 +00:00
Paul Holden 7a5a3f261e MDL-85421 cohort: limit requests for all cohorts to system context. 2025-10-01 01:30:20 +00:00
David Woloszyn a8ecc443fe MDL-86327 auth_webservice: Stricter check on login 2025-10-01 01:30:20 +00:00
yusufwib01 0b32ae0b46 MDL-86261 calendar: Improve event form to show accessible groups 2025-10-01 01:30:20 +00:00
raortegar 519a09da8b MDL-86334 tool_mfa: Improve multi-factor authentication validation. 2025-10-01 01:30:20 +00:00
Huong Nguyen beb129d286 Merge branch 'MDL-85546-405' of https://github.com/raortegar/moodle into MOODLE_405_STABLE 2025-10-01 08:21:56 +07:00
Stefan Topfstedt 2a2d293f3f MDL-86450 Forum: adds missing IDs to advanced search form elements. 2025-09-30 11:41:51 -07:00
raortegar 1849cca694 MDL-85546 tool_mfa: Improve handling of require MFA conditions 2025-09-30 11:13:25 +02:00
Huong Nguyen 628bb639ae Merge branch 'MDL-86667-405' of https://github.com/stevandoMoodle/moodle into MOODLE_405_STABLE 2025-09-29 13:36:53 +07:00
Stevani Andolo 8e409341bd MDL-86667 registration: Unset fields after site being unregistered 2025-09-29 10:35:04 +08:00
cescobedo f856c7ba24 weekly release 4.5.6+ 2025-09-26 13:44:24 +02:00
cescobedo 7a281ba10c NOBUG: Add upgrade notes 2025-09-26 13:44:24 +02:00
cescobedo d0a9dba00d Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-09-26 13:44:11 +02:00
Sara Arjona 37d10d8350 MDL-86488 core: Fix to remove whitespaces 2025-09-26 13:20:05 +02:00
Huong Nguyen 9c3ea97d9b Merge branch 'MDL-86511-405' of https://github.com/andimendunia/moodle into MOODLE_405_STABLE 2025-09-26 11:15:54 +07:00
Andi Permana 62ae269490 MDL-86511 tiny_link: TinyMCE fails to insert a link using enter key 2025-09-26 11:13:33 +07:00
Jun Pataleta 9f97900524 Merge branch 'MDL-85684-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-26 11:30:58 +08:00
Huong Nguyen e778f6fbbd Merge branch 'mdl-84491_redis_connection_405' of https://github.com/ngandrass/moodle into MOODLE_405_STABLE 2025-09-26 10:21:01 +07:00
Mihail Geshoski ee439d8fa8 Merge branch 'MDL-85803-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-26 11:10:14 +08:00
Jun Pataleta de0150412b Merge branch 'MDL-86363-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-26 11:07:51 +08:00
Jun Pataleta d1a9ba5386 Merge branch 'MDL-86383-405-enfix' of https://github.com/mudrd8mz/moodle into MOODLE_405_STABLE 2025-09-26 09:48:14 +08:00
Huong Nguyen d1a3d40f65 Merge branch 'MDL-85419-405' of https://github.com/sharpchi/moodle into MOODLE_405_STABLE 2025-09-26 08:47:01 +07:00
Huong Nguyen 7b0eac6677 Merge branch 'MDL-80447-405-4' of https://github.com/raortegar/moodle into MOODLE_405_STABLE 2025-09-26 08:25:06 +07:00
Paul Holden 1044306ce9 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:32 +01:00
Huong Nguyen 8648dc6046 MDL-80447 repository_googledocs: Add missing fields 2025-09-25 15:37:04 +02:00
Huong Nguyen f7f1a4562d MDL-80447 repository_googledocs: Switch to use core/pubsub 2025-09-25 15:37:04 +02:00
Tony Butler 30b02b20ef MDL-58001 mod_assign: Return early if no grade items are available 2025-09-25 12:04:04 +02:00
Amaia Anabitarte 94d260a4f8 MDL-58001 core_grades: New is_gradable() function in gradelib
Backported from main, introduced in MDL-85837.
2025-09-25 12:03:55 +02:00
Mihail Geshoski 63c2d91bc5 Merge branch 'MDL-86432-405' of https://github.com/timhunt/moodle into MOODLE_405_STABLE 2025-09-25 14:12:08 +08:00
Benjamin Walker 4bbb5edf35 MDL-85764 mod_quiz: Improve performance of quiz notifications task 2025-09-25 14:24:47 +10:00
Benjamin Walker bcf0384d05 MDL-82511 cachestore_redis: Reduce blocking when finding keys 2025-09-25 14:23:57 +10:00
Benjamin Walker e7cf1c6130 MDL-82511 cache: Improve performance of cleanup in cache_cron_task 2025-09-25 14:23:57 +10:00
Jun Pataleta 4fdc0b6768 Merge branch 'MDL-86599_405' of https://github.com/timhunt/moodle into MOODLE_405_STABLE 2025-09-25 12:08:36 +08:00
Mihail Geshoski 9883338e8c Merge branch 'MDL-85675-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-09-25 11:53:45 +08:00
Mihail Geshoski 08ccef4aec Merge branch 'MDL-85166_405_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_405_STABLE 2025-09-25 10:51:42 +08:00
Mihail Geshoski cc69e589a4 Merge branch 'MDL-84085-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-25 09:57:24 +08:00
AMOS bot 29857c9cde Automatically generated installer lang files 2025-09-25 00:07:52 +00:00
Andrew Nicols 2f6ec1d60a MDL-86432 qtype_ordering: Fix broken data provider 2025-09-24 17:53:38 +01:00
Amaia Anabitarte 34ce92a046 Merge branch 'MDL-86738-405' of https://github.com/sarjona/moodle into MOODLE_405_STABLE 2025-09-24 17:29:17 +02:00
Amaia Anabitarte e96ec9501a Merge branch 'MDL-86488-405-2' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-09-24 17:16:54 +02:00
Sara Arjona 76997fbf33 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:17:51 +02:00
raortegar 8135ded9e3 MDL-80447 repository_googledocs: Update Google Drive OAuth2 scope tests 2025-09-24 11:42:24 +02:00
raortegar c8f0320b24 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:42:23 +02:00
raortegar ab4c436f10 MDL-80447 core_repository: Add upload button to filepicker repository 2025-09-24 11:42:05 +02:00
Mihail Geshoski 9cf08382ae Merge branch 'MDL-83462-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-24 16:16:04 +08:00
Mihail Geshoski 85d0a666a3 Merge branch 'MDL-85682-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-24 10:20:31 +08:00
David Mudrák 0ea18ecce6 MDL-86383 lang: Use the fixed strings in tests, too 2025-09-23 20:47:24 +02:00
Helen Foster 38a820017a MDL-86383 lang: Import fixed English strings (en_fix) 2025-09-23 20:46:43 +02:00
Sara Arjona 4f6526ddb1 weekly release 4.5.6+ 2025-09-23 17:21:13 +02:00
Sara Arjona bf9b563340 NOBUG: Add upgrade notes 2025-09-23 17:21:13 +02:00
Huong Nguyen 02c4d8c217 Merge branch 'MDL-84504-maintenance-log-MOODLE_405_STABLE' of https://github.com/bwalkerl/moodle into MOODLE_405_STABLE 2025-09-23 18:38:17 +08:00
Huong Nguyen 321a86a858 Merge branch 'MDL-86586-405-choice-dropdown' of https://github.com/sharpchi/moodle into MOODLE_405_STABLE 2025-09-23 08:43:34 +07:00
Sara Arjona 2d2fd03b2c Merge branch 'MDL-86596-integration-405' of https://github.com/mihailges/moodle into MOODLE_405_STABLE 2025-09-22 10:13:02 +02:00
Mihail Geshoski 9ce91a9588 Merge branch 'MDL-86512-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-09-22 15:07:24 +08:00
Mihail Geshoski b2293b37f3 MDL-86596 tool_profiling: Revert string removal without deprecation 2025-09-22 13:09:56 +08:00
Huong Nguyen afab4c9d25 Merge branch 'MDL-84870-405' of https://github.com/andimendunia/moodle into MOODLE_405_STABLE 2025-09-22 08:28:44 +07:00
Huong Nguyen f1e8b839f8 Merge branch 'MDL-83066-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-22 08:24:26 +07:00
Brendan Heywood b7a3d429e2 MDL-84504 cli: Add config logging for cli maintenance mode 2025-09-22 10:13:52 +10:00
Brendan Heywood 10b28ebb08 MDL-84504 core: Allow setting config and logging with one call 2025-09-22 10:13:52 +10:00
Mihail Geshoski dfaa45838e Merge branch 'MDL-83080-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-21 22:47:29 +08:00
Mihail Geshoski af0713a6b7 Merge branch 'MDL-86596-405' of https://github.com/yerairogo/moodle into MOODLE_405_STABLE 2025-09-21 22:29:30 +08:00
Amaia Anabitarte 5ee8e97b61 Merge branch 'MDL-86174-405' of https://github.com/sarjona/moodle into MOODLE_405_STABLE 2025-09-19 16:11:27 +02:00
Amaia Anabitarte 91c8edfbef Merge branch 'MDL-84815-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-19 16:08:36 +02:00
Mark Sharp ebdd862f3c MDL-86586 core_form: Fixed dropdown JS error if no element found 2025-09-19 14:46:51 +01:00
Sara Arjona eb664d6d41 MDL-86174 badges: Add Canvas Credentials paid plan alert 2025-09-19 15:38:12 +02:00
Yerai Rodríguez c4f1af803c 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:54:14 +02:00
Huong Nguyen 0418c85bb4 weekly release 4.5.6+ 2025-09-19 15:33:57 +07:00
Huong Nguyen d5bad6b64d MDL-80053 core_grade: Fix illegal whitespaces 2025-09-19 15:15:55 +07:00
Huong Nguyen c922b363c4 Merge branch 'MDL-83991_405' of https://github.com/panchalrohit/moodle into MOODLE_405_STABLE 2025-09-19 08:57:11 +07:00
Mihail Geshoski 38be896581 Merge branch 'mdl-83857_405' of https://github.com/james-cnz/moodle into MOODLE_405_STABLE 2025-09-19 09:52:55 +08:00
James C 6efd33e7b3 MDL-83857 course: Use set_sectionid not num 2025-09-19 11:35:15 +12:00
Paul Holden 0a87d4507b Merge branch 'MDL-85616-405_glossary_undefined_variable' of https://github.com/davidherney/moodle into MOODLE_405_STABLE 2025-09-18 19:23:23 +01:00
Jun Pataleta 907a3442e9 MDL-86488 componentlibrary: Improved documentation for the action menu 2025-09-18 17:25:22 +08:00
Jun Pataleta 5e20e1d8b8 MDL-86488 mod_subsection: Click on the menu button itself, not the icon 2025-09-18 17:25:22 +08:00
Jun Pataleta 7c6d7a9e1f MDL-86488 behat: Click on the menu button itself, not the icon 2025-09-18 17:25:21 +08:00
Jun Pataleta c131932352 MDL-86488 qbank_columnsortorder: Use action menu Behat steps 2025-09-18 17:25:21 +08:00
Jun Pataleta c7d4f457d7 MDL-86488 behat: Update xpath for action menu trigger's label 2025-09-18 17:25:21 +08:00
Jun Pataleta 4e09d70272 MDL-86488 mod_data: Fix Behat tests for checking action menu items 2025-09-18 17:25:21 +08:00
Jun Pataleta 05d0c9b002 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:21 +08:00
Jun Pataleta e309724b41 MDL-86488 course: Set action menu icon for category actions menu 2025-09-18 17:25:20 +08:00
Jun Pataleta de7c1fdbe1 MDL-86488 mod_lti: Move menu trigger label outside the pix icon 2025-09-18 17:25:20 +08:00
Jun Pataleta 8c5c5eaee4 MDL-86512 mod_assign: Make the select column header name more accessible 2025-09-18 13:55:46 +08:00
Mihail Geshoski e19a406db8 Merge branch 'MDL-80053-405' of https://github.com/Jayce0808/moodle into MOODLE_405_STABLE 2025-09-17 23:33:09 +08:00
Paul Holden 39d9131ad7 Merge branch 'MDL-86454-405' of https://github.com/sh-csg/moodle into MOODLE_405_STABLE 2025-09-17 16:04:36 +01:00
Paul Holden d9a7733e16 Merge branch 'MDL-86541-405' of https://github.com/dfelipemonroy/moodle into MOODLE_405_STABLE 2025-09-17 11:52:57 +01:00
Amaia Anabitarte a11ccf13b6 Merge branch 'MDL-86490-405-2' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-09-17 11:52:22 +02:00
Jun Pataleta dc3598bcb4 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:27:00 +08:00
Jun Pataleta 095ce67f60 MDL-86490 mod_feedback: a11y improvements for delete template buttons
* Assign a button role to the action_icon.
* Increase target size by adding btn classes.
2025-09-16 22:43:05 +08:00
Jun Pataleta 81a0fbee7f MDL-86490 tool: Click on the action link itself and not on its icon 2025-09-16 22:43:05 +08:00
Jun Pataleta ce4b7b94e0 MDL-86490 output: Mark icon in action_icon as decorative 2025-09-16 22:43:04 +08:00
Jun Pataleta 5d8db4b548 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:38:18 +08:00
Jun Pataleta 4b9ad6b9fd 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:38:18 +08:00
Huong Nguyen b10dacbc75 weekly release 4.5.6+ 2025-09-16 20:58:58 +07:00
Jayce 9d9d52a404 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 13:43:06 +09:30
Jun Pataleta ee4dd60780 Merge branch 'MDL-86495-405-patch' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-09-16 10:16:29 +08:00
Mihail Geshoski a923f3724b Merge branch 'MDL-86558-405' of https://github.com/rjnl/moodle into MOODLE_405_STABLE 2025-09-16 09:55:16 +08:00
Huong Nguyen 641528e9d3 MDL-86495 core: Improve PHPUnit for IPLookup 2025-09-16 08:48:23 +07:00
Amaia Anabitarte 7d24bb77b3 Merge branch 'MDL-85541-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-15 14:57:06 +02:00
Amaia Anabitarte d5521c1871 Merge branch 'MDL-86157-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-15 14:50:46 +02:00
Paul Holden 6bbceaa405 MDL-86157 mod_glossary: correctly format entry page title. 2025-09-15 12:00:48 +01:00
Paul Holden f6c66d2be9 MDL-83080 message: handle core\url instance data as contexturl. 2025-09-15 10:40:28 +01:00
Andi Permana bb18341e72 MDL-84870 core: Update security.txt expiry 2025-09-15 14:31:04 +07:00
Huong Nguyen c93be20aa5 Merge branch 'MDL-79362-405' of https://github.com/abias/moodle into MOODLE_405_STABLE 2025-09-15 11:41:00 +07:00
Jun Pataleta 0214ea3e19 Merge branch 'MDL-86495-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-09-15 10:25:28 +08:00
Tim Hunt 3b847d4860 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:25 +01:00
Paul Holden 44dbf84bcb MDL-84085 mod_h5pactivity: account for missing ra table join alias. 2025-09-12 11:38:24 +01:00
Shamim Rezaie a3b82724be weekly release 4.5.6+ 2025-09-12 18:35:04 +10:00
Jun Pataleta 4ded9db847 Merge branch 'MDL-86294-M405_document-db-options' of https://github.com/ziegenberg/moodle into MOODLE_405_STABLE 2025-09-11 17:12:27 +08:00
Paul Holden ebeb8b6af2 Merge branch 'MDL-86330-405' of https://github.com/yerairogo/moodle into MOODLE_405_STABLE 2025-09-10 16:26:45 +01:00
Paul Holden bbda6fabe0 Merge branch 'MDL-86501-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-09-10 16:10:28 +01:00
Paul Holden 850b45a996 Merge branch 'MDL-86447_MOODLE_405_STABLE' of https://github.com/dcmexy/moodle into MOODLE_405_STABLE 2025-09-10 15:49:58 +01:00
Mihail Geshoski edbd895f60 Merge branch 'MDL-86479-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-09-10 22:17:22 +08:00
Paul Holden 01834f4bc1 Merge branch 'MDL-86489-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-09-10 15:04:08 +01:00
Diego Monroy c9ee1c582d MDL-86541 blocks: validate allowing block title to be '0' (zero). 2025-09-10 12:29:41 +02:00
Mihail Geshoski 00970d6e59 Merge branch 'MDL-86498-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-09-10 17:43:44 +08:00
Jun Pataleta 170a6056de 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:44:20 +08:00
Huong Nguyen ffc6111f4e Merge branch 'MDL-84076-MOODLE_405_STABLE' of https://github.com/PhMemmel/moodle into MOODLE_405_STABLE 2025-09-10 09:10:16 +07:00
Huong Nguyen a8e32ae7f3 Merge branch 'MDL-85270-m45' of https://github.com/micaherne/moodle into MOODLE_405_STABLE 2025-09-10 09:08:26 +07:00
Huong Nguyen ea7b951d3c Merge branch 'MDL-85266-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-10 09:05:49 +07:00
Paul Holden c0cd20aa61 Merge branch 'MDL-86499-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-09-09 14:15:36 +01:00
Paul Holden a0ffa26132 Merge branch 'MDL-86501-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-09-09 14:01:03 +01:00
Jun Pataleta f27faa1305 MDL-86498 badges: Empty string for empty links 2025-09-09 18:16:46 +08:00
Jun Pataleta ebc1084cdc MDL-86498 badges: Add label for badge navigation url_select 2025-09-09 18:16:46 +08:00
Jun Pataleta 0357a43862 MDL-86498 badges: Accessibility coverage for badge details and overview 2025-09-09 18:16:45 +08:00
Jake Dallimore 85a77b7a6c weekly release 4.5.6+ 2025-09-09 15:06:28 +08:00
Jake Dallimore e42e6b6408 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-09-09 15:06:22 +08:00
Huong Nguyen 8e52bbe341 Merge branch 'MDL-83003-M405_INFO-command-not-compatible-with-envoy-proxy-redis' of https://github.com/ziegenberg/moodle into MOODLE_405_STABLE 2025-09-09 09:29:23 +07:00
Huong Nguyen 3204204ad9 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:59 +07:00
Rajneel Totaram cc335884de MDL-86558 mod_quiz: Fix styles for sticky columns 2025-09-09 11:32:17 +12:00
Michael Aherne 30c73fa641 MDL-85270 output: Export url_select for template. 2025-09-08 10:11:44 +01:00
Mark Sharp 44f9fb5150 MDL-85419 core_courseformat: Move event trigger to after cm cache purge 2025-09-08 10:06:23 +01:00
Huong Nguyen b9af7918c8 Merge branch 'MDL-85335-405' of https://github.com/gbarat87/moodle into MOODLE_405_STABLE 2025-09-08 08:30:32 +07:00
Mihail Geshoski b9a6b71e3c Merge branch 'MDL-86374-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-08 09:22:34 +08:00
AMOS bot 9f330b6b40 Automatically generated installer lang files 2025-09-06 00:07:55 +00:00
Huong Nguyen dcc7e81ac2 weekly release 4.5.6+ 2025-09-05 23:54:09 +07:00
Huong Nguyen 54e319351a Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-09-05 23:53:58 +07:00
Philipp Memmel bfeda89d8c MDL-84076 core_templates: Avoid manipulation of template context object 2025-09-05 09:59:10 +02:00
Yerai Rodríguez 84306938ac 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:22:09 +02:00
Huong Nguyen a46f6637cc Merge branch 'MDL-83628-m405' of https://github.com/sammarshallou/moodle into MOODLE_405_STABLE 2025-09-05 09:22:00 +07:00
Simey Lameze e756ec3228 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:07:37 +08:00
Mihail Geshoski 1c8e7f1c7b Merge branch 'MDL-74046-405' of https://github.com/muhammadarnaldo/moodle into MOODLE_405_STABLE 2025-09-04 23:45:02 +08:00
ferran e6c202c420 Merge branch 'MDL-85416_405' of https://github.com/timhunt/moodle into MOODLE_405_STABLE 2025-09-04 16:31:26 +02:00
ferran f666a0d059 Merge branch 'MDL-72956-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-04 16:10:41 +02:00
Huong Nguyen dfa3176e03 Merge branch 'MDL-86230-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-04 15:44:28 +07:00
Huong Nguyen 8d5cec0164 Merge branch 'MDL-72511-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-09-04 15:42:14 +07:00
ferran 7636570179 Merge branch 'MDL-85641-405' of https://github.com/rjnl/moodle into MOODLE_405_STABLE 2025-09-04 10:11:25 +02:00
Muhammad Arnaldo ae21155775 MDL-74046 tool_lp: new-tab for competency frameworks repo link 2025-09-04 14:41:54 +07:00
Rajneel Totaram b637072b76 MDL-85641 mod_feedback: Use full width for reponses page 2025-09-04 10:05:01 +12:00
Paul Holden f10d3c78e0 Merge branch 'MDL-85619-405' of https://github.com/mihailges/moodle into MOODLE_405_STABLE 2025-09-03 12:38:32 +02:00
Paul Holden aab8839ab6 Merge branch 'MDL-84982-405' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_405_STABLE 2025-09-03 12:29:55 +02:00
Paul Holden 7b6463fbba Merge branch 'MDL-86187-MOODLE_405_STABLE' of https://github.com/phmemmel/moodle into MOODLE_405_STABLE 2025-09-03 12:16:20 +02:00
Mihail Geshoski 42a7c6df26 Merge branch 'MDL-82244-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-03 12:21:01 +08:00
Mihail Geshoski a3968e0b73 Merge branch 'MDL-73671-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-03 12:15:04 +08:00
Mihail Geshoski aec7468f67 Merge branch 'MDL-83474-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-03 12:07:26 +08:00
AMOS bot ee36d500c9 Automatically generated installer lang files 2025-09-03 00:07:52 +00:00
ferran 6cf9ed0f40 Merge branch 'MDL-71786-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-09-02 17:03:50 +02:00
Tim Hunt d0be2a57ce 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 used on-screen.

This commit makes it consistent.
2025-09-02 15:34:23 +02:00
Michael Hawkins 2653626ca0 weekly release 4.5.6+ 2025-09-02 20:32:36 +08:00
Michael Hawkins ace600fe84 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-09-02 20:32:15 +08:00
Mihail Geshoski 28fe42c4ec Merge branch 'mdl-84975_405' of https://github.com/james-cnz/moodle into MOODLE_405_STABLE 2025-09-02 09:43:59 +08:00
Mihail Geshoski c27fde3701 Merge branch 'MDL-86366-405' of https://github.com/lucaboesch/moodle into MOODLE_405_STABLE 2025-09-01 23:18:58 +08:00
Paul Holden a9cf380584 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:05 +02:00
Paul Holden 21cb028390 MDL-73671 mod_forum: shift activity due/cutoff dates during reset. 2025-09-01 16:55:14 +02:00
Mihail Geshoski d8cbfc285a Merge branch 'MDL-85018_405_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_405_STABLE 2025-09-01 22:28:08 +08:00
Mihail Geshoski bc3f269ac8 Merge branch 'MDL-73417-405' of https://github.com/rjnl/moodle into MOODLE_405_STABLE 2025-09-01 22:17:58 +08:00
Jun Pataleta 7a6e74a9fe 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:54 +08:00
AMOS bot c489b7ac0a Automatically generated installer lang files 2025-09-01 00:07:49 +00:00
Luca Bösch 69c42304f0 MDL-86366 quiz: Description shouldn't show each secure page, but title. 2025-08-31 21:27:04 +02:00
Paul Holden dea5950384 MDL-85266 tool_uploaduser: correctly key bulk users session array. 2025-08-29 15:50:14 +01:00
Paul Holden 6aec3fe946 MDL-84815 user: fix selector element search checkbox alignment.
The removal in d0d62fd0 of the `.form-inline` class caused the
mis-alignment of checkbox inputs in the "Search options" container.

Restore behaviour provided by the aforementioned class in descendent
elements by applying corresponding styles, that were lost with that
change.
2025-08-29 15:48:35 +01:00
Jun Pataleta 72fe24b91a MDL-86479 course: Add accessibility coverage for course index options 2025-08-29 21:05:22 +08:00
cescobedo a7c0d3605a weekly release 4.5.6+ 2025-08-29 15:01:14 +02:00
cescobedo d53466d1c6 NOBUG: Add upgrade notes 2025-08-29 15:01:14 +02:00
Jun Pataleta cc10e8e245 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:10 +08:00
Jun Pataleta 65bddce33c MDL-86499 core: Make table sort icons decorative 2025-08-29 12:23:59 +08:00
Huong Nguyen 4bb0555b62 Merge branch 'MDL-86343-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-08-29 11:04:02 +07:00
Huong Nguyen 63448b6f98 Merge branch 'MDL-85743-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-08-29 11:00:49 +07:00
Mihail Geshoski bc472d3ea1 Merge branch 'MDL-83256-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-08-29 11:31:45 +08:00
Huong Nguyen ed9673fe1f Merge branch 'MDL-86452-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-08-29 08:46:20 +07:00
Huong Nguyen 004cc09738 Merge branch 'MDL-86301-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-08-29 08:41:28 +07:00
Paul Holden a41dc037c9 MDL-82244 course: use site default course visibility in external call. 2025-08-28 17:40:09 +01:00
Amaia Anabitarte 4158ea095b Merge branch 'MDL-86280-405' of https://github.com/lucaboesch/moodle into MOODLE_405_STABLE 2025-08-28 11:17:27 +02:00
Jun Pataleta 337346e3d1 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:51:59 +08:00
Jun Pataleta b04e0bd518 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:42:33 +08:00
Andrew Nicols 028728b561 MDL-86452 core: Reset navigation data between tests 2025-08-28 13:13:05 +08:00
Stefan Hanauska b33729ab1d MDL-86454 badges: Hide revoke button if not available 2025-08-27 10:08:21 +02:00
Dean Chimezie f69c22ecda MDL-86447 tool_mfa: Restore setup lang string 2025-08-26 13:40:31 -04:00
cescobedo ca2c397895 weekly release 4.5.6+ 2025-08-26 15:54:09 +02:00
cescobedo 7dfc4481d4 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-08-26 15:53:56 +02:00
Mihail Geshoski dc74787166 Merge branch 'MDL-85677-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-08-26 11:57:04 +08:00
Mihail Geshoski a6146d1c58 Merge branch 'MDL-85229-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-08-26 11:48:45 +08:00
Huong Nguyen ca050231fb Merge branch 'MDL-86315-405' of https://github.com/davewoloszyn/moodle into MOODLE_405_STABLE 2025-08-26 09:23:30 +07:00
Simey Lameze e4e7d72571 MDL-85677 behat: test to verify SEB download link visibility 2025-08-26 09:17:47 +08:00
Mihail Geshoski 938dbde96c Merge branch 'MDL-85676-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-08-26 00:43:21 +08:00
Andrew Nicols 15f30a7314 MDL-86301 core: Create autoloadable externallib_testcase 2025-08-25 15:14:03 +08:00
Simey Lameze 3bb18b29e0 MDL-85676 behat: validate SEB attempt message 2025-08-25 14:08:03 +08:00
Luca Bösch c69a91921e MDL-86280 mod: Do not filter help text in activity chooser.
Co-authored-by: Ferran Recio <ferran@moodle.com>
2025-08-24 22:42:25 +02:00
AMOS bot bb56dbdc74 Automatically generated installer lang files 2025-08-24 00:09:58 +00:00
Mihail Geshoski dc3c3ca98a weekly release 4.5.6+ 2025-08-22 20:40:21 +08:00
Mihail Geshoski 15bc48978d NOBUG: Add upgrade notes 2025-08-22 20:40:21 +08:00
Huong Nguyen a93254f43c MDL-73845 enrol_database: Fix MySQL issue 2025-08-22 12:58:48 +08:00
Huong Nguyen 77beaab116 Merge branch 'MDL-86231-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-08-22 08:46:55 +07:00
Jun Pataleta ce3a869c07 MDL-81455 behat: Add accessibility coverage to default start page tests 2025-08-21 17:50:44 +08:00
Jun Pataleta e76ec78b37 Merge branch 'MDL-81455-405' of https://github.com/rajutm25/moodle into MOODLE_405_STABLE 2025-08-21 17:48:08 +08:00
Jun Pataleta fe0f5baa2d Merge branch 'MDL-86202-405' of https://github.com/rjnl/moodle into MOODLE_405_STABLE 2025-08-21 15:20:51 +08:00
Rajneel Totaram caf61abd94 MDL-86202 mod_lesson: Use correct heading level 2025-08-21 18:39:33 +12:00
Mihail Geshoski 179848ea1f Merge branch 'MDL-84850-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-08-21 11:44:26 +08:00
Huong Nguyen b4c7d832b7 Merge branch 'MDL-80611-405' of https://github.com/marinaglancy/moodle into MOODLE_405_STABLE 2025-08-21 08:54:57 +07:00
Mihail Geshoski a061fd95bd Merge branch 'MDL-84739-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-08-20 17:22:51 +08:00
Paul Holden c9661b9a52 MDL-85684 mod_assign: format course/assignment notification content. 2025-08-20 09:14:51 +01:00
Paul Holden af96e46e56 MDL-83474 webservice: fix empty/zero $itemid handling in text format. 2025-08-20 09:08:32 +01:00
Huong Nguyen c1bdb76d18 Merge branch 'MDL-73845-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-08-20 08:41:43 +07:00
Paul Holden a97e536341 MDL-86374 report_outline: use formatted activity name in report. 2025-08-20 00:41:04 +01:00
Paul Holden 0e1de8d591 MDL-85743 user: correct debugging for missing user picture fields. 2025-08-19 17:12:40 +01:00
Paul Holden 51587e9909 MDL-84850 tag: ensure course tags enabled before adding to navigation. 2025-08-19 17:11:00 +01:00
Shamim Rezaie 43767635b7 weekly release 4.5.6+ 2025-08-20 00:45:53 +10:00
Shamim Rezaie 68776525be Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-08-20 00:45:43 +10:00
rajutm25 41728c3d87 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:39 +05:30
Paul Holden fcdcd9d7e6 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:48 +01:00
Mi Jia Looi 7e3e2077f0 MDL-73845 enrol_database: Add lock to prevent race condition 2025-08-19 15:36:19 +07:00
Jun Pataleta 2395392c99 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:26:18 +08:00
Jun Pataleta aef8d9e6f1 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:26:18 +08:00
Huong Nguyen e74c4acec4 Merge branch 'MDL-86109-405' of https://github.com/stevandoMoodle/moodle into MOODLE_405_STABLE 2025-08-19 09:53:44 +07:00
Mihail Geshoski 74c9f95c4c Merge branch 'MDL-83772-405' of https://github.com/srobotta/moodle into MOODLE_405_STABLE 2025-08-19 10:27:09 +08:00
Paul Holden 5ce61f4be4 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:06:35 +01:00
Paul Holden c9a677dc7c MDL-84739 gradingform_rubric: consistently style rubric table icons. 2025-08-18 08:57:58 +01:00
Paul Holden e9b11f36d5 MDL-83256 user: account for course context instances of teacher fields. 2025-08-18 08:57:06 +01:00
Paul Holden e6bae7d01f MDL-85229 mod_url: observe description appearance setting on display.
Correctly determine whether said description is in fact "empty".
2025-08-18 08:55:55 +01:00
Paul Holden 9359d08bd6 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:36 +01:00
Daniel Ziegenberg 7b1af357ff 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:07:52 +02:00
AMOS bot ff4c249e39 Automatically generated installer lang files 2025-08-16 00:07:53 +00:00
Philipp Memmel 106fae466d MDL-86187 core_ddl: Add reserved keywords for MySQL 8.4 2025-08-15 11:17:40 +00:00
Paul Holden 2be96308d3 MDL-85682 mod_assign: account for absence of workflow select filter. 2025-08-15 10:48:22 +01:00
David Woloszyn 2bf704c153 MDL-86315 registration: Unset emails in hub when dependant value not set 2025-08-15 12:33:15 +10:00
Huong Nguyen e07cf88f4d weekly release 4.5.6+ 2025-08-15 09:27:00 +07:00
Stevani Andolo 31ce71608d MDL-86109 tiny_media: Fix selected subtitles and captions language
Ensures the selected subtitle or caption language is correctly retained
and displayed.
2025-08-15 10:13:33 +08:00
Paul Holden 84858b01cf MDL-72956 mod_feedback: remove session access for started activities. 2025-08-14 11:27:39 +01:00
Rajneel Totaram 969b1a7f98 MDL-73417 mod_assign: Remove duplicate array key 2025-08-14 14:34:15 +12:00
AMOS bot 33035402a4 Automatically generated installer lang files 2025-08-14 00:08:00 +00:00
AMOS bot 943801d2d9 Automatically generated installer lang files 2025-08-13 00:08:01 +00:00
guillaumebarat 59aef0a010 MDL-85335 cli: Allow uninstall of sub-plugin when parent missing 2025-08-12 15:07:29 +10:00
James C 20e708cf73 MDL-84975 course: Handle tags in section and activity move dialogues 2025-08-12 13:22:29 +12:00
Mark Johnson 47fb08fc6d MDL-85166 question: Update move_question_set_references
This backports the applicable part of MDL-85210 to 4.5.

move_question_set_references expected the set reference to use the old
filter format.

This change converts the filter to the new format if required, before
updating the category and context ids.
2025-08-11 10:55:50 +01:00
Mark Johnson a576b9db5d 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:37:05 +01:00
Mark Johnson 9cd0fe59a3 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:37:05 +01:00
Paul Holden 66db7639e9 MDL-85541 gradereport_history: show user country value correctly. 2025-08-11 09:17:23 +01:00
Stephan Robotta 168d27f0b3 MDL-83772 mod_data: Fixed autosave bug in text areas with same name 2025-08-11 08:50:33 +02:00
Andrew Nicols cc7a7d2b2c MDL-86231 behat: Support array callable syntax in execute method 2025-08-08 11:42:30 +08:00
Mihail Geshoski fb02f4fa9f Moodle release 4.5.6 2025-08-08 10:48:30 +08:00
Mihail Geshoski 85a6851a8e NOBUG: Add upgrade notes 2025-08-08 10:48:29 +08:00
Sara Arjona 2db7c80f80 weekly release 4.5.5+ 2025-08-07 16:45:16 +02:00
Sara Arjona ec3ab5528a NOBUG: Add upgrade notes 2025-08-07 16:45:16 +02:00
Sara Arjona 256080fb2c NOBUG: Fixed file access permissions 2025-08-07 16:45:10 +02:00
Sara Arjona 8c2110c80c Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-08-07 16:45:07 +02:00
Huong Nguyen 9a45e5c064 Merge branch 'MDL-86004-405' of https://github.com/davewoloszyn/moodle into MOODLE_405_STABLE 2025-08-07 14:10:00 +07:00
David Woloszyn db896863cb MDL-86004 core: Modify upgrade step for Microsoft endpoints
The upgrade step for Microsoft OAuth2 issuers has been modified
to address an oversight in MDL-84432. The upgrade now only updates
service base urls for multi-tenant issuers.

Co-authored-by: Raju Tummoji <raju.tummoji@moodle.com>
2025-08-07 17:01:14 +10:00
Huong Nguyen 5f0d1b806c Merge branch 'MDL-85718-405' of https://github.com/yusufwib01/moodle into MOODLE_405_STABLE 2025-08-07 12:23:54 +07:00
Huong Nguyen 789f112c86 Merge branch 'MDL-86205-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-08-07 12:15:07 +07:00
Huong Nguyen f35a5c1047 Merge branch 'MDL-85794-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-08-07 11:37:33 +07:00
Jun Pataleta 43aa89c255 MDL-86205 message: Close drawer when activating elements outside of it 2025-08-07 12:31:05 +08:00
Huong Nguyen 99dc7feb31 Merge branch 'MDL-85795-405-2' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-08-07 11:26:26 +07:00
Huong Nguyen eb0dd85d88 MDL-84217 editor_tiny: Remove incorrect map file 2025-08-07 11:13:28 +07:00
Huong Nguyen 13d7e5dc6b Merge branch 'MDL-84217-405' of https://github.com/stevandoMoodle/moodle into MOODLE_405_STABLE 2025-08-07 10:56:34 +07:00
Ilya Tregubov 1646ce747e MDL-63395 user: Fix profile visibility check.
It needs to be done in user_get_user_details as well.
2025-08-07 10:30:04 +07:00
Jun Pataleta 0082009561 Merge branch 'MDL-85674-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-08-07 10:44:07 +08:00
Jun Pataleta ec3f9ed5e4 Merge branch 'MDL-78233-405' of https://github.com/Tasiobg/moodle into MOODLE_405_STABLE 2025-08-07 10:35:06 +08:00
Jun Pataleta ca7501babb Merge branch 'MDL-85802-405' of https://github.com/mihailges/moodle into MOODLE_405_STABLE 2025-08-07 10:33:37 +08:00
Mihail Geshoski 6035d07677 Merge branch 'MDL-79540_405_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_405_STABLE 2025-08-07 10:19:19 +08:00
Huong Nguyen f71bd594d1 Merge branch 'MDL-84010-m405' of https://github.com/sammarshallou/moodle into MOODLE_405_STABLE 2025-08-07 09:17:44 +07:00
AMOS bot 19e31c4169 Automatically generated installer lang files 2025-08-07 00:07:56 +00:00
ferran 17c8757314 Merge branch 'MDL-86176-405' of https://github.com/sarjona/moodle into MOODLE_405_STABLE 2025-08-06 16:22:00 +02:00
Sara Arjona 0427e1bf7b MDL-86176 badges: Adjust badges due to Canvas Credentials changes
This change addresses necessary adjustments to how OBV2.0 badges are
sent to backpacks, specifically to ensure compatibility and correct
functionality following recent updates to Canvas Credentials' conditions.

It ensures our badge integration continues to operate smoothly despite
these external changes.
2025-08-06 15:05:55 +02:00
Jun Pataleta 8c84d14195 MDL-85795 behat: Update button text used in search steps 2025-08-06 19:58:09 +08:00
Simey Lameze e375efca79 MDL-85674 behat: replace multiple steps by a single table step 2025-08-06 18:20:54 +08:00
andelacruz d870292683 MDL-85674 mod_grade: Behat test for multiple questions manual grading 2025-08-06 18:20:54 +08:00
Jun Pataleta 2e9c76095c Merge branch 'MDL-86095-405' of https://github.com/rjnl/moodle into MOODLE_405_STABLE 2025-08-06 15:41:11 +08:00
yusufwib01 0a3e64de5d MDL-85718 tiny_link: Improve image link behavior in TinyMCE 2025-08-06 14:31:16 +07:00
Rajneel Totaram 5008146b77 MDL-86095 mod_book: Let screenreader know print book opens in new window 2025-08-06 18:33:24 +12:00
Huong Nguyen 03430a4060 Merge branch 'MDL-85132_405_STABLE' of https://github.com/vladaskidanovas/moodle into MOODLE_405_STABLE 2025-08-06 10:54:18 +07:00
Laurent David 7616aa1eef MDL-84464 Report: Hide report for teachers without groups 2025-08-06 10:22:13 +07:00
Laurent David 6978147a03 MDL-84463 mod_feedback: Fix typo in behat test description 2025-08-06 03:05:21 +00:00
Laurent David a0f12b787b MDL-84463 mod_feedback: Fix users in no group and email
* Non editing teachers in no group should not receive feedback emails
from students in no group
2025-08-06 03:05:21 +00:00
Laurent David 890d43e1c3 MDL-84463 mod_feedback: Fix show entries and nonrespondents
* Non editing teachers not in a groups should not see entries
from other users
2025-08-06 03:05:21 +00:00
raortegar 4068e8ee2b MDL-85704 mod_bigbluebuttonbn: Update sesskey handling for compatibility 2025-08-06 03:05:21 +00:00
Huong Nguyen 4d12c8fac3 Merge branch 'MDL-85510-405' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_405_STABLE 2025-08-06 08:30:16 +07:00
Paul Holden 98659fad08 MDL-86230 admin: fix site registration link to Moodle app.
Broken by 5d316201.
2025-08-06 00:36:09 +01:00
Khoa Nguyen Dang f56e272ff7 MDL-85510 Questions: clearfix from MDL-84708 affects spacing
Co-authored-by: Mikel Martín Corrales <mikel@moodle.com>
2025-08-05 15:53:22 +07:00
Stevani Andolo 98f8fdee6a MDL-84217 editor_tiny: Added 'img-fluid' class to dropped image files 2025-08-05 15:00:45 +08:00
sam marshall a08193f094 MDL-84010 core_files: sync_external_file can cause infinite recursion 2025-08-05 07:49:02 +01:00
Mihail Geshoski 1159f0763b Merge branch 'MDL-86001-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-08-05 11:42:33 +08:00
Mihail Geshoski 33b7ccdd88 Merge branch 'MDL-85565_405' of https://github.com/PhilippImhof/moodle into MOODLE_405_STABLE 2025-08-05 11:35:54 +08:00
Mihail Geshoski eb97c10d89 Merge branch 'MDL-85492_405' of https://github.com/krisbax/moodle into MOODLE_405_STABLE 2025-08-05 11:20:41 +08:00
Huong Nguyen 49e3a29b00 Merge branch 'MDL-85338-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-08-05 09:11:07 +07:00
Huong Nguyen b784f20565 Merge branch 'MDL-85231-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-08-05 08:50:32 +07:00
Huong Nguyen 375e56bb9b Merge branch 'MDL-86043-405' of https://github.com/tasiobg/moodle into MOODLE_405_STABLE 2025-08-05 08:32:14 +07:00
Jun Pataleta 76f0a88d89 MDL-85795 message: Enclose the search widget in a group 2025-08-04 18:46:50 +08:00
Jun Pataleta c4b864606f MDL-85795 search: Enclose the search widget in a group 2025-08-04 18:46:49 +08:00
Simey Lameze cbd7cd61fa MDL-86186 behat: enlarge window size before asserting 2025-08-04 11:27:31 +08:00
Shamim Rezaie 86d14f5932 Merge branch 'MDL-85787-405-2' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-08-04 09:53:52 +10:00
Paul Holden 9f56af660a MDL-83462 mod_page: observe page description display in popup. 2025-08-01 17:04:26 +01:00
Jun Pataleta d1575b2739 MDL-85794 message: Set notification preferences controls within a group 2025-08-01 18:51:22 +08:00
Mihail Geshoski 9a419d4378 MDL-85802 mod_quiz: Fix double-escaping in notification content
Avoids double-escaping when filtering notification content. Adds
a unit test to validate the content filtering logic.
2025-08-01 18:50:12 +08:00
Iñigo Zendegi dc869f0c05 MDL-85802 mod_quiz: format course/quiz notification content. 2025-08-01 18:50:12 +08:00
Jun Pataleta 9e7c8cd9c0 MDL-85231 message: Style the notification buttons consistently 2025-08-01 13:09:02 +08:00
Jun Pataleta 43b5b809e6 MDL-85231 message_popup: Add a close button on the notification popover
This follows the recommendation on the ARIA Authoring Practices Guide
(APG) for modal dialogues:
> It is strongly recommended that the tab sequence of all dialogs
> include a visible element with role button that closes the dialog,
such as a close icon or cancel button.

https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/
2025-08-01 13:09:02 +08:00
Laurent David b56614fce6 MDL-85231 message_popup: Add focustrap in message popup 2025-08-01 13:09:02 +08:00
David Mudrák 8143ad5cb5 MDL-85945 lang: Use fixed strings in the tests, too 2025-07-31 17:06:06 +02:00
Helen Foster 580a46bf12 MDL-85945 lang: Import fixed English strings (en_fix) 2025-07-31 17:05:30 +02:00
Sara Arjona b479c7a056 weekly release 4.5.5+ 2025-07-31 16:08:40 +02:00
Sara Arjona 353f4ed7cc NOBUG: Add upgrade notes 2025-07-31 16:08:39 +02:00
Sara Arjona 599b74c1a2 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-07-31 16:08:33 +02:00
Michael Hawkins 6498193e6d Merge branch 'MDL-85362-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-07-31 14:37:06 +08:00
Huong Nguyen eea759e64c Merge branch 'MDL-86062-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-07-31 10:21:03 +07:00
Huong Nguyen b9bea60fa8 Merge branch 'MDL-84485-Select-webservice-in-wstoken-behat-breadcrumb-405' of https://github.com/farhan6318/moodle into MOODLE_405_STABLE 2025-07-31 10:17:52 +07:00
Huong Nguyen afd0e41b69 Merge branch 'MDL-85897-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-07-31 08:58:32 +07:00
AMOS bot 5bf57f83c9 Automatically generated installer lang files 2025-07-31 00:08:02 +00:00
Shamim Rezaie b00188cd82 Merge branch 'MDL-85295-405' of https://github.com/rjnl/moodle into MOODLE_405_STABLE 2025-07-31 02:44:01 +10:00
Shamim Rezaie 5ea0f0f35e Merge branch 'MDL-72133-filter-deleted-logs-MOODLE_405_STABLE' of https://github.com/bwalkerl/moodle into MOODLE_405_STABLE 2025-07-31 02:27:18 +10:00
Mihail Geshoski 3e43057840 Merge branch 'MDL-86113-405' of https://github.com/snake/moodle into MOODLE_405_STABLE 2025-07-30 23:29:17 +08:00
Mihail Geshoski 8730b522e6 Merge branch 'MDL-85470-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-07-30 23:10:44 +08:00
Tasio 3bcbaf2ec8 MDL-86043 core: test for the task sending new users an email 2025-07-30 16:23:42 +02:00
Tasio d205f1bcb4 MDL-86043 core: fix sql to work in oracle
I’ve updated the query to use sql_isnotempty, which generates the correct SQL for the selected database.
I have aso added an "order by" because after some testing I noticed that Oracle and MySQL retun the results
in different order which feels inconsistent and makes it more difficult to test.
2025-07-30 16:23:34 +02:00
Paul Holden 116dc12ed1 MDL-85338 message: make messaging drawer responsive to sticky footer.
Co-authored-by: David Woloszyn <david.woloszyn@moodle.com>
2025-07-30 13:59:01 +01:00
Jun Pataleta de57e4a1cf Merge branch 'MDL-85995-405' of https://github.com/rjnl/moodle into MOODLE_405_STABLE 2025-07-30 17:10:09 +08:00
Andrew Nicols 86479d5871 MDL-86062 mod_choice: Stop calling get_string from lib.php 2025-07-30 13:58:40 +08:00
Andrew Nicols 63a21837db MDL-85897 core: Move all deprecations to emit_deprecation 2025-07-30 13:53:27 +08:00
Andrew Nicols 2181327bf2 MDL-85897 core: Add emit_deprecation() method
This changeset adds a new `\core\deprecation::emit_deprecation` method
with the same signature as the `emit_deprecation_if_found()` method.

It is intended to be used in places where something is guaranteed to
have been deprecated, and will throw appropriate debugging if the
deprecated attribute is not found.

The `emit_deprecation_if_found()` method should still be used where the
item being checked is not known to be deprecated or not, for example in
calling code.
2025-07-30 13:53:21 +08:00
Huong Nguyen f12170bb56 Merge branch 'MDL-85590_fix_modal_backdrop_attachment_point_405' of https://github.com/MariaMozgunova/moodle into MOODLE_405_STABLE 2025-07-30 08:37:46 +07:00
Farhan Karmali 4985662a5b MDL-84485 webservice: Add Behat step for mobile web service selection
This commit introduces a mandatory service selection step in our Behat tests
to ensure consistent behavior in environments with multiple third-party services.
2025-07-29 16:00:51 +05:30
Huong Nguyen 763bff0289 Merge branch 'MDL-85855-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-07-29 16:49:51 +07:00
Jun Pataleta af455ccfe2 MDL-85470 badges: Add a11y Behat test for the manage badges page 2025-07-29 15:17:24 +08:00
Jun Pataleta f83d35c631 MDL-85470 badges: Use badge:namewithimagelink column in badges table 2025-07-29 15:17:24 +08:00
Jun Pataleta bc100f6efa MDL-85470 reportbuilder: New column containing badge image, name, link 2025-07-29 15:17:24 +08:00
Jun Pataleta fde36bb49c MDL-85787 course: Limit course index drag and drop to certain pages only
Only allow the drag and drop functionality in the course index on pages
that provide alternatives to move course items such as the course
homepage and the course section view pages.

This is to meet the WCAG 2.2 Level AA Success Criterion 2.5.7 for
dragging movements.
See: https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements
2025-07-29 11:46:02 +08:00
Jayce Birrell 38fe5cc384 MDL-85698 core: combo box informs screen reader users 2025-07-29 10:52:55 +09:30
AMOS bot 67249bea47 Automatically generated installer lang files 2025-07-28 13:16:59 +00:00
Maria Mozgunova 20dfe6475b MDL-85590 core: Fix modal backdrop attachment point for full screen 2025-07-28 10:46:30 +01:00
Benjamin Walker b08eaaa028 MDL-72133 report_log: Add fallback context display 2025-07-28 09:06:40 +10:00
Benjamin Walker b3e2e81b0d MDL-72133 report_loglive: Display logs filtered by deleted course ids 2025-07-28 09:06:40 +10:00
Benjamin Walker eb0634d489 MDL-72133 report_log: Display logs filtered by deleted course ids 2025-07-28 09:06:40 +10:00
Philipp Imhof 59808c6870 MDL-85565 phpunit: check for <select> before <option>
Make sure that assert_select_options() will fail when the output does
not contain a <select> and therefore does not have the given options.
2025-07-25 13:13:30 +02:00
Jake Dallimore 4a02a9975d MDL-86113 mod_lti: skip slow network calls during tests
This check exists to determine whether a given tool URL is a cartridge,
specifically when the URL does not end in .xml. It hits the URL to
determine this. In tests, we have many mock tool URLs, which won't
resolve, and running this code causes large hangs and random failures.
Any tests covering cartridge support still work fine, provided they
continue to use URLs ending in .xml; this change only skips the check
during tests for other non-xml URLs.
2025-07-25 16:49:07 +08:00
Michael Hawkins 51662cb8ef weekly release 4.5.5+ 2025-07-25 12:14:36 +08:00
Michael Hawkins c3e13a4ca6 Merge branch 'MDL-83111-405' of https://github.com/sh-csg/moodle into MOODLE_405_STABLE 2025-07-24 12:01:17 +08:00
Huong Nguyen 35eec5b9aa Merge branch 'MDL-86049-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-07-24 09:47:51 +07:00
Huong Nguyen 3b68cecb15 Merge branch 'MDL-85504-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-07-24 09:44:11 +07:00
Rajneel Totaram 4c3be75ef2 MDL-85995 mod_book: Make previous/next buttons accessible 2025-07-24 10:08:39 +12:00
Jun Pataleta dc91c2144c MDL-85504 mod_feedback: Enhance the question edit form via JS
The drag handle and actions menu should not be within the accessible
labels of the question items. In order to enhance the question edit
form with these, they need to be rendered via JS outside of container
of the questions' accessible name.
2025-07-23 16:15:52 +08:00
Amaia Anabitarte 319113f872 Merge branch 'MDL-85989-405' of https://github.com/sarjona/moodle into MOODLE_405_STABLE 2025-07-23 10:14:00 +02:00
Jun Pataleta e894f95f6c MDL-85504 form: Legend's label template data should not be escaped
The label context data in the fieldset's legend tag should not be
escaped and allow raw HTML given that legend tags can contain
phrasing content and headings.

See developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/legend.
2025-07-23 16:10:53 +08:00
Huong Nguyen 977eacdfc0 Merge branch 'MDL-60799_405' of https://github.com/jonof/moodle into MOODLE_405_STABLE 2025-07-23 09:03:42 +07:00
Huong Nguyen d43a89d86f Merge branch 'MDL-83996-readonly-false-positive-MOODLE_405_STABLE' of https://github.com/bwalkerl/moodle into MOODLE_405_STABLE 2025-07-23 09:00:13 +07:00
Huong Nguyen 39c57e2f02 Merge branch 'MDL-84787-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-07-23 08:51:37 +07:00
Huong Nguyen c68104c12f Merge branch 'MDL-85573-tool-brickfield-uninstall-405' of https://github.com/szymonk1101/moodle into MOODLE_405_STABLE 2025-07-23 08:33:49 +07:00
Rohit Panchal 63cc9efdbc MDL-83991 tag: Optimized tag sql query 2025-07-23 01:00:33 +05:30
Mihail Geshoski b177a0cee6 Merge branch 'MDL-85997-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-07-22 23:35:25 +08:00
Mihail Geshoski 3d41378956 Merge branch 'MDL-85038-M405_dml_missing_record_exception-when-running-mod_assign-task-send_assignment_due_soon_notification_to_user' of https://github.com/ziegenberg/moodle into MOODLE_405_STABLE 2025-07-22 23:28:41 +08:00
Mihail Geshoski 09f9052355 Merge branch 'MDL-83558-405' of https://github.com/andrewgos/moodle into MOODLE_405_STABLE 2025-07-22 13:54:02 +08:00
Huong Nguyen 1ef0196b0d MDL-85362 core: Define environment requirements for Moodle 5.1 2025-07-22 10:54:17 +07:00
Rajneel Totaram a5e3d3f018 MDL-85295 qtype_ordering: render feedback properly
'answertext' is already passed through format_text(), so no need to escape it in the template.
2025-07-22 11:40:38 +12:00
Andrew Nicols 7c4210b6ea MDL-86049 core: Do not use the component cache before purge
When trying to resolve a corrupt cache where it is not possible to
complete the Moodle setup/bootstrap, it is necessary to ignore the
current cache to load the cache purging infrastructure.
2025-07-21 12:25:26 +08:00
Benjamin Walker 5aec7f1992 MDL-83996 sessions: Fix false positive read only sessions errors 2025-07-21 10:26:27 +10:00
Mihail Geshoski c97987e9ed weekly release 4.5.5+ 2025-07-18 14:52:50 +08:00
Mihail Geshoski 266d5f8857 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-07-18 14:52:37 +08:00
Paul Holden 6a1d35dfa0 MDL-85944 block_myoverview: fix previously badly nested SCSS. 2025-07-17 15:25:05 +07:00
Mihail Geshoski d7d824e872 Merge branch 'MDL-85055-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-07-17 12:14:56 +08:00
Paul Holden 396f77e552 MDL-85055 task: correct use of DI provided frozen Clock API.
Fixes some of the usage introduced in tests as part of a35335a9.
2025-07-17 11:56:55 +08:00
Huong Nguyen a736250f33 Merge branch 'MDL-85050-405' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_405_STABLE 2025-07-17 10:24:34 +07:00
Huong Nguyen b0c912d6f0 Merge branch 'MDL-85944-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-07-17 08:53:01 +07:00
Huong Nguyen 72640fbc5a Merge branch 'MDL-81384-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-07-17 08:44:04 +07:00
Shamim Rezaie 29fab26069 Merge branch 'MDL-73003-405' of https://github.com/Jayce0808/moodle into MOODLE_405_STABLE 2025-07-17 07:29:47 +10:00
Mihail Geshoski 114917dc65 Merge branch 'MDL-77237-405' of https://github.com/meirzamoodle/moodle into MOODLE_405_STABLE 2025-07-16 23:53:15 +08:00
Huong Nguyen c9c1d71c32 Merge branch 'MDL-85609-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-07-16 09:52:48 +07:00
Andrew Gosali a61e0d92ed MDL-83558 mod_forum: fix incorrect message on edge case scenario
(when student tries to see all participants on a forum with visible groups mode)
2025-07-15 22:46:02 +07:00
Daniel Ziegenberg 4e822cccfd MDL-85038 assignment: fix exception on sending assignment notification
When the assignment gets deleted between the creation of the ad-hoc task
mod_assign\task\send_assignment_due_soon_notification_to_user or
mod_assign\task\send_assignment_overdue_notification_to_user and its
execution, the ad-hoc task fails with a dml_missing_record_exception and
the task gets stuck.

In this case we do not want the task to fail and just return with an
appropriate mtrace.

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-07-15 10:46:35 +02:00
meirzamoodle 07af6ccc73 MDL-77237 core: Suppress debugging during capabilities cleanup
To prevent the debugging messages from appearing during the upgrade,
I set a flag to hide them.

For the test file, I adjusted the parameters in
the unassign_capability() function, which seemed to be using
the parameter intended for assign_capability().
2025-07-15 14:36:26 +07:00
Paul Holden cada977938 MDL-85944 block_myoverview: specific styling for "My courses" page. 2025-07-15 08:02:17 +01:00
Mihail Geshoski cd409009e4 Merge branch 'MDL-85246-405' of https://github.com/rjnl/moodle into MOODLE_405_STABLE 2025-07-15 11:11:26 +08:00
Huong Nguyen ef0ba8a988 Merge branch 'MDL-72582-MOODLE_405_STABLE' of https://github.com/tsmilan/moodle into MOODLE_405_STABLE 2025-07-15 10:07:55 +07:00
Huong Nguyen 4de8318ca9 Merge branch 'MDL-86016-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-07-15 09:56:41 +07:00
Huong Nguyen 9bd33ef7e6 Merge branch 'MDL-85040-405-new' of https://github.com/meirzamoodle/moodle into MOODLE_405_STABLE 2025-07-15 09:42:29 +07:00
Mihail Geshoski 4baac8c6ce Merge branch 'MDL-84385-requireonce-405' of https://github.com/leonstr/moodle into MOODLE_405_STABLE 2025-07-15 09:41:18 +08:00
Andrew Nicols b4092640b8 MDL-86016 core: Remove xmldb test in favour of unit test 2025-07-15 09:33:05 +08:00
Andrew Nicols 75ac9fc3ae MDL-86016 tests: Make install.xml test less restrictive 2025-07-15 09:33:04 +08:00
Amaia Anabitarte b7d3d4f191 MDL-81384 report_participation: Remove innecessary JS parameters
The parameter are usable in course participants page because user
could add bulk notes linked to users. But that script is not used
in report/participants, so we don't need those arguments on the call.

Backported from MDL-75669.
2025-07-14 21:32:30 +01:00
Paul Holden ccb3a73f98 MDL-81384 theme_boost: centre help icon margin/padding. 2025-07-14 21:32:30 +01:00
meirzamoodle d78eccdb13 MDL-85040 forms: Make required form icons decorative
The required icon in mforms is not necessary. The div containing it
already has a title attribute that enables mouse users to hover on the
icon and see its meaning.

Screen reader users will know whether a field is required or not via
the `aria-required` attribute.

Labelling the required icon via `aria-label` does not pass the
a11y audit.

Given these, it only makes sense to make the required icon decorative
for mforms.

Co-authored-by: Jun Pataleta <jun@moodle.com>
2025-07-14 14:25:23 +07:00
AMOS bot 12e3626a6d Automatically generated installer lang files 2025-07-12 00:07:54 +00:00
Paul Holden 86fe6f4ae7 MDL-86001 qbank_columnsortorder: populate preview data question text. 2025-07-11 15:23:46 +01:00
Paul Holden 1708db93e6 MDL-85997 output: require CLI library from corresponding renderer. 2025-07-11 11:59:41 +01:00
Mark Johnson 9f953080d1 MDL-79540 qbank_managecategories: Don't allow own child as parent
When we build the options for a question category selector, the
"nochildrenof" option isn't correctly compared to the category ID. This
means we can select a category's own children as its new parent.
2025-07-11 10:07:49 +01:00
Sara Arjona 0a01a0d119 MDL-85989 output: Fix choicelist when selected 0 is not first
Previously, when the selected value in a choicelist was 0 but not in
the first position, the behavior was incorrect.
This commit fixes that issue, ensuring the choicelist behaves as expected
regardless of the position of the 0 value.
2025-07-11 09:15:02 +02:00
Michael Hawkins ce34e8ff08 weekly release 4.5.5+ 2025-07-11 12:49:25 +08:00
Leon Stringer 34a0d939dd MDL-84385 mod_assign: Remove unneeded require_once 2025-07-10 09:26:28 +01:00
Huong Nguyen 14d442c52c Merge branch 'MDL-85863-405' of https://github.com/yusufwib01/moodle into MOODLE_405_STABLE 2025-07-10 10:46:48 +07:00
Mihail Geshoski c4c11a559f Merge branch 'MDL-85689-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-07-10 11:38:36 +08:00
Mark Johnson 3e8f439d17 MDL-85721 qtype_multianswer: Update find_duplicated_subquestions for Oracle compatibility 2025-07-10 10:29:08 +07:00
Huong Nguyen ab271c4c24 Merge branch 'MDL-85262-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-07-10 08:33:44 +07:00
Huong Nguyen ed44561319 Merge branch 'MDL-84901-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-07-10 08:25:44 +07:00
Mihail Geshoski b85edb5f5a Merge branch 'MDL-85939-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-07-09 23:25:10 +08:00
Mihail Geshoski 0a7c65c43e Merge branch 'MDL-84255-405' of https://github.com/lucaboesch/moodle into MOODLE_405_STABLE 2025-07-09 23:17:22 +08:00
Rajneel Totaram ba71a95d34 MDL-85246 mod_quiz: Fix quiz grade feedback
Using $CFG->recovergradesdefault and/or $gradeitem->refresh_grades()
are problematic when viewing a quiz. When reenrolling a user with
previous attempts, a teacher can choose not to recover the user's grades,
even when recovergradesdefault=true. This must be respected when
the user views the quiz. For site with recovergradesdefault=false,
the users always see a grade of 0, which is wrong.

This change shows the correct grade score and feedback to users and
avoids unintentionally recovering the grades.
2025-07-09 20:33:14 +12:00
Jun Pataleta 09bbcdaf32 Merge branch 'MDL-85596-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-07-09 14:14:48 +08:00
andelacruz 0de18a98cf MDL-85689 mod_quiz: Behat for adding and deleting page from quiz 2025-07-09 13:26:39 +08:00
Mihail Geshoski 0f5f7c8dbe Merge branch 'MDL-85721_405_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_405_STABLE 2025-07-09 10:20:09 +08:00
Huong Nguyen 4c406b2d81 Merge branch 'MDL-85697-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-07-09 09:10:53 +07:00
Paul Holden 19edba7020 MDL-85939 qbank_columnsortorder: improve preview page table alignment. 2025-07-08 17:58:38 +01:00
Kristiina.Bax aee5428591 MDL-85492 report_questioninstances: sort qtypes in alphabetical order 2025-07-08 17:14:15 +01:00
Paul Holden 2d4b15f317 MDL-85262 tool_task: switch next run time comparison in renderer.
If a task is "due", then next run time should be considered "ASAP".
2025-07-08 13:49:47 +01:00
Paul Holden 6462abc6df MDL-84901 auth: specific session start error language string. 2025-07-08 12:33:07 +01:00
Huong Nguyen 422a6f94a9 Merge branch 'MDL-84976-405' of https://github.com/rjnl/moodle into MOODLE_405_STABLE 2025-07-08 18:13:44 +07:00
Huong Nguyen 6f961cacc5 Merge branch 'MDL-85037-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-07-08 18:09:00 +07:00
Huong Nguyen eed6310a08 Merge branch 'MDL-85947-M405_bump-GHA-ubuntu-24-04' of https://github.com/ziegenberg/moodle into MOODLE_405_STABLE 2025-07-08 17:35:12 +07:00
andelacruz ddcaa5f8a6 MDL-85697 mod_lesson: Behat for lesson group and user overrides 2025-07-08 17:03:21 +08:00
andelacruz 6b9cbd5a19 MDL-85697 mod_assign: Behat for assignment group and user overrides 2025-07-08 17:02:06 +08:00
andelacruz 0b86e7f574 MDL-85697 mod_quiz: Behat for quiz group and user overrides 2025-07-08 16:59:49 +08:00
Luca Bösch 547cd0de94 MDL-84255 quiz: Show quiz title in heading in accessrule_seb layout. 2025-07-08 07:51:51 +02:00
Daniel Ziegenberg 323d7ba996 MDL-85947 ci: Bump GHA to Ubuntu 24.04
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-07-07 16:12:45 +02:00
yusufwib01 22c2f2455e MDL-85863 user: Defer new-password email until after transaction commit 2025-07-07 21:03:32 +07:00
Trisha Milan 4e9c6b3f37 MDL-72582 core_files: Add unit test for readfile_accel debugging output
Adds a unit test for the debugging message triggered when readfile_accel() detects
a non-empty output buffer. The readfile_accel() function directly manipulates the
output buffers, so calling it from within PHPUnit triggers an error like "Test code
or tested code closed output buffers other than its own".

As a workaround, the test runs a CLI script in a separate process, allowing buffer
behaviour to be isolated and debugging output to be captured for assertions.
2025-07-07 18:59:25 +10:00
Matt Rice a442938279 MDL-72582 core_files: Update readfile_accel error handling
Correct the error handling in readfile_accel to properly log errors when
working on a stored_file, rather than hiding the true error behind the
incorrect "Object of class stored_file could not be converted to
string."

Co-authored-by: Simey Lameze <simey@moodle.com>
Co-authored-by: Trisha Milan <trishamilan@catalyst-au.net>
2025-07-07 18:59:19 +10:00
Laurent David 067138aab4 MDL-81702 core_message: Add focustrap and backdrop
* Add focustrap and backdrop to message drawer.
2025-07-07 07:09:16 +02:00
Laurent David e41473d9ff MDL-81702 theme_boost: Add focus lock to drawers
* Add focus lock to drawers for small screens
2025-07-07 07:09:16 +02:00
Laurent David 97aa3dd1f9 MDL-81702 theme_boost: Remove site home link from drawers
* The site-home-link was added to all menu drawers and should
only be added to the main menu drawer (mobile version)
2025-07-07 07:09:16 +02:00
Mihail Geshoski 2fce831627 weekly release 4.5.5+ 2025-07-06 09:26:27 +08:00
Mihail Geshoski 6fe2fb1f0f NOBUG: Add upgrade notes 2025-07-06 09:26:27 +08:00
Mihail Geshoski 396a02396e Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-07-06 09:26:13 +08:00
Mihail Geshoski cb9bebdc8e Merge branch 'MDL-85350_405' of https://github.com/PhilippImhof/moodle into MOODLE_405_STABLE 2025-07-05 19:57:51 +08:00
Mihail Geshoski 9a28c68655 Merge branch 'MDL-85563-m405' of https://github.com/NeillM/moodle into MOODLE_405_STABLE 2025-07-05 19:57:51 +08:00
Tim Schroeder 17eb0624ab MDL-81604 Files: Fix broken file serving w/ Apache + PHP-FPM + PHP >=8.1 2025-07-04 20:01:52 +02:00
Paul Holden 98329e1d71 MDL-85037 block_html: correct access checks for plugin file serving. 2025-07-04 08:55:58 +08:00
Huong Nguyen 046a9c4905 Merge branch 'MDL-76342-405' of https://github.com/yusufwib01/moodle into MOODLE_405_STABLE 2025-07-03 09:07:59 +07:00
Huong Nguyen b37969c4f9 Merge branch 'MDL-85769-405' of https://github.com/meirzamoodle/moodle into MOODLE_405_STABLE 2025-07-03 09:05:24 +07:00
Mihail Geshoski cc2d6b276d Merge branch 'patch/MDL-85666-405' of https://github.com/skodak/moodle into MOODLE_405_STABLE 2025-07-03 09:54:33 +08:00
Petr Skoda 6a4b730dfd MDL-85666 phpunit: add general plugin tests
This defines new group which can be used
to limit execution of these tests to one plugin only.

For example to execute all tests for Label module use:

phpunit --testsuite=mod_label_testsuite
phpunit --group=plugin_checks --filter=mod_label

or

phpunit --filter=mod_label
2025-07-02 07:12:13 +02:00
AMOS bot 9fa2846df4 Automatically generated installer lang files 2025-07-02 00:09:53 +00:00
Mark Johnson e721309453 MDL-85721 qtype_numerical: Prevent duplication on restore
If question_numerical record for a question has been deleted, when its
options are loaded its answers will not have a tolerance property. This
can lead to duplication.

Also, older questions may not have a question_numerical_options record.

To avoid this, we use 0 as a default tolerance for all answers if there
is no matching record, and do the same when reading the question
structure from backups. We also generate default values for the rest of
the options.
2025-07-01 11:58:59 +01:00
Mark Johnson 3101c07a97 MDL-85721 qtype: Cope with missing options records
If we restore a question (or any other) which has had its
qtype_xxx_options record deleted, we get a notification output when we
try to build the options.

This may be called from an AJAX request (such as when we duplicate a
quiz), and outputting the notification breaks the AJAX response.
Returning false also means we don't get the answers attached to the
questiondata options, so the structure doesn't match the restored data,
and we get duplication.

This emits the errors via debugging instead, which allows it to be
supressed or logged, and allows get_question_options() to continue
running.
2025-07-01 11:58:58 +01:00
Mark Johnson 8c9d16e605 MDL-85721 qtype_multianswer: Clean up duplicate subquestions
This adds an ad-hoc task to clean up duplicate subquestions created by
the bug.

When the upgrade is run, it will run a query to check if any
subquestions have been duplicated (if there are multiple questions with
the same parent, text and stamp), and queue the cleanup task if there
are.

For each stamp identified, the task will find instances of the question
that are not referred to in their parent's sequence field, confirm that
they have 0 usages, and delete them.
2025-07-01 11:58:58 +01:00
Mark Johnson d3d2d67c8e MDL-85721 qtype_multichoice: Generate default options on restore
qtype_multichoice::get_question_options() will create a default options
object if no qtype_multichoice_options record exists. This means if we
restore a backup containing a multichoice question without any options
(see previous commit), it will always create a duplicate.

This change generates a default set of options for the backupdata if
none exists, so the identity hash will match if the same question exists
in the database without options, and we dont get duplicates.
2025-07-01 11:54:50 +01:00
Mark Johnson 7c0600ae16 MDL-85721 qtype_multianswer: Don't delete qtype data for subquestions
Historically, multianswer would re-use question IDs from subquestions,
so it was necessary to delete qtype-specific data if the qtype changed.
Since versioning was introduced, editing creates new versions of the
qtype and subquestions. Deleting the data means the original versions of
the subquestions cannot function correctly, so we shouldn't do that
anymore.
2025-07-01 11:54:49 +01:00
Andrew Nicols b6f3972fad Merge branch 'MOODLE_405_STABLE' of git.in.moodle.com:moodle/integration; branch 'MDL-84531-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-07-01 17:36:47 +08:00
Neill Magill 76275dadf5 MDL-85563 phpunit: Clock API should always use Moodle system time
When using `clock::now()` the frozen cloxk and incrementing clock will now
always return a `DateTimeImmutable` that uses the configured Moodle system
time. In unit tests this will be Australia/Perth.

Before this change, it would sometimes be UCT.
2025-06-30 11:43:46 +01:00
Daniel Ziegenberg 202fe57da2 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:01 +02:00
Huong Nguyen c36274a15a weekly release 4.5.5+ 2025-06-29 16:18:49 +07:00
meirzamoodle c080b4bf58 MDL-85769 AI: Trap focus within AI drawer on smaller screens
Co-authored-by: Laurent David <laurent.david@moodle.com>
2025-06-28 10:59:41 +07:00
Paul Holden be23488e54 MDL-85855 calendar: format course shortname attribute correctly. 2025-06-26 21:47:12 +08:00
Mihail Geshoski c8116a0dbe Merge branch 'MDL-85665-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-06-26 10:44:07 +08:00
Huong Nguyen 2ed1dd557c Merge branch 'MDL-83752-M405' of https://github.com/ziegenberg/moodle into MOODLE_405_STABLE 2025-06-26 09:19:43 +07:00
Huong Nguyen fc34abe738 Merge branch 'MDL-76414-405' of https://github.com/yusufwib01/moodle into MOODLE_405_STABLE 2025-06-26 08:29:47 +07:00
Huong Nguyen c477dcd640 Merge branch 'MDL-85734-405' of https://github.com/lucaboesch/moodle into MOODLE_405_STABLE 2025-06-26 08:25:57 +07:00
Huong Nguyen c4e40860e4 Merge branch 'MDL-85466-405' of https://github.com/lucaboesch/moodle into MOODLE_405_STABLE 2025-06-26 08:22:29 +07:00
Huong Nguyen 91530e92ee Merge branch 'MDL-82109-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-06-26 08:19:58 +07:00
Jonathon Fowler f7b694d15f MDL-60799 enrol: update_instance() needs separate objects passed
Passing the same object means enrol_cohort does not recognise a change
in role when an edit or batch course upload operation is done.

 * enrol/editinstance.php was modifying $instance before passing it to
   enrol_plugin::update_instance() so the latter never sees a difference
   versus $data. This is redundant since update_instance() is doing the
   same thing a second time.
 * admin/tool/uploadcourse/classes/course.php is passing the same object
   as both arguments to enrol_plugin::update_instance().

There is an expectation that update_enrol_plugin_data() is to mutate its
$instance argument and then return it based on how derived classes in
enrol_guest and enrol_self behave, so cloning $instance within
update_enrol_plugin_data() before mutating it isn't an option.
2025-06-25 09:43:10 +10:00
Daniel Ziegenberg 471a73e98c MDL-83752 workshop: Handle empty feedbackreviewer
Causes PHP warnings when null on PHP 8.1.

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-06-24 12:41:17 +02:00
andelacruz 651af33600 MDL-85665 mod_quiz: Behat to build quiz in single activity format course 2025-06-24 17:58:32 +08:00
Huong Nguyen 002398450f Merge branch 'MDL-85683-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-06-24 09:21:22 +07:00
Huong Nguyen 7f708151eb Merge branch 'MDL-85407-45' of https://github.com/durenadev/moodle into MOODLE_405_STABLE 2025-06-24 09:17:03 +07:00
Paul Holden 1263027e0f MDL-85596 output: update "More" sub-menus ARIA expanded attribute. 2025-06-20 21:10:29 +01:00
Luca Bösch 90ce0974bd MDL-85734 calendar: support multilang group names. 2025-06-20 16:47:45 +02:00
Luca Bösch 23dc4c7ca4 MDL-85466 course: space between number and course icon. 2025-06-20 16:47:16 +02:00
Huong Nguyen 97ed6b7083 weekly release 4.5.5+ 2025-06-20 15:14:38 +07:00
Huong Nguyen 499f6f3688 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-06-20 15:14:26 +07:00
Sara Arjona 5a22bfc175 Merge branch 'MDL-75947-integration-405-fix' of https://github.com/mihailges/moodle into MOODLE_405_STABLE 2025-06-19 17:22:08 +02:00
Mihail Geshoski 66bf9156b3 MDL-75947 ltiservice_gradebookservices: Fix unit test
Fixes the test_sequential_score_posts() unit test in lineitem_test
by removing dynamic class property assignments, which were triggering
deprecation notices.
2025-06-19 16:15:36 +08:00
yusufwib01 a14b77ec1c MDL-76414 navigation: Show 'Calendar' link in primary nav to guests 2025-06-19 13:13:58 +07:00
Huong Nguyen 8d6e21135c Merge branch 'MDL-85223-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-06-19 11:26:20 +07:00
Mihail Geshoski 9d661d516e Merge branch 'MDL-75947-405' of https://github.com/Jayce0808/moodle into MOODLE_405_STABLE 2025-06-19 12:18:15 +08:00
Huong Nguyen 8369f19a64 Merge branch 'MDL-85678-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-06-19 11:07:48 +07:00
Mihail Geshoski 1338ddaa3f Merge branch 'MDL-83487-405' of https://github.com/muhammadarnaldo/moodle into MOODLE_405_STABLE 2025-06-19 11:31:24 +08:00
Huong Nguyen 67827bf0fa Merge branch 'MDL-85159-405' of https://github.com/stevandoMoodle/moodle into MOODLE_405_STABLE 2025-06-19 10:03:51 +07:00
yusufwib01 7479f88d22 MDL-76342 core_output: Wrap buttons below heading on small screens 2025-06-19 10:01:33 +07:00
Mihail Geshoski 0e70433873 Merge branch 'MDL-85514-405' of https://github.com/snake/moodle into MOODLE_405_STABLE 2025-06-19 10:58:38 +08:00
Jake Dallimore d54a04197a MDL-85514 core_form: support 'in' rule for multiselects via subset of
The 'in' rule currently behaves the same way that 'eq' does when used
with multi-selects, which is not correct. It should be modelled by
checking whether the selected values are a subset of the rule values
(i.e. selected values are 'in' the rule values). This patch implements
that for core form rules as well as for the admin settings show/hide.
Several behat features are updated as well, because these were verifying
the incorrect behaviour for multi-select in rules.
2025-06-19 09:58:30 +08:00
Mihail Geshoski f6497cbe1f Merge branch 'MDL-42263-405' of https://github.com/Jayce0808/moodle into MOODLE_405_STABLE 2025-06-18 16:17:06 +08:00
Jayce Birrell 693d89cbdb MDL-73003 core_grades: Don't use 'scale' to determine grading method.
When a forum activity used a rubrics with a scale for grading, it was not treated as an advanced grading method, causing
the code to mishandle the grading object and not return any grades.
2025-06-18 16:51:20 +09:30
Huong Nguyen ccc6b2ee89 Merge branch 'MDL-84832-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-06-18 09:50:58 +07:00
Paul Holden 5d7c70c21e Merge branch 'MDL-85773-405' of https://github.com/sebastsg/moodle into MOODLE_405_STABLE 2025-06-17 11:08:46 +01:00
Sebastian Gundersen d2e1d0e76e MDL-85773 forms: Read-only selects must have static labels
This is to prevent labels with an invalid for attribute, referencing non-existing elements.
2025-06-17 11:44:35 +02:00
Tasio fc21f64863 MDL-78233 accesslib: remove unreliable test
Co-authored-by: Marina Glancy <marina.glancy@gmail.com>
2025-06-17 10:37:57 +02:00
Mihail Geshoski b5fd491b73 Merge branch 'MDL-84978-405' of https://github.com/olivabigyo/moodle into MOODLE_405_STABLE 2025-06-17 15:15:30 +08:00
Mihail Geshoski e8ac6e2fec Merge branch 'MDL-82797_405' of https://github.com/cwarwicker/moodle into MOODLE_405_STABLE 2025-06-17 14:59:52 +08:00
Marina Glancy e3411249d6 MDL-80611 general: do not translate url in help links 2025-06-16 18:10:24 +01:00
Paul Holden 10aece9d65 MDL-85609 tool_mfa: fix user counting for factors in use table. 2025-06-16 13:03:43 +01:00
Jun Pataleta b419fd08fc MDL-85678 mod_feedback: a11y Behat coverage for Manage templates page 2025-06-16 13:50:25 +08:00
Jun Pataleta 5c3e474160 MDL-85678 mod_feedback: Fix a11y issues in the Manage templates page
- Fix the heading hierarchy.
- Add a visually-hidden column header for the actions column.
2025-06-16 13:50:25 +08:00
Jake Dallimore 1bf62c2e46 MDL-75947 ltiservice_gradebookservices: score->timestamp as dategraded
If this is not passed in to grade_update(), then it's not passed on to
update_raw_grade(), resulting in time() being used instead, which isn't
correct. The grade timemodified value should be set to the timestamp
provided by the tool in the score post JSON, not the time of the score
post itself.

Co-authored-by: Jayce Birrell <jayce.birrell@moodle.com>
2025-06-16 14:43:46 +09:30
Jake Dallimore 036f61da49 MDL-75947 ltiservice_gradebookservices: test sequential score posting
This tests highlights a problem with the score handling logic and
will currently fail. On score post, the current time is used for
grade->timemodified instead of the score->timestamp provided by the
tool in the POST JSON.
2025-06-16 14:43:46 +09:30
aya-saad1 e6894fcf11 MDL-42263 assign: Force language of email sent to graders
Co-authored-by: Jayce Birrell <jayce.birrell@moodle.com>
2025-06-16 11:01:18 +09:30
AMOS bot 4fceaed909 Automatically generated installer lang files 2025-06-15 00:09:52 +00:00
Mihail Geshoski 95518023c6 weekly release 4.5.5+ 2025-06-13 14:43:42 +08:00
Mihail Geshoski fe0d7c9b0a NOBUG: Add upgrade notes 2025-06-13 14:43:42 +08:00
Paul Holden 56801cdf3b MDL-84531 core: default deprecated attribute $replacement to null. 2025-06-12 14:50:56 +01:00
Huong Nguyen 9691e4d4c6 MDL-85316 dml: Revert DB vendor changes 2025-06-12 17:11:26 +07:00
Jun Pataleta d2711e792f Merge branch 'MDL-84752-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-06-12 17:15:43 +08:00
Paul Holden 102621f53d MDL-84752 qtype_essay: create accessible min/max words form elements.
Because of historical requirements involving fieldsets in question
type forms (see 958e7671), we should use ARIA label attribute on
grouped elements rather than normal labels in order to make them
accessible.

Co-authored-by: Jun Pataleta <jun@moodle.com>
2025-06-12 10:11:48 +01:00
Jun Pataleta 44fc7bd927 Merge branch 'MDL-85700-405' of https://github.com/roland04/moodle into MOODLE_405_STABLE 2025-06-12 17:06:40 +08:00
Huong Nguyen 18b20273fd MDL-72123 message: Add upgrade note 2025-06-12 17:06:40 +08:00
Huong Nguyen 49729e14a4 Merge branch 'MDL-72123-405' of https://github.com/yusufwib01/moodle into MOODLE_405_STABLE 2025-06-12 17:06:39 +08:00
Huong Nguyen 97ccd815f9 Merge branch 'MDL-84611-405' of https://github.com/sh-csg/moodle into MOODLE_405_STABLE 2025-06-12 08:37:34 +07:00
Mikel Martín abdf765a28 MDL-85700 theme_boost: Fix singleselect spacing
- Fix single_select template form layout.
2025-06-11 13:53:03 +02:00
Justin Hunt bd54d58d8a MDL-82797 question engine: gift import fix 2025-06-11 11:58:23 +01:00
Stefan Hanauska 172277eae4 MDL-84611 blocks: Respect instance_allow_multiple() 2025-06-11 11:22:05 +02:00
Stefan Hanauska 110e4f7aed MDL-84611 block_html: Change tests to respect capabilities 2025-06-11 11:22:05 +02:00
Huong Nguyen 8061a3cdc8 Merge branch 'MDL-77964-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-06-11 14:08:50 +07:00
Huong Nguyen 60c73f7ff7 Merge branch 'MDL-85316-405-mysql-version' of https://github.com/meirzamoodle/moodle into MOODLE_405_STABLE 2025-06-11 13:33:49 +07:00
Huong Nguyen d83b08f92c Merge branch 'MDL-85274-405' of https://github.com/davewoloszyn/moodle into MOODLE_405_STABLE 2025-06-11 13:30:18 +07:00
David Woloszyn 5dd77e0022 MDL-85274 calendar: Duration limits added to forms 2025-06-11 14:30:11 +10:00
meirzamoodle cc7efbf977 MDL-85316 admin: Add environment check for AWS Aurora database 2025-06-11 10:44:12 +07:00
Philipp Imhof cd11b9533f MDL-85350 questions: skip restore test for certain 3rd party plugins
The test_restore_course_with_same_stamp_questions() test assumes
that all question types using answers will also use the table
"question_answers" to store said answers. However, some 3rd party
qtypes might use custom tables and for those, the test would fail.
2025-06-06 15:22:19 +02:00
Mihail Geshoski 812ef23c00 Moodle release 4.5.5 2025-06-06 12:32:23 +08:00
Mihail Geshoski 59d4d28e84 NOBUG: Add upgrade notes 2025-06-06 12:32:23 +08:00
Rajneel Totaram 436c8070e2 MDL-84976 tool_policy: noclean param was not set 2025-06-06 15:14:40 +12:00
Paul Holden 4e1feb2c4e MDL-85683 enrol: use formatted course name for notification context. 2025-06-06 00:22:13 +01:00
yusufwib01 8c96b52f08 MDL-72123 message: Hide add to contacts button if user not allowed 2025-06-06 01:09:29 +07:00
Szymon Karolczuk dd639a9516 MDL-85573 tool_brickfield: fix uninstall code 2025-06-05 19:16:20 +02:00
Sara Arjona 4b87c45497 weekly release 4.5.4+ 2025-06-05 16:43:39 +02:00
Sara Arjona 19baebf67d NOBUG: Add upgrade notes 2025-06-05 16:43:39 +02:00
Niels Gandraß 8cce7a8a82 MDL-84491 core_session: Fix redis connection in CLI / scheduled task 2025-06-05 10:26:55 +02:00
Michael Hawkins 4ecfbc393d MDL-83762 core_files: Bind resolve IPs and ports to cURL calls 2025-06-05 12:09:50 +07:00
Michael Hawkins ac62ce580c Merge branch 'MDL-85571-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-06-05 12:35:12 +08:00
Vincent Schneider ab5d693113 MDL-84518 course: improved course visibility state handling 2025-06-05 11:22:29 +07:00
Michael Hawkins 74aa57d9cd Merge branch 'MDL-80380-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-06-05 12:20:23 +08:00
Jun Pataleta a86500fe34 Merge branch 'MDL-85450-405' of https://github.com/rjnl/moodle into MOODLE_405_STABLE 2025-06-05 12:15:52 +08:00
Huong Nguyen 2225c55acc MDL-80380 core_auth: Add upgrade note 2025-06-05 11:14:52 +07:00
Huong Nguyen 6abea88dac MDL-80380 admin: Support Microsoft XOAUTH2 for outgoing email 2025-06-05 11:14:51 +07:00
Mihail Geshoski 484b07cc5c Merge branch 'MDL-69765-405' of https://github.com/lucaboesch/moodle into MOODLE_405_STABLE 2025-06-05 12:11:21 +08:00
Jun Pataleta 0dd92929b4 Merge branch 'MDL-84941-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-06-05 12:08:44 +08:00
Mihail Geshoski 0319bb49a7 Merge branch 'MDL-85072-405' of https://github.com/olivabigyo/moodle into MOODLE_405_STABLE 2025-06-05 11:01:17 +07:00
Mihail Geshoski 58b92a238e Merge branch 'MDL-83654-405-5' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-06-05 11:01:17 +07:00
Mihail Geshoski 84dfd5459e Merge branch 'MDL-85369_405' of https://github.com/agaranin/moodle into MOODLE_405_STABLE 2025-06-05 11:01:17 +07:00
Mark Johnson 5abbfe4fd7 MDL-85323 core: Don't cache the login page 2025-06-05 11:01:04 +07:00
meirzamoodle 07cd48917c MDL-85375 libraries: Escaping a query parameter on pg_insert_id() 2025-06-05 01:30:20 +00:00
Vincent Schneider 8c5fad91df MDL-84706 bigbluebuttonbn: improved authorization and mitigate CSRF risks 2025-06-05 01:30:20 +00:00
Huong Nguyen c827a17f27 MDL-79993 course: Fix PHPUnit failure 2025-06-05 01:30:20 +00:00
raortegar b4011745cd MDL-79993 course: Improve user access to recent courses service 2025-06-05 01:30:20 +00:00
Vincent Schneider 47ba1b63f7 MDL-84497 badges: fix missing action sesskey checks. 2025-06-05 01:30:20 +00:00
Jun Pataleta 55abeaa7d4 Merge branch 'MDL-85239-405' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_405_STABLE 2025-06-05 09:22:54 +08:00
Jun Pataleta e3271c38b5 Merge branch 'MDL-84804-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-06-05 08:12:44 +08:00
Sara Arjona a949faf7fc Merge branch 'MDL-82069-405' of https://github.com/aanabit/moodle into MOODLE_405_STABLE 2025-06-04 15:37:04 +02:00
Paul Holden c14a3786b4 MDL-84804 output: amend page title when navigating dynamic tabs.
Prepend the current tab name to the page title, to ensure we can
easily identify the current page/tab and that it is both unique
and accessible.
2025-06-04 14:09:55 +01:00
Paul Holden 6e0e718a39 MDL-84804 javascript: new module for manipulating the page title. 2025-06-04 14:07:28 +01:00
Jun Pataleta e9613e37e2 Merge branch 'MDL-85041-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-06-04 17:48:24 +08:00
Mihail Geshoski 4390e42ea2 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:54 +08:00
Jun Pataleta cb990d2c07 MDL-85041 core: Make methods calling announceChanges async as well 2025-06-04 16:22:25 +08:00
Mihail Geshoski 1201e7b61a Merge branch 'MDL-85469-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-06-04 14:12:52 +08:00
Huong Nguyen 3272b7d6a1 MDL-85571 mod_assign: Improve PHPUnit tests 2025-06-04 12:50:39 +07:00
raortegar 8f8fb98cfd MDL-85571 mod_assign: Add visibility check to due digest notification 2025-06-04 12:50:39 +07:00
Jun Pataleta 3d9610fed5 Merge branch 'MDL-85507-405-enfix' of https://github.com/mudrd8mz/moodle into MOODLE_405_STABLE 2025-06-04 11:58:52 +08:00
Huong Nguyen beb8034e21 Merge branch 'MDL-84732-m405' of https://github.com/sammarshallou/moodle into MOODLE_405_STABLE 2025-06-04 10:53:52 +07:00
Mihail Geshoski 1e79fe439a Merge branch 'MDL-84432-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-06-04 10:47:49 +08:00
Huong Nguyen 3c3b1f9aa7 MDL-84432 core: Use discovery endpoint for Microsoft OAuth2 service
- Instead of creating the endpoints manually, use the OpenId
configuration endpoint to auto-configure endpoints
- Updates user field mappings so they map the new OpenId userinfo fields
2025-06-04 08:41:39 +07:00
Amaia Anabitarte c535d469fb Merge branch 'MDL-85471-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-06-03 16:19:29 +02:00
cescobedo 8cd1f17819 Merge branch 'MDL-85398-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-06-03 15:51:59 +02:00
Amaia Anabitarte b38113be6e Merge branch 'MDL-85327-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-06-03 13:37:53 +02:00
Jun Pataleta bb4cf1e151 Merge branch 'MDL-85467-405' of https://github.com/yusufwib01/moodle into MOODLE_405_STABLE 2025-06-03 17:28:39 +08:00
Rajneel Totaram d2646aee84 MDL-85450 block_calendar_upcoming: Fix heading level 2025-06-03 09:40:48 +12:00
Amaia Anabitarte b65fe2d786 Merge branch 'MDL-85412-405' of https://github.com/aanabit/moodle into MOODLE_405_STABLE 2025-06-02 13:24:42 +02:00
yusufwib01 e2aa6e03c6 MDL-85467 core: Replace orphaned label with span for accessibility
This commit replaces orphaned labels with spans for improved
accessibility. It also updates the XPATH partial named selector
for select_menu fields to target span elements.
2025-06-02 13:46:11 +07:00
hieuvu fb036fe8aa MDL-85239 mod_quiz: Add caption for Attempt tables. 2025-06-02 13:38:05 +07:00
meirzamoodle bff7dffe16 MDL-85041 core: Improve autocomplete/tag a11y for assistive tech
- Updated autocomplete behavior to announce dynamic changes
via ARIA live regions
- Fixed focus management for keyboard and screen reader navigation
- Added proper role/aria tags for interactive tag components
2025-06-02 10:38:29 +07:00
Luca Bösch 39e627ecc5 MDL-69765 qtype_essay: Create temporary draft file area only one time. 2025-05-31 12:58:24 +02:00
Jun Pataleta b469c13132 MDL-83654 qtype_match: Only add the question text to the first field
In order to avoid repetition of the question text as the user navigates
to each answer field in a matching question (e.g. by tabbing).
2025-05-31 09:24:45 +08:00
Jun Pataleta c8501791c4 MDL-83654 qtype_match: Add presentation role to table-related elements
The question and answer are displayed on a layout table and
does not really help with accessibility. We need to set a
presentation role for the table-related elements.
2025-05-31 09:24:44 +08:00
Jun Pataleta 5d6b8b0080 MDL-83654 qtype_match: Provide better information to answer fields
* In order to provide better context for screen reader users about the
answer fields in matching questions, the question text and the
corresponding item to be matched are included to the answer fields via
the aria-describedby attribute.
2025-05-31 09:24:44 +08:00
Amaia Anabitarte 98ba1909f2 MDL-85412 course: adding and removing elements feedback message 2025-05-30 16:44:01 +02:00
vlad.kidanov a9b8b52a16 MDL-85132 mod_glossary: Add missing end div for entrybox element. 2025-05-30 10:30:06 +01:00
Jun Pataleta 3f16708b55 MDL-84832 tiny_media: Announce when alt text maxlength is reached
Co-authored-by: Meirza <meirza.arson@moodle.com>
2025-05-30 17:08:18 +08:00
Michael Hawkins 7acd85a1aa weekly release 4.5.4+ 2025-05-30 16:29:22 +08:00
Michael Hawkins e12aa38444 NOBUG: Add upgrade notes 2025-05-30 16:29:21 +08:00
Michael Hawkins 03da88b840 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-05-30 16:28:54 +08:00
Artem Garanin 1a655e88db MDL-85369 question: fix tag collection ID in legacy‑filter upgrade.
Use the actual tag collection for the 'question' tag area instead of
the default collection.
2025-05-29 14:13:34 -04:00
Paul Holden 586ead512c MDL-85223 reportbuilder: initialize user entity filters just once. 2025-05-29 15:32:30 +01:00
Paul Holden 1e5ad34897 MDL-77964 availability: avoid JS console errors when closing modal. 2025-05-29 10:15:31 +01:00
David Herney 57e7f3ae94 MDL-85616 mod_glossary: The existence of the variable is controlled 2025-05-29 03:55:14 -05:00
Michael Hawkins dc3c3ad7bb Merge branch 'MDL-84824-405' of https://github.com/stevandoMoodle/moodle into MOODLE_405_STABLE 2025-05-29 12:27:43 +08:00
Michael Hawkins 9c26cc5eaa Merge branch 'MDL-83448-405' of https://github.com/stevandoMoodle/moodle into MOODLE_405_STABLE 2025-05-29 12:18:50 +08:00
Michael Hawkins eb3a479362 Merge branch 'MDL-84996-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-05-29 12:10:33 +08:00
Michael Hawkins f67dc4491f Merge branch 'MDL-85437-405' of https://github.com/meirzamoodle/moodle into MOODLE_405_STABLE 2025-05-29 11:53:10 +08:00
Stevani Andolo 447b50e660 MDL-84824 core_message: Fixed popup accessibility issue 2025-05-29 11:49:25 +08:00
Huong Nguyen fe1125a335 Merge branch 'MDL-83044-405' of https://github.com/catalyst/moodle into MOODLE_405_STABLE 2025-05-29 10:27:27 +07:00
Huong Nguyen c26b7d63b8 Merge branch 'MDL-85525-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-05-29 09:51:52 +07:00
Huong Nguyen 5e847a50d7 Merge branch 'MDL-85400-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-05-29 08:59:53 +07:00
Huong Nguyen 7a804a5eea Merge branch 'MDL-85389-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-05-29 08:52:47 +07:00
AMOS bot c17c801ca2 Automatically generated installer lang files 2025-05-29 00:07:56 +00:00
andelacruz 83103830ad MDL-85525 mod_quiz: Behat test for quiz attempt page block display 2025-05-28 16:49:55 +08:00
andelacruz 8e89733cb0 MDL-85389 mod_lesson: Behat for filtering lesson reports/essays by group 2025-05-28 15:19:47 +08:00
sam marshall 4b14b73977 MDL-85400 PHPunit: Hard to test code that uses encryption
This change stops the encryption code setting created key files to
read-only during PHPunit runs, which means they will be safely
deleted when the system resets after a test.
2025-05-28 12:59:17 +08:00
meirzamoodle 8e77499d4f MDL-85437 AI: Move focus to the AI drawer 2025-05-28 11:31:30 +07:00
Jun Pataleta ecf7cede8c Merge branch 'MDL-84806-405' of https://github.com/davewoloszyn/moodle into MOODLE_405_STABLE 2025-05-27 15:37:12 +08:00
Huong Nguyen c740028db4 Merge branch 'MDL-85169-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-05-27 09:16:15 +07:00
Alexander Van der Bellen 5fff8ff000 MDL-83044 core_block: Add return value check on form submission 2025-05-26 23:03:47 +08:00
Sara Arjona 636c0905dd Merge branch 'MDL-85034-MOODLE_405_STABLE' of https://github.com/phmemmel/moodle into MOODLE_405_STABLE 2025-05-26 15:26:01 +02:00
ferran 0eb18e5231 Merge branch 'MDL-84304-405' of https://github.com/laurentdavid/moodle into MOODLE_405_STABLE 2025-05-26 13:50:14 +02:00
Helen Foster 06e37a266b MDL-85507 lang: Import fixed English strings (en_fix) 2025-05-25 09:03:07 +02:00
sam marshall e20e01038f MDL-84732 Accessibility: Focus issue after closing nested modal 2025-05-23 15:46:57 +01:00
Mikel Martín 4d08038681 MDL-85469 mod_feedback: Refactor editor drag and drop
- Remove YUI drag and drop.
- Add new 'mod_feedback\external\questions\reorder' web service.
- Use SortableList JS component to refactor drag and drop, using
  the new webservice.
- Update new SCSS styles
- Fix and create Behat scenarios
2025-05-23 16:29:09 +08:00
Mikel Martín 79dec70789 MDL-85469 mod_feedback: Refactor edit amd module 2025-05-23 16:29:09 +08:00
Huong Nguyen 7f5234ab13 weekly release 4.5.4+ 2025-05-23 11:03:56 +07:00
Huong Nguyen 1e03f058ec Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-05-23 11:03:49 +07:00
David Woloszyn c421dce7bf MDL-84806 tiny_aiplacement: Remove unused div and css 2025-05-23 12:47:55 +10:00
David Woloszyn a55c0e0067 MDL-84806 tiny_aiplacement: Announce action results for accessibility
The generatetext.js and associated templates have been adjusted to
match more closely with the generate image files. The generate image
way of displaying content was better suited to aria.
2025-05-23 12:47:47 +10:00
Stevani Andolo c5cc10836f MDL-83448 core_hub: Fixed registration check 2025-05-22 13:44:01 +08:00
Huong Nguyen 20c233697f Merge branch 'MDL-84899-405' of https://github.com/laurentdavid/moodle into MOODLE_405_STABLE 2025-05-22 11:01:10 +07:00
Huong Nguyen b358c4ccc9 Merge branch 'MDL-84793-m405' of https://github.com/sammarshallou/moodle into MOODLE_405_STABLE 2025-05-22 10:48:33 +07:00
Huong Nguyen 1f43870066 Merge branch 'MDL-84918-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-05-22 10:34:40 +07:00
David Woloszyn 3823915d80 MDL-84918 core: Add zend.exception_ignore_args environment check 2025-05-22 10:10:36 +07:00
Huong Nguyen 69809efd38 MDL-84918 core: Add initial environment requirements for Moodle 5.1 2025-05-22 10:10:36 +07:00
Huong Nguyen 2486cd3f48 Merge branch 'MDL-74900-405' of https://github.com/raortegar/moodle into MOODLE_405_STABLE 2025-05-22 09:37:26 +07:00
Katalin Lukacs Toth 9a23fc37fb MDL-84978 mod_forum: Fix latest/earliest post id lookup in a discussion
This properly fixes the problems that commit 0f5a96f in MDL-80848 tried
to address.
2025-05-21 11:04:19 +02:00
Katalin Lukacs Toth 6c3703e7f5 MDL-85072 qtype_ordering: Fix XML export
Option fields should not be left empty.
2025-05-21 10:54:15 +02:00
Huong Nguyen a04e96ae82 Merge branch 'MDL-84274-405' of https://github.com/davewoloszyn/moodle into MOODLE_405_STABLE 2025-05-21 13:36:09 +07:00
raortegar 26e5baae62 MDL-74900 core_course: Exception in module deletion if missing instance 2025-05-21 08:27:29 +02:00
Huong Nguyen 01a8018de4 Merge branch 'MDL-84296-405' of https://github.com/davewoloszyn/moodle into MOODLE_405_STABLE 2025-05-21 10:00:27 +07:00
Huong Nguyen 2e7075d121 Merge branch 'MDL-85374-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-05-21 09:56:06 +07:00
AMOS bot 13b626da79 Automatically generated installer lang files 2025-05-21 00:07:53 +00:00
Paul Holden bf3c210d82 MDL-82109 notes: include link to add site note if user has capability. 2025-05-20 13:18:37 +01:00
Andrew Nicols 60ff3ef255 MDL-85374 report_competency: Create custom step for setting autocomplete
The autocompletes used in the competency report have been bastardised to
redirect on selection. Unfortunately this also applies when when making
null-op changes like deleting the initial "Please select a value"
option.

The autocomplete code removes all current options before creating an
option, and because of this redirect the browser is redirecting before
the new value can be entered, but we retain a reference to the field as
`$this->field`, which is now stale.
2025-05-20 12:42:20 +08:00
Amaia Anabitarte 73969986d9 Merge branch 'MDL-85397-405' of https://github.com/tasiobg/moodle into MOODLE_405_STABLE 2025-05-19 12:43:45 +02:00
Laurent David 5ebb301598 MDL-84304 core_courseformat: Remove COMPLETION_COMPLETE_FAIL test
* Because we removed this status in mod_scorm, we cannot test it
anymore against any module as no module has custom_rules that leads
to COMPLETION_COMPLETE_FAIL
2025-05-19 11:56:46 +02:00
Laurent David c5b189382b MDL-84304 mod_scorm: Remove completion failed from behat test
* Now that we removed the COMPLETION_COMPLETE_FAIL status for scorm
behat tests needs to be updated
2025-05-19 11:56:46 +02:00
Magnus Samuelsson 84908f78b9 MDL-84304 mod_scorm: Remove the COMPLETION_COMPLETE_FAIL status 2025-05-19 11:56:46 +02:00
Amaia Anabitarte 98513288b7 MDL-82069 core_completion: Improve errors for multiple grading items 2025-05-19 09:33:38 +02:00
Muhammad Arnaldo 14c33bf2a8 MDL-83487 mod_forum: retain upcoming posts in user digests 2025-05-16 15:35:14 +07:00
Jun Pataleta 9c4fb88800 MDL-85471 theme_boost: Dismiss tooltips on escape 2025-05-16 14:21:00 +08:00
Mihail Geshoski 4aefa6b85d weekly release 4.5.4+ 2025-05-16 12:58:58 +08:00
Mihail Geshoski 03a1a221fb Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-05-16 12:58:35 +08:00
toanlamt cbda104d14 MDL-85050 Javascript: core/dropzone Fix link & box click event conflict 2025-05-15 15:11:54 +07:00
sam marshall 6a56158088 MDL-84793 Behat: Allow CLI scripts to run on Behat instance 2025-05-15 08:50:49 +01:00
Stevani Andolo 46272804bf MDL-84296 core_hub: Added detailed AI usage data to registration page 2025-05-15 16:51:18 +10:00
Huong Nguyen d58f4da539 Merge branch 'MDL-83350-405' of https://github.com/meirzamoodle/moodle into MOODLE_405_STABLE 2025-05-15 12:02:37 +07:00
Huong Nguyen 8603d2939d Merge branch 'MDL-84710-405' of https://github.com/Jayce0808/moodle into MOODLE_405_STABLE 2025-05-15 11:59:08 +07:00
Huong Nguyen f9ea5d052e Merge branch 'MDL-84073-405' of https://github.com/sh-csg/moodle into MOODLE_405_STABLE 2025-05-15 11:57:33 +07:00
Huong Nguyen 16720f9862 Merge branch 'MDL-83943-405' of https://github.com/meirzamoodle/moodle into MOODLE_405_STABLE 2025-05-15 11:45:38 +07:00
Huong Nguyen 59a4f3a8b3 Merge branch 'MDL-85279-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-05-15 11:42:44 +07:00
Huong Nguyen c7151238c2 Merge branch 'MDL-84009-405' of https://github.com/raortegar/moodle into MOODLE_405_STABLE 2025-05-14 21:52:05 +07:00
Sara Arjona 2f98ab5f1f Merge branch 'MDL-85449-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-05-14 21:42:47 +07:00
Sara Arjona 600a4872fd Merge branch 'MDL-81436-405' of https://github.com/rjnl/moodle into MOODLE_405_STABLE 2025-05-14 21:42:47 +07:00
Sara Arjona 75463bb063 Merge branch 'MDL-81842-405' of https://github.com/laurentdavid/moodle into MOODLE_405_STABLE 2025-05-14 21:42:47 +07:00
Huong Nguyen 08a285be79 Merge branch 'MDL-84128-405' of https://github.com/meirzamoodle/moodle into MOODLE_405_STABLE 2025-05-14 21:42:47 +07:00
Huong Nguyen b98919b34e Merge branch 'MDL-85363-405' of https://github.com/lucaboesch/moodle into MOODLE_405_STABLE 2025-05-14 21:42:47 +07:00
Huong Nguyen 408993643f Merge branch 'MDL-84964-405' of https://github.com/Jayce0808/moodle into MOODLE_405_STABLE 2025-05-14 21:42:47 +07:00
ferran 7df327305f Merge branch 'mdl-84520_405' of https://github.com/james-cnz/moodle into MOODLE_405_STABLE 2025-05-14 21:42:47 +07:00
Sara Arjona cf3c244d49 Merge branch 'MDL-85248-405' of https://github.com/albertgasset/moodle into MOODLE_405_STABLE 2025-05-14 21:42:47 +07:00
Tasio 0b5d418a49 MDL-85397 theme: update reports to use container queries
With container queries, responsive design is no longer limited to the full browser width. For example, we can now display
the report in a compact side panel, and it will automatically adapt its styling to suit smaller spaces.
2025-05-14 15:55:07 +02:00
raortegar 502bcbfb01 MDL-84009 factor_webauthn: Add additional security keys 2025-05-14 11:20:54 +02:00
raortegar ef1b8d05f6 MDL-84009 tool_mfa: Additional factor instances support 2025-05-14 11:20:51 +02:00
Paul Holden ff3a757421 MDL-84996 enrol_manual: ensure externally supplied users are valid. 2025-05-14 09:55:53 +01:00
andelacruz b80477a8c6 MDL-85279 mod_assign: Renamed behat test to a more specific name 2025-05-14 15:13:35 +08:00
andelacruz bb275f31d6 MDL-85279 mod_page: Fix behat to match the expected behaviour 2025-05-14 15:12:49 +08:00
Stevani Andolo 0b719c3951 MDL-85159 editor_tiny: Fix language list and track srclang a11y issue 2025-05-14 09:22:05 +08:00
Rajneel Totaram d0a76a67d7 MDL-81436 theme: Fix scope of showmore button selector
Co-authored-by: Mikel Martín <mikel@moodle.com>
2025-05-13 17:39:49 +12:00
meirzamoodle fbca55fa27 MDL-83350 files: Avoid cacheing user and file repo files
Set the lifetime to zero for files referenced in
the local/internal repository (private files and file system),
because they should not be cached.

Add `no-store` to the cache-control to ensure resources are
never cached, always fetching the latest version.
2025-05-13 09:37:46 +07:00
Jun Pataleta 8df0f78659 Merge branch 'MDL-84817-405' of https://github.com/davewoloszyn/moodle into MOODLE_405_STABLE 2025-05-12 12:44:42 +08:00
Laurent David 8500a67d21 MDL-81842 formlibs: Change display in sticky footer
* Make sure that form elements that are inserted in the
sticky footer are not wrapped
2025-05-12 06:23:55 +02:00
Jayce Birrell d271d670aa MDL-84710 theme_boost: do not apply popper css rules to rtl dropdowns 2025-05-12 11:05:52 +09:30
Paul Holden f0d973cfaa MDL-85449 block_myoverview: preserve documentation language params.
Fixes the link to Moodle docs from zero state.
2025-05-11 19:27:46 +01:00
AMOS bot d82078046a Automatically generated installer lang files 2025-05-10 00:07:55 +00:00
Paul Holden 4f551a8628 MDL-85398 blocks: constrain width of block controls dropdown menu. 2025-05-09 12:52:52 +01:00
Laurent David f5b15b044e MDL-84899 mod_forum: Fix summary report form change checker
* The forum summary report was not removing the right form
from the list of forms to check for changes.
2025-05-09 08:43:54 +02:00
Laurent David 5c2095cb12 MDL-84899 core_form: Fix unWatchForm in FormChangeChecker
* The unWatchForm as it stood was not removing the form from the list.
2025-05-09 08:43:54 +02:00
meirzamoodle 686011ef42 MDL-83943 core_tag: Fix the broken user tag pagination 2025-05-09 12:49:56 +07:00
Philipp Memmel 27c4ebdace MDL-85034 core_course: Add index to course_sections for mod_subsection
This is a backport of MDL-84844.
2025-05-09 07:25:20 +02:00
meirzamoodle 376d76979d MDL-84128 core: Flip the image according to its orientation in PHP GD 2025-05-09 11:17:36 +07:00
Huong Nguyen 6dd1f61866 weekly release 4.5.4+ 2025-05-09 09:50:26 +07:00
Huong Nguyen 6679d9acb7 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-05-09 09:50:19 +07:00
Stefan Hanauska cec5aa80d1 MDL-84073 blocks: Load invisible blocks 2025-05-08 14:37:47 +02:00
Daniel Ureña 5d640c4b5c MDL-85407 mod_data: Fix unclosed HTML in list view 2025-05-08 11:15:49 +02:00
Luca Bösch 22779cc577 MDL-85363 quiz: style the question number inplace editable nicely. 2025-05-08 11:08:05 +02:00
David Woloszyn 20fe68e173 MDL-84817 core_message: Fix display issues in drawer at 400% 2025-05-08 17:09:01 +10:00
Huong Nguyen 3ac90327fc Merge branch 'MDL-85341-405' of https://github.com/snake/moodle into MOODLE_405_STABLE 2025-05-08 10:52:43 +07:00
Huong Nguyen 5f317f31a0 Merge branch 'MDL-84708-405' of https://github.com/danghieu1407/moodle into MOODLE_405_STABLE 2025-05-08 09:48:19 +07:00
Huong Nguyen c987a7a82e Merge branch 'MDL-84677-405' of https://github.com/lucaboesch/moodle into MOODLE_405_STABLE 2025-05-08 09:28:25 +07:00
Huong Nguyen 01b016b2cb Merge branch 'MDL-84597-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-05-08 09:05:20 +07:00
Huong Nguyen 4c400a892b Merge branch 'MDL-85220-405' of https://github.com/rjnl/moodle into MOODLE_405_STABLE 2025-05-08 08:59:14 +07:00
Huong Nguyen edb250f91d Merge branch 'MDL-84654-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-05-08 08:44:25 +07:00
Amaia Anabitarte 7ec2f412d0 Merge branch 'MDL-85361-405' of https://github.com/sarjona/moodle into MOODLE_405_STABLE 2025-05-07 14:02:17 +02:00
Sara Arjona ac2a24ec08 Merge branch 'MDL-83422-405' of https://github.com/meirzamoodle/moodle into MOODLE_405_STABLE 2025-05-07 13:50:22 +02:00
AMOS bot f9936a93b1 Automatically generated installer lang files 2025-05-07 00:07:49 +00:00
Jake Dallimore e2b6ee0e3b MDL-85341 core: remove unnecessary sesskey from module controlmenu items
This impacts the following controls:
- edit (sesskey removed from link)
All other controls should remain unchanged in terms of their use of
sesskey, supporting action handling for non-js course home (see non-js
behat tests move_activities.feature).
2025-05-06 13:54:31 +08:00
Angelia Dela Cruz 99ad02ac3f MDL-84654 mod_assign: Assignment additional files can be hidden 2025-05-06 12:53:48 +08:00
Huong Nguyen cfbb912f11 Merge branch 'MDL-85310-405' of https://github.com/andelacruz/moodle into MOODLE_405_STABLE 2025-05-06 10:32:13 +07:00
Sara Arjona 6a49c34b5c MDL-85361 block_social_activity: Fix inline editing text field 2025-05-05 08:16:59 +02:00
Paul Holden 71ae1110ff MDL-85169 forms: focus grouped fields element based on parent data.
This fixes the previous attempt at focusing the first field within
grouped elements (aec60788) which inadvertently introduced duplicate
IDs.
2025-05-02 13:47:22 +01:00
meirzamoodle 0e9f389e74 MDL-83422 tiny_media: Fix modal footer layout
Co-authored-by: Mikel Martín <mikel@moodle.com>
2025-05-02 19:46:41 +07:00
Luca Bösch 75842dcd42 MDL-84677 backup: Filter course shortnames in copy progress viewer. 2025-05-02 08:51:37 +02:00
Huong Nguyen a57387fe2d weekly release 4.5.4+ 2025-05-02 09:16:23 +07:00
Huong Nguyen c22c1099d8 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-05-02 09:16:16 +07:00
Paul Holden c60d7ed620 MDL-85327 admin: observe show/hide settings on category page.
Co-authored-by: Carlos Castillo <carlos.castillo@moodle.com>
2025-05-01 10:55:30 +01:00
AMOS bot d696c58951 Automatically generated installer lang files 2025-05-01 00:07:56 +00:00
Angelia Dela Cruz c4e085aae9 MDL-85310 qtype: Renamed duplicate scenario names to fix warning 2025-04-30 13:31:21 +08:00
Sara Arjona 3674b609cc Merge branch 'MDL-84805-405' of https://github.com/aanabit/moodle into MOODLE_405_STABLE 2025-04-29 15:31:56 +02:00
Amaia Anabitarte dc8e94eef8 MDL-84805 badges: Titles must be unique 2025-04-29 11:14:07 +02:00
Rajneel Totaram 4a6e86b652 MDL-85220 block_recentlyaccesseditems: Fix heading level 2025-04-29 10:13:23 +12:00
Sara Arjona 8b4beeb09a Merge branch 'MDL-84192-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-28 11:25:24 +02:00
Alexander Bias ac30d9e451 MDL-79362 auth_ldap: Close transaction when user fails to create 2025-04-28 10:53:34 +02:00
Huong Nguyen 5387945514 Merge branch 'MDL-84983-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-28 10:56:34 +07:00
Huong Nguyen b0d338fd10 Merge branch 'MDL-84539-405' of https://github.com/andrewgos/moodle into MOODLE_405_STABLE 2025-04-28 08:59:40 +07:00
Huong Nguyen b355ffc504 Merge branch 'MDL-84421-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-04-25 09:10:23 +07:00
Huong Nguyen b50db3fa11 weekly release 4.5.4+ 2025-04-24 22:06:01 +07:00
Huong Nguyen 290d65e03e NOBUG: Add upgrade notes 2025-04-24 22:06:00 +07:00
Huong Nguyen af4a65c408 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-04-24 22:05:46 +07:00
sam marshall e3ccdbee8a 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:10 +01:00
Paul Holden 8b14e5b9d8 MDL-84192 course: update course information page language string.
The previous version used an incorrectly deprecated summary string.
2025-04-24 11:53:38 +01:00
Huong Nguyen 3facc7677f Merge branch 'MDL-84480-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-24 07:34:46 +02:00
Sara Arjona 3d7dd31dda Merge branch 'MDL-84233_MOODLE_405_STABLE' of https://github.com/catalyst/moodle into MOODLE_405_STABLE 2025-04-24 07:34:46 +02:00
Huong Nguyen 9c4646b41e Merge branch 'MDL-83563_405' of https://github.com/larsbonczek/moodle into MOODLE_405_STABLE 2025-04-24 07:34:44 +02:00
Huong Nguyen e5b973ee85 Merge branch 'MDL-84442-metadata-task-logs-MOODLE_405_STABLE' of https://github.com/bwalkerl/moodle into MOODLE_405_STABLE 2025-04-24 07:32:48 +02:00
David Woloszyn ff28aadff1 MDL-84274 tool_policy: Policy acceptance pages use secure layout 2025-04-24 12:27:23 +10:00
David Woloszyn 9fd50c9771 MDL-84274 tool_mfa: Prevent tool_policy pages from redirecting 2025-04-24 12:27:23 +10:00
Jayce fb236380ee MDL-84964 mod_glossary: min width only apply for large device 2025-04-23 10:01:50 +09:30
AMOS bot ef92f5e441 Automatically generated installer lang files 2025-04-23 00:07:54 +00:00
Albert Gasset 35d0df6f9b MDL-85248 qtype_ddimageortext: Revert MDL-66584
This reverts commit 729e4eb792.
2025-04-22 16:50:58 +02:00
Sara Arjona e48855458e Merge branch 'MDL-82658-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-22 16:46:37 +02:00
Huong Nguyen aaf1c1671a Merge branch 'MDL-84070-user-pref-race-bug-v2-MOODLE_405_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_405_STABLE 2025-04-22 08:39:33 +07:00
Benjamin Walker b037708523 MDL-84442 core_task: Add finalise log param to task failers 2025-04-22 09:29:50 +10:00
Brendan Heywood 90a5527e4c MDL-84070 core: Fix race conditions setting user preferences 2025-04-21 21:41:58 +10:00
Huong Nguyen 9924495afc Merge branch 'mdl-83262_405' of https://github.com/james-cnz/moodle into MOODLE_405_STABLE 2025-04-21 09:12:59 +07:00
AMOS bot a3542e68cf Automatically generated installer lang files 2025-04-20 00:08:16 +00:00
AMOS bot 6c35478d6e Automatically generated installer lang files 2025-04-19 00:07:53 +00:00
Stefan Hanauska b9144ae56a MDL-83111 tool_recyclebin: Avoid null value 2025-04-18 07:15:10 +02:00
AMOS bot 0d0bc14482 Automatically generated installer lang files 2025-04-18 00:07:55 +00:00
Sara Arjona 2ddab5548f weekly release 4.5.4+ 2025-04-17 14:30:05 +02:00
Sara Arjona 8f67081b7b NOBUG: Add upgrade notes 2025-04-17 14:30:05 +02:00
Huong Nguyen 940e7adf84 Merge branch 'MDL-84298-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-17 10:53:34 +07:00
Huong Nguyen 21d77474b1 Merge branch 'MDL-84625-M405_close-recordset-in-core_analytics-model-add_prediction_ids' of https://github.com/ziegenberg/moodle into MOODLE_405_STABLE 2025-04-17 10:28:01 +07:00
Huong Nguyen 37de4caecd Merge branch '83713-javascript-error-xml-grades-import-405' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_405_STABLE 2025-04-17 10:12:17 +07:00
Huong Nguyen d87b86d997 Merge branch 'MDL-84232-405-avoid_recover_quiz_grades' of https://github.com/drobayo/moodle into MOODLE_405_STABLE 2025-04-17 08:39:32 +07:00
James C b0af55a8b8 MDL-83262 course: Refresh all-sections toggler on section delete 2025-04-17 12:46:09 +12:00
Julien Boulen ad40295e90 MDL-83713 form: Fix javascript selector on file picker
Co-authored-by: Meirza <meirza.arson@moodle.com>
2025-04-16 16:46:38 +02:00
Sara Arjona f36cc666f7 Merge branch 'MDL-84820-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-16 15:24:39 +02:00
Sara Arjona 5c8bb7bf12 Merge branch 'MDL-85170-405' of https://github.com/aanabit/moodle into MOODLE_405_STABLE 2025-04-16 15:12:20 +02:00
Sara Arjona 83d42d8a92 Merge branch 'MDL-82132-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-16 14:55:10 +02:00
Huong Nguyen eb264c78a4 Merge branch 'MDL-83195-releaseanongradev2-405' of https://github.com/leonstr/moodle into MOODLE_405_STABLE 2025-04-16 09:40:04 +07:00
Paul Holden f09a2fc6ec MDL-82132 user: less restrictive returning first/lastname details.
The `viewfullnames` capability check was overeager in restricting
the inclusion of user first and lastname properties in the returned
structure. Especially given that the same data was almost always
present in the fullname property of the same structure.
2025-04-15 16:00:49 +01:00
Paul Holden d6b81786ee MDL-82132 user: re-factor code for generating dummy user fullname. 2025-04-15 16:00:49 +01:00
Sara Arjona e1ef9e9561 Merge branch 'MDL-84149-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-15 16:45:04 +02:00
Sara Arjona cb989eebd6 Merge branch 'MDL-84140-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-15 16:31:20 +02:00
Sara Arjona 8e97eb9d34 Merge branch 'MDL-83990-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-15 16:18:12 +02:00
Sara Arjona a56c8bace8 Merge branch 'MDL-83537-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-15 16:09:28 +02:00
Jun Pataleta 10f4326ec6 Merge branch 'MDL-83979-url-always-proxy-MOODLE_405_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_405_STABLE 2025-04-15 20:38:36 +08:00
Sara Arjona 99d87938cd Merge branch 'MDL-55034-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-15 13:36:53 +02:00
Sara Arjona 10c6c279b2 Merge branch 'MDL-78381-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-15 11:36:56 +02:00
Sara Arjona dc7e34360d Merge branch 'MDL-80337-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-15 11:30:36 +02:00
Sara Arjona c9bd62995d Merge branch 'MDL-62230-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-14 18:57:06 +02:00
Sara Arjona b352601cd3 Merge branch 'MDL-81454-405' of https://github.com/daniil-berg/moodle into MOODLE_405_STABLE 2025-04-14 18:46:28 +02:00
Sara Arjona 1f4cd6c253 Merge branch 'MDL-83550-405' of https://github.com/andrewgos/moodle into MOODLE_405_STABLE 2025-04-14 17:54:26 +02:00
Sara Arjona 94adaf65fd Merge branch 'MDL-78886-405' of https://github.com/mwehr/moodle into MOODLE_405_STABLE 2025-04-14 17:50:21 +02:00
Sara Arjona a0b1820dcd Merge branch 'MDL-66584-405' of https://github.com/danghieu1407/moodle into MOODLE_405_STABLE 2025-04-14 17:47:40 +02:00
Wehr Mario abbf245371 MDL-78886 assignfeedback_editpdf: Fix broken next page button in PDFView
Credits go to Cédric Gerbault cdgerbault@gmail.com for providing the fix.
2025-04-14 17:39:36 +02:00
Sara Arjona fd0d72cce6 Merge branch 'MDL-84833-405' of https://github.com/ferranrecio/moodle into MOODLE_405_STABLE 2025-04-14 17:11:09 +02:00
Sara Arjona e746c166e2 Merge branch 'MDL-79464-405' of https://github.com/mihailges/moodle into MOODLE_405_STABLE 2025-04-14 17:08:31 +02:00
Daniel Ziegenberg e7825c649e MDL-84625 analytics: close recordset when it's not needed anymore
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-04-14 10:02:34 +02:00
James C f517047fc1 MDL-84520 course: CM anchor scrolls to specified CM 2025-04-14 12:16:10 +12:00
Jun Pataleta 8f0c7bb53c Moodle release 4.5.4 2025-04-13 09:52:45 +08:00
Jun Pataleta ba03877e5b NOBUG: Add upgrade notes 2025-04-13 09:52:45 +08:00
Amaia Anabitarte c81c68eb0b MDL-85170 mod_choice: Remove the unnecessary ul closing tag 2025-04-11 17:16:22 +02:00
Huong Nguyen ea6b5194d7 weekly release 4.5.3+ 2025-04-11 22:02:16 +07:00
Huong Nguyen 30cc6bc7eb NOBUG: Add upgrade notes 2025-04-11 22:02:16 +07:00
Sara Arjona 29d7066424 MDL-83994 course: Adapt PHPUnit to lower PHP versions 2025-04-11 19:24:35 +08:00
Huong Nguyen 455945a6f5 MDL-72704 message: Fix fetching for user has already contacted 2025-04-11 17:46:20 +08:00
Sara Arjona 8e0d7b04d3 Merge branch 'MDL-85139-405-2' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-04-11 07:05:14 +02:00
Paul Holden a50173c979 MDL-84865 cohort: improve system report validation of parameters. 2025-04-11 12:46:37 +08:00
Jun Pataleta 9cd200777e MDL-72704 message: Additional optimisation tweaks
* Return early if the `userids` params is empty or if the filtered
user IDs end up being empty.
2025-04-11 12:18:22 +08:00
Stevani Andolo 7e2931d7d3 MDL-72704 message: Fix fetching of conversation member info 2025-04-11 12:18:22 +08:00
raortegar 6ee6c52955 MDL-85104 lib: Add additional check to local URLs params. 2025-04-11 10:22:01 +07:00
James C 7fcfc7ddf2 MDL-83994 course: Respect course_can_delete_section() in AJAX 2025-04-11 13:04:31 +10:00
Paul Holden e22a3415cf MDL-84473 repository_equella: safer unserializing of file references. 2025-04-11 09:51:39 +07:00
Paul Holden 4d71278c7e MDL-84475 repository_dropbox: safer unserializing of file references. 2025-04-11 09:33:37 +07:00
Jun Pataleta 6c53e9589a MDL-85139 forms: Revert the addition of element IDs in group containers
This reverts the changes to core/element-group by MDL-61823 as it is
causing duplicate ID issues.
2025-04-11 10:11:55 +08:00
Alec Gullon 5ba4291ffd MDL-79464 mod_assign: Limit user navigation if grading fails validation 2025-04-10 16:27:51 +08:00
Andrew Gosali bdcfa3d4ca MDL-84447 mod_assign: show anonymous name when selecting user on blind submissions 2025-04-10 13:33:35 +07:00
Michael Hawkins d115be943e MDL-85152 filter_tex: Update deny list and slash handling 2025-04-10 14:20:44 +08:00
Paul Holden 1555c047b6 MDL-84478 tool_brickfield: verify sesskey prior to course analysis. 2025-04-10 13:06:41 +08:00
Paul Holden 4809272d5f MDL-84499 block_rss_client: user access checks for viewing feed. 2025-04-10 12:32:23 +08:00
Paul Holden e392ed6894 MDL-65356 mod_data: update entry editing/deletion to not leak sesskey. 2025-04-10 10:07:40 +07:00
Paul Holden ac7b6fb0cc MDL-84750 course: require user be able to view course participants. 2025-04-10 09:29:34 +08:00
David Woloszyn be007459d3 MDL-84351 tool_mfa: Fix guidance page file access
File uploaded to the guidance page were not accessible due to
null values being provided to $course and $cm params for the
tool_mfa_pluginfile.
2025-04-09 16:50:17 +07:00
raortegar 4680d53f4a MDL-84351 tool_mfa: Fix access to guide page when MFA login 2025-04-09 16:50:17 +07:00
David Woloszyn b0539cb6a8 MDL-84351 tool_mfa: Check URL against allowed components for redirect 2025-04-09 16:50:17 +07:00
David Woloszyn cf891af9ad MDL-84351 url: Add method for getting slashargument 2025-04-09 16:50:17 +07:00
Daniil Fajnberg b6665be054 MDL-81454 core: Remove incorrect @property-read annotation 2025-04-09 09:01:07 +02:00
Brendan Heywood a627b10f0c MDL-83979 repository_url: Always use the proxy for url downloads 2025-04-09 14:44:54 +10:00
Paul Holden f60d42d040 MDL-84479 tool_usertours: verify sesskey prior to tour duplication. 2025-04-08 15:10:23 +00:00
Michael Hawkins 8c88838e10 MDL-85015 tool_mfa: Include extra param in email factor cancel check 2025-04-08 15:10:23 +00:00
David Woloszyn 13b1d35b9a MDL-84784 tool_mfa: Remove enrol/index.php from no redirect 2025-04-08 15:10:23 +00:00
Sara Arjona 44fabe1c3d weekly release 4.5.3+ 2025-04-08 17:05:45 +02:00
Sara Arjona 7a7194c900 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-04-08 17:05:38 +02:00
Huong Nguyen 003eaca7c0 Merge branch 'MDL-85116-405' of https://github.com/junpataleta/moodle into MOODLE_405_STABLE 2025-04-08 10:26:07 +07:00
Jun Pataleta 887281206f Merge branch 'MDL-84058-405' of https://github.com/meirzamoodle/moodle into MOODLE_405_STABLE 2025-04-08 10:07:13 +08:00
AMOS bot eab5ecc1f7 Automatically generated installer lang files 2025-04-08 00:07:50 +00:00
meirzamoodle 3d1aeb5a30 MDL-84058 cli: Add a backup check for course module names
Co-authored-by: Jun Pataleta <jun@moodle.com>
2025-04-08 06:30:11 +07:00
Paul Holden ec6067ab03 MDL-82658 mod_forum: calculate maxbytes correctly in reply handler. 2025-04-07 09:38:33 +01:00
Paul Holden 2b60a7fcb9 MDL-84149 gradereport_grader: better support for collapse preferences.
The privacy provider is now resilient against missing courses, and also
supports retrieving preferences from multiple courses for the user.
2025-04-07 09:37:38 +01:00
Jun Pataleta b889c63bed MDL-85116 factor_sms: Set default weight and duration properly 2025-04-07 11:14:06 +08:00
Huong Nguyen 9977cb7f33 Merge branch 'MDL-84970-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-04-07 10:02:02 +07:00
Jun Pataleta 36201a79cc Merge branch 'MDL-85112-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-05 12:27:25 +08:00
Paul Holden 24dfa3007c MDL-85112 message: correct use of class to hide element content. 2025-04-04 17:07:25 +01:00
Huong Nguyen a83b1500bb weekly release 4.5.3+ 2025-04-04 22:20:11 +07:00
Huong Nguyen 91ae94313f NOBUG: Add upgrade notes 2025-04-04 22:20:10 +07:00
Jun Pataleta 699e67e415 Merge branch 'MDL-84816-405' of https://github.com/meirzamoodle/moodle into MOODLE_405_STABLE 2025-04-04 12:37:16 +08:00
meirzamoodle 09260f5c02 MDL-84816 message: Make sure the 'see all' link stays visible 2025-04-04 11:27:26 +07:00
Huong Nguyen b9cb8a3554 Merge branch 'MDL-84997-405' of https://github.com/davewoloszyn/moodle into MOODLE_405_STABLE 2025-04-04 11:15:06 +07:00
Jun Pataleta ccc4940193 Merge branch 'MDL-84907-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-04-04 11:29:05 +08:00
Jun Pataleta 4951ac8010 Merge branch 'MDL-84914-405-enfix' of https://github.com/mudrd8mz/moodle into MOODLE_405_STABLE 2025-04-04 09:47:20 +08:00
Shamim Rezaie 46dd68171a Merge branch 'MDL-61823-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-04 09:08:11 +11:00
Paul Holden 3a9109ffec MDL-61823 question: exclude file element from grouped elements hack.
This removes the duplicated label, that was being matched by the
previously wide selector to make grouped element labels visible.
2025-04-03 15:36:17 +01:00
Paul Holden 1fca5f9f42 MDL-61823 forms: ensure grouped elements have ID attribute.
This is used by the forms implementation for faux-label elements
so that when they are clicked on, the first input element of the
corresponding group is focused.
2025-04-03 14:52:02 +01:00
Jun Pataleta 299bfb23cb Merge branch 'MDL-75971-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-04-03 14:36:43 +08:00
Simey Lameze e4952de1af MDL-75971 behat: add email handling capabilities to Behat 2025-04-03 13:39:26 +08:00
Jun Pataleta dedff4dca4 Merge branch 'MDL-84823-405' of https://github.com/meirzamoodle/moodle into MOODLE_405_STABLE 2025-04-03 12:14:34 +08:00
meirzamoodle ea74f93c0d MDL-84823 message: Fix ARIA attributes in popovers and messaging drawers
> ARIA Expanded
A disclosure is a widget that allows content to be
collapsed (hidden) or expanded (visible). It has two elements:
1. Disclosure button, and
2. Section of content whose visibility is controlled by the button.

ARIA Expanded must be applied to the disclosure button element
or the element with role="button" rather than the content.

> ARIA label
Move the icon title and aria-label as they are not
interactive elements to the toggle element.
The title attribute is helpful for the tooltip,
and the aria-label benefits the screen reader.
2025-04-03 11:09:45 +07:00
Huong Nguyen dffc990f30 Merge branch 'MDL-85023_405' of https://github.com/PhilippImhof/moodle into MOODLE_405_STABLE 2025-04-03 11:07:47 +07:00
Shamim Rezaie 2814e94b5d Merge branch 'MDL-61730-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-04-03 06:53:33 +11:00
Shamim Rezaie 03bec5f8f5 Merge branch 'MDL-84549-405' of https://github.com/lucaboesch/moodle into MOODLE_405_STABLE 2025-04-03 06:42:18 +11:00
Shamim Rezaie d88721c821 Merge branch 'MDL-85000-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-04-03 06:13:09 +11:00
Jun Pataleta d8190aa5ed Merge branch 'MDL-83692-405' of https://github.com/raortegar/moodle into MOODLE_405_STABLE 2025-04-02 23:31:46 +08:00
Shamim Rezaie 313e6d060d Merge branch 'MDL-72050-405' of https://github.com/sh-csg/moodle into MOODLE_405_STABLE 2025-04-03 00:38:06 +11:00
Shamim Rezaie 979494555b Merge branch 'MDL-84961-405' of https://github.com/odeialba/moodle into MOODLE_405_STABLE 2025-04-02 20:54:34 +11:00
Shamim Rezaie 5fcd1fef0f Merge branch 'MDL-80629-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-04-02 20:01:51 +11:00
Andrew Nicols 2f96721020 MDL-84970 editor_tiny: Use the langpack name for Moodle language 2025-04-02 16:05:36 +08:00
Paul Holden 7415adb3d3 MDL-61730 gradeimport_xml: set type on form iprestriction field. 2025-04-02 08:57:16 +01:00
Huong Nguyen c60bcbe9e4 Merge branch 'MDL-84980-405' of https://github.com/sarjona/moodle into MOODLE_405_STABLE 2025-04-02 14:25:21 +07:00
raortegar 7a2e33f624 MDL-83692 factor_sms: MFA update default values when fields are unset 2025-04-01 21:06:50 +02:00
raortegar 3819bef654 MDL-83692 factor_sms: MFA set default values when gateway list is empty 2025-04-01 21:06:00 +02:00
David Mudrák d1829095d2 MDL-84914 lang: Use fixed strings in tests, too 2025-04-01 21:05:41 +02:00
David Woloszyn d7d6a04388 MDL-83692 factor_sms: add notification for SMS gateway restriction 2025-04-01 21:02:58 +02:00
Helen Foster 472bc8e8d7 MDL-84914 lang: Import fixed English strings (en_fix) 2025-04-01 20:57:23 +02:00
Luca Bösch 5aedb477ef MDL-84549 qbank_managecategories: put "Delete" action last in menu.
This is a backport of MDL-82886.
2025-04-01 17:58:18 +02:00
Sara Arjona 137f093797 weekly release 4.5.3+ 2025-04-01 16:34:24 +02:00
Mihail Geshoski deb4ed1a38 MDL-80091 mod_assign: Fix failing behat test 2025-04-01 11:34:09 +02:00
Huong Nguyen 463fe93c8e Merge branch 'MDL-84419-405' of https://github.com/clransom/moodle into MOODLE_405_STABLE 2025-04-01 11:07:05 +07:00
Huong Nguyen ef03201ae4 Merge branch 'MDL-83856-405' of https://github.com/andrewgos/moodle into MOODLE_405_STABLE 2025-04-01 10:48:03 +07:00
Huong Nguyen 1efd85dbd6 Merge branch 'MDL-80091-405' of https://github.com/andrewgos/moodle into MOODLE_405_STABLE 2025-04-01 10:41:10 +07:00
Paul Holden 91c04146cb MDL-55034 blog: update external blog deletion to not leak sesskey. 2025-03-31 14:04:13 +01:00
ferran e82b8ab95e MDL-84833 course: completion feedback messages 2025-03-31 09:39:21 +02:00
Jun Pataleta bcccb84b11 Merge branch 'MDL-84826-405' of https://github.com/meirzamoodle/moodle into MOODLE_405_STABLE 2025-03-31 14:28:23 +08:00
Andrew Nicols dd72667450 MDL-80629 env: Moodle 4.4.x and 4.5.x do not support PHP 8.4 2025-03-31 11:04:04 +08:00
Andrew Nicols eccfde8616 Merge branch 'MDL-76801-405' of https://github.com/andrewgos/moodle into MOODLE_405_STABLE 2025-03-31 09:38:24 +08:00
Philipp Imhof 5e97d00101 MDL-85023 quiz: allow WebRTC with SEB on Mac 2025-03-28 17:50:25 +01:00
Sara Arjona a8e0d711e5 weekly release 4.5.3+ 2025-03-28 12:48:20 +01:00
Sara Arjona 00b4dd0e0d Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-03-28 12:48:12 +01:00
Paul Holden 2b51032624 MDL-85048 core: define mapping for new America/Coyhaique zone.
Follows same process as other timezone additions in d5ec3594.
2025-03-28 08:58:34 +00:00
Huong Nguyen a9d4123f83 Merge branch 'MDL-85048-405' of https://github.com/lameze/moodle into MOODLE_405_STABLE 2025-03-28 15:00:37 +07:00
Simey Lameze b8b7318def MDL-85048 phpunit: add america/coyhaique timezone 2025-03-28 15:00:04 +08:00
David Woloszyn 282e257c02 MDL-84997 core_message: Hide message pill when count is zero 2025-03-28 16:48:19 +11:00
Huong Nguyen 4dbbe25ced Merge branch 'MDL-84952-405' of https://github.com/roland04/moodle into MOODLE_405_STABLE 2025-03-28 08:52:16 +07:00
AMOS bot e92fbcf833 Automatically generated installer lang files 2025-03-28 00:08:44 +00:00
Paul Holden 9f60cb0ae5 MDL-84140 course: more resilient check for activity footer component. 2025-03-27 08:32:57 +00:00
Jun Pataleta 8a8223dd36 Merge branch 'MDL-85028-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-03-27 12:03:39 +08:00
Andrew Nicols cfcc23c1fc MDL-85028 core: Check correct var name for router config 2025-03-27 11:45:08 +08:00
Mikel Martín 09cc81eee3 MDL-84952 theme_boost: Fix spacing for collapse/expand buttons 2025-03-26 15:41:21 +01:00
toanlamt 14d365dcf0 MDL-84982 tiny_media: Fix excessive data passed to the usedfiles JS file 2025-03-26 13:56:08 +07:00
Huong Nguyen 9556bca646 Merge branch 'MDL-85001-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-03-26 10:53:45 +07:00
Jake Dallimore 3281052fb4 Merge branch 'MDL-85007-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE 2025-03-26 11:31:46 +08:00
Huong Nguyen 2001a876d7 Merge branch 'MDL-83272_405_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_405_STABLE 2025-03-26 10:27:28 +07:00
Huong Nguyen 6bca945d0e Merge branch 'MDL-84623-M405_close-recordset-in-tool_dataprivacy-expired_contexts_manager-clear_old_records' of https://github.com/ziegenberg/moodle into MOODLE_405_STABLE 2025-03-26 10:23:42 +07:00
Huong Nguyen 154dcc3de5 MDL-85000 media_videojs: Enable Ogv.JS Tech for all browsers 2025-03-26 09:33:57 +07:00
Huong Nguyen 8d6206acba weekly release 4.5.3+ 2025-03-26 08:55:59 +07:00
Huong Nguyen 0c436ba190 Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-03-26 08:55:53 +07:00
Paul Holden 9263bbf8de MDL-85007 core: ensure events are dispatched against the same table.
This ensures that we always dispatch the dynamic table updated event
against the same table we just updated. Previously it was possible
for another table to receive the event, where both tables were
effectively the same instance of one another (e.g. custom reports).
2025-03-25 17:02:21 +00:00
meirzamoodle 488b0888a7 MDL-84826 theme_boost: Mantaining hover/focus colour for contrast 2025-03-25 22:54:07 +07:00
Dagoberto Robayo d2acaccee8 MDL-84232 mod_quiz: Avoid recover grades in quiz view page
- If Recover grades default is not enabled, quiz grades should not be recover.
2025-03-25 09:14:30 -05:00
Paul Holden 821336a9fc MDL-85001 reportbuilder: ensure report uniqueness in filters loader.
Where the same report exists multiple times on the page, ensure we
are still able to uniquely identify each via ID. Update the filters
module to ensure the filters form for each report is initialised.
2025-03-25 11:43:40 +00:00
danghieu1407 729e4eb792 MDL-66584 qtype_ddimageortext: Move JSON data to data-attribute 2025-03-25 16:44:50 +07:00
Andrew Nicols c99cd95fb3 Merge branch 'MDL-84893-405' of https://github.com/davewoloszyn/moodle into MOODLE_405_STABLE 2025-03-25 11:06:43 +08:00
Andrew Nicols 77597208b4 Merge branch 'MDL-84112-MOODLE_405_STABLE-fix_bigbluebutton_defaultcompletion_performance' of https://github.com/praxisdigital/moodle into MOODLE_405_STABLE 2025-03-25 10:55:10 +08:00
Andrew Nicols 1ccbfbf5db Merge branch 'MDL-84335_405' of https://github.com/PhilippImhof/moodle into MOODLE_405_STABLE 2025-03-25 10:50:12 +08:00
Andrew Nicols 09c0b90348 Merge branch 'MDL-83469-405' of https://github.com/ferranrecio/moodle into MOODLE_405_STABLE 2025-03-25 10:47:07 +08:00
Andrew Nicols 3f68ca07a2 Merge branch 'MDL-76668-405' of https://github.com/cameron1729/moodle into MOODLE_405_STABLE 2025-03-25 10:37:55 +08:00
Philipp Imhof 1498877814 MDL-84335 question: check for null before accessing property
in function check_hint_file_access
2025-03-24 17:44:10 +01:00
Sara Arjona b42be8e410 Merge branch 'MDL-84940-405' of https://github.com/ferranrecio/moodle into MOODLE_405_STABLE 2025-03-24 17:26:35 +01:00
Odei Alba 3fc1fd23f0 MDL-84961 core: Avoid loading the hidden table under the chart
Remove the table from under the chart when it is disabled, instead of just hiding it.
2025-03-24 17:26:18 +01:00
Paul Holden ecf19e63a0 MDL-84983 core: account for invalid locales in intl extension.
Recent PHP versions are now stricter on the `$locale` value passed
to `IntlDateFormatter` class and will throw exceptions for invalid
values (some of which may be present in our language packs).

See: https://github.com/php/php-src/issues/12912
2025-03-24 15:29:48 +00:00
Sara Arjona 24dddd0a4a MDL-84980 pix: Replace insert_page_break icon
To provide a visually clearer and more user-friendly quiz experience,
the 'add new page' icon has been standardized to 'fa-plus'.
2025-03-24 12:55:41 +01:00
Huong Nguyen 86db1e05f9 Merge branch 'MDL-83160-405' of https://github.com/mickhawkins/moodle into MOODLE_405_STABLE 2025-03-24 14:54:26 +07:00
AMOS bot 21f4f61ac7 Automatically generated installer lang files 2025-03-22 00:07:54 +00:00
Huong Nguyen f501225d0f weekly release 4.5.3+ 2025-03-21 22:02:41 +07:00
Huong Nguyen 090ab30bde Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_405_STABLE 2025-03-21 22:02:36 +07:00
Mark Johnson df0f4456bf MDL-83272 qbank_managecategories: Fix exclusion of current category
The "currentcat" parameter contains the categoryid, but is being
compared to a string like "contextid,categoryid" so was not being
matched correctly to exclude the current category from the list of
options.
2025-03-21 10:46:02 +00:00
Glenn Poder 91e18d9ea2 MDL-76668 navigation: Fix navigation for results in single activity 2025-03-21 13:51:38 +08:00
Huong Nguyen 508a4afaa7 Merge branch 'MDL-84446-405' of https://github.com/andrewnicols/moodle into MOODLE_405_STABLE 2025-03-21 11:17:52 +07:00
Huong Nguyen 381c4876f0 Merge branch 'MDL-84867-405' of https://github.com/roland04/moodle into MOODLE_405_STABLE 2025-03-21 09:05:48 +07:00
AMOS bot 2968116c9f Automatically generated installer lang files 2025-03-21 00:07:53 +00:00
Andrew Nicols 6e7c716eb3 Merge branch 'MDL-84803-405' of https://github.com/aanabit/moodle into MOODLE_405_STABLE 2025-03-21 07:56:07 +08:00
Paul Holden 8dc4480c50 Merge branch 'MDL-81655_405' of https://github.com/larsbonczek/moodle into MOODLE_405_STABLE 2025-03-20 15:14:24 +00:00
Amaia Anabitarte e0ed78c080 MDL-84803 mod_feedback: Make titles unique 2025-03-20 16:08:36 +01:00
Paul Holden 97bf649bc4 MDL-84538 lang: remove duplicated badge language string. 2025-03-20 15:04:29 +00:00
Paul Holden 649a58cf99 Merge branch 'MDL-84538-M405_fix-duplicated-language-strings' of https://github.com/ziegenberg/moodle into MOODLE_405_STABLE 2025-03-20 14:45:03 +00:00
Daniel Ziegenberg a44e02e755 MDL-84538 language: Remove duplicated lang string entries
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-03-20 13:57:40 +01:00
ferran 65f0345ec7 MDL-84940 block_section_links: omit subsections 2025-03-20 13:04:44 +01:00
Mikel Martín 7b759337f1 MDL-84867 tool_behat: Improve SCSS deprecation failure information
- Improve SCSS deprecated-styles @mixin to receive a paramenter of the
  deprecated selector.
- Update all the current deprecated styles that are using deprecated-styles @mixin
  to include the deprecated selector as parameter.
- Improve the 'look_for_deprecated_styles' behat function.
2025-03-20 10:40:57 +01:00
Huong Nguyen 6375c36911 Merge branch 'MDL-83535-MOODLE_405_STABLE' of https://github.com/TobiGa/moodle into MOODLE_405_STABLE 2025-03-20 15:43:29 +07:00
Paul Holden e4c81e3f5f MDL-84941 course: fix activity button label on end of section.
Where the button is rendered after all section content, we should
fix the ARIA label attribute to refer to the current section rather
than non-existing subsequent activity.
2025-03-19 19:41:51 +00:00
Sara Arjona df05a99128 Merge branch 'MDL-84683-MOODLE_405_STABLE' of https://github.com/jfederico/moodle into MOODLE_405_STABLE 2025-03-19 16:19:31 +01:00
Paul Holden a955ef2bca MDL-84820 moodlenet: correct activity modal icon size/alignment. 2025-03-19 10:25:55 +00:00
Tobias Garske 788dbe1cd1 MDL-83535 theme_boost: Prevent sticky-footer from linewrapping 2025-03-19 10:05:10 +00:00
ferran 38f8e58402 MDL-83469 core_courseformat: alternative new_module actions
The previous create_module actions uses section number instead of
section id. This produces several bugs when sections are moved around
the course in edit mode. This issue implements a new_module action with
all related mutations and webservices. The new one uses section id
instead of section number.
2025-03-19 10:06:34 +01:00
Jun Pataleta ef3f1c4625 Merge branch 'MDL-84905-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-03-19 13:18:11 +08:00
David Woloszyn 98ac01fd8c MDL-84893 core_message: Fix message drawer overlap and truncation 2025-03-19 13:58:04 +11:00
Huong Nguyen d79da7066e Merge branch 'MDL-84431-405' of https://github.com/andrewgos/moodle into MOODLE_405_STABLE 2025-03-19 09:55:19 +07:00
Huong Nguyen 03e37cf42c Merge branch 'MDL-83499-405' of https://github.com/laurentdavid/moodle into MOODLE_405_STABLE 2025-03-19 09:46:16 +07:00
Huong Nguyen 770ff6e482 MDL-84907 backup: Fix invalid CTRL characters regex 2025-03-19 09:22:47 +07:00
Huong Nguyen 5dfdf96b5d MDL-84905 Behat: Fix I set the following administration settings failure 2025-03-19 09:17:19 +07:00
Sara Arjona d15172627c weekly release 4.5.3+ 2025-03-18 14:17:39 +01:00
Anders Rasmussen ec1e8dfb18 MDL-84112 bigbluebuttonbn: Added user output only if bbactivity is set 2025-03-18 11:30:07 +01:00
Andrew Gosali d0f7b7f504 MDL-83856 gradingform_guide: fix remark format to always be FORMAT_HTML 2025-03-18 16:30:59 +07:00
Andrew Gosali 8029fb707a MDL-80091 assign grade: select the first user when changing filter
(if the previously selected user is no longer in the filtered list)
2025-03-18 15:19:56 +07:00
Andrew Gosali 4fe75e75cb MDL-84539 report_participation: use capability viewanonymousevents 2025-03-18 11:32:12 +07:00
Andrew Nicols ec65d872e3 Merge branch 'MDL-84222-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE 2025-03-18 08:03:52 +08:00
Andrew Nicols d8bbf50962 Merge branch 'MDL-84541-405' of https://github.com/laurentdavid/moodle into MOODLE_405_STABLE 2025-03-18 07:18:12 +08:00
Laurent David 2da0c5dae6 MDL-84541 core_course: Do not check change when pressing reset
* When the course reset form is submitted, we acknowledge that form
has been changed so we don't need to watch it anymore
2025-03-17 15:30:36 +01:00
Huong Nguyen bf05268f96 Merge branch 'MDL-83591-405' of https://github.com/andrewgos/moodle into MOODLE_405_STABLE 2025-03-17 16:00:34 +07:00
Andrew Gosali 3d7656d713 MDL-83550 gradingform_rubric: fix submit no grade when remark disabled 2025-03-17 14:50:27 +07:00
Andrew Gosali 61b05eeb97 MDL-83591 grade: fix issue when item is already deleted
The deleted grade is causing the error while using its id that was previously saved in the session variable
2025-03-17 10:47:32 +07:00
Paul Holden a82df2e07a MDL-80337 availability: more robust checking for plugin class presence.
Co-authored-by: Dustin Brisebois <dustin.brisebois@lambdasolutions.net>
2025-03-16 19:27:29 +00:00
Daniel Ziegenberg 73cad3a670 MDL-84623 privacy: close recordset when it's not needed anymore
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-03-16 19:53:55 +01:00
Paul Holden d767936052 MDL-83990 course: ensure course start/end dates set in external call. 2025-03-13 17:53:46 +00:00
Paul Holden c4fc0978b1 MDL-83537 check: confirm presence of instance action link. 2025-03-13 17:52:42 +00:00
Michael Hawkins 536aeb7fac MDL-83160 core: Update security.txt expiry 2025-03-13 20:35:48 +08:00
Stefan Hanauska 2b1f1b05f0 MDL-72050 question: Delete import draftfiles immediately 2025-03-13 08:17:34 +01:00
Stefan Hanauska 09d3d56db5 MDL-72050 filelib: Add function for deleting draftarea 2025-03-13 08:17:34 +01:00
danghieu1407 66ebd7a55a MDL-84708 question: Fixing layout answer box issue causing images 2025-03-13 10:28:55 +07:00
Paul Holden 8c178a1acb MDL-78381 course: observe default "showactivitydates" in external call. 2025-03-11 17:33:26 +00:00
Paul Holden 1c4b98c2d2 MDL-84787 calendar: restore course-specific management page parameter. 2025-03-11 13:32:52 +00:00
Lars Bonczek dd633f1691 MDL-83563 form: Fix hideIf and disabledIf dependent on multiselects 2025-03-11 12:14:11 +01:00
Paul Holden b64ef9cb84 MDL-84480 files: correct text formatting params when filtering files. 2025-03-11 10:30:05 +00:00
Andrew Gosali a13a005337 MDL-76801 mod_assign: grader ux fixes on "requires grading"
- refresh list when the user is graded hence no longer in the list
- hide the CTA buttons when no user is selected
2025-03-07 15:56:24 +08:00
Nathan Nguyen d1bb4b21e7 MDL-84233 core_user: fix unit test 2025-03-07 16:49:00 +11:00
Paul Holden f417f99261 MDL-62230 mod_feedback: define exporter format for name/presentation. 2025-03-04 14:13:02 +00:00
Laurent David 4cd5028c1a MDL-83499 core_courseformat: Fix section duplication
* When we duplicate a section with multiple subsections it
should increment the sectionum accordingly.
2025-03-04 09:07:35 +01:00
Huong Nguyen ea6b15e87a MDL-84222 lib: PHPMailer - Renew the expired token
This patch includes:
 - Get a new token if it is not available.
 - Renew the token if it is expired using the refresh token.
2025-03-03 14:30:34 +07:00
jfederico 588f7b6c0c MDL-84683 mdl_bigbluebuttonbn: Hide Settings for RecordingsOnly 2025-02-28 15:03:07 +00:00
Andrew Gosali a42e9c1392 MDL-84431 mod_forum: fix visual issue on forum reply button :focus 2025-02-26 10:13:11 +07:00
Paul Holden 254e94d4d3 MDL-84298 mod_assign: target only first label for grade popout button. 2025-02-24 22:22:09 +00:00
Paul Holden 8c35c29b06 MDL-84597 blog: confirm blogs enabled prior to settings nav access. 2025-02-24 12:53:33 +00:00
Andrew Nicols c89067d1b8 MDL-84446 core: Check existence of pcntl_signal 2025-02-18 06:20:41 +08:00
Leon Stringer 9d45e32f78 MDL-83195 mod_assign: Individual grade release
Fix pushing individual grades into the gradebook (as opposed to the
batch release of grades) when "Allow partial release of grades while
marking anonymously" is enabled.

This change reworks MDL-73626's fix for the same issue for releasing
multiple grades in a batch operation.
2025-02-14 12:15:52 +00:00
Katie Ransom f9a2a3332d MDL-84419 core_task: Scheduled task timing is wrong when DST begins
This was only an issue for tasks set to run in the hour when the clocks
change for daylight saving time. E.g. if a task is set to run at 1am
every day in the Europe/London timezone, then the day the clocks go
forward gets skipped because 1am doesn't exist on that day.
2025-02-07 09:26:35 +00:00
Andrew Nicols 8b3d6c3259 MDL-84421 tool_uploadcourse: Stop MUC caching enrol instances
We should not normally cache instances of a class. This can lead to poor
design to work around the limitations of PHP Serialization, and could
theoretically cause issues with PHP versions changing within a Moodle
version.
2025-02-04 22:14:09 +08:00
Lars Bonczek 12f326a61e MDL-81655 theme: Fix maintenance warning positioning 2024-12-17 13:13:13 +01:00
1800 changed files with 24811 additions and 7471 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"
+3 -3
View File
@@ -19,7 +19,7 @@ env:
jobs:
Grunt:
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
steps:
- name: Checking out code
@@ -61,12 +61,12 @@ jobs:
matrix:
include:
# MySQL builds always run with the lowest PHP supported version.
- os: ubuntu-22.04
- os: ubuntu-24.04
php: 8.1
extensions:
db: mysqli
# PostgreSQL builds always run with the highest PHP supported version.
- os: ubuntu-22.04
- os: ubuntu-24.04
php: 8.3
db: pgsql
+7
View File
@@ -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
+186
View File
@@ -6,6 +6,192 @@ 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).
## 4.5.9
### 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)
## 4.5.8
### core
#### 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)
### 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)
## 4.5.7
### 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)
### 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_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)
### 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)
## 4.5.6
### core
#### Added
- Add a new method has_valid_group in \core\report_helper that will return true or false depending if the user has a valid group. This is mainly false in case the user is not in any group in SEPARATEGROUPS. Used in report_log and report_loglive
For more information see [MDL-84464](https://tracker.moodle.org/browse/MDL-84464)
#### Changed
- The `\core\attribute\deprecated` attribute constructor `$replacement` parameter now defaults to null, and can be omitted
For more information see [MDL-84531](https://tracker.moodle.org/browse/MDL-84531)
- Added a new `\core\deprecation::emit_deprecation()` method which should be used in places where a deprecation is known to occur. This method will throw debugging if no deprecation notice was found, for example:
```php
public function deprecated_method(): void {
\core\deprecation::emit_deprecation([self::class, __FUNCTION__]);
}
```
For more information see [MDL-85897](https://tracker.moodle.org/browse/MDL-85897)
### core_message
#### Added
- The web service `core_message_get_member_info` additionally returns `cancreatecontact` which is a boolean value for a user's permission to add a contact.
For more information see [MDL-72123](https://tracker.moodle.org/browse/MDL-72123)
## 4.5.5
### core
#### Added
- - Added is_site_registered_in_hub method in lib/classes/hub/api.php to
check if the site is registered or not.
- Added get_secret method in lib/classes/hub/registration.php to get site's secret.
For more information see [MDL-83448](https://tracker.moodle.org/browse/MDL-83448)
- Added a new optional param to adhoc_task_failed and scheduled_task_failed to allow skipping log finalisation when called from a separate task.
For more information see [MDL-84442](https://tracker.moodle.org/browse/MDL-84442)
- There is a new `core/page_title` Javascript module for manipulating the current page title
For more information see [MDL-84804](https://tracker.moodle.org/browse/MDL-84804)
### core_auth
#### Added
- A new method called `get_additional_upgrade_token_parameters` has been added to `oauth2_client` class. This will allow custom clients to override this one and add their extra parameters for upgrade token request.
For more information see [MDL-80380](https://tracker.moodle.org/browse/MDL-80380)
### core_user
#### Added
- New method `\core_user::get_dummy_fullname(...)` for returning dummy user fullname comprised of configured name fields only
For more information see [MDL-82132](https://tracker.moodle.org/browse/MDL-82132)
## 4.5.4
### core
#### Added
- Behat now supports email content verification using Mailpit.
You can check the contents of an email using the step `Then the email to "user@example.com" with subject containing "subject" should contain "content".`
To use this feature:
1. Ensure that Mailpit is running
2. Define the following constants in your `config.php`:
- `TEST_EMAILCATCHER_MAIL_SERVER` - The Mailpit server address (e.g. `0.0.0.0:1025`)
- `TEST_EMAILCATCHER_API_SERVER` - The Mailpit API server (qe.g. `http://localhost:8025`)
3. Ensure that the email catcher is set up using the step `Given an email catcher server is configured`.
For more information see [MDL-75971](https://tracker.moodle.org/browse/MDL-75971)
- The public method `get_slashargument` has been added to the `url` class.
For more information see [MDL-84351](https://tracker.moodle.org/browse/MDL-84351)
- A new method, `core_text::trim_ctrl_chars()`, has been introduced to clean control characters from text. This ensures cleaner input handling and prevents issues caused by invisible or non-printable characters
For more information see [MDL-84907](https://tracker.moodle.org/browse/MDL-84907)
### core_files
#### Added
- A new function `file_clear_draft_area()` has been added to delete the files in a draft area.
For more information see [MDL-72050](https://tracker.moodle.org/browse/MDL-72050)
## 4.5.3
### core_question
+4
View File
@@ -118,6 +118,10 @@ 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]);
}
}
$outputhtml .= html_writer::end_tag('fieldset');
}
+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");
}
+1
View File
@@ -24,6 +24,7 @@
*/
define('CLI_SCRIPT', true);
define('IGNORE_COMPONENT_CACHE', true);
require(__DIR__.'/../../config.php');
require_once($CFG->libdir.'/clilib.php');
+40 -17
View File
@@ -55,13 +55,14 @@ If courseid is set, course module/s will be added into the course.
Options:
-f, --file=STRING Path to the backup file.
-c, --categoryid=INT ID of the course category to restore to.
-C, --courseid=INT ID of the course to restore to. This option is ignored if categoryid is set.
-c, --categoryid=INT ID of the course category to restore to. This option is ignored when restoring an activity and courseid is set.
-C, --courseid=INT ID of the course to restore to. This option is ignored when restoring a course and the categoryid is set.
-s, --showdebugging Show developer level debugging information
-h, --help Print out this help.
Example:
\$sudo -u www-data /usr/bin/php admin/cli/restore_backup.php --file=/path/to/backup/file.mbz --categoryid=1\n
\$sudo -u www-data /usr/bin/php admin/cli/restore_backup.php --file=/path/to/backup/coursebackup.mbz --categoryid=1\n
\$sudo -u www-data /usr/bin/php admin/cli/restore_backup.php --file=/path/to/backup/activitybackup.mbz --courseid=1\n
EOL;
echo $help;
@@ -84,11 +85,15 @@ if ($options['categoryid']) {
if (!$category = $DB->get_record('course_categories', ['id' => $options['categoryid']], 'id')) {
throw new \moodle_exception('invalidcategoryid');
}
} else if ($options['courseid']) {
}
if ($options['courseid']) {
if (!$course = $DB->get_record('course', ['id' => $options['courseid']], 'id')) {
throw new \moodle_exception('invalidcourseid');
}
} else {
}
if (empty($category) && empty($course)) {
throw new \moodle_exception('invalidoption');
}
@@ -100,28 +105,46 @@ $fp = get_file_packer('application/vnd.moodle.backup');
$fp->extract_to_pathname($options['file'], $path);
cli_heading(get_string('preprocessingbackupfile'));
try {
list($fullname, $shortname) = restore_dbops::calculate_course_names(0, get_string('restoringcourse', 'backup'),
get_string('restoringcourseshortname', 'backup'));
if (!empty($course)) {
$courseid = $course->id;
$rc = new restore_controller($backupdir, $courseid, backup::INTERACTIVE_NO,
backup::MODE_GENERAL, $admin->id, backup::TARGET_EXISTING_ADDING);
} else {
try {
// Create a temporary restore controller to determine the restore type.
$tmprc = new restore_controller($backupdir, SITEID, backup::INTERACTIVE_NO,
backup::MODE_GENERAL, $admin->id, backup::TARGET_EXISTING_ADDING);
// Restore the backup into a new course if:
// - It is a course backup and the category is set.
// - It is an activity backup and the course is not set.
$restoreasnewcourse = ($tmprc->get_type() === backup::TYPE_1COURSE && !empty($category)) ||
($tmprc->get_type() !== backup::TYPE_1COURSE && empty($course));
// Make sure to clean up the temporary restore controller.
$tmprc->destroy();
if ($restoreasnewcourse) {
list($fullname, $shortname) = restore_dbops::calculate_course_names(0, get_string('restoringcourse', 'backup'),
get_string('restoringcourseshortname', 'backup'));
$courseid = restore_dbops::create_new_course($fullname, $shortname, $category->id);
$rc = new restore_controller($backupdir, $courseid, backup::INTERACTIVE_NO,
backup::MODE_GENERAL, $admin->id, backup::TARGET_NEW_COURSE);
} else {
$courseid = $course->id;
$rc = new restore_controller($backupdir, $courseid, backup::INTERACTIVE_NO,
backup::MODE_GENERAL, $admin->id, backup::TARGET_EXISTING_ADDING);
}
$rc->execute_precheck();
$rc->execute_plan();
$rc->destroy();
// Rename course name if the backup is from course module and restore to category.
if (empty($course)) {
// Rename the course's full and short names with the backup file's original names if the backup file is an activity backup
// that is restored to a new course.
if ($restoreasnewcourse && $rc->get_type() !== backup::TYPE_1COURSE) {
$course = get_course($courseid);
list($fullname, $shortname) = restore_dbops::calculate_course_names(0, get_string('restoretonewcourse', 'backup'),
get_string('newcourse'));
$backupinfo = $rc->get_info();
$tmpfullname = $backupinfo->original_course_fullname ?? get_string('restoretonewcourse', 'backup');
$tmpshortname = $backupinfo->original_course_shortname ?? get_string('newcourse');
list($fullname, $shortname) = restore_dbops::calculate_course_names(
courseid: 0,
fullname: $tmpfullname,
shortname: $tmpshortname,
);
$course->fullname = $fullname;
$course->shortname = $shortname;
$course->visible = 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 {
+414
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">
@@ -4327,6 +4328,7 @@
<VENDOR name="oracle" version="19" />
</DATABASE>
<PHP version="8.1.0" level="required">
<RESTRICT function="restrict_php_version_84" message="unsupportedphpversion84" />
</PHP>
<PCREUNICODE level="optional">
<FEEDBACK>
@@ -4410,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">
@@ -4522,6 +4525,7 @@
<VENDOR name="oracle" version="19" />
</DATABASE>
<PHP version="8.1.0" level="required">
<RESTRICT function="restrict_php_version_84" message="unsupportedphpversion84" />
</PHP>
<PCREUNICODE level="optional">
<FEEDBACK>
@@ -4605,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">
@@ -4714,6 +4719,7 @@
<VENDOR name="mysql" version="8.4" />
<VENDOR name="postgres" version="14" />
<VENDOR name="mssql" version="14.0" />
<VENDOR name="auroramysql" version="8.0" />
</DATABASE>
<PHP version="8.2.0" level="required">
</PHP>
@@ -4799,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">
@@ -4893,6 +4900,413 @@
</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>
<MOODLE version="5.1" requires="4.2.3">
<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="15" />
<VENDOR name="mssql" version="14.0" />
<VENDOR name="auroramysql" version="8.0" />
</DATABASE>
<PHP version="8.2.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 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>
<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>
+16 -3
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);
@@ -931,6 +937,13 @@ $result = new environment_results('custom_checks');
$result = check_xmlrpc_usage($result);
$xmlrpcwarning = !is_null($result) ? get_string($result->getFeedbackStr(), 'admin') : '';
// Check whether MoodleNet features are enabled and warn about removal.
$moodlenetwarning = '';
$moodlenetenabled = get_config('tool_moodlenet', 'enablemoodlenet');
if ($moodlenetenabled) {
$moodlenetwarning = get_string('moodlenetremovalwarning', 'admin');
}
admin_externalpage_setup('adminnotifications');
$output = $PAGE->get_renderer('core', 'admin');
@@ -940,4 +953,4 @@ echo $output->admin_notifications_page($maturity, $insecuredataroot, $errorsdisp
$registered, $cachewarnings, $eventshandlers, $themedesignermode, $devlibdir,
$mobileconfigured, $overridetossl, $invalidforgottenpasswordurl, $croninfrequent,
$showcampaigncontent, $showfeedbackencouragement, $servicesandsupportcontent,
$xmlrpcwarning);
$xmlrpcwarning, $moodlenetwarning);
+2
View File
@@ -23,6 +23,8 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define('IGNORE_COMPONENT_CACHE', true);
require_once('../config.php');
require_once($CFG->libdir.'/adminlib.php');
+7 -5
View File
@@ -34,8 +34,10 @@ admin_externalpage_setup('registrationmoodleorg');
$unregistration = optional_param('unregistration', false, PARAM_BOOL);
$confirm = optional_param('confirm', false, PARAM_BOOL);
// Consider the site 'registered' if records exist locally and at the hub.
$siteisregistered = \core\hub\registration::is_registered() && core\hub\api::is_site_registered_in_hub();
if ($unregistration && \core\hub\registration::is_registered()) {
if ($unregistration && $siteisregistered) {
if ($confirm) {
require_sesskey();
\core\hub\registration::unregister(false, false);
@@ -60,7 +62,7 @@ if (!$returnurl = optional_param('returnurl', null, PARAM_LOCALURL)) {
$returnurl = $isinitialregistration ? '/admin/index.php' : '/admin/registration/index.php';
}
$siteregistrationform = new \core\hub\site_registration_form();
$siteregistrationform = new \core\hub\site_registration_form(null, ['registered' => $siteisregistered]);
$siteregistrationform->set_data(['returnurl' => $returnurl]);
if ($fromform = $siteregistrationform->get_data()) {
@@ -86,7 +88,7 @@ echo $OUTPUT->header();
// Current status of registration.
$notificationtype = \core\output\notification::NOTIFY_ERROR;
if (\core\hub\registration::is_registered()) {
if ($siteisregistered) {
$lastupdated = \core\hub\registration::get_last_updated();
if ($lastupdated == 0) {
$registrationmessage = get_string('pleaserefreshregistrationunknown', 'admin');
@@ -104,7 +106,7 @@ if (\core\hub\registration::is_registered()) {
}
// Heading.
if (\core\hub\registration::is_registered()) {
if ($siteisregistered) {
echo $OUTPUT->heading(get_string('registerwithmoodleorgupdate', 'core_hub'));
} else if ($isinitialregistration) {
echo $OUTPUT->heading(get_string('registerwithmoodleorgcomplete', 'core_hub'));
@@ -117,7 +119,7 @@ echo $renderer->moodleorg_registration_message();
$siteregistrationform->display();
if (\core\hub\registration::is_registered()) {
if ($siteisregistered) {
// Unregister link.
$unregisterhuburl = new moodle_url("/admin/registration/index.php", ['unregistration' => 1]);
echo html_writer::div(html_writer::link($unregisterhuburl, get_string('unregister', 'hub')), 'unregister mt-2');
+18 -2
View File
@@ -279,6 +279,7 @@ class core_admin_renderer extends plugin_renderer_base {
* @param bool $showfeedbackencouragement Whether the feedback encouragement content should be displayed or not.
* @param bool $showservicesandsupport Whether the services and support content should be displayed or not.
* @param string $xmlrpcwarning XML-RPC deprecation warning message.
* @param string $moodlenetwarning MoodleNet removal warning message.
*
* @return string HTML to output.
*/
@@ -288,7 +289,7 @@ class core_admin_renderer extends plugin_renderer_base {
$themedesignermode = false, $devlibdir = false, $mobileconfigured = false,
$overridetossl = false, $invalidforgottenpasswordurl = false, $croninfrequent = false,
$showcampaigncontent = false, bool $showfeedbackencouragement = false, bool $showservicesandsupport = false,
$xmlrpcwarning = '') {
$xmlrpcwarning = '', $moodlenetwarning = '') {
global $CFG;
$output = '';
@@ -314,6 +315,7 @@ 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($moodlenetwarning);
$output .= $this->userfeedback_encouragement($showfeedbackencouragement);
$output .= $this->services_and_support_content($showservicesandsupport);
$output .= $this->campaign_content($showcampaigncontent);
@@ -2218,7 +2220,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(
@@ -2267,6 +2269,20 @@ class core_admin_renderer extends plugin_renderer_base {
return $this->warning($xmlrpcwarning);
}
/**
* Display a warning about the removal of MoodleNet integration.
*
* @param string $moodlenetwarning The warning message
* @return string HTML to output.
*/
protected function moodlenet_removal_warning($moodlenetwarning) {
if (empty($moodlenetwarning)) {
return '';
}
return $this->warning($moodlenetwarning);
}
/**
* Renders the theme selector list.
*
+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);
+2
View File
@@ -81,6 +81,8 @@ class behat_admin extends behat_base {
$this->execute('behat_forms::i_set_the_field_with_xpath_to', [$fieldxpath, $value]);
$this->execute("behat_general::i_click_on", [get_string('savechanges'), 'button']);
// Wait for the page to be redirected.
$this->execute("behat_general::i_wait_to_be_redirected");
}
}
+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 |
@@ -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"
@@ -113,9 +113,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"
+4
View File
@@ -36,6 +36,10 @@ if (function_exists('opcache_reset')) {
define('CLI_SCRIPT', true);
define('CACHE_DISABLE_ALL', true);
// It makes no sense to use BEHAT_CLI for this script (the Behat launch scripts expect to start
// from the normal environment), so in case user has set tne environment variable, disable it.
putenv('BEHAT_CLI=0');
// Basic functions.
require_once(__DIR__ . '/../../../../lib/clilib.php');
require_once(__DIR__ . '/../../../../lib/behat/lib.php');
+4
View File
@@ -31,6 +31,10 @@ define('ABORT_AFTER_CONFIG', true);
define('CACHE_DISABLE_ALL', true);
define('NO_OUTPUT_BUFFERING', true);
// It makes no sense to use BEHAT_CLI for this script (the Behat launch scripts expect to start
// from the normal environment), so in case user has set tne environment variable, disable it.
putenv('BEHAT_CLI=0');
require_once(__DIR__ .'/../../../../config.php');
require_once(__DIR__.'/../../../../lib/clilib.php');
require_once(__DIR__.'/../../../../lib/behat/lib.php');
+4
View File
@@ -39,6 +39,10 @@ define('NO_OUTPUT_BUFFERING', true);
define('IGNORE_COMPONENT_CACHE', true);
define('ABORT_AFTER_CONFIG', true);
// It makes no sense to use BEHAT_CLI for this script (the Behat launch scripts expect to start
// from the normal environment), so in case user has set tne environment variable, disable it.
putenv('BEHAT_CLI=0');
require_once(__DIR__ . '/../../../../lib/clilib.php');
// CLI options.
+4
View File
@@ -33,6 +33,10 @@ if (isset($_SERVER['REMOTE_ADDR'])) {
die(); // No access from web!.
}
// It makes no sense to use BEHAT_CLI for this script (the Behat launch scripts expect to start
// from the normal environment), so in case user has set tne environment variable, disable it.
putenv('BEHAT_CLI=0');
// Basic functions.
require_once(__DIR__ . '/../../../../lib/clilib.php');
require_once(__DIR__ . '/../../../../lib/behat/lib.php');
+11 -2
View File
@@ -24,5 +24,14 @@
defined('MOODLE_INTERNAL') || die;
// Remove the 'enableaccessibilitytools' configuration setting in case of reinstall.
unset_config('enableaccessibilitytools');
/**
* Plugin uninstall code.
*
* @return true
*/
function xmldb_tool_brickfield_uninstall(): bool {
// Remove the 'enableaccessibilitytools' configuration setting in case of reinstall.
unset_config('enableaccessibilitytools');
return true;
}
+1
View File
@@ -87,6 +87,7 @@ $action = optional_param('action', '', PARAM_ALPHA);
// Handle any single operation actions.
if ($action == 'requestanalysis') {
if ($courseid != 0) {
require_sesskey();
scheduler::request_course_analysis($courseid);
if ($courseid == SITEID) {
redirect(accessibility::get_plugin_url());
@@ -0,0 +1,70 @@
<?php
// This file is part of Moodle - https://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 <https://www.gnu.org/licenses/>.
namespace tool_capability;
// phpcs:disable moodle.PHPUnit.TestCaseProvider.dataProviderSyntaxMethodNotFound
/**
* Detect common problems in capability definitions of plugins.
*
* @group plugin_checks
* @package tool_capability
* @copyright 2025 Petr Skoda
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
final class plugin_checks_test extends \core\tests\plugin_checks_testcase {
/**
* Verify contents of plugin db/access.php file.
*
* @dataProvider all_plugins_provider
* @coversNothing
*
* @param string $component
* @param string $plugintype
* @param string $pluginname
* @param string $dir
*/
public function test_db_access_file(string $component, string $plugintype, string $pluginname, string $dir): void {
global $CFG;
$stringmanager = get_string_manager();
$corerolefile = "$CFG->dirroot/lang/en/role.php";
$langfile = "$dir/lang/en/$component.php";
$file = "$dir/db/access.php";
$capabilities = $this->fetch_array_from_file($file, 'capabilities');
if (!$capabilities) {
$this->expectNotToPerformAssertions();
return;
}
foreach ($capabilities as $capname => $capability) {
if ($plugintype === 'qbank' && str_starts_with($capname, 'moodle/question:')) {
// Question bank capabilities are irregular.
$strname = explode('/', $capname, 2)[1];
$this->assertTrue($stringmanager->string_exists($strname, 'core_role'),
"Missing capability name string '$strname' in $corerolefile");
continue;
}
$this->assertMatchesRegularExpression("|^$plugintype/$pluginname:[a-z0-9_]+$|", $capname);
$strname = substr($capname, strlen($plugintype) + 1);
$this->assertTrue($stringmanager->string_exists($strname, $component),
"Missing capability name string '$strname' in $langfile");
$this->assertSame($capname, clean_param($capname, PARAM_CAPABILITY));
}
}
}
@@ -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'), 'sr-only');
$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'), 'sr-only'));
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'));
File diff suppressed because one or more lines are too long
@@ -123,6 +123,7 @@ class expired_contexts_manager {
$expiredcontext = new expired_context(0, $orphan);
$expiredcontext->delete();
}
$orphaned->close();
// Delete any child of a user context.
$parentpath = $DB->sql_concat('ctxuser.path', "'/%'");
@@ -143,6 +144,7 @@ class expired_contexts_manager {
$expiredcontext = new expired_context(0, $child);
$expiredcontext->delete();
}
$userchildren->close();
}
/**
@@ -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);
}
/**
@@ -127,7 +127,6 @@ $string['dporolemapping'] = 'Privacy officer role mapping';
$string['dporolemapping_desc'] = 'The privacy officer can manage data requests. The capability tool/dataprivacy:managedatarequests must be allowed for a role to be listed as a privacy officer role mapping option.';
$string['editcategories'] = 'Edit categories';
$string['editcategory'] = 'Edit category';
$string['editcategories'] = 'Edit categories';
$string['editdefaults'] = 'Edit defaults: {$a}';
$string['editmoduledefaults'] = 'Edit module defaults';
$string['editpurpose'] = 'Edit purpose';
@@ -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 |
@@ -28,6 +28,7 @@ use renderable;
use templatable;
use renderer_base;
use single_button;
use action_link;
use stdClass;
use moodle_url;
use context;
@@ -65,6 +66,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 +77,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' => 'btn btn-secondary 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"
@@ -46,11 +46,11 @@ Feature: See the competencies for an activity on the course competencies page.
When I follow "Competencies"
Then I should see "Test-Comp1"
And I should see "Test-Comp2"
And I set the field "Filter competencies by resource or activity" to "PageName1"
And I set the competency filter "Filter competencies by resource or activity" to "PageName1"
And I press the enter key
And I should see "Test-Comp1"
And I should not see "Test-Comp2"
And I set the field "Filter competencies by resource or activity" to "PageName2"
And I set the competency filter "Filter competencies by resource or activity" to "PageName2"
And I press the enter key
And I should not see "Test-Comp1"
And I should not see "Test-Comp2"
+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 | Email address |
| LPT1 | User One | user1@example.com |
| LPT1 | User Two | user2@example.com |
+11
View File
@@ -169,6 +169,17 @@ switch ($action) {
echo $OUTPUT->heading(get_string('managefactor', 'factor_' . $factorobject->name));
echo $OUTPUT->active_factors($factor);
echo $OUTPUT->single_button($returnurl, get_string('back'));
// Displays a setup additional button in case it is needed.
if ($factorobject->show_additional_setup_button()) {
echo $OUTPUT->single_button(
url: new \moodle_url('action.php', ['action' => 'setup', 'factor' => $factor]),
label: $factorobject->get_additional_setup_string(),
method: 'post',
options: ['type' => 'primary'],
);
}
// JS for modal confirming replace and revoke actions.
$PAGE->requires->js_call_amd('tool_mfa/confirmation_modal', 'init', [$context->id]);
@@ -421,6 +421,18 @@ abstract class object_factor_base implements object_factor {
return $this->has_setup();
}
/**
* Returns true if a button should be shown to add factors of the same kind on the preferences page.
* For example, give user's the ability to set up multiple security keys.
*
* Override in child class if necessary.
*
* @return bool
*/
public function show_additional_setup_button(): bool {
return false;
}
/**
* Returns true if a factor requires input from the user to verify.
*
@@ -578,6 +590,18 @@ abstract class object_factor_base implements object_factor {
return get_string('setupfactor', 'tool_mfa');
}
/**
* Gets the string for additional setup button on preferences page.
* If the user has the ability to set up multiple security keys.
*
* Override in child class if necessary.
*
* @return string
*/
public function get_additional_setup_string(): string {
return get_string('setupfactorbuttonadditional', 'tool_mfa');
}
/**
* Gets the string for manage button on preferences page.
*
+66 -37
View File
@@ -41,6 +41,18 @@ class manager {
/** @var int */
const REDIR_LOOP_THRESHOLD = 5;
/** @var array These components and related fileareas will not redirect. */
const ALLOWED_COMPONENTS = [
'core_admin' => [
'logocompact',
'logo',
'favicon',
],
'tool_mfa' => [
'guidance',
],
];
/**
* Displays a debug table with current factor information.
*
@@ -424,6 +436,52 @@ class manager {
return self::NO_REDIRECT;
}
// Ensure we have a moodle_url object if a string is provided.
if (is_string($url)) {
$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)) {
// Get the slash arguments.
$args = explode('/', ltrim($url->get_slashargument(), '/'));
// Remove the contextid because we do not need it for this check.
array_shift($args);
// Get the component and filearea.
$component = clean_param(array_shift($args), PARAM_COMPONENT);
$filearea = clean_param(array_shift($args), PARAM_AREA);
// Check allowed components.
if (!array_key_exists($component, static::ALLOWED_COMPONENTS)) {
return self::REDIRECT;
}
// Check allowed fileareas.
if (!in_array($filearea, static::ALLOWED_COMPONENTS[$component])) {
return self::REDIRECT;
}
return self::NO_REDIRECT;
}
// Remove all params before comparison.
$url->remove_all_params();
@@ -442,39 +500,11 @@ class manager {
}
}
// Dont redirect logo images from pluginfile.php (for example: logo in header).
$logourl = new \moodle_url('/pluginfile.php/1/core_admin/logocompact/');
if ($url->compare($logourl)) {
return self::NO_REDIRECT;
}
// 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;
}
// Enrolment.
$enrol = new \moodle_url('/enrol/index.php');
if ($enrol->compare($url, URL_MATCH_BASE)) {
return self::NO_REDIRECT;
}
// Guest access.
if (isguestuser()) {
return self::NO_REDIRECT;
@@ -485,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();
@@ -499,12 +524,16 @@ class manager {
}
}
// Site policies from tool_policy.
$policyviewurl = new \moodle_url('/admin/tool/policy/view.php');
$policyindexurl = new \moodle_url('/admin/tool/policy/index.php');
if ($policyviewurl->compare($url, URL_MATCH_BASE) || $policyindexurl->compare($url, URL_MATCH_BASE)) {
return self::NO_REDIRECT;
}
// 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;
}
+10 -10
View File
@@ -379,7 +379,7 @@ class renderer extends \plugin_renderer_base {
WHERE deleted = 0
AND suspended = 0
GROUP BY auth";
$allusersinfo = $DB->get_records_sql($alluserssql, []);
$allusersinfo = $DB->get_records_sql_menu($alluserssql);
$noncompletesql = "SELECT u.auth, COUNT(u.id)
FROM {user} u
@@ -388,7 +388,7 @@ class renderer extends \plugin_renderer_base {
AND (mfaa.lastverified < ?
OR mfaa.lastverified IS NULL)
GROUP BY u.auth";
$noncompleteinfo = $DB->get_records_sql($noncompletesql, [$lookback, $lookback]);
$noncompleteinfo = $DB->get_records_sql_menu($noncompletesql, [$lookback, $lookback]);
$nologinsql = "SELECT auth, COUNT(id)
FROM {user}
@@ -396,7 +396,7 @@ class renderer extends \plugin_renderer_base {
AND suspended = 0
AND lastlogin < ?
GROUP BY auth";
$nologininfo = $DB->get_records_sql($nologinsql, [$lookback]);
$nologininfo = $DB->get_records_sql_menu($nologinsql, [$lookback]);
$mfauserssql = "SELECT auth,
COUNT(DISTINCT tm.userid)
@@ -406,7 +406,7 @@ class renderer extends \plugin_renderer_base {
AND u.deleted = 0
AND u.suspended = 0
GROUP BY u.auth";
$mfausersinfo = $DB->get_records_sql($mfauserssql, [$lookback]);
$mfausersinfo = $DB->get_records_sql_menu($mfauserssql, [$lookback]);
$factorsusedsql = "SELECT CONCAT(u.auth, '_', tm.factor) as id,
COUNT(*)
@@ -417,7 +417,7 @@ class renderer extends \plugin_renderer_base {
AND u.suspended = 0
AND (tm.revoked = 0 OR (tm.revoked = 1 AND tm.timemodified > ?))
GROUP BY CONCAT(u.auth, '_', tm.factor)";
$factorsusedinfo = $DB->get_records_sql($factorsusedsql, [$lookback, $lookback]);
$factorsusedinfo = $DB->get_records_sql_menu($factorsusedsql, [$lookback, $lookback]);
// Auth rows.
$authtypes = get_enabled_auth_plugins(true);
@@ -426,10 +426,10 @@ class renderer extends \plugin_renderer_base {
$row[] = \html_writer::tag('b', $authtype);
// Setup the overall totals columns.
$row[] = $allusersinfo[$authtype]->count ?? '-';
$row[] = $mfausersinfo[$authtype]->count ?? '-';
$row[] = $noncompleteinfo[$authtype]->count ?? '-';
$row[] = $nologininfo[$authtype]->count ?? '-';
$row[] = $allusersinfo[$authtype] ?? '-';
$row[] = $mfausersinfo[$authtype] ?? '-';
$row[] = $noncompleteinfo[$authtype] ?? '-';
$row[] = $nologininfo[$authtype] ?? '-';
// Create a running counter for the total.
$authtotal = 0;
@@ -439,7 +439,7 @@ class renderer extends \plugin_renderer_base {
if (!empty($column)) {
// Get the information from the data key.
$key = $authtype . '_' . $column;
$count = $factorsusedinfo[$key]->count ?? 0;
$count = $factorsusedinfo[$key] ?? 0;
$authtotal += $count;
$row[] = $count ? format_float($count, 0) : '-';
@@ -41,7 +41,8 @@ class factor_email_renderer extends plugin_renderer_base {
$authurl = new \moodle_url('/admin/tool/mfa/factor/email/email.php',
['instance' => $instance->id, 'pass' => 1, 'secret' => $instance->secret]);
$authurlstring = \html_writer::link($authurl, get_string('email:link', 'factor_email'));
$blockurl = new \moodle_url('/admin/tool/mfa/factor/email/email.php', ['instance' => $instanceid]);
$blockurl = new \moodle_url('/admin/tool/mfa/factor/email/email.php',
['instance' => $instance->id, 'secret' => $instance->secret]);
$blockurlstring = \html_writer::link($blockurl, get_string('email:stoploginlink', 'factor_email'));
$geoinfo = iplookup_find_location($instance->createdfromip);
+8 -3
View File
@@ -42,7 +42,8 @@ $PAGE->set_cacheable(false);
$instance = $DB->get_record('tool_mfa', ['id' => $instanceid]);
$factor = \tool_mfa\plugininfo\factor::get_factor('email');
// If pass is set, require login to force $SESSION and user, and pass for that session.
// If pass is set, do checks and pass for this session.
// Require login to force $SESSION and user, and pass for that session.
if (!empty($instance) && $pass != 0 && $secret != 0) {
require_login();
if ($factor->get_state() === \tool_mfa\plugininfo\factor::STATE_LOCKED) {
@@ -69,8 +70,12 @@ $form = new \factor_email\form\email($url);
if ($form->is_cancelled()) {
redirect(new moodle_url('/'));
} else if ($fromform = $form->get_data()) {
if (empty($instance)) {
}
// If submitted without the pass param, is a cancel request - do checks and revoke email factor.
if ($fromform = $form->get_data()) {
// Only allow revoke attempts from requests with a valid instance and secret.
if (empty($instance) || empty($secret) || $instance->secret != $secret) {
$message = get_string('error:badcode', 'factor_email');
} else {
$user = $DB->get_record('user', ['id' => $instance->userid]);
@@ -33,7 +33,7 @@ $string['email:loginlink'] = 'Or, if you\'re on the same device, use this {$a}.'
$string['email:message'] = 'Here\'s your verification code for {$a->sitename} ({$a->siteurl}).';
$string['email:originatingip'] = 'This login request was made from \'{$a}\'';
$string['email:revokelink'] = 'If this wasn\'t you, you can {$a}.';
$string['email:revokesuccess'] = 'This code has been successfully revoked. All sessions for {$a} have been ended.
$string['email:revokesuccess'] = 'This code has been successfully revoked. All sessions for this user have been ended.
Email will not be usable as a factor until account security has been verified.';
$string['email:subject'] = 'Here\'s your verification code';
$string['email:stoploginlink'] = 'stop this login attempt';
+4 -1
View File
@@ -351,7 +351,10 @@ class factor extends object_factor_base {
* @return bool
*/
public function show_setup_buttons(): bool {
return true;
if (get_config('factor_sms', 'smsgateway') > 0) {
return true;
}
return false;
}
/**
+20
View File
@@ -76,5 +76,25 @@ function xmldb_factor_sms_upgrade(int $oldversion): bool {
// Automatically generated Moodle v4.5.0 release upgrade line.
// Put any upgrade step following this.
if ($oldversion < 2024100702) {
// Ensure default values are applied for the MFA SMS factor when upgrading.
$config = get_config('factor_sms');
// Set the weight to the default value (100) if it is misconfigured (e.g. set to 0).
$weight = $config->weight ?? null;
if (isset($weight) && (int)$weight <= 0) {
set_config('weight', 100, 'factor_sms');
}
// Set the duration to the default value (30 minutes) if it is misconfigured (e.g. set to 0).
$duration = $config->duration ?? null;
if (isset($duration) && (int)$duration <= 0) {
set_config('duration', 30 * MINSECS, 'factor_sms');
}
// MFA savepoint reached.
upgrade_plugin_savepoint(true, 2024100702, 'factor', 'sms');
}
return true;
}
@@ -55,7 +55,7 @@ $string['settings:gateway_help'] = 'The SMS provider you wish to send messages v
$string['settings:heading'] = 'Users will receive an SMS with 6-digit code during login, which they must enter to complete the login process.
Users will need to register their mobile phone number first.';
$string['settings:setupdesc'] = '<br><br>To use SMS as an authentication factor, you first need to <a href="{$a}">set up an SMS gateway</a>.';
$string['settings:setupdesc'] = 'To use SMS as an authentication factor, you first need to <a href="{$a}">set up an SMS gateway</a>.';
$string['settings:smsgateway'] = 'SMS gateway';
$string['settings:smsgateway_help'] = 'Select a gateway from the list, or <a href="{$a}">create a new gateway</a>.';
$string['setupfactor'] = 'Set up SMS';
+50 -57
View File
@@ -51,70 +51,63 @@ if ($ADMIN->fulltree) {
),
);
// Get available gateways, or link to gateway creation.
$gateways = [0 => new lang_string('none')];
if (count($gatewayrecords) > 0) {
$gateways = [0 => new lang_string('none')];
foreach ($gatewayrecords as $record) {
$values = explode('\\', $record->gateway);
$gatewayname = new lang_string('pluginname', $values[0]);
$gateways[$record->id] = $record->name . ' (' . $gatewayname . ')';
}
$settings->add(
new admin_setting_configselect(
'factor_sms/smsgateway',
new lang_string('settings:smsgateway', 'factor_sms'),
new lang_string('settings:smsgateway_help', 'factor_sms', $smsconfigureurl),
0,
$gateways,
),
);
$enabled = new admin_setting_configcheckbox(
'factor_sms/enabled',
new lang_string('settings:enablefactor', 'tool_mfa'),
new lang_string('settings:enablefactor_help', 'tool_mfa'),
0,
);
$enabled->set_updatedcallback(function () {
\tool_mfa\manager::do_factor_action(
'sms',
get_config('factor_sms', 'enabled') ? 'enable' : 'disable',
);
});
$settings->add($enabled);
$settings->add(
new admin_setting_configtext(
'factor_sms/weight',
new lang_string('settings:weight', 'tool_mfa'),
new lang_string('settings:weight_help', 'tool_mfa'),
100,
PARAM_INT,
),
);
$settings->hide_if('factor_sms/weight', 'factor_sms/enabled');
$settings->add(
new admin_setting_configduration(
'factor_sms/duration',
new lang_string('settings:duration', 'tool_mfa'),
new lang_string('settings:duration_help', 'tool_mfa'),
30 * MINSECS,
MINSECS,
),
);
$settings->hide_if('factor_sms/duration', 'factor_sms/enabled');
} else {
$settings->add(
new admin_setting_description(
'factor_sms/setupdesc',
'',
new lang_string(
'settings:setupdesc',
'factor_sms',
$smsconfigureurl,
),
),
$notify = new \core\output\notification(
get_string('settings:setupdesc', 'factor_sms', $smsconfigureurl),
\core\output\notification::NOTIFY_WARNING
);
$settings->add(new admin_setting_heading('factor_sms/setupdesc', '', $OUTPUT->render($notify)));
}
$settings->add(
new admin_setting_configselect(
'factor_sms/smsgateway',
new lang_string('settings:smsgateway', 'factor_sms'),
new lang_string('settings:smsgateway_help', 'factor_sms', $smsconfigureurl),
0,
$gateways,
),
);
$enabled = new admin_setting_configcheckbox(
'factor_sms/enabled',
new lang_string('settings:enablefactor', 'tool_mfa'),
new lang_string('settings:enablefactor_help', 'tool_mfa'),
0,
);
$enabled->set_updatedcallback(function () {
\tool_mfa\manager::do_factor_action(
'sms',
get_config('factor_sms', 'enabled') ? 'enable' : 'disable',
);
});
$settings->add($enabled);
$settings->add(
new admin_setting_configtext(
'factor_sms/weight',
new lang_string('settings:weight', 'tool_mfa'),
new lang_string('settings:weight_help', 'tool_mfa'),
100,
PARAM_INT,
),
);
$settings->add(
new admin_setting_configduration(
'factor_sms/duration',
new lang_string('settings:duration', 'tool_mfa'),
new lang_string('settings:duration_help', 'tool_mfa'),
30 * MINSECS,
MINSECS,
),
);
}
+1 -1
View File
@@ -26,7 +26,7 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2024100700; // The current plugin version (Date: YYYYMMDDXX).
$plugin->version = 2024100702; // The current plugin version (Date: YYYYMMDDXX).
$plugin->requires = 2024100100; // Requires this Moodle version.
$plugin->component = 'factor_sms'; // Full name of the plugin (used for diagnostics).
$plugin->maturity = MATURITY_STABLE;
@@ -71,7 +71,7 @@ $string['setupfactor:instructionsverification'] = '3. Enter the verification cod
$string['setupfactor:intro'] = 'To set up this method, you need to have a device with an authenticator app. If you don\'t have an app, you can download one. For example, <a href="https://2fas.com/" target="_blank">2FAS Auth</a>, <a href="https://freeotp.github.io/" target="_blank">FreeOTP</a>, Google Authenticator, Microsoft Authenticator or Twilio Authy.';
$string['setupfactor:key'] = 'Secret key: ';
$string['setupfactor:link'] = 'Or enter details manually.';
$string['setupfactor:link_help'] = 'If you are on a mobile device and already have an authenticator app installed this link may work. Note that using TOTP on the same device as you login on can weaken the benefits of MFA.';
$string['setupfactor:link_help'] = 'If you are on a mobile device and already have an authenticator app installed this link may work. Note that using TOTP on the same device as you log in on can weaken the benefits of MFA.';
$string['setupfactor:linklabel'] = 'Open app already installed on this device';
$string['setupfactor:mode'] = 'Mode:';
$string['setupfactor:mode:timebased'] = 'Time-based';
@@ -115,6 +115,15 @@ class factor extends object_factor_base {
return true;
}
/**
* Returns true if an additional setup button should be shown on the preferences page.
*
* @return bool
*/
public function show_additional_setup_button(): bool {
return true;
}
/**
* WebAuthn factor implementation.
*
@@ -155,6 +164,15 @@ class factor extends object_factor_base {
return get_string('setupfactorbutton', 'factor_webauthn');
}
/**
* Gets the string for additional setup button on preferences page.
*
* @return string
*/
public function get_additional_setup_string(): string {
return get_string('setupfactorbuttonadditional', 'factor_webauthn');
}
/**
* Gets the string for manage button on preferences page.
*
@@ -51,6 +51,7 @@ $string['settings:userverification'] = 'User verification';
$string['settings:userverification_help'] = 'Serves to ensure the person authenticating is in fact who they say they are. User verification can take various forms, such as password, PIN, fingerprint, etc.';
$string['setupfactor'] = 'Set up security key';
$string['setupfactorbutton'] = 'Set up';
$string['setupfactorbuttonadditional'] = 'Add security key';
$string['setupfactor:instructionsregistersecuritykey'] = '2. Register a security key.';
$string['setupfactor:instructionssecuritykeyname'] = '1. Give your key a name.';
$string['setupfactor:intro'] = 'A security key is a physical device that you can use to authenticate yourself. Security keys can be USB tokens, Bluetooth devices, or event built-in fingerprint scanners on your phone or computer.';
+1 -1
View File
@@ -29,7 +29,7 @@ require_once(__DIR__ . '/../../../config.php');
$PAGE->set_context(\context_system::instance());
$PAGE->set_url(new moodle_url('/admin/tool/mfa/guide.php'));
$PAGE->set_title(get_string('guidance', 'tool_mfa'));
$PAGE->set_pagelayout('standard');
$PAGE->set_pagelayout('secure');
// If guidance page isn't enabled, just redir back to home.
if (!get_config('tool_mfa', 'guidance')) {
-1
View File
@@ -2,4 +2,3 @@ created,tool_mfa
createdfromip,tool_mfa
lastverified,tool_mfa
revoke,tool_mfa
setup,tool_mfa
+2 -1
View File
@@ -150,7 +150,9 @@ $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['setuprequired'] = 'User setup';
$string['state:fail'] = 'Fail';
$string['state:locked'] = 'Locked';
@@ -179,4 +181,3 @@ $string['created'] = 'Created';
$string['createdfromip'] = 'Created from IP';
$string['lastverified'] = 'Last verified';
$string['revoke'] = 'Revoke';
$string['setup'] = 'Setup';
+3 -3
View File
@@ -126,8 +126,8 @@ function tool_mfa_bulk_user_actions(): array {
/**
* Serves any files for the guidance page.
*
* @param stdClass $course
* @param stdClass $cm
* @param stdClass|null $course
* @param stdClass|null $cm
* @param context $context
* @param string $filearea
* @param array $args
@@ -135,7 +135,7 @@ function tool_mfa_bulk_user_actions(): array {
* @param array $options
* @return bool
*/
function tool_mfa_pluginfile(stdClass $course, stdClass $cm, context $context, string $filearea,
function tool_mfa_pluginfile(stdClass|null $course, stdClass|null $cm, context $context, string $filearea,
array $args, bool $forcedownload, array $options = []): bool {
// Hardcode to only send guidance files from the top level.
$fs = get_file_storage();
+1 -1
View File
@@ -23,6 +23,6 @@
{
}
}}
<a href='{{config.wwwroot}}/admin/tool/mfa/guide.php'>
<a href='{{config.wwwroot}}/admin/tool/mfa/guide.php' target='_blank'>
{{#str}} guidance, tool_mfa {{/str}}
</a>
@@ -32,13 +32,23 @@ Feature: Set up and manage user factors
And I click on "Cancel" "button"
And I click on "Manage security key" "button"
And I should see "Manage security key"
And I should see "Add security key"
@javascript
Scenario: I can revoke a factor only when there is more than one active factor
Given the following config values are set as admin:
| enabled | 1 | factor_webauthn |
And I navigate to "Plugins > SMS > Manage SMS gateways" in site administration
And I follow "Create new SMS gateway"
And I set the following fields to these values:
| SMS gateway provider | AWS |
| Gateway name | Dummy gateway |
| Access key | key123 |
| Secret access key | secret456 |
And I press "Save changes"
And the following config values are set as admin:
| enabled | 1 | factor_sms |
| smsgateway | Dummy gateway (AWS) | factor_sms |
And the following "tool_mfa > User factors" exist:
| username | factor | label |
| admin | sms | +409111222 |
@@ -67,3 +77,15 @@ Feature: Set up and manage user factors
And I click on "Replace" "button" in the "MacBook" "table_row"
When I click on "Yes, replace" "button" in the "Replace 'MacBook' security key?" "dialogue"
Then I should see "Replace security key"
Scenario: I can add a new factor instance on the manage factor page
Given the following config values are set as admin:
| enabled | 1 | factor_webauthn |
And the following "tool_mfa > User factors" exist:
| username | factor | label |
| admin | webauthn | MacBook |
And I follow "Preferences" in the user menu
And I click on "Multi-factor authentication preferences" "link"
And I click on "Manage security key" "button"
When I click on "Add security key" "button"
Then I should see "Set up security key"
+21 -5
View File
@@ -241,11 +241,6 @@ final class manager_test extends \advanced_testcase {
$this->assertEquals(\tool_mfa\manager::NO_REDIRECT, \tool_mfa\manager::should_require_mfa($badurl, false));
$this->setUser($user);
// Enrolment.
$enrolurl = new \moodle_url('/enrol/index.php');
$this->assertEquals(\tool_mfa\manager::REDIRECT, \tool_mfa\manager::should_require_mfa($badurl, false));
$this->assertEquals(\tool_mfa\manager::NO_REDIRECT, \tool_mfa\manager::should_require_mfa($enrolurl, false));
// Guest User.
$this->assertEquals(\tool_mfa\manager::REDIRECT, \tool_mfa\manager::should_require_mfa($badurl, false));
$this->setGuestUser();
@@ -266,6 +261,27 @@ final class manager_test extends \advanced_testcase {
\core\session\manager::loginas($user2->id, $syscontext, false);
$this->assertEquals(\tool_mfa\manager::NO_REDIRECT, \tool_mfa\manager::should_require_mfa($badurl, false));
$this->setUser($user);
// Access logocompact via pluginfile.
$logourl = new \moodle_url('/pluginfile.php/1/core_admin/logocompact/');
$this->assertEquals(\tool_mfa\manager::NO_REDIRECT, \tool_mfa\manager::should_require_mfa($logourl, false));
// Access logo via pluginfile.
$logourl = new \moodle_url('/pluginfile.php/1/core_admin/logo/');
$this->assertEquals(\tool_mfa\manager::NO_REDIRECT, \tool_mfa\manager::should_require_mfa($logourl, false));
// Access favicon via pluginfile.
$logourl = new \moodle_url('/pluginfile.php/1/core_admin/favicon/');
$this->assertEquals(\tool_mfa\manager::NO_REDIRECT, \tool_mfa\manager::should_require_mfa($logourl, false));
// Access guidance files.
$guideurl = new \moodle_url('/pluginfile.php/1/tool_mfa/guidance/0/capybara.png');
$this->assertEquals(\tool_mfa\manager::NO_REDIRECT, \tool_mfa\manager::should_require_mfa($guideurl, false));
// Access private area.
$user3 = $this->getDataGenerator()->create_user();
$privateurl = new \moodle_url("/pluginfile.php/{$user3->id}/user/private/privatefile.png");
$this->assertEquals(\tool_mfa\manager::REDIRECT, \tool_mfa\manager::should_require_mfa($privateurl, false));
}
/**
+1 -1
View File
@@ -810,7 +810,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
@@ -17,7 +17,10 @@
namespace tool_mobile;
use core\session\utility\cookie_helper;
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.
@@ -36,22 +39,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.
@@ -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}';
@@ -27,8 +27,16 @@
<div class="content text-start mb-5 px-5 py-4" data-region="chooser-option-summary-content-container">
<div data-region="moodle-net">
<div class="overlay-icon-container z-index-1 d-none" data-region="spinner"></div>
<img class="w-25 mb-4" aria-hidden="true" src="{{{img}}}">
<img class="w-25 mb-4" alt="" aria-hidden="true" src="{{{img}}}">
<p>{{#str}} instancedescription, tool_moodlenet {{/str}}</p>
{{! Removal warning - always visible when MoodleNet integration is enabled }}
<div class="alert alert-warning w-75 mx-auto mb-3" role="alert">
<strong>{{#str}}removalwarning_title, tool_moodlenet{{/str}}</strong>
<p class="mb-1">{{#str}}removalwarning_service, tool_moodlenet{{/str}}</p>
<p class="mb-0">{{#str}}removalwarning_feature, tool_moodlenet{{/str}}</p>
</div>
<p class="w-75 mx-auto mb-1 mt-5">{{#str}} connectandbrowse, tool_moodlenet {{/str}}</p>
<a class="btn btn-secondary d-block w-75 mx-auto mb-4"
data-action="browse"
@@ -129,6 +129,7 @@ class issuer extends persistent {
\core\oauth2\issuer::EVERYWHERE => get_string('issueruseineverywhere', 'tool_oauth2'),
\core\oauth2\issuer::LOGINONLY => get_string('issueruseinloginonly', 'tool_oauth2'),
\core\oauth2\issuer::SERVICEONLY => get_string('issueruseininternalonly', 'tool_oauth2'),
\core\oauth2\issuer::SMTPWITHXOAUTH2 => get_string('issueruseinsmtpwithoauth', 'tool_oauth2'),
];
$mform->addElement('select', 'showonloginpage', get_string('issuerusein', 'tool_oauth2'), $options);
$mform->addHelpButton('showonloginpage', 'issuerusein', 'tool_oauth2');
@@ -138,6 +139,13 @@ class issuer extends persistent {
$mform->addRule('loginpagename', get_string('maximumchars', '', 255), 'maxlength', 255, 'client');
$mform->addHelpButton('loginpagename', 'issuerloginpagename', 'tool_oauth2');
$mform->hideIf('loginpagename', 'showonloginpage', 'eq', \core\oauth2\issuer::SERVICEONLY);
$mform->hideIf('loginpagename', 'showonloginpage', 'eq', \core\oauth2\issuer::SMTPWITHXOAUTH2);
// Connected email for XOAUTH2.
$mform->addElement('text', 'systememail', get_string('issuersmtpsystememail', 'tool_oauth2'));
$mform->setType('systememail', PARAM_EMAIL);
$mform->addHelpButton('systememail', 'issuersmtpsystememail', 'tool_oauth2');
$mform->hideIf('systememail', 'showonloginpage', 'ne', \core\oauth2\issuer::SMTPWITHXOAUTH2);
// Login scopes.
$mform->addElement('text', 'loginscopes', get_string('issuerloginscopes', 'tool_oauth2'));
@@ -86,7 +86,8 @@ class renderer extends plugin_renderer_base {
$namecell->header = true;
// Login issuer.
if ((int)$issuer->get('showonloginpage') == issuer::SERVICEONLY) {
if ((int)$issuer->get('showonloginpage') == issuer::SERVICEONLY ||
(int)$issuer->get('showonloginpage') == issuer::SMTPWITHXOAUTH2) {
$loginissuer = $this->pix_icon('no', get_string('notloginissuer', 'tool_oauth2'), 'tool_oauth2');
$logindisplayas = '';
} else {
+4 -1
View File
@@ -89,13 +89,16 @@ $string['issuershowonloginpage'] = 'Show on login page';
$string['issuerrequireconfirmation_help'] = 'Require that all users verify their email address before they can log in with OAuth. This applies to newly created accounts as part of the login process, or when an existing Moodle account is connected to an OAuth login via matching email addresses.';
$string['issuerrequireconfirmation'] = 'Require email verification';
$string['issuers'] = 'Issuers';
$string['issuersmtpsystememail'] = 'SMTP email';
$string['issuersmtpsystememail_help'] = 'If specified, this email will be used to connect a system account for sending email via SMTP. This is required for some OAuth 2 services (e.g. Microsoft). Please check the documentation for your OAuth 2 service to see if this is required.';
$string['issuersservicesallow'] = 'Allow services';
$string['issuersservicesnotallow'] = 'Do not allow services';
$string['issuerusein'] = 'This service will be used';
$string['issuerusein_help'] = 'OAuth 2 services can be used for internal services, on the login page, or both, if required.';
$string['issuerusein_help'] = 'OAuth 2 services can be used for internal services, on the login page, SMTP with XOAUTH2, or both login page and internal services, if required.';
$string['issueruseineverywhere'] = 'Login page and internal services';
$string['issueruseininternalonly'] = 'Internal services only';
$string['issueruseinloginonly'] = 'Login page only';
$string['issueruseinsmtpwithoauth'] = 'SMTP with XOAUTH2 only';
$string['issuerusedforlogin'] = 'Login';
$string['issuerusedforinternal'] = 'Internal services';
$string['linkedin_service'] = 'LinkedIn';
@@ -54,13 +54,17 @@ Feature: Basic OAuth2 functionality
And I should see "Testing service"
And "Allow login" "icon" should exist in the "Testing service" "table_row"
And "Allow services" "icon" should exist in the "Testing service" "table_row"
And I should see "-" in the "Testing service" "table_row"
And "Service discovery successful" "icon" should exist in the "Testing service" "table_row"
And I click on "Configure endpoints" "link" in the "Testing service" "table_row"
And I should see "authorization_endpoint"
And I should not see "discovery_endpoint"
And I should see "discovery_endpoint"
And I should see "device_authorization_endpoint"
And I navigate to "Server > OAuth 2 services" in site administration
And I click on "Configure user field mappings" "link" in the "Testing service" "table_row"
And I should see "firstname" in the "givenName" "table_row"
And I should see "firstname" in the "givenname" "table_row"
And I should see "idnumber" in the "sub" "table_row"
And I should see "email" in the "email" "table_row"
And I should see "lang" in the "locale" "table_row"
And I navigate to "Server > OAuth 2 services" in site administration
And I click on "Edit" "link" in the "Testing service" "table_row"
And I set the following fields to these values:
+4
View File
@@ -34,6 +34,10 @@ if (function_exists('opcache_reset')) {
define('IGNORE_COMPONENT_CACHE', true);
// It makes no sense to use BEHAT_CLI for this script (you cannot initialise PHPunit starting from
// the Behat environment), so in case user has set tne environment variable, disable it.
putenv('BEHAT_CLI=0');
require_once(__DIR__.'/../../../../lib/clilib.php');
require_once(__DIR__.'/../../../../lib/phpunit/bootstraplib.php');
require_once(__DIR__.'/../../../../lib/testing/lib.php');
+4
View File
@@ -30,6 +30,10 @@ if (isset($_SERVER['REMOTE_ADDR'])) {
define('IGNORE_COMPONENT_CACHE', true);
// It makes no sense to use BEHAT_CLI for this script (you cannot initialise PHPunit starting from
// the Behat environment), so in case user has set tne environment variable, disable it.
putenv('BEHAT_CLI=0');
require_once(__DIR__.'/../../../../lib/clilib.php');
require_once(__DIR__.'/../../../../lib/phpunit/bootstraplib.php');
require_once(__DIR__.'/../../../../lib/testing/lib.php');
+2
View File
@@ -590,6 +590,7 @@ class api {
'subdirs' => false,
'maxfiles' => -1,
'context' => context_system::instance(),
'noclean' => true,
];
}
@@ -606,6 +607,7 @@ class api {
'subdirs' => false,
'maxfiles' => -1,
'context' => context_system::instance(),
'noclean' => true,
];
}
+1 -1
View File
@@ -58,7 +58,7 @@ $agreedocs = array_values(array_unique($agreedocs));
$declinedocs = array_values(array_unique($declinedocs));
$PAGE->set_context(context_system::instance());
$PAGE->set_pagelayout('standard');
$PAGE->set_pagelayout('secure');
$PAGE->set_url('/admin/tool/policy/index.php');
$PAGE->set_popup_notification_allowed(false);
+5 -5
View File
@@ -42,7 +42,7 @@ $string['activate'] = 'Set status to "Active"';
$string['activating'] = 'Activating a policy';
$string['activateconfirm'] = '<p>You are about to activate policy <em>\'{$a->name}\'</em> and make the version <em>\'{$a->revision}\'</em> the current one.</p><p>All users will be required to agree to this new policy version to be able to use the site.</p>';
$string['activateconfirmyes'] = 'Activate';
$string['agreepolicies'] = 'Please agree to the following policies';
$string['agreepolicies'] = 'Please agree to the following policies:';
$string['backtoprevious'] = 'Go back to previous page';
$string['backtotop'] = 'Back to top';
$string['cachedef_policy_optional'] = 'Cache of the optional/compulsory flag for policy versions';
@@ -74,8 +74,8 @@ $string['filterplaceholder'] = 'Search keyword or select filter';
$string['filterpolicy'] = 'Policy: {$a}';
$string['guestconsent:continue'] = 'Continue';
$string['guestconsentmessage'] = 'If you continue browsing this website, you agree to our policies:';
$string['iagree'] = 'I agree to the {$a}';
$string['idontagree'] = 'No thanks, I decline {$a}';
$string['iagree'] = 'I agree to the {$a}.';
$string['idontagree'] = 'I don\'t agree to the {$a}.';
$string['iagreetothepolicy'] = 'Give consent';
$string['inactivate'] = 'Set status to "Inactive"';
$string['inactivating'] = 'Inactivating a policy';
@@ -94,9 +94,9 @@ $string['newpolicy'] = 'New policy';
$string['newversion'] = 'New version';
$string['noactivepolicies'] = 'There are no policies with an active version.';
$string['nofiltersapplied'] = 'No filters applied';
$string['nopermissiontoagreedocs'] = 'No permission to agree to the policies';
$string['nopermissiontoagreedocs'] = 'No permission to agree to the policies.';
$string['nopermissiontoagreedocs_desc'] = 'Sorry, you do not have the required permissions to agree to the policies.<br />You will not be able to use this site until the following policies are agreed:';
$string['nopermissiontoagreedocsbehalf'] = 'No permission to agree to the policies on behalf of this user';
$string['nopermissiontoagreedocsbehalf'] = 'No permission to agree to the policies on behalf of this user.';
$string['nopermissiontoagreedocsbehalf_desc'] = 'Sorry, you do not have the required permission to agree to the following policies on behalf of {$a}:';
$string['nopermissiontoagreedocscontact'] = 'For more help:';
$string['nopermissiontoviewpolicyversion'] = 'You do not have permissions to view this policy version.';
@@ -34,13 +34,13 @@ Feature: Viewing acceptances reports and accepting on behalf of other users
Then I should see "This site policy"
And I should not see "Course overview"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I press "Next"
And I should see "Calendar"
And I log out
And I log in as "manager"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I press "Next"
And I navigate to "Users > Privacy and policies > User agreements" in site administration
And "Accepted" "text" should exist in the "User One" "table_row"
@@ -53,7 +53,7 @@ Feature: Viewing acceptances reports and accepting on behalf of other users
| tool/policy:acceptbehalf | allow |
When I log in as "manager"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I press "Next"
And I navigate to "Users > Privacy and policies > Manage policies" in site administration
And I click on "1 of 4 (25%)" "link" in the "This site policy" "table_row"
@@ -76,7 +76,7 @@ Feature: Viewing acceptances reports and accepting on behalf of other users
| tool/policy:acceptbehalf | allow |
When I log in as "manager"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I press "Next"
And I should see "Calendar"
And I navigate to "Users > Privacy and policies > Manage policies" in site administration
@@ -104,16 +104,16 @@ Feature: Viewing acceptances reports and accepting on behalf of other users
And I press "Next"
And I should see "This privacy policy"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This privacy policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I set the field "I agree to the This privacy policy." to "1"
And I press "Next"
And I should see "Calendar"
And I log out
And I log in as "manager"
And I press "Next"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This privacy policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I set the field "I agree to the This privacy policy." to "1"
And I press "Next"
And I navigate to "Users > Privacy and policies > User agreements" in site administration
And "Accepted" "text" should exist in the "User One" "table_row"
@@ -142,8 +142,8 @@ Feature: Viewing acceptances reports and accepting on behalf of other users
When I log in as "manager"
And I press "Next"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This privacy policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I set the field "I agree to the This privacy policy." to "1"
And I press "Next"
And I navigate to "Users > Privacy and policies > User agreements" in site administration
And I click on "Accept This site policy" "link" in the "User One" "table_row"
@@ -176,8 +176,8 @@ Feature: Viewing acceptances reports and accepting on behalf of other users
When I log in as "manager"
And I press "Next"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This privacy policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I set the field "I agree to the This privacy policy." to "1"
And I press "Next"
And I navigate to "Users > Privacy and policies > User agreements" in site administration
And I click on "Accept This site policy" "link" in the "User One" "table_row"
@@ -198,7 +198,7 @@ Feature: Viewing acceptances reports and accepting on behalf of other users
Scenario: Policies and agreements profile link visible for current user
Given I log in as "user1"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I press "Next"
When I follow "Profile" in the user menu
# User can see his own agreements link in the profile.
@@ -217,7 +217,7 @@ Feature: Viewing acceptances reports and accepting on behalf of other users
| tool/policy:acceptbehalf | allow |
And I log in as "manager"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I press "Next"
# User can see agreements link in other user profiles because has the capability for accepting on behalf of them.
When I am on "Course1" course homepage
@@ -231,7 +231,7 @@ Feature: Viewing acceptances reports and accepting on behalf of other users
| tool/policy:acceptbehalf | allow |
When I log in as "manager"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I press "Next"
And I log out
And I am on the "manager" "user > profile" page logged in as "admin"
@@ -267,8 +267,8 @@ Feature: Viewing acceptances reports and accepting on behalf of other users
When I log in as "manager"
And I press "Next"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This privacy policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I set the field "I agree to the This privacy policy." to "1"
And I press "Next"
And I navigate to "Users > Privacy and policies > User agreements" in site administration
And I click on "Select" "checkbox" in the "User One" "table_row"
@@ -290,7 +290,7 @@ Feature: Viewing acceptances reports and accepting on behalf of other users
And I should see "This site policy"
And I should not see "Course overview"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I press "Next"
And I should see "Calendar"
And I log out
@@ -304,3 +304,14 @@ Feature: Viewing acceptances reports and accepting on behalf of other users
And I log out
When I log in as "user1"
Then I should see "Calendar"
Scenario: Policy acceptance is prioritised when MFA is enabled
Given the following config values are set as admin:
| enabled | 1 | tool_mfa |
And the following config values are set as admin:
| enabled | 1 | factor_email |
And I log in as "user1"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
When I press "Next"
Then I should see "2-step verification"
+93 -96
View File
@@ -4,7 +4,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
As a user
I need to be able to accept site policy during sign up
Scenario: Accept policy on sign up, no site policy
Scenario: Accept policy on sign up manage by plugin, no site policy
Given the following config values are set as admin:
| registerauth | email |
| passwordpolicy | 0 |
@@ -16,13 +16,13 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I set the following fields to these values:
| Username | user1 |
| Password | user1 |
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| Email address | user1@example.com |
| Email (again) | user1@example.com |
| First name | User1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
And I should see "An email should have been sent to your address at user1@example.com"
And I confirm email for "user1"
And I should see "Thanks, User1 L1"
And I should see "Your registration has been confirmed"
@@ -50,13 +50,13 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I set the following fields to these values:
| Username | user1 |
| Password | user1 |
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| Email address | user1@example.com |
| Email (again) | user1@example.com |
| First name | User1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
And I should see "An email should have been sent to your address at user1@example.com"
And I confirm email for "user1"
And I should see "Thanks, User1 L1"
And I should see "Your registration has been confirmed"
@@ -85,23 +85,23 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I should see "short text2"
And I should see "full text2"
And I press "Next"
And I should see "Please agree to the following policies"
And I should see "Please agree to the following policies:"
And I should see "This site policy" in the "region-main" "region"
And I should see "short text2"
And I should not see "full text2"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I press "Next"
And I should not see "I understand and agree"
And I set the following fields to these values:
| Username | user1 |
| Password | user1 |
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| Email address | user1@example.com |
| Email (again) | user1@example.com |
| First name | User1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
And I should see "An email should have been sent to your address at user1@example.com"
And I confirm email for "user1"
And I should see "Thanks, User1 L1"
And I should see "Your registration has been confirmed"
@@ -137,7 +137,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I should see "short text3"
And I should see "full text3"
And I press "Next"
And I should see "Please agree to the following policies"
And I should see "Please agree to the following policies:"
And I should see "This site policy" in the "region-main" "region"
And I should see "short text2"
And I should not see "full text2"
@@ -147,20 +147,20 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I should not see "This guests policy" in the "region-main" "region"
And I should not see "short text4"
And I should not see "full text4"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This privacy policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I set the field "I agree to the This privacy policy." to "1"
And I press "Next"
And I should not see "I understand and agree"
And I set the following fields to these values:
| Username | user1 |
| Password | user1 |
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| Email address | user1@example.com |
| Email (again) | user1@example.com |
| First name | User1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
And I should see "An email should have been sent to your address at user1@example.com"
And I confirm email for "user1"
And I should see "Thanks, User1 L1"
And I should see "Your registration has been confirmed"
@@ -197,23 +197,23 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I should see "short text2"
And I should see "full text2"
And I press "Next"
And I should see "Please agree to the following policies"
And I should see "Please agree to the following policies:"
And I should see "This site policy"
And I should see "short text2"
And I should not see "full text2"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I press "Next"
And I should not see "I understand and agree"
And I set the following fields to these values:
| Username | user1 |
| Password | user1 |
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| Email address | user1@example.com |
| Email (again) | user1@example.com |
| First name | User1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
And I should see "An email should have been sent to your address at user1@example.com"
And I confirm email for "user1"
And I should see "Thanks, User1 L1"
And I should see "Your registration has been confirmed"
@@ -244,19 +244,19 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I press "Next"
And I should see "This privacy policy"
And I press "Next"
And I should see "Please agree to the following policies"
And I should see "Please agree to the following policies:"
And I should see "This site policy"
And I should see "This privacy policy"
# Confirm that a notification is displayed if none of the policies are accepted.
When I set the field "I agree to the This site policy" to "0"
And I set the field "I agree to the This privacy policy" to "0"
When I set the field "I agree to the This site policy." to "0"
And I set the field "I agree to the This privacy policy." to "0"
And I press "Next"
Then I should see "Please agree to the following policies"
Then I should see "Please agree to the following policies:"
And I should see "Before continuing you need to acknowledge all these policies."
# Confirm that a notification is displayed if only some policies are accepted.
When I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This privacy policy" to "0"
Then I should see "Please agree to the following policies"
When I set the field "I agree to the This site policy." to "1"
And I set the field "I agree to the This privacy policy." to "0"
Then I should see "Please agree to the following policies:"
And I should see "Before continuing you need to acknowledge all these policies."
Scenario: Accept policy on login, do not accept all policies
@@ -276,23 +276,20 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I press "Next"
And I should see "This privacy policy"
And I press "Next"
And I should see "Please agree to the following policies"
And I should see "Please agree to the following policies:"
And I should see "This site policy"
And I should see "This privacy policy"
# Confirm that a notification is displayed if none of the policies are accepted.
When I set the field "I agree to the This site policy" to "0"
And I set the field "I agree to the This privacy policy" to "0"
When I set the field "I agree to the This site policy." to "0"
And I set the field "I agree to the This privacy policy." to "0"
And I press "Next"
Then I should see "Please agree to the following policies"
Then I should see "Please agree to the following policies:"
And I should see "Before continuing you need to acknowledge all these policies."
# Confirm that a notification is displayed if only some policies are accepted.
When I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This privacy policy" to "0"
Then I should see "Please agree to the following policies"
When I set the field "I agree to the This site policy." to "1"
And I set the field "I agree to the This privacy policy." to "0"
Then I should see "Please agree to the following policies:"
And I should see "Before continuing you need to acknowledge all these policies."
# Confirm that user can not browse the site (edit their profile).
When I follow "Profile" in the user menu
Then I should see "Please agree to the following policies"
Scenario: Accept policy on login, accept all policies
Given the following config values are set as admin:
@@ -311,14 +308,14 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I press "Next"
And I should see "This privacy policy"
And I press "Next"
And I should see "Please agree to the following policies"
And I should see "Please agree to the following policies:"
And I should see "This site policy"
And I should see "This privacy policy"
# User accepts all policies.
When I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This privacy policy" to "1"
When I set the field "I agree to the This site policy." to "1"
And I set the field "I agree to the This privacy policy." to "1"
And I press "Next"
Then I should not see "Please agree to the following policies"
Then I should not see "Please agree to the following policies:"
And I should not see "Before continuing you need to acknowledge all these policies."
# Confirm that user can login and browse the site (edit their profile).
When I open my profile in edit mode
@@ -328,7 +325,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
When I log in as "user1"
Then I should not see "This site policy"
And I should not see "This privacy policy"
And I should not see "Please agree to the following policies"
And I should not see "Please agree to the following policies:"
# Confirm that user can login and browse the site (edit their profile).
When I open my profile in edit mode
Then the field "First name" matches value "User"
@@ -350,14 +347,14 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I press "Next"
And I should see "This privacy policy"
And I press "Next"
And I should see "Please agree to the following policies"
And I should see "Please agree to the following policies:"
And I should see "This site policy"
And I should see "This privacy policy"
# User accepts all policies.
When I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This privacy policy" to "1"
When I set the field "I agree to the This site policy." to "1"
And I set the field "I agree to the This privacy policy." to "1"
And I press "Next"
Then I should not see "Please agree to the following policies"
Then I should not see "Please agree to the following policies:"
# Confirm that user can login and browse the site (edit their profile).
When I open my profile in edit mode
Then the field "First name" matches value "User"
@@ -385,7 +382,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I should not see "This privacy policy"
Then I should see "This third parties policy"
And I press "Next"
And I should see "Please agree to the following policies"
And I should see "Please agree to the following policies:"
And I should see "This third parties policy"
And I set the field "This third parties policy" to "1"
And I press "Next"
@@ -407,12 +404,12 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I log in as "user1"
And I should see "This site policy"
And I press "Next"
And I should see "Please agree to the following policies"
And I should see "Please agree to the following policies:"
And I should see "This site policy"
# User accepts policy.
When I set the field "I agree to the This site policy" to "1"
When I set the field "I agree to the This site policy." to "1"
And I press "Next"
Then I should not see "Please agree to the following policies"
Then I should not see "Please agree to the following policies:"
# Confirm that user can login and browse the site (edit their profile).
When I open my profile in edit mode
Then the field "First name" matches value "User"
@@ -437,13 +434,13 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I should see "short text2 new version"
And I should see "full text2 new version"
When I press "Next"
Then I should see "Please agree to the following policies"
Then I should see "Please agree to the following policies:"
And I should see "This site policy new version"
And I should see "short text2 new version"
# User accepts policy.
And I set the field "I agree to the This site policy new version" to "1"
And I set the field "I agree to the This site policy new version." to "1"
When I press "Next"
Then I should not see "Please agree to the following policies"
Then I should not see "Please agree to the following policies:"
# Confirm that user can login and browse the site (edit their profile).
When I open my profile in edit mode
Then the field "First name" matches value "User"
@@ -504,28 +501,28 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I should see "short text3"
And I should see "full text3"
When I press "Next"
Then I should see "Please agree to the following policies"
Then I should see "Please agree to the following policies:"
And I should see "This site policy" in the "region-main" "region"
And I should see "short text2"
And I should see "This privacy policy" in the "region-main" "region"
And I should see "short text3"
And I should not see "This guests policy" in the "region-main" "region"
And I should not see "short text4"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This privacy policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I set the field "I agree to the This privacy policy." to "1"
When I press "Next"
Then I should not see "I understand and agree"
And I should see "New account"
And I set the following fields to these values:
| Username | user1 |
| Password | user1 |
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| Email address | user1@example.com |
| Email (again) | user1@example.com |
| First name | User1 |
| Last name | L1 |
When I press "Create my new account"
Then I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
And I should see "An email should have been sent to your address at user1@example.com"
And I follow "Log in"
When I click on "Create new account" "link"
# Confirm that the user can view and accept policies when attempting to create another account.
@@ -537,7 +534,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I should see "short text3"
And I should see "full text3"
When I press "Next"
Then I should see "Please agree to the following policies"
Then I should see "Please agree to the following policies:"
And I should see "This site policy" in the "region-main" "region"
And I should see "short text2"
And I should not see "full text2"
@@ -547,8 +544,8 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I should not see "This guests policy" in the "region-main" "region"
And I should not see "short text4"
And I should not see "full text4"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This privacy policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I set the field "I agree to the This privacy policy." to "1"
When I press "Next"
Then I should not see "I understand and agree"
And I should see "New account"
@@ -572,8 +569,8 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I should see "Please read our This privacy policy"
And I press "Next"
And I should see "Viewing this page on behalf of User 1"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This privacy policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I set the field "I agree to the This privacy policy." to "1"
And I press "Next"
And I log out
And I log in as "user1"
@@ -599,15 +596,15 @@ Feature: User must accept policy managed by this plugin when logging in and sign
When I log in as "manager"
And I press "Next"
And I press "Next"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This privacy policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I set the field "I agree to the This privacy policy." to "1"
And I press "Next"
And I am on the "user1" "user > profile" page
And I follow "Log in as"
Then I should see "You are logged in as User 1"
And I press "Continue"
And I should see "Policies and agreements"
And I should see "No permission to agree to the policies on behalf of this user"
And I should see "No permission to agree to the policies on behalf of this user."
And I should see "Sorry, you do not have the required permission to agree to the following policies on behalf of User 1"
Scenario: Accept policy on sign up as a guest, one policy
@@ -631,23 +628,23 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I should see "short text2"
And I should see "full text2"
And I press "Next"
And I should see "Please agree to the following policies"
And I should see "Please agree to the following policies:"
And I should see "This site policy"
And I should see "short text2"
And I should not see "full text2"
And I set the field "I agree to the This site policy" to "1"
And I set the field "I agree to the This site policy." to "1"
And I press "Next"
And I should not see "I understand and agree"
And I set the following fields to these values:
| Username | user1 |
| Password | user1 |
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| Email address | user1@example.com |
| Email (again) | user1@example.com |
| First name | User1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
And I should see "An email should have been sent to your address at user1@example.com"
And I confirm email for "user1"
And I should see "Thanks, User1 L1"
And I should see "Your registration has been confirmed"
@@ -680,12 +677,12 @@ Feature: User must accept policy managed by this plugin when logging in and sign
Then I should see "Digital maturity declaration" in the "region-main" "region"
And I should see "You declare be old enough"
And I should see "Here goes content."
And I press "I agree to the Digital maturity declaration"
And I press "I agree to the Digital maturity declaration."
# The second policy with the agreement style "on its own page" must be accepted now.
And I should see "Terms of Service" in the "region-main" "region"
And I should see "We teach, you learn"
And I should see "Here goes content."
And I press "I agree to the Terms of Service"
And I press "I agree to the Terms of Service."
# Only now we see the remaining consent page policies.
And I should see "Policy 1 out of 2"
And I should see "Privacy policy" in the "region-main" "region"
@@ -697,26 +694,26 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I should see "We eat cookies, srsly"
And I should see "Here goes content."
And I press "Next"
And I should see "Please agree to the following policies"
And I should see "Please agree to the following policies:"
And I should see "Privacy policy"
And I should see "Cookies policy"
And I should not see "Digital maturity declaration" in the "region-main" "region"
And I should not see "Terms of Service" in the "region-main" "region"
And I should not see "Here goes content."
And I set the field "I agree to the Privacy policy" to "1"
And I set the field "I agree to the Cookies policy" to "1"
And I set the field "I agree to the Privacy policy." to "1"
And I set the field "I agree to the Cookies policy." to "1"
And I press "Next"
And I should see "New account"
And I set the following fields to these values:
| Username | user1 |
| Password | user1 |
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| Email address | user1@example.com |
| Email (again) | user1@example.com |
| First name | User1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
And I should see "An email should have been sent to your address at user1@example.com"
And I confirm email for "user1"
And I should see "Thanks, User1 L1"
And I should see "Your registration has been confirmed"
@@ -751,7 +748,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
Then I should see "Digital maturity declaration" in the "region-main" "region"
And I should see "You declare be old enough"
And I should see "Here goes content."
And I press "I agree to the Digital maturity declaration"
And I press "I agree to the Digital maturity declaration."
# The second policy with the agreement style "on its own page" must be accepted now.
And I should see "Terms of Service" in the "region-main" "region"
And I should see "We teach, you learn"
@@ -762,7 +759,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I should see "Terms of Service" in the "region-main" "region"
And I should see "We teach, you learn"
And I should see "Here goes content."
And I press "I agree to the Terms of Service"
And I press "I agree to the Terms of Service."
# Only now we see the remaining consent page policies.
And I should see "Policy 1 out of 2"
And I should see "Privacy policy" in the "region-main" "region"
@@ -774,14 +771,14 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I should see "We eat cookies, srsly"
And I should see "Here goes content."
And I press "Next"
And I should see "Please agree to the following policies"
And I should see "Please agree to the following policies:"
And I should see "Privacy policy"
And I should see "Cookies policy"
And I should not see "Digital maturity declaration" in the "region-main" "region"
And I should not see "Terms of Service" in the "region-main" "region"
And I should not see "Here goes content."
And I set the field "I agree to the Privacy policy" to "1"
And I set the field "I agree to the Cookies policy" to "1"
And I set the field "I agree to the Privacy policy." to "1"
And I set the field "I agree to the Cookies policy." to "1"
And I press "Next"
And I follow "Profile" in the user menu
# User can see his own agreements in the profile.
@@ -809,15 +806,15 @@ Feature: User must accept policy managed by this plugin when logging in and sign
Then I should see "Privacy policy" in the "region-main" "region"
And I should see "We scan your thoughts"
And I should see "Here goes content."
And I press "I agree to the Privacy policy"
And I press "I agree to the Privacy policy."
And I should see "Digital maturity declaration" in the "region-main" "region"
And I should see "You declare be old enough"
And I should see "Here goes content."
And I press "I agree to the Digital maturity declaration"
And I press "I agree to the Digital maturity declaration."
And I should see "Terms of Service" in the "region-main" "region"
And I should see "We teach, you learn"
And I should see "Here goes content."
And I press "I agree to the Terms of Service"
And I press "I agree to the Terms of Service."
And I follow "Profile" in the user menu
And I follow "Policies and agreements"
And "Accepted" "text" should exist in the "Privacy policy" "table_row"
@@ -844,21 +841,21 @@ Feature: User must accept policy managed by this plugin when logging in and sign
Then I should see "Digital maturity declaration" in the "region-main" "region"
And I should see "You declare be old enough"
And I should see "Here goes content."
And I press "I agree to the Digital maturity declaration"
And I press "I agree to the Digital maturity declaration."
And I should see "Cookies policy" in the "region-main" "region"
And I should see "We eat cookies, srsly"
And I press "I agree to the Cookies policy"
And I press "I agree to the Cookies policy."
And I should see "New account"
And I set the following fields to these values:
| Username | user1 |
| Password | user1 |
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| Email address | user1@example.com |
| Email (again) | user1@example.com |
| First name | User1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
And I should see "An email should have been sent to your address at user1@example.com"
And I confirm email for "user1"
And I should see "Thanks, User1 L1"
And I should see "Your registration has been confirmed"
@@ -61,7 +61,7 @@ Feature: Manage policies
| Policy1 | v1 | full text2 | short text2 | active |
And I log in as "manager"
And I press "Next"
And I set the field "I agree to the Policy1" to "1"
And I set the field "I agree to the Policy1." to "1"
And I press "Next"
And I navigate to "Users > Privacy and policies > Manage policies" in site administration
And I click on "Edit" "link" in the "Policy1" "table_row"
@@ -83,7 +83,7 @@ Feature: Manage policies
| Policy1 | v1 | full text2 | short text2 | active |
And I log in as "manager"
And I press "Next"
And I set the field "I agree to the Policy1" to "1"
And I set the field "I agree to the Policy1." to "1"
And I press "Next"
And I navigate to "Users > Privacy and policies > Manage policies" in site administration
And I click on "Edit" "link" in the "Policy1" "table_row"
@@ -101,7 +101,7 @@ Feature: Manage policies
| Policy1 | v1 | full text2 | short text2 | active |
And I log in as "manager"
And I press "Next"
And I set the field "I agree to the Policy1" to "1"
And I set the field "I agree to the Policy1." to "1"
And I press "Next"
And I navigate to "Users > Privacy and policies > Manage policies" in site administration
And I click on "Edit" "link" in the "Policy1" "table_row"
@@ -180,7 +180,7 @@ Feature: Manage policies
| Policy1 | v1 | full text2 | short text2 | active |
And I log in as "manager"
And I press "Next"
And I set the field "I agree to the Policy1" to "1"
And I set the field "I agree to the Policy1." to "1"
And I press "Next"
And I navigate to "Users > Privacy and policies > Manage policies" in site administration
And I click on "Set status to \"Inactive\"" "link" in the "Policy1" "table_row"
@@ -218,7 +218,7 @@ Feature: Manage policies
| Policy1 | v1 | full text2 | short text2 | active |
And I log in as "manager"
And I press "Next"
And I set the field "I agree to the Policy1" to "1"
And I set the field "I agree to the Policy1." to "1"
And I press "Next"
And I navigate to "Users > Privacy and policies > Manage policies" in site administration
And I click on "Set status to \"Inactive\"" "link" in the "Policy1" "table_row"
@@ -247,7 +247,7 @@ Feature: Manage policies
| Policy1 | v1 | full text2 | short text2 | active |
And I log in as "user1"
And I press "Next"
And I set the field "I agree to the Policy1" to "1"
And I set the field "I agree to the Policy1." to "1"
And I press "Next"
And I follow "Preferences" in the user menu
And I should see "Preferences"
+21 -21
View File
@@ -70,26 +70,26 @@ Feature: Optional policies
And I should see "OwnPageCompulsory1" in the "region-main" "region"
And I should see "short text4" in the "region-main" "region"
And I should see "full text4" in the "region-main" "region"
And I press "I agree to the OwnPageCompulsory1"
And I press "I agree to the OwnPageCompulsory1."
# Compulsory policies displayed on the consent page are shown next and must be agreed.
And I should see "ConsentPageCompulsory1"
And I should see "short text3" in the "region-main" "region"
And I should see "full text3" in the "region-main" "region"
And I press "Next"
And I should see "Please agree to the following policies"
And I set the field "I agree to the ConsentPageCompulsory1" to "1"
And I should see "Please agree to the following policies:"
And I set the field "I agree to the ConsentPageCompulsory1." to "1"
And I press "Next"
# The signup form can be submitted and a new account created.
And I set the following fields to these values:
| Username | user3 |
| Password | user3 |
| Email address | user3@address.invalid |
| Email (again) | user3@address.invalid |
| Email address | user3@example.com |
| Email (again) | user3@example.com |
| First name | User3 |
| Last name | L3 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user3@address.invalid"
And I should see "An email should have been sent to your address at user3@example.com"
And I confirm email for "user3"
And I should see "Thanks, User3 L3"
And I should see "Your registration has been confirmed"
@@ -99,7 +99,7 @@ Feature: Optional policies
Then I should see "OwnPageOptional1"
And I should see "short text5" in the "region-main" "region"
And I should see "full text5" in the "region-main" "region"
And I press "No thanks, I decline OwnPageOptional1"
And I press "I don't agree to the OwnPageOptional1"
# Then come policies displayed on the consent page.
And I should see "ConsentPageOptional1" in the "region-main" "region"
And I should see "short text1" in the "region-main" "region"
@@ -109,9 +109,9 @@ Feature: Optional policies
And I should see "short text2" in the "region-main" "region"
And I should see "full text2" in the "region-main" "region"
And I press "Next"
And I should see "Please agree to the following policies"
And I set the field "I agree to the ConsentPageOptional1" to "1"
And I set the field "No thanks, I decline ConsentPageOptional2" to "0"
And I should see "Please agree to the following policies:"
And I set the field "I agree to the ConsentPageOptional1." to "1"
And I set the field "I don't agree to the ConsentPageOptional2" to "0"
And I press "Next"
# Accepted and declined policies are shown in the profile.
And I follow "Profile" in the user menu
@@ -132,14 +132,14 @@ Feature: Optional policies
Then I should see "OwnPageOptional1"
And I should see "short text5" in the "region-main" "region"
And I should see "full text5" in the "region-main" "region"
And I press "I agree to the OwnPageOptional1"
And I press "I agree to the OwnPageOptional1."
# Then come policies displayed on the consent page.
And I should see "ConsentPageOptional1" in the "region-main" "region"
And I should see "short text1" in the "region-main" "region"
And I should see "full text1" in the "region-main" "region"
And I press "Next"
And I should see "Please agree to the following policies"
And I set the field "No thanks, I decline ConsentPageOptional1" to "0"
And I should see "Please agree to the following policies:"
And I set the field "I don't agree to the ConsentPageOptional1" to "0"
And I press "Next"
# Accepted and declined policies are shown in the profile.
And I follow "Profile" in the user menu
@@ -152,7 +152,7 @@ Feature: Optional policies
| Name | Content | Summary | Agreementstyle | Optional |
| OwnPageOptional1 | full text1 | short text1 | 1 | 1 |
And I log in as "user1"
And I press "I agree to the OwnPageOptional1"
And I press "I agree to the OwnPageOptional1."
And I follow "Profile" in the user menu
And I follow "Policies and agreements"
And "Accepted" "text" should exist in the "OwnPageOptional1" "table_row"
@@ -177,7 +177,7 @@ Feature: Optional policies
| Name | Content | Summary | Agreementstyle | Optional |
| OwnPageOptional1 | full text1 | short text1 | 1 | 1 |
And I log in as "user1"
And I press "I agree to the OwnPageOptional1"
And I press "I agree to the OwnPageOptional1."
And I follow "Profile" in the user menu
And I follow "Policies and agreements"
And "Accepted" "text" should exist in the "OwnPageOptional1" "table_row"
@@ -202,12 +202,12 @@ Feature: Optional policies
| OwnPageOptional1 | full text1 | short text1 | 1 | 1 |
| OwnPageOptional2 | full text2 | short text2 | 1 | 1 |
And I log in as "user1"
And I press "I agree to the OwnPageOptional1"
And I press "No thanks, I decline OwnPageOptional2"
And I press "I agree to the OwnPageOptional1."
And I press "I don't agree to the OwnPageOptional2"
And I log out
And I log in as "manager"
And I press "I agree to the OwnPageOptional1"
And I press "I agree to the OwnPageOptional2"
And I press "I agree to the OwnPageOptional1."
And I press "I agree to the OwnPageOptional2."
When I navigate to "Users > Privacy and policies > User agreements" in site administration
# User One has accepted just some policies.
Then "Partially accepted" "text" should exist in the "User One" "table_row"
@@ -228,8 +228,8 @@ Feature: Optional policies
| OwnPageOptional1 | full text1 | short text1 | 1 | 1 |
| OwnPageOptional2 | full text2 | short text2 | 1 | 1 |
And I log in as "user1"
And I press "I agree to the OwnPageOptional1"
And I press "No thanks, I decline OwnPageOptional2"
And I press "I agree to the OwnPageOptional1."
And I press "I don't agree to the OwnPageOptional2"
And I log out
And I log in as "admin"
When I navigate to "Users > Privacy and policies > User agreements" in site administration
+1 -1
View File
@@ -47,7 +47,7 @@ $numpolicy = optional_param('numpolicy', null, PARAM_INT);
$totalpolicies = optional_param('totalpolicies', null, PARAM_INT);
$PAGE->set_context(context_system::instance());
$PAGE->set_pagelayout('standard');
$PAGE->set_pagelayout('secure');
$viewpage = new page_viewdoc($policyid, $versionid, $returnurl, $behalfid, $manage, $numpolicy, $totalpolicies);
+3 -3
View File
@@ -52,9 +52,9 @@ if ($listurl) {
}
// Add a new nav item to make $listurl clickable for the Boost theme.
if (isset($script)) {
$lastrunnav = get_string('lastrun', 'tool_profiling');
$PAGE->navbar->add($lastrunnav);
if (isset($script) || isset($runid)) {
$detailnav = get_string('detailview', 'tool_profiling');
$PAGE->navbar->add($detailnav);
}
// Header
@@ -31,6 +31,7 @@ $string['cannotfindanyrunforurl'] = 'Sorry, cannot find any profiling run for th
$string['cannotfindanyrunforrunid'] = 'Sorry, cannot find the \'{$a}\' profiling run';
$string['comment'] = 'Comment';
$string['cputime'] = 'CPU time';
$string['detailview'] = 'Summary of run';
$string['differencesbetween2runsof'] = 'Differences between 2 runs of {$a}';
$string['executiontime'] = 'Execution time';
$string['export'] = 'Export';
+1 -1
View File
@@ -254,7 +254,7 @@ class course_bin extends base_bin {
// This hack will be removed once recycle bin switches to use its own backup mode, with
// own preferences and 100% separate from MOODLE_AUTOMATED.
// TODO: Remove this as part of MDL-65228.
$forcedrestoresettings = $CFG->forced_plugin_settings['restore'] ?? null;
$forcedrestoresettings = $CFG->forced_plugin_settings['restore'] ?? [];
$CFG->forced_plugin_settings['restore']['restore_general_users'] = 1;
$CFG->forced_plugin_settings['restore']['restore_general_groups'] = 1;
+1 -1
View File
@@ -274,7 +274,7 @@ class tool_task_renderer extends plugin_renderer_base {
$nextruntime = $task->get_next_run_time();
$due = $nextruntime < $now;
if ($task->get_attempts_available() > 0) {
$nextrun = $due ? userdate($nextruntime) : get_string('asap', 'tool_task');
$nextrun = $due ? get_string('asap', 'tool_task') : userdate($nextruntime);
} else {
$nextrun = get_string('never', 'admin');
}
@@ -0,0 +1,23 @@
@tool @tool_task @javascript
Feature: Manage adhoc task
In order to manage adhoc tasks
As an admin
I need to be able to view adhoc tasks
Scenario Outline: View adhoc tasks next run time
Given the following "tool_task > adhoc tasks" exist:
| classname | seconds | hostname | pid | nextruntime |
| \core\task\asynchronous_backup_task | 0 | c69335460f7f | 1915 | <nextruntime> |
When I log in as "admin"
And I navigate to "Server > Tasks > Ad hoc tasks" in site administration
Then the following should exist in the "Ad hoc tasks" table:
| Component / Class name | Next run |
| asynchronous_backup_task | <nextruntimestr> |
And I click on "asynchronous_backup_task" "link" in the "Ad hoc tasks" "table"
And the following should exist in the "\core\task\asynchronous_backup_task Ad hoc tasks" table:
| Next run |
| <nextruntimestr> |
Examples:
| nextruntime | nextruntimestr |
| ##yesterday## | ASAP |
| ##tomorrow noon## | ##tomorrow noon##%A, %d %B %Y, %I:%M## |
+3 -3
View File
@@ -43,7 +43,7 @@ class tool_task_generator extends testing_module_generator {
global $DB;
$conditions = ['classname' => $data['classname']];
$record = $DB->get_record('task_scheduled', $conditions, '*', MUST_EXIST);
$record->timestarted = time() - $data['seconds'];
$record->timestarted = $data['seconds'] > 0 ? time() - $data['seconds'] : 0;
$record->hostname = $data['hostname'];
$record->pid = $data['pid'];
$DB->update_record('task_scheduled', $record);
@@ -59,8 +59,8 @@ class tool_task_generator extends testing_module_generator {
global $DB;
$adhoctask = (object)[
'classname' => $data['classname'],
'nextruntime' => 0,
'timestarted' => time() - $data['seconds'],
'nextruntime' => $data['nextruntime'] ?? 0,
'timestarted' => $data['seconds'] > 0 ? time() - $data['seconds'] : 0,
'hostname' => $data['hostname'],
'pid' => $data['pid'],
];
+1 -1
View File
@@ -1146,7 +1146,7 @@ class tool_uploadcourse_course {
// Now update values.
// Sort out plugin specific fields.
$modifiedinstance = $plugin->update_enrol_plugin_data($course->id, $method, $instance);
$modifiedinstance = $plugin->update_enrol_plugin_data($course->id, $method, clone $instance);
$plugin->update_instance($instance, $modifiedinstance);
} else {
foreach ($errors as $key => $message) {
+1 -6
View File
@@ -177,12 +177,7 @@ class tool_uploadcourse_helper {
* @return enrol_plugin[]
*/
public static function get_enrolment_plugins() {
$cache = cache::make('tool_uploadcourse', 'helper');
if (($enrol = $cache->get('enrol')) === false) {
$enrol = enrol_get_plugins(false);
$cache->set('enrol', $enrol);
}
return $enrol;
return enrol_get_plugins(false);
}
/**
@@ -126,3 +126,19 @@ Feature: An admin can create courses with cohort enrolments using a CSV file
And I press "Cancel"
And I click on "Edit" "link" in the "Cohort 4" "table_row"
And the field "Assign role" matches value "Non-editing teacher"
@javascript
Scenario: Uploading a cohort enrolment method with a non-default role applies only the specified role
Given the following "users" exist:
| username | firstname | lastname | email |
| t1 | Teacher | 1 | s1@example.com |
And the following "cohort members" exist:
| user | cohort |
| t1 | CV4 |
And I upload "admin/tool/uploadcourse/tests/fixtures/enrolment_cohort_multiple.csv" file to "File" filemanager
And I click on "Preview" "button"
And I click on "Upload courses" "button"
When I am on the "Course 1" "course" page
And I navigate to course participants
Then I should see "Non-editing teacher" in the "Teacher 1" "table_row"
And I should not see "Student" in the "Teacher 1" "table_row"
@@ -25,7 +25,7 @@ Feature: An admin can update courses enrolments using a CSV file
When I click on "Upload courses" "button"
Then I should see "Course updated"
And I am on the "Course 1" "enrolment methods" page
And "Disable" "icon" should exist in the "Guest access" "table_row"
And "Disable" "link" should exist in the "Guest access" "table_row"
@javascript
Scenario: Creating enrolment method by disabling it
@@ -42,7 +42,7 @@ Feature: An admin can update courses enrolments using a CSV file
When I click on "Upload courses" "button"
Then I should see "Course updated"
And I am on the "Course 1" "enrolment methods" page
And "Enable" "icon" should exist in the "Guest access" "table_row"
And "Enable" "link" should exist in the "Guest access" "table_row"
@javascript
Scenario: Enabling enrolment method
@@ -55,13 +55,13 @@ Feature: An admin can update courses enrolments using a CSV file
When I click on "Upload courses" "button"
Then I should see "Course updated"
And I am on the "Course 1" "enrolment methods" page
And "Disable" "icon" should exist in the "Guest access" "table_row"
And "Disable" "link" should exist in the "Guest access" "table_row"
@javascript
Scenario: Disable an enrolment method
Given I am on the "Course 1" "enrolment methods" page
And I click on "Enable" "link" in the "Guest access" "table_row"
And "Disable" "icon" should exist in the "Guest access" "table_row"
And "Disable" "link" should exist in the "Guest access" "table_row"
And I navigate to "Courses > Upload courses" in site administration
And I upload "admin/tool/uploadcourse/tests/fixtures/enrolment_disable.csv" file to "File" filemanager
And I set the field "Upload mode" to "Only update existing courses"
@@ -71,7 +71,7 @@ Feature: An admin can update courses enrolments using a CSV file
When I click on "Upload courses" "button"
Then I should see "Course updated"
And I am on the "Course 1" "enrolment methods" page
And "Enable" "icon" should exist in the "Guest access" "table_row"
And "Enable" "link" should exist in the "Guest access" "table_row"
@javascript
Scenario: Delete an enrolment method
+6 -6
View File
@@ -910,8 +910,8 @@ class process {
}
if ($this->get_bulk() == UU_BULK_UPDATED or $this->get_bulk() == UU_BULK_ALL) {
if (!in_array($user->id, $SESSION->bulk_users)) {
$SESSION->bulk_users[] = $user->id;
if (!array_key_exists($user->id, $SESSION->bulk_users)) {
$SESSION->bulk_users[$user->id] = $user->id;
}
}
@@ -924,8 +924,8 @@ class process {
$this->usersuptodate++;
if ($this->get_bulk() == UU_BULK_ALL) {
if (!in_array($user->id, $SESSION->bulk_users)) {
$SESSION->bulk_users[] = $user->id;
if (!array_key_exists($user->id, $SESSION->bulk_users)) {
$SESSION->bulk_users[$user->id] = $user->id;
}
}
}
@@ -1059,8 +1059,8 @@ class process {
\context_user::instance($user->id);
if ($this->get_bulk() == UU_BULK_NEW or $this->get_bulk() == UU_BULK_ALL) {
if (!in_array($user->id, $SESSION->bulk_users)) {
$SESSION->bulk_users[] = $user->id;
if (!array_key_exists($user->id, $SESSION->bulk_users)) {
$SESSION->bulk_users[$user->id] = $user->id;
}
}
}
@@ -0,0 +1,41 @@
@tool @tool_uploaduser @_file_upload
Feature: Admin can suspend user course enrolment via CSV upload
In order to manage enrolments in bulk
As an administrator
I need to be able to enrol and suspend users using CSV upload
Background:
Given the following "courses" exist:
| fullname | shortname |
| Course 1 | C1 |
| Course 2 | C2 |
| Course 3 | C3 |
@javascript
Scenario: Admin uploads enrol and suspend CSVs and verifies enrolment status
Given I log in as "admin"
And I navigate to "Users > Accounts > Upload users" in site administration
When I upload "lib/tests/fixtures/QA_user_enrol.txt" file to "File" filemanager
And I press "Upload users"
And I press "Upload users"
And I press "Continue"
And I upload "lib/tests/fixtures/QA_user_suspend.txt" file to "File" filemanager
And I press "Upload users"
And I set the field "Upload type" to "Update existing users only"
And I press "Upload users"
And I press "Continue"
And I am on the "Course 1" "enrolled users" page
Then the following should exist in the "participants" table:
| First name | Status |
| Learner One | Active |
| Learner Two | Active |
And I am on the "Course 2" "enrolled users" page
And the following should exist in the "participants" table:
| First name | Status |
| Learner One | Active |
| Learner Two | Suspended |
And I am on the "Course 3" "enrolled users" page
And the following should exist in the "participants" table:
| First name | Status |
| Learner One | Suspended |
| Learner Two | Active |
+2 -3
View File
@@ -208,12 +208,11 @@ class helper {
* @return \moodle_url The URL.
*/
public static function get_duplicate_tour_link($tourid) {
$link = new \moodle_url('/admin/tool/usertours/configure.php', [
return new \moodle_url('/admin/tool/usertours/configure.php', [
'action' => manager::ACTION_DUPLICATETOUR,
'id' => $tourid,
'sesskey' => sesskey(),
]);
return $link;
}
/**
+2 -1
View File
@@ -503,8 +503,9 @@ class manager {
* @param int $tourid The ID of the tour to duplicate.
*/
protected function duplicate_tour($tourid) {
$tour = helper::get_tour($tourid);
require_sesskey();
$tour = helper::get_tour($tourid);
$export = $tour->to_record();
// Remove the id.
unset($export->id);

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