Compare commits

..

313 Commits

Author SHA1 Message Date
Huong Nguyen ca15d0f2e8 Moodle release 4.4.12 2025-12-07 08:05:21 +07:00
Huong Nguyen 29dd0f2640 weekly release 4.4.11+ 2025-12-05 08:09:21 +07:00
Huong Nguyen dc447e4b3f Merge branch 'MDL-87068-404' of https://github.com/lameze/moodle into MOODLE_404_STABLE 2025-12-04 21:01:37 +07:00
Angelia Dela Cruz 6e353fbab8 MDL-87068 contentbank_h5p: Behat for restoring course contentbank 2025-12-04 10:34:23 +08:00
Huong Nguyen c377d42d87 MDL-72744 table: Improve PHPUnit test 2025-12-04 08:56:55 +07:00
David Woloszyn d946fae784 MDL-72744 core_grades: Escape formulas when exporting spreadsheets 2025-12-04 08:56:55 +07:00
David Woloszyn 77474b866c MDL-72744 dataformat: Escape formulas when exporting spreadsheets
Co-authored-by: Huong Nguyen <huongnv13@gmail.com>
2025-12-04 08:56:55 +07:00
Huong Nguyen 514fad16ca MDL-86087 core: Use correct required version 2025-12-04 08:37:23 +07:00
Huong Nguyen 8a9b201d5c Merge branch 'MDL-87091-404' of https://github.com/lameze/moodle into MOODLE_404_STABLE 2025-12-03 16:11:42 +07:00
mioyu-ubiq 723a63b5a7 MDL-87091 behat: Test authloginviaemail setting behavior 2025-12-03 15:56:33 +08:00
Huong Nguyen 3b3bc90d58 MDL-87353 core: Safer unserializing of file references 2025-12-03 14:18:01 +08:00
Jun Pataleta a5d891fe69 Merge branch 'MDL-86087-404' of https://github.com/HuongNV13/moodle into MOODLE_404_STABLE 2025-12-03 14:09:53 +08:00
Stefan Hanauska 6cc385adb6 MDL-86960 mod_glossary: Check user 2025-12-03 13:44:58 +08:00
Stefan Hanauska 619104e303 MDL-86960 mod_data: Check user 2025-12-03 13:44:47 +08:00
Stefan Hanauska 187bf24f46 MDL-86960 mod_forum: Check user 2025-12-03 13:44:30 +08:00
Jake Dallimore 6992ef3d3e MDL-87286 enrol_lti: prevent suspended user account auth in legacy LTI 2025-12-03 15:51:48 +11:00
Jake Dallimore 2a3f719f03 MDL-87286 auth_lti: prevent suspended user account auth in LTI1p3 2025-12-03 15:51:48 +11:00
Mihail Geshoski 05f233de51 MDL-82808 assign: Use blindid during submission removal in blind marking 2025-12-03 09:50:05 +08:00
Rajneel Totaram e050af3f76 MDL-82808 mod_assign: replace userid with blindid in anonymous marking 2025-12-03 09:50:05 +08:00
Huong Nguyen 5b36ea0db8 MDL-86087 core: Define environment requirements for Moodle 5.2 2025-11-28 09:09:59 +07:00
David Woloszyn 021406c8b8 MDL-86544 lib: Adjust checks on local URL params 2025-11-27 11:51:17 +00:00
Eric Merrill 48031a9e52 MDL-80317 auth_oauth2: Restrict login redirect to local url 2025-11-27 11:51:17 +00:00
David Woloszyn dc99af1031 MDL-85557 atto_equation: Sanitise equation preview input 2025-11-27 11:51:17 +00:00
David Woloszyn 84fe6fc634 MDL-85557 tiny_equation: Sanitise equation preview input 2025-11-27 11:51:17 +00:00
Stefan Hanauska 2f76e2ac11 MDL-86507 badge: Check if role is assigned 2025-11-27 11:51:17 +00:00
yusufwib01 87cdc2b544 MDL-86326 auth: Enhance validation logic in resend_confirmation_email 2025-11-27 11:51:17 +00:00
Mihail Geshoski 99f773928a weekly release 4.4.11+ 2025-11-27 19:40:58 +08:00
Mihail Geshoski df803aa0cf Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-11-27 19:40:53 +08:00
Andrew Nicols cac7686d6e Merge branch 'MDL-86255-404' of https://github.com/paulholden/moodle into MOODLE_404_STABLE 2025-11-27 11:11:57 +08:00
Mihail Geshoski 7aa7f744cd Merge branch 'MDL-87149-404' of https://github.com/junpataleta/moodle into MOODLE_404_STABLE 2025-11-26 17:31:18 +08:00
Andrew Nicols 382b5982a6 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-25 15:27:39 +00:00
AMOS bot 00318703e4 Automatically generated installer lang files 2025-11-23 00:08:16 +00:00
Huong Nguyen 5e655ad805 weekly release 4.4.11+ 2025-11-21 14:33:58 +07:00
Huong Nguyen 92f5c1cd6c Merge branch 'MDL-87048-404' of https://github.com/lameze/moodle into MOODLE_404_STABLE 2025-11-21 08:17:14 +07:00
Huong Nguyen 1875710825 Merge branch 'MDL-84735-404' of https://github.com/lameze/moodle into MOODLE_404_STABLE 2025-11-21 08:17:14 +07:00
Angelia Dela Cruz 5afd98eb7f MDL-87048 tool_lp: Behat for synchronising cohort with learning plan 2025-11-20 10:28:46 +08:00
Angelia Dela Cruz 058c986c13 MDL-84735 gradingform: Behat for modifying marking guide criterion 2025-11-20 07:48:40 +08:00
Julien Boulen 31a7b4981c MDL-86320 core: Fix unit test qrcode_test 2025-11-19 10:06:02 +07:00
Huong Nguyen 4346a59025 Merge branch 'MDL-86907-404' of https://github.com/mioyu-ubiq/moodle into MOODLE_404_STABLE 2025-11-19 10:03:27 +07:00
mioyu-ubiq 71bb810758 MDL-86907 mod_choice: Behat test for adding multiple choice responses 2025-11-18 15:05:07 +08:00
Simey Lameze df843852b9 MDL-87050 behat: use src for img xpath selector 2025-11-18 10:50:55 +07:00
Huong Nguyen 33ed9d98c7 Merge branch 'MDL-87050-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-11-17 15:58:25 +07:00
Jun Pataleta 730534c26c MDL-87149 mod_feedback: Generate dependent questions
Allow the generator to create questions that depend on other questions.
2025-11-17 12:47:33 +08:00
Mihail Geshoski 1dcb6c9f56 weekly release 4.4.11+ 2025-11-13 18:49:30 +08:00
Angelia Dela Cruz a87b2b8f24 MDL-87050 mod_folder: Behat for preventing forced file downloads 2025-11-13 16:52:36 +08:00
Huong Nguyen 17c2bbf1cb Merge branch 'MDL-86895-404' of https://github.com/mioyu-ubiq/moodle into MOODLE_404_STABLE 2025-11-13 10:44:16 +07:00
Huong Nguyen c54f62fee6 Merge branch 'MDL-79249-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-11-13 10:20:47 +07:00
Huong Nguyen 17e2b5f8cb Merge branch 'MDL-87047-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-11-13 10:17:04 +07:00
Huong Nguyen ca06413c3d Merge branch 'MDL-78973-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-11-13 08:53:04 +07:00
Mihail Geshoski 8fc2c1aab8 Merge branch 'MDL-86963-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-11-12 17:16:53 +08:00
Mihail Geshoski c741717763 Merge branch 'MDL-85686-404' of https://github.com/lameze/moodle into MOODLE_404_STABLE 2025-11-12 17:01:40 +08:00
Angelia Dela Cruz 76a4c421d1 MDL-87047 tool_lp: Behat optimisation 2025-11-12 16:39:20 +08:00
Mihail Geshoski 9c771234b8 Merge branch 'MDL-86886-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-11-12 16:38:59 +08:00
Angelia Dela Cruz bcd1cf6e3d MDL-87047 tool_lp: Behat to complete a learning plan and alter it 2025-11-12 16:35:13 +08:00
Angelia Dela Cruz b17d59accd MDL-86963 tool_lp: Behat to perform CRUD operations on competencies 2025-11-12 10:57:35 +08:00
Angelia Dela Cruz e88a6c01a4 MDL-86886 tool_lp: Behat to move and cross-reference competencies 2025-11-11 16:07:27 +08:00
Simey Lameze 837e73ce4f MDL-85686 mod_quiz: unit test coverage for questions shuffle 2025-11-11 14:21:35 +08:00
Angelia Dela Cruz 58a29073a7 MDL-78973 Behat: Behat coverage for invalid file upload in data activity 2025-11-11 13:24:18 +08:00
Mio Yu 9413a077e9 MDL-86895 core_grades: Behat to verify listing and grading submissions 2025-11-11 12:57:39 +08:00
Huong Nguyen 18c78f4a2e Merge branch 'MDL-81604-404' of https://github.com/t-schroeder/moodle into MOODLE_404_STABLE 2025-11-11 09:29:18 +07:00
Huong Nguyen 00289a360a weekly release 4.4.11+ 2025-11-07 14:49:35 +07:00
Huong Nguyen d11be64b94 Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-11-07 14:49:33 +07:00
Huong Nguyen 314d315397 MDL-69226 environment: filter extension required for 4.1 2025-11-06 18:22:40 +08:00
Mihail Geshoski 251c15ee04 Merge branch 'MDL-87073-404' of https://github.com/HuongNV13/moodle into MOODLE_404_STABLE 2025-11-06 17:09:04 +08:00
Huong Nguyen 21090c3716 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:24 +07:00
Huong Nguyen 8ec1ebc9cd Merge branch 'MDL-86908-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-11-06 15:42:47 +07:00
Huong Nguyen 00092de974 Merge branch 'MDL-87049-404' of https://github.com/lameze/moodle into MOODLE_404_STABLE 2025-11-06 15:40:42 +07:00
Andrew Nicols 9da9ed2bf8 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-06 15:38:13 +07:00
Jake Dallimore a953a3eafb Merge branch 'MDL-86379-404' of https://github.com/lameze/moodle into MOODLE_404_STABLE 2025-11-06 14:30:42 +08:00
Simey Lameze f70f1b1721 MDL-87049 behat: read showcampaigncontent setting when running behat 2025-11-06 08:21:48 +08:00
Angelia Dela Cruz 7a315f18ee MDL-87049 core: Behat to toggle campaign content banner display 2025-11-06 08:21:48 +08:00
AMOS bot 4aedbab2e4 Automatically generated installer lang files 2025-11-06 00:07:51 +00:00
Angelia Dela Cruz ca19e78795 MDL-86908 core_contentbank: Behat to set supported files of contentbank 2025-11-05 18:39:35 +08:00
Simey Lameze eb670e1115 MDL-86379 mod_quiz: move create_test_quiz function into generator 2025-11-05 11:54:22 +08:00
Angelia Dela Cruz dbf9adf8a9 MDL-79249 core_filepicker: Cancel file and folder upload using X button 2025-11-03 11:12:49 +08:00
Huong Nguyen 407bf7714e Merge branch 'MDL-69226-M404_verify-that-the-filter-php-extension-is-present' of https://github.com/ziegenberg/moodle into MOODLE_404_STABLE 2025-11-03 09:02:26 +07:00
AMOS bot 5bc19fc1ed Automatically generated installer lang files 2025-11-01 00:07:51 +00:00
Mihail Geshoski e9916f9d95 weekly release 4.4.11+ 2025-10-30 18:11:46 +08:00
Mihail Geshoski e057bc611b Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-10-30 18:11:42 +08:00
Mihail Geshoski a0a139f24c Merge branch 'MDL-86894-404' of https://github.com/Kredelirious/moodle into MOODLE_404_STABLE 2025-10-29 10:19:18 +08:00
Daniel Ziegenberg e24c8e4cde MDL-69226 environment: filter extension required
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-10-28 19:40:17 +01:00
Kim Jared Lucas 115a369b97 MDL-86894 mod_forum: Behat to verify default forum RSS settings 2025-10-28 13:13:16 +08:00
AMOS bot a390968760 Automatically generated installer lang files 2025-10-28 00:09:41 +00:00
Huong Nguyen ab645b55d3 weekly release 4.4.11+ 2025-10-24 11:00:44 +07:00
Huong Nguyen 1e7b9250dd Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-10-24 11:00:42 +07:00
Paul Holden 118f5b53ca MDL-86255 behat: implement methods to assert date/time field value. 2025-10-21 11:34:55 +01:00
Mihail Geshoski 2c7984ea33 Merge branch 'MDL-85696-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-10-20 10:29:41 +08:00
Angelia Dela Cruz 89689bceeb MDL-85696 mod_quiz: Behat to attempt password and time restricted quiz 2025-10-17 17:32:36 +08:00
Paul Holden 3ab6ab7d0e 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:56 +08:00
Andrew Nicols b00e03b493 Merge branch 'MDL-86186-404' of https://github.com/lameze/moodle into MOODLE_404_STABLE 2025-10-15 15:50:38 +08:00
AMOS bot 04c0d79ccc Automatically generated installer lang files 2025-10-15 00:09:27 +00:00
AMOS bot 0a2ce4bd69 Automatically generated installer lang files 2025-10-09 00:09:06 +00:00
Huong Nguyen 381b66b33a Moodle release 4.4.11 2025-10-04 09:02:44 +07:00
AMOS bot 90cee9f31c Automatically generated installer lang files 2025-10-04 00:07:52 +00:00
Shamim Rezaie 0a19ed5cc1 weekly release 4.4.10+ 2025-10-03 20:02:36 +10:00
Mihail Geshoski 0d944d9286 MDL-75087 mod_assign: Fix failing behat tests in classic 2025-10-03 14:22:58 +07:00
Mihail Geshoski 65de7c1e0d MDL-75087 mod_assign: Fix failing unit test 2025-10-02 18:09:54 +07:00
Rajneel Totaram ed263c2eef 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 10:49:58 +08:00
yusufwib01 f07ae868a6 MDL-86353 mod_assign: Sync exception handling in PdfType and PdfReader 2025-09-30 09:24:10 +07:00
Paul Holden bc7e7dea82 MDL-85421 cohort: limit requests for all cohorts to system context. 2025-09-29 13:33:45 +07:00
David Woloszyn e7fe9f03ff MDL-86327 auth_webservice: Stricter check on login 2025-09-29 08:24:34 +07:00
Huong Nguyen 2d3ddd06c1 MDL-86334 core: Improve after_config plugin callbacks
Plugin callbacks should be able to throw their exceptions
2025-09-29 08:18:20 +07:00
raortegar 9868bf12c1 MDL-86334 tool_mfa: Improve multi-factor authentication validation. 2025-09-29 08:18:20 +07:00
yusufwib01 1cd858fb46 MDL-86261 calendar: Improve event form to show accessible groups 2025-09-29 08:17:57 +07:00
cescobedo c16eab825f weekly release 4.4.10+ 2025-09-26 13:44:31 +02:00
cescobedo c691cc4e69 Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-09-26 13:44:29 +02:00
Mihail Geshoski 7048df7dfb Merge branch 'MDL-86432-404' of https://github.com/timhunt/moodle into MOODLE_404_STABLE 2025-09-25 14:11:02 +08:00
Mihail Geshoski cb8592b69f Merge branch 'MDL-85675-404' of https://github.com/lameze/moodle into MOODLE_404_STABLE 2025-09-25 11:52:54 +08:00
AMOS bot 296ae75911 Automatically generated installer lang files 2025-09-25 00:07:49 +00:00
Andrew Nicols ff95fc58b3 MDL-86432 qtype_ordering: Fix broken data provider 2025-09-24 17:54:13 +01:00
Sara Arjona 42d52d0993 weekly release 4.4.10+ 2025-09-23 17:21:17 +02:00
Huong Nguyen 355b839831 Merge branch 'MDL-84870-404' of https://github.com/andimendunia/moodle into MOODLE_404_STABLE 2025-09-22 08:28:52 +07:00
Huong Nguyen 2f758dc111 weekly release 4.4.10+ 2025-09-18 08:34:27 +07:00
Huong Nguyen 3fbbae99ad Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-09-18 08:34:25 +07:00
Huong Nguyen 8580cb89d8 MDL-86495 core: Improve PHPUnit for IPLookup 2025-09-16 08:51:51 +07:00
Andi Permana 474ee999f6 MDL-84870 core: Update security.txt expiry 2025-09-15 13:04:35 +07:00
Huong Nguyen 4ce0bb6ebf 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:46:52 +07:00
AMOS bot f3e8c3a305 Automatically generated installer lang files 2025-09-06 00:07:52 +00:00
Simey Lameze f0c78f3150 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:08:22 +08:00
AMOS bot ed2c79b77c Automatically generated installer lang files 2025-09-03 00:07:49 +00:00
AMOS bot 4e4f7324ea Automatically generated installer lang files 2025-09-01 00:07:46 +00:00
cescobedo 2dee6f2927 weekly release 4.4.10+ 2025-08-29 15:01:20 +02:00
Huong Nguyen 2e29b3b6ab Merge branch 'MDL-86452-404' of https://github.com/andrewnicols/moodle into MOODLE_404_STABLE 2025-08-29 08:46:26 +07:00
Huong Nguyen 431b20d103 Merge branch 'MDL-86301-404' of https://github.com/andrewnicols/moodle into MOODLE_404_STABLE 2025-08-29 08:41:35 +07:00
Andrew Nicols 120e1da7a9 MDL-86452 core: Reset navigation data between tests 2025-08-28 13:13:05 +08:00
cescobedo a7a9aa76e6 weekly release 4.4.10+ 2025-08-26 15:54:15 +02:00
cescobedo 0f8db4effe Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-08-26 15:54:13 +02:00
Mihail Geshoski 5a4fe3dc31 Merge branch 'MDL-85677-404' of https://github.com/lameze/moodle into MOODLE_404_STABLE 2025-08-26 11:56:21 +08:00
Huong Nguyen f16e99c844 Merge branch 'MDL-86315-404' of https://github.com/davewoloszyn/moodle into MOODLE_404_STABLE 2025-08-26 09:23:35 +07:00
Simey Lameze b43cd189d5 MDL-85677 behat: test to verify SEB download link visibility 2025-08-26 09:18:44 +08:00
Mihail Geshoski 8d9b0b330f Merge branch 'MDL-85676-404' of https://github.com/lameze/moodle into MOODLE_404_STABLE 2025-08-26 00:42:50 +08:00
Andrew Nicols b8aa1d15a8 MDL-86301 core: Create autoloadable externallib_testcase 2025-08-25 15:14:36 +08:00
Simey Lameze 7b19f07fbd MDL-85676 behat: validate SEB attempt message 2025-08-25 14:08:13 +08:00
AMOS bot 4e78b502ef Automatically generated installer lang files 2025-08-24 00:09:54 +00:00
Mihail Geshoski 8526d2cd7a weekly release 4.4.10+ 2025-08-22 20:40:32 +08:00
Mihail Geshoski 2b4a397579 Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-08-22 20:40:28 +08:00
Huong Nguyen 4708188c02 Merge branch 'MDL-86231-404' of https://github.com/andrewnicols/moodle into MOODLE_404_STABLE 2025-08-22 08:47:01 +07:00
AMOS bot 6a6cf5d6ca Automatically generated installer lang files 2025-08-16 00:07:50 +00:00
David Woloszyn 687559871b MDL-86315 registration: Unset emails in hub when dependant value not set 2025-08-15 13:01:06 +10:00
AMOS bot 53f715d16d Automatically generated installer lang files 2025-08-14 00:07:57 +00:00
AMOS bot e26b90c332 Automatically generated installer lang files 2025-08-13 00:07:58 +00:00
Andrew Nicols 6dd0995312 MDL-86231 behat: Support array callable syntax in execute method 2025-08-08 11:42:30 +08:00
Mihail Geshoski 8445cad014 Moodle release 4.4.10 2025-08-08 10:48:40 +08:00
Sara Arjona 0dc00ed6e9 weekly release 4.4.9+ 2025-08-07 16:45:21 +02:00
Sara Arjona 53a794538a Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-08-07 16:45:19 +02:00
Ilya Tregubov 36ded6f300 MDL-63395 user: Fix profile visibility check.
It needs to be done in user_get_user_details as well.
2025-08-07 10:30:45 +07:00
Jun Pataleta 2be167a172 Merge branch 'MDL-85674-404' of https://github.com/lameze/moodle into MOODLE_404_STABLE 2025-08-07 10:44:03 +08:00
AMOS bot 065b6436c2 Automatically generated installer lang files 2025-08-07 00:07:52 +00:00
ferran 1d914c1937 Merge branch 'MDL-86176-404' of https://github.com/sarjona/moodle into MOODLE_404_STABLE 2025-08-06 16:22:01 +02:00
Sara Arjona c5a878de43 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:08:00 +02:00
Simey Lameze 292a559fd7 MDL-85674 behat: replace multiple steps by a single table step 2025-08-06 18:37:23 +08:00
andelacruz 3569920982 MDL-85674 mod_grade: Behat test for multiple questions manual grading 2025-08-06 17:42:21 +08:00
Huong Nguyen 2217677c96 MDL-84464 report_log: Fix EOF 2025-08-06 10:39:19 +07:00
Laurent David 0a75e8e4cf MDL-84464 report_loglive: Hide report for teacher without groups 2025-08-06 10:22:44 +07:00
Laurent David 7a6315e676 MDL-84464 report_log: Hide report for teachers without groups
* Teachers without groups in SEPARATEGROUP mode should not see the report log page nor access it
2025-08-06 10:22:44 +07:00
Laurent David 27b30703b4 MDL-84463 mod_feedback: Fix behat test
* Fix typo in test description
* Use the right step to edit questions
2025-08-05 03:41:17 +00:00
Laurent David cfc476a722 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-05 03:41:17 +00:00
Laurent David 093512285f 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-05 03:41:17 +00:00
raortegar 424f20e225 MDL-85704 mod_bigbluebuttonbn: Update sesskey handling for compatibility 2025-08-05 03:41:17 +00:00
Mihail Geshoski 8e2a748167 Merge branch 'MDL-85565_404' of https://github.com/PhilippImhof/moodle into MOODLE_404_STABLE 2025-08-05 11:34:21 +08:00
Simey Lameze cf470b8de9 MDL-86186 behat: enlarge window size before asserting 2025-08-04 11:27:41 +08:00
Sara Arjona 8ce2a2fe73 weekly release 4.4.9+ 2025-07-31 16:08:47 +02:00
Sara Arjona 753335e5fe Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-07-31 16:08:43 +02:00
Michael Hawkins cb36a45ce2 Merge branch 'MDL-85362-404' of https://github.com/HuongNV13/moodle into MOODLE_404_STABLE 2025-07-31 14:39:58 +08:00
Huong Nguyen e8870b1975 Merge branch 'MDL-84485-Select-webservice-in-wstoken-behat-breadcrumb-404' of https://github.com/farhan6318/moodle into MOODLE_404_STABLE 2025-07-31 10:17:58 +07:00
AMOS bot af12e1f3c6 Automatically generated installer lang files 2025-07-31 00:07:58 +00:00
Mihail Geshoski cbc91748b4 Merge branch 'MDL-86113-404' of https://github.com/snake/moodle into MOODLE_404_STABLE 2025-07-30 23:28:53 +08:00
Farhan Karmali 3a6e2c8f26 MDL-84485 webservice: Add Behat step for mobile web service selection 2025-07-29 16:07:05 +05:30
AMOS bot d8e559dcbe Automatically generated installer lang files 2025-07-28 13:16:54 +00:00
Philipp Imhof e4c6d0b498 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:52 +02:00
Jake Dallimore cfe8f40e94 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:50:49 +08:00
Michael Hawkins 4ad38cc139 weekly release 4.4.9+ 2025-07-25 12:14:47 +08:00
Huong Nguyen c9978cffbb Merge branch 'MDL-86049-404' of https://github.com/andrewnicols/moodle into MOODLE_404_STABLE 2025-07-24 09:47:59 +07:00
Huong Nguyen 32b8996a09 MDL-85362 core: Define environment requirements for Moodle 5.1 2025-07-22 10:54:24 +07:00
Andrew Nicols 1cfd9eec4f 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
Mihail Geshoski 4f0592f963 weekly release 4.4.9+ 2025-07-18 14:52:58 +08:00
Mihail Geshoski c9336ff7dc Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-07-18 14:52:54 +08:00
Mihail Geshoski c66e293747 Merge branch 'MDL-85055-404' of https://github.com/lameze/moodle into MOODLE_404_STABLE 2025-07-17 12:14:24 +08:00
Paul Holden 140ee4b80d 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:57:37 +08:00
Huong Nguyen e3ac7a574c Merge branch 'MDL-86016-404' of https://github.com/andrewnicols/moodle into MOODLE_404_STABLE 2025-07-15 09:56:47 +07:00
Andrew Nicols 1111c96ac0 MDL-86016 core: Remove xmldb test in favour of unit test 2025-07-15 09:33:12 +08:00
Andrew Nicols 44d7ffeb89 MDL-86016 tests: Make install.xml test less restrictive 2025-07-15 09:33:12 +08:00
AMOS bot 3fa85e6828 Automatically generated installer lang files 2025-07-12 00:07:49 +00:00
Michael Hawkins 4ea8645494 weekly release 4.4.9+ 2025-07-11 12:49:36 +08:00
Mihail Geshoski d6b06d0cef Merge branch 'MDL-85689-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-07-10 11:38:16 +08:00
andelacruz efee10f43e MDL-85689 mod_quiz: Behat for adding and deleting page from quiz 2025-07-09 13:36:35 +08:00
Huong Nguyen 1b2f009da2 Merge branch 'MDL-85697-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-07-09 09:11:00 +07:00
Huong Nguyen 51c1ca0248 Merge branch 'MDL-85947-M404_bump-GHA-ubuntu-24-04' of https://github.com/ziegenberg/moodle into MOODLE_404_STABLE 2025-07-08 17:35:18 +07:00
andelacruz 41ee4a6cad MDL-85697 mod_lesson: Behat for lesson group and user overrides 2025-07-08 17:12:43 +08:00
andelacruz 85e642bec1 MDL-85697 mod_assign: Behat for assignment group and user overrides 2025-07-08 17:09:53 +08:00
andelacruz 0a25a24ff6 MDL-85697 mod_quiz: Behat for quiz group and user overrides 2025-07-08 17:09:52 +08:00
Daniel Ziegenberg 5583a50bae MDL-85947 ci: Bump GHA to Ubuntu 24.04
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-07-07 16:17:02 +02:00
Mihail Geshoski 82fb415b69 weekly release 4.4.9+ 2025-07-06 09:30:58 +08:00
Mihail Geshoski b7b20e7381 Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-07-06 09:30:54 +08:00
Tim Schroeder c6575999d6 MDL-81604 Files: Fix broken file serving w/ Apache + PHP-FPM + PHP >=8.1 2025-07-04 19:59:56 +02:00
Mihail Geshoski 0effcbe6b5 Merge branch 'MDL-85563-m404' of https://github.com/NeillM/moodle into MOODLE_404_STABLE 2025-07-03 11:09:05 +08:00
Mihail Geshoski cffd2be100 Merge branch 'patch/MDL-85666-404' of https://github.com/skodak/moodle into MOODLE_404_STABLE 2025-07-03 09:53:37 +08:00
Petr Skoda 8270a62377 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:11:49 +02:00
AMOS bot ce5a9b2800 Automatically generated installer lang files 2025-07-02 00:09:49 +00:00
Neill Magill 73f101e862 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:44:54 +01:00
Huong Nguyen 1761d94638 weekly release 4.4.9+ 2025-06-29 16:18:57 +07:00
Huong Nguyen d7a8c72b8f Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-06-29 16:18:55 +07:00
Mihail Geshoski 1ca9ebb3cb Merge branch 'MDL-85665-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-06-26 10:43:04 +08:00
andelacruz af4a6daacc MDL-85665 mod_quiz: Behat to build quiz in single activity format course 2025-06-24 18:06:01 +08:00
AMOS bot 12d7c64dc7 Automatically generated installer lang files 2025-06-15 00:09:48 +00:00
Mihail Geshoski 541f1569af weekly release 4.4.9+ 2025-06-13 14:43:50 +08:00
Huong Nguyen 8bbc166cb4 MDL-85316 dml: Revert DB vendor changes 2025-06-12 17:11:37 +07:00
Huong Nguyen d26badab50 Merge branch 'MDL-85316-404-mysql-version' of https://github.com/meirzamoodle/moodle into MOODLE_404_STABLE 2025-06-11 13:34:00 +07:00
meirzamoodle 823d1b25ea MDL-85316 admin: Add environment check for AWS Aurora database 2025-06-11 10:45:33 +07:00
Mihail Geshoski 662befa64e Moodle release 4.4.9 2025-06-06 12:26:06 +08:00
Sara Arjona ff135b2d86 weekly release 4.4.8+ 2025-06-05 16:43:43 +02:00
Michael Hawkins a7d8f4d1d9 MDL-83762 core_files: Bind resolve IPs and ports to cURL calls 2025-06-05 12:10:09 +07:00
Vincent Schneider 006b2a2642 MDL-84518 course: improved course visibility state handling 2025-06-05 11:23:01 +07:00
Mark Johnson 0c5b52e6ac MDL-85323 core: Don't cache the login page 2025-06-05 11:01:57 +07:00
meirzamoodle 169827cf80 MDL-85375 libraries: Escaping a query parameter on pg_insert_id() 2025-06-02 09:55:42 +07:00
Vincent Schneider f591916893 MDL-84706 bigbluebuttonbn: improved authorization and mitigate CSRF risks 2025-05-30 08:41:27 +00:00
Huong Nguyen 6dcb54ced7 MDL-79993 course: Fix PHPUnit failure 2025-05-30 08:41:27 +00:00
raortegar f105122cef MDL-79993 course: Improve user access to recent courses service 2025-05-30 08:41:27 +00:00
Vincent Schneider 0d4a8ce45d MDL-84497 badges: fix missing action sesskey checks. 2025-05-30 08:41:27 +00:00
Michael Hawkins 000b0c2771 weekly release 4.4.8+ 2025-05-30 16:29:34 +08:00
Michael Hawkins 7afa525ff3 Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-05-30 16:29:29 +08:00
Huong Nguyen a29b5364ab Merge branch 'MDL-85525-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-05-29 09:52:00 +07:00
Huong Nguyen fbe62c9538 Merge branch 'MDL-85400-404' of https://github.com/lameze/moodle into MOODLE_404_STABLE 2025-05-29 09:00:03 +07:00
Huong Nguyen 8523e47075 Merge branch 'MDL-85389-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-05-29 08:52:58 +07:00
AMOS bot 575932b2ec Automatically generated installer lang files 2025-05-29 00:07:51 +00:00
andelacruz 627945e854 MDL-85525 mod_quiz: Behat test for quiz attempt page block display 2025-05-28 16:45:02 +08:00
andelacruz 2617f75596 MDL-85389 mod_lesson: Behat for filtering lesson reports/essays by group 2025-05-28 15:21:00 +08:00
sam marshall 730e1d0ae0 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 13:04:14 +08:00
ferran 7d02e08ef9 Merge branch 'MDL-84304-404' of https://github.com/laurentdavid/moodle into MOODLE_404_STABLE 2025-05-26 13:50:21 +02:00
Huong Nguyen 2ca0fb4886 weekly release 4.4.8+ 2025-05-23 11:04:00 +07:00
Huong Nguyen 78f545b165 Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-05-23 11:03:59 +07:00
Huong Nguyen 9e4cdf9eca Merge branch 'MDL-84793-m404' of https://github.com/sammarshallou/moodle into MOODLE_404_STABLE 2025-05-22 10:48:46 +07:00
Huong Nguyen be65ecd3e1 Merge branch 'MDL-84918-404' of https://github.com/HuongNV13/moodle into MOODLE_404_STABLE 2025-05-22 10:34:51 +07:00
David Woloszyn f597c8bc2d MDL-84918 core: Add zend.exception_ignore_args environment check 2025-05-22 10:11:39 +07:00
Huong Nguyen 2e541fe5b0 MDL-84918 core: Add initial environment requirements for Moodle 5.1 2025-05-22 10:11:39 +07:00
Huong Nguyen 83cc825626 Merge branch 'MDL-85374-404' of https://github.com/andrewnicols/moodle into MOODLE_404_STABLE 2025-05-21 09:56:20 +07:00
AMOS bot cd27ce2970 Automatically generated installer lang files 2025-05-21 00:07:48 +00:00
Andrew Nicols e5bbbe000d 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:26 +08:00
Laurent David 7b1bff7cca 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:51 +02:00
Laurent David 75de28348a 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:51 +02:00
Magnus Samuelsson 598fee8ec7 MDL-84304 mod_scorm: Remove the COMPLETION_COMPLETE_FAIL status 2025-05-19 11:56:51 +02:00
Mihail Geshoski e968dc4629 weekly release 4.4.8+ 2025-05-16 12:59:13 +08:00
Mihail Geshoski 170b3ea2ab Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-05-16 12:59:03 +08:00
sam marshall 3d17b48855 MDL-84793 Behat: Allow CLI scripts to run on Behat instance 2025-05-15 08:51:05 +01:00
Huong Nguyen 0bc7bd66b2 Merge branch 'MDL-85279-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-05-15 11:42:58 +07:00
andelacruz 08ea67a272 MDL-85279 mod_assign: Renamed behat test to a more specific name 2025-05-14 15:14:03 +08:00
andelacruz 4d50167046 MDL-85279 mod_page: Fix behat to match the expected behaviour 2025-05-14 15:13:04 +08:00
Sara Arjona 333aabfaea Merge branch 'MDL-85248-404' of https://github.com/albertgasset/moodle into MOODLE_404_STABLE 2025-05-12 15:49:05 +02:00
AMOS bot f28de0cb41 Automatically generated installer lang files 2025-05-10 00:07:51 +00:00
Huong Nguyen 7e75a3680e weekly release 4.4.8+ 2025-05-09 09:50:31 +07:00
Huong Nguyen d75311461f Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-05-09 09:50:29 +07:00
Huong Nguyen 14467d84fb Merge branch 'MDL-84654-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-05-08 08:44:42 +07:00
AMOS bot 897649d9a0 Automatically generated installer lang files 2025-05-07 00:07:45 +00:00
Angelia Dela Cruz 3edbc2c282 MDL-84654 mod_assign: Assignment additional files can be hidden 2025-05-06 13:12:06 +08:00
Huong Nguyen d39da752c6 Merge branch 'MDL-85310-404' of https://github.com/andelacruz/moodle into MOODLE_404_STABLE 2025-05-06 10:32:25 +07:00
Huong Nguyen 29381e8a0d weekly release 4.4.8+ 2025-05-02 09:16:28 +07:00
Huong Nguyen 1bd8f959e1 Merge branch 'install_404_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_404_STABLE 2025-05-02 09:16:27 +07:00
AMOS bot ebeeb9cef8 Automatically generated installer lang files 2025-05-01 00:07:52 +00:00
Angelia Dela Cruz 9071c67a2c MDL-85310 qtype: Renamed duplicate scenario names to fix warning 2025-04-30 13:35:43 +08:00
Huong Nguyen 32b8197ad0 Merge branch 'MDL-84421-404' of https://github.com/andrewnicols/moodle into MOODLE_404_STABLE 2025-04-25 09:10:36 +07:00
AMOS bot e7b223c14d Automatically generated installer lang files 2025-04-23 00:07:50 +00:00
Albert Gasset 027b1a9efe MDL-85248 qtype_ddimageortext: Revert MDL-66584
This reverts commit 701e76e301.
2025-04-22 16:58:26 +02:00
AMOS bot 8254bc5d09 Automatically generated installer lang files 2025-04-20 00:08:13 +00:00
AMOS bot 630ae866bf Automatically generated installer lang files 2025-04-19 00:07:49 +00:00
AMOS bot a3323b7d28 Automatically generated installer lang files 2025-04-18 00:07:51 +00:00
Sara Arjona 77fed64613 weekly release 4.4.8+ 2025-04-17 14:30:09 +02:00
Huong Nguyen ac0ae250f0 Merge branch 'MDL-84298-404' of https://github.com/paulholden/moodle into MOODLE_404_STABLE 2025-04-17 10:54:19 +07:00
Huong Nguyen bb10627261 Merge branch 'MDL-84625-M404_close-recordset-in-core_analytics-model-add_prediction_ids' of https://github.com/ziegenberg/moodle into MOODLE_404_STABLE 2025-04-17 10:28:26 +07:00
Huong Nguyen 1dbedf59ae Merge branch '83713-javascript-error-xml-grades-import-404' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_404_STABLE 2025-04-17 10:12:33 +07:00
Huong Nguyen 03226fa1be Merge branch 'MDL-84232-404-avoid_recover_quiz_grades' of https://github.com/drobayo/moodle into MOODLE_404_STABLE 2025-04-17 08:39:46 +07:00
Julien Boulen 9ade94e0ea 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 9843d8a9ef Merge branch 'MDL-84820-404' of https://github.com/paulholden/moodle into MOODLE_404_STABLE 2025-04-16 15:24:45 +02:00
Amaia Anabitarte 3d27fbc77d MDL-85170 mod_choice: Remove the unnecessary ul closing tag 2025-04-16 15:12:37 +02:00
Sara Arjona 788900f048 Merge branch 'MDL-82132-404' of https://github.com/paulholden/moodle into MOODLE_404_STABLE 2025-04-16 14:55:15 +02:00
Huong Nguyen 274cb0f8b2 Merge branch 'MDL-83195-releaseanongradev2-404' of https://github.com/leonstr/moodle into MOODLE_404_STABLE 2025-04-16 09:40:16 +07:00
Paul Holden a54bdf4ade 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:52 +01:00
Paul Holden 3df91d98f4 MDL-82132 user: re-factor code for generating dummy user fullname. 2025-04-15 16:00:52 +01:00
Sara Arjona e54e923b55 Merge branch 'MDL-84149-404' of https://github.com/paulholden/moodle into MOODLE_404_STABLE 2025-04-15 16:45:08 +02:00
Sara Arjona 0dc8cfc9d4 Merge branch 'MDL-84140-404' of https://github.com/paulholden/moodle into MOODLE_404_STABLE 2025-04-15 16:31:25 +02:00
Sara Arjona da164d9dba Merge branch 'MDL-83990-404' of https://github.com/paulholden/moodle into MOODLE_404_STABLE 2025-04-15 16:18:21 +02:00
Sara Arjona fcfd4b3fc3 Merge branch 'MDL-83537-404' of https://github.com/paulholden/moodle into MOODLE_404_STABLE 2025-04-15 16:09:34 +02:00
Jun Pataleta b59cceeeb8 Merge branch 'MDL-83979-url-always-proxy-MOODLE_404_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_404_STABLE 2025-04-15 20:43:43 +08:00
Sara Arjona d6ed761e7f Merge branch 'MDL-55034-404' of https://github.com/paulholden/moodle into MOODLE_404_STABLE 2025-04-15 13:37:04 +02:00
Sara Arjona 47cb26cde1 Merge branch 'MDL-78381-404' of https://github.com/paulholden/moodle into MOODLE_404_STABLE 2025-04-15 11:37:01 +02:00
Sara Arjona a66e710e22 Merge branch 'MDL-80337-404' of https://github.com/paulholden/moodle into MOODLE_404_STABLE 2025-04-15 11:30:41 +02:00
Sara Arjona ad4887bdf1 Merge branch 'MDL-62230-404' of https://github.com/paulholden/moodle into MOODLE_404_STABLE 2025-04-14 18:57:11 +02:00
Sara Arjona ab5cb82442 Merge branch 'MDL-81454-404' of https://github.com/daniil-berg/moodle into MOODLE_404_STABLE 2025-04-14 18:46:34 +02:00
Sara Arjona cf7a9dd5fc Merge branch 'MDL-83550-404' of https://github.com/andrewgos/moodle into MOODLE_404_STABLE 2025-04-14 17:54:31 +02:00
Sara Arjona c2b06a60bf Merge branch 'MDL-78886-404' of https://github.com/mwehr/moodle into MOODLE_404_STABLE 2025-04-14 17:50:27 +02:00
Sara Arjona 0d78fef21c Merge branch 'MDL-66584-404' of https://github.com/danghieu1407/moodle into MOODLE_404_STABLE 2025-04-14 17:47:46 +02:00
Wehr Mario bd938712f4 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:41:24 +02:00
Sara Arjona 27615c8cc6 Merge branch 'MDL-84833-404' of https://github.com/ferranrecio/moodle into MOODLE_404_STABLE 2025-04-14 17:11:17 +02:00
Sara Arjona 30d23e5353 Merge branch 'MDL-79464-404' of https://github.com/mihailges/moodle into MOODLE_404_STABLE 2025-04-14 17:08:36 +02:00
Daniel Ziegenberg 24d1f24175 MDL-84625 analytics: close recordset when it's not needed anymore
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2025-04-14 10:02:11 +02:00
Alec Gullon c7d7c5a8c8 MDL-79464 mod_assign: Limit user navigation if grading fails validation 2025-04-10 16:27:52 +08:00
Daniil Fajnberg 3b05390d62 MDL-81454 core: Remove incorrect @property-read annotation 2025-04-09 09:01:32 +02:00
Brendan Heywood a5242728c2 MDL-83979 repository_url: Always use the proxy for url downloads 2025-04-09 14:45:35 +10:00
Paul Holden 21419b94bd MDL-55034 blog: update external blog deletion to not leak sesskey. 2025-03-31 14:04:19 +01:00
ferran 021965fd55 MDL-84833 course: completion feedback messages 2025-03-31 09:39:49 +02:00
Paul Holden 1f859c16ea MDL-84140 course: more resilient check for activity footer component. 2025-03-27 08:33:02 +00:00
Dagoberto Robayo 1390809635 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:16:26 -05:00
danghieu1407 701e76e301 MDL-66584 qtype_ddimageortext: Move JSON data to data-attribute 2025-03-25 16:37:37 +07:00
Paul Holden e837d357b1 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-03-20 15:47:45 +00:00
Paul Holden 7895aca40a MDL-84820 moodlenet: correct activity modal icon size/alignment. 2025-03-19 10:26:02 +00:00
Andrew Gosali 500a225afc MDL-83550 gradingform_rubric: fix submit no grade when remark disabled 2025-03-17 14:50:31 +07:00
Paul Holden 9ab9d973c7 MDL-80337 availability: more robust checking for plugin class presence.
Co-authored-by: Dustin Brisebois <dustin.brisebois@lambdasolutions.net>
2025-03-16 19:27:37 +00:00
Paul Holden 22b0195c6d MDL-83990 course: ensure course start/end dates set in external call. 2025-03-13 17:53:52 +00:00
Paul Holden 5ec7fa94c5 MDL-83537 check: confirm presence of instance action link. 2025-03-13 17:52:47 +00:00
Paul Holden e34037ea6a MDL-78381 course: observe default "showactivitydates" in external call. 2025-03-11 17:33:29 +00:00
Paul Holden f19403ea2f MDL-62230 mod_feedback: define exporter format for name/presentation. 2025-03-04 14:13:08 +00:00
Paul Holden 9451a354fd MDL-84298 mod_assign: target only first label for grade popout button. 2025-02-24 22:22:17 +00:00
Leon Stringer ff4f2c02ef 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 09:28:21 +00:00
Andrew Nicols cfef02a97c 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:19 +08:00
865 changed files with 8294 additions and 3009 deletions
+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
@@ -0,0 +1,5 @@
issueNumber: MDL-87079
notes:
core:
- message: When responding to pcntl signals, call existing signal handlers.
type: fixed
+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');
+412
View File
@@ -3835,6 +3835,7 @@
<PHP_EXTENSION name="fileinfo" level="required"/>
<PHP_EXTENSION name="sodium" level="optional"/>
<PHP_EXTENSION name="exif" level="optional"/>
<PHP_EXTENSION name="filter" level="required"/>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="96M" level="required">
@@ -4411,6 +4412,7 @@
<PHP_EXTENSION name="fileinfo" level="required"/>
<PHP_EXTENSION name="sodium" level="required"/>
<PHP_EXTENSION name="exif" level="optional"/>
<PHP_EXTENSION name="filter" level="required"/>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="96M" level="required">
@@ -4607,6 +4609,7 @@
<PHP_EXTENSION name="fileinfo" level="required"/>
<PHP_EXTENSION name="sodium" level="required"/>
<PHP_EXTENSION name="exif" level="optional"/>
<PHP_EXTENSION name="filter" level="required"/>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="96M" level="required">
@@ -4716,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>
@@ -4801,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">
@@ -4895,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>
+8 -2
View File
@@ -923,8 +923,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);
+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');
+8
View File
@@ -51,6 +51,14 @@ if ($hassiteconfig) {
$temp->add(new admin_setting_countrycodes('allcountrycodes', new lang_string('allcountrycodes', 'core_admin'),
new lang_string('configallcountrycodes', 'core_admin')));
$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);
+1
View File
@@ -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"
@@ -18,6 +18,7 @@ Feature: Verify the breadcrumbs in webservice tokens site administration pages
And "Manage tokens" "link" should exist in the ".breadcrumb" "css_element"
And "Web services" "link" should exist in the ".breadcrumb" "css_element"
And I set the field "User" to "John Doe"
And I set the field "Service" to "Moodle mobile web service"
And I press "Save changes"
When I click on "Delete" "link"
Then "Delete token" "text" should exist in the ".breadcrumb" "css_element"
@@ -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 |
+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');
@@ -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));
}
}
}
@@ -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 |
+1 -4
View File
@@ -531,11 +531,8 @@ class manager {
}
// WS/AJAX check.
// Prevents any potential bypassing of multi-factor authentication.
if (WS_SERVER || AJAX_SCRIPT) {
if (isset($SESSION->mfa_pending) && !empty($SESSION->mfa_pending)) {
// Allow AJAX and WS, but never from auth.php.
return self::NO_REDIRECT;
}
return self::REDIRECT_EXCEPTION;
}
+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');
+1 -6
View File
@@ -178,12 +178,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);
}
/**
@@ -1,12 +0,0 @@
@tool @tool_xmldb
Feature: The Reconcile XMLDB files report works and all the files are ok
In order to ensure that all the XMLDB Editor xml files are generated properly
As a developer
I need to be able to run the Reconcile XMLDB files report and verify that everything is ok
Scenario: The Reconcile XMLDB files reports that all files are ok
Given I log in as "admin"
And I navigate to "Development > XMLDB editor" in site administration
When I follow "[Reconcile XMLDB files]"
Then I should see "Look for XMLDB files needing reconciling"
And I should see "All files are OK. No reconciling is needed."
+1
View File
@@ -1925,6 +1925,7 @@ class model {
$uniqueid = $this->get_time_splitting()->append_rangeindex($dbprediction->sampleid, $dbprediction->rangeindex);
$predictionrecords[$uniqueid]->id = $dbprediction->id;
}
$dbpredictions->close();
}
return $predictionrecords;
+13 -6
View File
@@ -370,7 +370,7 @@ class core_auth_external extends external_api {
* @throws moodle_exception
*/
public static function resend_confirmation_email($username, $password, $redirect = '') {
global $PAGE;
global $PAGE, $CFG;
$warnings = array();
$params = self::validate_parameters(
@@ -387,20 +387,27 @@ class core_auth_external extends external_api {
$username = trim(core_text::strtolower($params['username']));
$password = $params['password'];
$user = core_user::get_user_by_username($username);
if (!empty($user) && $user->confirmed) {
if (!empty($CFG->protectusernames)) {
throw new moodle_exception('invalidlogin');
}
throw new moodle_exception('alreadyconfirmed');
}
if (is_restored_user($username)) {
if (!empty($CFG->protectusernames)) {
throw new moodle_exception('invalidlogin');
}
throw new moodle_exception('restoredaccountresetpassword', 'webservice');
}
$user = authenticate_user_login($username, $password);
if (empty($user)) {
throw new moodle_exception('invalidlogin');
}
if ($user->confirmed) {
throw new moodle_exception('alreadyconfirmed');
}
// Check if we should redirect the user once the user is confirmed.
$confirmationurl = null;
if (!empty($params['redirect'])) {
+14
View File
@@ -104,6 +104,7 @@ class auth_plugin_lti extends \auth_plugin_base {
* @param int $provisioningmode the desired account provisioning mode, which controls the auth flow for unbound users.
* @param array $legacyconsumersecrets an array of secrets used by the legacy consumer if a migration claim exists.
* @throws coding_exception if the specified provisioning mode is invalid.
* @throws moodle_exception if user authentication fails.
*/
public function complete_login(array $launchdata, moodle_url $returnurl, int $provisioningmode,
array $legacyconsumersecrets = []): void {
@@ -112,6 +113,19 @@ class auth_plugin_lti extends \auth_plugin_base {
if ($this->get_user_binding($launchdata['iss'], $launchdata['sub'])) {
$user = $this->find_or_create_user_from_launch($launchdata);
if ($user->suspended) {
$failurereason = AUTH_LOGIN_SUSPENDED;
$event = \core\event\user_login_failed::create([
'userid' => $user->id,
'other' => [
'username' => $user->username,
'reason' => $failurereason
]
]);
$event->trigger();
throw new moodle_exception('invalidlogin', 'core');
}
if (isloggedin()) {
// If a different user is currently logged in, authenticate the linked user instead.
global $USER;
+1 -1
View File
@@ -25,7 +25,7 @@
require_once('../../config.php');
$issuerid = required_param('id', PARAM_INT);
$wantsurl = new moodle_url(optional_param('wantsurl', '', PARAM_URL));
$wantsurl = new moodle_url(optional_param('wantsurl', '', PARAM_LOCALURL));
$PAGE->set_context(context_system::instance());
$PAGE->set_url(new moodle_url('/auth/oauth2/login.php', ['id' => $issuerid]));
+9
View File
@@ -181,6 +181,7 @@ final class external_test extends externallib_advanced_testcase {
$this->assertTrue($result['success']);
$this->assertEmpty($result['warnings']);
set_config('protectusernames', 0);
$_SERVER['HTTP_USER_AGENT'] = 'no browser'; // Hack around missing user agent in CLI scripts.
$this->expectException('\moodle_exception');
$this->expectExceptionMessage('error/invalidlogin');
@@ -204,6 +205,7 @@ final class external_test extends externallib_advanced_testcase {
$this->assertTrue($result['success']);
$this->assertEmpty($result['warnings']);
set_config('protectusernames', 0);
$_SERVER['HTTP_USER_AGENT'] = 'no browser'; // Hack around missing user agent in CLI scripts.
$this->expectException('\moodle_exception');
$this->expectExceptionMessage('error/invalidlogin');
@@ -234,6 +236,13 @@ final class external_test extends externallib_advanced_testcase {
$result = external_api::clean_returnvalue(core_auth_external::confirm_user_returns(), $result);
$this->assertTrue($result['success']);
// Keep protectusernames enabled so the call returns invalidlogin exception.
$this->expectException('\moodle_exception');
$this->expectExceptionMessage('error/invalidlogin');
core_auth_external::resend_confirmation_email($username, $password);
// Now disable protectusernames and expect an exception.
set_config('protectusernames', 0);
$this->expectException('\moodle_exception');
$this->expectExceptionMessage('error/alreadyconfirmed');
core_auth_external::resend_confirmation_email($username, $password);
+9 -1
View File
@@ -73,7 +73,15 @@ class auth_plugin_webservice extends auth_plugin_base {
function user_login_webservice($username, $password) {
global $CFG, $DB;
// special web service login
if ($user = $DB->get_record('user', array('username'=>$username, 'mnethostid'=>$CFG->mnet_localhost_id))) {
$user = $DB->get_record('user', [
'username' => $username,
'auth' => 'webservice',
'deleted' => '0',
'suspended' => '0',
'mnethostid' => $CFG->mnet_localhost_id,
]);
if ($user) {
return validate_internal_user_password($user, $password);
}
return false;
+5
View File
@@ -117,6 +117,11 @@ abstract class frontend {
foreach ($enabled as $plugin => $info) {
// Create plugin front-end object.
$class = '\availability_' . $plugin . '\frontend';
if (!class_exists($class)) {
continue;
}
/** @var \core_availability\frontend $frontend */
$frontend = new $class();
// Add to array of required YUI modules.
+2 -3
View File
@@ -792,11 +792,10 @@ abstract class info {
// plugin could also rely on the completion plugin.
$pluginmanager = \core_plugin_manager::instance();
$enabled = $pluginmanager->get_enabled_plugins('availability');
$componentparams = new \stdClass();
foreach ($enabled as $plugin => $info) {
// Use the static method.
/** @var \core_availability\condition $class */
$class = '\availability_' . $plugin . '\condition';
if ($class::completion_value_used($course, $cmid)) {
if (class_exists($class) && $class::completion_value_used($course, $cmid)) {
return true;
}
}
+2 -2
View File
@@ -220,9 +220,9 @@ class tree extends tree_node {
// First see if it's a condition. These have a defined type.
if (isset($child->type)) {
// Look for a plugin of this type.
/** @var \core_availability\condition $classname */
$classname = '\availability_' . $child->type . '\condition';
if (!array_key_exists($child->type, $enabled)) {
if (!array_key_exists($child->type, $enabled) || !class_exists($classname)) {
if ($lax) {
// On load of existing settings, ignore if class
// doesn't exist.
+10
View File
@@ -82,6 +82,16 @@ if (!$badge->is_active()) {
die();
}
if (!empty($role)) {
if (!user_has_role_assignment($USER->id, $role, $context->id) && !$isadmin) {
// User does not have the role passed by the parameter.
echo $OUTPUT->header();
echo $OUTPUT->notification(get_string('wrongrole', 'badges'));
echo $OUTPUT->footer();
die();
}
}
$returnurl = new moodle_url('recipients.php', array('id' => $badge->id));
$returnlink = html_writer::link($returnurl, $strrecipients);
$actionbar = new \core_badges\output\standard_action_bar($PAGE, $badge->type, false, false, $returnurl);
+112 -58
View File
@@ -60,6 +60,7 @@ if (!empty($issuedbadge->recipient->id)) {
$assertionid = $assertion->get_assertion_hash();
$assertionentityid = $assertiondata['id'];
$badgeadded = false;
$issuerexists = false;
if (badges_open_badges_backpack_api() == OPEN_BADGES_V2) {
$sitebackpack = badges_get_site_primary_backpack();
$api = new \core_badges\backpack_api($sitebackpack);
@@ -71,62 +72,75 @@ if (!empty($issuedbadge->recipient->id)) {
$issuer = $assertion->get_issuer();
if (!($issuerentityid = badges_external_get_mapping($sitebackpack->id, OPEN_BADGES_V2_TYPE_ISSUER, $issuer['email']))) {
$response = $api->put_issuer($issuer);
if (!$response) {
throw new moodle_exception('invalidrequest', 'error');
if ($response) {
$issuerexists = true;
$issuerentityid = $response->id;
badges_external_create_mapping(
$sitebackpack->id,
OPEN_BADGES_V2_TYPE_ISSUER,
$issuer['email'],
$issuerentityid,
);
}
$issuerentityid = $response->id;
badges_external_create_mapping($sitebackpack->id, OPEN_BADGES_V2_TYPE_ISSUER, $issuer['email'],
$issuerentityid);
}
// Create badge.
$badge = $assertion->get_badge_class(false);
$badgeid = $assertion->get_badge_id();
if (!($badgeentityid = badges_external_get_mapping($sitebackpack->id, OPEN_BADGES_V2_TYPE_BADGE, $badgeid))) {
$response = $api->put_badgeclass($issuerentityid, $badge);
if (!$response) {
throw new moodle_exception('invalidrequest', 'error');
if ($issuerexists) {
// Create badge.
$badge = $assertion->get_badge_class(false);
$badgeid = $assertion->get_badge_id();
if (!($badgeentityid = badges_external_get_mapping($sitebackpack->id, OPEN_BADGES_V2_TYPE_BADGE, $badgeid))) {
$response = $api->put_badgeclass($issuerentityid, $badge);
if ($response) {
$badgeentityid = $response->id;
badges_external_create_mapping(
$sitebackpack->id,
OPEN_BADGES_V2_TYPE_BADGE,
$badgeid,
$badgeentityid,
);
}
}
$badgeentityid = $response->id;
badges_external_create_mapping($sitebackpack->id, OPEN_BADGES_V2_TYPE_BADGE, $badgeid,
$badgeentityid);
}
// Create assertion (Award the badge!).
$assertionentityid = badges_external_get_mapping(
$sitebackpack->id,
OPEN_BADGES_V2_TYPE_ASSERTION,
$assertionid
);
if ($assertionentityid && strpos($sitebackpack->backpackapiurl, 'badgr')) {
$assertionentityid = badges_generate_badgr_open_url(
$sitebackpack,
OPEN_BADGES_V2_TYPE_ASSERTION,
$assertionentityid
);
}
// Create an assertion for the recipient in the issuer's account.
if (!$assertionentityid) {
$response = $api->put_badgeclass_assertion($badgeentityid, $assertiondata);
if (!$response) {
throw new moodle_exception('invalidrequest', 'error');
}
$assertionentityid = badges_generate_badgr_open_url($sitebackpack, OPEN_BADGES_V2_TYPE_ASSERTION, $response->id);
$badgeadded = true;
badges_external_create_mapping($sitebackpack->id, OPEN_BADGES_V2_TYPE_ASSERTION, $assertionid,
$response->id);
} else {
// An assertion already exists. Make sure it's up to date.
$internalid = badges_external_get_mapping(
// Create assertion (Award the badge!).
$assertionentityid = badges_external_get_mapping(
$sitebackpack->id,
OPEN_BADGES_V2_TYPE_ASSERTION,
$assertionid,
'externalid'
$assertionid
);
$response = $api->update_assertion($internalid, $assertiondata);
if (!$response) {
throw new moodle_exception('invalidrequest', 'error');
if ($assertionentityid && strpos($sitebackpack->backpackapiurl, 'badgr')) {
$assertionentityid = badges_generate_badgr_open_url(
$sitebackpack,
OPEN_BADGES_V2_TYPE_ASSERTION,
$assertionentityid
);
}
// Create an assertion for the recipient in the issuer's account.
if (!$assertionentityid) {
$response = $api->put_badgeclass_assertion($badgeentityid, $assertiondata);
if ($response) {
$assertionentityid = badges_generate_badgr_open_url(
$sitebackpack,
OPEN_BADGES_V2_TYPE_ASSERTION,
$response->id,
);
$badgeadded = true;
badges_external_create_mapping(
$sitebackpack->id,
OPEN_BADGES_V2_TYPE_ASSERTION,
$assertionid,
$response->id,
);
}
} else {
// An assertion already exists. Make sure it's up to date.
$internalid = badges_external_get_mapping(
$sitebackpack->id,
OPEN_BADGES_V2_TYPE_ASSERTION,
$assertionid,
'externalid'
);
$response = $api->update_assertion($internalid, $assertiondata);
}
}
}
@@ -136,21 +150,61 @@ if (!empty($issuedbadge->recipient->id)) {
// - If a user and site backpack have the same provider we can skip this as Badgr automatically maps recipients
// based on email address.
// - This is only needed when the backpacks are from different regions.
if ($assertionentityid && !badges_external_get_mapping($userbackpack->id, OPEN_BADGES_V2_TYPE_ASSERTION, $assertionid)) {
if (
$assertionentityid
&& (!$issuerexists || !badges_external_get_mapping($userbackpack->id, OPEN_BADGES_V2_TYPE_ASSERTION, $assertionid))
) {
$userapi = new \core_badges\backpack_api($userbackpack, $backpack);
$userapi->authenticate();
$response = $userapi->import_badge_assertion($assertionentityid);
if (!$response) {
throw new moodle_exception('invalidrequest', 'error');
if ($response) {
$assertionentityid = $response->id;
$badgeadded = true;
badges_external_create_mapping(
$userbackpack->id,
OPEN_BADGES_V2_TYPE_ASSERTION,
$assertionid,
$assertionentityid,
);
}
$assertionentityid = $response->id;
$badgeadded = true;
badges_external_create_mapping($userbackpack->id, OPEN_BADGES_V2_TYPE_ASSERTION, $assertionid,
$assertionentityid);
}
$response = $badgeadded ? ['success' => 'addedtobackpack'] : ['warning' => 'existsinbackpack'];
redirect(new moodle_url('/badges/mybadges.php', $response));
if ($badgeadded) {
$message = get_string('addedtobackpack', 'badges');
$messagetype = \core\output\notification::NOTIFY_SUCCESS;
} else {
if (isset($userapi) && !empty($userapi->get_errors())) {
// If the api used to import the badge to the backpack has errors, show them to inform the user.
if (array_filter($userapi->get_errors(), fn($element) => str_contains($element, "DUPLICATE_BADGE"))) {
// Duplicated badges are displayed as a warning.
$message = get_string('existsinbackpack', 'badges');
$messagetype = \core\output\notification::NOTIFY_WARNING;
} else {
// If the userapi has any other errors, we will use those to inform the user.
$message = get_string(
'error:cannotsendtobackpack',
'badges',
implode($userapi->get_errors()),
);
$messagetype = \core\output\notification::NOTIFY_ERROR;
}
} else if (isset($api) && !empty($api->get_errors())) {
// If the api used to create/update the issuer has errors, show them to inform the user.
$errors = $api->get_errors() ?? [get_string('invalidrequest', 'error')];
$message = get_string(
'error:cannotsendtobackpack',
'badges',
implode($errors),
);
$messagetype = \core\output\notification::NOTIFY_ERROR;
}
}
redirect(
url: new moodle_url('/badges/mybadges.php'),
message: $message,
messagetype: $messagetype,
);
} else {
redirect(new moodle_url('/badges/mybadges.php'));
}
+1 -1
View File
@@ -56,7 +56,7 @@ if ($action == 'delete' && $confirm && confirm_sesskey()) {
} else {
$msg = get_string('sitebackpacknotdeleted', 'badges');
}
} else if ($action == 'moveup' || $action == 'movedown') {
} else if (($action == 'moveup' || $action == 'movedown') && confirm_sesskey()) {
// If no backpack has been selected, there isn't anything to move.
if (empty($id)) {
redirect($url);
+14
View File
@@ -668,6 +668,20 @@ class backpack_api {
return backpack_api_mapping::get_authentication_error();
}
/**
* List all errors occurred during the requests to the backpack.
*
* @return array The list of errors.
*/
public function get_errors(): array {
$errors = [];
foreach ($this->mappings as $mapping) {
$errors = array_merge($errors, $mapping->get_errors());
}
return $errors;
}
/**
* Get the list of badges in a collection.
*
+40
View File
@@ -85,6 +85,9 @@ class backpack_api_mapping {
/** @var int OpenBadges version 1 or 2. */
protected $backpackapiversion;
/** @var array Errors encountered during the request. */
protected $errors = [];
/**
* Create a mapping.
*
@@ -150,6 +153,26 @@ class backpack_api_mapping {
return self::$authenticationerror;
}
/**
* Get the errors encountered during the request.
*
* @return array The list of errors.
*/
public function get_errors() {
return $this->errors;
}
/**
* Add an error to the list of errors.
*
* @param string $error The error message.
* @return self This instance for method chaining.
*/
public function add_error(string $error): self {
$this->errors[] = $error;
return $this;
}
/**
* Does the action match this mapping?
*
@@ -372,6 +395,23 @@ class backpack_api_mapping {
$response = $curl->put($url, $post, $options);
}
$response = json_decode($response);
if ($response === null) {
$this->add_error(get_string('invalidrequest', 'error'));
return null;
}
if (isset($response->status) && isset($response->status->success) && $response->status->success != true) {
// If the response wasn't successful, store the errors and return null.
if (isset($response->validationErrors)) {
$error = implode(', ', $response->validationErrors);
} else if (isset($response->status->description)) {
$error = $response->status->description;
} else {
$error = get_string('invalidrequest', 'error');
}
$this->add_error($error);
return null;
}
if (isset($response->result)) {
$response = $response->result;
}
@@ -56,13 +56,13 @@
<td> {{{backpackweburl}}} </td>
<td>
{{#canmoveup}}
<a href="{{baseurl}}?id={{id}}&action=moveup">{{#pix}}t/up, core,{{#str}}moveup{{/str}}{{/pix}}</a>
<a href="{{baseurl}}?id={{id}}&sesskey={{sesskey}}&action=moveup">{{#pix}}t/up, core,{{#str}}moveup{{/str}}{{/pix}}</a>
{{/canmoveup}}
{{^canmoveup}}
{{#pix}}spacer, moodle{{/pix}}
{{/canmoveup}}
{{#canmovedown}}
<a href="{{baseurl}}?id={{id}}&action=movedown">{{#pix}}t/down, core,{{#str}}movedown{{/str}}{{/pix}}</a>
<a href="{{baseurl}}?id={{id}}&sesskey={{sesskey}}&action=movedown">{{#pix}}t/down, core,{{#str}}movedown{{/str}}{{/pix}}</a>
{{/canmovedown}}
{{^canmovedown}}
{{#pix}}spacer, moodle{{/pix}}
+26 -17
View File
@@ -34,15 +34,21 @@ $PAGE->set_url(new moodle_url('/blog/external_blogs.php'));
require_capability('moodle/blog:manageexternal', $context);
$delete = optional_param('delete', null, PARAM_INT);
$confirm = optional_param('confirm', false, PARAM_BOOL);
$strexternalblogs = get_string('externalblogs', 'blog');
$straddnewexternalblog = get_string('addnewexternalblog', 'blog');
$strblogs = get_string('blogs', 'blog');
$message = null;
if ($delete && confirm_sesskey()) {
$externalblog = $DB->get_record('blog_external', array('id' => $delete));
if ($externalblog->userid == $USER->id) {
$PAGE->set_title("{$strblogs}: {$strexternalblogs}");
$PAGE->set_pagelayout('standard');
if ($delete) {
$externalblog = $DB->get_record('blog_external', ['id' => $delete, 'userid' => $USER->id], '*', MUST_EXIST);
if ($confirm) {
require_sesskey();
// Delete the external blog.
$DB->delete_records('blog_external', array('id' => $delete));
@@ -60,23 +66,28 @@ if ($delete && confirm_sesskey()) {
$event = \core\event\blog_external_removed::create($eventparms);
$event->add_record_snapshot('blog_external', $externalblog);
$event->trigger();
$message = get_string('externalblogdeleted', 'blog');
redirect($PAGE->url, get_string('externalblogdeleted', 'blog'));
} else {
echo $OUTPUT->header();
echo $OUTPUT->heading("{$strexternalblogs}: " . s($externalblog->name), 2);
echo $OUTPUT->confirm(
get_string('deleteexternalblog', 'blog'),
new moodle_url($PAGE->url->out_omit_querystring(), ['delete' => $delete, 'confirm' => 1]),
$PAGE->url,
);
echo $OUTPUT->footer();
die;
}
}
$blogs = $DB->get_records('blog_external', array('userid' => $USER->id));
$PAGE->set_heading(fullname($USER));
$PAGE->set_title("$strblogs: $strexternalblogs");
$PAGE->set_pagelayout('standard');
echo $OUTPUT->header();
echo $OUTPUT->heading($strexternalblogs, 2);
if (!empty($message)) {
echo $OUTPUT->notification($message);
}
echo $OUTPUT->box_start('generalbox boxaligncenter');
if (!empty($blogs)) {
@@ -99,10 +110,8 @@ if (!empty($blogs)) {
$editurl = new moodle_url('/blog/external_blog_edit.php', array('id' => $blog->id));
$editicon = $OUTPUT->action_icon($editurl, new pix_icon('t/edit', get_string('editexternalblog', 'blog')));
$deletelink = new moodle_url('/blog/external_blogs.php', array('delete' => $blog->id, 'sesskey' => sesskey()));
$action = new confirm_action(get_string('externalblogdeleteconfirm', 'blog'));
$deleteicon = $OUTPUT->action_icon($deletelink, new pix_icon('t/delete', get_string('deleteexternalblog', 'blog')),
$action);
$deletelink = new moodle_url('/blog/external_blogs.php', ['delete' => $blog->id]);
$deleteicon = $OUTPUT->action_icon($deletelink, new pix_icon('t/delete', get_string('deleteexternalblog', 'blog')));
$table->data[] = new html_table_row(array($blog->name,
$blog->url,
+3 -3
View File
@@ -915,10 +915,10 @@ class core_calendar_external extends external_api {
$formoptions['eventtypes'] = $allowedeeventtypes;
if ($courseid) {
require_once($CFG->libdir . '/grouplib.php');
$groupcoursedata = groups_get_course_data($courseid);
if (!empty($groupcoursedata->groups)) {
$groupcoursedata = groups_get_all_groups($courseid);
if (!empty($groupcoursedata)) {
$formoptions['groups'] = [];
foreach ($groupcoursedata->groups as $groupid => $groupdata) {
foreach ($groupcoursedata as $groupid => $groupdata) {
$formoptions['groups'][$groupid] = $groupdata->name;
}
}
+4 -4
View File
@@ -3639,9 +3639,9 @@ function calendar_output_fragment_event_form($args) {
if (is_null($eventid)) {
if (!empty($courseid)) {
$groupcoursedata = groups_get_course_data($courseid);
$groupcoursedata = groups_get_all_groups($courseid);
$formoptions['groups'] = [];
foreach ($groupcoursedata->groups as $groupid => $groupdata) {
foreach ($groupcoursedata as $groupid => $groupdata) {
$formoptions['groups'][$groupid] = $groupdata->name;
}
}
@@ -3683,9 +3683,9 @@ function calendar_output_fragment_event_form($args) {
$formoptions['event'] = $event;
if (!empty($event->courseid)) {
$groupcoursedata = groups_get_course_data($event->courseid);
$groupcoursedata = groups_get_all_groups($event->courseid);
$formoptions['groups'] = [];
foreach ($groupcoursedata->groups as $groupid => $groupdata) {
foreach ($groupcoursedata as $groupid => $groupdata) {
$formoptions['groups'][$groupid] = $groupdata->name;
}
}
+40 -40
View File
@@ -41,8 +41,8 @@ final class rrule_manager_test extends \advanced_testcase {
global $DB;
$this->resetAfterTest();
// Set our timezone based on the timezone in the RFC's samples (US/Eastern).
$tz = 'US/Eastern';
// Set our timezone based on the timezone in the RFC's samples (America/New_York).
$tz = 'America/New_York';
$this->setTimezone($tz);
$timezone = new \DateTimeZone($tz);
// Create our event's DTSTART date based on RFC's samples (most commonly used in RFC is 1997-09-02 09:00:00 EDT).
@@ -685,8 +685,8 @@ final class rrule_manager_test extends \advanced_testcase {
// Change the start date for forever events to 9am of the 2nd day of the current month and year.
$this->change_event_startdate(date('Ym02\T090000'));
$startdatetime = new \DateTime(date('Y-m-d H:i:s', $this->event->timestart));
$startdate = new \DateTime(date('Y-m-d', $this->event->timestart));
$startdatetime = new \DateTime(date('Y-m-d H:i:s', $this->event->timestart), new \DateTimeZone('Australia/Perth'));
$startdate = new \DateTime(date('Y-m-d', $this->event->timestart), new \DateTimeZone('Australia/Perth'));
$offsetinterval = $startdatetime->diff($startdate, true);
$interval = new \DateInterval('P12M');
@@ -842,8 +842,8 @@ final class rrule_manager_test extends \advanced_testcase {
// Change the start date for forever events to 9am of the 2nd day of the current month and year.
$this->change_event_startdate(date('Ym02\T090000'));
$startdatetime = new \DateTime(date('Y-m-d H:i:s', $this->event->timestart));
$startdate = new \DateTime(date('Y-m-d', $this->event->timestart));
$startdatetime = new \DateTime(date('Y-m-d H:i:s', $this->event->timestart), new \DateTimeZone('Australia/Perth'));
$startdate = new \DateTime(date('Y-m-d', $this->event->timestart), new \DateTimeZone('Australia/Perth'));
$offsetinterval = $startdatetime->diff($startdate, true);
$interval = new \DateInterval('P12M');
@@ -1201,8 +1201,8 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_every_other_day_forever(): void {
global $DB;
// Change the start date for forever events to 9am of the current date in US/Eastern time.
$this->change_event_startdate(date('Ymd\T090000'), 'US/Eastern');
// Change the start date for forever events to 9am of the current date in America/New_York time.
$this->change_event_startdate(date('Ymd\T090000'), 'America/New_York');
$startdatetime = new \DateTime(date('Y-m-d H:i:s', $this->event->timestart));
$interval = new \DateInterval('P2D');
@@ -1271,7 +1271,7 @@ final class rrule_manager_test extends \advanced_testcase {
global $DB;
// Change our event's date to 01-01-1998, based on the example from the RFC.
$this->change_event_startdate('19980101T090000', 'US/Eastern');
$this->change_event_startdate('19980101T090000', 'America/New_York');
$rrule = 'FREQ=YEARLY;UNTIL=20000131T090000Z;BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA';
$mang = new rrule_manager($rrule);
@@ -1305,7 +1305,7 @@ final class rrule_manager_test extends \advanced_testcase {
global $DB;
// Change our event's date to 01-01-1998, based on the example from the RFC.
$this->change_event_startdate('19980101T090000', 'US/Eastern');
$this->change_event_startdate('19980101T090000', 'America/New_York');
$rrule = 'FREQ=DAILY;UNTIL=20000131T090000Z;BYMONTH=1';
$mang = new rrule_manager($rrule);
@@ -1403,8 +1403,8 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_every_other_week_forever(): void {
global $DB;
// Change the start date for forever events to 9am of the current date in US/Eastern time.
$this->change_event_startdate(date('Ymd\T090000'), 'US/Eastern');
// Change the start date for forever events to 9am of the current date in America/New_York time.
$this->change_event_startdate(date('Ymd\T090000'), 'America/New_York');
$interval = new \DateInterval('P2W');
@@ -1614,7 +1614,7 @@ final class rrule_manager_test extends \advanced_testcase {
global $DB;
// Change our event's date to 05-09-1997, based on the example from the RFC.
$startdatetime = $this->change_event_startdate('19970905T090000', 'US/Eastern');
$startdatetime = $this->change_event_startdate('19970905T090000', 'America/New_York');
$startdate = new \DateTime(date('Y-m-d', $this->event->timestart));
$offsetinterval = $startdatetime->diff($startdate, true);
@@ -1650,7 +1650,7 @@ final class rrule_manager_test extends \advanced_testcase {
global $DB;
// Change our event's date to 05-09-1997, based on the example from the RFC.
$startdatetime = $this->change_event_startdate('19970905T090000', 'US/Eastern');
$startdatetime = $this->change_event_startdate('19970905T090000', 'America/New_York');
$startdate = new \DateTime(date('Y-m-d', $this->event->timestart));
$offsetinterval = $startdatetime->diff($startdate, true);
@@ -1688,7 +1688,7 @@ final class rrule_manager_test extends \advanced_testcase {
global $DB;
// Change our event's date to 05-09-1997, based on the example from the RFC.
$startdatetime = $this->change_event_startdate('19970907T090000', 'US/Eastern');
$startdatetime = $this->change_event_startdate('19970907T090000', 'America/New_York');
$startdate = new \DateTime(date('Y-m-d', $this->event->timestart));
$offsetinterval = $startdatetime->diff($startdate, true);
@@ -1731,7 +1731,7 @@ final class rrule_manager_test extends \advanced_testcase {
global $DB;
// Change our event's date to 05-09-1997, based on the example from the RFC.
$startdatetime = $this->change_event_startdate('19970922T090000', 'US/Eastern');
$startdatetime = $this->change_event_startdate('19970922T090000', 'America/New_York');
$startdate = new \DateTime($startdatetime->format('Y-m-d'));
$offsetinterval = $startdatetime->diff($startdate, true);
@@ -1773,7 +1773,7 @@ final class rrule_manager_test extends \advanced_testcase {
global $DB;
// Change our event's date to 28 September of the current year, based on the example from the RFC.
$this->change_event_startdate(date('Y0928\T090000'), 'US/Eastern');
$this->change_event_startdate(date('Y0928\T090000'), 'America/New_York');
$rrule = 'FREQ=MONTHLY;BYMONTHDAY=-3';
$mang = new rrule_manager($rrule);
@@ -1859,7 +1859,7 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_every_first_and_last_day_of_the_month_10_count(): void {
global $DB;
$startdatetime = $this->change_event_startdate('19970930T090000', 'US/Eastern');
$startdatetime = $this->change_event_startdate('19970930T090000', 'America/New_York');
$startdate = new \DateTime($startdatetime->format('Y-m-d'));
$offsetinterval = $startdatetime->diff($startdate, true);
@@ -1904,7 +1904,7 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_every_18_months_days_10_to_15_10_count(): void {
global $DB;
$startdatetime = $this->change_event_startdate('19970910T090000', 'US/Eastern');
$startdatetime = $this->change_event_startdate('19970910T090000', 'America/New_York');
$rrule = 'FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15';
$mang = new rrule_manager($rrule);
@@ -1949,9 +1949,9 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_every_tuesday_every_other_month_forever(): void {
global $DB;
// Change the start date for forever events to 9am of the Tuesday on or before of the current date in US/Eastern time.
// Change the start date for forever events to 9am of the Tuesday on or before of the current date in America/New_York time.
$nexttuesday = new \DateTime('next Tuesday');
$this->change_event_startdate($nexttuesday->format('Ymd\T090000'), 'US/Eastern');
$this->change_event_startdate($nexttuesday->format('Ymd\T090000'), 'America/New_York');
$rrule = 'FREQ=MONTHLY;INTERVAL=2;BYDAY=TU';
$mang = new rrule_manager($rrule);
@@ -2004,7 +2004,7 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_yearly_in_june_july_10_count(): void {
global $DB;
$startdatetime = $this->change_event_startdate('19970610T090000', 'US/Eastern');
$startdatetime = $this->change_event_startdate('19970610T090000', 'America/New_York');
$rrule = 'FREQ=YEARLY;COUNT=10;BYMONTH=6,7';
$mang = new rrule_manager($rrule);
@@ -2047,7 +2047,7 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_every_other_year_in_june_july_10_count(): void {
global $DB;
$startdatetime = $this->change_event_startdate('19970310T090000', 'US/Eastern');
$startdatetime = $this->change_event_startdate('19970310T090000', 'America/New_York');
$rrule = 'FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3';
$mang = new rrule_manager($rrule);
@@ -2094,7 +2094,7 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_every_3_years_1st_100th_200th_days_10_count(): void {
global $DB;
$startdatetime = $this->change_event_startdate('19970101T090000', 'US/Eastern');
$startdatetime = $this->change_event_startdate('19970101T090000', 'America/New_York');
$rrule = 'FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200';
$mang = new rrule_manager($rrule);
@@ -2144,7 +2144,7 @@ final class rrule_manager_test extends \advanced_testcase {
// Change our event's date to the 20th Monday of the current year.
$twentiethmonday = new \DateTime(date('Y-01-01'));
$twentiethmonday->modify('+20 Monday');
$startdatetime = $this->change_event_startdate($twentiethmonday->format('Ymd\T000000'), 'US/Eastern');
$startdatetime = $this->change_event_startdate($twentiethmonday->format('Ymd\T000000'), 'America/New_York');
$interval = new \DateInterval('P1Y');
@@ -2190,7 +2190,7 @@ final class rrule_manager_test extends \advanced_testcase {
// Change our event's date to the start of the 20th week of the current year.
$twentiethweek = new \DateTime(date('Y-01-01'));
$twentiethweek->setISODate($twentiethweek->format('Y'), 20);
$startdatetime = $this->change_event_startdate($twentiethweek->format('Ymd\T090000'), 'US/Eastern');
$startdatetime = $this->change_event_startdate($twentiethweek->format('Ymd\T090000'), 'America/New_York');
$startdate = clone($startdatetime);
$startdate->modify($startdate->format('Y-m-d'));
@@ -2237,9 +2237,9 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_every_thursday_in_march_forever(): void {
global $DB;
// Change our event's date to the first Thursday of March of the current year at 9am US/Eastern time.
// Change our event's date to the first Thursday of March of the current year at 9am America/New_York time.
$firstthursdayofmarch = new \DateTime('first Thursday of March');
$startdatetime = $this->change_event_startdate($firstthursdayofmarch->format('Ymd\T090000'), 'US/Eastern');
$startdatetime = $this->change_event_startdate($firstthursdayofmarch->format('Ymd\T090000'), 'America/New_York');
$interval = new \DateInterval('P1Y');
@@ -2296,9 +2296,9 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_every_thursday_june_july_august_forever(): void {
global $DB;
// Change our event's date to the first Thursday of June in the current year at 9am US/Eastern time.
// Change our event's date to the first Thursday of June in the current year at 9am America/New_York time.
$firstthursdayofjune = new \DateTime('first Thursday of June');
$startdatetime = $this->change_event_startdate($firstthursdayofjune->format('Ymd\T090000'), 'US/Eastern');
$startdatetime = $this->change_event_startdate($firstthursdayofjune->format('Ymd\T090000'), 'America/New_York');
$startdate = new \DateTime($startdatetime->format('Y-m-d'));
@@ -2353,8 +2353,8 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_friday_the_thirteenth_forever(): void {
global $DB;
// Change our event's date to the first Thursday of June in the current year at 9am US/Eastern time.
$this->change_event_startdate(date('Ymd\T090000'), 'US/Eastern');
// Change our event's date to the first Thursday of June in the current year at 9am America/New_York time.
$this->change_event_startdate(date('Ymd\T090000'), 'America/New_York');
$rrule = 'FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13';
$mang = new rrule_manager($rrule);
@@ -2390,10 +2390,10 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_first_saturday_following_first_sunday_forever(): void {
global $DB;
// Change our event's date to the next Saturday after the first Sunday of the the current month at 9am US/Eastern time.
// Change our event's date to the next Saturday after the first Sunday of the current month at 9am America/New_York time.
$firstsaturdayafterfirstsunday = new \DateTime('first Sunday of this month');
$firstsaturdayafterfirstsunday->modify('next Saturday');
$startdatetime = $this->change_event_startdate($firstsaturdayafterfirstsunday->format('Ymd\T090000'), 'US/Eastern');
$startdatetime = $this->change_event_startdate($firstsaturdayafterfirstsunday->format('Ymd\T090000'), 'America/New_York');
$startdate = new \DateTime($startdatetime->format('Y-m-d'));
$offset = $startdatetime->diff($startdate, true);
@@ -2451,7 +2451,7 @@ final class rrule_manager_test extends \advanced_testcase {
$electiondate->modify('+1 Tuesday');
// Use the most recent election date as the starting date of our recurring events.
$startdatetime = $this->change_event_startdate($electiondate->format('Ymd\T090000'), 'US/Eastern');
$startdatetime = $this->change_event_startdate($electiondate->format('Ymd\T090000'), 'America/New_York');
$startdate = new \DateTime($startdatetime->format('Y-m-d'));
$offset = $startdatetime->diff($startdate, true);
@@ -2494,7 +2494,7 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_monthly_bysetpos_3_count(): void {
global $DB;
$this->change_event_startdate('19970904T090000', 'US/Eastern');
$this->change_event_startdate('19970904T090000', 'America/New_York');
$rrule = 'FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3';
$mang = new rrule_manager($rrule);
@@ -2531,7 +2531,7 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_second_to_the_last_weekday_of_the_month(): void {
global $DB;
$this->change_event_startdate('19970929T090000', 'US/Eastern');
$this->change_event_startdate('19970929T090000', 'America/New_York');
$rrule = 'FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2;COUNT=7';
$mang = new rrule_manager($rrule);
@@ -2756,7 +2756,7 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_weekly_byday_with_wkst_mo(): void {
global $DB;
$this->change_event_startdate('19970805T090000', 'US/Eastern');
$this->change_event_startdate('19970805T090000', 'America/New_York');
$rrule = 'FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO';
$mang = new rrule_manager($rrule);
@@ -2789,7 +2789,7 @@ final class rrule_manager_test extends \advanced_testcase {
public function test_weekly_byday_with_wkst_su(): void {
global $DB;
$this->change_event_startdate('19970805T090000', 'US/Eastern');
$this->change_event_startdate('19970805T090000', 'America/New_York');
$rrule = 'FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU';
$mang = new rrule_manager($rrule);
@@ -2869,7 +2869,7 @@ final class rrule_manager_test extends \advanced_testcase {
* Change the event's timestart (DTSTART) based on the test's needs.
*
* @param string $datestr The date string. In 'Ymd\This' format. e.g. 19990902T090000.
* @param null|string $timezonestr A valid timezone string. e.g. 'US/Eastern'.
* @param null|string $timezonestr A valid timezone string. e.g. 'America/New_York'.
* If not provided, the default timezone will be used.
* @return bool|DateTime
*/
+6
View File
@@ -405,6 +405,12 @@ class core_cohort_external extends external_api {
$results = $results + cohort_get_available_cohorts($context, COHORT_ALL, $limitfrom, $limitnum, $query);
}
} else if ($includes == 'all') {
$contextsystem = context_system::instance();
if (!$context instanceof context_system &&
!has_any_capability(['moodle/cohort:view', 'moodle/cohort:manage'], $contextsystem)) {
throw new required_capability_exception($contextsystem, 'moodle/cohort:view', 'nopermissions', '');
}
$results = cohort_get_all_cohorts($limitfrom, $limitnum, $query);
$results = $results['cohorts'];
} else {
+16 -6
View File
@@ -672,6 +672,7 @@ final class externallib_test extends externallib_advanced_testcase {
role_assign($userrole, $catuser->id, $catcontext->id);
// Enrol user in the course.
$this->getDataGenerator()->enrol_user($creator->id, $course->id);
$this->getDataGenerator()->enrol_user($courseuser->id, $course->id, 'courserole');
$syscontext = array('contextid' => \context_system::instance()->id);
@@ -758,18 +759,27 @@ final class externallib_test extends externallib_advanced_testcase {
$this->assertCount(4, $result['cohorts']);
// A user in the course context with the system cohort:view capability. Check that all the system cohorts are returned.
$this->setUser($courseuser);
$result = core_cohort_external::search_cohorts("Cohortsearch", $coursecontext, 'all');
$this->assertCount(2, $result['cohorts']);
$this->assertEquals('Cohortsearch 1', $result['cohorts'][$cohort1->id]->name);
$this->assertCount(4, $result['cohorts']);
// A user in the course context without the ability to view system cohorts.
$this->setUser($courseuser);
try {
$result = core_cohort_external::search_cohorts("Cohortsearch", $coursecontext, 'all');
$this->fail('Exception expected');
} catch (\Throwable $e) {
$this->assertInstanceOf(\required_capability_exception::class, $e);
$this->assertStringContainsString('(View site-wide cohorts)', $e->getMessage());
}
// Detect invalid parameter $includes.
$this->setUser($creator);
try {
$result = core_cohort_external::search_cohorts("Cohortsearch", $syscontext, 'invalid');
$this->fail('Invalid parameter includes');
} catch (\coding_exception $e) {
// All good.
$this->fail('Exception expected');
} catch (\Throwable $e) {
$this->assertInstanceOf(\coding_exception::class, $e);
$this->assertStringContainsString('Invalid parameter value for \'includes\'', $e->getMessage());
}
}
}
@@ -1,4 +1,4 @@
@core @core_contentbank @core_h5p @contenttype_h5p @_switch_iframe @javascript
@core @core_contentbank @core_h5p @contenttype_h5p @_switch_iframe
Feature: H5P file upload to content bank for admins
In order import new H5P content to content bank
As an admin
@@ -16,6 +16,7 @@ Feature: H5P file upload to content bank for admins
And I expand "Site pages" node
And I click on "Content bank" "link"
@javascript
Scenario: Admins can upload .h5p extension files to content bank
Given I should not see "filltheblanks.h5p"
When I click on "Upload" "link"
@@ -27,6 +28,7 @@ Feature: H5P file upload to content bank for admins
And I wait until the page is ready
Then I should see "filltheblanks.h5p"
@javascript
Scenario: Admins can see uploaded H5P contents
Given I should not see "filltheblanks.h5p"
When I click on "Upload" "link"
@@ -40,6 +42,7 @@ Feature: H5P file upload to content bank for admins
And I switch to "h5p-iframe" class iframe
Then I should see "Of which countries"
@javascript
Scenario: Users can't see content managed by disabled plugins
Given I click on "Upload" "link"
And I click on "Choose a file..." "button"
@@ -55,6 +58,7 @@ Feature: H5P file upload to content bank for admins
When I navigate to "Plugins > Content bank" in site administration
Then I should not see "filltheblanks.h5p"
@javascript
Scenario: Contents in a context are not available from other contexts
Given the following "courses" exist:
| fullname | shortname | category |
@@ -75,6 +79,7 @@ Feature: H5P file upload to content bank for admins
And I click on "Content bank" "link"
And I should not see "filltheblanks.h5p"
@javascript
Scenario: Admins can upload and deployed content types when libraries are not installed
Given I navigate to "H5P > Manage H5P content types" in site administration
And I should not see "Fill in the Blanks"
@@ -95,6 +100,7 @@ Feature: H5P file upload to content bank for admins
And I navigate to "H5P > Manage H5P content types" in site administration
And I should see "Fill in the Blanks"
@javascript
Scenario: Uploading invalid packages throws error
Given the following "user private files" exist:
| user | filepath |
@@ -122,3 +128,28 @@ Feature: H5P file upload to content bank for admins
And I wait until the page is ready
And I should see "It is not possible to unzip it"
And I should not see "Sorry, this file is not valid"
@_file_upload @javascript
Scenario: Uploading invalid file types is not allowed
Given I am on the "Content bank" page logged in as "admin"
When I click on "Upload" "link"
And I click on "Choose a file..." "button"
And I click on "Upload a file" "link" in the ".fp-repo-area" "css_element"
And I set the field "Attachment" to "#dirroot#/course/tests/fixtures/image.jpg"
And I press "Upload this file"
# Confirm that jpg files cannot be added to content bank.
Then "Image (JPEG) filetype cannot be accepted." "text" should exist
And I click on "OK" "button" in the "Error" "dialogue"
And I click on "Close" "button" in the "File picker" "dialogue"
And I click on "Cancel" "button" in the "Upload" "dialogue"
# Confirm that jpg file was not added to the content bank.
And "No content available" "text" should exist
And I should not see "1.jpg"
Scenario: File upload for content bank can be disabled by admin
Given I log in as "admin"
And I navigate to "Plugins > Content bank > Manage content types" in site administration
When I follow "Disable"
And I am on the "Content bank" page
# Confirm that "Upload" does not exist after admin disabled from Plugins > Content bank > Manage content types.
Then "Upload" "link" should not exist
@@ -0,0 +1,38 @@
@core @core_contentbank @core_h5p @contentbank_h5p
Feature: Content bank contents are retained when course is restored
In order to restore content bank contents
As a manager
I need to be able to restore course containing the content bank
Background:
Given the following "courses" exist:
| fullname | shortname |
| Course 1 | C1 |
And the following "course enrolments" exist:
| user | course | role |
| admin | C1 | editingteacher |
And the following "contentbank content" exist:
| contextlevel | reference | contenttype | user | contentname | filepath |
| Course | C1 | contenttype_h5p | admin | filltheblanks.h5p | /h5p/tests/fixtures/filltheblanks.h5p |
And I log in as "admin"
And I am on "Course 1" course homepage with editing mode on
And the following config values are set as admin:
| unaddableblocks | | theme_boost|
# TODO MDL-57120 site "Content bank" link not accessible without navigation block.
And I add the "Navigation" block if not present
@javascript
Scenario: Deleted courses with content banks can be restored
Given I navigate to "Courses > Manage courses and categories" in site administration
And I click on "delete" action for "Course 1" in management course listing
And I click on "Delete" "button" in the "Confirm" "dialogue"
And I press "Continue"
And I navigate to "Recycle bin" in current page administration
And I click on "Restore" "link" in the "Course 1" "table_row"
And I am on "Course 1" course homepage
And I expand "Site pages" node
When I click on "Content bank" "link"
And I click on "filltheblanks.h5p" "link"
And I switch to "h5p-player" class iframe
And I switch to "h5p-iframe" class iframe
Then I should see "Of which countries are Berlin, Washington, Beijing, Canberra and Brasilia the capitals?"
+23 -4
View File
@@ -941,6 +941,8 @@ class core_course_external extends external_api {
$params = self::validate_parameters(self::create_courses_parameters(),
array('courses' => $courses));
$courseconfig = get_config('moodlecourse');
$availablethemes = core_component::get_plugin_list('theme');
$availablelangs = get_string_manager()->get_list_of_translations();
@@ -967,6 +969,14 @@ class core_course_external extends external_api {
throw new moodle_exception('errorinvalidparam', 'webservice', '', 'shortname');
}
// Make sure start/end date are correctly set.
if (!array_key_exists('startdate', $course)) {
$course['startdate'] = usergetmidnight(time());
}
if (!array_key_exists('enddate', $course) && $courseconfig->courseenddateenabled) {
$course['enddate'] = $course['startdate'] + $courseconfig->courseduration;
}
// Make sure lang is valid
if (array_key_exists('lang', $course)) {
if (empty($availablelangs[$course['lang']])) {
@@ -988,6 +998,8 @@ class core_course_external extends external_api {
}
}
$course['showactivitydates'] = $courseconfig->showactivitydates;
//force visibility if ws user doesn't have the permission to set it
$category = $DB->get_record('course_categories', array('id' => $course['categoryid']));
if (!has_capability('moodle/course:visibility', $context)) {
@@ -995,7 +1007,6 @@ class core_course_external extends external_api {
}
//set default value for completion
$courseconfig = get_config('moodlecourse');
if (completion_info::is_enabled_for_site()) {
if (!array_key_exists('enablecompletion', $course)) {
$course['enablecompletion'] = $courseconfig->enablecompletion;
@@ -4252,7 +4263,7 @@ class core_course_external extends external_api {
self::validate_context($usercontext);
if ($userid != $USER->id and !has_capability('moodle/user:viewdetails', $usercontext)) {
if ($userid != $USER->id && !has_capability('moodle/user:viewalldetails', $usercontext)) {
return array();
}
@@ -4602,9 +4613,17 @@ class core_course_external extends external_api {
$coursecontext = context_course::instance($courseid);
self::validate_context($coursecontext);
$activeplugin = get_config('core', 'activitychooseractivefooter');
// The active plugin must be set, and be present on the site.
$activeplugin = clean_param(
get_config('core', 'activitychooseractivefooter'),
PARAM_COMPONENT,
);
if ($activeplugin !== COURSE_CHOOSER_FOOTER_NONE) {
if (
$activeplugin !== COURSE_CHOOSER_FOOTER_NONE &&
!empty($activeplugin) &&
core_component::get_component_directory($activeplugin) !== null
) {
$footerdata = component_callback($activeplugin, 'custom_chooser_footer', [$courseid, $sectionid]);
return [
'footer' => true,
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -422,8 +422,10 @@ export default class {
* @param {array} cmIds the list of course modules ids
* @param {bool} complete the new completion value
*/
cmCompletion(stateManager, cmIds, complete) {
async cmCompletion(stateManager, cmIds, complete) {
const newState = (complete) ? 1 : 0;
const action = (newState == 1) ? 'cm_complete' : 'cm_uncomplete';
const logEntry = this._getLoggerEntry(stateManager, action, cmIds);
stateManager.setReadOnly(false);
cmIds.forEach((id) => {
const element = stateManager.get('cm', id);
@@ -433,6 +435,7 @@ export default class {
}
});
stateManager.setReadOnly(true);
stateManager.addLoggerEntry(await logEntry);
}
/**
@@ -150,47 +150,3 @@ Feature: Course index completion icons
| 1 | False |
When I am on the "C1" "Course" page logged in as "student1"
And "Done" "icon" should exist in the "courseindex-content" "region"
@javascript
Scenario: Activities with custom completion rules could fail
Given the following "activity" exists:
| activity | scorm |
| course | C1 |
| name | Music history |
| packagefilepath | mod/scorm/tests/packages/RuntimeMinimumCalls_SCORM12-mini.zip |
| maxattempt | 1 |
| latattemptlock | 1 |
# Add requirements
| completion | 2 |
| completionscorerequired | 90 |
Given I am on the "Music history" "scorm activity" page logged in as student1
# We need a little taller window because Firefox is, apparently, unable to auto-scroll within
# an iframe, so we need to ensure that the "Save changes" button is visible in the viewport.
And I change window size to "large"
And I press "Enter"
And I switch to the main frame
And I click on "Par?" "list_item"
And I switch to "scorm_object" iframe
And I wait until the page is ready
And I switch to the main frame
And I click on "Keeping Score" "list_item"
And I switch to "scorm_object" iframe
And I wait until the page is ready
And I switch to the main frame
And I click on "Other Scoring Systems" "list_item"
And I switch to "scorm_object" iframe
And I wait until the page is ready
And I switch to the main frame
And I click on "The Rules of Golf" "list_item"
And I switch to "scorm_object" iframe
And I wait until the page is ready
And I switch to the main frame
And I click on "Playing Golf Quiz" "list_item"
And I switch to "scorm_object" iframe
And I wait until the page is ready
And I click on "[id='question_com.scorm.golfsamples.interactions.playing_1_1']" "css_element"
And I press "Submit Answers"
And I wait until "Score: 20" "text" exists
And I switch to the main frame
And I click on "Exit activity" "link"
And "Failed" "icon" should exist in the "courseindex-content" "region"
+8 -1
View File
@@ -1156,7 +1156,14 @@ class core_course_renderer extends plugin_renderer_base {
// This is a request for the course information.
$courseid = required_param('courseid', PARAM_INT);
$course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
$course = $DB->get_record('course', ['id' => $courseid], '*', IGNORE_MISSING);
if ($course === false) {
throw new \moodle_exception('invalidcourseid');
}
$coursecontext = context_course::instance($course->id, MUST_EXIST);
if ($course->visible == 0 && !has_capability('moodle/course:viewhiddencourses', $coursecontext)) {
throw new \moodle_exception('invalidcourseid');
}
$chelper = new coursecat_helper();
$chelper->set_show_courses(self::COURSECAT_SHOW_COURSES_EXPANDED);
+6
View File
@@ -3850,6 +3850,12 @@ final class externallib_test extends externallib_advanced_testcase {
$this->assignUserCapability('moodle/user:viewdetails', $usercontext, $teacherroleid);
// Sorted by course id DESC.
// User without moodle/user:viewalldetails capability will not be able to see the course details.
$result = core_course_external::get_recent_courses($student->id);
$this->assertCount(0, $result);
// User with moodle/user:viewalldetails capability will be able to see the course details.
$this->assignUserCapability('moodle/user:viewalldetails', $usercontext, $teacherroleid);
$result = core_course_external::get_recent_courses($student->id);
$this->assertCount(1, $result);
$this->assertEquals($courses[0]->id, array_shift($result)->id);
+14
View File
@@ -259,6 +259,20 @@ class tool_provider extends ToolProvider {
// Get the updated user record.
$user = $DB->get_record('user', ['id' => $user->id]);
} else {
if ($dbuser->suspended) {
require_once($CFG->libdir . '/authlib.php');
$failurereason = AUTH_LOGIN_SUSPENDED;
$event = \core\event\user_login_failed::create([
'userid' => $dbuser->id,
'other' => [
'username' => $dbuser->username,
'reason' => $failurereason
]
]);
$event->trigger();
throw new moodle_exception('invalidlogin', 'core');
}
if (helper::user_match($user, $dbuser)) {
$user = $dbuser;
} else {
+15
View File
@@ -76,6 +76,16 @@ class gradingform_guide_renderer extends plugin_renderer_base {
$criterion[$key] = '';
}
}
// Set a default description format if not set.
if (!array_key_exists('descriptionformat', $criterion)) {
$criterion['descriptionformat'] = FORMAT_MOODLE;
}
// Set a default description markers format if not set.
if (!array_key_exists('descriptionmarkersformat', $criterion)) {
$criterion['descriptionmarkersformat'] = FORMAT_MOODLE;
}
}
$criteriontemplate = html_writer::start_tag('tr', array('class' => 'criterion'. $criterion['class'],
@@ -398,6 +408,11 @@ class gradingform_guide_renderer extends plugin_renderer_base {
'title' => get_string('clicktocopy', 'gradingform_guide'),
'id' => '{NAME}[comments][{COMMENT-id}]', 'class'=>'markingguidecomment'));
} else {
// Set a default description format if not set.
if (!array_key_exists('descriptionformat', $comment)) {
$comment['descriptionformat'] = FORMAT_MOODLE;
}
$description = format_text($comment['description'], $comment['descriptionformat']);
}
// Retain newlines as <br> tags when displaying 'frequently used comments'.
@@ -0,0 +1,104 @@
@gradingform @gradingform_guide
Feature: Marking guide criterion can be edited and replaced
In order to edit and replace a marking guide criterion
As a teacher
I need to have an existing marking guide criterion
Background:
Given the following "users" exist:
| username | firstname | lastname | email |
| teacher1 | Teacher | 1 | teacher1@example.com |
| student1 | Student | 1 | student1@example.com |
And the following "courses" exist:
| fullname | shortname | format |
| Course 1 | C1 | topics |
And the following "course enrolments" exist:
| user | course | role |
| teacher1 | C1 | editingteacher |
| student1 | C1 | student |
And the following "activities" exist:
| activity | course | name | advancedgradingmethod_submissions | assignsubmission_onlinetext_enabled |
| assign | C1 | Assign 1 | guide | 1 |
And I am on the "Course 1" course page logged in as teacher1
And I go to "Assign 1" advanced grading definition page
And I set the following fields to these values:
| Name | Assign 1 marking guide |
| Description | Marking guide description |
And I define the following marking guide:
| Criterion name | Description for students | Description for markers | Maximum score |
| Grade Criteria 1 | Grade 1 description for students | Grade 1 description for markers | 70 |
| Grade Criteria 2 | Grade 2 description for students | Grade 2 description for markers | 30 |
And I define the following frequently used comments:
| Comment 1 |
| Comment 2 |
| Comment 3 |
And I press "Save marking guide and make it ready"
And the following "mod_assign > submissions" exist:
| assign | user | onlinetext |
| Assign 1 | student1 | I'm the student first submission |
And I am on the "Assign 1" "assign activity" page
And I go to "Student 1" "Assign 1" activity advanced grading page
And I grade by filling the marking guide with:
| Grade Criteria 1 | 50 | Comment 1 |
| Grade Criteria 2 | 20 | Comment 2 |
And I press "Save changes"
@javascript
Scenario: Marking guide frequently used comments can be updated and reordered
Given I go to "Assign 1" advanced grading definition page
And I click on "Move up" "button" in the "Comment 3" "table_row"
And I click on "Move down" "button" in the "Comment 1" "table_row"
When I press "Save"
# Confirm that the order of the frequently used comments are updated.
Then "Comment 3" "text" should appear before "Comment 1" "text"
And "Comment 2" "text" should appear after "Comment 1" "text"
And I am on the "Assign 1" "assign activity" page
And I go to "Student 1" "Assign 1" activity advanced grading page
# Confirm that there are no changes to the existing marking records.
And I should see "Comment 1" in the "Grade Criteria 1" "table_row"
And I should see "Comment 2" in the "Grade Criteria 2" "table_row"
@javascript
Scenario: Marking guide criterion can be modified
Given I go to "Assign 1" advanced grading definition page
And I click on "Delete criterion" "button" in the "Grade Criteria 1" "table_row"
And I press "Yes"
And I wait "1" seconds
And I should not see "Grade Criteria 1"
And I press "Add criterion"
# Used xpath_element selectors in order to differentiate multiple criterion fields.
And I click on "//table[@id='guide-criteria']//tr[@class='criterion odd last']//div[@class='criterionname']" "xpath_element"
# Set the new criterion name.
And I set the field with xpath "//input[@id='guide-criteria-NEWID1-shortname']" to "Grade Criteria 3"
And I click on "//table[@id='guide-criteria']//tr[@class='criterion odd last']//div[@class='criteriondesc']//span[@class='textvalue']" "xpath_element"
# Set the new criterion description for students.
And I set the field with xpath "//textarea[@id='guide[criteria][NEWID1][description]']" to "Grade 3 description for students"
And I click on "//table[@id='guide-criteria']//tr[@class='criterion odd last']//div[@class='criteriondescmarkers']//span[@class='textvalue']" "xpath_element"
# Set the new criterion description for markers.
And I set the field with xpath "//textarea[@id='guide[criteria][NEWID1][descriptionmarkers]']" to "Grade 3 description for markers"
And I click on "//table[@id='guide-criteria']//tr[@class='criterion odd last']//div[@class='criterionmaxscore']//span[@class='textvalue']" "xpath_element"
# Set the new criterion max score.
And I set the field with xpath "//input[@id='guide[criteria][NEWID1][maxscore]']" to "70"
When I press "Save"
Then "You are about to save significant changes to a marking guide that has already been used for grading. The gradebook value will be unchanged, but the marking guide will be hidden from students until their item is regraded." "text" should exist
And I press "Continue"
And I am on the "Assign 1" "assign activity" page logged in as student1
# Confirm that the remarks for each grading criterion are not displayed.
And "Comment 1" "text" should not exist
And "Comment 2" "text" should not exist
# Confirm that the submission is not regraded.
And I should see "70.00 / 100.00"
# Regrade the submission.
And I am on the "Course 1" course page logged in as teacher1
And I go to "Student 1" "Assign 1" activity advanced grading page
And I grade by filling the marking guide with:
| Grade Criteria 2 | 15 | Comment 3 |
| Grade Criteria 3 | 50 | Comment 2 |
And I press "Save changes"
And I am on the "Assign 1" "assign activity" page logged in as student1
# Confirm that submission is re-marked and regraded.
And I should see "65.00 / 100.00"
And I should see the marking guide information displayed as:
| criteria | description | remark | maxscore | criteriascore |
| Grade Criteria 2 | Grade 2 description for students | Comment 3 | 30 | 15 / 30 |
| Grade Criteria 3 | Grade 3 description for students | Comment 2 | 70 | 50 / 70 |
@@ -0,0 +1,44 @@
@gradingform @gradingform_guide
Feature: Verify listings and grading submissions
In order to verify grade listing
As a teacher
I need to be able to see grades in the correct column
Background:
Given the following "users" exist:
| username | firstname | lastname | email |
| student | Student | One | one@example.com |
| teacher | Teacher | One | t1@example.com |
And the following "courses" exist:
| shortname | fullname |
| C1 | Course 1 |
And the following "course enrolments" exist:
| user | course | role |
| student | C1 | student |
| teacher | C1 | editingteacher |
And the following "activities" exist:
| activity | name | course | advancedgradingmethod_submissions | assignsubmission_onlinetext_enabled |
| assign | Assign1 | C1 | guide | 1 |
And I am on the "Course 1" course page logged in as teacher
And I go to "Assign1" advanced grading definition page
And I set the following fields to these values:
| Name | Assign1 marking guide |
| Description | Marking guide description |
And I define the following marking guide:
| Criterion name | Description for students | Description for markers | Maximum score |
| Criteria 1 | Grade 1 description for students | Grade 1 description for markers | 100 |
And I press "Save marking guide and make it ready"
And the following "mod_assign > submissions" exist:
| assign | user | onlinetext |
| Assign1 | student | This is a submission for assignment |
@javascript
Scenario: Mark and view all grades in submissions table
Given I am on the "Assign1" "assign activity" page
And I click on "View all submission" "link"
And I click on "Grade" "link" in the "Student One" "table_row"
And I grade by filling the marking guide with:
| Criteria 1 | 50 | Excellent work! |
And I press "Save changes"
When I follow "View all submissions"
Then "Student One" row "Grade" column of "generaltable" table should contain "50"
+10
View File
@@ -115,6 +115,16 @@ class gradingform_rubric_renderer extends plugin_renderer_base {
$descriptiontdparams['aria-label'] = get_string('criterion', 'gradingform_rubric', s($criterion['description']));
}
// Default value for criterion ids.
// Edge case: submitting empty grade when remark field is disabled.
// Reason: we need the criteria keys for the clear_attempt to clear the rubric fillings.
if ($mode == gradingform_rubric_controller::DISPLAY_EVAL) {
$criteriontemplate .= html_writer::empty_tag('input', [
'type' => 'hidden',
'name' => '{NAME}[criteria][{CRITERION-id}][]',
]);
}
// Description cell.
$criteriontemplate .= html_writer::tag('td', $description, $descriptiontdparams);
@@ -140,17 +140,21 @@ class provider implements
break;
default:
if (strpos($name, 'grade_report_grader_collapsed_categories') === 0) {
$prefname = 'grade_report_grader_collapsed_categories';
$prefname = $name;
$courseid = substr($name, strlen('grade_report_grader_collapsed_categories'));
$transformedvalue = $value;
$course = get_course($courseid);
$prefdescription = get_string(
'privacy:request:preference:'.$prefname,
'gradereport_grader',
(object) [
'name' => $course->fullname,
]
);
try {
$course = get_course($courseid);
$prefdescription = get_string(
'privacy:request:preference:grade_report_grader_collapsed_categories',
'gradereport_grader',
(object) [
'name' => $course->fullname,
]
);
} catch (\dml_missing_record_exception $exception) {
continue 2;
}
}
}
@@ -90,12 +90,22 @@ final class provider_test extends \core_privacy\tests\provider_testcase {
* Ensure that export_user_preferences returns preferences.
*/
public function test_export_user_preferences_multiple(): void {
// Create a course and add a user preference.
$user = $this->getDataGenerator()->create_user();
$this->setUser($user);
$course = $this->getDataGenerator()->create_course();
$collapsed = serialize(['aggregatesonly' => array(), 'gradesonly' => array()]);
set_user_preference('grade_report_grader_collapsed_categories'.$course->id, $collapsed, $user);
// Set preference for an invalid course.
set_user_preference('grade_report_grader_collapsed_categories42', serialize(['gradesonly' => []]));
// Set preferences for a couple of valid courses.
$courseone = $this->getDataGenerator()->create_course();
$courseonepreferencename = "grade_report_grader_collapsed_categories{$courseone->id}";
$courseonepreferencevalue = serialize(['aggregatesonly' => [], 'gradesonly' => []]);
set_user_preference($courseonepreferencename, $courseonepreferencevalue);
$coursetwo = $this->getDataGenerator()->create_course();
$coursetwopreferencename = "grade_report_grader_collapsed_categories{$coursetwo->id}";
$coursetwopreferencevalue = serialize(['gradesonly' => [], 'aggregatesonly' => []]);
set_user_preference($coursetwopreferencename, $coursetwopreferencevalue);
// Validate exported data.
provider::export_user_preferences($user->id);
@@ -104,10 +114,22 @@ final class provider_test extends \core_privacy\tests\provider_testcase {
$writer = writer::with_context($context);
$this->assertTrue($writer->has_any_data());
$prefs = $writer->get_user_preferences('gradereport_grader');
$this->assertCount(1, (array) $prefs);
$this->assertCount(2, (array) $prefs);
$this->assertEquals($courseonepreferencevalue, $prefs->{$courseonepreferencename}->value);
$this->assertEquals(
get_string('privacy:request:preference:grade_report_grader_collapsed_categories', 'gradereport_grader', ['name' => $course->fullname]),
$prefs->grade_report_grader_collapsed_categories->description
get_string('privacy:request:preference:grade_report_grader_collapsed_categories', 'gradereport_grader', [
'name' => $courseone->fullname,
]),
$prefs->{$courseonepreferencename}->description,
);
$this->assertEquals($coursetwopreferencevalue, $prefs->{$coursetwopreferencename}->value);
$this->assertEquals(
get_string('privacy:request:preference:grade_report_grader_collapsed_categories', 'gradereport_grader', [
'name' => $coursetwo->fullname,
]),
$prefs->{$coursetwopreferencename}->description,
);
}
}
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+3 -3
View File
@@ -20,11 +20,11 @@
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
* {@link https://moodledev.io/general/projects/api/amos}) using the
* list of strings defined in install/stringnames.txt file.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();

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