Compare commits

...

513 Commits

Author SHA1 Message Date
Eloy Lafuente (stronk7) e1ad263f90 Moodle release 3.11.4 2021-11-06 10:34:18 +01:00
Ilya Tregubov 107dc9be23 weekly release 3.11.3+ 2021-11-05 19:18:33 +02:00
Ilya Tregubov 59f7f1c961 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-11-05 19:18:30 +02:00
Huong Nguyen 7293a38647 MDL-71918 Calendar: Improve capability checks when fetching events 2021-11-05 13:15:41 +08:00
Jun Pataleta 91a51bbf24 Merge branch 'MDL-72667-311-fix' of https://github.com/lameze/moodle into MOODLE_311_STABLE 2021-11-05 12:44:47 +08:00
Simey Lameze 05f4ac39fa MDL-72667 assign: change overdue message to darker red 2021-11-05 12:42:11 +08:00
Jun Pataleta fa9632cb54 Merge branch 'MDL-72679-311' of git://github.com/HuongNV13/moodle into MOODLE_311_STABLE 2021-11-05 12:40:55 +08:00
Andrew Nicols d905332e97 Merge branch 'MDL-72990-311' of https://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-11-05 11:58:29 +08:00
Andrew Nicols ceba19a45c Merge branch 'MDL-71439_311' of https://github.com/mdjnelson/moodle into MOODLE_311_STABLE 2021-11-05 11:32:59 +08:00
Jun Pataleta 3dcfe5a4c0 Merge branch 'MDL-72688-311' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-11-05 11:23:43 +08:00
Víctor Déniz ddc368559d Merge branch 'MDL-72945-311' of git://github.com/sarjona/moodle into MOODLE_311_STABLE 2021-11-05 01:47:46 +00:00
Shamim Rezaie a7889e19ee MDL-72688 contentbank: Some accessibility improvements described below
- Label the table/list with aria-label
- Hide sort buttons from screen-readers and use aria-sort instead
- Remove the redundant title from decorative thumbnails
2021-11-05 12:46:05 +11:00
Shamim Rezaie eaaf4e9486 MDL-72688 contentbank: Add and maintain appropriate aria roles
Also moved header text into the sorting button as per the example at
https://dequeuniversity.com/library/aria/table-sortable
2021-11-05 12:46:05 +11:00
Víctor Déniz adc358399e Merge branch 'MDL-72969-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-11-05 01:19:37 +00:00
AMOS bot 55a21bfe31 Automatically generated installer lang files 2021-11-05 00:07:25 +00:00
Jun Pataleta 1cdea1f1ea Merge branch 'MDL-72667-311' of https://github.com/lameze/moodle into MOODLE_311_STABLE 2021-11-04 22:05:57 +08:00
Simey Lameze 7909173f5d MDL-72667 message: fix contrast issue in the drawer 2021-11-04 21:14:21 +08:00
Simey Lameze bf711cc097 MDL-72667 notifications: improve colour contrast 2021-11-04 21:06:01 +08:00
Simey Lameze 162751f709 MDL-72667 lesson: improve colour contrast of correct text 2021-11-04 21:04:44 +08:00
Simey Lameze 93dc1eb447 MDL-72667 assign: improve contrast of not graded text 2021-11-04 21:04:44 +08:00
Jun Pataleta e2e6731171 Merge branch 'MDL-72672-311' of https://github.com/junpataleta/moodle into MOODLE_311_STABLE 2021-11-04 18:23:00 +08:00
Simey Lameze 8c59e41bfa MDL-72672 lesson: make edit collapsed table responsive 2021-11-04 18:20:35 +08:00
Simey Lameze b1f87d5ef0 MDL-72672 lesson: make detailed stats table responsive 2021-11-04 18:20:35 +08:00
Simey Lameze b874c56751 MDL-72672 lesson: make attempts table responsive 2021-11-04 18:20:34 +08:00
Simey Lameze 4c4abafedc MDL-72672 lesson: add label for true/false checkboxes 2021-11-04 18:20:33 +08:00
Simey Lameze 36e2b9cd95 MDL-72672 lesson: add label for multichoice checkboxes 2021-11-04 18:20:32 +08:00
Simey Lameze 214c3994df MDL-72672 lesson: remove unnecessary nowrap
This commit also remove some deprecated table properties as well.
2021-11-04 18:20:31 +08:00
Simey Lameze 7e69d60652 MDL-72672 mod_lesson: add aria-label to actions select element 2021-11-04 18:20:30 +08:00
Sara Arjona cbc7cdb686 Merge branch 'MDL-72949-311' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_311_STABLE 2021-11-04 10:33:29 +01:00
Nathan Nguyen 41868f952b MDL-72679 qtype_ddmarker: Fix incorrect positions in multiple viewportss
Co-authored-by: Huong Nguyen <huongnv13@gmail.com>
2021-11-04 14:42:50 +07:00
Jun Pataleta 70bb50e3b7 Merge branch 'MDL-72668-311' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-11-04 12:04:01 +08:00
Shamim Rezaie c6f3ea3932 MDL-72990 badges: Use imagecaption as alternative text for badge image 2021-11-04 15:03:32 +11:00
Shamim Rezaie d0d82e9f34 MDL-72668 block_badges: Add alt attribute to badge images 2021-11-04 14:17:36 +11:00
Shamim Rezaie ced90c8a18 MDL-72668 core: Highlight the focused tree item in a tree. 2021-11-04 14:17:35 +11:00
Shamim Rezaie 6e5c04f6c5 MDL-72668 block_private_files: Switched from YUI to core/tree AMD 2021-11-04 14:17:33 +11:00
Víctor Déniz 99c7eacdeb Merge branch 'MDL-72895-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-11-04 01:47:38 +00:00
Paul Holden 7012c95569 MDL-70823 qtype_ddwtos: new method for safer feedback unserializing. 2021-11-03 16:57:15 +01:00
Paul Holden cdc80e6bfd MDL-70823 mod: safely parse module display options array. 2021-11-03 16:57:15 +01:00
Paul Holden 294fa223c9 MDL-70823 blocks: safer unserializing during block restore. 2021-11-03 16:57:15 +01:00
Paul Holden f8fed9810a MDL-70823 core: safer alternative for unserializing objects. 2021-11-03 16:57:14 +01:00
sangnguyena d01f8ac051 MDL-72949 WS: Return coursegraceperiod setting in tool_mobile_get_config 2021-11-03 16:12:13 +07:00
Ilya Tregubov 0316f650ed Merge branch 'MOODLE_311_MDL-72953' of https://github.com/golenkovm/moodle into MOODLE_311_STABLE 2021-11-03 10:34:47 +02:00
Andrew Nicols e504d7159c MDL-72894 courseexport: Whitespace fix 2021-11-03 16:11:27 +08:00
Andrew Nicols 98a784483a Merge branch 'MDL-72894-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-11-03 16:11:23 +08:00
Sara Arjona 72a7266a87 Merge branch 'MDL-72977-311' of https://github.com/juancs/moodle into MOODLE_311_STABLE 2021-11-03 09:04:00 +01:00
Ilya Tregubov 3cb24afce3 Merge branch 'MDL-71872-311' of https://github.com/HuongNV13/moodle into MOODLE_311_STABLE 2021-11-03 09:27:24 +02:00
Jun Pataleta 7bf69ea780 Merge branch 'MDL-72687-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-11-03 11:57:17 +08:00
Mikhail Golenkov 7552335ccf MDL-72953 core_lang: Add string for new timezone Pacific/Kanton 2021-11-03 11:43:14 +11:00
AMOS bot af5e30b2b2 Automatically generated installer lang files 2021-11-03 00:07:26 +00:00
Paul Holden 1cdacd7771 MDL-72370 badges: require sesskey to remove related badge. 2021-11-02 18:04:15 +01:00
Ilya Tregubov fa363b52eb MDL-70887 mlbackend_python: Update to latest version. 2021-11-02 18:04:15 +01:00
Simey Lameze 2a22a20251 MDL-72571 tool_filetypes: change extension param to PARAM_ALPHANUMEXT 2021-11-02 18:04:15 +01:00
Sara Arjona 5ce9c733ce Merge branch 'MDL-72857-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-11-02 18:01:06 +01:00
Eloy Lafuente (stronk7) 8ecf433c53 weekly release 3.11.3+ 2021-11-02 14:07:54 +01:00
Eloy Lafuente (stronk7) a4aefa9c98 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-11-02 14:07:49 +01:00
Juan Segarra Montesinos 40124ef728 MDL-72977 qtype_essay: Honor Information for graders text format. 2021-11-02 12:21:38 +01:00
Simey Lameze 66cf7b94db MDL-72687 assign: move labels for toggle zoom icons to the <a> 2021-11-02 13:55:25 +08:00
Simey Lameze 04e8993910 MDL-72687 assign: move labels for collapse buttons to the button 2021-11-02 13:55:25 +08:00
Simey Lameze 96ea7a04ed MDL-72687 assign: remove title attr from view all submissions link 2021-11-02 13:55:25 +08:00
Simey Lameze 7137b20762 MDL-72687 assign: move label from the edit settings icon to <a> 2021-11-02 13:55:25 +08:00
Simey Lameze 6cb38c56fa MDL-72687 assign: remove presentation role from profile image 2021-11-02 13:55:25 +08:00
Simey Lameze f619fb8df4 MDL-72687 assign: fix email and due date cut off whem zooming 2021-11-02 13:55:25 +08:00
Simey Lameze 994952712c MDL-72687 assign: fix colour picker broken aria menu 2021-11-02 13:55:25 +08:00
Simey Lameze 77a84ad325 MDL-72687 assign: fix stamp picker broken aria menu 2021-11-02 13:55:25 +08:00
Simey Lameze ea35916f09 MDL-72687 assign: fix change filter element tab navigation 2021-11-02 13:55:24 +08:00
Simey Lameze 380b565487 MDL-72687 assign: use correct aria role for toolbar 2021-11-02 13:55:24 +08:00
Simey Lameze fe7b49250d MDL-72687 assign: add missing label to change user element 2021-11-02 13:55:24 +08:00
Simey Lameze e0077b7175 MDL-72687 assign: display a more friendly link when not graded 2021-11-02 13:55:24 +08:00
Simey Lameze 210c80e48e MDL-72687 assign: add missing aria-label to prev/next arrows 2021-11-02 13:55:24 +08:00
Simey Lameze 6f1773b841 MDL-72687 form: only add legend tag if a label is set 2021-11-02 13:55:24 +08:00
Andrew Nicols eb6a7272f9 Merge branch 'MDL-72884-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-11-02 11:34:07 +08:00
Andrew Nicols 63f865a594 Merge branch 'MDL-72767-m311' of https://github.com/NeillM/moodle into MOODLE_311_STABLE 2021-11-02 11:28:43 +08:00
AMOS bot 1808fd1d22 Automatically generated installer lang files 2021-11-02 00:07:26 +00:00
Paul Holden 78f2c07d30 MDL-72969 output: correct ansi colour format codes for check results. 2021-11-01 17:12:05 +00:00
Huong Nguyen 521591639c MDL-71872 Questions: The placeholder disappears when double-clicking 2021-11-01 17:30:23 +07:00
Paul Holden 40451d3a90 MDL-72857 badges: filter site/course name when showing issued badge. 2021-11-01 10:20:52 +00:00
Neill Magill 137a1ef570 MDL-72767 forum: Stop duplicate digests being created
This change is to stop there being a possibility of 2 digests tasks
being created for a user on the day that MDL-72767 is applied.
2021-11-01 08:50:29 +00:00
Neill Magill 29f8071c3b MDL-72767 forum: Ensure digests are sent
Before this change if a new post was made after the digest time but
before todays daily digest had been sent the run time on the digest
would be set to the next day resulting in no digest being sent to
the user.

By adding the server midnight to the custom data on the task we
ensure that in this case a new adhoc task is created for the next
day leaving the current one to get processed.

Server midnight is used so that if the digest time setting is
changed we would not get two tasks queued for the same day.
2021-11-01 08:50:28 +00:00
Neill Magill 23f8a8b2d5 MDL-72767 forum: Fix PHPDoc 2021-11-01 08:50:28 +00:00
Andrew Nicols fcbb050b48 Merge branch 'MDL-72921_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-11-01 08:55:32 +08:00
AMOS bot 3dd0115779 Automatically generated installer lang files 2021-10-30 00:07:25 +00:00
Eloy Lafuente (stronk7) b97643453d MDL-72921 generators: exported users now match the plan size definition
Before this patch the exported users (to csv file that jmeter consumes)
were all the enrolled users in the test course. And that's ok when the
number of users enrolled match the number of concurrent threads planned
for a jmeter plan (each thread is a user).

But when both numbers don't match, that can lead to the jmeter plan
not behaving as expected, because it iterates over the excessive users
in the file, leading to some users having run 5 loops, others 4...

The only way to make results more consistent is to, always, ensure that
the number of users exported for the plan match the plan size and not
the site size.

And that's what this issue exactly does, restrict the export to the
number of threads that the plan will have. So every user always runs
the very same number of loops.
2021-10-29 18:03:44 +02:00
Eloy Lafuente (stronk7) ee1c3d9837 weekly release 3.11.3+ 2021-10-29 17:10:11 +02:00
Eloy Lafuente (stronk7) f8c673b03c Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-10-29 17:10:07 +02:00
Eloy Lafuente (stronk7) acf393873e MDL-72743 phpunit: Skip test until MDL-72950 is fixed
It's good to keep the test because it's not easy to
reproduce the issue to be fixed. Part of the fix will
be to remove this skip.
2021-10-29 13:59:38 +02:00
Huong Nguyen 3cef1996eb MDL-72895 Assignment: Fix colour contrast for grading navigation 2021-10-29 18:53:13 +08:00
Shamim Rezaie 3c1f14fb22 Merge branch 'MDL-72874-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-10-29 03:34:47 +11:00
Shamim Rezaie 82e055104c Merge branch 'MDL-72924-fix-component-initialisation-for-performance-checks-MOODLE_311_STABLE' of https://github.com/keevan/moodle into MOODLE_311_STABLE 2021-10-29 02:57:01 +11:00
Sara Arjona 3fa45f00c6 MDL-72945 badges: use default issuer contact
The defaultissuercontact was ignored if the sitebackpack email was set
to empty string..
2021-10-28 17:47:20 +02:00
Víctor Déniz fab5e031f9 Merge branch 'MDL-72912_311' of https://github.com/timhunt/moodle into MOODLE_311_STABLE 2021-10-28 15:45:28 +01:00
Víctor Déniz 9afd3da2b3 Merge branch 'MDL-72901_311' of https://github.com/timhunt/moodle into MOODLE_311_STABLE 2021-10-28 13:49:10 +01:00
Ilya Tregubov fb800de092 Merge branch 'MDL-72670-311' of git://github.com/cameron1729/moodle into MOODLE_311_STABLE 2021-10-28 13:14:53 +02:00
Eloy Lafuente (stronk7) 0a8666b01a MDL-72743 tests: tidy up the new test with NS/name/covers
Ideally any new test should be using a class name matching
the file name, and to use namespace when clearly belonging to
a component (sub-namespace also allowed for better accuracy).

And, also, adding a @covers label to indicate which class
(preferred, method is also possible) is being covered with the test.
2021-10-28 13:11:37 +02:00
Eloy Lafuente (stronk7) 48c3f683a6 Merge branch 'MDL-72743-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-28 13:11:27 +02:00
Andrew Nicols 256242cfd7 Merge branch 'MDL-72871_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-10-28 14:16:10 +08:00
Jun Pataleta 8850a21f66 Merge branch 'MDL-72316-311-2' of git://github.com/mickhawkins/moodle into MOODLE_311_STABLE 2021-10-28 13:50:27 +08:00
Michael Hawkins 0f6ab8bf12 MDL-72316 filelib: Add ability for modules to directly load SVG images
This also implements the functionality for SCORM packages, which may
have SVG images embedded within their content which require loading
directly (and are only created by users with appropriate risk flag).
2021-10-28 12:58:41 +08:00
Kevin Pham c21d587016 MDL-72924 check: Fix component initialisation for performance checks 2021-10-28 14:25:48 +11:00
Eloy Lafuente (stronk7) 7165c2ac74 Merge branch 'MDL-72879-311-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_311_STABLE 2021-10-27 22:12:24 +02:00
Jun Pataleta 0421a9aba5 Merge branch 'MDL-72669-311' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-10-27 15:07:38 +08:00
Mark Nelson 53a4d06a8d MDL-71439 core_grades: return a blank mustache template for letters 2021-10-27 12:20:21 +08:00
Mark Nelson 6070bbb37b MDL-71439 mod_forum: display user grade from web service 2021-10-27 12:20:21 +08:00
Mark Nelson f13e3235c4 MDL-71439 core_grades: return result of new method in web services 2021-10-27 12:20:21 +08:00
Mark Nelson 20b3b4c38d MDL-71439 core_grades: add new method 'get_formatted_grade_for_user' 2021-10-27 12:20:21 +08:00
Mark Nelson 641b5a27ab MDL-71439 core_grades: fixed undefined class issues 2021-10-27 12:20:21 +08:00
Mark Nelson ea996d378b MDL-71439 core_grades: remove returning null when not possible
The method explicitly declares 'stdClass' as the return type.
2021-10-27 12:20:21 +08:00
AMOS bot f4f8118ad6 Automatically generated installer lang files 2021-10-27 00:07:26 +00:00
Eloy Lafuente (stronk7) dd89bfab41 MDL-72871 cleanup: Remove incorrect whitespace from codebase
Differences can be checked with git diff --ignore-all-space and
that will show that the only non-whitespace change is in a test
in the git lib/tests/html2text_test.php file. In that case the
whitespace has been replaced by a quoted string (of whitespaces)
keeping the test 100% equivalent and workarrounding the whitespace.
2021-10-26 17:19:17 +02:00
Víctor Déniz b8e5f7b428 weekly release 3.11.3+ 2021-10-26 13:44:06 +01:00
Víctor Déniz bb033deac1 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-10-26 13:44:00 +01:00
Tim Hunt 90d04a010b MDL-72912 questions: fix type of question_display_options::$context 2021-10-26 08:06:19 +01:00
Helen Foster 6509786f2b MDL-72879 lang: Import fixed English strings (en_fix) 2021-10-25 20:57:04 +02:00
Paul Holden 2a6554678e MDL-72894 course: format name and summary data for download.
The names and summaries of course elements (i.e. the course
itself, plus sections and modules) included when downloading
it's content are now passed through appropriate methods to
format their values.
2021-10-25 08:08:01 +01:00
Andrew Nicols 8bd492084d Merge branch 'MDL-71750-311' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_311_STABLE 2021-10-25 13:58:27 +08:00
AMOS bot ba376027e8 Automatically generated installer lang files 2021-10-24 00:07:27 +00:00
Tim Hunt f89a6106fa MDL-72901 question: add missing {$a} in string attemptfinishedsubmitting 2021-10-22 23:15:58 +01:00
Ilya Tregubov fa492071fe weekly release 3.11.3+ 2021-10-22 12:49:04 +02:00
Shamim Rezaie 6215cbba29 MDL-72669 qtype_multianswer: Replace empty option with NBSP 2021-10-22 16:02:19 +11:00
Víctor Déniz 9b67243b6b Merge branch 'MDL-72607-MOODLE-311-STABLE_fix_media_vimeo_url_parser' of https://github.com/praxisdigital/moodle into MOODLE_311_STABLE 2021-10-22 00:02:32 +01:00
Paul Holden 544ee202ca MDL-72884 atto_image: improve svg support in editor dialogue.
Where the dimensions of an image are not present, we should use
sensible defaults so that the dialogue is still usable.
2021-10-21 23:58:32 +01:00
Paul Holden fe3441d95f MDL-72743 mod_quiz: verify user mapping prior to restoring attempts. 2021-10-21 08:26:41 +01:00
Eloy Lafuente (stronk7) d524f2eadc Merge branch 'MDL-72013-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-10-21 09:23:04 +02:00
Andrew Nicols 8159824033 Merge branch 'MDL-72507-311' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_311_STABLE 2021-10-21 12:57:36 +08:00
Andrew Nicols babe07eec3 MDL-72874 behat: Allow behat window sizes to be modified during run
In some situations it is useful to modify the requested screensize by a
modifier. This allows for failing tests to be rerun at a different
screensize, where the original screensize triggered a failure for some
size-related reason.
2021-10-21 10:26:01 +08:00
Andrew Nicols e88926fb4f MDL-72013 js: Configure eslint-jsdoc plugin
This change adds configuration for the eslint-jsdoc plugin in order to
detect the following errors with jsdoc blocks:
* missing params
* params in incorrect order
* params with no type defined
* properties incorrectly defined
* incorrect use of @package
* incorrect values for @access

In addition, warnings will be thrown where indentation is incorrect.
2021-10-21 08:52:57 +08:00
Andrew Nicols 0d6e90470b MDL-72013 js: Add eslint-jsdoc plugin 2021-10-21 08:52:57 +08:00
Andrew Nicols a5c1b7924d MDL-72013 js: Fix jsdocs to meet stricter eslint 2021-10-21 08:52:57 +08:00
Ilya Tregubov be58e75573 Merge branch 'MDL-72639-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-20 13:01:01 +02:00
Eloy Lafuente (stronk7) ff37cc27be Merge branch 'MDL-72849-m311' of https://github.com/sammarshallou/moodle into MOODLE_311_STABLE 2021-10-19 22:17:15 +02:00
sam marshall b449a10a09 MDL-72849 tool_behat: Use of xpath name() not compatible with Firefox
The xpath name() function returns upper-case e.g. 'IMG' in Firefox and
lower-case e.g. 'img' in Chrome.
2021-10-19 13:49:52 +01:00
Ilya Tregubov 68cd3002ce Merge branch 'MDL-71270-311' of git://github.com/mickhawkins/moodle into MOODLE_311_STABLE 2021-10-19 14:45:30 +02:00
Eloy Lafuente (stronk7) 261bc97b3e weekly release 3.11.3+ 2021-10-19 12:51:49 +02:00
Eloy Lafuente (stronk7) 4ef90e61e9 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-10-19 12:51:44 +02:00
Andrew Nicols b71cc1f99d MDL-71785 mod_quiz: Correct string as per reviewer feedback 2021-10-19 11:20:26 +08:00
Andrew Nicols 932c5faef9 Merge branch 'MDL-71785_311' of https://github.com/StudiUM/moodle into MOODLE_311_STABLE 2021-10-19 11:20:24 +08:00
Sara Arjona 49285bf337 Merge branch 'MDL-72590-311' of git://github.com/lucaboesch/moodle into MOODLE_311_STABLE 2021-10-18 17:38:38 +02:00
Luca Bösch e8f4b6ff60 MDL-72590 enrol: Course in success message after unenroll passes filter 2021-10-18 16:38:02 +02:00
Sara Arjona 8639d45416 Merge branch 'MDL-72064-311' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_311_STABLE 2021-10-18 12:59:44 +02:00
Michael Hawkins 800d0e7ad4 MDL-71270 core: Updated security.txt expiry 2021-10-18 17:14:07 +08:00
Sam Møller 81c0b420c6 MDL-72607 media_vimeo: Fix vimeo URL parser
Fix vimeo URL parser to support the new vimeo URL format with privacy
settings (the video with password or domain restricted setting).
For example "https://vimeo.com/123456789/2bffff0000" the plugin must
parse the URL "https://player.vimeo.com/video/123456789?h=2bffff0000"
to the iframe source to make it compatible with the new vimeo URL
format.
See more about vimeo video privacy settings at
https://vimeo.com/blog/post/video-privacy-explained/
2021-10-18 08:52:38 +02:00
Andrew Nicols 5d54d89044 Merge branch 'MDL-65943-311' of git://github.com/HuongNV13/moodle into MOODLE_311_STABLE 2021-10-18 14:04:41 +08:00
Huong Nguyen ed3f7bb078 MDL-65943 media_videojs: add videojs-ogvjs plugin
VideoJS now support to play Ogg Vorbis/Opus/Theora and WebM VP8/VP9/AV1 video on:
 - Safari on Mac OS
 - Safari on iPhone OS
 - Safari on iPad OS
2021-10-18 11:39:59 +07:00
AMOS bot b881fff43f Automatically generated installer lang files 2021-10-16 00:07:33 +00:00
Shamim Rezaie ea0487cdef weekly release 3.11.3+ 2021-10-16 00:29:22 +11:00
Shamim Rezaie 44749626b0 Merge branch 'MDL-71344-311' of git://github.com/HuongNV13/moodle into MOODLE_311_STABLE 2021-10-15 14:24:56 +11:00
Jun Pataleta 9b83cae1b5 Merge branch 'MDL-72623_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-10-15 09:47:21 +08:00
Jun Pataleta cc4e898144 Merge branch 'MDL-72807_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-10-15 09:08:21 +08:00
Eloy Lafuente (stronk7) 1114a3755a Merge branch 'MDL-26633-311-workshopnumofreviews' of git://github.com/mudrd8mz/moodle into MOODLE_311_STABLE 2021-10-14 22:40:52 +02:00
Eloy Lafuente (stronk7) 95694f0965 Merge branch 'MDL-68325-311' of git://github.com/odeialba/moodle into MOODLE_311_STABLE 2021-10-14 22:19:31 +02:00
Eloy Lafuente (stronk7) 5912b69773 Merge branch 'MDL-72464-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-14 22:02:15 +02:00
Eloy Lafuente (stronk7) de1f45f535 MDL-72807 behat: Add a few more @skip_chrome_zerosize tags
This is the 3rd round adding the tags to some scenarios
detected to be failing with zerosize problems lately.

Note that @ MDL-71108, the final solution will happen, say
switching to own webdriver till the upstream one is fixed
or whatever. Our @skip_chrome_zerosize solution is just a
workaround to have all those scenarios detected and ignored
by normal runs.
2021-10-14 16:16:52 +02:00
Eloy Lafuente (stronk7) 4c3a318ffa MDL-72623 nodejs: Bump from v14.15.0 to v14.18.0
Without modifying any installed package or dependency
because, after trying to do so, the updated stuff is huge
and leads to some JS validation / minimisation problems.
2021-10-13 09:49:53 +02:00
Andrew Nicols 65ad94b87c weekly release 3.11.3+ 2021-10-13 09:40:48 +08:00
Andrew Nicols 74a41120d6 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-10-13 09:40:45 +08:00
AMOS bot 35ea0a22e3 Automatically generated installer lang files 2021-10-13 00:07:24 +00:00
Víctor Déniz 318637c781 Merge branch 'MDL-72498-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-12 15:34:11 +08:00
Huong Nguyen 06858a584a MDL-71344 questions: Improve event handler for Drag n Drop family 2021-10-11 11:05:14 +07:00
Andrew Nicols 6f4d296da2 Merge branch 'MDL-66203-311' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-10-11 08:36:54 +08:00
Paul Holden b413ff4684 MDL-72639 admin: consistent primary buttons during site upgrade. 2021-10-10 20:43:18 +01:00
Paul Holden 72b8b2e858 MDL-72498 report_eventlist: use core component API for event list.
The previous method of hardcoded filepaths, specifically for events
belonging to core, meant that any events belongs to core subsystems
were omitted (core_customfield, core_h5p, core_payment, etc).
2021-10-10 20:41:43 +01:00
Paul Holden c250f825ed MDL-72464 webservice: fix detection of non-expiring external tokens. 2021-10-10 20:40:38 +01:00
David Mudrák a2a309f9a0 MDL-26633 workshop: Allow to randomly allocate more than 30 reviews
For classes with many students, there may be valid cases for having more
than 30 reviews per submission / reviewer.

The patch changes the type of the input field so that it can freely
editable to any integer value.
2021-10-08 17:10:36 +02:00
Sara Arjona 0850628c6c weekly release 3.11.3+ 2021-10-08 12:43:20 +02:00
Sara Arjona 2082bc6a89 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-10-08 12:43:16 +02:00
Cameron Ball 2de9208ce8 MDL-72670 session: Correct read only debugging logic
Prior to this patch the debugging mode (when enabled) would trigger
on everywhere, regardless of whether or not READ_ONLY_SESSION is defined.

This patch modifies that behaviour so that the debugging only kicks in
if READ_ONLY_SESSION is defined and set to true.
2021-10-08 15:12:03 +08:00
AMOS bot 31f3479fbf Automatically generated installer lang files 2021-10-08 00:07:26 +00:00
Víctor Déniz 221ed2ac87 Merge branch 'MOODLE_311_MDL-64576' of https://github.com/golenkovm/moodle into MOODLE_311_STABLE 2021-10-07 22:29:50 +01:00
Eloy Lafuente (stronk7) 2266158778 Merge branch 'MDL-71306-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-07 23:10:08 +02:00
Eloy Lafuente (stronk7) e0c0c1dd17 Merge branch 'MDL-72674-311' of git://github.com/junpataleta/moodle into MOODLE_311_STABLE 2021-10-07 22:54:00 +02:00
Eloy Lafuente (stronk7) bc7c322c62 Merge branch 'MDL-72309-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-07 22:42:57 +02:00
Eloy Lafuente (stronk7) c44a461146 Merge branch 'MDL-72635-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-10-07 22:39:04 +02:00
Eloy Lafuente (stronk7) 9a6b0b8c31 Merge branch 'MDL-72621-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-10-07 21:10:05 +02:00
AMOS bot e0fd61d727 Automatically generated installer lang files 2021-10-07 00:07:24 +00:00
Jun Pataleta 802259a6c8 Merge branch 'MDL-72339-m311' of https://github.com/sammarshallou/moodle into MOODLE_311_STABLE 2021-10-06 22:44:31 +08:00
sam marshall 4ae6235d64 MDL-72339 core_availability: Unsafe to use format_string in description
The availability condition get_description method is called while
gathering data for the modinfo object. As such it is not safe to
call other functions which might rely on modinfo, such as format_string
(if using filters which access modinfo).

This change provides a mechanism to call format_string later, and also
a general callback to do other stuff later as well if needed. It uses
the same approach already taken to make activity names work correctly
in the availability_condition class.
2021-10-06 11:26:28 +01:00
Andrew Nicols 13d8eb3321 Merge branch 'MDL-72515-311' of git://github.com/marinaglancy/moodle into MOODLE_311_STABLE 2021-10-06 12:58:39 +08:00
Ilya Tregubov 3fe1755d5d Merge branch 'MDL-72452-resource-filter-311' of https://github.com/Peterburnett/moodle into MOODLE_311_STABLE 2021-10-06 10:55:01 +07:00
Andrew Nicols ab7d7d4d57 Merge branch 'MDL-72599-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-06 09:12:42 +08:00
Eloy Lafuente (stronk7) d2c4d59f81 weekly release 3.11.3+ 2021-10-06 00:24:51 +02:00
Ilya Tregubov 26bcfa6122 Merge branch 'MDL-56773-311' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-10-05 23:26:59 +02:00
Jun Pataleta 1c8e09b4aa Merge branch 'MDL-39324-moodle311' of https://github.com/kiratskitizing/moodle into MOODLE_311_STABLE 2021-10-05 23:26:59 +02:00
Ilya Tregubov 2980b46bf8 Merge branch 'MDL-72395_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-10-05 23:26:59 +02:00
Simey Lameze 1bb79a6cb3 MDL-72635 calendar: fix typo in data attribute 2021-10-05 06:30:43 +08:00
Paul Holden f91d23a739 MDL-71306 cohort: ignore empty values in form autocomplete element. 2021-10-04 21:14:17 +01:00
Joshua Ebarvia 2ac4573661 MDL-39324 mod_url: Fix icon when URL has params 2021-10-04 20:04:00 +10:30
Marina Glancy c9ff42d096 MDL-72515 admin: do not call curl unnecessary on plugins page 2021-10-04 10:01:12 +02:00
Paul Holden 30830852bf MDL-72309 course: make category a required field in forms.
Course category fields were changed en masse from simple select
elements to autocompletes in 93d72205, but weren't defined as
required fields. This could lead to exceptions and/or unexpected
behaviour if their values were cleared prior to form submission.
2021-10-04 08:11:40 +01:00
Mikhail Golenkov 3550f90dad MDL-64576 completion: Fix criteria and course completion dates 2021-10-04 10:52:31 +11:00
Shamim Rezaie 99af155ddd MDL-66203 mod_assign: Reset submission status when removing a submission 2021-10-04 02:12:43 +11:00
Eloy Lafuente (stronk7) 2a0e7b1d8c MDL-72395 composer: Update to newer dependencies
More notably PHPUnit to 9.5.9 that comes with some good fixes
and better support for go prospecting php81 (beta) status.

Generated with php73, that is the lower version supported
by this branch, following the instructions @ https://docs.moodle.org/dev/Composer
2021-10-02 22:46:11 +02:00
Eloy Lafuente (stronk7) d5e66b50b3 weekly release 3.11.3+ 2021-10-02 22:05:12 +02:00
Eloy Lafuente (stronk7) 55aa35d9fe Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-10-02 22:05:08 +02:00
Eloy Lafuente (stronk7) 59e08ceb6d Merge branch 'MDL-72714_311' of git://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-10-02 15:29:28 +02:00
Eloy Lafuente (stronk7) f3a6d622a2 MDL-72714 behat: Add new @skip_chrome_zerosize labels
With the move from Chrome 93 to 94 a few new "zerosize" cases
have appeared, this just protect us from them, so they
are run apart.
2021-10-02 12:17:51 +02:00
Eloy Lafuente (stronk7) 2704764d80 MDL-72714 behat: fix problem with button on the edge and failing
Surprise came with Chrome 94, so applying the usual trick by
changing window size. Hopefully some day we'll be able to
revert all them (Chrome 123).
2021-10-02 12:17:51 +02:00
Víctor Déniz 61e68a15a1 MDL-72714 behat: Fix Behat failures for chrome 94. 2021-10-01 11:56:47 +01:00
abgreeve 5f26d8c331 Merge branch 'MDL-69682-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-01 11:24:46 +08:00
Jun Pataleta 7c814fa48f MDL-72674 core: Add indicator that feedback link opens in new window
* New pix icon i/externallink
* New lang string opensinnewwindow
* Use the external link pix icon with "Opens in new window" lang string
 as its alt text and add it to the "Give feedback about this software"
 link.
* Update cta template to indicate whether the link opens in new window.
2021-10-01 10:39:22 +08:00
Andrew Nicols f603c2c38e Merge branch 'MDL-72673-311' of git://github.com/junpataleta/moodle into MOODLE_311_STABLE 2021-10-01 10:23:44 +08:00
Eloy Lafuente (stronk7) 207174aa0a Merge branch 'MDL-72484-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-09-30 23:19:15 +02:00
Víctor Déniz ced66d9d66 Merge branch 'MDL-72496-311_assert_tag' of https://github.com/call-learning/moodle into MOODLE_311_STABLE 2021-09-30 15:41:09 +01:00
Laurent David d0958a89f9 MDL-72496 question tests: fix assertTag if tag not found
* The basic_test::assertTag method will issue a warning as $tag is not
found, failing the PHP Unit test that uses this method.
* Add tests to check that assertTag is working
2021-09-30 13:14:34 +02:00
Thong Bui 392e57b6a0 MDL-72507 Quiz: Quiz auto-save does not detect uploaded files 2021-09-30 12:17:40 +07:00
abgreeve 250524cf5b Merge branch 'MDL-72275-311-2' of git://github.com/mickhawkins/moodle into MOODLE_311_STABLE 2021-09-30 10:03:27 +08:00
AMOS bot dbdc0e44d1 Automatically generated installer lang files 2021-09-30 00:07:25 +00:00
Eloy Lafuente (stronk7) 954bc8e887 Merge branch 'MDL-71970-311' of git://github.com/sarjona/moodle into MOODLE_311_STABLE 2021-09-29 23:27:25 +02:00
Andrew Nicols 0e0984010b MDL-72621 admin: Add environment check for admin deprecation 2021-09-29 22:39:32 +08:00
Shamim Rezaie ddff536561 Merge branch 'MDL-72060-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-09-28 20:17:12 +10:00
Adrian Perez f0bf659715 MDL-72060 mod_lti: fix comparison if user is gradable 2021-09-28 17:25:27 +08:00
AMOS bot 955ea66652 Automatically generated installer lang files 2021-09-28 00:07:32 +00:00
Paul Holden d8a1fab050 MDL-72484 report_eventlist: looser check for event 'other' docs. 2021-09-27 18:21:34 +01:00
Sara Arjona 8e1463334c MDL-71970 h5plib_v124: Replace references to new Moodle\H5Pxxx namespace
The joubel/core and joubel/editor libraries have been moved to Moodle
namespace.
This commit adds the new namespace to the places where these classes
are used.
Besides, a couple of minor changes have been done to replace the _test.php
classname and remove some unnecessary defined('MOODLE_INTERNAL').
2021-09-27 11:42:28 +02:00
Sara Arjona 79aa88fddd MDL-71970 h5plib_v124: Add namespace to H5P editor library
The joubel/editor is a third-party library. A namespace has been added to
avoid collision with other plugins using it (such as mod_hvp).
That way, they will be able to have a different version without
side effects.
2021-09-27 11:42:28 +02:00
Sara Arjona 88c5228e61 MDL-71970 h5plib_v124: Add namespace to H5P core library
The joubel/core is a third-party library. A namespace has been added to
avoid collision with other plugins using it (such as mod_hvp).
That way, they will be able to have a different version without
side effects.
2021-09-27 11:42:27 +02:00
Jun Pataleta e0dbb85732 MDL-72673 mod_glossary: Generate unique ID for Keywords select element 2021-09-24 18:31:28 +08:00
Paul Holden 0c9993773c MDL-69682 theme_boost: remove minimum height of tables.
The change that introduced this property (a3124b15) is no longer
required, and it caused visual glitches on tables containing a
single row.
2021-09-24 08:22:45 +01:00
Michael Hawkins 5b6f95647b MDL-72275 timeline: Add default offset to template
This value was being passed in the template, but the template
had 0 hardcoded instead of injecting the context value. With the other
bug fixes in this issue correctly loading the "All" view properly on
page load, this uncovered that at load time, the course view would not
load overdue items, which also meant a behat test was failing.
2021-09-24 11:23:57 +08:00
Michael Hawkins 8061730d7b MDL-72275 timeline: Make time dropdown options display consistently
The 6 month option was highlighted on load if previously selected,
which was not the case for any other options. This has been removed
so it behaves consistently.
2021-09-24 11:23:57 +08:00
Michael Hawkins ea0f449e1b MDL-72275 timeline: Fixed non-loading issue in dates sort
Incorrect setting/getting of the "seen" data attribute resulted in no
information being fetched when switching from course view back to dates
view.
2021-09-24 11:23:57 +08:00
Michael Hawkins 4564ed7412 MDL-72275 timeline: Display "all" time on page load fix
When the timeframe filter was set to "all" when the timeline
block was initially loaded, an incorrect value rendered into
the template meant the timeframe limit was set to 0 (which will
return no results) instead of setting no limit (which would fetch all
 action events, as intended).
2021-09-24 11:23:57 +08:00
AMOS bot 61339394d7 Automatically generated installer lang files 2021-09-24 00:07:32 +00:00
Ilya Tregubov 1a63bccf46 weekly release 3.11.3+ 2021-09-23 18:21:52 +02:00
Ilya Tregubov fcd3d82558 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-09-23 18:21:50 +02:00
Jun Pataleta 9063970932 Merge branch 'MDL-72426-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-09-23 12:23:53 +08:00
Thong Bui a79905af9a MDL-71750 File upload: Disable submittion when uploading multiple files 2021-09-23 09:08:39 +07:00
AMOS bot 58bbab621c Automatically generated installer lang files 2021-09-23 00:07:27 +00:00
Eloy Lafuente (stronk7) 29e944addb Merge branch 'MDL-72110-311' of https://github.com/sharidas/moodle into MOODLE_311_STABLE 2021-09-22 20:12:18 +02:00
Eloy Lafuente (stronk7) bfec56ac5e Merge branch 'MDL-72593-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-09-22 10:48:18 +02:00
Jun Pataleta 86f5f11cf8 Merge branch 'MDL-51165-moodle311' of https://github.com/kiratskitizing/moodle into MOODLE_311_STABLE 2021-09-22 10:51:42 +08:00
AMOS bot 497dc38a4b Automatically generated installer lang files 2021-09-22 00:07:28 +00:00
Eloy Lafuente (stronk7) dd401b0dfe Merge branch 'MDL-71352-311' of git://github.com/lucaboesch/moodle into MOODLE_311_STABLE 2021-09-21 23:19:34 +02:00
Eloy Lafuente (stronk7) 0170fcddd0 Merge branch 'MDL-72566-311' of git://github.com/ferranrecio/moodle into MOODLE_311_STABLE 2021-09-21 19:07:27 +02:00
Eloy Lafuente (stronk7) fd54c1631f Merge branch 'MDL-69364-311-alt' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-09-21 18:19:32 +02:00
Ilya Tregubov f8001bbf14 MDL-70946 repository: Fix 311 branch Behat. 2021-09-21 18:09:42 +02:00
Ilya Tregubov 479d7a42d6 Merge branch 'MDL-70946-311' of git://github.com/peterRd/moodle into MOODLE_311_STABLE 2021-09-21 13:15:21 +02:00
Andrew Nicols 4f4e9b4828 MDL-72593 behat: Improve behat handling of file manager buttons
When using a try/catch for a find if the first match is not met then we
have an implicit 6 second delay waiting for the search to time out.

We can avoid this by combining the searches in a comma-separated
selection.

I have also taken the opportunity to convert the use of ->click() to the
i_click_on function which has the benefit of supporting wait for
pendingJS.
2021-09-21 16:00:41 +08:00
Andrew Nicols 4258188126 MDL-72593 behat: Load the Field node content locally for processing
The standard NodeElement functions for getAttribute, getTagName,
getParent, and friends go back to WebDriver and parse the DOM for each
request. This is insanely slow per request, and in the case of forms we
do a lot of checking to determine the field type.

This change modifies the form field detection to copy the entire node
content into a DOMDocument and parse the document locally.

This is significantly faster - in some cases where there are large
documents minutes faster.

I believe that this should be a safe change as the document fetched from
the browser is normalised to match the doctype specified.
2021-09-21 16:00:41 +08:00
Eloy Lafuente (stronk7) 78c1ecc30c Merge branch 'MDL-72205-311' of git://github.com/HuongNV13/moodle into MOODLE_311_STABLE 2021-09-20 19:05:33 +02:00
Andrew Nicols 3e2cc3cc4c MDL-69364 enrol: Improve setting of save button 2021-09-20 12:07:49 +08:00
Andrew Nicols 9fdaa9daec MDL-69364 enrol: Improve cohort test 2021-09-20 12:07:49 +08:00
Huong Nguyen df426e4a12 MDL-72205 admin: admin_setting_configduration validation improvement
The write_setting() should only use the internal validation if no validation function was provided
2021-09-20 09:18:32 +07:00
Peter Dias 48e1f7f484 MDL-70946 repository: Reenable and fix the disabled behat test 2021-09-20 08:10:09 +08:00
Joshua Ebarvia 0803f695fa MDL-51165 mod_url: allow directory index url direct access 2021-09-19 12:06:37 +09:30
Paul Holden 5279102245 MDL-72599 blocks: handle editing/deletion on admin notification page.
This was broken by changes in fdd5aef0, as the sesskey URL parameter
was required on admin/index.php in order for block related actions
to be performed uninterrupted by any redirections.
2021-09-17 12:21:46 +01:00
Luca Bösch e10d8c46e2 MDL-71352 gradereport_grader: Add icons for pass/fail. 2021-09-17 12:13:20 +02:00
Ilya Tregubov c71b2db9a3 weekly release 3.11.3+ 2021-09-17 08:58:33 +02:00
Ilya Tregubov c7485d9d5f Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-09-17 08:58:31 +02:00
Ilya Tregubov cd6c68cf20 Merge branch 'MDL-72173-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-09-16 15:02:02 +02:00
Andrew Nicols 6220e076f4 MDL-72173 behat: Respect login page preference 2021-09-16 20:47:18 +08:00
Ferran Recio d70cfe4c8c MDL-72566 completion: fix missing mod bug
MDL-71899 produces a regression. When an activity plugin is not present
but it has activities in the DB the course view returns an exception.
With this patch the code will ignore missing modules when calculating
the completion.
2021-09-16 09:59:32 +02:00
Jun Pataleta 533c6717a2 Merge branch 'MDL-72173-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-09-16 15:39:51 +08:00
Andrew Nicols 84d82ce72e MDL-72173 behat: Fix typo Logout <> Log out 2021-09-16 15:03:07 +08:00
Jun Pataleta 773a4d7603 Merge branch 'MDL-71602-311-2' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-09-16 12:57:50 +08:00
Jun Pataleta 0f82d8c809 Merge branch 'MDL-72173-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-09-16 12:22:56 +08:00
Andrew Nicols 030dae8824 MDL-72173 behat: Add tests for login/logout steps 2021-09-16 12:20:37 +08:00
Andrew Nicols c47da95926 MDL-72173 behat: Automatically log user out on behat login 2021-09-16 12:13:26 +08:00
Andrew Nicols 3ea7982a85 MDL-72173 behat: Add and use behat logout URL 2021-09-16 12:13:25 +08:00
Jake Dallimore 189b888019 Merge branch 'MDL-71860-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-09-16 11:02:51 +08:00
Jun Pataleta 5795f1b6b3 Merge branch 'MDL-72589_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-09-16 09:46:48 +08:00
AMOS bot 7bcf5222e3 Automatically generated installer lang files 2021-09-16 00:07:27 +00:00
Leon Stringer a40e05798d MDL-71860 core: Migrate lang string
Corresponding move of language string invalidpersistenterror following
move of class invalid_persistent_exception in MDL-57273.

AMOS BEGIN
 CPY [invalidpersistenterror,core_competencies],[invalidpersistenterror,core_error]
AMOS END
2021-09-16 07:00:43 +08:00
Eloy Lafuente (stronk7) 8d080e0994 Merge branch 'MDL-72432-MOODLE_311_STABLE' of https://github.com/katerynadegtyariova/moodle into MOODLE_311_STABLE 2021-09-16 00:37:20 +02:00
Eloy Lafuente (stronk7) 3671f1963e MDL-72589 behat: Create course with 3 sections (workaround)
With the default 5 sections course, after editing the activities, the
"log out" link is exactly on the edge of the view port. It's one of
those cases where Chrome fails to click/press it (have tried both).

So just make the course to have 3 sections is enough to avoid the
problem. Some day Chrome will fix that problem but, until then...
we cannot do much apart from changing the window size or try to
configure things to show differently.
2021-09-15 20:27:06 +02:00
Eloy Lafuente (stronk7) 452c5815e5 MDL-72589 behat: Add @skip_chrome_zerosize to failing scenarios
All the scenarios failing with Chrome zero-size errors are
getting the @skip_chrome_zerosize to be able to keep them apart from
regular runs. See MDL-71108 for more information about
that error.

They will be run by another job, specifically using that tag to
keep them failing and under control.
2021-09-15 20:26:51 +02:00
Jake Dallimore b73f9fec06 Merge branch 'MDL-71550-311' of git://github.com/bmbrands/moodle into MOODLE_311_STABLE 2021-09-15 10:49:45 +08:00
Jake Dallimore c1f3de62ee Merge branch 'MDL-71137-311' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_311_STABLE 2021-09-15 10:12:09 +08:00
Eloy Lafuente (stronk7) 0bc281384d Merge branch '71093-moodle311-backup-honor-formatstringstriptags' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_311_STABLE 2021-09-14 22:22:15 +02:00
Eloy Lafuente (stronk7) 7eb9672445 Merge branch 'MDL-72192-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-09-14 22:17:31 +02:00
Marie-Eve Lévesque c943722407 MDL-71785 core_quiz: Empty quiz section name behaves like new page 2021-09-14 14:38:18 -04:00
Ilya Tregubov bce29fbd43 Merge branch 'MDL-71961-311' of git://github.com/nguyenphuctien/moodle into MOODLE_311_STABLE 2021-09-14 12:08:58 +02:00
Ilya Tregubov bbdca02068 Merge branch 'MDL-71846-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-09-13 13:43:38 +02:00
Tien Nguyen 6115822226 MDL-71961 Quiz: Disable quiz navigation buttons when files are uploading 2021-09-13 17:44:02 +07:00
Odei Alba 1209205766 MDL-68325 completion: Add validation to course completion form 2021-09-13 12:11:53 +02:00
Andrew Nicols 1349e5d2f9 MDL-72173 behat: Switch to behat login URL 2021-09-13 11:20:35 +08:00
gthomas2 6c578308b0 MDL-72173 behat: Add alternative login file for behat 2021-09-13 11:14:02 +08:00
Eloy Lafuente (stronk7) ab931f6aa7 Moodle release 3.11.3 2021-09-12 12:37:26 +02:00
Eloy Lafuente (stronk7) 39cff78f7e weekly release 3.11.2+ 2021-09-11 12:12:19 +02:00
Eloy Lafuente (stronk7) 19cbc68871 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-09-11 12:12:15 +02:00
Shamim Rezaie 6e37e4606c MDL-71240 filter_tex: Add allowlist for filter_tex_sanitize_formula 2021-09-10 18:10:02 +02:00
Eloy Lafuente (stronk7) 89f2984206 Merge branch 'MOODLE_311_STABLE' of git://github.com/cescobedo/moodle into MOODLE_311_STABLE 2021-09-09 18:04:14 +02:00
cescobedo 1d37ef7bbb MDL-63207 auth_ldap: hot fix, remove remaining line 2021-09-09 17:59:51 +02:00
Eloy Lafuente (stronk7) 33c80edfae Merge branch 'MDL-71385-311-3' of git://github.com/junpataleta/moodle into MOODLE_311_STABLE 2021-09-09 12:59:45 +02:00
Jun Pataleta f88a73bbe6 Merge branch 'MDL-71899-311-2' of git://github.com/HuongNV13/moodle into MOODLE_311_STABLE 2021-09-09 12:59:45 +02:00
Eloy Lafuente (stronk7) b1216eefe4 Merge branch 'MDL-63207-311' of git://github.com/cescobedo/moodle into MOODLE_311_STABLE 2021-09-09 12:59:45 +02:00
Eloy Lafuente (stronk7) fec2e6c661 Merge branch 'MDL-69855-311' of git://github.com/junpataleta/moodle into MOODLE_311_STABLE 2021-09-09 12:59:45 +02:00
Jun Pataleta 6903d7e908 MDL-71385 theme: Fix contrast for dimmed text against striped table rows
In order to achieve good colour contrast between dimmed text and striped
table rows, the background colour of the striped rows are being
lightened to 0.03 alpha. While $gray-600 is being adjusted to a bit
darker shade of #6a737b. This gives a colour contrast ratio of 4.5:1
between the dimmed text colour and the striped table row background
which meets WCAG 2.1 Level AA requirements.

Comparing the normal font colour (#212529) with the adjusted dimmed text
colour gives a contrast ratio of 3.20:1 which meets WCAG 2.1 Level AA
requirements and still makes them distinguishable from one another.
2021-09-09 16:02:12 +08:00
Huong Nguyen 3a42d256af MDL-71899 performance: Improve activity completion data caching
- Modified SQL in get_data() to get the activity completion of all course modules without calling get_fast_modinfo() to reduce the DB queries.
 - Building activity completion cache for the whole course in one time instead of building the cache for each course module by passing $wholecourse = true to get_data()
2021-09-09 10:03:53 +07:00
Huong Nguyen 604d58ff4a MDL-71899 performance: Improve course image caching
Changed to use get_course() instead of get_fast_modinfo() for better performance
2021-09-09 10:03:53 +07:00
AMOS bot 7831dff5ac Automatically generated installer lang files 2021-09-09 00:07:25 +00:00
Eloy Lafuente (stronk7) 2f0752bd1c Merge branch 'MDL-72358-311' of git://github.com/sarjona/moodle into MOODLE_311_STABLE 2021-09-08 17:08:14 +02:00
Eloy Lafuente (stronk7) c7aad0eac2 Merge branch 'MDL-72216-311' of git://github.com/lucaboesch/moodle into MOODLE_311_STABLE 2021-09-08 11:29:01 +02:00
Eloy Lafuente (stronk7) 93c2d51181 Merge branch 'MDL-72499-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-09-07 23:52:01 +02:00
Eloy Lafuente (stronk7) 3f1828f78d Merge branch 'MDL-72071-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-09-07 23:29:54 +02:00
Eloy Lafuente (stronk7) 8c3b24cc8e Merge branch 'MDL-71925-311_wordcount' of https://github.com/brickfield/moodle into MOODLE_311_STABLE 2021-09-07 23:25:33 +02:00
Eloy Lafuente (stronk7) f422c92b97 Merge branch 'MDL-72488-311-importdatastring' of git://github.com/mudrd8mz/moodle into MOODLE_311_STABLE 2021-09-07 22:59:35 +02:00
cescobedo 4bd73eceb8 MDL-63207 auth_ldap: Update user profile if field is empty 2021-09-07 22:54:37 +02:00
Eloy Lafuente (stronk7) a8b9b98827 Merge branch 'MDL-69504-311' of https://github.com/snake/moodle into MOODLE_311_STABLE 2021-09-07 20:03:15 +02:00
Eloy Lafuente (stronk7) 7c9fe59856 Merge branch 'MDL-67610-311-2' of git://github.com/junpataleta/moodle into MOODLE_311_STABLE 2021-09-07 19:25:26 +02:00
Jun Pataleta 7b3b935a2e MDL-67610 mod_forum: Do not include private replies in unread count
Fetching the counts of unread posts should only include unread regular
posts or unread private reply posts directed to the user unless the user
has the capability to read private replies.
In order to retrieve the correct counts, we also need to loop through
each forum instance in the course to check the capability of the user to
read private replies in each forum.
2021-09-07 23:20:23 +08:00
Eloy Lafuente (stronk7) 76a2decae9 Merge branch 'MDL-72025-m311' of https://github.com/sammarshallou/moodle into MOODLE_311_STABLE 2021-09-07 16:30:53 +02:00
AMOS bot 2955eda18a Automatically generated installer lang files 2021-09-07 00:07:26 +00:00
Paul Holden e09e5f427b MDL-71726 course: respect user access when exporting participants.
We should ensure that users being exported are enrolled on the
course being exported from. In courses where the current user can't
access all groups we should ensure that users being exported belong
to the same groups as them.
2021-09-07 00:14:27 +02:00
Sujith Haridasan ed4389857d MDL-71160 auth_db: Use strict comaprison
Use strict comparison to avoid type juggling.

Signed-off-by: Sujith Haridasan <sujith@moodle.com>
2021-09-07 00:14:27 +02:00
Paul Holden b5b7b1f54f MDL-71976 auth_shibboleth: consistent session parsing during logout. 2021-09-07 00:14:27 +02:00
Shamim Rezaie 272780993d MDL-71240 filter_tex: Sanitize the whole latex document
LaTeX documents have a preamble section and admins can use a \newcommand
statement to define new commands there (or to give an alias to another
command). This commit makes sure no blocked command can escape
sanitization by being used in a new seemingly harmless command that is
defined in the LaTeX preamble.
2021-09-07 00:14:27 +02:00
Shamim Rezaie 888c3288a2 MDL-71240 filter_tex: Support paranoid mode for openin_any in latex 2021-09-07 00:14:27 +02:00
Huong Nguyen 298951cd2e MDL-71797 quiz: Improve the checks when fetching user's attempts 2021-09-07 00:14:27 +02:00
Eloy Lafuente (stronk7) 78b3472f5d Merge branch 'MDL-72286-311-test' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-09-06 23:58:04 +02:00
David Mudrák ef8cda836f MDL-72488 lang: Fix hard-coded English string at grades import form
Also adding a help tooltip as this seems to be the most important field
in the form and yet it was the only one without a help.
2021-09-06 17:41:09 +02:00
Paul Holden 14781b4c2e MDL-72499 event: add/correct event language strings as required. 2021-09-06 11:16:38 +01:00
Thong Bui aaa2f20a5f MDL-71137 File upload: progress bar issues display when D&D multi files 2021-09-06 14:11:59 +07:00
Eloy Lafuente (stronk7) 08f9a7a431 Merge branch 'MDL-72428-311-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_311_STABLE 2021-09-03 19:10:26 +02:00
Eloy Lafuente (stronk7) 596cace356 Merge branch 'MDL-72478-311' of git://github.com/sarjona/moodle into MOODLE_311_STABLE 2021-09-03 17:03:01 +02:00
Shamim Rezaie bef758bae6 MDL-56773 atto_equation: The equation editor should always be rtl
Also re-applied the border that was added to the preview area as part of
MDL-44778. The class name that's used no longer exists.
2021-09-03 17:58:42 +10:00
Sara Arjona 7b3ef08994 MDL-72478 calendar: Fix PHPUnit failure with offset
Before PHP 8.0.10, the time is lost when datetime->modify() is used
with weekdays. However, with PHP 8.0.10, the time is kept.
In consequence, the test_yearly_every_20th_monday_forever method
started failing.
For fixing it, the offset has been removed and the time has been set
to 00:00, so the behaviour will be the same regardless the PHP
version.
2021-09-03 09:35:06 +02:00
Simey Lameze 6ba8dbf909 MDL-72426 theme: fix message and notification count colour contrast 2021-09-03 12:26:36 +08:00
Peter Burnett 6f25060b32 MDL-72452 resource: Filter resource media embed output 2021-09-03 09:12:38 +10:00
sam marshall 68204f0870 MDL-72025 Upgrade: Out of memory when updating social profile fields 2021-09-02 13:44:20 +01:00
Luca Bösch e1046f053a MDL-72216 questions: Don't stick buttons together in preview. 2021-09-02 13:36:30 +02:00
Sara Arjona 7fdf72a268 weekly release 3.11.2+ 2021-09-02 11:51:26 +02:00
Jun Pataleta baa54113d6 Merge branch 'MDL-72440_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-09-02 09:52:02 +08:00
David Mudrák d6bc2e2a47 MDL-72428 lang: Use the fixed strings in the tests 2021-09-01 21:55:41 +02:00
Helen Foster a8bae35491 MDL-72428 lang: Import fixed English strings (en_fix) 2021-09-01 21:53:31 +02:00
Sara Arjona f06450a050 Merge branch 'MDL-72169-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-09-01 17:46:43 +02:00
Sara Arjona 4b63194dd3 Merge branch 'MDL-71375-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-09-01 17:09:33 +02:00
Sara Arjona 3bf10af46b Merge branch 'MDL-70376-311' of git://github.com/peterRd/moodle into MOODLE_311_STABLE 2021-09-01 16:52:08 +02:00
Sara Arjona 0a9017dad3 Merge branch 'MDL-71674-311' of https://github.com/dcai/moodle into MOODLE_311_STABLE 2021-09-01 11:36:41 +02:00
Dongsheng Cai 6237ac5ae9 MDL-71674 editor_atto: more assessible errors 2021-09-01 18:27:32 +10:00
Eloy Lafuente (stronk7) b849fbebd8 Merge branch 'MDL-71999-311' of https://github.com/danielneis/moodle into MOODLE_311_STABLE 2021-08-31 23:16:16 +02:00
Eloy Lafuente (stronk7) 4053ab14d6 Merge branch 'MDL-71121-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-08-31 23:13:07 +02:00
Jun Pataleta baa4772cc6 Merge branch 'MDL-71778-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-08-31 22:58:44 +08:00
Paul Holden 7c277c69bf MDL-72296 admin: style form when prompting for upgrade key. 2021-08-31 13:52:54 +02:00
Paul Holden e8b23a3efb MDL-72192 user: observe fullname capability in selector context. 2021-08-31 12:17:17 +01:00
Paul Holden 13537c6d64 MDL-71846 group: consistent escaping of user/group names. 2021-08-31 12:15:49 +01:00
Paul Holden 72a28cf776 MDL-72071 message: preserve window scroll opening processor modal. 2021-08-31 11:57:24 +01:00
Paul Holden 97997d1960 MDL-72169 privacy: format course name/summary during export. 2021-08-31 11:56:04 +01:00
Eloy Lafuente (stronk7) ca5a05550d MDL-72440 js: reconcile npm installed stuff
When npm-shrinkwrap.json was regenerated few days ago by MDL-72014
running audit-fix on it, it seems that some checksums in the "lodash"
package were missing.

Now they are properly set and that's leading to npm-shrinkwrap.json
changes when people runs npm install (note npm ci is the recommended
way to install all the dev dependencies).

So, just reconcile the file to include the new checksums.
2021-08-31 11:20:16 +02:00
cperves 1a991ae622 MDL-71778 admin: patch for hard-set check filter 2021-08-31 12:34:20 +08:00
Peter Dias 9d0e0519f2 MDL-70376 mod_assign: Reintroduce pdf orientation check
Reintroduce the orientation check and sizing when importing an image
2021-08-31 12:29:15 +08:00
Jake Dallimore 9aa2e468d6 Merge branch 'MDL-70433-311' of git://github.com/lucaboesch/moodle into MOODLE_311_STABLE 2021-08-30 10:42:14 +08:00
Simeon Naydenov 4edbc6c861 MDL-71375 lib: Fix tooltip in show_hide_icon in flexible table 2021-08-30 09:42:26 +08:00
Luca Bösch 77077c6567 MDL-70433 grades: prevent double escaping in titles 2021-08-27 10:56:07 +02:00
Sara Arjona 1aebcd49c3 MDL-72358 contenttype_h5p: Improve error handling
In MoodleCloud it was raised that, in some cases, loading the content
bank, from a course page, gives an "Invalid H5P content URL", not
offering any way to delete the offending content or create new one.
An extra-check has been added to the "is_view_allowed" method to
guarantee the H5P API is called only if the H5P content has a file.
2021-08-27 10:40:05 +02:00
Andrew Nicols 80c48e12ce weekly release 3.11.2+ 2021-08-27 12:00:17 +08:00
Andrew Nicols 6577d20773 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-08-27 12:00:14 +08:00
Sujith Haridasan 1e67fe7005 MDL-72110 core_navigation: home page preference
Admin should respect the home page preference set
just like any other user.
2021-08-27 07:35:10 +05:30
Sara Arjona 2993eadf2d Merge branch 'MDL-71029-311' of https://github.com/dcai/moodle into MOODLE_311_STABLE 2021-08-26 07:12:27 +02:00
Andrew Nicols 50f6fa90b8 Merge branch 'MDL-72403-311' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-08-26 13:02:16 +08:00
Heena Agheda 7b6e564041 MDL-72187 logstore: record log store's visibility change 2021-08-26 12:56:58 +08:00
Andrew Nicols 8a7f7a4d70 Merge branch 'MDL-70176_311' of https://github.com/TomoTsuyuki/moodle into MOODLE_311_STABLE 2021-08-26 12:16:24 +08:00
Andrew Nicols 1dfc7f6356 Merge branch 'MDL-72271_311' of https://github.com/larsbonczek/moodle into MOODLE_311_STABLE 2021-08-26 11:44:33 +08:00
Andrew Nicols 4f295616af Merge branch 'MDL-72152-m311' of https://github.com/sammarshallou/moodle into MOODLE_311_STABLE 2021-08-26 11:36:12 +08:00
Andrew Nicols 3a8c8fd1ac Merge branch 'MDL-72153-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-08-26 11:31:58 +08:00
Andrew Nicols 6884c6b65f Merge branch 'MDL-72312_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-08-26 11:26:10 +08:00
AMOS bot 6424a1817b Automatically generated installer lang files 2021-08-26 00:07:29 +00:00
Sara Arjona 5b2c9cf18b Merge branch 'MDL-72106-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-08-25 18:38:38 +02:00
Eloy Lafuente (stronk7) cf2d9cdfef Merge branch 'MDL-72163-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-08-24 20:12:22 +02:00
Sara Arjona c59c09a65d Merge branch '311_MDL-70006' of git://github.com/danmarsden/moodle into MOODLE_311_STABLE 2021-08-24 13:13:13 +02:00
Shamim Rezaie a45b9e347f MDL-72403 calendar: prereserve courseid after form submit 2021-08-24 18:05:00 +10:00
Jake Dallimore c7ae5b9a0f MDL-69504 mod_lti: check role switches when setting lti roles on launch
is_siteadmin isn't aware of role switches, so make sure we're not in a
switched role before calling that method.
2021-08-24 14:33:49 +08:00
Andrew Nicols fb13698049 Merge branch 'MDL-72014_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-08-24 09:16:53 +08:00
Andrew Nicols 6c6dc64458 Merge branch 'MDL-72207-311' of git://github.com/jleyva/moodle into MOODLE_311_STABLE 2021-08-24 09:06:36 +08:00
Kateryna Degtyariova 094a136394 MDL-72342 groups: Use get_columns() to handle BOM in CSV
Ensuring that BOM was properly removed from input CSV file by using get_columns() instead of parsing the raw data.
2021-08-24 10:50:17 +10:00
Eloy Lafuente (stronk7) 72e15b8845 Merge branch 'MDL-71055-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-08-23 23:22:25 +02:00
Sara Arjona 084f74a5a2 Merge branch 'MDL-72257-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-08-23 17:52:26 +02:00
Shamim Rezaie fa1da2e471 MDL-71602 qtype_essay: label essay question's answer area 2021-08-24 00:59:18 +10:00
Eloy Lafuente (stronk7) a9a2127ddd MDL-72312 environment: Add new optional custom check for igbinary
This optional environmental check will look if:

- the site is running php72.
- the site has igbinary extension enabled.
- the igbinary extension version is a buggy one >=3.2.2 <= 3.2.4
- the bug is reproducible.

And will warn if all the conditions are met.
2021-08-23 15:11:11 +02:00
Andrew Nicols 81ee8fe275 MDL-71055 behat: Update core settings to use generator
These changes have only been applied to settings which were already
using settings names and values, but which were still using the UI.
2021-08-23 12:23:03 +08:00
Eloy Lafuente (stronk7) 46bac04f41 Merge branch 'MDL-71973-311' of https://github.com/mohalisad/moodle into MOODLE_311_STABLE 2021-08-20 19:07:04 +02:00
Eloy Lafuente (stronk7) 4a0ed883e0 MDL-72014 nodejs: audit fix to solve some security reports
Simply run npm audit fix that updates these main packages:

- xmldom 0.6.0
- grunt 1.4.1
- gherkin-lint 4.2.2

(and also a bunch of dependencies
2021-08-20 13:49:50 +02:00
Ilya Tregubov f9ea7e747f weekly release 3.11.2+ 2021-08-20 13:24:33 +02:00
Ilya Tregubov 01465a4ee4 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-08-20 13:24:31 +02:00
Tomo Tsuyuki b1ab339ee0 MDL-70176 mod_forum: Grading respects separate groups filter 2021-08-20 13:35:28 +10:00
Ilya Tregubov 7569f511b5 MDL-49202 core: Comment broken test.
Should be fixed properly as part of MDL-72377.
2021-08-19 17:14:17 +02:00
Ilya Tregubov 8de0f4896f Merge branch 'MDL-49202_311' of git://github.com/mdjnelson/moodle into MOODLE_311_STABLE 2021-08-19 17:06:04 +02:00
Mark Nelson 03a3b7124c MDL-49202 core: fix failing unit tests
See MDL-72377.
2021-08-19 20:16:10 +08:00
Mark Nelson 150231444f MDL-49202 core_grades: add Behat tests 2021-08-19 20:16:10 +08:00
Juan Leyva 3a229f93cc MDL-72207 assign: Support all participants in get_submission_status WS 2021-08-19 14:11:57 +02:00
Mark Nelson e6ea2e72f4 MDL-49202 core_grades: perform same action on categories in form
When you click on 'Edit' then 'Hide' on a grade item like a course category
that contains many grade items, the course and the grade items are set to
hidden. However, if you use the 'hidden' option on the 'Edit settings'
page it only hides that item and none of the items (assignment etc)
under that course category. We want them to be consistent.
2021-08-19 17:44:02 +08:00
Mark Nelson 9396dacf81 MDL-49202 core_grades: perform same action on items in form
When you click on 'Edit' then 'Hide' on a grade item like an
assignment it also hides the grades. However, If you use the
'hidden' option on the 'Edit settings' page it just hides that
item and doesn't hide grades as well. We want them to be
consistent.
2021-08-19 17:44:02 +08:00
Julien Boulen 63e37835e0 MDL-71093 backup: fix backup when activity names use HTML tags 2021-08-19 11:24:34 +02:00
Thong Bui 49d1413f72 MDL-72064 Questions: response selection area enough 2021-08-19 14:33:45 +07:00
Bas Brands 6fb325de02 MDL-71550 theme_boost: improve dropdown hover styles 2021-08-19 09:17:24 +02:00
Andrew Nicols 1780caf656 Merge branch 'MDL-68639-3.11' of https://github.com/xcaro/moodle into MOODLE_311_STABLE 2021-08-19 10:06:08 +08:00
Eloy Lafuente (stronk7) 60d3bfca83 Merge branch 'MOODLE_311-MDL-72210' of https://github.com/golenkovm/moodle into MOODLE_311_STABLE 2021-08-18 19:55:02 +02:00
Eloy Lafuente (stronk7) 4ee195b5cc Merge branch 'MDL-72206-311' of git://github.com/junpataleta/moodle into MOODLE_311_STABLE 2021-08-18 19:32:37 +02:00
Andrew Nicols 97834dc094 Merge branch 'MDL-69451-shared-temptables-3.11' of https://github.com/srdjan-catalyst/moodle into MOODLE_311_STABLE 2021-08-18 21:40:19 +08:00
Víctor Déniz e3e071c9c9 Merge branch 'MOODLE_311_MDL-72239-v2' of https://github.com/golenkovm/moodle into MOODLE_311_STABLE 2021-08-18 13:57:35 +01:00
Mikhail Golenkov 36b7ae3e52 MDL-72239 phpunit: Assert the number of db queries to be less or equal
The course unit test assumes the number of db call. This assumption
is correct in vanilla moodle only. Once some plugins installed their
observers may do extra db calls. Due to caching the number of actual
db calls in the unit test may be fewer.
2021-08-18 21:29:14 +10:00
Víctor Déniz 22dd5c744b Merge branch 'MDL-71487-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-08-18 09:54:48 +01:00
AMOS bot d3fbaed60d Automatically generated installer lang files 2021-08-18 00:07:25 +00:00
Nhan Vo 1b99453e1f MDL-68639 HTML Editor (Atto): Invalid HTML for nested lists 2021-08-17 10:26:06 +07:00
Frédéric Massart c1b68bf712 MDL-72286 editor_atto: Declare type on plugins button groups 2021-08-17 12:00:10 +10:00
Ilya Tregubov c7a0f15a14 Merge branch 'MDL-71814-311' of git://github.com/NashTechOpenUniversity/moodle into MOODLE_311_STABLE 2021-08-16 13:57:10 +02:00
Jun Pataleta 9b0616be13 MDL-69855 mod_forum: Don't show reply link in email for private replies 2021-08-16 17:46:00 +08:00
Thach Le Huy a76e6df756 MDL-71814 Atto: File picker – file info panel focus issue 2021-08-16 16:38:16 +07:00
Mikhail Golenkov 2af7fbcdbf MDL-72210 phpunit: Remove excessive curl mock responses 2021-08-14 10:40:30 +10:00
AMOS bot 099a04142e Automatically generated installer lang files 2021-08-14 00:07:26 +00:00
Paul Holden 667f621ca6 MDL-72153 privacy: correctly export user description/files. 2021-08-13 12:41:00 +01:00
Ilya Tregubov 30991deb7c Merge branch 'MDL-72035-excel_csv_bom-311' of git://github.com/leonstr/moodle into MOODLE_311_STABLE 2021-08-13 11:24:55 +02:00
Jun Pataleta 8eddaa6479 Merge branch 'MDL-72330-311' of git://github.com/vmdef/moodle into MOODLE_311_STABLE 2021-08-13 11:00:47 +08:00
Andrew Nicols 137aed09fd Merge branch 'MDL-72325-311-tourspolicy' of git://github.com/mudrd8mz/moodle into MOODLE_311_STABLE 2021-08-13 09:58:59 +08:00
Víctor Déniz b6bb3e46dd MDL-72330 behat: revert previous incorrect change 2021-08-12 23:43:57 +01:00
Ilya Tregubov 707d09a568 weekly release 3.11.2+ 2021-08-12 16:50:17 +02:00
Ilya Tregubov bd7eb39d7c Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-08-12 16:50:15 +02:00
David Mudrák 3188b6fc52 MDL-72325 user: Do not show user tours without site policy agreed
Fetching user tours used to fail on external_api::validate_context() and
require_login() calls if the user did not have the site policy agreed.

The patch introduces a check to see if the user is fully set up and
ready to use the site before attempting to load the tours.
2021-08-12 13:22:07 +02:00
Víctor Déniz c5ff109f53 MDL-71500 calendar_threemonth: fix wrong behat step 2021-08-12 11:42:09 +01:00
Andrew Nicols a4cfda4e51 Merge branch 'MDL-71844-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-08-12 10:25:18 +08:00
Eloy Lafuente (stronk7) 6865a3a0a1 Merge branch 'MDL-72265_311' of https://github.com/timhunt/moodle into MOODLE_311_STABLE 2021-08-12 00:05:44 +02:00
Eloy Lafuente (stronk7) a990007a77 Merge branch 'MDL-71500-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-08-11 20:16:46 +02:00
Eloy Lafuente (stronk7) 8bb82b5bc7 Merge branch 'MDL-71945-M311S' of https://github.com/lucisgit/moodle into MOODLE_311_STABLE 2021-08-11 11:47:09 +02:00
Eloy Lafuente (stronk7) 9bcac8370b Merge branch 'MDL-72242-311-svgforcedfilter' of git://github.com/mudrd8mz/moodle into MOODLE_311_STABLE 2021-08-11 11:40:05 +02:00
Eloy Lafuente (stronk7) 774f6ff070 Merge branch 'MDL-71656-311' of git://github.com/HuongNV13/moodle into MOODLE_311_STABLE 2021-08-10 19:09:41 +02:00
Eloy Lafuente (stronk7) 1f343bf0a2 Merge branch 'MDL-70165-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-08-10 18:52:18 +02:00
Ilya Tregubov 983d456fa2 Merge branch 'MDL-72033-311' of git://github.com/NashTechOpenUniversity/moodle into MOODLE_311_STABLE 2021-08-10 16:08:38 +02:00
Tony Butler bf2a7643ef MDL-71945 mod_assign: Remove unneccesary call to assign_update_grades()
The update_grade() call achieves the same thing with additional checks.
2021-08-10 11:07:30 +01:00
Lars Bonczek 637ab9420c MDL-72271 mod_quiz: fix secure_window close function 2021-08-10 11:53:28 +02:00
Paul Holden f20a20b7b0 MDL-72106 calendar: redirect to same page post-subscription process.
Avoid issues when reloading page/re-sending POST data.
2021-08-10 09:40:54 +01:00
Paul Holden 84d1f3c078 MDL-71844 tool_task: preserve navigation when executing task. 2021-08-09 10:44:53 +01:00
Paul Holden a8fe74f951 MDL-71487 admin: ensure filesize settings don't overflow integer. 2021-08-09 10:36:04 +01:00
Paul Holden dd01ce509f MDL-70165 course: always import inplace editable module.
It's required on the course participants table for the roles/groups
columns, but isn't always loaded after adding the first participant.
2021-08-09 10:30:15 +01:00
AMOS bot 0f6ce1dce9 Automatically generated installer lang files 2021-08-06 00:07:28 +00:00
Srdjan e02b3beb79 MDL-69451 dml: use same temptables for both rw and ro database handle
moodle_read_slave_trait: when creating another handle, restore temptables
property that is clobbered by raw_connect().

Also a better condition for temptable related queries detection in
pgsql_native_moodle_database.

dml_pgsql_read_slave_test::test_temp_table(): use real db connection
if possible, otherwise skip the test.
2021-08-06 10:02:31 +10:00
Víctor Déniz 605ce2781b weekly release 3.11.2+ 2021-08-05 16:27:25 +01:00
Víctor Déniz 9f434e5844 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-08-05 16:27:20 +01:00
Tim Hunt 1c25e9ec53 MDL-72265 backup: fix checking of override capabilites on restore
Thanks to Peter Dias <peter@moodle.com> for his help with the unit test.
2021-08-05 14:28:37 +01:00
Víctor Déniz fb50327bcf Merge branch 'MDL-71835-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-08-04 23:32:01 +01:00
Víctor Déniz 435c0c34d6 Merge branch 'MDL-71152-311' of git://github.com/roland04/moodle into MOODLE_311_STABLE 2021-08-04 20:37:49 +01:00
Víctor Déniz 22ee833a80 Merge branch 'MDL-72262-311' of git://github.com/ilyatregubov/moodle into MOODLE_311_STABLE 2021-08-04 12:43:37 +01:00
abgreeve 439092427b Merge branch 'MDL-71050-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-08-04 15:53:15 +08:00
abgreeve 0af232b461 Merge branch 'MDL-67833-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-08-03 10:26:49 +08:00
Dan Marsden 1f1ecab583 MDL-70006 analytics: Don't send notifications to suspended enrolments. 2021-08-03 10:55:17 +12:00
Paul Holden f8cffa2803 MDL-71121 backup: apply config defaults for async backups. 2021-08-02 23:35:03 +01:00
David Mudrák 7e3ea17638 MDL-72242 files: Do not force text filtering of SVG files
It was a mistake to force filtering of SVG files in MDL-55243. It can
easily lead to corrupted SVG files.

The patch removes that forced filtering and clarifies the inline comment
of what and why we need to do.
2021-08-02 14:43:21 +02:00
Paul Holden 4feb3c4835 MDL-72257 gradeexport_xml: detect absense of grade items to export.
Where there are no grade items with idnumbers for selection, then
nothing should be exported. Currently, this is being interpreted as
the user exporting all grade items.
2021-08-02 10:24:01 +01:00
Ilya Tregubov 8521213b82 MDL-72262 behat: Make alias shorter to fix Oracle failures. 2021-08-02 08:26:39 +02:00
AMOS bot 205438924a Automatically generated installer lang files 2021-07-31 00:07:30 +00:00
Víctor Déniz b3a82b1b1e Merge branch 'MDL-72085-MOODLE_311_STABLE' of https://github.com/dmitriim/moodle into MOODLE_311_STABLE 2021-07-30 08:52:32 +01:00
Dmitrii Metelkin a6a5070d06 MDL-72085 core_phpunit: reset session notifications 2021-07-30 10:02:49 +10:00
Jun Pataleta 0a21811ed0 Moodle release 3.11.2 2021-07-29 10:03:20 +08:00
Ilya Tregubov 5102a3a04f weekly release 3.11.1+ 2021-07-28 16:48:22 +02:00
Ilya Tregubov ae77cfd5af Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-07-28 16:48:20 +02:00
Ilya Tregubov 6da13bc87a Merge branch 'MDL-71672-311-2' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-07-28 11:16:47 +02:00
Jun Pataleta a8f4ba9af1 Merge branch 'MDL-72203-311-2' of git://github.com/mickhawkins/moodle into MOODLE_311_STABLE 2021-07-28 11:26:52 +08:00
AMOS bot b9ab9d82e9 Automatically generated installer lang files 2021-07-28 00:07:28 +00:00
Mike Churchward ec367da169 MDL-71925 tool_brickfield: Limited DOM tag count using core function. 2021-07-27 15:52:58 -04:00
Michael Hawkins dc19dd6134 MDL-72203 curl: Improve redirect unit testing and update upgrade.txt
lib/upgrade.txt was updated to reflect the fact that all cURL redirects
will be emulated.
2021-07-27 23:09:09 +08:00
David Mudrák 986a6f6f40 MDL-72203 curl: Remove duplicate unit tests for emulated redirects
Before, we had each redirect test duplicated: one for the native
redirects via native cURL, second for our emulated implementation. Now
all redirects are always emulated so there is no need to have them
tested twice.
2021-07-27 22:56:48 +08:00
David Mudrák cbf9dfbd8d MDL-72203 curl: Check each URL in redirect chain to see if it is blocked
The security problem here was that only the first and the last URL in
the redirect chain was checked by the security helper. This patch forces
the curl wrapper to always emulate cURL redirects and check every
redirect URL in the chain before actually visiting it.
2021-07-27 22:56:48 +08:00
David Mudrák 6527cbc492 MDL-72203 curl: Warn if someone actually started to use $maxredirects
The new parameter of curl_security_helper::url_is_blocked() introduced
in MDL-71916 became part of the API. Even if we reverted it quickly,
someone can use a released Moodle version that has that parameter in
place. For that reason and also to avoid potential troubles in the
future (e.g. when yet another argument would be added to this method),
we need to make it clear that the second parameter of this method should
never be used again.

Poor $maxredirects, you did not live long with us. Oh well.
2021-07-27 22:56:48 +08:00
David Mudrák 5068469f6f MDL-72203 curl: Revert original fix of redirects to blocked URLs
This reverts the original fix introduced in MDL-71916. It introduced an
extra native cURL call inside curl_security_helper to check if the given
URL triggers a redirect to a blocked URL or not.

Shortly after the release, a couple of regressions were reported as a
result of the integrated solution. It was agreed to revert the fix and
progress with implementing an alternative approach.
2021-07-27 22:56:48 +08:00
Ilya Tregubov 3f9cc1fc76 Merge branch 'MDL-72179-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-07-27 12:37:38 +02:00
Andrew Nicols 3dd5ef4cc0 MDL-72179 behat: Make use of page resolvers 2021-07-26 15:14:24 +08:00
Andrew Nicols 2b7a9da30f MDL-72179 behat: Add page resolvers for activity roles/perms 2021-07-23 20:44:26 +08:00
Andrew Nicols 9f1f8e584f MDL-72179 behat: Add page resolver for activity names 2021-07-23 20:43:47 +08:00
Andrew Nicols 68edc3c42a MDL-72179 behat: Add activity editing page resolution 2021-07-23 20:43:47 +08:00
Andrew Nicols 3d4b232a4a MDL-72179 behat: Fix page resolvers to remove ambiguity
The simple pattern matches were conflicting in some situations. To make
this backwards compatable we need to convert it to a Regex pattern match
instead, and provide the quoted and unquoted variants.
2021-07-23 20:43:47 +08:00
Andrew Nicols 63df6e1ee2 MDL-72179 behat: Correct course category page resolving
There were two issues here:
* I am on the [categoryname] category page page (duplicated page)
* the wrong URL was being used

Since an incorrect URL was used I felt it safe to rename the step from
'category page page' to 'category page'.
2021-07-23 20:43:47 +08:00
Andrew Nicols 30adbbf796 MDL-72179 behat: Lowercase all page instance resolvers 2021-07-23 20:43:47 +08:00
Andrew Nicols 995ceb32d0 MDL-72179 behat: Improve core page resolvers
This commit makes the following improvements to core page resolverss:
* allows for mixed case naming (course, Course, etc.)
* allows fields other than the idnumber to be specified:
** course: idnumber, shortname, fullname
** course category: idnumber, name

Whilst some of these fields are not unique, they will typically be
unique in most test scenarios. Where they are not then the idnumber
should be used in preference.
2021-07-23 20:28:10 +08:00
Ilya Tregubov 2c69199ca1 weekly release 3.11.1+ 2021-07-23 11:31:01 +02:00
Ilya Tregubov 0ca014907b Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-07-23 11:30:59 +02:00
Jun Pataleta 8096d76275 MDL-72206 theme_boost: Have env check classes extend alert classes
To achieve good colour contrast and consistency with other parts of
Moodle, the environment check classes need to extend the alert-*
classes.
2021-07-23 15:07:59 +08:00
Andrew Nicols 2afafa0431 Merge branch 'MDL-70427-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-07-22 11:22:56 +08:00
AMOS bot 9fb9779780 Automatically generated installer lang files 2021-07-22 00:07:33 +00:00
Víctor Déniz e08da48fbd Merge branch 'MDL-72108-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-07-21 19:28:54 +01:00
Ilya Tregubov d6bd634cc5 Merge branch 'MDL-72125-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-07-19 14:00:45 +02:00
Andrew Nicols 3fb79f7a6a MDL-72125 mod_assign: Use assign submission data generators 2021-07-19 18:41:31 +08:00
Andrew Nicols 94bdaa6b4e MDL-72125 mod_assign: Add data generator for assign submissions 2021-07-19 18:41:31 +08:00
Andrew Nicols aa1f55f1bc MDL-72125 testing: Make global $CFG available when including generators
This will remove the requirement to add the global $CFG call to the top
of generator scripts.
2021-07-19 18:41:31 +08:00
Shamim Rezaie f2a52e06e5 MDL-71672 javascript: Fix the markup in the header of YUI dialogs
Move the close button out of the element that is set as the
aria-labelledby for the dialog.
Also used h5 for the dialog titles so they are consistent with
AMD modals.
2021-07-19 16:41:52 +10:00
Shamim Rezaie 2bafc91952 MDL-71672 atto_equation: Fix the markup and the initial focused element
The initial focused element should be the first operator button.
This commit also fixes the accessibility issues that previously were
wrongly fixed by a redundant click on the first tab using javascript.
2021-07-19 16:41:51 +10:00
Shamim Rezaie aa3a2a43ea MDL-71672 atto_managefiles: Focus the first file manager button 2021-07-19 16:41:51 +10:00
Shamim Rezaie a7c9576c20 MDL-71672 atto_emojipicker: Focus the search bar initially 2021-07-19 16:41:51 +10:00
Shamim Rezaie 321c443838 MDL-71672 atto_recordrtc: focus Atto button after hide 2021-07-19 16:41:51 +10:00
Shamim Rezaie c34bd1aa46 MDL-71672 javascript: Fix the issue of focusOnShowSelector being ignored
When focusOnShowSelector is not present, as a fallback, focus the first
focusable element in YUI dialogues
Ref:
https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/dialog_role
2021-07-19 16:41:51 +10:00
Mikel Martín 46225f323a MDL-71152 theme_boost: Use 'scroll-margin-top' for anchor links
Current anchor link offset fix is not working with 'display:flex' elements
2021-07-16 11:56:24 +02:00
boygr49p 5cadd35f14 MDL-71500 calendar_threemonth: add behat step and coverage 2021-07-16 15:08:27 +08:00
boygr49p fa3f88babb MDL-71500 calendar_threemonth: clicking in a diff day should refresh day view
Clicking in a day in the three month block replaces the div with id starting
with calendar- so we can do so repeatedly and successfully and test that it does (with behat).
2021-07-16 15:08:27 +08:00
Andrew Nicols e6e1b50c31 MDL-72163 admin: Plugins overview page should link to categories 2021-07-16 13:49:43 +08:00
Andrew Nicols 2fe23b9295 MDL-72125 behat: Add get_activity_id() behat generators helper 2021-07-16 12:33:56 +08:00
Andrew Nicols c9a309ed6a MDL-72125 testing: Set a default idnumber when creating activities
The activity generator currently requires an idnumber when creating
activities, but this is not a requirement when creating the same
activity through the UI. The requirement comes because we want to
provide a way to refer to activities in subsequent steps.

This commit modifies the behaviour such that the generator uses the name
of the activity as the default idnumber.

This has two  main benefits:
1. it simplfies generation of activities; and
2. it makes the language used when writing behat tests much more natural.

With this change, steps will refer to the activity by its idnumber/title
in all cases, rather than sometimes by an idnumber which bears no
relevance to the title.
2021-07-16 12:33:56 +08:00
Andrew Nicols a247fd8d93 MDL-72125 testing: Add helper to run generators as a user 2021-07-16 12:33:56 +08:00
Thach Le Huy 7076db3492 MDL-72033 User tours: step placement issues if screen too narrow 2021-07-16 11:05:51 +07:00
abgreeve 5774e9e081 weekly release 3.11.1+ 2021-07-16 10:16:38 +08:00
abgreeve fdaeb5c7c3 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-07-16 10:16:37 +08:00
AMOS bot ff2de0df79 Automatically generated installer lang files 2021-07-16 00:07:29 +00:00
sam marshall cfb22b5591 MDL-72152 Behat: No way to test key shortcuts with letter keys
Extends the existing step 'And I press the Shift Left key' so that
it supports letter/other keys: 'And I press the Ctrl C key'.
2021-07-15 10:46:45 +01:00
Jun Pataleta 2cde9d6aff Merge branch 'MDL-63770-311' of /home/jun/moodles/stable_311/moodle into MOODLE_311_STABLE 2021-07-15 16:15:39 +08:00
Matteo Scaramuccia 15d50814c6 MDL-63770 core: 'port' should be an integer like in parse_url()
Plus trivial comment cleanup.
2021-07-15 11:39:33 +08:00
Dmitri Pisarev aa59c122df MDL-63770 core: Fix a false-positive in reverseproxyabused check
A `reverseproxyabused` error is wrongly triggered when external port number doesn't equal internal.
2021-07-15 11:39:33 +08:00
Eloy Lafuente (stronk7) 0443be1bca Merge branch 'MDL-67338-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-07-15 00:34:42 +02:00
Paul Holden de589ca25d MDL-67338 message: re-implement block page type patterns.
The `page_type_list` method for the message component was deprecated
in 5b0769db as part of MDL-54744. However it is still required when
trying to configure blocks on any messaging pages.
2021-07-14 19:32:24 +01:00
Eloy Lafuente (stronk7) c2dd676a4e Merge branch 'MDL-72139-311' of git://github.com/cescobedo/moodle into MOODLE_311_STABLE 2021-07-14 13:59:58 +02:00
cescobedo beb13397f8 MDL-72139 core_message: Fix encoding UTF-8 in prevent unclosed tags 2021-07-14 07:41:24 +02:00
Eloy Lafuente (stronk7) 13a902faea Merge branch 'MDL-71874-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-07-13 20:38:10 +02:00
Sara Arjona 7487cbd043 Merge branch 'MDL-71782_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-07-13 16:44:40 +02:00
Jun Pataleta f884dee7e8 Merge branch 'MDL-72036-311' of git://github.com/sarjona/moodle into MOODLE_311_STABLE 2021-07-13 16:05:36 +08:00
Sara Arjona f008960321 MDL-72036 atto_h5p: Random error with external URL
After a major upgrade was done in h5p.com, some random errors appeared
in the "H5P options are ignored for H5P URLs" scenario.
They have been fixed replacing the URL for different (which should
load quicker). As we're checking external content, no other improvement
can be done on the Moodle site.
2021-07-13 08:37:42 +02:00
Huong Nguyen f53dd9c5d2 MDL-71656 atto: Add meaningful labels to colour items
Colour chooser supported:
 - atto_fontcolor
 - atto_backcolor
2021-07-13 13:07:06 +07:00
Paul Holden e6a4dde54b MDL-70427 task: correct missing component when queuing adhoc task.
If the task belongs to a component, and doesn't have it's own
component property set then we can lazy-load it based on class
namespace.
2021-07-12 20:47:00 +01:00
Paul Holden 2a2fd7ad38 MDL-70427 admin: remove plugin adhoc tasks during uninstall. 2021-07-12 20:45:07 +01:00
Paul Holden 37716dc58e MDL-71050 h5p: account for parent languages retrieving translations.
Take account of parent languages when requesting given library
translation. For example if we are currently using "de_kids" as the
current language, we need to recurse each language pack looking for
a matching H5P translation ("de_kids" -> "de_du" -> "de").
2021-07-12 13:17:07 +01:00
AMOS bot bb4bcb120d Automatically generated installer lang files 2021-07-11 00:07:26 +00:00
Eloy Lafuente (stronk7) 1e03249349 MDL-71782 behat: Ensure page after saving changes is there
A similar approach was followed @ MDL-67935, although the
case doesn't seem to be the same.

In any case, it's curious that all local execution are
100% passing and only CIs fail so often. Just guessing if,
maybe, there is some Chrome version factor around (we
are running older, sticky, versions @ CIs.
2021-07-10 15:50:31 +02:00
Paul Holden 1f20d8dfed MDL-71835 report_log: correct query returning user fullname from DB. 2021-07-09 13:54:18 +01:00
Paul Holden b40cf3ba54 MDL-67833 tool_customlang: break long text in component column. 2021-07-09 11:37:04 +01:00
Andrew Nicols d2cd91224f MDL-72108 js: Fix incorrect jsdoc examples for core/ajax 2021-07-08 10:39:44 +08:00
Leon Stringer 3236bae2ed MDL-72035 csvlib: Write BOM for Excel
Add option to class csv_export_writer to prefix CSV file with UTF-8 byte
order mark (BOM).  This helps Microsoft Excel detect the file's character
encoding.
2021-06-30 15:01:11 +01:00
Daniel Neis Araujo f699d8ee39 MDL-71999 enrol: enrol_imsenterprise_allow_group_member_remove global 2021-06-23 13:21:24 -03:00
Dongsheng Cai 9a50919cbc MDL-71029 forum: fix post count for users have more than 1 enrolment 2021-06-23 09:44:05 +10:00
mohalisad 480ceb3b10 MDL-71973 analytics cli: fix enabling model bug
Fix the exception at line 143 caused by wrong argument for constructor in line 140
2021-06-21 18:51:10 +04:30
Andrew Nicols 4abe3027d8 MDL-71874 behat: Show warning when using add to section without js 2021-06-09 16:27:19 +08:00
918 changed files with 15803 additions and 8671 deletions
+61 -3
View File
@@ -2,6 +2,7 @@
'plugins': [
'babel',
'promise',
'jsdoc',
],
'env': {
'browser': true,
@@ -191,7 +192,6 @@
'property': 'str',
'message': 'Use AMD module "core/str" or M.util.get_string()'
}],
},
overrides: [
{
@@ -200,7 +200,23 @@
rules: {
'no-undef': 'off',
'no-unused-vars': 'off',
'no-unused-expressions': 'off'
'no-unused-expressions': 'off',
// === JSDocs ===
"jsdoc/check-access": 'off',
"jsdoc/check-alignment": 'off',
"jsdoc/check-param-names": 'off',
"jsdoc/check-property-names": 'off',
"jsdoc/empty-tags": 'off',
"jsdoc/implements-on-classes": 'off',
"jsdoc/multiline-blocks": 'off',
"jsdoc/require-jsdoc": 'off',
"jsdoc/require-param": 'off',
"jsdoc/require-param-name": 'off',
"jsdoc/require-param-type": 'off',
"jsdoc/require-property": 'off',
"jsdoc/require-property-name": 'off',
"jsdoc/require-property-type": 'off',
}
},
{
@@ -238,7 +254,49 @@
// === Promises ===
// We have Promise now that we're using ES6.
'promise/no-native': 'off',
'promise/avoid-new': 'off'
'promise/avoid-new': 'off',
// === JSDocs ===
"jsdoc/check-access": [
'error',
],
"jsdoc/check-alignment": 1, // Recommended.
"jsdoc/check-param-names": [
'error',
],
"jsdoc/check-property-names": [
'error',
],
"jsdoc/empty-tags": [
'error',
],
"jsdoc/implements-on-classes": [
'error',
],
"jsdoc/multiline-blocks": [
'error',
],
"jsdoc/require-jsdoc": [
'error',
],
"jsdoc/require-param": [
'error',
],
"jsdoc/require-param-name": [
'error',
],
"jsdoc/require-param-type": [
'error',
],
"jsdoc/require-property": [
'error',
],
"jsdoc/require-property-name": [
'error',
],
"jsdoc/require-property-type": [
'error',
],
},
parserOptions: {
'ecmaVersion': 9,
+1 -1
View File
@@ -1 +1 @@
v14.15.0
v14.18.0
+3 -1
View File
@@ -126,6 +126,7 @@ class filesize extends \admin_setting {
if (is_null($bytes)) {
return null;
}
$bytes = intval($bytes);
return self::parse_bytes($bytes);
}
@@ -145,9 +146,10 @@ class filesize extends \admin_setting {
return get_string('errorsetting', 'admin');
}
// Calculate size in bytes, ensuring we don't overflow PHP_INT_MAX.
$bytes = $data['v'] * $data['u'];
$result = (is_int($bytes) && $this->config_write($this->name, $bytes));
$result = $this->config_write($this->name, $bytes);
return ($result ? '' : get_string('errorsetting', 'admin'));
}
+8 -1
View File
@@ -120,7 +120,14 @@ if ($options['unset'] || $options['set'] !== null) {
}
// Check that the variable is not hard-set in the main config.php already.
if (array_key_exists($options['name'], $CFG->config_php_settings)) {
$component = $options['component'];
if (!empty($component)) {
$componentsettings = $CFG->forced_plugin_settings[$component] ?? [];
$settinginconfig = array_key_exists($options['name'], $componentsettings);
} else {
$settinginconfig = array_key_exists($options['name'], $CFG->config_php_settings);
}
if ($settinginconfig) {
cli_error('The configuration variable is hard-set in the config.php, unable to change.', 4);
}
+15
View File
@@ -3163,6 +3163,11 @@
<ON_CHECK message="sixtyfourbitswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_igbinary322_version" level="optional">
<FEEDBACK>
<ON_CHECK message="igbinary322buggyversion" />
</FEEDBACK>
</CUSTOM_CHECK>
</CUSTOM_CHECKS>
</MOODLE>
<MOODLE version="3.10" requires="3.5">
@@ -3345,6 +3350,11 @@
<ON_CHECK message="sixtyfourbitswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_igbinary322_version" level="optional">
<FEEDBACK>
<ON_CHECK message="igbinary322buggyversion" />
</FEEDBACK>
</CUSTOM_CHECK>
</CUSTOM_CHECKS>
</MOODLE>
<MOODLE version="3.11" requires="3.6">
@@ -3714,6 +3724,11 @@
</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_CHECKS>
</MOODLE>
</COMPATIBILITY_MATRIX>
+27 -16
View File
@@ -220,7 +220,7 @@ class core_admin_renderer extends plugin_renderer_base {
$output .= $this->container_end();
}
$button = new single_button($continueurl, get_string('upgradestart', 'admin'), 'get');
$button = new single_button($continueurl, get_string('upgradestart', 'admin'), 'get', true);
$button->class = 'continuebutton';
$output .= $this->render($button);
$output .= $this->footer();
@@ -1616,12 +1616,18 @@ class core_admin_renderer extends plugin_renderer_base {
$plugininfo = $pluginman->get_plugins();
$numtotal = $numextension = $numupdatable = 0;
$numtotal = $numextension = $numupdatable = $numinstallable = 0;
foreach ($plugininfo as $type => $plugins) {
foreach ($plugins as $name => $plugin) {
if ($plugin->available_updates()) {
if ($res = $plugin->available_updates()) {
$numupdatable++;
foreach ($res as $updateinfo) {
if ($pluginman->is_remote_plugin_installable($updateinfo->component, $updateinfo->version, $reason, false)) {
$numinstallable++;
break;
}
}
}
if ($plugin->get_status() === core_plugin_manager::PLUGIN_STATUS_MISSING) {
continue;
@@ -1664,16 +1670,13 @@ class core_admin_renderer extends plugin_renderer_base {
$out .= $this->output->heading(get_string('overviewext', 'core_plugin'), 3);
}
if ($numupdatable) {
$installableupdates = $pluginman->filter_installable($pluginman->available_updates());
if ($installableupdates) {
$out .= $this->output->single_button(
new moodle_url($this->page->url, array('installupdatex' => 1)),
get_string('updateavailableinstallall', 'core_admin', count($installableupdates)),
'post',
array('class' => 'singlebutton updateavailableinstallall')
);
}
if ($numinstallable) {
$out .= $this->output->single_button(
new moodle_url($this->page->url, array('installupdatex' => 1)),
get_string('updateavailableinstallall', 'core_admin', $numinstallable),
'post',
array('class' => 'singlebutton updateavailableinstallall')
);
}
$out .= html_writer::div($infoall, 'info info-all').
@@ -1907,7 +1910,7 @@ class core_admin_renderer extends plugin_renderer_base {
'infos'
);
if ($pluginman->is_remote_plugin_installable($updateinfo->component, $updateinfo->version, $reason)) {
if ($pluginman->is_remote_plugin_installable($updateinfo->component, $updateinfo->version, $reason, false)) {
$box .= $this->output->single_button(
new moodle_url($this->page->url, array('installupdate' => $updateinfo->component,
'installupdateversion' => $updateinfo->version)),
@@ -2127,8 +2130,16 @@ class core_admin_renderer extends plugin_renderer_base {
$output .= $this->container_start('upgradekeyreq');
$output .= $this->heading(get_string('upgradekeyreq', 'core_admin'));
$output .= html_writer::start_tag('form', array('method' => 'POST', 'action' => $url));
$output .= html_writer::empty_tag('input', array('name' => 'upgradekey', 'type' => 'password'));
$output .= html_writer::empty_tag('input', array('value' => get_string('submit'), 'type' => 'submit'));
$output .= html_writer::empty_tag('input', [
'name' => 'upgradekey',
'type' => 'password',
'class' => 'form-control w-auto',
]);
$output .= html_writer::empty_tag('input', [
'type' => 'submit',
'value' => get_string('submit'),
'class' => 'btn btn-primary mt-3',
]);
$output .= html_writer::end_tag('form');
$output .= $this->container_end();
$output .= $this->footer();
+2 -5
View File
@@ -53,11 +53,8 @@ class behat_admin extends behat_base {
}
foreach ($data as $label => $value) {
$this->execute('behat_navigation::i_select_from_flat_navigation_drawer', [get_string('administrationsite')]);
// Search by label.
$this->execute('behat_forms::i_set_the_field_to', [get_string('search'), $label]);
$this->execute("behat_forms::press_button", get_string('search', 'admin'));
// Navigate straight to the search results fo rthis label.
$this->execute('behat_general::i_visit', ["/admin/search.php?query=" . urlencode($label)]);
// Admin settings does not use the same DOM structure than other moodle forms
// but we also need to use lib/behat/form_field/* to deal with the different moodle form elements.
+1 -1
View File
@@ -30,7 +30,7 @@ Feature: Manage external services tokens
And I press "Delete"
And "Firstname1 Lastname1" "table_row" should not exist
@javascript
@javascript @skip_chrome_zerosize
Scenario: Tokens can be filtered by user and by service
Given the following "core_webservice > Service" exists:
| name | Site information |
+1 -1
View File
@@ -137,7 +137,7 @@ if (!empty($validdatasets) && !$model->is_enabled() && $options['non-interactive
}
// Refresh the instance to prevent unexpected issues.
$model = new \core_analytics\model($modelobj);
$model = new \core_analytics\model($options['modelid']);
// Set the time splitting method file and enable it.
$model->enable($input);
@@ -48,7 +48,7 @@ Feature: Verify that all form fields values can be get and set
And the "Unenrol users" select box should not contain "Baker"
And the "Unenrol users" select box should not contain "President, Baker"
And I am on "Course 1" course homepage with editing mode on
And I follow "Test this one"
And I am on the "Test this one" "wiki activity" page
And I press "Create page"
# Text (textarea & editor) & Select (multi-select) - Checking "I set the following fields to these values".
When I set the following fields to these values:
@@ -61,8 +61,7 @@ Feature: Verify that all form fields values can be get and set
# Checkbox - Checking "I set the field" and "The field matches value" ticked.
And I set the field "Force format" to "1"
And I press "Save and return to course"
And I should see "Test this one"
And I follow "Test this one"
And I am on the "Test this one" "wiki activity" page
And I navigate to "Edit settings" in current page administration
And I expand all fieldsets
And the field "Force format" matches value "1"
@@ -70,8 +69,7 @@ Feature: Verify that all form fields values can be get and set
# Checkbox - Checking "I set the field" and "The field matches value" unticked.
And I set the field "Force format" to ""
And I press "Save and return to course"
And I should see "Test this one"
And I follow "Test this one"
And I am on the "Test this one" "wiki activity" page
And I navigate to "Edit settings" in current page administration
And I expand all fieldsets
And the field "Force format" matches value ""
@@ -80,8 +78,7 @@ Feature: Verify that all form fields values can be get and set
And I set the following fields to these values:
| Force format | 1 |
And I press "Save and return to course"
And I should see "Test this one"
And I follow "Test this one"
And I am on the "Test this one" "wiki activity" page
And I navigate to "Edit settings" in current page administration
And I expand all fieldsets
And the following fields match these values:
@@ -92,8 +89,7 @@ Feature: Verify that all form fields values can be get and set
And I set the following fields to these values:
| Force format | |
And I press "Save and return to course"
And I should see "Test this one"
And I follow "Test this one"
And I am on the "Test this one" "wiki activity" page
And I navigate to "Edit settings" in current page administration
And I expand all fieldsets
And the following fields match these values:
@@ -126,14 +122,13 @@ Feature: Verify that all form fields values can be get and set
| section | 1 |
| allowupdate | 1 |
And I am on "Course 1" course homepage
And I follow "Test choice name"
And I navigate to "Edit settings" in current page administration
And I am on the "Test choice name" "choice activity editing" page
And I set the field "Option 1" to "one"
And I set the field "Option 2" to "two"
And I set the field "Option 3" to "three"
And I press "Save and return to course"
And I am on "Course 1" course homepage
And I follow "Test choice name"
And I am on the "Test choice name" "choice activity" page
And I set the field "one" to "1"
And I press "Save my choice"
And the field "one" matches value "1"
@@ -183,31 +178,23 @@ Feature: Verify that all form fields values can be get and set
And I press "Cancel"
# Advanced checkbox requires real browser to allow uncheck to work. MDL-58681. MDL-55386.
# Advanced checkbox - Checking "I set the field" and "The field matches value" ticked.
And I am on "Course 1" course homepage
And I follow "Test this one"
And I navigate to "Edit settings" in current page administration
And I am on the "Test choice name" "choice activity editing" page
And I set the field "Display description on course page" to "1"
And I press "Save and return to course"
And I should see "Test this one"
And I follow "Test this one"
And I navigate to "Edit settings" in current page administration
And I am on the "Test choice name" "choice activity editing" page
And the field "Display description on course page" matches value "1"
And the field "Display description on course page" does not match value ""
# Advanced checkbox - Checking "I set the field" and "The field matches value" unticked.
And I set the field "Display description on course page" to ""
And I press "Save and return to course"
And I should see "Test this one"
And I follow "Test this one"
And I navigate to "Edit settings" in current page administration
And I am on the "Test choice name" "choice activity editing" page
And the field "Display description on course page" matches value ""
And the field "Display description on course page" does not match value "1"
# Advanced checkbox - Checking "I set the following fields to these values:" and "The following fields match these values" ticked.
And I set the following fields to these values:
| Display description on course page | 1 |
And I press "Save and return to course"
And I should see "Test this one"
And I follow "Test this one"
And I navigate to "Edit settings" in current page administration
And I am on the "Test choice name" "choice activity editing" page
And the following fields match these values:
| Display description on course page | 1 |
And the following fields do not match these values:
@@ -216,9 +203,7 @@ Feature: Verify that all form fields values can be get and set
And I set the following fields to these values:
| Display description on course page | |
And I press "Save and return to course"
And I should see "Test this one"
And I follow "Test this one"
And I navigate to "Edit settings" in current page administration
And I am on the "Test choice name" "choice activity editing" page
And the following fields match these values:
| Display description on course page | |
And the following fields do not match these values:
@@ -0,0 +1,85 @@
@tool @tool_behat
Feature: Use core page resolvers for the I am on the page steps
In order to write tests correctly
As a developer
I need to have steps which take me straight to a page
Scenario Outline: When I am on an instance
Given the following "categories" exist:
| name | category | idnumber |
| Cat 1 | 0 | CAT1 |
And the following "course" exists:
| fullname | Economics 101 |
| shortname | ECON101 |
| idnumber | 2021-econ101 |
And the following "activity" exists:
| course | ECON101 |
| activity | forum |
| name | Fundamentals of Economics |
| idnumber | fundamentalsofeconomics |
And I log in as "admin"
When I am on the <identifier> <type> page
Then I should see "<shouldsee>"
Examples:
| description | identifier | type | shouldsee |
| Course Category idnumber | CAT1 | category | Add a new course |
| Course Category name | "Cat 1" | Category | Add a new course |
| Course Full name | "Economics 101" | course | Fundamentals of Economics |
| Course Short name | ECON101 | COURSE | Fundamentals of Economics |
| Course idnumber | "2021-econ101" | Course | Fundamentals of Economics |
| Forum idnumber | fundamentalsofeconomics | Activity | Add a new discussion |
| Generic activity editing | fundamentalsofeconomics | "Activity editing" | Updating: Forum |
| Forum name | "Fundamentals of Economics" | "Forum activity" | Add a new discussion |
| Forum name editing | "Fundamentals of Economics" | "Forum activity editing" | Updating: Forum |
| Forum name permissions | "Fundamentals of Economics" | "Forum activity permissions" | Permissions in Forum: Fun |
| Forum name roles | "Fundamentals of Economics" | "Forum activity roles" | Assign roles in Forum: Fun |
Scenario Outline: When I am on an instance logged in as
Given the following "categories" exist:
| name | category | idnumber |
| Cat 1 | 0 | CAT1 |
And the following "course" exists:
| fullname | Economics 101 |
| shortname | ECON101 |
| idnumber | 2021-econ101 |
And the following "activity" exists:
| course | ECON101 |
| activity | forum |
| name | Fundamentals of Economics |
| idnumber | fundamentalsofeconomics |
When I am on the <identifier> <type> page logged in as admin
Then I should see "<shouldsee>"
Examples:
| description | identifier | type | shouldsee |
| Course Category idnumber | CAT1 | category | Add a new course |
| Course Category name | "Cat 1" | Category | Add a new course |
| Course Full name | "Economics 101" | course | Fundamentals of Economics |
| Course Short name | ECON101 | COURSE | Fundamentals of Economics |
| Course idnumber | "2021-econ101" | Course | Fundamentals of Economics |
| Forum idnumber | fundamentalsofeconomics | Activity | Add a new discussion |
| Generic activity editing | fundamentalsofeconomics | "Activity editing" | Updating: Forum |
| Forum name | "Fundamentals of Economics" | "Forum activity" | Add a new discussion |
| Forum name editing | "Fundamentals of Economics" | "Forum activity editing" | Updating: Forum |
| Forum name permissions | "Fundamentals of Economics" | "Forum activity permissions" | Permissions in Forum: Fun |
| Forum name roles | "Fundamentals of Economics" | "Forum activity roles" | Assign roles in Forum: Fun |
Scenario Outline: When I am on a named page
Given I log in as "admin"
When I am on the <identifier> page
Then I should see "<shouldsee>"
Examples:
| description | identifier | shouldsee |
| Admin page | "Admin notifications" | Check for available updates |
| Home page | Homepage | Recently accessed courses |
Scenario Outline: When I am on a named page logged in as
When I am on the <identifier> page logged in as admin
Then I should see "<shouldsee>"
Examples:
| description | identifier | shouldsee |
| Admin page | "Admin notifications" | Check for available updates |
| Home page | Homepage | Recently accessed courses |
@@ -0,0 +1,110 @@
@tool_behat
Feature: Verify that the behat login and logout steps work as expected
In order to use behat login and log out steps
As a test writer
I need to verify that login and logout happen when the steps are used
Scenario: Log in as a user using the step
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
When I log in as "traverst1"
Then I should see "Thomas Travers"
@javascript
Scenario: Log in as a user using the step (javascript)
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
When I log in as "traverst1"
Then I should see "Thomas Travers"
Scenario: Log out using the log out step
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
And I am logged in as traverst1
When I log out
Then I should not see "Thomas Travers"
And I should see "You are not logged in"
@javascript
Scenario: Log out using the log out step (javascript)
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
And I am logged in as traverst1
When I log out
Then I should not see "Thomas Travers"
And I should see "You are not logged in"
Scenario: Log in step should automatically log user out if already logged in
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
| emeryj | Jane | Emery |
And I am logged in as traverst1
When I log in as "emeryj"
Then I should not see "Thomas Travers"
And I should see "Jane Emery"
@javascript
Scenario: Log in step should automatically log user out if already logged in (javascript)
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
| emeryj | Jane | Emery |
And I am logged in as traverst1
When I log in as "emeryj"
Then I should not see "Thomas Travers"
And I should see "Jane Emery"
Scenario: I am on page logged in as should redirect to correct page
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
And the following "course" exists:
| fullname | Life, the Universe, and Everything |
| shortname | hhgttg |
When I am on the hhgttg Course page logged in as traverst1
Then I should see "Thomas Travers"
And I should see "Life, the Universe, and Everything"
@javascript
Scenario: I am on page logged in as should redirect to correct page (javascript)
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
And the following "course" exists:
| fullname | Life, the Universe, and Everything |
| shortname | hhgttg |
When I am on the hhgttg Course page logged in as traverst1
Then I should see "Thomas Travers"
And I should see "Life, the Universe, and Everything"
Scenario: I am on page logged in as should redirect to correct page when automatically logging a user out
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
| emeryj | Jane | Emery |
And the following "course" exists:
| fullname | Life, the Universe, and Everything |
| shortname | hhgttg |
And I am logged in as emeryj
When I am on the hhgttg Course page logged in as traverst1
Then I should see "Thomas Travers"
And I should see "Life, the Universe, and Everything"
@javascript
Scenario: I am on page logged in as should redirect to correct page when automatically logging a user out (javacript)
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
| emeryj | Jane | Emery |
And the following "course" exists:
| fullname | Life, the Universe, and Everything |
| shortname | hhgttg |
And I am logged in as emeryj
When I am on the hhgttg Course page logged in as traverst1
Then I should see "Thomas Travers"
And I should see "Life, the Universe, and Everything"
@@ -40,14 +40,15 @@ class content_too_long extends brickfield_accessibility_test {
$contentlengthlimit = 500;
$pagetext = '';
foreach ($this->get_all_elements(null, 'text') as $element) {
$text = $element->nodeValue;
// There will be only one, but array is returned anyway.
foreach ($this->get_all_elements('body') as $element) {
$text = $element->textContent;
if ($text != null) {
$pagetext = $pagetext . $text;
}
}
$wordcount = str_word_count($pagetext);
$wordcount = count_words($pagetext);
if ($wordcount > $contentlengthlimit) {
$this->add_report(null, "<p id='wc'>Word Count: " . $wordcount . "</p>", false);
}
@@ -37,20 +37,15 @@ class content_too_long_test extends all_checks {
/** @var string Html fail */
private $htmlfail = <<<EOD
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="en">
<head>
<title>Content must not exceed a certain length</title>
</head>
<body>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent accumsan, ante varius viverra aliquam, dolor risus
<p><span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent accumsan, ante varius viverra aliquam, dolor risus
scelerisque massa, ut lacinia ipsum felis id est. Nullam convallis odio ante, in commodo elit fermentum sed. Vivamus ullamcorper
tincidunt sagittis. Sed et semper sapien. Quisque malesuada lacus nec libero cursus, aliquam malesuada neque ultricies. Cras sit
amet enim vel orci tristique porttitor a vitae urna. Suspendisse mi leo, hendrerit et eleifend a, mollis at ex. Maecenas eget
magna nec sem dignissim pharetra vel nec ex. Donec in porta lectus. Aenean porttitor euismod lectus, sodales eleifend ex egestas
in. Donec sed metus sodales, lobortis velit quis, dictum arcu.
Praesent mollis urna eget odio cursus, sit amet sollicitudin ante aliquam. Integer nec massa nec ipsum tincidunt laoreet in
vitae metus. Integer massa lacus, elementum quis dui sed, eleifend fringilla turpis. In hac habitasse platea dictumst. Phasellus
in. Donec sed metus sodales, lobortis velit quis, dictum arcu.</span></p>
<p><span>Praesent mollis urna eget odio cursus, sit amet sollicitudin ante aliquam. Integer nec massa nec ipsum tincidunt
laoreet in vitae metus.
Integer massa lacus, elementum quis dui sed, eleifend fringilla turpis. In hac habitasse platea dictumst. Phasellus
efficitur quis felis non eleifend. Sed et mauris vel lorem ultrices porta. Mauris commodo condimentum felis, vel dictum ex
laoreet sit amet. Duis venenatis ut lacus non ultrices. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
inceptos himenaeos. Nam nunc magna, semper feugiat feugiat a, pellentesque vel nulla.
@@ -59,9 +54,10 @@ class content_too_long_test extends all_checks {
blandit eget elit sit amet, suscipit mollis ligula. Suspendisse rutrum sem ex, eu commodo nisi aliquam sit amet. Fusce ut felis
justo. Sed a quam at lectus consectetur vulputate. Proin elementum dui nisi, in condimentum diam porttitor eget. Donec vehicula
condimentum velit vel semper. Mauris vehicula tortor lectus, quis convallis erat aliquet vel. In dictum nunc ac posuere porta.
Sed vel leo aliquam, volutpat ligula ac, blandit diam. Donec nec ligula lacus.
Mauris ac libero vel ex fringilla fringilla. Ut vehicula justo eu nunc imperdiet ultricies. Sed interdum ligula at nisi rhoncus
auctor. Sed tempus tellus eget risus placerat, et viverra dolor gravida. Sed ultricies neque id ex tempor viverra. Ut imperdiet
Sed vel leo aliquam, volutpat ligula ac, blandit diam. Donec nec ligula lacus.</span></p>
<p><span>Mauris ac libero vel ex fringilla fringilla. Ut vehicula justo eu nunc imperdiet ultricies. Sed interdum ligula at nisi
rhoncus auctor.
Sed tempus tellus eget risus placerat, et viverra dolor gravida. Sed ultricies neque id ex tempor viverra. Ut imperdiet
pharetra magna sed tristique. Pellentesque blandit elit ac neque lacinia finibus. Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Donec vel auctor dolor. Morbi id elit mollis ante mattis semper eu ac lectus. Integer elit turpis, facilisis
vel metus eget, blandit tempus arcu. Pellentesque eget magna eu ex eleifend tincidunt. Curabitur sit amet congue nisi.
@@ -69,29 +65,60 @@ class content_too_long_test extends all_checks {
turpis. Aenean tincidunt tristique dui, pretium lacinia felis posuere vel. Donec massa ligula, luctus vitae enim nec, sagittis
hendrerit lorem. In consequat sodales metus vel porttitor. Aenean fringilla fringilla risus, vitae interdum turpis egestas quis.
Aenean volutpat arcu leo, ut dictum purus consectetur id. Cras enim ipsum, tincidunt vitae mi vel, varius convallis ex. Fusce
pretium porttitor tempus.
Morbi laoreet dapibus lectus ut efficitur. Donec at hendrerit nunc. Vivamus venenatis augue non nulla finibus vestibulum. Nam
pretium porttitor tempus.</span></p>
<p>Morbi laoreet dapibus lectus ut efficitur. Donec at hendrerit nunc. Vivamus venenatis augue non nulla finibus vestibulum. Nam
nunc magna, hendrerit a ipsum nec, pulvinar imperdiet augue. Fusce vel metus maximus, mattis magna at, egestas enim. Suspendisse
et nisl at enim mollis scelerisque. Duis ut ipsum vel turpis eleifend aliquet a a ante. Nam lacinia purus vulputate purus
tincidunt, aliquet sagittis nisi sagittis. Pellentesque efficitur massa non ex sodales pretium. Cras convallis vitae ex et
dignissim. Nunc suscipit bibendum aliquam. Maecenas interdum tellus varius, laoreet velit sed, ornare arcu. Nunc pulvinar
elementum sem eget scelerisque. Duis volutpat tellus ut risus finibus, nec molestie erat fermentum
</p>
</body>
</html>
EOD;
/** @var string Multibyte html falure */
private $htmlfail2 = <<<EOD
<p><span>ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル ブルース カンベッル
</span></p>
EOD;
/** @var string Html pass */
private $htmlpass = <<<EOD
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="en">
<head>
<title>Content must not exceed a certain length/title>
</head>
<body>
<p>Nice and short text</p>
</body>
</html>
EOD;
/**
@@ -101,6 +128,9 @@ EOD;
$results = $this->get_checker_results($this->htmlfail);
$this->assertTrue($results[0]->message == '<p id=\'wc\'>Word Count: 578</p>');
$results = $this->get_checker_results($this->htmlfail2);
$this->assertTrue($results[0]->message == '<p id=\'wc\'>Word Count: 504</p>');
$results = $this->get_checker_results($this->htmlpass);
$this->assertEmpty($results);
}
@@ -97,7 +97,7 @@
{{#modified}}list-group-item-info{{/modified}}"
>
<div class="row">
<div class="col-sm-4 col-md-2">
<div class="col-sm-4 col-md-2 text-break">
<div class="d-md-none">
<strong>{{#str}}headingcomponent, tool_customlang{{/str}}</strong>
</div>
@@ -9,10 +9,8 @@ Feature: Manage data requests
| username | firstname | lastname | email |
| student1 | John | Doe | s1@example.com |
| student2 | Jane | Doe | s2@example.com |
And I log in as "admin"
And I set the following administration settings values:
| contactdataprotectionofficer | 1 |
And I log out
And the following config values are set as admin:
| contactdataprotectionofficer | 1 | tool_dataprivacy |
@javascript
Scenario: Marking general enquiries as complete
+1 -1
View File
@@ -27,7 +27,7 @@ require_once($CFG->libdir . '/adminlib.php');
admin_externalpage_setup('tool_filetypes');
$extension = required_param('extension', PARAM_RAW);
$extension = required_param('extension', PARAM_ALPHANUMEXT);
$redirecturl = new \moodle_url('/admin/tool/filetypes/index.php');
if (optional_param('revert', 0, PARAM_INT)) {
@@ -100,10 +100,12 @@ class tool_generator_testplan_backend extends tool_generator_backend {
*
* @param int $courseid The target course id
* @param bool $updateuserspassword Updates the course users password to $CFG->tool_generator_users_password
* @param int|null $size of the test plan. Used to limit the number of users exported
* to match the threads in the plan. For BC, defaults to null that means all enrolled users.
* @return stored_file
*/
public static function create_users_file($courseid, $updateuserspassword) {
$csvcontents = self::generate_users_file($courseid, $updateuserspassword);
public static function create_users_file($courseid, $updateuserspassword, ?int $size = null) {
$csvcontents = self::generate_users_file($courseid, $updateuserspassword, $size);
$fs = get_file_storage();
$filerecord = self::get_file_record('users', 'csv');
@@ -171,14 +173,18 @@ class tool_generator_testplan_backend extends tool_generator_backend {
*
* @param int $targetcourseid
* @param bool $updateuserspassword Updates the course users password to $CFG->tool_generator_users_password
* @param int|null $size of the test plan. Used to limit the number of users exported
* to match the threads in the plan. For BC, defaults to null that means all enrolled users.
* @return string The users csv file contents.
*/
protected static function generate_users_file($targetcourseid, $updateuserspassword) {
protected static function generate_users_file($targetcourseid, $updateuserspassword, ?int $size = null) {
global $CFG;
$coursecontext = context_course::instance($targetcourseid);
$users = get_enrolled_users($coursecontext, '', 0, 'u.id, u.username, u.auth', 'u.username ASC');
// If requested, get the number of users (threads) to use in the plan. We only need those in the exported file.
$planusers = self::$users[$size] ?? 0;
$users = get_enrolled_users($coursecontext, '', 0, 'u.id, u.username, u.auth', 'u.username ASC', 0, $planusers);
if (!$users) {
print_error('coursewithoutusers', 'tool_generator');
}
+1 -1
View File
@@ -98,7 +98,7 @@ if (empty($CFG->tool_generator_users_password) || is_bool($CFG->tool_generator_u
// Create files.
$courseid = $DB->get_field('course', 'id', array('shortname' => $shortname));
$usersfile = tool_generator_testplan_backend::create_users_file($courseid, !empty($options['updateuserspassword']));
$usersfile = tool_generator_testplan_backend::create_users_file($courseid, !empty($options['updateuserspassword']), $size);
$testplanfile = tool_generator_testplan_backend::create_testplan_file($courseid, $size);
// One file path per line so other CLI scripts can easily parse the output.
+1 -1
View File
@@ -51,7 +51,7 @@ if ($data = $mform->get_data()) {
// Creating both test plan and users files.
$testplanfile = tool_generator_testplan_backend::create_testplan_file($data->courseid, $data->size);
$usersfile = tool_generator_testplan_backend::create_users_file($data->courseid, $data->updateuserspassword);
$usersfile = tool_generator_testplan_backend::create_users_file($data->courseid, $data->updateuserspassword, $data->size);
// Test plan link.
$testplanurl = moodle_url::make_pluginfile_url(
+7
View File
@@ -1,6 +1,13 @@
This files describes API changes in core libraries and APIs,
information provided here is intended especially for developers.
=== 3.11.4 ===
* Function tool_generator_testplan_backend::create_users_file() now supports to pass the size of the testing plan,
that needs to be equal or smaller than the size of the generated site. That's used to effectively restrict the
exported number of users to the number of threads the jmeter plan will have (previously all the enrolled users
were being exported, with that leading to "false" loops (users not really looping X times).
=== 3.7 ===
* Function tool_generator_testplan_backend::get_course_options() is removed, the 'course' form element is used instead.
+2
View File
@@ -50,6 +50,7 @@ switch ($action) {
case 'disable':
unset($enabled[$enrol]);
set_config('enabled_stores', implode(',', array_keys($enabled)), 'tool_log');
add_to_config_log('tool_logstore_visibility', '1', '0', $enrol);
break;
case 'enable':
@@ -59,6 +60,7 @@ switch ($action) {
$enabled = array_keys($enabled);
$enabled[] = $enrol;
set_config('enabled_stores', implode(',', $enabled), 'tool_log');
add_to_config_log('tool_logstore_visibility', '0', '1', $enrol);
break;
case 'up':
@@ -0,0 +1,19 @@
@tool_log @report @report_configlog
Feature: In a report, admin can see logstore visibility changes
# Change log stores visibility so the report contains known data.
Background:
Given I log in as "admin"
And the following config values are set as admin:
| enabled_stores | logstore_standard | tool_log |
@javascript
Scenario: Display configuration changes report
When I navigate to "Plugins > Logging > Manage log stores" in site administration
And I click on "Disable" "icon" in the "Standard log" "table_row"
And I click on "Enable" "icon" in the "External database log" "table_row"
And I navigate to "Reports > Config changes" in site administration
Then the following should exist in the "report-configlog-report-table" table:
| User | Plugin | Setting | New value | Original value |
| Admin User | logstore_standard | tool_logstore_visibility | 0 | 1 |
| Admin User | logstore_database | tool_logstore_visibility | 1 | 0 |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -2
View File
@@ -98,8 +98,7 @@ define(['jquery'], function($) {
/**
* Callback to inject the template.
*
* @param {Node} container Node to inject in.
* @return {Promise} Resolved when done.
* @returns {Promise} Resolved when done.
* @method injectTemplate
*/
Rule.prototype.injectTemplate = function() {
@@ -37,9 +37,6 @@ define(['jquery',
/**
* Constructor for CompetencyDialogue.
*
* @param {Object} options
*
*/
var Competencydialogue = function() {
// Intentionally left empty.
@@ -156,9 +156,8 @@ define(['jquery',
/**
* Opens the picker.
*
* @param {Number} competencyId The competency ID of the competency to work on.
* @method display
* @return {Promise}
* @returns {Promise}
*/
RuleConfig.prototype.display = function() {
var self = this;
@@ -137,7 +137,6 @@ define(['jquery',
/**
* Refresh the course competencies page.
*
* @param {Event} e
* @method saveSettings
*/
settingsMod.prototype.refreshCourseCompetenciesPage = function() {
+1 -1
View File
@@ -26,7 +26,7 @@ define(['core/str', 'core/yui'], function(str, Y) {
/**
* Store the current instance of the core drag drop.
*
* @property dragDropInstance M.tool_lp.dragdrop_reorder
* @property {object} dragDropInstance M.tool_lp.dragdrop_reorder
*/
var dragDropInstance = null;
-1
View File
@@ -99,7 +99,6 @@ define(['jquery',
/**
* Opens the picker.
*
* @param {Number} competencyId The competency ID of the competency to work on.
* @method display
* @return {Promise}
*/
+2 -2
View File
@@ -43,8 +43,8 @@ define(['jquery'], function($) {
/**
* Constructor
*
* @param {$} menuRoot Jquery collection matching the root of the menu.
* @param {Function[]} handlers, called when a menu item is chosen.
* @param {jQuery} menuRoot Jquery collection matching the root of the menu.
* @param {Function[]} handlers called when a menu item is chosen.
*/
var Menubar = function(menuRoot, handlers) {
// Setup private class variables.
-3
View File
@@ -574,8 +574,6 @@ define(['jquery', 'core/url', 'core/log'], function($, url, log) {
* Handle a blur event
*
* @method handleBlur
* @param {Object} item item is the jquery id of the parent item of the group
* @param {Event} e The event.
* @return {Boolean}
*/
Tree.prototype.handleBlur = function() {
@@ -587,7 +585,6 @@ define(['jquery', 'core/url', 'core/log'], function($, url, log) {
*
* @method handleFocus
* @param {Object} item item is the jquery id of the parent item of the group
* @param {Event} e The event.
* @return {Boolean}
*/
Tree.prototype.handleFocus = function(item) {
@@ -31,8 +31,6 @@ define(['jquery',
/**
* UserCompetencyWorkflow class.
*
* @param {String} selector The node containing the buttons to switch mode.
*/
var UserCompetencyWorkflow = function() {
EventBase.prototype.constructor.apply(this, []);
@@ -195,7 +195,6 @@ define(['jquery',
*
* @param {Object} evidenceData Evidence data from evidence node.
* @param {Number} competencyIds The competency IDs.
* @param {Boolean} requestReview Send competencies to review.
*/
UserEvidenceActions.prototype._doCreateUserEvidenceCompetency = function(evidenceData, competencyIds) {
var self = this,
@@ -24,9 +24,7 @@ Feature: See the competencies for an activity on the course competencies page.
| activity | name | intro | course | idnumber | completion | completionview |
| page | PageName1 | PageDesc1 | C1 | PAGE1 | 1 | 1 |
| page | PageName2 | PageDesc2 | C1 | PAGE2 | 1 | 1 |
And I log in as "admin"
And I am on site homepage
And I follow "Course 1"
And I am on the "Course 1" course page logged in as admin
And I follow "Competencies"
And I press "Add competencies to course"
And "Competency picker" "dialogue" should be visible
@@ -36,9 +34,7 @@ Feature: See the competencies for an activity on the course competencies page.
And "Competency picker" "dialogue" should be visible
And I select "Test-Comp2" of the competency tree
And I click on "Add" "button" in the "Competency picker" "dialogue"
And I am on "Course 1" course homepage
And I follow "PageName1"
And I navigate to "Edit settings" in current page administration
And I am on the PageName1 "page activity editing" page
And I follow "Expand all"
And I set the field "Course competencies" to "Test-Comp1"
And I press "Save and return to course"
@@ -46,10 +42,8 @@ Feature: See the competencies for an activity on the course competencies page.
@javascript
Scenario: Go to the competency course competencies page.
When I log in as "student1"
And I am on site homepage
And I follow "Course 1"
And I follow "Competencies"
Given I am on the "Course 1" course page logged in as student1
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"
@@ -64,12 +58,5 @@ Feature: See the competencies for an activity on the course competencies page.
@javascript
Scenario: None course competencies page.
When I log in as "student1"
And I am on site homepage
And I follow "Course 1"
And I follow "PageName1"
Then I should see "Test page content"
And I am on site homepage
And I follow "Course 1"
And I follow "PageName1"
When I am on the PageName1 "page activity" page logged in as student1
Then I should see "Test page content"
+5
View File
@@ -329,6 +329,11 @@ class api {
$settings->supportpage = $CFG->supportpage;
}
if (empty($section) || $section === 'graceperiodsettings') {
$settings->coursegraceperiodafter = $CFG->coursegraceperiodafter;
$settings->coursegraceperiodbefore = $CFG->coursegraceperiodbefore;
}
return $settings;
}
@@ -234,6 +234,9 @@ class tool_mobile_external_testcase extends externallib_advanced_testcase {
$expected[] = ['name' => 'supportemail', 'value' => $CFG->supportemail];
$expected[] = ['name' => 'supportpage', 'value' => $CFG->supportpage];
$expected[] = ['name' => 'coursegraceperiodafter', 'value' => $CFG->coursegraceperiodafter];
$expected[] = ['name' => 'coursegraceperiodbefore', 'value' => $CFG->coursegraceperiodbefore];
$this->assertCount(0, $result['warnings']);
$this->assertEquals($expected, $result['settings']);
File diff suppressed because one or more lines are too long
@@ -30,6 +30,8 @@ function($, Ajax, Notification, ModalFactory, ModalEvents) {
/**
* PolicyActions class.
*
* @param {jQuery} root
*/
var PolicyActions = function(root) {
this.registerEvents(root);
@@ -37,6 +39,8 @@ function($, Ajax, Notification, ModalFactory, ModalEvents) {
/**
* Register event listeners.
*
* @param {jQuery} root
*/
PolicyActions.prototype.registerEvents = function(root) {
root.on("click", function(e) {
@@ -115,6 +119,7 @@ function($, Ajax, Notification, ModalFactory, ModalEvents) {
* Initialise the actions helper.
*
* @method init
* @param {object} root
* @return {PolicyActions}
*/
'init': function(root) {
@@ -42,9 +42,7 @@ Feature: Backup user data
| Feedback for the response 'True'. | So you think it is true |
| Feedback for the response 'False'. | So you think it is false |
And I log out
And I log in as "student1"
And I am on "Course 1" course homepage
And I follow "Quiz 1"
When I am on the "Quiz 1" "quiz activity" page logged in as student1
And I press "Attempt quiz now"
And I click on "True" "radio" in the "First question" "question"
And I click on "False" "radio" in the "Second question" "question"
+6 -2
View File
@@ -59,10 +59,14 @@ if (!$task) {
}
// Start output.
$PAGE->set_url(new moodle_url('/admin/tool/task/schedule_task.php'));
$PAGE->set_url(new moodle_url('/admin/tool/task/schedule_task.php', ['task' => $taskname]));
$PAGE->set_context($context);
$PAGE->navbar->add(get_string('scheduledtasks', 'tool_task'), new moodle_url('/admin/tool/task/scheduledtasks.php'));
$PAGE->set_heading($SITE->fullname);
$PAGE->set_title($task->get_name());
navigation_node::override_active_url(new moodle_url('/admin/tool/task/scheduledtasks.php'));
$PAGE->navbar->add(s($task->get_name()));
echo $OUTPUT->header();
echo $OUTPUT->heading($task->get_name());
@@ -84,6 +84,7 @@ class tool_uploadcourse_step2_form extends tool_uploadcourse_base_form {
$displaylist = core_course_category::make_categories_list('moodle/course:create');
$mform->addElement('autocomplete', 'defaults[category]', get_string('coursecategory'), $displaylist);
$mform->addRule('defaults[category]', null, 'required', null, 'client');
$mform->addHelpButton('defaults[category]', 'coursecategory');
$choices = array();
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+28
View File
@@ -1199,6 +1199,7 @@ export default class Tour {
return this;
}
stepConfig.placement = this.recalculatePlacement(stepConfig);
let flipBehavior;
switch (stepConfig.placement) {
case 'left':
@@ -1293,6 +1294,33 @@ export default class Tour {
return this;
}
/**
* For left/right placement, checks that there is room for the step at current window size.
*
* If there is not enough room, changes placement to 'top'.
*
* @method recalculatePlacement
* @param {Object} stepConfig The step configuration of the step
* @return {String} The placement after recalculate
*/
recalculatePlacement(stepConfig) {
const buffer = 10;
const arrowWidth = 16;
let target = this.getStepTarget(stepConfig);
let widthContent = this.currentStepNode.width() + arrowWidth;
let targetOffsetLeft = target.offset().left - buffer;
let targetOffsetRight = target.offset().left + target.width() + buffer;
let placement = stepConfig.placement;
if (['left', 'right'].indexOf(placement) !== -1) {
if ((targetOffsetLeft < (widthContent + buffer)) &&
((targetOffsetRight + widthContent + buffer) > document.documentElement.clientWidth)) {
placement = 'top';
}
}
return placement;
}
/**
* Add the backdrop.
*
+20 -1
View File
@@ -622,7 +622,26 @@ class manager {
* @return array
*/
public static function get_matching_tours(\moodle_url $pageurl): array {
global $PAGE;
global $PAGE, $USER;
// The following three checks make sure that the user is fully ready to use the site. If not, we do not show any tours.
// We need the user to get properly set up so that all require_login() and other bits work as expected.
if (user_not_fully_set_up($USER)) {
return [];
}
if (get_user_preferences('auth_forcepasswordchange', false)) {
return [];
}
if (empty($USER->policyagreed) && !is_siteadmin()) {
$manager = new \core_privacy\local\sitepolicy\manager();
if ($manager->is_defined(isguestuser())) {
return [];
}
}
$tours = cache::get_matching_tourdata($pageurl);
@@ -325,6 +325,8 @@ class tool_usertours_manager_testcase extends advanced_testcase {
public function test_get_matching_tours(array $alltours, string $url, array $expected) {
$this->resetAfterTest();
$this->setGuestUser();
foreach ($alltours as $tourconfig) {
$tour = $this->helper_create_tour((object) $tourconfig);
$this->helper_create_step((object) ['tourid' => $tour->get_id()]);
@@ -336,4 +338,34 @@ class tool_usertours_manager_testcase extends advanced_testcase {
$this->assertEquals($expected[$i], $matches[$i]->get_name());
}
}
/**
* Test that no matching tours are returned if there is pending site policy agreement.
*/
public function test_get_matching_tours_for_user_without_site_policy_agreed() {
global $CFG;
$this->resetAfterTest();
$this->setGuestUser();
$tour = $this->helper_create_tour((object) [
'pathmatch' => '/%',
'enabled' => true,
'name' => 'Test tour',
'description' => '',
'configdata' => '',
]);
$this->helper_create_step((object) [
'tourid' => $tour->get_id(),
]);
$matches = \tool_usertours\manager::get_matching_tours(new moodle_url('/'));
$this->assertEquals(1, count($matches));
$CFG->sitepolicyguest = 'https://example.com';
$matches = \tool_usertours\manager::get_matching_tours(new moodle_url('/'));
$this->assertEmpty($matches);
}
}
+1 -1
View File
@@ -279,7 +279,7 @@ abstract class base extends \core_analytics\calculable {
} else if ($context->contextlevel >= CONTEXT_COURSE) {
// At course level or below only enrolled users although this is not ideal for
// teachers assigned at category level.
$users = get_enrolled_users($context, 'moodle/analytics:listinsights');
$users = get_enrolled_users($context, 'moodle/analytics:listinsights', 0, 'u.*', null, 0, 0, true);
} else {
$users = get_users_by_capability($context, 'moodle/analytics:listinsights');
}
+3 -3
View File
@@ -131,11 +131,11 @@ class auth_plugin_db extends auth_plugin_base {
$authdb->Close();
if ($this->config->passtype === 'plaintext') {
return ($fromdb == $extpassword);
return ($fromdb === $extpassword);
} else if ($this->config->passtype === 'md5') {
return (strtolower($fromdb) == md5($extpassword));
return (strtolower($fromdb) === md5($extpassword));
} else if ($this->config->passtype === 'sha1') {
return (strtolower($fromdb) == sha1($extpassword));
return (strtolower($fromdb) === sha1($extpassword));
} else if ($this->config->passtype === 'saltedcrypt') {
return password_verify($extpassword, $fromdb);
} else {
+16
View File
@@ -334,12 +334,28 @@ class auth_db_testcase extends advanced_testcase {
$DB->update_record('auth_db_users', $user3);
$this->assertTrue($auth->user_login('u3', 'heslo'));
// Test user created to see if the checking happens strictly.
$usermd5 = (object)['name' => 'usermd5', 'pass' => '0e462097431906509019562988736854'];
$usermd5->id = $DB->insert_record('auth_db_users', $usermd5);
// md5('240610708') === '0e462097431906509019562988736854'.
$this->assertTrue($auth->user_login('usermd5', '240610708'));
$this->assertFalse($auth->user_login('usermd5', 'QNKCDZO'));
set_config('passtype', 'sh1', 'auth_db');
$auth->config->passtype = 'sha1';
$user3->pass = sha1('heslo');
$DB->update_record('auth_db_users', $user3);
$this->assertTrue($auth->user_login('u3', 'heslo'));
// Test user created to see if the checking happens strictly.
$usersha1 = (object)['name' => 'usersha1', 'pass' => '0e66507019969427134894567494305185566735'];
$usersha1->id = $DB->insert_record('auth_db_users', $usersha1);
// sha1('aaroZmOk') === '0e66507019969427134894567494305185566735'.
$this->assertTrue($auth->user_login('usersha1', 'aaroZmOk'));
$this->assertFalse($auth->user_login('usersha1', 'aaK1STfY'));
set_config('passtype', 'saltedcrypt', 'auth_db');
$auth->config->passtype = 'saltedcrypt';
$user3->pass = password_hash('heslo', PASSWORD_BCRYPT);
+10 -10
View File
@@ -1228,18 +1228,18 @@ class auth_plugin_ldap extends auth_plugin_base {
empty($nuvalue) ? $nuvalue = array() : $nuvalue;
$ouvalue = core_text::convert($oldvalue, 'utf-8', $this->config->ldapencoding);
foreach ($ldapkeys as $ldapkey) {
// Skip update if $ldapkey does not exist in LDAP.
if (!isset($user_entry[$ldapkey][0])) {
$success = false;
error_log($this->errorlogtag.get_string('updateremfailfield', 'auth_ldap',
array('ldapkey' => $ldapkey,
'key' => $key,
'ouvalue' => $ouvalue,
'nuvalue' => $nuvalue)));
continue;
// If the field is empty in LDAP there are two options:
// 1. We get the LDAP field using ldap_first_attribute.
// 2. LDAP don't send the field using ldap_first_attribute.
// So, for option 1 we check the if the field is retrieve it.
// And get the original value of field in LDAP if the field.
// Otherwise, let value in blank and delegate the check in ldap_modify.
if (isset($user_entry[$ldapkey][0])) {
$ldapvalue = $user_entry[$ldapkey][0];
} else {
$ldapvalue = '';
}
$ldapvalue = $user_entry[$ldapkey][0];
if (!$ambiguous) {
// Skip update if the values already match
if ($nuvalue !== $ldapvalue) {
+6 -7
View File
@@ -93,13 +93,12 @@ class helper {
foreach ($sessions as $session) {
// Get user session from DB.
if (session_decode(base64_decode($session->sessdata))) {
if (isset($_SESSION['SESSION']) && isset($_SESSION['SESSION']->shibboleth_session_id)) {
// If there is a match, kill the session.
if ($_SESSION['SESSION']->shibboleth_session_id == trim($spsessionid)) {
// Delete this user's sessions.
\core\session\manager::kill_user_sessions($session->userid);
}
$usersession = self::unserializesession(base64_decode($session->sessdata));
if (isset($usersession['SESSION']) && isset($usersession['SESSION']->shibboleth_session_id)) {
// If there is a match, kill the session.
if ($usersession['SESSION']->shibboleth_session_id == trim($spsessionid)) {
// Delete this user's sessions.
\core\session\manager::kill_user_sessions($session->userid);
}
}
}
+6 -14
View File
@@ -42,6 +42,7 @@ class behat_auth extends behat_base {
* Logs in the user. There should exist a user with the same value as username and password.
*
* @Given /^I log in as "(?P<username_string>(?:[^"]|\\")*)"$/
* @Given I am logged in as :username
* @param string $username the user to log in as.
* @param moodle_url|null $wantsurl optional, URL to go to after logging in.
*/
@@ -52,33 +53,24 @@ class behat_auth extends behat_base {
return;
}
$loginurl = new moodle_url('/login/index.php');
$loginurl = new moodle_url('/auth/tests/behat/login.php', [
'username' => $username,
]);
if ($wantsurl !== null) {
$loginurl->param('wantsurl', $wantsurl->out_as_local_url());
}
// Visit login page.
$this->execute('behat_general::i_visit', [$loginurl]);
// Enter username and password.
$this->execute('behat_forms::i_set_the_field_to', array('Username', $this->escape($username)));
$this->execute('behat_forms::i_set_the_field_to', array('Password', $this->escape($username)));
// Press log in button, no need to check for exceptions as it will checked after this step execution.
$this->execute('behat_forms::press_button', get_string('login'));
}
/**
* Logs out of the system.
*
* @Given /^I log out$/
* @Given I am not logged in
*/
public function i_log_out() {
// Wait for page to be loaded.
$this->wait_for_pending_js();
// Click on logout link in footer, as it's much faster.
$this->execute('behat_general::i_click_on_in_the', array(get_string('logout'), 'link', '#page-footer', "css_element"));
$this->execute('behat_general::i_visit', [new moodle_url('/auth/tests/behat/logout.php')]);
}
}
+3 -5
View File
@@ -35,16 +35,14 @@ Feature: Authentication
And I press "Log in"
Then I should see "Invalid login, please try again"
Scenario: Log out
Scenario: Log out using the Log out link
Given I log in as "admin"
When I log out
When I click on "Log out" "link" in the "#page-footer" "css_element"
Then I should see "You are not logged in" in the "page-footer" "region"
Scenario Outline: Checking the display of the Remember username checkbox
Given I log in as "admin"
And I set the following administration settings values:
Given the following config values are set as admin:
| rememberusername | <settingvalue> |
And I log out
And I am on homepage
When I click on "Log in" "link" in the ".logininfo" "css_element"
Then I should <expect> "Remember username"
+89
View File
@@ -0,0 +1,89 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
// phpcs:disable moodle.Files.RequireLogin.Missing
// phpcs:disable moodle.PHP.ForbiddenFunctions.Found
/**
* Login end point for Behat tests only.
*
* @package core_auth
* @category test
* @author Guy Thomas
* @copyright 2021 Class Technologies Inc. {@link https://www.class.com/}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require(__DIR__.'/../../../config.php');
require_once("{$CFG->dirroot}/login/lib.php");
$behatrunning = defined('BEHAT_SITE_RUNNING') && BEHAT_SITE_RUNNING;
if (!$behatrunning) {
redirect(new moodle_url('/'));
}
$username = required_param('username', PARAM_ALPHANUMEXT);
$wantsurl = optional_param('wantsurl', null, PARAM_URL);
if (isloggedin()) {
// If the user is already logged in, log them out and redirect them back to login again.
require_logout();
redirect(new moodle_url('/auth/tests/behat/login.php', [
'username' => $username,
'wantsurl' => (new moodle_url($wantsurl))->out(false),
]));
}
// Note - with behat, the password is always the same as the username.
$password = $username;
$failurereason = null;
$user = authenticate_user_login($username, $password, true, $failurereason, false);
if ($failurereason) {
switch($failurereason) {
case AUTH_LOGIN_NOUSER:
$reason = get_string('invalidlogin');
break;
case AUTH_LOGIN_SUSPENDED:
$reason = 'User suspended';
break;
case AUTH_LOGIN_FAILED:
$reason = 'Login failed';
break;
case AUTH_LOGIN_LOCKOUT:
$reason = 'Account locked';
break;
case AUTH_LOGIN_UNAUTHORISED:
$reason = get_string('unauthorisedlogin', 'core', $username);
break;
default:
$reason = "Unknown login failure: '{$failurereason}'";
break;
}
// Note: Do not throw an exception here as we sometimes test that login does not work.
// Exceptions are automatic failures in Behat.
\core\notification::add($reason, \core\notification::ERROR);
redirect(new moodle_url('/'));
}
if (!complete_user_login($user)) {
throw new Exception("Failed to login as behat step for $username");
}
if (empty($wantsurl)) {
$wantsurl = core_login_get_return_url();
}
redirect(new moodle_url($wantsurl));
+41
View File
@@ -0,0 +1,41 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
// phpcs:disable moodle.Files.RequireLogin.Missing
// phpcs:disable moodle.PHP.ForbiddenFunctions.Found
/**
* Login end point for Behat tests only.
*
* @package core_auth
* @category test
* @copyright Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require(__DIR__.'/../../../config.php');
$behatrunning = defined('BEHAT_SITE_RUNNING') && BEHAT_SITE_RUNNING;
if (!$behatrunning) {
redirect(new moodle_url('/login/logout.php'));
}
require_logout();
$login = optional_param('loginpage', 0, PARAM_BOOL);
if ($login) {
redirect(get_login_url());
} else {
redirect(new moodle_url('/'));
}
+78 -8
View File
@@ -108,6 +108,64 @@ abstract class condition extends tree_node {
return preg_replace('~^availability_(.*?)\\\\condition$~', '$1', get_class($this));
}
/**
* Returns a marker indicating that an activity name should be placed in a description.
*
* Gets placeholder text which will be decoded by info::format_info later when we can safely
* display names.
*
* @param int $cmid Course-module id
* @return string Placeholder text
* @since Moodle 3.11.3
*/
public static function description_cm_name(int $cmid): string {
return '<AVAILABILITY_CMNAME_' . $cmid . '/>';
}
/**
* Returns a marker indicating that formatted text should be placed in a description.
*
* Gets placeholder text which will be decoded by info::format_info later when we can safely
* call format_string.
*
* @param string $str Text to be processed with format_string
* @return string Placeholder text
* @since Moodle 3.11.3
*/
public static function description_format_string(string $str): string {
return '<AVAILABILITY_FORMAT_STRING>' . htmlspecialchars($str, ENT_NOQUOTES) .
'</AVAILABILITY_FORMAT_STRING>';
}
/**
* Returns a marker indicating that some of the description text should be computed at display
* time.
*
* This will result in a call to the get_description_callback_value static function within
* the condition class.
*
* Gets placeholder text which will be decoded by info::format_info later when we can safely
* call most Moodle functions.
*
* @param string[] $params Array of arbitrary parameters
* @return string Placeholder text
* @since Moodle 3.11.3
*/
public function description_callback(array $params): string {
$out = '<AVAILABILITY_CALLBACK type="' . $this->get_type() . '">';
$first = true;
foreach ($params as $param) {
if ($first) {
$first = false;
} else {
$out .= '<P/>';
}
$out .= htmlspecialchars($param, ENT_NOQUOTES);
}
$out .= '</AVAILABILITY_CALLBACK>';
return $out;
}
/**
* Obtains a string describing this restriction (whether or not
* it actually applies). Used to obtain information that is displayed to
@@ -119,11 +177,17 @@ abstract class condition extends tree_node {
* (when displaying only conditions they don't meet).
*
* If implementations require a course or modinfo, they should use
* the get methods in $info.
* the get methods in $info. They should not use any other functions that
* might rely on modinfo, such as format_string.
*
* The special string <AVAILABILITY_CMNAME_123/> can be returned, where
* 123 is any number. It will be replaced with the correctly-formatted
* name for that activity.
* To work around this limitation, use the functions:
*
* description_cm_name()
* description_format_string()
* description_callback()
*
* These return special markers which will be added to the string and processed
* later after modinfo is complete.
*
* @param bool $full Set true if this is the 'full information' view
* @param bool $not Set true if we are inverting the condition
@@ -142,11 +206,17 @@ abstract class condition extends tree_node {
* the list, in front of the standard get_description call.
*
* If implementations require a course or modinfo, they should use
* the get methods in $info.
* the get methods in $info. They should not use any other functions that
* might rely on modinfo, such as format_string.
*
* The special string <AVAILABILITY_CMNAME_123/> can be returned, where
* 123 is any number. It will be replaced with the correctly-formatted
* name for that activity.
* To work around this limitation, use the functions:
*
* description_cm_name()
* description_format_string()
* description_callback()
*
* These return special markers which will be added to the string and processed
* later after modinfo is complete.
*
* @param bool $full Set true if this is the 'full information' view
* @param bool $not Set true if we are inverting the condition
+20
View File
@@ -746,6 +746,26 @@ abstract class info {
return format_string($cm->get_name(), true, ['context' => $context]);
}
}, $info);
$info = preg_replace_callback('~<AVAILABILITY_FORMAT_STRING>(.*?)</AVAILABILITY_FORMAT_STRING>~s',
function($matches) use ($context) {
$decoded = htmlspecialchars_decode($matches[1], ENT_NOQUOTES);
return format_string($decoded, true, ['context' => $context]);
}, $info);
$info = preg_replace_callback('~<AVAILABILITY_CALLBACK type="([a-z0-9_]+)">(.*?)</AVAILABILITY_CALLBACK>~s',
function($matches) use ($modinfo, $context) {
// Find the class, it must have already been loaded by now.
$fullclassname = 'availability_' . $matches[1] . '\condition';
if (!class_exists($fullclassname, false)) {
return '<!-- Error finding class ' . $fullclassname .' -->';
}
// Load the parameters.
$params = [];
$encodedparams = preg_split('~<P/>~', $matches[2], 0);
foreach ($encodedparams as $encodedparam) {
$params[] = htmlspecialchars_decode($encodedparam, ENT_NOQUOTES);
}
return $fullclassname::get_description_callback_value($modinfo, $context, $params);
}, $info);
return $info;
}
+1 -1
View File
@@ -51,7 +51,7 @@ class info_module extends info {
// We cannot access $cm->name as a property at this point, because this
// code may itself run in response to the $cm->name property access, and
// PHP magic function properties do not allow recursion (because PHP).
return '<AVAILABILITY_CMNAME_' . $this->cm->id . '/>';
return condition::description_cm_name($this->cm->id);
}
protected function set_in_database($availability) {
@@ -354,7 +354,7 @@ class condition extends \core_availability\condition {
if (!array_key_exists($cmid, $modinfo->cms) || $modinfo->cms[$cmid]->deletioninprogress) {
$modname = get_string('missing', 'availability_completion');
} else {
$modname = '<AVAILABILITY_CMNAME_' . $modinfo->cms[$cmid]->id . '/>';
$modname = self::description_cm_name($modinfo->cms[$cmid]->id);
}
}
@@ -48,10 +48,10 @@ Feature: Confirm that conditions on completion no longer cause a bug
And I click on "Activity completion" "button" in the "Add restriction..." "dialogue"
And I set the field with xpath "//div[contains(concat(' ', normalize-space(@class), ' '), ' availability-item ')][preceding-sibling::div]//select[@name='cm']" to "Page2"
And I press "Save and return to course"
And I should see "Not available unless:" in the ".activity.glossary" "css_element"
Then I should see "Not available unless:" in the ".activity.glossary" "css_element"
And I should see "The activity Page1 is marked complete" in the ".activity.glossary" "css_element"
And I should see "The activity Page2 is marked complete" in the ".activity.glossary" "css_element"
And I follow "TestGlossary"
# Behat will automatically check there is no error on this page.
Then I should see "TestGlossary"
And I am on the TestGlossary "glossary activity" page
And I should see "TestGlossary"
@@ -142,10 +142,29 @@ class condition extends \core_availability\condition {
$string = 'notgeneral';
}
}
$name = self::get_cached_grade_name($course->id, $this->gradeitemid);
// We cannot get the name at this point because it requires format_string which is not
// allowed here. Instead, get it later with the callback function below.
$name = $this->description_callback([$this->gradeitemid]);
return get_string('requires_' . $string, 'availability_grade', $name);
}
/**
* Gets the grade name at display time.
*
* @param \course_modinfo $modinfo Modinfo
* @param \context $context Context
* @param string[] $params Parameters (just grade item id)
* @return string Text value
*/
public static function get_description_callback_value(
\course_modinfo $modinfo, \context $context, array $params): string {
if (count($params) !== 1 || !is_number($params[0])) {
return '<!-- Invalid grade description callback -->';
}
$gradeitemid = (int)$params[0];
return self::get_cached_grade_name($modinfo->get_course_id(), $gradeitemid);
}
protected function get_debug_string() {
$out = '#' . $this->gradeitemid;
if (!is_null($this->min)) {
@@ -86,13 +86,12 @@ Feature: availability_grade
And I set the field "Minimum grade percentage (inclusive)" to "10"
And I press "Save and return to course"
And I log out
# Log in as student without a grade yet.
When I log out
And I log in as "student1"
And I am on "Course 1" course homepage
When I am on the "A1" "assign activity" page logged in as student1
# Do the assignment.
And I follow "A1"
And I click on "Add submission" "button"
And I set the field "Online text" to "Q"
And I click on "Save changes" "button"
@@ -103,27 +102,60 @@ Feature: availability_grade
And I should not see "P3" in the "region-main" "region"
And I should not see "P4" in the "region-main" "region"
And I should see "A1" in the "region-main" "region"
And I log out
# Log back in as teacher.
When I log out
And I log in as "teacher1"
And I am on "Course 1" course homepage
When I am on the "A1" "assign activity" page logged in as teacher1
# Give the assignment 40%.
And I follow "A1"
And I navigate to "View all submissions" in current page administration
# Pick the grade link in the row that has s@example.com in it.
And I click on "Grade" "link" in the "s@example.com" "table_row"
And I set the field "Grade out of 100" to "40"
And I click on "Save changes" "button"
And I click on "Edit settings" "link"
And I log out
# Log back in as student.
And I log out
And I log in as "student1"
And I am on "Course 1" course homepage
And I am on the "Course 1" course page logged in as student1
# Check pages are visible.
Then I should see "P2" in the "region-main" "region"
And I should see "P4" in the "region-main" "region"
And I should not see "P3" in the "region-main" "region"
@javascript
Scenario: Condition display with filters
# Teacher sets up a restriction on group G1, using multilang filter.
Given the following "activity" exists:
| activity | assign |
| name | <span lang="en" class="multilang">A-One</span><span lang="fr" class="multilang">A-Un</span> |
| intro | Test |
| course | C1 |
| idnumber | 0001 |
| section | 1 |
And the "multilang" filter is "on"
And the "multilang" filter applies to "content and headings"
# The activity names filter is enabled because it triggered a bug in older versions.
And the "activitynames" filter is "on"
And the "activitynames" filter applies to "content and headings"
And I am on the "C1" "Course" page logged in as "teacher1"
And I turn editing mode on
And I add a "Page" to section "1"
And I expand all fieldsets
And I set the following fields to these values:
| Name | P1 |
| Description | x |
| Page content | x |
And I click on "Add restriction..." "button"
And I click on "Grade" "button" in the "Add restriction..." "dialogue"
And I set the field "Grade" to "A-One"
And I click on "min" "checkbox" in the ".availability-item" "css_element"
And I set the field "Minimum grade percentage (inclusive)" to "10"
And I press "Save and return to course"
And I log out
# Student sees information about no access to group, with group name in correct language.
When I am on the "C1" "Course" page logged in as "student1"
Then I should see "Not available unless: You achieve a required score in A-One"
And I should not see "A-Un"
@@ -68,6 +68,7 @@ class availability_grade_condition_testcase extends advanced_testcase {
// Check if available (not available).
$this->assertFalse($cond->is_available(false, $info, true, $user->id));
$information = $cond->get_description(false, false, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~have a grade.*Test!~', $information);
$this->assertTrue($cond->is_available(true, $info, true, $user->id));
@@ -76,6 +77,7 @@ class availability_grade_condition_testcase extends advanced_testcase {
$this->assertTrue($cond->is_available(false, $info, true, $user->id));
$this->assertFalse($cond->is_available(true, $info, true, $user->id));
$information = $cond->get_description(false, true, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~do not have a grade.*Test!~', $information);
// Construct directly and test remaining conditions; first, min grade (fail).
@@ -84,6 +86,7 @@ class availability_grade_condition_testcase extends advanced_testcase {
$cond = new condition($structure);
$this->assertFalse($cond->is_available(false, $info, true, $user->id));
$information = $cond->get_description(false, false, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~achieve a required score.*Test!~', $information);
$this->assertTrue($cond->is_available(true, $info, true, $user->id));
@@ -92,6 +95,7 @@ class availability_grade_condition_testcase extends advanced_testcase {
$this->assertTrue($cond->is_available(false, $info, true, $user->id));
$this->assertFalse($cond->is_available(true, $info, true, $user->id));
$information = $cond->get_description(false, true, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~do not get certain scores.*Test!~', $information);
// Max grade (fail).
@@ -100,6 +104,7 @@ class availability_grade_condition_testcase extends advanced_testcase {
$cond = new condition($structure);
$this->assertFalse($cond->is_available(false, $info, true, $user->id));
$information = $cond->get_description(false, false, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~get an appropriate score.*Test!~', $information);
$this->assertTrue($cond->is_available(true, $info, true, $user->id));
@@ -108,6 +113,7 @@ class availability_grade_condition_testcase extends advanced_testcase {
$this->assertTrue($cond->is_available(false, $info, true, $user->id));
$this->assertFalse($cond->is_available(true, $info, true, $user->id));
$information = $cond->get_description(false, true, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~do not get certain scores.*Test!~', $information);
// Max and min (fail).
@@ -116,6 +122,7 @@ class availability_grade_condition_testcase extends advanced_testcase {
$cond = new condition($structure);
$this->assertFalse($cond->is_available(false, $info, true, $user->id));
$information = $cond->get_description(false, false, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~get a particular score.*Test!~', $information);
$this->assertTrue($cond->is_available(true, $info, true, $user->id));
@@ -128,6 +135,7 @@ class availability_grade_condition_testcase extends advanced_testcase {
$this->assertTrue($cond->is_available(false, $info, true, $user->id));
$this->assertFalse($cond->is_available(true, $info, true, $user->id));
$information = $cond->get_description(false, true, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~do not get certain scores.*Test!~', $information);
// Success (bottom end).
@@ -135,6 +143,7 @@ class availability_grade_condition_testcase extends advanced_testcase {
$this->assertTrue($cond->is_available(false, $info, true, $user->id));
$this->assertFalse($cond->is_available(true, $info, true, $user->id));
$information = $cond->get_description(false, true, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~do not get certain scores.*Test!~', $information);
}
@@ -110,9 +110,8 @@ class condition extends \core_availability\condition {
if (!array_key_exists($this->groupid, self::$groupnames)) {
$name = get_string('missing', 'availability_group');
} else {
$context = \context_course::instance($course->id);
$name = format_string(self::$groupnames[$this->groupid], true,
array('context' => $context));
// Not safe to call format_string here; use the special function to call it later.
$name = self::description_format_string(self::$groupnames[$this->groupid]);
}
} else {
return get_string($not ? 'requires_notanygroup' : 'requires_anygroup',
@@ -6,8 +6,8 @@ Feature: availability_group
Background:
Given the following "courses" exist:
| fullname | shortname | format | enablecompletion |
| Course 1 | C1 | topics | 1 |
| fullname | shortname | format | enablecompletion | numsections |
| Course 1 | C1 | topics | 1 | 3 |
And the following "users" exist:
| username |
| teacher1 |
@@ -101,3 +101,33 @@ Feature: availability_group
Then I should see "P1" in the "region-main" "region"
And I should see "P2" in the "region-main" "region"
And I should not see "P3" in the "region-main" "region"
@javascript
Scenario: Condition display with filters
# Teacher sets up a restriction on group G1, using multilang filter.
Given the following "groups" exist:
| name | course | idnumber |
| <span lang="en" class="multilang">G-One</span><span lang="fr" class="multilang">G-Un</span> | C1 | GI1 |
And the "multilang" filter is "on"
And the "multilang" filter applies to "content and headings"
# The activity names filter is enabled because it triggered a bug in older versions.
And the "activitynames" filter is "on"
And the "activitynames" filter applies to "content and headings"
And I am on the "C1" "Course" page logged in as "teacher1"
And I turn editing mode on
And I add a "Page" to section "1"
And I expand all fieldsets
And I set the following fields to these values:
| Name | P1 |
| Description | x |
| Page content | x |
And I click on "Add restriction..." "button"
And I click on "Group" "button" in the "Add restriction..." "dialogue"
And I set the field "Group" to "G-One"
And I click on "Save and return to course" "button"
And I log out
# Student sees information about no access to group, with group name in correct language.
When I am on the "C1" "Course" page logged in as "student1"
Then I should see "Not available unless: You belong to G-One"
And I should not see "G-Un"
@@ -73,6 +73,7 @@ class availability_group_condition_testcase extends advanced_testcase {
// Check if available (when not available).
$this->assertFalse($cond->is_available(false, $info, true, $user->id));
$information = $cond->get_description(false, false, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~You belong to.*G1!~', $information);
$this->assertTrue($cond->is_available(true, $info, true, $user->id));
@@ -85,6 +86,7 @@ class availability_group_condition_testcase extends advanced_testcase {
$this->assertTrue($cond->is_available(false, $info, true, $user->id));
$this->assertFalse($cond->is_available(true, $info, true, $user->id));
$information = $cond->get_description(false, true, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~do not belong to.*G1!~', $information);
// Check group 2 works also.
@@ -96,6 +98,7 @@ class availability_group_condition_testcase extends advanced_testcase {
$this->assertTrue($cond->is_available(false, $info, true, $user->id));
$this->assertFalse($cond->is_available(true, $info, true, $user->id));
$information = $cond->get_description(false, true, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~do not belong to any~', $information);
// Admin user doesn't belong to a group, but they can access it
@@ -108,6 +111,7 @@ class availability_group_condition_testcase extends advanced_testcase {
$cond = new condition((object)array('id' => $group2->id + 1000));
$this->assertFalse($cond->is_available(false, $info, true, $user->id));
$information = $cond->get_description(false, false, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~You belong to.*\(Missing group\)~', $information);
}
@@ -141,9 +141,8 @@ class condition extends \core_availability\condition {
if (!array_key_exists($groupingid, self::$groupingnames)) {
$name = get_string('missing', 'availability_grouping');
} else {
$context = \context_course::instance($course->id);
$name = format_string(self::$groupingnames[$groupingid], true,
array('context' => $context));
// Not safe to call format_string here; use the special function to call it later.
$name = self::description_format_string(self::$groupingnames[$groupingid]);
}
return get_string($not ? 'requires_notgrouping' : 'requires_grouping',
@@ -114,3 +114,31 @@ Feature: availability_grouping
And I press "Add group/grouping access restriction"
When I press "Save and return to course"
Then I should see "Not available unless: You belong to a group in Grouping A"
@javascript
Scenario: Condition display with filters
# Teacher sets up a restriction on group G1, using multilang filter.
Given the following "groupings" exist:
| name | course | idnumber |
| <span lang="en" class="multilang">Gr-One</span><span lang="fr" class="multilang">Gr-Un</span> | C1 | GA |
And the following "activities" exist:
| activity | name | intro | course | idnumber | groupmode | grouping |
| assign | Test assign | Assign description | C1 | assign1 | 1 | GA |
And the "multilang" filter is "on"
And the "multilang" filter applies to "content and headings"
# The activity names filter is enabled because it triggered a bug in older versions.
And the "activitynames" filter is "on"
And the "activitynames" filter applies to "content and headings"
And I am on the "C1" "Course" page logged in as "teacher1"
And I turn editing mode on
And I open "Test assign" actions menu
And I choose "Edit settings" in the open action menu
And I expand all fieldsets
And I press "Add group/grouping access restriction"
And I press "Save and return to course"
And I log out
# Student sees information about no access to group, with group name in correct language.
When I am on the "C1" "Course" page logged in as "student1"
Then I should see "Not available unless: You belong to a group in Gr-One"
And I should not see "Gr-Un"
@@ -199,9 +199,9 @@ class condition extends \core_availability\condition {
} else {
$translatedfieldname = \core_user\fields::get_display_name($this->standardfield);
}
$context = \context_course::instance($course->id);
$a = new \stdClass();
$a->field = format_string($translatedfieldname, true, array('context' => $context));
// Not safe to call format_string here; use the special function to call it later.
$a->field = self::description_format_string($translatedfieldname);
$a->value = s($this->value);
if ($not) {
// When doing NOT strings, we replace the operator with its inverse.
@@ -96,8 +96,7 @@ Feature: availability_profile
And I click on "Save and return to course" "button"
# Edit it again and check the setting still works.
When I follow "P1"
And I navigate to "Edit settings" in current page administration
When I am on the P1 "page activity editing" page
And I expand all fieldsets
Then the field "User profile field" matches value "Super field"
And the field "Value to compare against" matches value "Bananaman"
@@ -107,3 +106,35 @@ Feature: availability_profile
And I log in as "student1"
And I am on "Course 1" course homepage
Then I should see "P1" in the "region-main" "region"
@javascript
Scenario: Condition display with filters
# Teacher sets up a restriction on group G1, using multilang filter.
Given the following "custom profile fields" exist:
| datatype | shortname | name | param2 |
| text | frog | <span lang="en" class="multilang">F-One</span><span lang="fr" class="multilang">F-Un</span> | 100 |
And the "multilang" filter is "on"
And the "multilang" filter applies to "content and headings"
# The activity names filter is enabled because it triggered a bug in older versions.
And the "activitynames" filter is "on"
And the "activitynames" filter applies to "content and headings"
And I am on the "C1" "Course" page logged in as "teacher1"
And I turn editing mode on
And I add a "Page" to section "1"
And I expand all fieldsets
And I set the following fields to these values:
| Name | P1 |
| Description | x |
| Page content | x |
And I click on "Add restriction..." "button"
And I click on "User profile" "button" in the "Add restriction..." "dialogue"
And I set the following fields to these values:
| User profile field | F-One |
| Value to compare against | 111 |
And I click on "Save and return to course" "button"
And I log out
# Student sees information about no access to group, with group name in correct language.
When I am on the "C1" "Course" page logged in as "student1"
Then I should see "Not available unless: Your F-One is 111"
And I should not see "F-Un"
@@ -309,6 +309,7 @@ class availability_profile_condition_testcase extends advanced_testcase {
// Check the message (should be using lang string with capital, which
// is evidence that it called the right function to get the name).
$information = $cond->get_description(false, false, $info);
$information = \core_availability\info::format_info($information, $info->get_course());
$this->assertMatchesRegularExpression('~Department~', $information);
// Set the field to true for both users and retry.
@@ -388,6 +389,7 @@ class availability_profile_condition_testcase extends advanced_testcase {
'Failed checking normal (positive) result');
if (!$yes) {
$information = $cond->get_description(false, false, $info);
$information = \core_availability\info::format_info($information, $info->get_course());
$this->assertMatchesRegularExpression($failpattern, $information);
}
@@ -396,6 +398,7 @@ class availability_profile_condition_testcase extends advanced_testcase {
'Failed checking NOT (negative) result');
if ($yes) {
$information = $cond->get_description(false, true, $info);
$information = \core_availability\info::format_info($information, $info->get_course());
$this->assertMatchesRegularExpression($failpattern, $information);
}
}
+7
View File
@@ -2,6 +2,13 @@ This files describes API changes in /availability/*.
The information here is intended only for developers.
=== 3.11.4 ===
* There were existing restrictions on what condition plugins can do in the get_description
method (for example they mustn't call format_string), which were not well documented.
New functions description_cm_name(), description_format_string(), description_callback()
can be used so that condition plugins to behave correctly in all situations.
=== 3.2 ===
* Condition plugins must replace the CSS selector "#fitem_id_availabilityconditionsjson" with ".availability-field".
@@ -358,6 +358,15 @@ class backup_controller extends base_controller {
return $this->plan;
}
/**
* For debug only. Get a simple test display of all the settings.
*
* @return string
*/
public function debug_display_all_settings_values(): string {
return $this->get_plan()->debug_display_all_settings_values();
}
/**
* Sets the user roles that should be kept in the destination course
* for a course copy operation.
@@ -350,6 +350,15 @@ class restore_controller extends base_controller {
}
}
/**
* For debug only. Get a simple test display of all the settings.
*
* @return string
*/
public function debug_display_all_settings_values(): string {
return $this->get_plan()->debug_display_all_settings_values();
}
public function get_info() {
return $this->info;
}
@@ -162,6 +162,16 @@ abstract class restore_block_task extends restore_task {
*/
abstract public function get_configdata_encoded_attributes();
/**
* Helper method to safely unserialize block configuration during restore
*
* @param string $configdata The original base64 encoded block config, as retrieved from the block_instances table
* @return stdClass
*/
protected function decode_configdata(string $configdata): stdClass {
return unserialize_object(base64_decode($configdata));
}
/**
* Define the contents in the activity that must be
* processed by the link decoder
+3 -4
View File
@@ -2144,7 +2144,6 @@ class restore_ras_and_caps_structure_step extends restore_structure_step {
public function process_override($data) {
$data = (object)$data;
// Check roleid is one of the mapped ones
$newrole = $this->get_mapping('role', $data->roleid);
$newroleid = $newrole->newitemid ?? false;
@@ -2162,8 +2161,8 @@ class restore_ras_and_caps_structure_step extends restore_structure_step {
// Check if the new role is an overrideable role AND if the user performing the restore has the
// capability to assign the capability.
if (in_array($newrole->info['shortname'], $overrideableroles) &&
($safecapability && has_capability('moodle/role:safeoverride', $context, $userid) ||
!$safecapability && has_capability('moodle/role:override', $context, $userid))
(has_capability('moodle/role:override', $context, $userid) ||
($safecapability && has_capability('moodle/role:safeoverride', $context, $userid)))
) {
assign_capability($data->capability, $data->permission, $newroleid, $this->task->get_contextid());
} else {
@@ -4306,7 +4305,7 @@ class restore_block_instance_structure_step extends restore_structure_step {
// Let's look for anything within configdata neededing processing
// (nulls and uses of legacy file.php)
if ($attrstotransform = $this->task->get_configdata_encoded_attributes()) {
$configdata = (array)unserialize(base64_decode($data->configdata));
$configdata = (array) unserialize_object(base64_decode($data->configdata));
foreach ($configdata as $attribute => $value) {
if (in_array($attribute, $attrstotransform)) {
$configdata[$attribute] = $this->contentprocessor->process_cdata($value);
+180
View File
@@ -0,0 +1,180 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
defined('MOODLE_INTERNAL') || die();
// Include all the needed stuff.
global $CFG;
require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php');
require_once($CFG->dirroot . '/backup/util/includes/restore_includes.php');
/**
* Unit tests for how backup and restore handles role-related things.
*
* @package core_backup
* @copyright 2021 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class roles_backup_restore_test extends advanced_testcase {
/**
* Create a course where the (non-editing) Teacher role is overridden
* to have 'moodle/user:loginas' and 'moodle/site:accessallgroups'.
*
* @return stdClass the new course.
*/
protected function create_course_with_role_overrides(): stdClass {
$generator = $this->getDataGenerator();
$course = $generator->create_course();
$teacher = $generator->create_user();
$context = context_course::instance($course->id);
$generator->enrol_user($teacher->id, $course->id, 'teacher');
$editingteacherrole = $this->get_role('teacher');
role_change_permission($editingteacherrole->id, $context, 'moodle/user:loginas', CAP_ALLOW);
role_change_permission($editingteacherrole->id, $context, 'moodle/site:accessallgroups', CAP_ALLOW);
return $course;
}
/**
* Get the role id from a shortname.
*
* @param string $shortname the role shortname.
* @return stdClass the role from the DB.
*/
protected function get_role(string $shortname): stdClass {
global $DB;
return $DB->get_record('role', ['shortname' => $shortname]);
}
/**
* Get an array capability => CAP_... constant for all the orverrides set for a given role on a given context.
*
* @param string $shortname role shortname.
* @param context $context context.
* @return array the overrides set here.
*/
protected function get_overrides_for_role_on_context(string $shortname, context $context): array {
$overridedata = get_capabilities_from_role_on_context($this->get_role($shortname), $context);
$overrides = [];
foreach ($overridedata as $override) {
$overrides[$override->capability] = $override->permission;
}
return $overrides;
}
/**
* Makes a backup of the course.
*
* @param stdClass $course The course object.
* @return string Unique identifier for this backup.
*/
protected function backup_course(\stdClass $course): string {
global $CFG, $USER;
// Turn off file logging, otherwise it can't delete the file (Windows).
$CFG->backup_file_logger_level = backup::LOG_NONE;
// Do backup with default settings. MODE_IMPORT means it will just
// create the directory and not zip it.
$bc = new \backup_controller(backup::TYPE_1COURSE, $course->id,
backup::FORMAT_MOODLE, backup::INTERACTIVE_NO, backup::MODE_IMPORT,
$USER->id);
$backupid = $bc->get_backupid();
$bc->execute_plan();
$bc->destroy();
return $backupid;
}
/**
* Restores a backup that has been made earlier.
*
* @param string $backupid The unique identifier of the backup.
* @param string $asroleshortname Which role in the new cousre the restorer should have.
* @return int The new course id.
*/
protected function restore_adding_to_course(string $backupid, string $asroleshortname): int {
global $CFG, $USER;
// Create course to restore into, and a user to do the restore.
$generator = $this->getDataGenerator();
$course = $generator->create_course();
$restorer = $generator->create_user();
$generator->enrol_user($restorer->id, $course->id, $asroleshortname);
$this->setUser($restorer);
// Turn off file logging, otherwise it can't delete the file (Windows).
$CFG->backup_file_logger_level = backup::LOG_NONE;
// Do restore to new course with default settings.
$rc = new \restore_controller($backupid, $course->id,
backup::INTERACTIVE_NO, backup::MODE_GENERAL, $USER->id,
backup::TARGET_CURRENT_ADDING);
$precheck = $rc->execute_precheck();
$this->assertTrue($precheck);
$rc->get_plan()->get_setting('role_assignments')->set_value(true);
$rc->get_plan()->get_setting('permissions')->set_value(true);
$rc->execute_plan();
$rc->destroy();
return $course->id;
}
public function test_restore_role_overrides_as_manager(): void {
$this->resetAfterTest();
$this->setAdminUser();
// Create a course and back it up.
$course = $this->create_course_with_role_overrides();
$backupid = $this->backup_course($course);
// When manager restores, both role overrides should be restored.
$newcourseid = $this->restore_adding_to_course($backupid, 'manager');
// Verify.
$overrides = $this->get_overrides_for_role_on_context('teacher',
context_course::instance($newcourseid));
$this->assertArrayHasKey('moodle/user:loginas', $overrides);
$this->assertEquals(CAP_ALLOW, $overrides['moodle/user:loginas']);
$this->assertArrayHasKey('moodle/site:accessallgroups', $overrides);
$this->assertEquals(CAP_ALLOW, $overrides['moodle/site:accessallgroups']);
}
public function test_restore_role_overrides_as_teacher(): void {
$this->resetAfterTest();
$this->setAdminUser();
// Create a course and back it up.
$course = $this->create_course_with_role_overrides();
$backupid = $this->backup_course($course);
// When teacher restores, only the safe override should be restored.
$newcourseid = $this->restore_adding_to_course($backupid, 'editingteacher');
// Verify.
$overrides = $this->get_overrides_for_role_on_context('teacher',
context_course::instance($newcourseid));
$this->assertArrayNotHasKey('moodle/user:loginas', $overrides);
$this->assertArrayHasKey('moodle/site:accessallgroups', $overrides);
$this->assertEquals(CAP_ALLOW, $overrides['moodle/site:accessallgroups']);
}
}
@@ -548,6 +548,7 @@ abstract class backup_controller_dbops extends backup_dbops {
switch ($mode) {
case backup::MODE_GENERAL:
case backup::MODE_ASYNC:
// Load the general defaults
$settings = array(
'backup_general_users' => 'users',
+13
View File
@@ -126,6 +126,19 @@ abstract class base_plan implements checksumable, executable {
return $result;
}
/**
* For debug only. Get a simple test display of all the settings.
*
* @return string
*/
public function debug_display_all_settings_values(): string {
$result = '';
foreach ($this->settings as $name => $setting) {
$result .= $name . ': ' . $setting->get_value() . "\n";
}
return $result;
}
/**
* Wrapper over @get_setting() that returns if the requested setting exists or no
*/
+5 -3
View File
@@ -146,11 +146,13 @@ class base_setting_ui {
* @throws base_setting_ui_exception when the label is not valid.
* @param string $label
*/
public function set_label($label) {
$label = (string)$label;
if ($label === '' || $label !== clean_param($label, PARAM_TEXT)) {
public function set_label(string $label) :void {
$label = clean_param($label, PARAM_CLEANHTML);
if ($label === '') {
throw new base_setting_ui_exception('setting_invalid_ui_label');
}
$this->label = $label;
}
@@ -107,6 +107,7 @@ class copy_form extends \moodleform {
$displaylist[$course->category] = \core_course_category::get($course->category, MUST_EXIST, true)->get_formatted_name();
}
$mform->addElement('autocomplete', 'category', get_string('coursecategory'), $displaylist);
$mform->addRule('category', null, 'required', null, 'client');
$mform->addHelpButton('category', 'coursecategory');
// Course visibility.
@@ -0,0 +1,70 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Tests for base_setting_ui class.
*
* @package core_backup
* @copyright 2021 Université Rennes 2 {@link https://www.univ-rennes2.fr}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot.'/backup/util/settings/tests/settings_test.php');
/**
* Tests for base_setting_ui class.
*
* @copyright 2021 Université Rennes 2 {@link https://www.univ-rennes2.fr}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class base_setting_ui_test extends advanced_testcase {
/**
* Tests set_label().
*
* @return void
*/
public function test_set_label() {
$this->resetAfterTest();
$bs = new mock_base_setting('test', base_setting::IS_BOOLEAN);
$bsui = new base_setting_ui($bs);
// Should keep original text string.
$bsui->set_label('Section name');
$this->assertEquals('Section name', $bsui->get_label());
// Should keep original HTML string.
$bsui->set_label('<b>Section name</b>');
$this->assertEquals('<b>Section name</b>', $bsui->get_label());
// Should be converted to text string.
$bsui->set_label(123);
$this->assertSame('123', $bsui->get_label());
// Should raise an exception when label is empty.
try {
$bsui->set_label('');
$this->assertTrue(false, 'base_setting_ui_exception');
} catch (Exception $exception) {
$this->assertTrue($exception instanceof base_setting_ui_exception);
$this->assertEquals($exception->errorcode, 'setting_invalid_ui_label');
}
}
}
@@ -17,10 +17,8 @@ Feature: Duplicate activities
And the following "activities" exist:
| activity | name | intro | course | idnumber | section |
| data | Test database name | Test database description | C1 | database1 | 1 |
And I log in as "admin"
And I set the following administration settings values:
| backup_import_activities | 0 |
And I log out
And the following config values are set as admin:
| backup_import_activities | 0 | backup |
And I log in as "teacher1"
And I am on "Course 1" course homepage with editing mode on
And I duplicate "Test database name" activity
+1
View File
@@ -36,6 +36,7 @@ $context = $badge->get_context();
require_capability('moodle/badges:configuredetails', $context);
if ($action == 'remove') {
require_sesskey();
$badge->delete_related_badge($relatedid);
}
+13 -11
View File
@@ -59,7 +59,7 @@ class core_badges_renderer extends plugin_renderer_base {
$name = html_writer::tag('span', $bname, array('class' => 'badge-name'));
$image = html_writer::empty_tag('img', array('src' => $imageurl, 'class' => 'badge-image'));
$image = html_writer::empty_tag('img', ['src' => $imageurl, 'class' => 'badge-image', 'alt' => $badge->imagecaption]);
if (!empty($badge->dateexpire) && $badge->dateexpire < time()) {
$image .= $this->output->pix_icon('i/expired',
get_string('expireddate', 'badges', userdate($badge->dateexpire)),
@@ -334,7 +334,7 @@ class core_badges_renderer extends plugin_renderer_base {
$output = '';
$output .= html_writer::start_tag('div', array('id' => 'badge'));
$output .= html_writer::start_tag('div', array('id' => 'badge-image'));
$output .= html_writer::empty_tag('img', array('src' => $badgeimage, 'alt' => $badge->name, 'width' => '100'));
$output .= html_writer::empty_tag('img', array('src' => $badgeimage, 'alt' => $badge->imagecaption, 'width' => '100'));
if ($expiration < $now) {
$output .= $this->output->pix_icon('i/expired',
get_string('expireddate', 'badges', userdate($issued['expires'])),
@@ -380,7 +380,9 @@ class core_badges_renderer extends plugin_renderer_base {
$output .= $this->output->heading(get_string('issuerdetails', 'badges'), 3);
$dl = array();
$dl[get_string('issuername', 'badges')] = $badge->issuername;
$dl[get_string('issuername', 'badges')] = format_string($badge->issuername, true,
['context' => context_system::instance()]);
if (isset($badge->issuercontact) && !empty($badge->issuercontact)) {
$dl[get_string('contact', 'badges')] = obfuscate_mailto($badge->issuercontact);
}
@@ -413,7 +415,7 @@ class core_badges_renderer extends plugin_renderer_base {
if ($badge->type == BADGE_TYPE_COURSE && isset($badge->courseid)) {
$coursename = $DB->get_field('course', 'fullname', array('id' => $badge->courseid));
$dl[get_string('course')] = $coursename;
$dl[get_string('course')] = format_string($coursename, true, ['context' => context_course::instance($badge->courseid)]);
}
$dl[get_string('bcriteria', 'badges')] = self::print_badge_criteria($badge);
$output .= $this->definition_list($dl);
@@ -1276,13 +1278,13 @@ class core_badges_renderer extends plugin_renderer_base {
);
if (!$currentbadge->is_active() && !$currentbadge->is_locked()) {
$action = $this->output->action_icon(
new moodle_url('related_action.php',
array(
'badgeid' => $related->currentbadgeid,
'relatedid' => $badge->id,
'action' => 'remove'
)
), new pix_icon('t/delete', get_string('delete')));
new moodle_url('/badges/related_action.php', [
'badgeid' => $related->currentbadgeid,
'relatedid' => $badge->id,
'sesskey' => sesskey(),
'action' => 'remove'
]),
new pix_icon('t/delete', get_string('delete')));
$actions = html_writer::tag('div', $action, array('class' => 'badge-actions'));
array_push($row, $actions);
}
+7 -4
View File
@@ -163,16 +163,17 @@ Feature: Award badges
| teacher1 | Teacher | 1 | teacher1@example.com |
| student1 | Student | 1 | student1@example.com |
| student2 | Student | 2 | student2@example.com |
And the "multilang" filter is "on"
And the "multilang" filter applies to "content and headings"
And the following "courses" exist:
| fullname | shortname | category | groupmode |
| Course 1 | C1 | 0 | 1 |
| <span class="multilang" lang="en">Course 1</span><span class="multilang" lang="de">Kurs 1</span> | C1 | 0 | 1 |
And the following "course enrolments" exist:
| user | course | role |
| teacher1 | C1 | editingteacher |
| student1 | C1 | student |
| student2 | C1 | student |
And I log in as "teacher1"
And I am on "Course 1" course homepage
And I am on the "C1" "Course" page logged in as "teacher1"
And I navigate to "Badges > Add a new badge" in current page administration
And I follow "Add a new badge"
And I set the following fields to these values:
@@ -197,7 +198,9 @@ Feature: Award badges
And I log in as "student1"
And I follow "Profile" in the user menu
And I click on "Course 1" "link" in the "region-main" "region"
And I should see "Course Badge"
And I click on "Course Badge" "link"
And "Course 1" "text" should appear after "Badge details" "text"
And "Kurs 1" "text" should not exist
@javascript
Scenario: Award badge on activity completion
+5 -5
View File
@@ -51,19 +51,19 @@ Feature: Award badges based on activity completion
And I log out
Scenario: Student earns a badge using activity completion, but does not get passing grade
When I log in as "student1"
Given I log in as "student1"
And I am on "Course 1" course homepage
And the "Receive a grade" completion condition of "Test quiz name" is displayed as "failed"
And the "Receive a pass grade or complete all available attempts" completion condition of "Test quiz name" is displayed as "todo"
And I follow "Test quiz name"
When I am on the "Test quiz name" "quiz activity" page
And I press "Re-attempt quiz"
And I set the field "False" to "1"
And I press "Finish attempt ..."
And I press "Submit all and finish"
And I click on "Submit all and finish" "button" in the "Confirmation" "dialogue"
And I log out
Then I log in as "teacher1"
And I am on "Course 1" course homepage
And I am on the "Course 1" course page logged in as teacher1
And I navigate to "Badges > Manage badges" in current page administration
And I follow "Course Badge"
And I should see "Recipients (1)"
Then I should see "Recipients (1)"
File diff suppressed because one or more lines are too long
+1 -2
View File
@@ -203,7 +203,7 @@ const toggleAccessMap = (courseId, displayFormat) => {
* @param {Object[]} sectionData The error data for course sections.
* @param {Object[]} moduleData The error data for course modules.
* @returns {Object} An object representing the extra error information.
*/
*/
const getErrorTotals = (sectionData, moduleData) => {
const totals = {
totalErrors: 0,
@@ -290,7 +290,6 @@ const fetchReviewData = (courseid, updatePreference = false) => {
* @param {number} toggled A number represnting the state of the review toggle.
* @param {string} displayFormat A string representing the display format for icons.
* @param {number} courseId The course ID.
* @param {number} userId The id of the currently logged-in user.
*/
export const init = (toggled, displayFormat, courseId) => {
// Settings consts.
@@ -73,7 +73,7 @@ class restore_activity_results_block_task extends restore_block_task {
$blockid = $this->get_blockid();
if ($configdata = $DB->get_field('block_instances', 'configdata', array('id' => $blockid))) {
$config = unserialize(base64_decode($configdata));
$config = $this->decode_configdata($configdata);
if (!empty($config->activityparentid)) {
// Get the mapping and replace it in config.
if ($mapping = restore_dbops::get_backup_ids_record($this->get_restoreid(),

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