Compare commits

...

1441 Commits

Author SHA1 Message Date
Eloy Lafuente (stronk7) 00821c744c Moodle release 3.10.1 2021-01-16 16:58:29 +01:00
Sara Arjona f420af1016 weekly release 3.10+ 2021-01-15 08:25:49 +01:00
Sara Arjona 67150560b2 Merge branch 'install_310_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_310_STABLE 2021-01-15 08:25:47 +01:00
Sara Arjona 9fac7a8d59 Merge branch 'MDL-69308_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2021-01-14 12:03:52 +01:00
Jake Dallimore e1ca7e93d9 Merge branch 'MDL-69877-310' of git://github.com/mickhawkins/moodle into MOODLE_310_STABLE 2021-01-14 14:52:18 +08:00
Michael Hawkins 8bd6cfb4c4 MDL-69877 core: Added security.txt 2021-01-14 14:30:50 +08:00
AMOS bot a3afe546fd Automatically generated installer lang files 2021-01-14 00:07:23 +00:00
Eloy Lafuente (stronk7) db30a623bf MDL-69308 environment: Apply agreed changes
- PHP 7.3 required.
- Moodle 3.6 required.
- SQL*Server 2017 (aka, 14.0) required.
- Sodium PHP extension required.
2021-01-13 19:29:44 +01:00
Eloy Lafuente (stronk7) 3afcb70b3d MDL-69308 environment: 3.11 base information
This is a direct copy of the 3.10 branch to have
the changes under control in next commits.
2021-01-13 19:29:39 +01:00
Sara Arjona 9ca6f8199e Merge branch 'MDL-70394-310' of git://github.com/rezaies/moodle into MOODLE_310_STABLE 2021-01-13 15:31:26 +01:00
Mihail Geshoski 4fec7a276d MDL-68486 auth_shibboleth: Reset convert_data if it uses dataroot file
Upgrade step that resets the 'Data modification API' (convert_data)
setting to its default value if this setting is currently configured
to use a file located within the $CFG->dataroot directory.
2021-01-13 12:35:00 +08:00
Mihail Geshoski b70a1c71e1 MDL-68486 auth_shibboleth: Prevent using dataroot files in convert_data
Prevents configuring the 'Data modification API' (convert_data) setting
to use files located within the $CFG->dataroot directory as it exposes
the site to security risks.
2021-01-13 12:35:00 +08:00
Jun Pataleta 90c450839d Merge branch 'MDL-70580-310' of git://github.com/paulholden/moodle into MOODLE_310_STABLE 2021-01-13 10:19:51 +08:00
AMOS bot b7a62b4286 Automatically generated installer lang files 2021-01-13 00:07:25 +00:00
Paul Holden 33427c7c5d MDL-70580 core: retrieve closest tree node in click handler. 2021-01-12 20:17:32 +00:00
Michael Hawkins 8fa9d159bc MDL-69911 core: Clean content passed through TeX filter 2021-01-12 10:24:26 +01:00
Ferran Recio f8f154236d MDL-67782 message: fix messages max length 2021-01-12 10:24:26 +01:00
Juan Segarra Montesinos d54cc8fbd7 MDL-69797 core_grades: Implement authorization into fetch method 2021-01-12 10:24:26 +01:00
Juan Segarra Montesinos 7e6fc779c7 MDL-69797 core_grades: Implement authorization into fetch method 2021-01-12 10:24:26 +01:00
Juan Segarra Montesinos 3467d87c80 MDL-69797 gradingform_rubric: Implement authorization into fetch method 2021-01-12 10:24:26 +01:00
Juan Segarra Montesinos 855957180a MDL-69797 gradingform_guide: Implement authorization into fetch method 2021-01-12 10:24:26 +01:00
Sara Arjona 8862b80c56 Merge branch 'MDL-70009-310' of git://github.com/ilyatregubov/moodle into MOODLE_310_STABLE 2021-01-12 10:21:09 +01:00
Jake Dallimore 8b8142d8d9 Merge branch 'MDL-69431_Moodle_310_Validate_section_arg_modedit' of git://github.com/watson8/moodle into MOODLE_310_STABLE 2021-01-12 17:09:01 +08:00
Ilya Tregubov f0260219fa MDL-70009 h5pactivity: Split get_pluginfile_hash in two methods. 2021-01-12 09:10:57 +02:00
Jun Pataleta be36ead8b0 Merge branch 'MDL-70580-310' of git://github.com/paulholden/moodle into MOODLE_310_STABLE 2021-01-12 13:15:43 +08:00
AMOS bot f270bd8c8e Automatically generated installer lang files 2021-01-12 00:07:34 +00:00
Andrew Nicols 357909b23b MDL-70580 core: Tree nodes should check if they were clicked directly 2021-01-11 23:43:28 +00:00
Michael Hawkins 2c45443ad7 MDL-70571 lib: Added additional escaping to search_input template 2021-01-11 16:20:32 +01:00
Sara Arjona 77d7480096 Merge branch 'MDL-70034_310' of git://github.com/mdjnelson/moodle into MOODLE_310_STABLE 2021-01-11 15:19:32 +01:00
Sara Arjona b57b9b41cd Merge branch 'MDL-70567-MOODLE_310_STABLE' of https://github.com/dmitriim/moodle into MOODLE_310_STABLE 2021-01-11 13:09:49 +01:00
Sara Arjona cfa2b28de6 Merge branch 'MDL-70578-310' of git://github.com/lucaboesch/moodle into MOODLE_310_STABLE 2021-01-11 12:58:20 +01:00
Sara Arjona e22723680d Merge branch 'MDL-70352-MOODLE_310_STABLE' of https://github.com/dmitriim/moodle into MOODLE_310_STABLE 2021-01-11 12:24:05 +01:00
AMOS bot db2a9784ef Automatically generated installer lang files 2021-01-11 00:08:40 +00:00
David Watson 06d7da192b MDL-69431 course: validate section url param against maxsections 2021-01-10 17:14:58 +00:00
Eloy Lafuente (stronk7) 586a6da356 Merge branch 'MDL-70550-310-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_310_STABLE 2021-01-09 13:17:50 +01:00
Mark Nelson 2ab950039c MDL-70034 gradingform_guide: use new API to retrieve grade item name 2021-01-09 14:31:09 +08:00
AMOS bot 3b3c246aaa Automatically generated installer lang files 2021-01-09 00:07:26 +00:00
Sara Arjona b3b476ce3c Merge branch 'MDL-70558-310' of git://github.com/paulholden/moodle into MOODLE_310_STABLE 2021-01-08 17:07:23 +01:00
Sara Arjona 682ee99293 Merge branch 'MDL-70102-m310' of https://github.com/sammarshallou/moodle into MOODLE_310_STABLE 2021-01-08 15:51:05 +01:00
David Mudrák b8069c3372 MDL-70550 lang: Use the fixed strings in Behat tests, too 2021-01-08 09:11:38 +01:00
Helen Foster 992d1b29b4 MDL-70550 lang: Import fixed English strings (en_fix) 2021-01-08 09:11:38 +01:00
Jun Pataleta ceab4136aa Merge branch 'MDL-70310-310' of git://github.com/ilyatregubov/moodle into MOODLE_310_STABLE 2021-01-08 14:47:14 +08:00
Luca Bösch 8241aa75d5 MDL-70578 cohorts: Add bootstrap classes to buttons 2021-01-08 07:28:15 +01:00
Jun Pataleta f186074a54 weekly release 3.10+ 2021-01-08 12:14:56 +08:00
Jun Pataleta 8585fe1404 Merge branch 'install_310_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_310_STABLE 2021-01-08 12:14:55 +08:00
AMOS bot d4dff59b82 Automatically generated installer lang files 2021-01-08 00:07:23 +00:00
Eloy Lafuente (stronk7) af4b97f57a Merge branch 'MDL-70245-MOODLE_310_STABLE' of https://github.com/TomoTsuyuki/moodle into MOODLE_310_STABLE 2021-01-07 23:49:47 +01:00
Eloy Lafuente (stronk7) c3341dea30 Merge branch 'MDL-70584-310' of git://github.com/marinaglancy/moodle into MOODLE_310_STABLE 2021-01-07 23:31:24 +01:00
sam marshall 2b0b250162 MDL-70102 PHPunit: Core test fails with weird added modules
Specifically it fails if the modules have unusual default capabilities
so that editingteacher doesn't have addinstance.
2021-01-07 16:11:55 +00:00
Marina Glancy dd17f6b1bf MDL-70584 core_iplookup: increase tolerance in test 2021-01-07 14:17:19 +01:00
Ilya Tregubov 4e1786f27f MDL-70310 user: Remove yahoo icon since domain no longer exists. 2021-01-07 09:15:28 +02:00
Jun Pataleta 247437ce25 Merge branch 'MDL-70374_310' of https://github.com/timhunt/moodle into MOODLE_310_STABLE 2021-01-07 12:24:18 +08:00
Eloy Lafuente (stronk7) 8d306e640f Merge branch 'MDL-70476_310' of https://github.com/timhunt/moodle into MOODLE_310_STABLE 2021-01-07 00:28:08 +01:00
Eloy Lafuente (stronk7) 17d296f1ea Merge branch 'MOODLE_310_MDL-70520' of https://github.com/golenkovm/moodle into MOODLE_310_STABLE 2021-01-07 00:19:12 +01:00
Dmitrii Metelkin c9dfaec749 MDL-70567 task: fix broken result filter on logs page 2021-01-06 14:29:17 +11:00
Adrian Greeve 304aaf2b7b Merge branch 'MDL-70482_310_STABLE' of https://github.com/sebmehr/moodle into MOODLE_310_STABLE 2021-01-06 11:23:47 +08:00
Dmitrii Metelkin 34153bcc77 MDL-70352 core: attach modal to a specific element 2021-01-06 11:19:57 +11:00
Paul Holden 65ef2f90bf MDL-70558 tool_langimport: sort available language packs. 2021-01-04 23:56:03 +00:00
AMOS bot b12ab80cf5 Automatically generated installer lang files 2020-12-27 00:07:25 +00:00
Sébastien Mehr 9ee975f3a9 MDL-70482 template: add missing closing bracket 2020-12-24 14:04:54 +01:00
AMOS bot fb02551622 Automatically generated installer lang files 2020-12-24 00:07:25 +00:00
Eloy Lafuente (stronk7) 64db9dc75a weekly release 3.10+ 2020-12-23 20:24:53 +01:00
Eloy Lafuente (stronk7) 9d5931b6e2 Merge branch 'install_310_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_310_STABLE 2020-12-23 20:24:51 +01:00
Eloy Lafuente (stronk7) 0369198637 Merge branch 'MDL-56119-310' of https://github.com/inigozendegi/moodle into MOODLE_310_STABLE 2020-12-23 01:27:07 +01:00
Eloy Lafuente (stronk7) 62b9a44045 Merge branch 'MDL-70279-310' of git://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-12-23 00:47:00 +01:00
Eloy Lafuente (stronk7) 1251f26d67 Merge branch 'MDL-70436-310' of git://github.com/bmbrands/moodle into MOODLE_310_STABLE 2020-12-22 18:29:55 +01:00
Eloy Lafuente (stronk7) 77a6c383bf Merge branch 'MDL-70386-310' of git://github.com/bmbrands/moodle into MOODLE_310_STABLE 2020-12-22 18:22:00 +01:00
Jake Dallimore 53e81c00fa Merge branch 'MDL-70459-310' of git://github.com/rezaies/moodle into MOODLE_310_STABLE 2020-12-22 16:51:36 +08:00
Jake Dallimore 9480706466 Merge branch 'MDL-69422-310-2' of git://github.com/junpataleta/moodle into MOODLE_310_STABLE 2020-12-22 16:03:17 +08:00
Jake Dallimore bb48ca47ef Merge branch 'MDL-70426-310' of https://github.com/HuongNV13/moodle into MOODLE_310_STABLE 2020-12-22 15:16:41 +08:00
Mikhail Golenkov 93b2fe7d38 MDL-70520 mod_assign: Use task API to get scheduled task lastruntime 2020-12-22 15:30:50 +11:00
Mikhail Golenkov 6ba4712549 MDL-70520 tasks: Keep lastruntime when a scheduled task is reset 2020-12-22 15:30:45 +11:00
AMOS bot b192dc7c64 Automatically generated installer lang files 2020-12-22 00:07:24 +00:00
Víctor Déniz 2d9922f388 Merge branch 'MDL-70355-310' of git://github.com/lucaboesch/moodle into MOODLE_310_STABLE 2020-12-21 23:19:20 +00:00
Eloy Lafuente (stronk7) 639f6143e7 Merge branch 'MDL-70430-310-oauth2refreshtoken' of git://github.com/mudrd8mz/moodle into MOODLE_310_STABLE 2020-12-22 00:07:00 +01:00
Víctor Déniz 0a27966b67 Merge branch 'MDL-70284-dynreg-bug-310' of https://github.com/cengage/moodle into MOODLE_310_STABLE 2020-12-21 16:33:17 +00:00
Sara Arjona 79b89c2d42 Merge branch 'MDL-69107-310-2' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-12-18 15:22:24 +01:00
Tim Hunt 591107c208 MDL-70374 qtype_multichoice: improve alignment of choices 2020-12-18 13:10:13 +00:00
Tim Hunt ccfc9f7bc9 MDL-70476 permission overrides: role names double-escaped in tool tip 2020-12-18 13:04:16 +00:00
Luca Bösch 06bf0c89d6 MDL-70355 calendar: Filter popuptext for calendar entries. 2020-12-17 17:44:04 +01:00
Sara Arjona c25f0087f7 weekly release 3.10+ 2020-12-17 15:52:52 +01:00
Sara Arjona 12830e4214 Merge branch 'install_310_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_310_STABLE 2020-12-17 15:52:50 +01:00
Shamim Rezaie 2e1b2cf30e MDL-70394 paygw_paypal: Fix the incorrect foreign key 2020-12-17 00:26:48 +11:00
Víctor Déniz 0bfb0a58a0 Merge branch 'MDL-70261-310' of git://github.com/ilya-catalyst/moodle into MOODLE_310_STABLE 2020-12-16 12:34:29 +00:00
Sara Arjona 50ba1375e8 Merge branch 'MDL-70373_310' of https://github.com/timhunt/moodle into MOODLE_310_STABLE 2020-12-16 12:40:52 +01:00
Shamim Rezaie 5f57b10712 MDL-70459 enrol_fee: Sort the list of currencies when displaying 2020-12-16 22:30:52 +11:00
Shamim Rezaie ec6720a836 MDL-70459 core_payment: use array_merge to merge currencies 2020-12-16 22:30:52 +11:00
Sara Arjona e00b006d51 Merge branch 'MDL-70322-310' of git://github.com/roland04/moodle into MOODLE_310_STABLE 2020-12-16 12:04:22 +01:00
Jun Pataleta 7ce3918e83 Merge branch 'MDL-54907_310' of https://github.com/timhunt/moodle into MOODLE_310_STABLE 2020-12-16 10:26:58 +08:00
Andrew Nicols aa1c7e0a64 MDL-69107 user: Fix autocomplete usages 2020-12-16 07:50:56 +08:00
Sara Arjona cc87756c10 Merge branch 'MDL-70422-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-12-15 16:43:02 +01:00
Sara Arjona e7a53e9410 Merge branch 'MDL-70409-310' of git://github.com/merrill-oakland/moodle into MOODLE_310_STABLE 2020-12-15 16:15:50 +01:00
Sara Arjona a050d3f41b Merge branch 'MDL-70342-310' of git://github.com/abias/moodle into MOODLE_310_STABLE 2020-12-15 15:29:18 +01:00
Sara Arjona bc103afb53 Merge branch 'MDL-70357-310-cronlibthrowables' of git://github.com/mudrd8mz/moodle into MOODLE_310_STABLE 2020-12-15 14:56:04 +01:00
Ilya Tregubov 50d1003bb7 MDL-70261 course: Allow update locked course custom fields
on course upload.
2020-12-15 14:43:11 +02:00
Jake Dallimore 5c899c722c Merge branch 'MDL-67623-310_blocks_myoverview_pagination_regression' of https://github.com/tomdickman/moodle into MOODLE_310_STABLE 2020-12-15 18:22:11 +08:00
Jun Pataleta 73ad678e73 Merge branch 'MDL-70361-dlrlid-310' of https://github.com/cengage/moodle into MOODLE_310_STABLE 2020-12-15 11:17:25 +08:00
Andrew Nicols 22a5445346 MDL-69107 form_autocomplete: Rewrite item selection
The form_autocomplete is essentially a custom element. Unfortunately the
`setValue()` function in Mink has undesired actions so it is necessary
to write our own handling for it.

The standard Mink `setValue()` function focuses the element, sets a
value, and then blurs the element. In the case of the autocomplete this
can cause the autocomplete suggestions list to be closed in some
situations. Instead of using the setValue we click, and type the value,
but do not immediately blur.
2020-12-15 09:08:05 +08:00
AMOS bot 3ca8535203 Automatically generated installer lang files 2020-12-15 00:07:24 +00:00
Sara Arjona 7697ac6538 Merge branch 'MDL-70397-310' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-12-14 17:12:05 +01:00
Jake Dallimore c97eb87506 Merge branch 'MDL-70324-3.10' of https://github.com/JBThong/moodle into MOODLE_310_STABLE 2020-12-14 11:30:16 +08:00
Tom Dickman 66b3c79275 MDL-67623 block overview: fix pagination regression
Fixed a regression caused by MDL-64194 resulting in Dashboard - Course
overview pagination not working from second page of courses onwards.

Course overview block should now do the following:
- Display no pagination controls when user has no courses
- Display no pagination controls when less than 12 courses to display
- Only display pagination controls up to the number of courses user is
enrolled in
- Work correctly when on a page greater than the second page.
2020-12-14 13:28:11 +11:00
AMOS bot 773db77081 Automatically generated installer lang files 2020-12-13 00:07:25 +00:00
AMOS bot a07acd9464 Automatically generated installer lang files 2020-12-12 00:07:28 +00:00
AMOS bot 12b20cbf3b Merge branch 'MOODLE_310_STABLE' into install_310_STABLE 2020-12-12 00:07:27 +00:00
Mikel Martín fa31950c6a MDL-70322 core_search: consistent search icon 2020-12-11 15:40:45 +01:00
AMOS bot 6ef5f4ced0 Automatically generated installer lang files 2020-12-11 00:07:31 +00:00
Víctor Déniz c537ed7fed weekly release 3.10+ 2020-12-10 21:10:47 +00:00
Víctor Déniz f3b2f604e2 Merge branch 'install_310_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_310_STABLE 2020-12-10 21:10:40 +00:00
Huong Nguyen f987001a61 MDL-70426 qtype_ddmarker: infinite markers keep duplicating 2020-12-10 15:52:46 +07:00
Shamim Rezaie f1ec340cca MDL-69301 theme_boost: Remove the special handling of Escape key 2020-12-10 14:59:55 +08:00
Tomo Tsuyuki 6998cbfad4 MDL-70245 core_grade: Fix grade_get_setting unit test failures
To fix the phpunit issue, change from static variable to use cache
2020-12-10 16:47:51 +11:00
Jake Dallimore 655f4d4f3f Merge branch 'MDL-70320-310' of https://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-12-10 12:01:48 +08:00
Andrew Nicols d9e22f40b4 MDL-70320 behat: User full path to page admin node 2020-12-10 07:55:50 +08:00
Bas Brands df8a5aeab5 MDL-70386 theme_boost: quizes correctness badges 2020-12-09 18:07:29 +01:00
Bas Brands 17cc12c381 MDL-70436 theme_boost: closebutton styles in moodle-dialog-fullscreen 2020-12-09 14:59:44 +01:00
Víctor Déniz e76c5c764b Merge branch 'MDL-63683-310' of https://github.com/dravek/moodle into MOODLE_310_STABLE 2020-12-09 12:47:52 +00:00
Jake Dallimore be45f4c47f Merge branch 'MDL-70151-310' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-12-09 14:46:14 +08:00
Shamim Rezaie fa7e218546 MDL-69301 behat: comment a test out
The e.key is not filled correctly by Geckodriver on the verssion of
Firefox that we use.
2020-12-09 13:40:04 +08:00
Andrew Nicols 5c0a5a531d Merge branch 'MDL-70320_310' of https://github.com/timhunt/moodle into MOODLE_310_STABLE 2020-12-09 12:06:22 +08:00
Andrew Nicols 200ec6b6ac Merge branch 'MDL-62707-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-12-09 08:53:27 +08:00
David Mudrák 0e7dc879de MDL-70430 oauth2: Fix storing of the new refresh token
There was a typo - missing underscore. As a result, the new refresh
token was never updated in the database. Depending on the issuer and
whether or when theyu invalidate issued refresh tokens, this might or
might not make the token refresh stop working.
2020-12-08 11:24:27 +01:00
Jake Dallimore 70fe644191 Merge branch 'MDL-70285_310' of https://github.com/timhunt/moodle into MOODLE_310_STABLE 2020-12-08 16:33:43 +08:00
AMOS bot 5178b349e8 Automatically generated installer lang files 2020-12-08 00:07:22 +00:00
Paul Holden c8e335fbe3 MDL-70422 restore: fix for undefined question answer ordering in test. 2020-12-07 10:15:53 +00:00
Adrian Greeve 567e587dbb Merge branch 'MDL-69301-310' of git://github.com/rezaies/moodle into MOODLE_310_STABLE 2020-12-07 09:29:24 +08:00
AMOS bot 37348f1c2e Automatically generated installer lang files 2020-12-06 00:07:27 +00:00
Eric Merrill e2feddadd9 MDL-70409 chat: Use require_once to import lib.php 2020-12-04 10:45:59 -05:00
Paul Holden 0a62138795 MDL-70279 tool_templatelibrary: preserve component search field value. 2020-12-04 14:55:32 +00:00
Paul Holden c24a16a819 MDL-62707 search: account for no matching courses when listing areas.
When limiting the list of courses during retrieval of the search areas
the user can access, make sure we have some contexts before looking
for blocks.
2020-12-04 09:43:17 +00:00
inigozendegi 8091ab8078 MDL-56119 gradingform_rubric: Rubric display layout issue 2020-12-04 09:41:42 +01:00
David Matamoros 12b9c6051e MDL-63683 enrol: Fix plugin settings when no role has student archetype 2020-12-04 09:25:54 +01:00
Andrew Nicols 92e6eb437c MDL-70397 behat: Prevent browser restarting after initial start 2020-12-04 12:07:20 +08:00
Jake Dallimore 32866a1758 weekly release 3.10+ 2020-12-04 08:42:48 +08:00
Jake Dallimore 9ce415b207 Merge branch 'install_310_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_310_STABLE 2020-12-04 08:42:45 +08:00
Jake Dallimore ec69ae5929 Merge branch 'MDL-70326-MOODLE_310_STABLE' of https://github.com/durzo/moodle into MOODLE_310_STABLE 2020-12-03 11:54:18 +08:00
Andrew Nicols f5545b5c0e Merge branch 'MDL-70327-310' of git://github.com/cescobedo/moodle into MOODLE_310_STABLE 2020-12-03 11:51:59 +08:00
Andrew Nicols 7c22b71916 Merge branch 'MDL-70321_310' of https://github.com/timhunt/moodle into MOODLE_310_STABLE 2020-12-03 11:39:54 +08:00
Jake Dallimore b5414af214 Merge branch 'MDL-69411-310' of git://github.com/dravek/moodle into MOODLE_310_STABLE 2020-12-03 11:37:00 +08:00
Jake Dallimore 686b5beb23 Merge branch 'MDL-67460-310_profile_secure' of https://github.com/beenet-dev/moodle into MOODLE_310_STABLE 2020-12-03 11:16:31 +08:00
Adrian Greeve af87a57052 Merge branch 'wip_MDL-70267_m310' of git://github.com/gjb2048/moodle into MOODLE_310_STABLE 2020-12-03 10:56:37 +08:00
Adrian Greeve dec6e261e2 Merge branch 'MDL-70167-310' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-12-03 09:57:42 +08:00
AMOS bot 24058ace40 Automatically generated installer lang files 2020-12-03 00:07:26 +00:00
Andrew Nicols d552427f61 Merge branch 'MDL-69868-310' of git://github.com/ilya-catalyst/moodle into MOODLE_310_STABLE 2020-12-03 07:47:48 +08:00
Tim Hunt 0eeb391472 MDL-70373 qtype_essay: missing border on atto input 2020-12-02 20:09:57 +00:00
Shamim Rezaie 433556de1f MDL-69301 theme_boost: Use event.key in aria.js
Both event.which and event.keyCode are deprecated. So
We switched to using event.key. We can only do so now
because IE is no longer supported.
2020-12-03 04:22:09 +11:00
Shamim Rezaie b24f13eca2 MDL-69301 course: Remove custom keyboard navigation code 2020-12-03 04:22:09 +11:00
Shamim Rezaie 65a9b26791 MDL-69301 core: Enhanced WAI-ARIA support for tab elements 2020-12-03 04:22:09 +11:00
Shamim Rezaie 2cc04e2b29 MDL-69301 theme_boost: convert aria.js to es6 module 2020-12-03 04:22:09 +11:00
Jake Dallimore 6be44e7d06 Merge branch 'MDL-67514-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-12-02 16:23:54 +08:00
AMOS bot 93b3efa5a7 Automatically generated installer lang files 2020-12-02 00:07:23 +00:00
Thong Bui 2908ed5405 MDL-70324 Question: get_all_response_file_areas() not work correctly 2020-12-01 16:11:21 +07:00
AMOS bot 966c8a37cb Automatically generated installer lang files 2020-12-01 00:07:30 +00:00
Claude Vervoort c8637d645e MDL-70361 mod_lti: deeplinking multiple preserve resourceid and tag 2020-11-30 14:59:54 -05:00
David Mudrák b427f21cca MDL-70357 cron: Catch Throwables not just Exceptions when running tasks
Starting from PHP 7, most language errors throw Error exceptions. We
want to deal with those equally as with any other exception so we need
to catch all Throwables here.
2020-11-30 17:37:25 +01:00
Alexander Bias 25a0001b9f MDL-70342 block_timeline: Get rid of double quotes
This commit gets rid of double quotes around the activity name and course name
which have sneaked into block_timeline's view in MDL-65183.
2020-11-30 13:20:05 +01:00
Gareth Barnard 843cc0ee8d MDL-70267 ux, theme: Course user profile inconsistent page layout. 2020-11-29 23:51:01 +00:00
AMOS bot 0172d13163 Automatically generated installer lang files 2020-11-29 00:07:31 +00:00
Tim Hunt 78bddace2c MDL-54907 quiz unit tests: clean up code style in attempts_test.php 2020-11-27 18:30:43 +00:00
Tim Hunt 779c1687a4 MDL-54907 quiz: better timefinish for attempts finished asynchronously
There are serveral ways a quiz attempt can be submitted:

1. The student click the Submit and finish button. In this case,
   no problem. We record the current time as the finish time
   for the quiz attempt.

2. The student is activly working away at the quiz, and the
   count-down timer reachers zero. In this case, we also record
   the current time. Note that, if the server is under high load,
   then this could well end up being a few seconds after the
   theoretical end time, so you could have a quiz with a 30 minute
   time limit, with an attempt that lasted 30:07. However, this
   is just an accurate reflection of what happened, so should
   be recorded like this.

3. If the student is offline when the time expires, then
   (depending on the quiz settings) the attempt may be
   automatically submitted by cron, but this will happen with
   at least some delay (to prevent race conditions between cron
   and a student working online) and if cron is running slow
   on the server, it could be a lot later. Previously, this led
   to, say, a 30 minute quiz where an attempt seemed to have
   lasted 67 minutes, which confused people.

   Now, in this situation, the finsh time for the quiz attempt is
   recorded as the time when the time limit ran out. This is not
   just less confusing for teachers looking at the quiz report,
   it is also more accurate. That is the latest time at which
   students could have made any changes to their responses.
2020-11-27 18:30:43 +00:00
Tim Hunt c99a83bc5c MDL-54907 quiz generator: defaults should match a new Moodle install 2020-11-27 18:30:43 +00:00
Tim Hunt 0b523e6031 MDL-54907 dml: Correct incorrect PHPdoc 2020-11-27 18:30:42 +00:00
Jun Pataleta 8cd8daa285 MDL-69422 mod_data: Export form accessibility fixes
* Set appropriate heading element IDs
* Replace usages of deprecated HTML tag acronym with abbr instead.
* Add a label for the export fields fieldset.
* Move the CSV delimiter list outside the radio group.
* Fix div under a label element and duplicate labels
for the checkboxes of the fields to be exported by showing the field
name and type together.
* Group the fields to be exported as a fieldset.
* Move unsupported fields into a separate list.
* Move export options into its own section and group the options as a
fieldset.
2020-11-27 23:24:13 +08:00
Jun Pataleta 1bd007e815 MDL-69422 core: Convert required and help button container to div
* A span element cannot have a div as a child.
2020-11-27 23:24:13 +08:00
Sara Arjona 9c35064345 weekly release 3.10+ 2020-11-27 07:50:48 +01:00
Sara Arjona 5945a1a926 Merge branch 'install_310_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_310_STABLE 2020-11-27 07:50:45 +01:00
AMOS bot fac91d11d8 Automatically generated installer lang files 2020-11-27 06:21:03 +00:00
Sara Arjona 9fcd6522ce Merge branch 'MDL-70276_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2020-11-26 15:04:30 +01:00
Andrew Nicols 85673c859e MDL-70153 qtype_essay: Whitespace/behat fixes 2020-11-26 12:54:26 +01:00
Andrew Nicols 4dba8e8359 Merge branch 'MDL-70153-310' of git://github.com/dpalou/moodle into MOODLE_310_STABLE 2020-11-26 12:54:26 +01:00
Andrew Nicols f03c875cf3 Merge branch 'MDL-70237-310' of git://github.com/rezaies/moodle into MOODLE_310_STABLE 2020-11-26 12:54:26 +01:00
Andrew Nicols 9fcb5ece12 Merge branch 'MDL-70242-310' of git://github.com/marinaglancy/moodle into MOODLE_310_STABLE 2020-11-26 12:54:26 +01:00
Andrew Nicols b07833ddf4 Merge branch 'MDL-65852-310' of git://github.com/ilya-catalyst/moodle into MOODLE_310_STABLE 2020-11-26 12:54:26 +01:00
Sara Arjona 333f6cb753 Merge branch 'MDL-70248-310' of https://github.com/HuongNV13/moodle into MOODLE_310_STABLE 2020-11-26 12:54:25 +01:00
Sara Arjona 1c594e729b Merge branch 'MDL-70265_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2020-11-26 12:54:25 +01:00
Ilya Tregubov d8c8f544b3 MDL-69868 h5pactivity: Prevent breaking $USER when seeing
attempt report.
2020-11-26 12:40:28 +02:00
Eloy Lafuente (stronk7) a284ced9a1 MDL-70276 github actions: First cut, phpunit and grunt checks
First working version, supports phpunit (using build matrix):

- php72 (lowest), running mysql.
- php74 (highest), running postgres.

Also verifies that the branch has been "gruntified" and there
isn't any missing change (build js/css files).

TODO: Verify the remaining checks currently in .travis.yml, namely:
 - CITEST
 - Add caching
 - Better health-check for DB images.
 - Support from the tracker (satus badges and enable check).
 - Support from CiBoT (status and enable check).
 - Consider moving both the common setup (git, composer...)
   and the database (mysql, postgres) to own actions for
   easier tweaking.
2020-11-26 00:23:22 +01:00
Tim Hunt cb82824f6a MDL-70320 permission overrides: role names were double-escaped 2020-11-25 21:21:28 +00:00
Claude Vervoort 613c37d54b MDL-70284 mod_lti: dynreg fix response claims 2020-11-25 10:51:08 -05:00
cescobedo 53f9417795 MDL-70327 core_h5p: Add preventredirect to the player 2020-11-25 16:30:46 +01:00
Jordan Tomkinson 407807df6b MDL-70326 antivirus: fixing regression in MDL-66222 2020-11-25 11:28:56 +01:00
Ilya Tregubov 7c80e15392 MDL-65852 user: Fix permission check to download course participants. 2020-11-25 11:27:36 +02:00
Tim Hunt e95c0a90ac MDL-70321 question backup: fix MDL-47178 unit tests
They were failing if you had CodeRunner installed
2020-11-24 15:29:41 +00:00
Simon Mok 48905f6b75 MDL-67460 profile: User profile link to use HTTPS 2020-11-24 20:48:52 +08:00
Tim Hunt b5b562b7ee MDL-70285 completion upgrade: fix performance of the MDL-69687 code 2020-11-23 20:59:08 +00:00
David Matamoros 4a82e72b00 MDL-69411 core_message: Fix return structure for empty result set
Passing a timefrom higher than last message timecreated needs to
return a formatted response so it does not break ws.
2020-11-23 19:25:43 +01:00
Eloy Lafuente (stronk7) ef95f5262f MDL-70265 travis: Completely remove the UPGRADE check
It was broken since ages ago, see MDL-64874, so no sense
to keep it eating minutes for nothing.
2020-11-23 14:28:33 +01:00
Adrian Greeve e2d911c07b Merge branch 'MDL-67668-310-2' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-11-23 15:37:44 +08:00
Jake Dallimore 71bae0da0f Merge branch 'MDL-70160-function-cache-310' of https://github.com/Peterburnett/moodle into MOODLE_310_STABLE 2020-11-23 15:22:49 +08:00
Andrew Nicols e7bfbaf7b2 MDL-70151 assign: Fix bulk change for behat
Behat does not play well with confirmation dialogues and in some
situations it does not wait for the page to reload before starting the
next step.

This change adds a pending_js call which is only resolved if the cancel
button was pressed, otherwise it remains in-progress until the page
reloads resetting the entire state of it.
2020-11-23 11:12:03 +08:00
Andrew Nicols 6882d7399b MDL-70167 behat: Rewrite attribute check steps
This commit updates the following steps to use the
`the_attribute_of_should_be_set` step under the hood:
- the [element] [type] should be disabled
- the [element] [type] should be enabled
- the [element] [type] should be readonly
- the [element] [type] should not be readonly

This reduces unnecssary code duplication.
2020-11-23 11:03:28 +08:00
Andrew Nicols 80bf03d583 MDL-70167 behat: Boolean attributes should either exist or not 2020-11-23 11:03:28 +08:00
Andrew Nicols 1039537d83 MDL-67668 behat: Update tests for inplace editable field type 2020-11-23 09:00:46 +08:00
Andrew Nicols 0214c50b18 MDL-67668 behat: Add inplace editable field type
This commit promotes the Inplace Editable field to a first-class form
element by introducing a new partial selector for inplace editable
fields, and teaching the field manager how to recognise these, then
introducing a new field type which can handle setting values for this
field.
2020-11-23 09:00:46 +08:00
Andrew Nicols e29e8373e6 MDL-67668 behat: Share behat_behat functionality with forms
Behat form fields are implemented in a way completely isolated from the
rest of the Behat Context system. Whereas regular step definitions have
access to execute steps, to call `find`, check for JS running, and other
related functionality, the Moodle implementation of a field type does
not have any access to this.

By moving the core functionality of behat_base to a new trait, and the
constants to a new interface, the functionality can also be used in
behat form fields in the same way as elsewhere.
2020-11-23 09:00:46 +08:00
Andrew Nicols 9e11009eb1 MDL-67668 behat: Correct js pending check
Pending checks should only run when JS is running, but some uses were
not apply this check.
2020-11-23 09:00:46 +08:00
Andrew Nicols a01ca7a600 MDL-67668 behat: Support NodeElement when fetching node in container
This is similar to change made in MDL-69136 to allow an already-fetched
NodeElement to be provided to the get_node_in_container() function and
makes it easier to be deterministic when writing steps.
2020-11-23 09:00:46 +08:00
Eloy Lafuente (stronk7) 6a662825f7 MDL-70265 travis: Only run highest phpunit if configured via env
By default only lowest php version will be executed, and only pgsql.

This default behavior can be changed with a new variable:

MOODLE_PHP = [all]
MOODLE_DATABASE = [pgsql | mysqli | all]
2020-11-21 11:28:31 +01:00
Eloy Lafuente (stronk7) 03e3219884 weekly release 3.10+ 2020-11-20 23:17:06 +01:00
Huong Nguyen 681b7f4e78 MDL-70248 qtype_ddimageortext: Drop zones have UI issue in Editing form 2020-11-19 17:03:49 +07:00
Adrian Greeve f098f28d01 Merge branch 'MOODLE_310_STABLE-MDL-67636' of https://github.com/yao9394/moodle into MOODLE_310_STABLE 2020-11-19 11:57:33 +08:00
John Yao bf17d50cf6 MDL-67636 gradebook: Prevent exposing hidden grade in locked category 2020-11-19 14:33:26 +11:00
Adrian Greeve 8e0f036b29 Merge branch 'MDL-56653-310' of git://github.com/lameze/moodle into MOODLE_310_STABLE 2020-11-19 11:10:48 +08:00
Andrew Nicols 51c6924206 Merge branch 'MDL-69809-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-11-19 10:47:46 +08:00
Jun Pataleta f589a25459 Merge branch 'MDL-70094-310' of https://github.com/SangNguyen2601/moodle into MOODLE_310_STABLE 2020-11-19 09:36:53 +08:00
Eloy Lafuente (stronk7) dee389dff6 Merge branch 'MDL-69201-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-11-18 23:00:18 +01:00
Shamim Rezaie a9b83b3c01 MDL-70237 payment: Allow html tags in gateway description 2020-11-18 23:25:06 +11:00
sangnguyen2601 0ab0a293a8 MDL-70094 Question: Technical info section expands if click help icon 2020-11-18 17:32:40 +07:00
Dani Palou b76093e90c MDL-70153 qtype_essay: Add behat test for attachments max size 2020-11-18 10:48:17 +01:00
Dani Palou 8f0d40a39c MDL-70153 qtype_essay: Fix max size displayed for attachments 2020-11-18 10:48:17 +01:00
Vitaly 3a2d8a175e MDL-56653 enrol_meta: a single DB query in edit_instance_validation
The 'edit_instance_validation()' method checks for existing meta enrolment instances.
The fix replaces DB queries in a loop for each course with a single query for all courses.
Also, a new testing method 'test_edit_instance_validation_with_existing_courses()'
was added to /enrol/meta/tests/plugin_test.php to test if the new implementation
returns an error in case of trying to save the already linked courses in the 'customint1' field.
2020-11-18 15:05:42 +08:00
Andrew Nicols ff72ca7340 Merge branch '310_MDL-68896' of git://github.com/danmarsden/moodle into MOODLE_310_STABLE 2020-11-18 09:33:06 +08:00
Eloy Lafuente (stronk7) 4e346470a5 Merge branch 'MDL-70148-310' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-11-17 23:13:17 +01:00
Paul Holden 13c76cc295 MDL-67514 customfield: correct external usescategories return type. 2020-11-17 22:13:16 +00:00
Marina Glancy 2c4426bb10 MDL-70242 auth_oauth2: set page context and url 2020-11-17 16:47:59 +01:00
Andrew Nicols d3a9e2935d MDL-70148 gradereport_grader: Improve reliability of keyboard usage
In some browsers the ajax grade select does not properly update the
grade after setting values. The previous solution was to press the
[enter] key, but doing this with the new key type step opens the select
box again. This is what happens when a real user presses enter on the
select.

This is the last possible field in the report, so pressing the tab key
to move to the next gradable element does not work.

The solution uses a shift-tab to move the focus away to the previous
gradale element. In this case it must also be moved to an earlier step
because the previously selected value must be checked in the Then
section of the test and if it is selected then its value cannot be
checked.
2020-11-17 15:14:43 +08:00
Andrew Nicols 2adc010b85 MDL-70148 qtype: Update qtype steps to new key interaction
Note: The ddmarker question type was previously getting the number of
keypresses wrong. This was because it was using both keyDown/keyUp, and
also keyPress. As a result each keypress was essentially happening two
times.
2020-11-17 15:14:43 +08:00
Andrew Nicols c330c9276c MDL-70148 behat: Update steps for keyboard 2020-11-17 15:14:43 +08:00
Andrew Nicols e9b443b3a1 MDL-70148 behat: Add steps to send keys without an element 2020-11-17 15:14:43 +08:00
Andrew Nicols 7bb692666b Merge branch 'MDL-69526-310' of git://github.com/lucaboesch/moodle into MOODLE_310_STABLE 2020-11-17 14:55:10 +08:00
Adrian Greeve 5e924f295a Merge branch 'MDL-50955-310' of git://github.com/peterRd/moodle into MOODLE_310_STABLE 2020-11-17 13:08:48 +08:00
Andrew Nicols 739cbcf7e9 Merge branch 'MDL-69964-310' of git://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-11-17 10:22:38 +08:00
Paul Holden 22df02089a MDL-69964 course: toggle participant checkboxes in root element.
For a given toggleGroup, the relevant action elements are not
necessarily descendants of the same tableRoot element, on the
course participants page.
2020-11-16 17:44:23 +00:00
Andrew Nicols be2afb52c1 MDL-67513 core: Only move modal to body if currently attached
A previous change as part of this commitset was intended to move the
modal to the document.body, but where the modal had been destroyed it
was instead added back to the body.
2020-11-16 09:37:48 +01:00
Peter Dias 09520f8e0d MDL-50955 core: Reset lessons completion criteria if grade type is none 2020-11-16 16:35:33 +08:00
Andrew Nicols d661fbfbc1 Merge branch 'MDL-67513-m310' of https://github.com/NeillM/moodle into MOODLE_310_STABLE 2020-11-16 08:27:35 +08:00
Luca Bösch e29069d45b MDL-69526 block_myoverview: custom course fields natural sorting 2020-11-13 00:57:42 +01:00
Eloy Lafuente (stronk7) f86b5e3545 weekly release 3.10+ 2020-11-12 22:11:40 +01:00
Neill Magill a2dcfd5bf6 MDL-67513 forum: View conversations while fullscreen grading
Before this change when a modal was shown and an element on the page
was fullscreen the modal would be created behind it.

This change ensures that the modal will be inside an element that is
fullscreen so that it will be correctly displayed.
2020-11-12 08:30:54 +00:00
Adrian Greeve dd74c34e36 Merge branch 'MDL-69453-310' of git://github.com/bmbrands/moodle into MOODLE_310_STABLE 2020-11-12 11:56:29 +08:00
Andrew Nicols 5f3b5fdadf Merge branch 'MDL-70067-310_theme_classic' of https://github.com/alexmorrisnz/moodle into MOODLE_310_STABLE 2020-11-12 10:27:27 +08:00
Adrian Greeve 029f061e60 Merge branch 'MOODLE_310_MDL-70117' of https://github.com/golenkovm/moodle into MOODLE_310_STABLE 2020-11-12 09:27:08 +08:00
Eloy Lafuente (stronk7) 14ea8ed50a Merge branch 'MDL-65941-310' of https://github.com/snake/moodle into MOODLE_310_STABLE 2020-11-12 00:18:39 +01:00
Eloy Lafuente (stronk7) 28b14d17c2 Merge branch 'MDL-70023-310' of git://github.com/marinaglancy/moodle into MOODLE_310_STABLE 2020-11-11 23:57:25 +01:00
Alex Morris ce69ce2db5 MDL-70067 report_insights: Replace BS3 column naming
Bootstrap 4 removed col-xs- and replaced it with col-
2020-11-12 08:57:02 +13:00
Sara Arjona 7ca7076c1b Merge branch 'MDL-70063-310-1' of git://github.com/mihailges/moodle into MOODLE_310_STABLE 2020-11-11 16:30:21 +01:00
Jun Pataleta 4c1fbc320f Merge branch 'MDL-70072-310' of git://github.com/rezaies/moodle into MOODLE_310_STABLE 2020-11-11 22:09:07 +08:00
Mihail Geshoski 7b5a1a1967 MDL-70063 block_tag_youtube: Add behat tests 2020-11-11 21:45:09 +08:00
Mihail Geshoski 2a5d1ba26e MDL-70063 block_tag_youtube: Fix category config in existing instances
Upgrade step that fixes the category configuration of existing
tag_youtube block instances.
2020-11-11 21:45:09 +08:00
Mihail Geshoski 6e4c5bf0a2 MDL-70063 block_tag_youtube: Update category config to use category ID
In YouTube Data API v3, the API call to fetch the videos related to a
certain category expects the category ID to be passed to the
videoCategoryId parameter, instead of the category name. Therefore, the
category config should store the category ID.
2020-11-11 21:45:09 +08:00
Bas Brands e6ebfa4baa MDL-69453 core_form: improve form UI icons and alignment 2020-11-11 14:04:54 +01:00
Sara Arjona 5a29867e2d Merge branch 'MDL-70141-m310' of https://github.com/sammarshallou/moodle into MOODLE_310_STABLE 2020-11-11 08:39:23 +01:00
Michael Aherne bbb83614d2 MDL-65941 cache: Prevent cache config failure on redis problems. 2020-11-11 14:49:15 +08:00
Sara Arjona 0ab938d309 Merge branch 'MDL-69823-310' of git://github.com/jleyva/moodle into MOODLE_310_STABLE 2020-11-11 07:41:31 +01:00
Andrew Nicols 6882790684 Merge branch 'MDL-70126-310' of git://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-11-11 10:25:04 +08:00
Andrew Nicols e78929087e Merge branch 'MDL-70065_310' of https://github.com/timhunt/moodle into MOODLE_310_STABLE 2020-11-11 10:10:24 +08:00
Mikhail Golenkov 10a0ea20ac MDL-70117 dataformat_pdf: Fix content overflow when headers are involved 2020-11-11 10:52:01 +11:00
Juan Leyva d0b4b6fa2f MDL-69823 qtype: Support core question types 2020-11-10 19:21:32 +01:00
Juan Leyva a5dcaee31c MDL-69823 mod_quiz: Return question options via WS 2020-11-10 19:21:32 +01:00
Sara Arjona 05ef5c3c48 Merge branch 'MDL-70106-icon-cache-310' of https://github.com/Peterburnett/moodle into MOODLE_310_STABLE 2020-11-10 16:53:37 +01:00
Jun Pataleta e803a24401 Merge branch 'MDL-69930-310' of https://github.com/HuongNV13/moodle into MOODLE_310_STABLE
# Conflicts:
#	question/type/ddimageortext/amd/build/question.min.js
#	question/type/ddimageortext/amd/build/question.min.js.map
#	question/type/ddimageortext/amd/src/question.js
2020-11-10 14:08:57 +08:00
Peter Burnett ebe19aa434 MDL-70160 cache: plugin_functions checks for function_exists() 2020-11-10 16:03:53 +10:00
Jun Pataleta 4b0988f014 Merge branch 'MDL-68349-310' of git://github.com/marinaglancy/moodle into MOODLE_310_STABLE 2020-11-10 10:14:37 +08:00
Jake Dallimore 56ec88ca1c Merge branch 'MDL-69841-310' of https://github.com/HuongNV13/moodle into MOODLE_310_STABLE 2020-11-10 09:33:06 +08:00
Víctor Déniz 849c7704f7 Merge branch 'MDL-69955-310' of https://github.com/HuongNV13/moodle into MOODLE_310_STABLE 2020-11-09 21:47:22 +00:00
Paul Holden 898dd7bf5b MDL-69201 core: consistent table primary sort column/order. 2020-11-09 19:45:41 +00:00
Paul Holden f5e374c278 MDL-70126 tag: correct thrown exception class name. 2020-11-09 19:43:38 +00:00
Neill Magill 4423581f8d MDL-67513 forum: Test that discussions can be viewed while grading 2020-11-09 14:24:56 +00:00
Andrew Nicols d0295d8ff2 Merge branch 'MDL-70146_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2020-11-09 10:01:19 +08:00
Eloy Lafuente (stronk7) 4aa83d92bf MDL-70146 upgrade: add 3.10.0 separation line to all upgrade scripts 2020-11-07 23:26:09 +01:00
Eloy Lafuente (stronk7) ec58cefefb Moodle release 3.10 2020-11-07 17:24:12 +01:00
Eloy Lafuente (stronk7) e4cda88e76 Moodle release 3.10rc2 2020-11-06 22:56:08 +01:00
Víctor Déniz 8752df87ed Merge branch 'MDL-70137-310-2' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-11-06 19:16:52 +00:00
Andrew Nicols 511dab1cd3 MDL-70137 cache: Write config to temp file and move into place 2020-11-06 19:16:51 +00:00
Andrew Nicols b26a5e5e08 MDL-70137 cache: Use sensible default when reading MUC config
When we read the MUC configuration, a file which exists but is empty
will not error, but will cause all configuration to be empty.

We already perform an {{is_array()}} check on the {{$configuration}}
variable, but the default value for {{$configuration}} is an empty
array. In the case where the file exists, but is empty, no errors occur
when the file is loaded, and the initial {{$configuration}} value is
not overwritten, leading to the file being replaced with an empty copy.
2020-11-06 19:16:44 +00:00
Eloy Lafuente (stronk7) fcb699808c Merge branch 'MDL-70143-310' of git://github.com/marinaglancy/moodle into MOODLE_310_STABLE 2020-11-06 19:51:54 +01:00
Eloy Lafuente (stronk7) f9dc16ca05 Merge branch 'MDL-70139-310' of git://github.com/sarjona/moodle into MOODLE_310_STABLE 2020-11-06 18:56:00 +01:00
sam marshall 72ad8e6919 MDL-70141 core_block: Web service set $PAGE url to avoid warnings 2020-11-06 17:39:06 +00:00
Marina Glancy a350376b65 MDL-70143 tool_uploaduser: fix wrong cache reference 2020-11-06 18:07:24 +01:00
Sara Arjona 29f7a9a210 MDL-70139 core_badges: fix invalid request when sending to backpack
Having mixed $data in badge exporters is causing some issues.
As all these exporters are using $data as an object, $data can be
converted to object in the constructor, to avoid errors and get
the expected behaviour always.
2020-11-06 16:36:52 +01:00
Shamim Rezaie f6b7ed422a MDL-70072 core: Fix always displaying date in Gregorian 2020-11-06 19:23:11 +11:00
Jun Pataleta 022a019637 Merge branch 'MDL-70130-310' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-11-06 11:27:54 +08:00
Andrew Nicols 50f5563c1f MDL-70130 core: Compare realpaths for file attachment checks
Rather than using the provided path, the `realpath` must be used to
ensure that the use of symlinks in paths is normalised.
2020-11-06 11:00:30 +08:00
Andrew Nicols 1c0b8f8c50 MDL-70130 core: Simplify attachment handling in email_to_suer 2020-11-06 11:00:29 +08:00
Marina Glancy c879cb24df MDL-70130 core: allow to attach files from localrequestdir to emails
Co-authored-by: Paul Holden <paulh@moodle.com>
2020-11-06 11:00:29 +08:00
Andrew Nicols 6890ad18e3 Merge branch 'MDL-70131-310' of git://github.com/marinaglancy/moodle into MOODLE_310_STABLE 2020-11-06 09:27:33 +08:00
Andrew Nicols b88679e3a1 Merge branch 'MDL-70120-assign-stamp-expires-MOODLE_310_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_310_STABLE 2020-11-06 09:26:01 +08:00
Marina Glancy 8c1917588d MDL-70131 cli: only allow to negate existing keys 2020-11-05 18:10:13 +01:00
Eloy Lafuente (stronk7) c50c904c9e Moodle release 3.10rc1 2020-11-05 12:16:53 +01:00
Marina Glancy 65d419b204 MDL-70023 core_course: improve performance of recently accessed courses 2020-11-05 09:55:15 +01:00
Jun Pataleta 9023021ae0 Merge branch 'MDL-70075-310-2' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-11-05 12:51:23 +08:00
Andrew Nicols 919ead58fe Merge branch 'MDL-70066-310' of git://github.com/lameze/moodle into MOODLE_310_STABLE 2020-11-05 10:01:18 +08:00
Andrew Nicols 27de77007b MDL-70075 core: Autocomplete selection should always have an active item
Ensure that there is always one active element in the list of selected
autocomplete elements.

Without this we have issues beacuse clicking on the link makes the first
one active if one is not already active, and this turns a click event
into a drag event, which means that it is not deleted.
2020-11-05 09:05:38 +08:00
Andrew Nicols 34d1c23668 MDL-70075 core: Do not return a value in an event handler
Returning a value of `false` in an event handler has the effect of
calling event.preventDefault() and event.stopPropagation().

This is neither obvious, nor desirable in this situation.
2020-11-05 09:05:38 +08:00
Andrew Nicols dc7ca062ca MDL-70075 core: jQuery.attr() does not accept a bool value
The documented values that jQuery.attr() accepts are String, Number, or
null. For some reason, when we pass a Boolean value, the subsequent
click handler does not work in some situations.

Changing this to take a Number, and unsetting it when empty, resolves
this issue.
2020-11-05 09:05:38 +08:00
Andrew Nicols 8100d46f85 MDL-70075 core: Listen for change in accessibleChange event
The accessibleChange custom interaction event was only listening for
blur and focus, however some OS/browser combinations do not emit these
events until the element is explicitly blurred. This is notably
different on Firefox on some Operating Systems.

Recent changes in MDL-68167 explicitly moved the user participants page
filter module to use the accessibleChange event, which means that the
selections are now only triggered on an explicit blur when using
Firefox. This highlight a bug whereby, when the mouse is used to make a
selection, the event is not triggered until the element is blurred.

This change modifies the accessibleChange event to ignore the `change`
event where it was triggered by the keyboard and where that keybaord
event was not a [return] or [escape] keypress, but to otherwise respect
the native change event.
2020-11-05 09:05:38 +08:00
Andrew Nicols f4dfe66ea8 MDL-70075 core: Listen for the focus and blur events again
The `blur` event does not bubble, but the `focusout` events are not
available in all supported versions of Firefox.

Rather than switching event, this patch using event capture to
effectively achieve the same result and bubble the event up through the
DOM to the delegated listener.

There should be no functional change with this patch, except to support
Firefox fully.
2020-11-05 09:05:38 +08:00
Eloy Lafuente (stronk7) e92c6b19b8 Merge branch 'MDL-70100-310' of git://github.com/bmbrands/moodle into MOODLE_310_STABLE 2020-11-04 22:40:54 +01:00
Víctor Déniz fa79a1876c Merge branch 'MDL-70112_310' of https://github.com/timhunt/moodle into MOODLE_310_STABLE 2020-11-04 19:17:34 +00:00
Sara Arjona c9ab02b0cc Merge branch 'MDL-70114-310' of git://github.com/bmbrands/moodle into MOODLE_310_STABLE 2020-11-04 20:15:04 +01:00
Víctor Déniz 9c2241dee4 Merge branch 'MDL-68749-310-2' of git://github.com/mickhawkins/moodle into MOODLE_310_STABLE 2020-11-04 15:24:08 +00:00
Sara Arjona 8028bf10dc Merge branch 'MDL-70119-310' of git://github.com/ferranrecio/moodle into MOODLE_310_STABLE 2020-11-04 15:19:44 +01:00
Bas Brands 04704c2108 MDL-70114 mod_data: add border for to textarea 2020-11-04 13:30:11 +00:00
Brendan Heywood fbe13d55f3 MDL-70120 assignfeedback_editpdf: Stamp files should be cached 2020-11-04 23:06:02 +11:00
Ferran Recio 75d6582fef MDL-70119 core_badges: fix tab names 2020-11-04 12:57:30 +01:00
Simey Lameze 7ca4fd97d9 MDL-70066 badges: change usages of array_key_exists to isset 2020-11-04 16:05:45 +08:00
Jun Pataleta 940ed72017 Merge branch 'MDL-70089_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2020-11-04 13:05:47 +08:00
Peter Burnett 3885c566aa MDL-70106 cache: Set icon localstorage cache to use theme localisation 2020-11-04 13:33:23 +10:00
Huong Nguyen ab542b6e98 MDL-69955 qtype_ddimageortext: drop zone disappear in special case 2020-11-04 09:52:31 +07:00
Jake Dallimore 477cd8b5fe Merge branch 'MOODLE_310_MDL-70093' of https://github.com/golenkovm/moodle into MOODLE_310_STABLE 2020-11-04 09:00:26 +08:00
Tim Hunt a8efb07714 MDL-70112 drag-drop qtypes: fix form preview 2020-11-03 21:36:00 +00:00
Eloy Lafuente (stronk7) 51c9ea5194 MDL-70089 versions: main version bump 2020-11-03 19:38:27 +01:00
Eloy Lafuente (stronk7) b0a1b4ce8b MDL-70089 versions: bump all versions and requires near release
version = 2020110900 release version
requires= 2020110300 current beta+ (week6roll1) version

Note that, because we are under parallel development period,
this is being done in the branch that is going to be released
(MOODLE_310_STABLE already existing) for Moodle 3.10.0 and
not in master, that is the one getting the bump under normal
(non-parallel) periods.
2020-11-03 19:34:52 +01:00
Mihail Geshoski 3d9175f6f1 MDL-67837 backup: Add unit tests 2020-11-03 12:34:28 +01:00
Mihail Geshoski fd2427746f MDL-67837 backup: Verify caps before unenrolling users on course restore 2020-11-03 12:34:28 +01:00
andreasschenkel 49afa008f4 MDL-69844 user: Fix no email in download_participants_table
Only include eMail in download_participants_table 
if selected in showuseridentity 
($identityfieldsselect)
2020-11-03 12:34:28 +01:00
Juan Leyva 551892e2a7 MDL-67015 mod_data: Prevent users adding entries to other groups 2020-11-03 12:34:28 +01:00
Amaia Anabitarte 45c339ef09 MDL-69046 core_contentbank: Escape quotes when showing name 2020-11-03 12:34:28 +01:00
Ferran Recio e9fe9f4ae3 MDL-69378 tool_uploadcourse: fix enrolment methods uploads 2020-11-03 12:34:28 +01:00
Peter Dias 1d1b148ca9 MDL-56310 restore: Confirm user has permission to change capabilities 2020-11-03 12:34:28 +01:00
Eloy Lafuente (stronk7) 15b4174a9f on-demand release 3.10beta+ 2020-11-03 12:23:48 +01:00
Bas Brands 99ab172211 MDL-70100 theme_boost: quiztimer zindex fix 2020-11-03 10:36:11 +01:00
Michael Hawkins 5cc9f3448c MDL-68749 theme: Fix bootstrap toggle switches in RTL layout
Co-authored-by: Bas Brands <bas@moodle.com>
2020-11-03 14:47:58 +08:00
Andrew Nicols 4dd870de20 Merge branch 'MDL-70059-310' of git://github.com/sarjona/moodle into MOODLE_310_STABLE 2020-11-03 12:05:19 +08:00
Jun Pataleta c353963ef8 Merge branch 'MDL-70033-310-2' of git://github.com/mickhawkins/moodle into MOODLE_310_STABLE 2020-11-03 12:01:33 +08:00
Michael Hawkins 60585523ad MDL-70033 course: Update download content event handling for Classic 2020-11-03 11:54:56 +08:00
Michael Hawkins eeaf19eb5c MDL-70033 core: Update tree.js event handlers to replace stopPropagation
Also added support to allow links to override action keys (enter/space)

Co-authored-by: Andrew Nicols <andrew@nicols.co.uk>
2020-11-03 11:54:56 +08:00
Juan Leyva 63da614e4f MDL-70081 airnotifier: Add missing device type in token registration 2020-11-03 01:25:57 +01:00
Jun Pataleta 73372330a9 Merge branch 'MDL-69975_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2020-11-03 00:00:25 +08:00
Sara Arjona 5f3de24306 Merge branch 'MDL-69973_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2020-11-02 15:44:54 +01:00
Mikhail Golenkov c15eac212b MDL-70093 dataformat_pdf: Fix row height calculation with high cells 2020-11-02 22:25:24 +11:00
Sara Arjona 01c8c8828b MDL-70059 core_badges: avoid duplicate key error
When 2 or more backpack were created without credentials,
a "Duplicate key value violates unique constraint" error
was raised because externalbackpackid was not taking the
correct value.
Other improvements have been done to the code too in order
to make it more readable.
2020-11-02 10:48:06 +01:00
Jake Dallimore 2dbe5f54f1 Merge branch 'MDL-70073-310' of git://github.com/peterRd/moodle into MOODLE_310_STABLE 2020-11-02 13:57:35 +08:00
Jun Pataleta bcf59d235b Merge branch 'MDL-70074-add-authendpoint-310' of https://github.com/cengage/moodle into MOODLE_310_STABLE 2020-11-02 10:04:31 +08:00
Alexander 62530e097b MDL-70067 theme_classic: Use col-12 as col-xs-12 was removed in BS4 2020-11-02 09:08:07 +13:00
Peter Dias 32574e9cae MDL-70073 badges: Fix the backpack-add to match current master 2020-11-01 22:33:28 +08:00
Brendan Heywood 256f8a261c MDL-69975 core: Fix paths longer than 260 chars on windows
Also, ensure that remove_dir() only processes directories,
because sometimes it was being called by shutdown managers
with files, leading to PHP warnings.

Co-authored-by: Eloy Lafuente (stronk7) <stronk7@moodle.org>
Co-authored-by: Jun Pataleta <jun@moodle.com>
2020-11-01 11:09:39 +01:00
Claude Vervoort 60232d2b9b MDL-70074 mod_lti: add authorization_endpoint 2020-10-30 18:08:18 -04:00
Eloy Lafuente (stronk7) 864ddb77c5 MDL-69973 xmldb: Ensure all reports use fresh metadata (not cached) 2020-10-30 19:27:14 +01:00
Eloy Lafuente (stronk7) 462fe3e925 MDL-69973 xmldb: Fix problem with MariaDB >= 10.2.7 metadata defaults
With MariaDB 10.2.7 the driver was incorrectly returning '' (empty
string) as default for all the columns having null (meaning, no
default).

Also, cover the case in unit tests, it seems that we were already
testing other defaults but not the null case.
2020-10-30 19:27:14 +01:00
Marina Glancy 937c7eeef1 MDL-68349 auth_db: user_created event should be triggered later 2020-10-30 14:21:06 +01:00
Eloy Lafuente (stronk7) 6bb7478e8d on-demand release 3.10beta+ 2020-10-30 13:49:20 +01:00
Jun Pataleta 03960b96cb Merge branch 'MDL-68167-310' of git://github.com/rezaies/moodle into MOODLE_310_STABLE 2020-10-30 13:16:55 +08:00
Shamim Rezaie 4d00ebae7a MDL-68167 lib: autocomplete focos should not be removed on blur
See https://www.w3.org/TR/wai-aria-practices-1.1/examples/listbox/listbox-rearrangeable.html
2020-10-30 16:08:56 +11:00
Shamim Rezaie 352e2f7787 MDL-68167 lib: Do not set aria-expanded if it should not be set 2020-10-30 16:08:56 +11:00
Shamim Rezaie 2d2b8d9170 MDL-68167 user: Fix missing label for participants filter input fields 2020-10-30 16:08:56 +11:00
Shamim Rezaie 53f2acb263 MDL-68167 lib: Clear single-select autocomplete elements with keyboard
Following MDL-57680, it should be possible to clear the selected option
using keyboard as well.
2020-10-30 16:08:56 +11:00
Shamim Rezaie 3ea25c3b77 MDL-68167 user: Fix a hardcoded string to be read from lang pack 2020-10-30 16:08:55 +11:00
Shamim Rezaie 7931148cbb MDL-68167 lib: Fix label for autocomplete selection/suggestion box
The content of the autocomplete selection div is purged by javascript
so we have to move its label outside of it. aria-labeledby is the way
to go.

Each time the suggestion box is expanded, autocomplete js renders the
autocomplete suggestions template. So the label cannot be outside the
suggestions ul.
2020-10-30 16:08:40 +11:00
Shamim Rezaie 1031836d89 MDL-68167 user: filter elements should listen to accessibleChange event 2020-10-30 15:01:39 +11:00
Shamim Rezaie ec1e1fd01a MDL-68167 lib: The accessibleChange custom event now supports bubbling
The change event bubbles so the accessibleChange shoud bubble as well.
2020-10-30 15:01:39 +11:00
Shamim Rezaie b5a04a9fe2 MDL-68167 theme_boost: make focus outline accessible for autocompletes 2020-10-30 15:01:39 +11:00
Shamim Rezaie be7b73a24b MDL-68167 lib: Autocomplete selection to use listbox aria role
The aria-selected state cannot be used for the listitem role. The
autocomplete widget highly uses the aria-selected state internally.
2020-10-30 14:59:50 +11:00
Shamim Rezaie 0c438b4d3e MDL-68167 user: Improve keyboard navigation on autocomplete fields 2020-10-30 14:59:50 +11:00
Shamim Rezaie 3f0373cb7e Merge branch 'MDL-69390-310' of git://github.com/bmbrands/moodle into MDL-69390-310-test 2020-10-30 14:59:34 +11:00
Andrew Nicols 6a64b9c5b7 Merge branch 'MDL-69156_310' of https://github.com/ffhs/moodle into MOODLE_310_STABLE 2020-10-30 11:52:07 +08:00
Huong Nguyen 7e47aca045 MDL-69841 Quiz: Review options 'Help' icons do not work correctly 2020-10-30 10:25:43 +07:00
Víctor Déniz 04569f819f Merge branch 'MDL-70032-310-2' of git://github.com/junpataleta/moodle into MOODLE_310_STABLE 2020-10-29 22:26:35 +00:00
Tim Hunt c611f94e04 MDL-70065 quiz: fix paging when adding questions from the bank 2020-10-29 20:29:26 +00:00
Paul Holden a850fa5de8 MDL-69156 backup: correct behaviour of course copy idnumber field.
When a given user doesn't have the capability to change the idnumber
field during course copy, freeze the field value.
2020-10-29 14:15:04 +01:00
Adrian Perez 8d0d0b1f59 MDL-69156 course_copy: set defaults for idnumber when not permitted 2020-10-29 14:15:00 +01:00
Jun Pataleta 8ea746fa79 MDL-70032 qtype_multichoice: Use custom partial named selector
* With the removal of the label element, Behat now has to click on the
answer text. In order to achieve this, the custom partial named selector
"qtype_multichoice > Answer" was now added and have replaced the
instances where the label of the answer's checkbox/radio button is
being clicked.
2020-10-29 16:21:53 +08:00
Jun Pataleta 5d7bd0208a MDL-70032 qtype_multichoice: Fix answer labelling
* Discard the use of the label element in order to be able to render
multiple choice answers as they are and have these act as the radio
button/checkbox' label through the aria-labelledby attribute.
* New JS module qtype_multichoice/answers that listens for click events
on the answer text container and selects the appropriate answer radio
button/checkbox.
2020-10-29 16:21:53 +08:00
Andrew Nicols 52ad601de1 Merge branch 'MDL-68722-310' of https://github.com/matt-catalyst/moodle into MOODLE_310_STABLE 2020-10-29 14:03:15 +08:00
Jake Dallimore 2e02b4d678 Merge branch 'MDL-69716-310' of git://github.com/aanabit/moodle into MOODLE_310_STABLE 2020-10-29 12:40:06 +08:00
Jake Dallimore 859578b0d5 Merge branch 'MDL-70041-310' of git://github.com/mihailges/moodle into MOODLE_310_STABLE 2020-10-29 11:49:20 +08:00
Adrian Greeve 761b8a95f9 Merge branch 'm310_MDL-70042_Progress_Bar_Upgrade_Message_Popup' of https://github.com/scara/moodle into MOODLE_310_STABLE 2020-10-29 08:33:33 +08:00
Matteo Scaramuccia 4ca3d0a0ae MDL-70042 message_popup: Trivial savepoint comment cleanup 2020-10-28 23:00:48 +01:00
Matteo Scaramuccia 75c793f830 MDL-70042 message_popup: progress bar on upgrade only when necessary 2020-10-28 23:00:32 +01:00
Jun Pataleta d546f308d2 Merge branch 'MDL-69390-310' of git://github.com/bmbrands/moodle into MOODLE_310_STABLE 2020-10-28 22:44:08 +08:00
Bas Brands 74f37f98ad MDL-69390 theme_boost: dropdown menu accessibility
- display a dot before the active element
- use the active colour for the hover colour
2020-10-28 14:03:06 +01:00
Jun Pataleta aead807ce6 Merge branch 'MDL-69815-310' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-10-28 14:19:23 +08:00
Andrew Nicols f7ad3eaca3 Merge branch 'MDL-70004-310' of git://github.com/junpataleta/moodle into MOODLE_310_STABLE 2020-10-28 13:14:12 +08:00
Jake Dallimore da4fc1e256 Merge branch 'MDL-64723-310' of git://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-10-28 12:10:47 +08:00
Mihail Geshoski 35364e22fc MDL-70041 filepicker: Make sure the user has a recently used license 2020-10-28 12:06:34 +08:00
Jake Dallimore b1ef67ba62 Merge branch 'MDL-65792-310' of git://github.com/bmbrands/moodle into MOODLE_310_STABLE 2020-10-28 12:00:16 +08:00
Jake Dallimore 461bf54590 Merge branch 'MDL-70010_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2020-10-28 11:07:52 +08:00
Andrew Nicols 6ba76c0097 MDL-69815 core: Bump Node to v14.15.0 (LTS/Fermium) 2020-10-28 09:34:31 +08:00
Eloy Lafuente (stronk7) 323ea697c3 Merge branch 'MDL-69998-310-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_310_STABLE 2020-10-28 00:42:05 +01:00
Eloy Lafuente (stronk7) 46f6bae002 Moodle release 3.10beta 2020-10-27 23:48:46 +01:00
Eloy Lafuente (stronk7) 8aacc3fa2b NOBUG: Fixed file access permissions 2020-10-27 23:48:45 +01:00
Eloy Lafuente (stronk7) 0715960dd8 NOBUG: Fixed SVG browser compatibility 2020-10-27 23:48:43 +01:00
Sara Arjona 65084e7371 MDL-69166 enrol_fee: fix behat string from fee to enrolment by payment 2020-10-27 15:01:47 +01:00
Sara Arjona da4b94e012 MDL-69166 enrol_fee: define default value to currency setting 2020-10-27 15:01:47 +01:00
David Mudrák 05679468c5 MDL-69998 lang: Fix reworded strings in Behat test scenarios 2020-10-27 11:20:03 +01:00
Helen Foster 0a64b2ed99 MDL-69998 lang: Import fixed English strings (en_fix) 2020-10-27 11:20:03 +01:00
Andrew Nicols e243810142 Merge branch 'MDL-69166-310-4' of git://github.com/rezaies/moodle into MOODLE_310_STABLE 2020-10-27 16:35:58 +08:00
Bas Brands a5fa563757 MDL-65792 mod_forum: show release time on timed posts 2020-10-27 08:41:28 +01:00
Shamim Rezaie f018e92334 MDL-69166 core: Fix missing lang strings 2020-10-27 18:15:09 +11:00
Andrew Nicols 46e3cfa354 Merge branch 'MDL-69166-310-4' of git://github.com/rezaies/moodle into MOODLE_310_STABLE 2020-10-27 12:59:25 +08:00
Shamim Rezaie 25cf4fa5ca MDL-69166 core_payment: Add privacy implementation 2020-10-27 15:45:25 +11:00
Shamim Rezaie 0fb7847e09 MDL-69166 core_payment: Use promises instead of callbacks 2020-10-27 15:45:25 +11:00
Shamim Rezaie b63f17b5f1 MDL-69166 core_payment: Addressing various integration points
- Add help for 'payment account' field in the enrol instance form
- Remove MOODLE_INTERNALs when not necessary
- Add $userid to deliver_order
- Check if provider classes implement the provider interface
- Rename get_cost to get_payable
- get_payable returns payable object
- Improve registerEventListeners and added init
- Rename payment\provider to payment\service_provider
2020-10-27 15:45:25 +11:00
Shamim Rezaie 52305c9a2e MDL-69166 core_payment: Rename componentid to itemid 2020-10-27 15:45:25 +11:00
Shamim Rezaie 6b3d163a56 MDL-69166 core_payment: Renamed plugintype name from pg to paygw 2020-10-27 15:45:23 +11:00
Marina Glancy efc576fc5c MDL-69166 core_payment: addressing integration review 2020-10-27 15:45:00 +11:00
Marina Glancy 90fbc58de6 MDL-69166 core_payment: rename some functions 2020-10-27 15:45:00 +11:00
Shamim Rezaie 087845bb30 MDL-69166 Replace all upgrade steps with just "create_table" steps 2020-10-27 15:45:00 +11:00
Shamim Rezaie 7d10f35278 MDL-69166 core_payment: Add paymentarea to the payment subsystem 2020-10-27 15:45:00 +11:00
Marina Glancy 9476b48942 MDL-69166 core_payment: archiving accounts, triggering events, tests 2020-10-27 15:45:00 +11:00
Shamim Rezaie 7e11261633 MDL-69166 core_payment: Show cost on the modal when no gateway is chosen 2020-10-27 15:45:00 +11:00
Marina Glancy 15a4e4c87c MDL-69166 core_payment: improvements to api, small fixes 2020-10-27 15:45:00 +11:00
Marina Glancy 895f38cc76 MDL-69166 core_payment: add payment accounts 2020-10-27 15:45:00 +11:00
Shamim Rezaie acd1c82403 MDL-69166 enrol_fee: Show a warning when no currency is supported 2020-10-27 15:44:59 +11:00
Shamim Rezaie c9271eba7c MDL-69166 enrol_fee: Prevent adding instance if no currency is supported 2020-10-27 15:44:59 +11:00
Shamim Rezaie 0cf4bb2afc MDL-69166 pg_paypal: only prevent closing during autorisation 2020-10-27 15:44:59 +11:00
Shamim Rezaie 58a89a46e4 MDL-69166 core-payment: Autoselect gateway when there is only one 2020-10-27 15:44:59 +11:00
Shamim Rezaie 1882bb4792 MDL-69166 core_payment: payment gateways can have a surcharge 2020-10-27 15:44:59 +11:00
Shamim Rezaie bb7d679395 MDL-69166 core_payment: show cost on the modal 2020-10-27 15:44:59 +11:00
Shamim Rezaie 048a652106 MDL-69166 pg_paypal: capture payment directly 2020-10-27 15:44:59 +11:00
Shamim Rezaie 23e24a504e MDL-69166 pg_paypal: New helper to get order details from PayPal 2020-10-27 15:44:59 +11:00
Marina Glancy 761898c876 MDL-69166 core_form: allow modals to prevent closing on accidental click 2020-10-27 15:44:59 +11:00
Shamim Rezaie dc976fba1e MDL-69166 core_payment: ES6-ifying modal_gateways 2020-10-27 15:44:59 +11:00
Shamim Rezaie e2faf67247 MDL-69166 core_payment: Use a custom modal type for gateway selector 2020-10-27 15:44:59 +11:00
Shamim Rezaie b97899634c MDL-69166 pg_paypal: Support multiple currencies on the same page 2020-10-27 15:44:59 +11:00
Shamim Rezaie 2427b92114 MDL-69166 enrol_fee: use template for payment btn & properly format cost 2020-10-27 15:44:59 +11:00
Shamim Rezaie 34770016ee MDL-69166 core_payment: es6-ify 2020-10-27 15:44:59 +11:00
Shamim Rezaie d00c00dd4f MDL-69166 core_payment: add a callback for when payment is done 2020-10-27 15:44:59 +11:00
Shamim Rezaie ed1cc02522 MDL-69166 pg_paypal: Display PayPal buttons in a modal 2020-10-27 15:44:59 +11:00
Shamim Rezaie e1151bf6f5 MDL-69166 pg_paypal: handle paypal checkout callbacks 2020-10-27 15:44:59 +11:00
Shamim Rezaie bbb887f6ae MDL-69166 pg_paypal: Ability to connect to sandbox or live environment 2020-10-27 15:44:59 +11:00
Shamim Rezaie 4403b8f60d MDL-69166 pg_paypal: Process after payment 2020-10-27 15:44:59 +11:00
Shamim Rezaie 3c3b43a58c MDL-69166 core_payment: Save general payment information 2020-10-27 15:44:59 +11:00
Shamim Rezaie 04e2dc7c3b MDL-69166 pg_paypal: paypal helper class to work with API 2020-10-27 15:44:59 +11:00
Shamim Rezaie 05574af1a6 MDL-69166 enrol_fee: Implement callback functions for payment subsystem 2020-10-27 15:44:59 +11:00
Shamim Rezaie 5337ca485c MDL-69166 core_payment: helper methods to get cost and to deliver order
Also create the infrastructure to let components know when they have to
deliver what they sold. We are going to use namespace functions instead
of traditional callbacks.
2020-10-27 15:44:59 +11:00
Shamim Rezaie 3b0034cc91 MDL-69166 enrol_fee: set a description for enrolment 2020-10-27 15:44:59 +11:00
Shamim Rezaie ab6ca27571 MDL-69166 core_payment: send a purchase description to payment gateways
We truncate description to 127 chars as per PayPal requirement
2020-10-27 15:44:59 +11:00
Shamim Rezaie 149e530cc1 MDL-69166 pg_paypal: render PayPal buttons and set up transaction
We truncate brand_name to 127 chars as per PayPal requirement.
2020-10-27 15:44:59 +11:00
Shamim Rezaie 9a7aed4a25 MDL-69166 pg_paypal: WS and AMD to return some settings to be used in js 2020-10-27 15:44:59 +11:00
Shamim Rezaie ed04c3824c MDL-69166 core_payment: post to process payment 2020-10-27 15:44:59 +11:00
Shamim Rezaie 97e8cb0de4 MDL-69166 core_payment: display an image for each gateway 2020-10-27 15:44:59 +11:00
Shamim Rezaie a435c63e16 MDL-69166 core_payment: some basic styling 2020-10-27 15:44:59 +11:00
Shamim Rezaie c2321a263b MDL-69166 core_payment: display the gateways modal 2020-10-27 15:44:58 +11:00
Shamim Rezaie f3d7526419 MDL-69166 core_payment: WS to get list of gateways supporting a currency 2020-10-27 15:44:58 +11:00
Shamim Rezaie d3432a883c MDL-69166 enrol_fee: An enrolment plugin that supports payments 2020-10-27 15:44:58 +11:00
Shamim Rezaie e1cab8e18e MDL-69166 pg_paypal: A new payment gateway is born 2020-10-27 15:44:56 +11:00
Shamim Rezaie bc28c05995 MDL-69166 core: list settings page in the admin tree 2020-10-27 15:05:23 +11:00
Shamim Rezaie 4865d2a0ae MDL-69166 core_payment: basic gateway skeleton 2020-10-27 15:05:23 +11:00
Shamim Rezaie 8317134779 MDL-69166 core: define payment as a subsystem and pg as a plugin type 2020-10-27 15:05:23 +11:00
Michael Hawkins fbac2e9296 MDL-69559 course: Fix course download cap checks when creating courses 2020-10-27 12:01:09 +08:00
Jun Pataleta c978fa26e2 MDL-70004 qtype_multichoice: Set appropriate clear my choice role 2020-10-27 09:57:32 +08:00
Michael Hawkins 599eed0f95 MDL-69559 core: Removed stopPropagation from tree click handling
It was preventing JS click event handlers being reached on some
elements, such as course admin items in Classic
(eg download course content for teachers).
2020-10-27 08:02:20 +08:00
Michael Hawkins 7d52d5def6 MDL-69559 course: Fixed behat navigation in download course content 2020-10-27 08:01:48 +08:00
Paul Holden 8813318d61 MDL-64723 tool_mobile: workaround for invalid certificate parsing.
This is to account for specific server configuration that are affected
by one of the following issues, which results in certificate signature
algorithms being incorrectly parsed:

 * https://bugs.php.net/bug.php?id=77548
 * https://github.com/curl/curl/issues/3706
2020-10-26 23:04:43 +00:00
Sara Arjona 0459910b53 MDL-65959 core_badges: fix unique index in upgrade.php
There was an error when creating the unique index. Apart from that,
the code has been reorganised to copy data in the new structure only
if password field hasn't been removed.
2020-10-26 23:56:46 +01:00
Matt Clarkson adeaafd59d MDL-68722 atto_equation: fix for form elements with special characters
Element id's containing characters such as ':' would break the tab
selector in bootstrap.

This specifically affects the essay question type.
2020-10-27 11:10:58 +13:00
Sara Arjona 0dd7bb8374 Merge branch 'MDL-65959-310' of git://github.com/peterRd/moodle into MOODLE_310_STABLE 2020-10-26 22:44:05 +01:00
Peter Dias bcba1347f8 MDL-65959 badges: Allow cross domain/protocol functionality - obv2 2020-10-26 18:36:26 +08:00
Peter Dias b0e1edd427 MDL-65959 badge: Enable OB2.1 *connection* with cross domain ability 2020-10-26 18:36:26 +08:00
Peter Dias b0007a154c MDL-65959 badge: Reset external_identifiers if backpack details modified 2020-10-26 18:36:26 +08:00
Peter Dias 8c9d3695e3 MDL-65959 badge: Confirm assertion data is updated before awarding 2020-10-26 18:36:26 +08:00
Peter Dias 184944ce6a MDL-65959 badges: Unit and Behat tests 2020-10-26 18:36:26 +08:00
Peter Dias ad9f9e54a3 MDL-65959 badges: Do not use badge user preference after verification 2020-10-26 18:36:26 +08:00
Peter Dias 943b261760 MDL-65959 badges: Update the implementation to use admin set backpack 2020-10-26 18:36:25 +08:00
Peter 8dbc7c6532 MDL-65959 core_badges: Allow ability to upload badges cross domain. 2020-10-26 18:35:36 +08:00
Peter 6f7fe5df9c MDL-65959 core_badges: Unrestricted user's badger account
* Restructure the email to be backpack specific
* Amended table defintion and functions
2020-10-26 18:35:35 +08:00
Eloy Lafuente (stronk7) 7e5f0e1fe6 MDL-70010 core: reconcile MOODLE_310_STABLE and master
There are some unexpected differences between 310 and master,
better reconcile them now. Note this is not 100% critical but,
as far as nothing exclusively for 4.0 has landed to master yet
only branch/version differences should exist.
2020-10-26 11:03:40 +01:00
Eloy Lafuente (stronk7) 11b6df58db Merge branch 'MDL-69993-310' of git://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-10-26 10:42:51 +01:00
Andrew Nicols 36beec930e Merge branch 'MDL-69995-310' of git://github.com/lucaboesch/moodle into MOODLE_310_STABLE 2020-10-26 16:00:38 +08:00
Adrian Greeve 750fe24949 MDL-69559 core_course: Fix to bad behat test formatting. 2020-10-26 13:28:10 +08:00
Adrian Greeve cc718b59d0 Merge branch 'MDL-69559-310-7' of git://github.com/mickhawkins/moodle into MOODLE_310_STABLE 2020-10-26 13:05:33 +08:00
Jun Pataleta 4dcc2d37c6 Merge branch 'MDL-67301-dynreg-squashed-310' of https://github.com/cengage/moodle into MOODLE_310_STABLE 2020-10-26 12:40:23 +08:00
Michael Hawkins d358b91e2b MDL-69559 course: Add course setting and cap to control course downloads 2020-10-26 10:25:37 +08:00
Michael Hawkins c053b93f0c MDL-69559 course: Add course content download UI and execution page 2020-10-26 10:19:39 +08:00
Michael Hawkins cdf91cc236 MDL-69559 course: Add capability and access checks for course download 2020-10-26 10:19:33 +08:00
Michael Hawkins fab34222ca MDL-69559 admin: Add course download admin settings and lang strings 2020-10-26 10:19:27 +08:00
Huong Nguyen ef6f42a825 MDL-69930 qtype_ddimageortext: Duplication items in drag-onto-image question 2020-10-25 20:14:43 +07:00
Luca Bösch a9f5f8094c MDL-69995 backup: padding before activity icons. 2020-10-25 02:07:26 +02:00
Claude Vervoort 10e16c69c8 MDL-67301 mod_lti: dynamic registration 2020-10-24 09:28:32 -04:00
Amaia Anabitarte e66e3740a7 MDL-69716 mod_quiz: No timestamp for in progress attempts 2020-10-23 16:02:25 +02:00
Eloy Lafuente (stronk7) 6594c54b2e on-demand release 3.10dev+ 2020-10-23 14:41:20 +02:00
Paul Holden 6dc336a5d4 MDL-69993 output: correct navigation node type for user reports. 2020-10-23 08:25:40 +01:00
Adrian Greeve 39128991d7 Merge branch 'MDL-67650-forced-checkbox-textarea-MOODLE_310_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_310_STABLE 2020-10-23 09:01:59 +08:00
Víctor Déniz e1990f2f33 Merge branch 'MDL-68664-310' of git://github.com/lameze/moodle into MOODLE_310_STABLE 2020-10-22 12:25:51 +01:00
Sara Arjona 1ce223c7e1 Merge branch 'MDL-69553-m310' of https://github.com/NeillM/moodle into MOODLE_310_STABLE 2020-10-22 08:56:05 +02:00
Brendan Heywood 6694715840 MDL-67650 admin: Consistently show forced config settings 2020-10-22 13:17:49 +11:00
Jake Dallimore 0a43a459ba Merge branch 'MDL-68438_310' of https://github.com/t-schroeder/moodle into MOODLE_310_STABLE 2020-10-22 09:30:48 +08:00
Adrian Greeve 7e0bcbfb19 Merge branch 'MDL-69788-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-10-22 09:07:54 +08:00
Eloy Lafuente (stronk7) eaf89f7754 Merge branch 'MDL-66392-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-10-21 19:45:26 +02:00
Paul Holden 5bbfcc25c0 MDL-66392 analytics: make model output directory default to empty.
Falling back to path within $CFG->dataroot/models.
2020-10-21 18:04:20 +01:00
Sara Arjona 4a495d66b8 Merge branch 'm310_MDL-68536_Notice_Undefined_Property_CFG_branch' of https://github.com/scara/moodle into MOODLE_310_STABLE 2020-10-21 18:32:47 +02:00
Sara Arjona b13ec3c353 Merge branch 'MDL-67673_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2020-10-21 17:38:16 +02:00
Víctor Déniz 5903054142 Merge branch 'MDL-69392-310' of git://github.com/junpataleta/moodle into MOODLE_310_STABLE 2020-10-21 16:26:44 +01:00
Víctor Déniz 2dd9b53fd6 Merge branch 'MDL-69513-dkim-settings-MOODLE_310_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_310_STABLE 2020-10-21 11:56:54 +01:00
Eloy Lafuente (stronk7) 7f20e2071c MDL-67673 phpunit: Document all the changes in upgrade.txt
This includes:

- Breaking changes (return void + PHP 7.1 min requirement).
- Deprecations and removals.
- Specifically DbUnit and its replacement.
- Printer showing how to rerun tests removed.
2020-10-21 12:46:05 +02:00
Eloy Lafuente (stronk7) 0ab106f41c MDL-67673 phpunit: Remove the rerun hint on failed test cases
That custom printer was using some hacks to be able to intercept
configuration switches, reflection and other tricks to be able to
print the:

To re-run:
 vendor/bin/phpunit --verbose "core_setuplib_testcase" lib/tests/setuplib_test.php

line on every failed/exceptional/skipped test. After some internal
discussion it was agreed that the normal phpunit output:

1) core_setuplib_testcase::test_localcachedir
Time is lower that allowed start value
Failed asserting that 1601976686 is equal to 1601976687 or is greater than 1601976687.

/var/www/html/lib/phpunit/classes/advanced_testcase.php:446
/var/www/html/lib/tests/setuplib_test.php:170
/var/www/html/lib/phpunit/classes/advanced_testcase.php:80

has already all the information at hand about how to rerun a test:

- vendor/bin/phpunit lib/tests/setuplib_test.php
- vendor/bin/phpunit --filter core_setuplib_testcase::test_localcachedir
- vendor/bin/phpunit --filter ::test_localcachedir
- vendor/bin/phpunit --testsuite componentname_testsuite
- vendor/bin/phpunit --config <<compoenent directory>>
- use --cache-result to get failed tests rerun with ease.
- ...

So better, let's use standard phpunit output and done. Also, note that,
with the upgrade to phpunit 8.5, the printer was not working correctly
any more, causing some switches, like --verbose ... to be ignored. Sure
it could have been fixed but, as commented above, no real need for all
that "parapheranlia" to print the rerun information.
2020-10-21 12:46:05 +02:00
Eloy Lafuente (stronk7) 9f82c9aece MDL-67673 phpunit: deprecate old phpunit/dbunit stuff
Apply the standard deprecation procedure to the old APIs, to
be removed in Moodle 4.2 (MDL-69882). Existing unit tests
cover the deprecation debugging.

Originally MDL-64600
2020-10-21 12:46:05 +02:00
Eloy Lafuente (stronk7) 1f13dff1a7 MDL-67673 phpunit: Move tests to use new phpunit_dataset
- Make advanced_testcase old methods to use new ones internally.
- Fix advanced_testcase, statslib, mod/quiz and mod/data tests.

Originally MDL-64600
2020-10-21 12:46:05 +02:00
Eloy Lafuente (stronk7) be396eddf0 MDL-67673 phpunit: Introduce a new, lightweight phpunit_dataset
In charge of taking over the, now removed/archived, phpunit/dbunit
package. It supports loading of CSV/XML files and strings and
PHP arrays, allowing to send the loaded information to database.

Perform some basic controls about the consistency of information,
surely not super-exhaustive but fair enough.

100% covered with unit test.

Planned like an "interim" replacement for phpunit/dbunit uses in
core that, ideally, should be moved to generators stuff at some
point.

Note, expect a few tests in core to fail with this commit, I've
changed some fixtures around. Next commit will fix existing uses.

Originally MDL-64600
2020-10-21 12:46:05 +02:00
Eloy Lafuente (stronk7) 4af4d709a4 MDL-67673 phpunit: Disable phpunit results cache by default
It can be enabled if desired from CLI using the --cache-result
option (or modifying the phpunit.xml cacheResult to true).

That will create the .phpunit.result.cache files that,
later, can be used to easily repeat failed (defects) tests or
run the slow ones first and more. See the --order-by option
to know more about all the available criteria. For example:

./vendor/bin/phpunit --order-by=defects --stop-on-defect

(will run all the failed ones first, stopping on problem, useful
for TDD and other scenarios, not so much for complete runs or CI).

Also, added to .gitignore so they won't be committed ever.
2020-10-21 12:46:05 +02:00
Eloy Lafuente (stronk7) 46606b3ddd MDL-67673 phpunit: Remove deprecated assertEquals() params
The optional parameters of assertEquals() and assertNotEquals()
are deprecated in PHPUnit 8 (to be removed in PHPUnit 9):

- delta => use assertEqualsWithDelta()
- canonicalize => use assertEqualsCanonicalizing()
- ignoreCase => use assertEqualsIgnoringCase
- maxDepth => removed without replacement.

More info @ https://github.com/sebastianbergmann/phpunit/issues/3341

Initial search done with:

ag 'assert(Not)?Equals\(.*,.*,' --php

Then, running tests and fixing remaining cases.
2020-10-21 12:46:05 +02:00
Eloy Lafuente (stronk7) 35bc26b516 MDL-67673 phpunit: Remove deprecated assertContains() uses on strings
Both assertContains() and assertNotContains() are deprecated in PHPUnit 8
for operations on strings. Also the optional case parameter is. All uses
must be changed to one of:

- assertStringContainsString()
- assertStringContainsStringIgnoringCase()
- assertStringNotContainsString()
- assertStringNotContainsStringIgnoringCase()

More info: https://github.com/sebastianbergmann/phpunit/issues/3422

Regexp to find all uses:

ag 'assert(Not)?Contains\('
2020-10-21 12:46:05 +02:00
Eloy Lafuente (stronk7) 106c64ac24 MDL-67673 phpunit: Remove deprecated non-public attribute assertions
With PHPUnit 8 a good number of assertions, all them related with
operations on non-public attributes have been deprecated. And will
be removed with PHPUnit 9.

The main point is that unit tests shouldn't be testing non-public
APIs (good practice) and those assertions were an error originally.

See https://github.com/sebastianbergmann/phpunit/issues/3338 for
the complete list and other details.

When possible (the attributes being checked are public), the change
is simple, just switching to normal assertions.

When the attributes are not public we need to find a workaround
to be able to test the same using public APIs, or use Reflection,
or remove the tests.

For the records, this is the regexp used to find all the cases:

ag '>(assertAttribute|attribute\(|readAttributte|getStaticAttribute| \
    getObjectAttribute)' -G "test.php"
2020-10-21 12:46:05 +02:00
Eloy Lafuente (stronk7) ddf72dd60d MDL-67673 phpunit: Remove expectedException annotations
While this is not strictly required, because removal will
happen in PHPUnit 9.0, we are already getting rid of all
uses in core.

From release notes:https://phpunit.de/announcements/phpunit-8.html

The annotations `@expectedException`, `@expectedExceptionCode`,
`@expectedExceptionMessage`, and `@expectedExceptionMessageRegExp`
are now deprecated.
Using these annotations will trigger a deprecation warning
in PHPUnit 8 and in PHPUnit 9 these annotations will be removed.

Also, all uses of expectExceptionMessageRegExp() has been moved
to expectExceptionMessageMatches(). See https://github.com/sebastianbergmann/phpunit/issues/3957

TODO: Various weirdness found while doing the changes with these tests:
- vendor/bin/phpunit lib/tests/exporter_test.php (created MDL-69700)
- vendor/bin/phpunit competency/tests/external_test.php (same issue than prev one)
- vendor/bin/phpunit question/engine/tests/questionengine_test.php (created MDL-69624)
- vendor/bin/phpunit lib/tests/event_test.php (created MDL-69688)
2020-10-21 12:46:05 +02:00
Eloy Lafuente (stronk7) 0ae27225f5 MDL-67673 phpunit: Remove deprecated assertArraySubset()
While this is not strictly required, because removal will
happen in PHPUnit 9.0, we are already getting rid of all
uses in core.

From release notes:https://phpunit.de/announcements/phpunit-8.html

assertArraySubset() is deprecated and will be removed in PHPUnit 9.
2020-10-21 12:46:05 +02:00
Eloy Lafuente (stronk7) a6674bf8a4 MDL-67673 phpunit: Remove deprecated assertInternalType()
While this is not strictly required, because removal will
happen in PHPUnit 9.0, we are already getting rid of all
uses in core.

From release notes:https://phpunit.de/announcements/phpunit-8.html

assertInternalType() is deprecated and will be removed in
PHPUnit 9. Refactor your test to use assertIsArray(), assertIsBool(),
assertIsFloat(), assertIsInt(), assertIsNumeric(), assertIsObject(),
assertIsResource(), assertIsString(), assertIsScalar(),
assertIsCallable(), or assertIsIterable() instead.
2020-10-21 12:46:05 +02:00
Eloy Lafuente (stronk7) dc87fd4b3f MDL-67673 phpunit: phpunit_constraint_object_is_equal_with_exceptions
Constraints are now declared final, so we cannot extend them anymore.

Hence, instead of extending PHPUnit\Framework\Constraint\IsEqual we
are just wrapping it into our constraint.
2020-10-21 12:46:04 +02:00
Eloy Lafuente (stronk7) d81a94807b MDL-67673 phpunit: Fix the return type of template methods
All the setup/teardown/pre/post/conditions template methods
now are required to return void. This was warned with phpunit 7
and now is enforced.

At the same time, fix a few wrong function names,
provider data and param types, return statements...
2020-10-21 12:46:04 +02:00
Eloy Lafuente (stronk7) c611109ed7 MDL-67673 phpunit: Bump to PHPUnit 8.5 and remove DBunit
This makes everything to break, but it's what we'll be fixing
in the next commits, heh. :-)

Generated with php72 (min version supported), following the
instructions @ https://docs.moodle.org/dev/Composer
2020-10-21 12:46:04 +02:00
Paul Holden 74ef7dc5b1 MDL-69788 admin: validate language menu configuration. 2020-10-21 11:24:22 +01:00
Jun Pataleta 8996ed98c7 Merge branch 'MDL-37226-310' of git://github.com/lucaboesch/moodle into MOODLE_310_STABLE 2020-10-21 17:46:48 +08:00
Tim Schroeder 3fcba4be5e MDL-68438 message: fixed email format change with messaging disabled 2020-10-21 11:29:15 +02:00
Neill Magill 55d463b9f2 MDL-69553 output: Handle pre-loading multiline string defines
Before this patch strings that were declared over multiple lines in
a template would not be parsed correctly.

{{#str}}value,
mod_forum{{/str}}

would have been been parsed to get_string('value', 'core')

{{#str}}
value, mod_forum
{{/str}}

would have been been parsed to get_string('', 'core')
2020-10-21 10:06:26 +01:00
Neill Magill bbb58b10ad MDL-69553 output: Unit tests for loading multiline string defines 2020-10-21 10:06:25 +01:00
Jun Pataleta f266c852c3 Merge branch 'MDL-69945-310' of git://github.com/lucaboesch/moodle into MOODLE_310_STABLE 2020-10-21 16:03:14 +08:00
Jun Pataleta b14daeaa9a MDL-69392 mod_forum: Colour contrast check for locked discussions 2020-10-21 14:54:25 +08:00
Jun Pataleta 8e083da3d5 MDL-69392 block_myoverview: Basic contrast check for the dashboard 2020-10-21 14:54:25 +08:00
Jun Pataleta 8312eeacb0 MDL-69392 question: Fix Try again button styling 2020-10-21 14:54:24 +08:00
Jun Pataleta 0ce40927cf MDL-69392 theme_boost: Improve question colour contrast
* Lighten info container.
* Fix colour contrast for the question container by
  - Lightening the background a bit
  - Darkening the text colour a bit
  - Making sure the link colour has good colour contrast against the
  question text.
* Fix colour contrast for the comments container by
  - Lightening the text colour a bit
  - Darkening the link colour a bit for better colour contrast against
  the feedback text.
2020-10-21 14:54:05 +08:00
Jun Pataleta 0cdfaccd4e MDL-69392 theme_classic: Darken red, blue and green colours
The current red, blue, and green colours achieve the minimum colour
contrast against a white background. However, when they're against
coloured background, text with these colours will easily fail the
4.5:1 contrast ratio requirement for Level AA.
The updated colours now have the following contrast ratio against a
white background:
* Blue  - #0f6fc5 (5.12:1, from 4.58:1)
* Green - #357a32 (5.27:1, from 4.63:1)
* Red   - #ca3120 (5.29:1, from 4.59:1)
2020-10-21 14:54:03 +08:00
Jun Pataleta d386d21360 MDL-69392 theme_boost: Darken red, blue and green colours
The current red, blue, and green colours achieve the minimum colour
contrast against a white background. However, when they're against
coloured background, text with these colours will easily fail the
4.5:1 contrast ratio requirement for Level AA.
The updated colours now have the following contrast ratio against a
white background:
* Blue  - #0f6fc5 (5.12:1, from 4.58:1)
* Green - #357a32 (5.27:1, from 4.63:1)
* Red   - #ca3120 (5.29:1, from 4.59:1)
2020-10-21 14:53:44 +08:00
Adrian Greeve 5429ece3f8 Merge branch 'MDL-69807-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-10-21 14:18:02 +08:00
Adrian Greeve 32f99bc4d1 Merge branch 'MDL-68766-M310' of https://github.com/michael-milette/moodle into MOODLE_310_STABLE 2020-10-21 12:54:02 +08:00
Jake Dallimore df0df3110d Merge branch 'MDL-68983-recent-session-lock-ro-MOODLE_310_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_310_STABLE 2020-10-21 12:45:55 +08:00
Jake Dallimore 2ced8c6674 Merge branch 'MDL-69902-310' of https://github.com/marinaglancy/moodle into MOODLE_310_STABLE 2020-10-21 10:57:35 +08:00
Jake Dallimore 17056bf206 Merge branch 'MDL-69751-310' of git://github.com/mihailges/moodle into MOODLE_310_STABLE 2020-10-21 10:02:47 +08:00
Eloy Lafuente (stronk7) 27b09acf75 on-demand release 3.10dev+ 2020-10-21 00:51:10 +02:00
Luca Bösch d159c32b84 MDL-65448 block_site_main_menu: Restyle moving. 2020-10-20 17:26:14 +02:00
Jake Dallimore 221f0e16d0 Merge branch 'MDL-67695-MOODLE_310_STABLE_get_lti_proxies' of https://github.com/andrewmadden/moodle into MOODLE_310_STABLE 2020-10-20 11:08:46 +08:00
Adrian Greeve 55189def65 Merge branch 'MOODLE_310_STABLE-MDL-68284' of https://github.com/yao9394/moodle into MOODLE_310_STABLE 2020-10-20 08:49:06 +08:00
Mihail Geshoski 086a2adc35 MDL-69751 core: Restore deleted guest user and add missing context
This upgrade step fixes the cases where the current guest user is
labelled as 'deleted' and the related user context is missing.
2020-10-20 08:41:35 +08:00
Mihail Geshoski 3c315a874a MDL-69751 course: Handle missing guest user context
Makes sure the guest user context exists when fetching
the recommended modules. If the context does not exist
an exception is being thrown describing the problem.
2020-10-20 08:39:17 +08:00
Simey Lameze b4a8a99898 MDL-68664 theme: remove right margin from form-inline class 2020-10-20 08:32:45 +08:00
Katie Ransom 08e8205d6f MDL-69962 tool_usertours: Fix increase in included files 2020-10-20 01:29:47 +01:00
Andrew Nicols 0a54a501eb Merge branch 'MDL-69687-m310' of https://github.com/sammarshallou/moodle into MOODLE_310_STABLE 2020-10-20 08:02:22 +08:00
Jenkins Automation 213ea00afe MDL-69726 calendar: fix raw event fetcher under postgres
Without this, there's a code path that under the right circumstances is hit and
results in a query with `FROM (mdl_event) ev` in it - which is not valid syntax
under postgres.
2020-10-20 07:46:00 +08:00
Paul Holden 9428e33d55 MDL-69807 blocks: remove redundant sesskey loading edit/delete page. 2020-10-19 22:40:45 +01:00
Eloy Lafuente (stronk7) 31a98b3fb2 Merge branch 'MDL-69906-310-searchsimpledb' of git://github.com/mudrd8mz/moodle into MOODLE_310_STABLE 2020-10-19 22:56:31 +02:00
Eloy Lafuente (stronk7) ae6da7d6a0 Merge branch 'MDL-57756-text-customparams-310' of https://github.com/cengage/moodle into MOODLE_310_STABLE 2020-10-19 22:32:02 +02:00
Andrew Madden 4d5bc273ce MDL-67695 mod_lti: Use correct return structure for get_tool_proxies.
* Deprecated serialise_tool_proxy() as no longer used.
* Use tool_proxy_return_structure for each proxy.
* Added tests for getting all proxies and orphaned proxies.
2020-10-20 04:09:44 +11:00
Sara Arjona 33c7881448 Merge branch 'MDL-69897-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-10-19 18:14:54 +02:00
Sara Arjona b7146b655a Merge branch 'MDL-69900-310' of git://github.com/mihailges/moodle into MOODLE_310_STABLE 2020-10-19 13:41:59 +02:00
sam marshall 178d5a0e23 MDL-69687 Course: remove_course_contents orphaned completion data
The remove_course_contents function did not delete data from
course_module_completion table in most cases, resulting in large
quantities of orphaned data.
2020-10-19 10:24:44 +01:00
Sara Arjona f576390bd2 Merge branch 'MOODLE_310_MDL-69791' of https://github.com/golenkovm/moodle into MOODLE_310_STABLE 2020-10-19 10:07:21 +02:00
Andrew Nicols 7ed7afad98 Merge branch 'MDL-65448-310' of git://github.com/lucaboesch/moodle into MOODLE_310_STABLE 2020-10-19 15:54:36 +08:00
Luca Bösch a7e12a77b1 MDL-65448 block_social_activities: Restyle moving. 2020-10-19 09:50:20 +02:00
Luca Bösch 09e02634d4 MDL-65448 core_course: Restyle non-JS activity moving. 2020-10-19 09:50:20 +02:00
Luca Bösch be019636d1 MDL-65448 gradebook: Remove erraneous dev .movehere class left over. 2020-10-19 09:50:19 +02:00
Luca Bösch 7789be4030 MDL-65448 core_course: Restyle non-JS activity moving. 2020-10-19 09:50:19 +02:00
Luca Bösch 91c9ca0f49 MDL-65448 block_site_main_menu: Restyle moving. 2020-10-19 09:50:18 +02:00
Luca Bösch 7c0923a3e4 MDL-65448 block_social_activities: Restyle moving. 2020-10-19 09:50:18 +02:00
Luca Bösch 83cba7b9b0 MDL-65448 gradebook: Restyle moving. 2020-10-19 09:50:18 +02:00
Sara Arjona cb4418bc5b Merge branch 'MDL-69736-310' of git://github.com/ferranrecio/moodle into MOODLE_310_STABLE 2020-10-19 09:03:51 +02:00
Brendan Heywood 4db3403481 MDL-69513 email: Add support for email DKIM signatures 2020-10-19 16:20:42 +11:00
Andrew Nicols 9296086653 Merge branch 'MDL-69687-m310' of https://github.com/sammarshallou/moodle into MOODLE_310_STABLE 2020-10-19 13:19:28 +08:00
Andrew Nicols 38d4a1b75f Merge branch 'MDL-65448-310' of git://github.com/lucaboesch/moodle into MOODLE_310_STABLE 2020-10-19 10:07:45 +08:00
Michael Milette 1b4ef7cd88 MDL-68766 auth: Login form: 'Log in using...' should be h3, not h6 2020-10-17 03:59:35 -04:00
sam marshall 3576eb4835 MDL-69687 Course: Improve removal of completion data on MySQL 2020-10-16 18:22:51 +01:00
sam marshall 39eb58c754 MDL-69687 DB: Add API for deleting data based on subquery
The new API works on normal databases (by deleting data based on the
subquery) and also on MySQL (by deleting the data using a weird join
on the subquery).
2020-10-16 18:22:51 +01:00
Luca Bösch c6731f8045 MDL-37226 assign: align select all header checkbox 2020-10-16 16:08:58 +02:00
Paul Holden 252f95e1b7 MDL-69788 lang: fallback to all translations if misconfigured.
If given translation list contains only invalid entries, fallback
to returning the complete list of available language translations.
2020-10-16 14:38:03 +01:00
Luca Bösch c24c9e174b MDL-65448 block_site_main_menu: Restyle moving. 2020-10-16 14:50:11 +02:00
Luca Bösch 199333208d MDL-65448 block_social_activities: Restyle moving. 2020-10-16 14:50:10 +02:00
Luca Bösch 91557080d7 MDL-65448 core_course: Restyle non-JS activity moving. 2020-10-16 14:50:10 +02:00
Luca Bösch 3370b20e3c MDL-65448 gradebook: Restyle moving. 2020-10-16 14:50:10 +02:00
Luca Bösch 2c98bfc4f4 MDL-69945 core_calendar: let circles appear as circles 2020-10-16 14:22:47 +02:00
Sara Arjona 36f0c3d531 on-demand release 3.10dev+ 2020-10-16 13:18:54 +02:00
Sagar Ghimire 1ebbd18b82 MDL-68284 gradebook: Prevent exposing hidden quiz grade item 2020-10-16 15:06:34 +11:00
Jake Dallimore 04a02b5bd9 Merge branch 'MOODLE_310_MDL-47178' of https://github.com/golenkovm/moodle into MOODLE_310_STABLE 2020-10-16 11:52:29 +08:00
Jun Pataleta 506df9bdbd Merge branch 'MDL-69266-310' of https://github.com/HuongNV13/moodle into MOODLE_310_STABLE 2020-10-16 10:09:40 +08:00
Huong Nguyen 873b4847f5 MDL-69266 qtype_ddwtos: 'unlimited' options fail in 3.9 2020-10-15 20:05:52 +07:00
Adrian Greeve a2aa548af7 Merge branch 'MDL-69549-310-7' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-10-15 15:11:29 +08:00
Jun Pataleta d0c89df9ee Merge branch 'MDL-69583-310' of git://github.com/ferranrecio/moodle into MOODLE_310_STABLE 2020-10-15 13:56:58 +08:00
Jun Pataleta 30eccfabaa Merge branch 'MDL-69520-310' of git://github.com/sarjona/moodle into MOODLE_310_STABLE 2020-10-15 13:53:36 +08:00
Simey Lameze 63e2c543ae MDL-69549 mod_resource: content export implementation 2020-10-15 13:46:25 +08:00
Andrew Nicols a69b38d604 MDL-69549 mod_page: Content export implementation 2020-10-15 13:46:25 +08:00
Andrew Nicols 0ea391d1eb MDL-69549 mod_folder: Content export implementation 2020-10-15 13:46:25 +08:00
Andrew Nicols 17d4bc49f6 MDL-69549 core: Add context export API 2020-10-15 13:46:25 +08:00
Katie Ransom 57a13a5971 MDL-69739 tool_usertours: Add tour-level CSS selector 2020-10-15 13:35:32 +08:00
Eloy Lafuente (stronk7) 12fce2a4bd Merge branch 'MDL-69813-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-10-14 22:47:12 +02:00
Eloy Lafuente (stronk7) b68dd3a121 Merge branch 'MDL-63805-310' of git://github.com/jleyva/moodle into MOODLE_310_STABLE 2020-10-14 21:22:08 +02:00
Eloy Lafuente (stronk7) eb4c7963c0 MDL-68070 messaging: Ensure that error is shown on first messages
Before there is a conversation, messages between users are sent
using core_message_send_instant_messages instead of
core_message_send_messages_to_conversation.

That method had an undefined $errormessage variable, ultimately
causing the problem detected on message_post_message()/message_send()
to never been returned by the external.

This just adds the same error than already existing conversations do,
but returning it as warning, for BC, JS will show it.
2020-10-14 18:57:29 +02:00
Sara Arjona dde0818f6c MDL-69520 core_h5p: unit tests for covering example and tutorial 2020-10-14 18:35:52 +02:00
Sara Arjona ad28920d0b MDL-69520 core_h5p: add example and tutorial links 2020-10-14 18:35:50 +02:00
Eloy Lafuente (stronk7) a5cde22a26 MDL-68070 messaging: Amend lang string to be clearer for any user.
Credit goes to Helen Foster for the improvement, thanks!
2020-10-14 16:54:26 +02:00
Víctor Déniz 44719d2ad9 Merge branch 'MDL-68900-m310' of https://github.com/sumitnegi933/moodle into MOODLE_310_STABLE 2020-10-14 12:22:22 +01:00
Juan Leyva 784c09c834 MDL-63805 glossary: New WS mod_glossary_prepare_entry_for_edition 2020-10-14 12:57:33 +02:00
Juan Leyva 004be78003 MDL-63805 glossary: New WS mod_glossary_update_entry 2020-10-14 12:56:52 +02:00
Juan Leyva 7fae5f61ef MDL-63805 glossary: Glossary API refactor 2020-10-14 12:56:43 +02:00
Ferran Recio d7cadcc244 MDL-69583 tool_customlang: add CLI import 2020-10-14 11:59:33 +02:00
Jake Dallimore 2cb45addb1 Merge branch 'MOODLE_310_MDL-69848' of https://github.com/golenkovm/moodle into MOODLE_310_STABLE 2020-10-14 09:42:43 +08:00
Víctor Déniz 5ea92799c4 Merge branch 'MDL-69779-better-x-redirect-by-MOODLE_310_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_310_STABLE 2020-10-13 23:41:59 +01:00
Víctor Déniz 55c9482171 Merge branch 'MDL-68440-310' of https://github.com/Peterburnett/moodle into MOODLE_310_STABLE 2020-10-13 23:15:48 +01:00
Simon Mok 1a7928173b MDL-68070 messaging: Fix error when personal notification is disabled 2020-10-13 23:40:46 +02:00
Eloy Lafuente (stronk7) c3299761f7 Merge branch 'MDL-63806-310' of git://github.com/jleyva/moodle into MOODLE_310_STABLE 2020-10-13 22:26:35 +02:00
Sara Arjona 9aeb59af73 on-demand release 3.10dev+ 2020-10-13 13:25:30 +02:00
Ferran Recio 3759daa952 MDL-69583 tool_customlang: add customization import 2020-10-13 12:33:13 +02:00
Brendan Heywood 15044cea7f MDL-68983 cache: Fix bug with readonly session combined with lock debug 2020-10-13 14:53:26 +11:00
Andrew Nicols 1170a8b694 Merge branch 'MDL-66928-request-dir-purge-bug-MOODLE_310_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_310_STABLE 2020-10-13 11:49:10 +08:00
Brendan Heywood 69959c371f MDL-66928 core: Move request dirs to system tmp instead of localcache 2020-10-13 14:29:30 +11:00
Andrew Nicols ec46b18e13 Merge branch 'MDL-67654-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-10-13 07:58:20 +08:00
Paul Holden f1acce7bef MDL-67654 mod_forum: formchangechecker for discussion inline replies. 2020-10-12 23:32:44 +01:00
Paul Holden 9597baa6e8 MDL-69809 mod_folder: include forcedownload setting in WS responses. 2020-10-12 12:28:26 +01:00
Adrian Greeve 1c6e578db4 Merge branch 'MOODLE_310_MDL-69818' of https://github.com/golenkovm/moodle into MOODLE_310_STABLE 2020-10-12 14:48:48 +08:00
Jake Dallimore a7ea95030c Merge branch 'MDL-68292-admin-sesskey-MOODLE_310_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_310_STABLE 2020-10-12 14:37:07 +08:00
Brendan Heywood 3f04dbee09 MDL-68292 core: Remove sesskey leakage on module pages 2020-10-12 17:11:59 +11:00
Adrian Greeve 6a91117d4a Merge branch 'MDL-65743-310' of git://github.com/lameze/moodle into MOODLE_310_STABLE 2020-10-12 13:41:44 +08:00
Simey Lameze cfe9f53e91 MDL-65743 lib: update moodle library docs 2020-10-12 13:10:12 +08:00
Simey Lameze decd480c42 MDL-65743 lib: add XMPPHP namespace and update calls 2020-10-12 13:10:12 +08:00
Simey Lameze d947f53d4c MDL-65743 lib: upgrade XMPPHP library to v2.2 2020-10-12 13:10:12 +08:00
Andrew Nicols 00877bf283 Merge branch 'MDL-69776-310' of git://github.com/jleyva/moodle into MOODLE_310_STABLE 2020-10-12 12:33:51 +08:00
Adrian Greeve 6f86e933ed Merge branch 'MDL-69649-310' of git://github.com/rezaies/moodle into MOODLE_310_STABLE 2020-10-12 10:15:41 +08:00
Jake Dallimore 6d7b36da59 Merge branch 'MDL-69910-calendar-protectusername-MOODLE_310_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_310_STABLE 2020-10-12 10:05:43 +08:00
Jake Dallimore 7924191691 Merge branch 'MDL-69707-redis-avoid-write-MOODLE_310_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_310_STABLE 2020-10-12 09:57:46 +08:00
Peter Burnett 0628d11380 MDL-68440 cache: Added counting of default mappings 2020-10-12 11:57:17 +10:00
Jake Dallimore 151a63b4cc Merge branch 'MDL-68406-310' of git://github.com/jleyva/moodle into MOODLE_310_STABLE 2020-10-12 09:51:51 +08:00
Adrian Greeve 4ebfbfe88c Merge branch 'MDL-69825-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-10-12 08:09:47 +08:00
Brendan Heywood 93a60507fc MDL-69779 core: Improved the X-Redirect-By header when debugging is on 2020-10-11 09:50:21 +11:00
Brendan Heywood 0a8371c690 MDL-69910 calendar: Fix export exception when both params are sent 2020-10-10 19:28:45 +11:00
Paul Holden 604f19afd6 MDL-69825 admin: externalpage class using a callback for access check.
Co-Authored-By: Marina Glancy <marina@moodle.com>
2020-10-09 15:09:05 +01:00
David Mudrák bda1473afa MDL-69906 admin: Display Setup search engine as link only if it is valid
We use auto-generated admin section name here so we need to check that
the target section actually exists.
2020-10-09 14:16:29 +02:00
Sara Arjona d70cfda576 on-demand release 3.10dev+ 2020-10-09 11:12:48 +02:00
Juan Leyva 3dc820a057 MDL-68406 tool_mobile: Allow users to log-out from the app
In this commit, we also reorganised how the Mobile box is displayed in the user profile.
We are allowing now site admins to see the user last access time.
2020-10-09 09:59:43 +02:00
Juan Leyva 4b64516b0e MDL-63806 glossary: New WS mod_glossary_delete_entry 2020-10-09 09:50:38 +02:00
Juan Leyva e8496407e9 MDL-63806 glossary: Return user permissions for entries in WS 2020-10-09 09:49:59 +02:00
Juan Leyva 0ab3fd7958 MDL-63806 glossary: Move delete code to API function 2020-10-09 09:49:59 +02:00
Marina Glancy d103bdba3d MDL-69902 core_search: fix error in the custom fields indexing 2020-10-09 08:52:47 +02:00
Adrian Greeve cf1d32e9c5 Merge branch 'MDL-68384-fix-spec-violations-310' of https://github.com/cengage/moodle into MOODLE_310_STABLE 2020-10-09 12:05:34 +08:00
Jun Pataleta b5fe033b18 Merge branch 'MDL-69740_310' of https://github.com/timhunt/moodle into MOODLE_310_STABLE 2020-10-09 11:56:44 +08:00
Jun Pataleta 05a3e35677 Merge branch 'MDL-69257-310' of git://github.com/mihailges/moodle into MOODLE_310_STABLE 2020-10-09 11:12:16 +08:00
Mihail Geshoski 03058394f2 MDL-69257 core_h5p: Move $maxsize outside the foreach loop
There is no reason to repeatedly obtain the maximum size for uploading
files as a part of foreach loop.
2020-10-09 10:36:01 +08:00
Martin Gauk 1a80427018 MDL-69257 H5P: Check size of uploaded files and virus scan 2020-10-09 10:36:01 +08:00
Stephen Bourget a2b727d7bc MDL-69900 core_backup: Allow IMSCC v1.0 restore to finish 2020-10-09 09:06:26 +08:00
Eloy Lafuente (stronk7) b2a382016f Merge branch 'MDL-69582-310' of git://github.com/ferranrecio/moodle into MOODLE_310_STABLE 2020-10-08 22:44:29 +02:00
Paul Holden 31efbf2e0e MDL-69897 repository: add heading to delete file modal. 2020-10-08 20:29:48 +01:00
Thomas Wedekind 3540343ceb MDL-69582 tool_customlang: export cli script 2020-10-08 19:30:26 +02:00
Thomas Wedekind 78076a621f MDL-69582 tool_customlang: add export langstring feature 2020-10-08 19:30:26 +02:00
Eloy Lafuente (stronk7) ca80e9a68d Merge branch 'MDL-69810-310' of git://github.com/jleyva/moodle into MOODLE_310_STABLE 2020-10-08 16:58:34 +02:00
Eloy Lafuente (stronk7) 9b9b38f44e Merge branch 'MDL-69712-310' of git://github.com/aanabit/moodle into MOODLE_310_STABLE 2020-10-08 16:25:35 +02:00
Sara Arjona 8e5b007c3e Merge branch 'MDL-64657-310' of git://github.com/jleyva/moodle into MOODLE_310_STABLE 2020-10-08 14:15:38 +02:00
Sara Arjona d487ee2240 Merge branch 'MDL-69146_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2020-10-08 12:43:29 +02:00
Sumit Negi 300e4aef4c MDL-68900 mod_forum: permission check for user who is viewing timed post
Pass current user object to post builder as argument, so that the permission to view timed post
will check with current user, who is viewing the posts instead of user who made that post.
2020-10-08 12:46:17 +05:30
Adrian Greeve eefa5c928f Merge branch 'MDL-69805-310' of https://github.com/dravek/moodle into MOODLE_310_STABLE 2020-10-08 15:00:29 +08:00
Adrian Greeve 407dcd4922 Merge branch 'MDL-69798_310' of https://github.com/timhunt/moodle into MOODLE_310_STABLE 2020-10-08 13:34:30 +08:00
Jake Dallimore 8d9a36fb8a Merge branch 'MDL-69192-310-behat' of https://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-10-08 09:22:40 +08:00
Andrew Nicols b2d43a7db1 MDL-68665 assignfeedback_editpdf: Coding style fixes 2020-10-08 08:24:07 +08:00
Andrew Nicols 876a5c143b Merge branch 'MDL-68665-310-assign-stamp-cache' of https://github.com/jamie-catalyst/moodle into MOODLE_310_STABLE 2020-10-08 08:23:36 +08:00
Andrew Nicols c562848596 MDL-69192 mod_assign: Stop clicking OK on non-existent modal 2020-10-08 08:04:43 +08:00
Eloy Lafuente (stronk7) 74efdb135d Merge branch 'MDL-69760-MOODLE_310_STABLE' of https://github.com/inkjet2000/moodle into MOODLE_310_STABLE 2020-10-08 00:25:14 +02:00
Víctor Déniz 46d1546c6e Merge branch 'MDL-69759-m310' of https://github.com/sammarshallou/moodle into MOODLE_310_STABLE 2020-10-07 22:24:58 +01:00
Jamie Stamp c2ba78902c MDL-68665 assignfeedback_editpdf: Fix systemsstamp URLs 2020-10-07 16:23:18 +01:00
Jamie Stamp 12fb5964f2 MDL-68665 assignfeedback_editpdf: Add filearea to persist stamps 2020-10-07 16:21:18 +01:00
Justin Merrill 52a84caaaa MDL-69760 core: add mdl_event index for assign adhoc tasks 2020-10-07 09:18:24 -04:00
Sara Arjona 524f6a656b Merge branch 'MDL-65451-310' of https://github.com/marinaglancy/moodle into MOODLE_310_STABLE 2020-10-07 09:39:58 +02:00
Andrew Nicols 86e69ea7b2 Merge branch 'MDL-69192-310' of https://github.com/willob99/moodle into MOODLE_310_STABLE 2020-10-07 13:18:41 +08:00
Andrew Nicols 12820e3a56 Merge branch 'MDL-67275-310-post_noun_verb' of git://github.com/mudrd8mz/moodle into MOODLE_310_STABLE 2020-10-07 12:38:02 +08:00
Victor Deniz Falcon 36905f42b8 MDL-52407 travis: use Travis default notifications(email) 2020-10-07 10:45:54 +08:00
Adrian Greeve fd532533dd Merge branch 'MDL-59510-310' of https://github.com/snake/moodle into MOODLE_310_STABLE 2020-10-07 09:58:52 +08:00
Víctor Déniz d6806beb3e Merge branch 'MDL-62678-core-fetch-notifications-MOODLE_310_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_310_STABLE 2020-10-06 22:58:45 +01:00
Eloy Lafuente (stronk7) 9ab387d707 Merge branch 'MDL-69746-MOODLE_310_STABLE' of https://github.com/tuanngocnguyen/moodle into MOODLE_310_STABLE 2020-10-06 23:53:22 +02:00
Marina Glancy 2a4d1c64bf MDL-65451 tool_uploaduser: move code away from index.php, add CLI script 2020-10-06 15:53:13 +02:00
Ferran Recio a0999ab66f MDL-69736 core_h5p: enable player reporting 2020-10-06 13:05:33 +02:00
Paul Holden 7e3f7e3d7c MDL-69813 h5p: fix undefined addon ordering in framework test. 2020-10-06 10:48:06 +01:00
Eloy Lafuente (stronk7) 823bc36276 on-demand release 3.10dev+ 2020-10-06 10:21:14 +02:00
Mikhail Golenkov 1f3aacf8fc MDL-47178 question: Retain question authors when restoring backups. 2020-10-06 09:33:56 +11:00
Eloy Lafuente (stronk7) 38bcf316ee Merge branch 'MDL-69772-310-allcountrycodes' of git://github.com/mudrd8mz/moodle into MOODLE_310_STABLE 2020-10-06 00:04:05 +02:00
Eloy Lafuente (stronk7) f993881244 Merge branch 'MDL-65074-310' of https://github.com/hitteshahuja/moodle into MOODLE_310_STABLE 2020-10-05 23:12:25 +02:00
Víctor Déniz 3277fc9db6 Merge branch 'MDL-69625-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-10-05 19:21:12 +01:00
Sara Arjona ef3720efbd Merge branch 'MDL-69355-310-filebuffer' of git://github.com/mudrd8mz/moodle into MOODLE_310_STABLE 2020-10-05 18:33:45 +02:00
Jun Pataleta 41bc6b9400 Merge branch 'MDL-69704-310' of git://github.com/sarjona/moodle into MOODLE_310_STABLE 2020-10-05 23:12:57 +08:00
Paul Holden b9f8e3e114 MDL-69625 course: return raw custom field value in external method.
For clients that wish to consume the original value of the custom
field (e.g. timestamps for date fields), rather than the formatted
version, add a new "valueraw" property to the returned data.
2020-10-05 10:40:33 +01:00
Eloy Lafuente (stronk7) 355d07e0b4 Merge branch 'MOODLE_310-MDL-69752' of https://github.com/golenkovm/moodle into MOODLE_310_STABLE 2020-10-05 10:54:56 +02:00
Amaia Anabitarte 5af206ad2a MDL-69712 core_h5p: Remove 'whitelist' key uses 2020-10-05 10:28:07 +02:00
Jun Pataleta 5ec265b48d Merge branch 'MOODLE_310_MDL-53966' of https://github.com/golenkovm/moodle into MOODLE_310_STABLE 2020-10-05 13:24:04 +08:00
Mikhail Golenkov 35b29ce7d9 MDL-69791 gradereport: Fix error message when invalid grade is entered 2020-10-05 14:59:41 +11:00
Mikhail Golenkov bec49592ce MDL-69848 upgrade: Delete notifications in chunks 2020-10-05 13:13:51 +11:00
Jake Dallimore 57bb99edd4 MDL-59510 core_oauth2: autorefresh google drive, nextcloud and onedrive
Request additional offline access, allowing the repository to sign in
automatically each time, including across different user sessions, until
either the refresh token is invalidated or the user logs out of the
repository.
2020-10-05 09:17:14 +08:00
Jake Dallimore eb6b828b81 MDL-59510 core: report oauth2_refresh_token table in core provider 2020-10-05 09:17:14 +08:00
Jake Dallimore 8b09853319 MDL-59510 core_oauth2: add autorefresh mode to oauth2\client
Changes:
- The client can now be instantiated with the new mode enabled.
- A user refresh token will be stored if returned as part of the
authorization_code grant but only if the user is authenticated and only
if the mode is enabled.
- If the mode permits it, attempt to exchange a stored refresh token for
a new access token during login checks, allowing access to continue
across sessions without the need to re-grant consent every time.
- Purge all refresh tokens for a given user, issuer and scope on client
log out. This makes sure logout persists across logins.
2020-10-05 09:17:14 +08:00
Jake Dallimore fe1031244b MDL-59510 core_oauth2: add oauth2_refresh_token table 2020-10-05 09:17:14 +08:00
Mikhail Golenkov 03de8ed6d9 MDL-69818 mod_feedback: Fix item dependency during activity restoration 2020-10-04 18:27:32 +11:00
Mikhail Golenkov 6fae5e65e9 MDL-69752 mod_data: Format module intro on Database activities page 2020-10-04 13:46:32 +11:00
Mikhail Golenkov d7157063c3 MDL-53966 lesson: Allow maximum number of attempts to be unlimited 2020-10-04 13:18:45 +11:00
Tim Hunt 477fb6c9d6 MDL-69740 Behat init: more progress info at the end of the install 2020-10-02 23:16:23 +01:00
Juan Leyva c50b024463 MDL-69810 tool_mobile: Return support contact information via WS 2020-10-02 21:02:37 +02:00
Eloy Lafuente (stronk7) fadd2915eb MDL-69146 composer: bump to moodle-behat-extension 3.310.0
Generated following the instructions @:

https://docs.moodle.org/dev/Composer#How_to_prepare_and_submit_composer_changes

(using php72)

Note that here we are jumping to 3-digit branches (for all branches > 39),
exactly how we have done for moodle.git branches (310, 311, 400, 401...)
2020-10-02 15:07:01 +02:00
Sara Arjona c71355941b on-demand release 3.10dev+ 2020-10-02 13:44:05 +02:00
Nathan Nguyen 18871c74e2 MDL-69746 tool_replace: additional skip tables 2020-10-02 15:00:18 +10:00
Víctor Déniz 5cffc7f78b Merge branch 'MDL-69087-310' of git://github.com/sarjona/moodle into MOODLE_310_STABLE 2020-10-01 23:42:20 +01:00
Nathan Nguyen 946159a554 MDL-69572 mod_book : add bookid index to book_chapters 2020-10-01 23:28:21 +01:00
Eloy Lafuente (stronk7) 8d371859dc Merge branch 'MDL-69758-m310' of https://github.com/sammarshallou/moodle into MOODLE_310_STABLE 2020-10-01 23:44:15 +02:00
Claude Vervoort aad6afe979 MDL-57756 mod_lti: params change to text type 2020-10-01 17:32:44 -04:00
Sara Arjona d12c1406df MDL-69704 course: catch exception when calling get_course_content_items
When plugins are removed from disk, an exception is thrown when
calling component_callback_exists.
This exception should be catched here in order to load properly
the activity chooser (otherwise, the exception will be displayed
and no activity will appear).
2020-10-01 19:56:34 +02:00
Víctor Déniz 5130127a3e Merge branch 'MDL-69613-MOODLE_310_STABLE' of https://github.com/tuanngocnguyen/moodle into MOODLE_310_STABLE 2020-10-01 17:39:51 +01:00
Tim Hunt 651dbb729c MDL-69798 XML question export: excape special chars in idnumbers 2020-10-01 17:10:28 +01:00
Jamie Stamp 2c8db06e7a MDL-68665 assignfeedback_editpdf: Improve caching on stamps 2020-10-01 16:52:48 +01:00
Eloy Lafuente (stronk7) e98d18241f Merge branch 'MDL-69672-310' of git://github.com/aanabit/moodle into MOODLE_310_STABLE 2020-10-01 17:49:15 +02:00
Eloy Lafuente (stronk7) 3e460f45ac Merge branch 'MDL-69586-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-10-01 17:12:43 +02:00
Sara Arjona d5e30e0108 Merge branch 'MDL-69638_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2020-10-01 15:01:56 +02:00
Sara Arjona 7db1a61a72 Merge branch 'MDL-69050-310-allowlist' of git://github.com/mudrd8mz/moodle into MOODLE_310_STABLE 2020-10-01 14:51:12 +02:00
David Mudrák d335530a28 MDL-69772 admin: Better validation for the allcountrycodes setting
The patch introduces a new admin_setting fiela type that can be used for
specifying comma separated list of countries. The field has inbuilt
validation so that only valid country codes can be inserted.
2020-10-01 13:38:48 +02:00
Sara Arjona 6fe5bb1b96 MDL-69050 lang: Fix few remaining places spotted during integration 2020-10-01 13:01:58 +02:00
Sara Arjona e2a73965ca Merge branch 'MDL-68098-310' of git://github.com/dpalou/moodle into MOODLE_310_STABLE 2020-10-01 12:56:23 +02:00
Ferran Recio ccd0b96591 MDL-69582 tool_customlang: fix options layout 2020-10-01 11:04:10 +02:00
Ferran Recio 851f0d3354 MDL-69582 tool_customlang: add label to textarea 2020-10-01 11:04:10 +02:00
Sara Arjona 5576a97713 Merge branch 'MDL-67473-multipledeeplinking-squashed-310' of https://github.com/cengage/moodle into MOODLE_310_STABLE 2020-10-01 10:28:12 +02:00
Jake Dallimore b235c3a5a7 Merge branch 'MDL-69573-MOODLE_310_STABLE' of https://github.com/tuanngocnguyen/moodle into MOODLE_310_STABLE 2020-10-01 12:20:29 +08:00
Adrian Greeve c00b8b7cab Merge branch 'MDL-54956-310' of git://github.com/jleyva/moodle into MOODLE_310_STABLE 2020-10-01 11:17:44 +08:00
willob99 b19f178e0d MDL-69192 mod_assign: replace grading confirmation popup 2020-09-30 11:08:11 -07:00
David Matamoros 56b28e8e0b MDL-69805 mod_data: Freeze comment field if comments disabled 2020-09-30 15:51:02 +02:00
Matteo Scaramuccia 6658d9fba1 MDL-68536 core: Fix notice about undefined prop 'branch' in $CFG 2020-09-30 14:43:42 +02:00
Claude Vervoort 09dabe003a MDL-67473 mod_lti: deeplinking multiple support
AMOS BEGIN
 CPY [contentitem_help,mod_lti],[contentitem_deeplinking_help,mod_lti]
AMOS END
2020-09-30 08:04:53 -04:00
Nathan Nguyen 85f136094b MDL-69573 core_course: Make MAX_COURSES_IN_CATEGORY configurable 2020-09-30 16:04:55 +10:00
Adrian Greeve 1c55d84794 Merge branch 'MDL-37802-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-09-30 13:51:31 +08:00
Brendan Heywood 3ac504fd3d MDL-62678 core: Improve efficiency of notifications and avoid ajax call 2020-09-30 13:56:29 +10:00
Jake Dallimore 1f25df48b1 Merge branch 'MDL-68845-310' of git://github.com/jleyva/moodle into MOODLE_310_STABLE 2020-09-30 11:45:43 +08:00
Adrian Greeve 64ba1753a8 Merge branch 'MDL-68562_310' of https://github.com/mkassaei/moodle into MOODLE_310_STABLE 2020-09-30 11:12:34 +08:00
Eloy Lafuente (stronk7) 0e8d14f4e9 MDL-69638 install: update the list of stale files for 3.10 2020-09-29 22:37:56 +02:00
Víctor Déniz 9c28e07d31 Merge branch 'MDL-67841-310' of git://github.com/jleyva/moodle into MOODLE_310_STABLE 2020-09-29 18:33:48 +01:00
Sara Arjona 4ea44f96e5 Merge branch 'MDL-69342-310_profile_picture_deletion' of https://github.com/vtos/moodle into MOODLE_310_STABLE 2020-09-29 19:01:05 +02:00
Amaia Anabitarte c5c1b8b121 MDL-69672 core_contentbank: is_context_allowed unit tests 2020-09-29 17:47:37 +02:00
Amaia Anabitarte 3490f29ad9 MDL-69672 core_contentbank: Check used context level 2020-09-29 17:47:36 +02:00
Jun Pataleta 3b03a3da47 Merge branch 'MDL-69600-divertemails-MOODLE_310_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_310_STABLE 2020-09-29 20:27:36 +08:00
Sara Arjona a6aefe15f0 Merge branch 'MDL-65976-310' of git://github.com/jleyva/moodle into MOODLE_310_STABLE 2020-09-29 14:09:26 +02:00
Juan Leyva b294665c21 MDL-65976 completion: New course completion message provider 2020-09-29 13:41:49 +02:00
Brendan Heywood 2b50abffa2 MDL-69707 session: Avoid redis writes if the session is unchanged 2020-09-29 20:46:25 +10:00
Brendan Heywood acb848cdce MDL-69600 core: Expose divertallemails config in UI 2020-09-29 20:30:09 +10:00
Jun Pataleta 7cd362b873 Merge branch 'MDL-41492-310' of https://github.com/peterburnett/moodle into MOODLE_310_STABLE 2020-09-29 18:07:18 +08:00
Juan Leyva cc16de4ccc MDL-68845 calendar: New WS get_calendar_export_token 2020-09-29 10:56:29 +02:00
Juan Leyva c0af823086 MDL-68845 calendar: Move duplicated code to function 2020-09-29 10:54:05 +02:00
Eloy Lafuente (stronk7) 8b026809c5 on-demand release 3.10dev+ 2020-09-29 10:48:59 +02:00
Jun Pataleta 2dbc9a5005 Merge branch 'MDL-69283-310' of git://github.com/jleyva/moodle into MOODLE_310_STABLE 2020-09-29 13:53:53 +08:00
Claude Vervoort d224506353 MDL-68384 mod_lti: fix spec violations bo claim name and dl value type 2020-09-28 17:02:40 -04:00
Juan Leyva 0d1187b052 MDL-67841 tool_mobile: Inform about last access with the app 2020-09-28 21:40:54 +02:00
Víctor Déniz a2e3aa6806 Merge branch 'MDL-69644-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-09-28 20:34:01 +01:00
Shamim Rezaie adac2a9e55 MDL-69649 form: Fix labels for defaultcustom form elements 2020-09-28 23:43:01 +10:00
Shamim Rezaie 2fca843e49 MDL-69649 backup: Fix missing labels
- The backup details page uses a table to show a sumary of the backup
  content. Used role attribute to denote the tabular format of the
  summary.
- The backup details page displays activity name next to each activity
  icon. Therefore the icons are only decorative and do not need to have
  any title or even alt text.
- Form labels should be associated with form controls.  A div element is
  not a form control.
- The from attribute of the form labels should be equal to the id
  attribute of an element. Therefore, we first create a label and an
  input elements and associate them to each other, and then pass them to
  backup_detail_pair() when a label is needed.
2020-09-28 23:43:01 +10:00
Sara Arjona 157a497a3e Merge branch 'MDL-69695-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-09-28 13:03:21 +02:00
sam marshall 4f0fc4f45b MDL-69759 Web services: app checks to token.php cause log errors 2020-09-28 11:55:14 +01:00
Sara Arjona 27b1425eb2 Merge branch 'MDL-68935-310' of git://github.com/jleyva/moodle into MOODLE_310_STABLE 2020-09-28 11:41:01 +02:00
Peter Burnett 40e41c1997 MDL-41492 cache: Added ability for alternate cache config 2020-09-28 15:14:30 +10:00
Nathan Nguyen 89ce0b387e MDL-69613 gradereport: confirm message if override none is selected 2020-09-28 10:40:06 +10:00
Juan Leyva 9b64c178dd MDL-69283 webservice: New external setting for forcing timezone 2020-09-25 19:09:50 +02:00
Hittesh Ahuja 69cc1d1dd5 MDL-65074 mod_quiz: Quiz navigation buttons shouldnt use btn-secondary
Removing .btn-secondary as plain.scss and default.scss in bootstrap hide the button from view.
2020-09-25 15:14:06 +01:00
Juan Leyva 39c8e99e67 MDL-69776 files: New WS core_files_delete_draft_files 2020-09-25 10:38:25 +02:00
Paul Holden 833ab0ea9f MDL-37802 repository: return error if unzipping files fails.
For instance, when a user tried to unzip a password protected zip
archive using the file manager.
2020-09-25 09:33:54 +01:00
Paul Holden 2b87250347 MDL-69586 tool_usertours: use specified user in privacy prefs export. 2020-09-25 09:13:28 +01:00
Mahmoud Kassaei 95d1f1f18d MDL-68562 Qtype_essay: Adding file-size limit to the attachment files 2020-09-25 08:52:59 +01:00
Sara Arjona d23f05828f MDL-69087 core_h5p: add renderer to let personalize styles
Existing mod_hvp pluging has a renderer to let Moodle instances
alter styles, Javascript, semantics (fields in the editor) and
content: https://github.com/h5p/moodle-mod_hvp/blob/stable/renderer.php

The approach for core_h5p is exactly the same, to let people
to reuse their existing code.
2020-09-24 19:56:42 +02:00
David Mudrák 972340b678 MDL-69050 lang: Stop using the term blacklist in mustache output engine 2020-09-24 19:39:36 +02:00
David Mudrák 3971892bd3 MDL-69050 lang: Fix the variable name in the admin/cli/svgtool.php 2020-09-24 19:33:36 +02:00
David Mudrák b18b714165 MDL-69050 lang: Fix variable name and comment in core-notification YUI 2020-09-24 19:33:36 +02:00
David Mudrák 781545d34d MDL-69050 lang: Rename and deprecate filetypes_util methods 2020-09-24 19:33:32 +02:00
David Mudrák 19fe7f27a8 MDL-69050 lang: Improve the wording of the comments
Stop using the terms whitelist/blacklist when used to allow/deny things.
2020-09-24 19:32:40 +02:00
David Mudrák bd686af064 MDL-69050 lang: Fix the variable name in the Essay question type 2020-09-24 19:32:40 +02:00
David Mudrák fd18dc14ff MDL-69050 lang: Rename the filetypesnotwhitelisted string
Rename the string identifier to filetypesnotallowed, copy all the
existing translations in AMOS and deprecate the original string to be
eventually removed.

AMOS BEGIN
 CPY [filetypesnotwhitelisted,core_form],[filetypesnotallowed,core_form]
AMOS END
2020-09-24 19:32:40 +02:00
David Mudrák e840b14f4c MDL-69050 lang: Fix the variable name in the TeX filter library 2020-09-24 19:32:39 +02:00
David Mudrák 730aa1dcb0 MDL-69050 lang: Rename the whitelist variable in the Workshop locallib 2020-09-24 19:32:39 +02:00
David Mudrák 9ef6492e5d MDL-69050 lang: Fix variables and methods names in curl_security_helper
The code has been using terms that were found exclusive and potentially
derogatory. Fixing the terms and making the variables and methods
consistent with the related admin settings.
2020-09-24 19:32:39 +02:00
David Mudrák 41ad54e182 MDL-69050 lang: Fix placeholder in the err_wrongfileextension string
The name of the placeholder has been found exclusive and potentially
derogatory. Also the name of variable that was used to populate the
placeholder value. That was not the intention.
2020-09-24 19:32:39 +02:00
David Mudrák 2a1fb5b5e7 MDL-69772 admin: Fix legacy coding style on Location settings admin page
No actual change here. Just polishing the coding style and adding
fulltree check.
2020-09-24 18:14:29 +02:00
David Mudrák 56adf1f3d8 MDL-69772 lang: Ignore misconfigured allcountrycodes filter
If the allcountrycodes filter contains only invalid values, ignore the
whole filter setting and make get_list_of_countries() return the full
list of all known countries, rather than empty list.
2020-09-24 18:14:29 +02:00
Víctor Déniz a36870c175 weekly release 3.10dev 2020-09-24 16:27:15 +01:00
Eloy Lafuente (stronk7) a0f377cf2b Merge branch 'MDL-69698-310-licensecache' of git://github.com/mudrd8mz/moodle into MOODLE_310_STABLE 2020-09-24 16:50:39 +02:00
Eloy Lafuente (stronk7) 7905d70497 Merge branch 'MDL-69718-display-size-MOODLE_310_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_310_STABLE 2020-09-24 16:39:26 +02:00
Paul Holden d0a55062f9 MDL-69644 tool_dataprivacy: fix focus outline of contact DPO link.
The link class attribute is a leftover from 7258bf0b, which was mostly
removed in 3b2f691f. It no longer serves a purpose and interferes with
the element focus outline.
2020-09-24 11:53:29 +01:00
Vitaly 7f177d440c MDL-69342 core_user: fixed user picture updating
When editing a user and checking the 'Delete picture' checkbox to delete
the old picture and uploading a new one at a time, the new one didn't appear
in the user profile. This happened due to the 'if/else' statement
in the 'core_user::update_picture()' method which allowed either to delete
the old picture or to upload a new one.
The fix removes the 'else' part of the 'if/else' statement to force
checking for a new uploaded picture no matter if a user checked
the 'Delete picture' checkbox or not.
2020-09-24 10:29:31 +03:00
Bas Brands 8730ffcbe1 MDL-66587 mod_quiz: visible quiz timer 2020-09-24 11:32:18 +08:00
Bas Brands 486aa319c2 MDL-69454 core_search: consistent backup search 2020-09-23 17:36:15 +02:00
Bas Brands 6fa8e1c86f MDL-69454 core_search: consistent cohort search 2020-09-23 17:36:15 +02:00
Bas Brands dcfb713ca6 MDL-69454 core_search: consistent content bank search 2020-09-23 17:36:15 +02:00
Bas Brands 9d82cdb62e MDL-69454 core_search: consistent activity chooser search 2020-09-23 17:36:15 +02:00
Bas Brands a88f50d1b2 MDL-69454 core_search: consistent template library search 2020-09-23 17:36:15 +02:00
Bas Brands 94adb3429b MDL-69454 core_search: consistent capability search 2020-09-23 17:36:15 +02:00
Bas Brands bd516bf05c MDL-69454 core_search: consistent tag search 2020-09-23 17:36:15 +02:00
Bas Brands 02829c03c1 MDL-69454 core_search: message search 2020-09-23 17:36:14 +02:00
Bas Brands e9435e8f6d MDL-69454 core_search: consistent mod searches 2020-09-23 17:36:14 +02:00
Bas Brands 6a750d283d MDL-69454 core_search: consistent block searches 2020-09-23 17:36:14 +02:00
Bas Brands b5e39191fc MDL-69454 core_search: consistent course management search 2020-09-23 17:36:14 +02:00
Bas Brands 42c1cf3b03 MDL-69454 core_search: consistent frontpage course search 2020-09-23 17:36:14 +02:00
Bas Brands a5cd815635 MDL-69454 core_search: consistent admin search 2020-09-23 17:36:14 +02:00
Bas Brands 1fdb4fda4a MDL-69454 core_search: consistent navbar search 2020-09-23 17:36:14 +02:00
Juan Leyva 61772eb89b MDL-54956 quiz: Fix WS to support files submission 2020-09-23 12:52:45 +02:00
Juan Leyva e49ccc92c4 MDL-54956 quiz: Return response files in attempts 2020-09-23 12:52:45 +02:00
Dani Palou f9f289f69d MDL-68098 tests: Reset FILTERLIB_PRIVATE after tests 2020-09-23 12:09:08 +02:00
Dani Palou e16b858ff9 MDL-68098 ws: Add unit tests to test mathjax in WS 2020-09-23 12:08:52 +02:00
Dani Palou f4bdb898c7 MDL-68098 ws: Fix WebServices broken by filters HTML 2020-09-23 12:08:40 +02:00
Eloy Lafuente (stronk7) 2d502fd749 Merge branch 'MDL-68229-310' of git://github.com/jleyva/moodle into MOODLE_310_STABLE 2020-09-23 11:51:16 +02:00
Eloy Lafuente (stronk7) b552d604ff Merge branch 'MDL-69014-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-09-22 23:04:57 +02:00
Eloy Lafuente (stronk7) 6d73afb2bf Merge branch 'MDL-66934-coursehistory-310' of https://github.com/cengage/moodle into MOODLE_310_STABLE 2020-09-22 14:40:12 +02:00
Juan Leyva 0ad2d843d7 MDL-64657 course: Return hidden section names when configured 2020-09-22 11:53:04 +02:00
Eloy Lafuente (stronk7) 82a1e8fae7 Merge branch 'MDL-66648-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-09-21 23:36:22 +02:00
Eloy Lafuente (stronk7) a2c1a20055 Merge branch 'MDL-69667-MOODLE_310_STABLE' of https://github.com/comete-upn/moodle into MOODLE_310_STABLE 2020-09-21 23:20:05 +02:00
David Mudrák 76c3dc5f6b MDL-67275 forum: Fix language and accessibility issues with buttons
There were inconsistencies with the text shown on the submit button,
depending on the where the button was shown.

* Inline reply forum displayed general "Submit".
* Experimental nested discussion view reply form displayed "Post"
  (post/core string) which acts as a noun in other contexts and cannot
  be used as such in many non-English languages.
* Advanced reply form displayed "Post to forum".

The patch fixes this and starts to show "Post to forum" in all three
places consistently.

While working on this, two more issues were noticed and fixed:

* Inline reply textarea's title was hard-coded English "post" text.
  Changed to "Message" to provide advisory information related to the
  element.
* Buttons contained title attribute with the same value as the explicit
  button text. This goes against accessibility guidelines.
2020-09-21 22:50:43 +02:00
sam marshall 62ea8b1cae MDL-69758 Web services: core_get_course_contents PHP warnings
Calls to core_get_course_contents can cause PHP warnings in the server
log if there are any URL instances in the course with sketchy URLs.
This is because url_export_contents incorrectly returns null instead
of an empty array if there is an error.
2020-09-21 15:28:11 +01:00
Brendan Heywood c36d5093e3 MDL-69718 core: Added support for TB and PT to display_size 2020-09-21 12:55:44 +10:00
Claude Vervoort fae57261e7 MDL-66934 mod_lti: support context history param 2020-09-18 14:06:58 -04:00
Juan Leyva 11a49b08e7 MDL-68229 tool_mobile: Add missing option to disable tags in the app 2020-09-18 15:31:03 +02:00
Sara Arjona a730c334c7 MDL-69548 grunt: build ignorefiles 2020-09-18 09:56:22 +02:00
Sara Arjona fb5e3957be Merge branch 'MDL-69548-310' of git://github.com/mickhawkins/moodle into MOODLE_310_STABLE 2020-09-18 09:41:10 +02:00
Michael Hawkins 54524f1ff0 MDL-69548 core: Adding the http-message library
This is a dependency of ZipStream
2020-09-18 10:03:22 +08:00
Michael Hawkins bbfbe8e260 MDL-69548 core: Adding the php-enum library
This is a dependency of ZipStream
2020-09-18 10:03:22 +08:00
Michael Hawkins cfe02e4d3e MDL-69548 core: Adding the ZipStream library
This allows downloading of zip files as a stream, and will be used by
the Download course content project (MDL-69540).
2020-09-18 10:03:22 +08:00
Eloy Lafuente (stronk7) 611399214b weekly release 3.10dev 2020-09-17 19:04:13 +02:00
David Mudrák 321de29e93 MDL-69355 file: Do not attempt to set headers after output started
It was found out that in certain situations there may be some content
in to output handlers buffers. Let's allow that to happen given that:

* default handler's buffer is not sent as a part of the file and an
  error is reported into the server log.
* other handlers' buffer is sent with the assumption that it is required
  for the correct serving of the file.
2020-09-17 17:37:28 +02:00
Eloy Lafuente (stronk7) f200ba55f8 Merge branch 'MDL-69395_310' of github.com:stronk7/moodle into MOODLE_310_STABLE 2020-09-17 17:02:08 +02:00
Eloy Lafuente (stronk7) 8d791e12ba MDL-69395 theme_classic: remove superfluous selector already in boost 2020-09-17 13:05:40 +02:00
Jun Pataleta 8923308d47 Merge branch 'MDL-69630-310' of git://github.com/mihailges/moodle into MOODLE_310_STABLE 2020-09-17 09:17:23 +02:00
Eloy Lafuente (stronk7) 0e97e40e5a Merge branch 'MDL-62387-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-09-17 09:17:23 +02:00
Eloy Lafuente (stronk7) 7254648363 Merge branch 'MDL-68909-310' of git://github.com/sarjona/moodle into MOODLE_310_STABLE
Bump version to 2020091000.02 (01 was already current)
2020-09-17 09:17:20 +02:00
Eloy Lafuente (stronk7) c3176af430 Merge branch 'MDL-69664-310' of git://github.com/junpataleta/moodle into MOODLE_310_STABLE 2020-09-17 09:16:52 +02:00
Eloy Lafuente (stronk7) cb82c4d901 Merge branch 'MDL-69395-310' of git://github.com/bmbrands/moodle into MOODLE_310_STABLE 2020-09-17 09:16:52 +02:00
Sara Arjona bf127517b3 Merge branch 'MDL-68688-310' of git://github.com/aanabit/moodle into MOODLE_310_STABLE 2020-09-17 09:16:52 +02:00
Jun Pataleta 29e56fef72 Merge branch 'MDL-69663-m310' of https://github.com/sammarshallou/moodle into MOODLE_310_STABLE 2020-09-17 09:16:52 +02:00
Sara Arjona b249ab9df4 Merge branch 'MDL-68564_before_footer' of git://github.com/davosmith/moodle into MOODLE_310_STABLE 2020-09-17 09:16:52 +02:00
Sara Arjona 7805d0bb44 MDL-68909 h5p: move temporary editor files to draft area 2020-09-17 09:16:51 +02:00
Sara Arjona 6fcc509ed1 MDL-68909 h5p: upgrade step to remove files in editor filearea
As temporary editor files have been moved from core_h5p/editor to
user/draft, they can be removed (to clean unused DB entries).
2020-09-17 09:16:49 +02:00
Mihail Geshoski ebd136ca12 MDL-69630 format_social: Fix behat tests 2020-09-17 12:24:39 +08:00
Stephen Bourget c96a155937 MDL-69630 format_social: Add ajax support 2020-09-17 12:24:39 +08:00
Juan Leyva fdb7f85140 MDL-68935 course: Return context data in get_content WS 2020-09-16 12:43:53 +02:00
David Mudrák fbae45d7c9 MDL-69698 licenses: Improve the performance of the licenses cache
The cache uses a single simple key and there is no need to hash it.
2020-09-15 10:35:34 +02:00
David Mudrák a398a60092 MDL-69698 licenses: Do not cache the localised licenses fullnames
The localisation must happen only after loading the list of licenses
from cache so that the name is displayed in the current user's preferred
language, not in the language of the user who initiated the cache
rebuild.
2020-09-15 10:35:34 +02:00
Paul Holden de0e594a10 MDL-62387 tool_lp: switch to core 'cohort' form element.
The autocomplete AJAX is identical to the version in tool_lp, but also
includes support for excluding suggestions (i.e. cohorts already
synced with the current learning plan).
2020-09-15 08:08:11 +01:00
comete-upn 93097192e6 MDL-69667 competencies: fix competencies count always 0 in frameworks. 2020-09-15 08:37:53 +02:00
Jun Pataleta 1427573cde Merge branch 'MDL-68702-MOODLE_310_STABLE' of https://github.com/tuanngocnguyen/moodle into MOODLE_310_STABLE 2020-09-15 11:56:28 +08:00
Jun Pataleta 28790a42ad Merge branch 'MDL-42012-310-alt' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-09-15 11:52:56 +08:00
Andrew Nicols e5f0085cdb MDL-42012 cache: Fix missing return value 2020-09-15 11:46:31 +08:00
Eloy Lafuente (stronk7) 682593054d Merge branch 'MDL-42012-310-alt' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-09-14 23:28:54 +02:00
Eloy Lafuente (stronk7) 8fba6189fe Merge branch 'MDL-69658-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-09-14 22:56:42 +02:00
Paul Holden 31188e93d6 MDL-69695 mod_folder: use forcedownload setting during inline display. 2020-09-14 21:40:38 +01:00
Paul Holden 9bc368f71c MDL-69014 tool_usertours: clean up user preferences of deleted tours. 2020-09-14 20:36:28 +01:00
Paul Holden 1aa7c68c6f MDL-66648 user: consistent checks for linking to full profile.
The access checks for displaying a link to a users' full profile
now match the checks performed on the full profile page itself.
2020-09-14 20:22:05 +01:00
Davo Smith 23efc7337a MDL-68564 outputrenderers: extend before_footer hook to allow output 2020-09-14 11:00:36 +01:00
Nathan Nguyen cf4b6c8c94 MDL-68702 core_backup: exclude legacy course files 2020-09-11 10:59:28 +10:00
Amaia Anabitarte abb2037b0f MDL-68688 core_contentbank: Empty content bank notification 2020-09-10 11:58:53 +02:00
sam marshall c94b6b2ab7 MDL-69663 Web services: override_webservice_execution not honoured
If two different plugin types (e.g. theme, local) implement
override_webservice_execution callbacks, then all of them except
the 'last' plugin type do not work correctly.
2020-09-10 09:50:50 +01:00
Sara Arjona ab5d361c80 weekly release 3.10dev 2020-09-10 08:52:01 +02:00
Jun Pataleta 334333b6c7 MDL-69664 mod_lti: Apply correct badge class to tool card 2020-09-09 23:34:39 +08:00
Bas Brands 3d08cd2272 MDL-69395 theme_boost: improve colour contrast for form input fields
- for this issue the atto styles.css was moved into theme boost so
we can use our preset variable for $gray-500
2020-09-09 13:41:32 +02:00
Sara Arjona 83a5ed90ce Merge branch 'MDL-69466-3.10' of https://github.com/JBThong/moodle into MOODLE_310_STABLE 2020-09-09 11:39:16 +02:00
Sara Arjona d945333b47 Merge branch 'MDL-69645-310' of git://github.com/lucaboesch/moodle into MOODLE_310_STABLE 2020-09-09 11:00:49 +02:00
Jun Pataleta da84b731c7 Merge branch 'MDL-57682-310-fix' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-09-09 16:06:02 +08:00
Andrew Nicols 36f3b1e418 MDL-57682 mediaplayer_videojs: Improve in-page caching of lang strings 2020-09-09 15:37:54 +08:00
Andrew Nicols a3cc6898e9 MDL-57682 mediaplayer_videojs: Login not required for lang fetch 2020-09-09 15:37:52 +08:00
Thong Bui fcbca18c7b MDL-69466 Autocomplete widget: Improve keyboard accessibility 2020-09-09 13:44:23 +07:00
Tien Nguyen c0280f4405 MDL-68797 Administration: Add auto complete setting 2020-09-09 14:37:34 +08:00
Sara Arjona c83543095a Merge branch 'MDL-69521_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2020-09-09 08:08:29 +02:00
Andrew Nicols 13e34fb428 MDL-42012 cache: Valid definitions are required even when disabled 2020-09-09 14:05:03 +08:00
Andrew Nicols c705434a62 MDL-42012 cache: Fully disable cache for disabled cache factory 2020-09-09 14:05:03 +08:00
Andrew Nicols cfe1a9a8d8 MDL-42012 cache: Allow data sources to work when caching is disabled 2020-09-09 14:05:03 +08:00
Andrew Nicols 94d05a5bfb MDL-68797 tool_mobile: Version bump 2020-09-09 12:43:55 +08:00
Tien Nguyen 2562b9f3a3 MDL-68797 Administration: Setting for mobile file type exclusion list 2020-09-09 12:29:06 +08:00
Andrew Nicols e8b05c6cb4 Merge branch 'MDL-57682-310' of git://github.com/rezaies/moodle into MOODLE_310_STABLE 2020-09-09 12:23:33 +08:00
Eloy Lafuente (stronk7) 8f0297915c Merge branch 'MDL-69116-310' of git://github.com/rezaies/moodle into MOODLE_310_STABLE 2020-09-08 23:16:24 +02:00
Paul Holden b25763e875 MDL-69658 quizaccess_seb: progress bar on install only when necessary. 2020-09-08 19:32:24 +01:00
Eloy Lafuente (stronk7) 84bcfbb0d5 MDL-69521 core: Move all comments in code from 4.4 to 4.2 2020-09-08 19:01:42 +02:00
Eloy Lafuente (stronk7) e419e7acba MDL-69521 core: Move all comments in code from 4.3 to 4.1 2020-09-08 19:01:41 +02:00
Eloy Lafuente (stronk7) 309aad5a82 MDL-69521 core: Move all comments in code from 4.2 to 4.0 2020-09-08 19:01:41 +02:00
Eloy Lafuente (stronk7) 8452418666 MDL-69521 core: Move all comments in code from 4.1 to 3.11 2020-09-08 19:01:36 +02:00
Eloy Lafuente (stronk7) 5ba67416e6 Merge branch 'MDL-69510-310' of https://github.com/snake/moodle into MOODLE_310_STABLE 2020-09-08 15:28:33 +02:00
Sara Arjona bd0de2d965 Merge branch 'MDL-69525-310-1' of git://github.com/mihailges/moodle into MOODLE_310_STABLE 2020-09-08 14:21:46 +02:00
Sara Arjona db54910ce2 Merge branch 'MDL-28501-310' of https://github.com/mackensen/moodle into MOODLE_310_STABLE 2020-09-08 13:28:51 +02:00
Michael Hawkins 9d356676c3 MDL-69340 tag: Correct the filter input HTML in the tag manager 2020-09-08 08:54:33 +02:00
Mihail Geshoski a9d3f4b96c MDL-69048 book: Sanitize previous chapter value in add new chapter page 2020-09-08 08:54:33 +02:00
Andrew Nicols ca6cf0bd21 MDL-68974 calendar: Use page context for block check 2020-09-08 08:54:33 +02:00
Andrew Nicols 7d990ee185 MDL-68974 blocks: Check permission before generating content 2020-09-08 08:54:33 +02:00
Mihail Geshoski e2a11dc2aa MDL-65115 repository: Prevent unzipping if it will exceed allowed quota 2020-09-08 08:54:33 +02:00
Mihail Geshoski a2a6303397 MDL-65115 core_files: Add get_total_content_size() in stored_file class
New function get_total_content_size() is introduced in the stored_file
class. The puprose of this function is to calculate and return the
total size (in bytes) of the content of an archive file.
2020-09-08 08:54:33 +02:00
Andrew Nicols 6c4cdd6d96 MDL-68974 admin: Unit tests for context parent/child test 2020-09-08 08:54:33 +02:00
Andrew Nicols 4bb41b4e5a MDL-68974 admin: Unit tests for loginas 2020-09-08 08:54:33 +02:00
Andrew Nicols a937d4d807 MDL-68974 admin: Prevent login as outside of the desired context 2020-09-08 08:54:33 +02:00
Thong Bui 2301f9bfaa MDL-68344 filepicker: File Picker focus lost on upload 2020-09-08 08:45:09 +02:00
Jun Pataleta 0e9c755896 Merge branch 'MDL-69492-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-09-08 12:56:38 +08:00
Eloy Lafuente (stronk7) 3452156e6e Merge branch 'MDL-69262-310-2' of git://github.com/junpataleta/moodle into MOODLE_310_STABLE 2020-09-07 23:42:53 +02:00
Eloy Lafuente (stronk7) 6ef1780225 Merge branch 'MDL-69448-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-09-07 23:26:08 +02:00
Eloy Lafuente (stronk7) a8c60a4c31 Merge branch 'MDL-69577-310' of git://github.com/crazyserver/moodle into MOODLE_310_STABLE 2020-09-07 23:09:37 +02:00
Luca Bösch b2995f7a29 MDL-69645 quizaccess: Set allowPreferencesWindow to false in manual conf
Signed-off-by: Luca Bösch <luca.boesch@bfh.ch>
2020-09-07 22:40:58 +02:00
Charles Fulton 51201bc672 MDL-28501 mod_folder: make force downloading behavior configuable 2020-09-07 14:40:40 -04:00
Mathew May aa13890df0 MDL-69240 tool_moodlenet: Clean MoodleNet profile field
Amended by: Eloy Lafuente (stronk7) <stronk7@moodle.org>
- adjust versions for every branch.
- modify verify_webfinger->profileurl external to PARAM_NOTAGS.
2020-09-07 17:36:22 +02:00
Sara Arjona 644b80410d Merge branch 'MDL-69632-310-adminserversettings' of git://github.com/mudrd8mz/moodle into MOODLE_310_STABLE 2020-09-07 13:44:03 +02:00
Sara Arjona b36a28b37a Merge branch 'MDL-67468-MOODLE_310_STABLE' of https://github.com/tuanngocnguyen/moodle into MOODLE_310_STABLE 2020-09-07 13:19:56 +02:00
Mathew May 386223bd86 MDL-62609 lang: Final removal of deprecated strings 2020-09-07 08:06:32 +02:00
Sara Arjona 95359bf9e7 Merge branch 'MDL-63261-310' of https://github.com/Chocolate-lightning/moodle into MOODLE_310_STABLE 2020-09-07 07:30:17 +02:00
Mathew May 1bc2a3b345 MDL-63261 messaging: Final 3.6 deprecations 2020-09-07 09:09:07 +08:00
Eloy Lafuente (stronk7) 709b46dbfd MDL-69521 core: Move all comments in code from 4.0 to 3.10 2020-09-06 17:23:58 +02:00
Shamim Rezaie 94c19e0fea MDL-57682 media_videojs: Cache videojs languages in the localstorage 2020-09-04 18:55:16 +10:00
Shamim Rezaie 4a60349a8a MDL-57682 media_videojs: webservice to get the language pack of videojs 2020-09-04 18:51:37 +10:00
Shamim Rezaie 2189db9c86 MDL-57682 media_videojs: convert videojs loader to es6 2020-09-04 18:51:37 +10:00
David Mudrák f54cb0c257 MDL-69632 admin: Fix the legacy coding style at the server section
No actual changes to the file made, only reformatted and cleaned up to
follow the recent coding guidelines.
2020-09-04 10:23:06 +02:00
Paul Holden 95e0ff974c MDL-69492 auth_ldap: normalise member distinguished name config. 2020-09-04 08:25:58 +01:00
Paul Holden db361e09e7 MDL-69492 auth_cas: normalise member distinguished name config. 2020-09-04 08:25:58 +01:00
Paul Holden f2b1242364 MDL-69448 backup: fix capability checks when unable to copy user data.
When a given user doesn't have the capability to "Include user data"
during course copying, freeze the form element rather than not adding
it at all.

This caused problems as the element was required before preceding with
the course copy.
2020-09-04 08:20:04 +01:00
Nathan Nguyen d0fd7bc58c MDL-67468 filter_activitynames: use MUC 2020-09-04 15:41:52 +10:00
Sara Arjona 916809d995 weekly release 3.10dev 2020-09-03 17:09:17 +02:00
Sara Arjona e22ac10067 NOBUG: Fixed SVG browser compatibility 2020-09-03 17:09:12 +02:00
Andrew Nicols f558127d0e MDL-69391 behat: Grammar correction in feature 2020-09-03 11:35:08 +08:00
Andrew Nicols fc1d22ea70 Merge branch 'MDL-69391-310' of git://github.com/junpataleta/moodle into MOODLE_310_STABLE 2020-09-03 11:35:04 +08:00
Jun Pataleta 5d1979c911 MDL-69391 calendar: Accessibility tests for calendar 2020-09-03 11:11:29 +08:00
Jun Pataleta fe346f0afb MDL-69391 auth: Colour contrast accessibility test for login page 2020-09-03 11:11:29 +08:00
Jun Pataleta 8d5470145d MDL-69391 theme: Darken course selector text colour
Use $gray-600 for a darker text colour in the course select box.
This also makes the colour consistent with the view selector which
also uses $gray-600.
2020-09-03 11:11:29 +08:00
Jun Pataleta 61d32ad081 MDL-69391 theme: Darken navbar-light colour
Increase the opacity for the sass variable $navbar-light-color a
little bit in order to achieve an acceptable colour contrast against
the white background.
2020-09-03 11:11:29 +08:00
Dmitrii Metelkin 558ef4f778 MDL-69418 backup: attach data to grade items 2020-09-03 11:08:00 +08:00
Andrew Nicols c8221dedcd Merge branch 'MDL-69360-310' of git://github.com/NoelDeMartin/moodle into MOODLE_310_STABLE 2020-09-03 10:52:02 +08:00
Andrew Nicols 5265491a8f Merge branch 'MDL-69246_310' of https://github.com/timhunt/moodle into MOODLE_310_STABLE 2020-09-03 10:39:58 +08:00
Jake Dallimore b96e85feac MDL-69510 admin: make ldap configuration warnings clear 2020-09-03 10:26:00 +08:00
Andrew Nicols 817d6dcdbb Merge branch 'MDL-55340-310' of git://github.com/sarjona/moodle into MOODLE_310_STABLE 2020-09-03 10:13:49 +08:00
Andrew Nicols de1a942280 Merge branch 'MDL-69069-310' of git://github.com/bmbrands/moodle into MOODLE_310_STABLE 2020-09-03 09:33:05 +08:00
Andrew Nicols 3e1c856bd9 MDL-69117 output: Correct remove_dir usage 2020-09-03 09:01:43 +08:00
Bas Brands cce23499e6 MDL-69117 theme_boost: themedesigner source maps 2020-09-03 08:40:41 +08:00
Bas Brands 74160de2cb MDL-69117 theme_boost: deprecate the autoprefixer 2020-09-03 08:40:41 +08:00
Eloy Lafuente (stronk7) 4ca7232b1f Merge branch 'MDL-55971-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-09-03 00:51:33 +02:00
Peter Burnett ded581156a MDL-67306 webservices: Added webservice for Grade category creation 2020-09-03 00:21:44 +02:00
Marina Glancy 4cfc74d176 MDL-69608 core_form: frozen forms do not have form tag 2020-09-02 23:48:39 +02:00
Sara Arjona 893cf77d33 Merge branch '67278-moodle-310-categories-selector' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_310_STABLE 2020-09-02 17:37:24 +02:00
Sara Arjona e66f450c8f Merge branch 'MDL-68680-MOODLE_310_STABLE' of https://github.com/tuanngocnguyen/moodle into MOODLE_310_STABLE 2020-09-02 17:16:01 +02:00
Julien Boulen f9f41f5061 MDL-67278 course: Use autocomplete widget for course category selector 2020-09-02 16:00:20 +02:00
Eloy Lafuente (stronk7) 76e2d15794 Merge branch 'MDL-69174-310' of git://github.com/sarjona/moodle into MOODLE_310_STABLE 2020-09-02 13:14:34 +02:00
Sara Arjona 31d3fd27fc MDL-69174 mod_h5pactivity: component passed always
The $component = 'mod_h5pactivity' will be passed always to the H5P
player because it's required for being able to call these activities
from outside using embed code. The xAPI implementation checks whether
the information should be tracked or not.
2020-09-02 12:12:25 +02:00
Sara Arjona 2874c6d5a1 MDL-69174 h5p: add component to the embed H5P code
When the Moodle component is passed to the player, xAPI tracking
is enabled so, if the component implements required xAPI API methods
(for instance, mod_h5pactivity does), grades and responses are sent.
Adding this component to the embed code will help to add
the embed code from a mod_h5pactivity to any other place (such as label,
page or book), and being able to track the responses to the original
mod_h5pactivity.
2020-09-02 12:12:25 +02:00
Noel De Martin d8892dcca3 MDL-69360 behat: Fix js ready checks for non-moodle sites 2020-09-02 10:20:28 +02:00
Andrew Nicols 85a1c2c99e Merge branch 'MDL-68892-310' of git://github.com/ferranrecio/moodle into MOODLE_310_STABLE 2020-09-02 09:48:59 +08:00
Dan Marsden 58bf730494 MDL-69190 grade: fix slow query. 2020-09-02 09:31:28 +08:00
Farhan Karmali d179137f1b MDL-67419 admin: New admin setting for lang during user creation 2020-09-02 08:54:47 +08:00
Eloy Lafuente (stronk7) 8eafd115cc Merge branch 'wip_MDL-69491_m310' of git://github.com/gjb2048/moodle into MOODLE_310_STABLE 2020-09-02 00:27:36 +02:00
Eloy Lafuente (stronk7) 3b111cf8a0 Merge branch 'MDL-69174-310' of git://github.com/sarjona/moodle into MOODLE_310_STABLE 2020-09-02 00:21:55 +02:00
Sara Arjona a244344e2e Merge branch 'MDL-63387-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-09-01 16:58:15 +02:00
Pau Ferrer Ocaña 23fed91412 MDL-69577 forum: Add courseid, forumid on get_discussion_posts response 2020-09-01 14:26:08 +02:00
Sara Arjona dee4097c9d Merge branch 'MDL-64525-m310' of https://github.com/NeillM/moodle into MOODLE_310_STABLE 2020-09-01 14:18:05 +02:00
Paul Holden 7665c701fd MDL-63387 course: use renamed role names, update Behat tests.
Specify that we want both role names (renamed course role plus
original).
2020-09-01 12:05:26 +01:00
Paul Holden 3827cbe523 MDL-63387 user: show both role names on course participants page. 2020-09-01 12:05:26 +01:00
Paul Holden f6a2d57b3e MDL-63387 enrol_cohort: show both roles names in instance config form. 2020-09-01 12:05:25 +01:00
Paul Holden 35a5c1adda MDL-63387 enrol_manual: show both role names in enrol users dialog. 2020-09-01 12:05:25 +01:00
Paul Holden e4d86a6ec4 MDL-63387 access: add parameter to define how role names are returned. 2020-09-01 12:04:47 +01:00
Sara Arjona 8d2229db48 Merge branch 'MDL-51709-310' of git://github.com/lucaboesch/moodle into MOODLE_310_STABLE 2020-09-01 09:04:13 +02:00
Mihail Geshoski 4d6b3406c5 MDL-69525 core: Publish a single event when toggling slave checkboxes 2020-09-01 14:53:54 +08:00
Sara Arjona 11a58dd4b0 Merge branch 'MDL-69394-310' of git://github.com/junpataleta/moodle into MOODLE_310_STABLE 2020-09-01 06:45:12 +02:00
Andrew Nicols 0713666486 Merge branch 'MDL-69507_310' of https://github.com/timhunt/moodle into MOODLE_310_STABLE 2020-09-01 11:15:55 +08:00
Andrew Nicols 260e9753d4 Merge branch 'MDL-69387-310-2' of git://github.com/junpataleta/moodle into MOODLE_310_STABLE 2020-09-01 10:59:37 +08:00
Sara Arjona e83fad7382 Merge branch 'MDL-38350-m310' of https://github.com/sammarshallou/moodle into MOODLE_310_STABLE 2020-09-01 07:28:40 +08:00
Andrew Nicols c7e5431086 Merge branch 'MDL-69505-310' of https://github.com/snake/moodle into MOODLE_310_STABLE 2020-09-01 07:28:27 +08:00
Andrew Nicols 10ba6d0aa1 Merge branch 'MDL-69270-310' of git://github.com/ferranrecio/moodle into MOODLE_310_STABLE 2020-09-01 07:28:27 +08:00
Andrew Nicols a4f4cbf095 MDL-69269 contentbank: Fix issues identified in integration 2020-09-01 07:28:27 +08:00
Andrew Nicols 66c757f689 Merge branch 'MDL-69269-310' of git://github.com/sarjona/moodle into MOODLE_310_STABLE 2020-09-01 07:28:27 +08:00
Andrew Nicols 2f7236aa3c Merge branch 'MDL-68569-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-09-01 07:28:26 +08:00
Andrew Nicols a704b87f8b Merge branch 'MDL-56595-310' of https://github.com/paulholden/moodle into MOODLE_310_STABLE 2020-09-01 07:28:26 +08:00
Luca Bösch 59f48908aa MDL-51709 gradebook: Name display in single view. 2020-08-31 17:58:53 +02:00
Shamim Rezaie e6f0b5a3a3 MDL-69116 qtype_multichoice: accessibility improvement
- Screen-readers should not see 'clear my choice' when it is not visible
- 'clear my choice' option should only become visible when a choice is
selected
2020-08-31 23:53:54 +10:00
Shamim Rezaie 7a85cc6d2e MDL-69116 qtype_mutichoice: Use label for the "clear my choice" link 2020-08-31 23:53:54 +10:00
Bas Brands 3d08c7d396 MDL-69069 theme_boost: color contrast for custom alerts 2020-08-31 08:21:27 +02:00
Nathan Nguyen f809bca508 MDL-33981 repository_equella: support internal copy 2020-08-31 10:39:49 +08:00
Jake Dallimore fbcc91236e MDL-69505 core_form: fix js min/max date restriction in dateselector
This was using the yui2-calendar attribute, not the yui 3 attribute.
2020-08-31 07:57:50 +08:00
Ferran Recio 2dab18e681 MDL-69270 contentbank: replace content with file 2020-08-28 17:59:18 +02:00
Ferran Recio 3565a77362 MDL-68892 mod_h5pactivity: add required to package 2020-08-28 17:50:40 +02:00
Gareth Barnard cbecc140f7 MDL-69491 themes: No 'fontsize' setting in Boost causes unit conflict. 2020-08-28 14:14:38 +01:00
Sara Arjona c3a4859c7d MDL-69269 contentbank: add support to download content 2020-08-28 12:29:03 +02:00
Sara Arjona 330ba8cb10 MDL-69174 h5p: add component to the embed H5P code
When the Moodle component is passed to the player, xAPI tracking
is enabled so, if the component implements required xAPI API methods
(for instance, mod_h5pactivity does), grades and responses are sent.
Adding this component to the embed code will help to add
the embed code from a mod_h5pactivity to any other place (such as label,
page or book), and being able to track the responses to the original
mod_h5pactivity.
2020-08-28 12:26:38 +02:00
Marina Glancy 4e32add0ac MDL-55340 mod_feedback: export question labels
This was present in export in 3.0 but got lost during export
refactoring in 3.1
2020-08-28 12:25:09 +02:00
Eric Merrill e48fecc679 MDL-69112 assign: Improve parsing of uploaded feedback names 2020-08-28 13:29:20 +08:00
Nathan Nguyen d7113bee4e MDL-68680 core_grades: check grade item before trigger delete event 2020-08-28 11:40:31 +10:00
Paul Holden 61ce84f178 MDL-56595 tool_usertours: set page params when configuring tours/steps. 2020-08-27 23:08:15 +01:00
Tim Hunt e3bfcb1cde MDL-69246 questions: allow for float issues when validating manual marks
As well as fixing the bug, I also rewrote the test to use
data providers, which should lead to more useful failure messages.

And, I moved the magic number we used as the float tolerence to
be a named constant.
2020-08-27 17:39:15 +01:00
Sara Arjona 4a6a2636a0 weekly release 3.10dev 2020-08-27 17:36:21 +02:00
Jun Pataleta 09646d7b53 MDL-69262 core: Use core/action_menu_link in core/action_menu_trigger
* Introduce the "actionmenulinkclasses" block in the action_menu_link
template so other templates importing it can have the option to override
its classes.
* Have the action menu trigger template use the action menu link
template to reduce code duplication.
2020-08-27 13:30:32 +08:00
Jun Pataleta 9211552660 MDL-69262 core: Make instance count variable as a static class variable
With the static function variable $instance, calls to
\action_menu_link::export_for_template() from its subclasses are stored
in different variables. This causes duplicate IDs when different
implementations of action menu links are rendered on the action menu
trigger/link template. (e.g. action_menu_link and
action_menu_link_secondary both rendered on the same page).
To make the incrementing uniform for the action_menu_link class and its
implementations, the $instance variable is moved out of the
export_to_template() method and is now made to a static class variable.
2020-08-27 13:30:32 +08:00
Andrew Nicols f51678c56a Merge branch 'MOODLE_310_MDL-67211_v6' of https://github.com/golenkovm/moodle into MOODLE_310_STABLE 2020-08-27 12:48:33 +08:00
Mihail Geshoski fa3b387185 MDL-69458 report_insights: Respect perpage value in pagination bar 2020-08-27 12:42:57 +08:00
Adrian Greeve dddff390da Merge branch 'MDL-69479-310' of git://github.com/mihailges/moodle into MOODLE_310_STABLE 2020-08-27 11:40:11 +08:00
Andrew Nicols 6bcc070827 Merge branch 'MDL-69501-310-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_310_STABLE 2020-08-27 11:30:53 +08:00
eWallah e1e362b7ff MDL-67413 competencies: do nothing upon activity completion 2020-08-27 11:11:08 +08:00
Mikhail Golenkov ae12edc741 MDL-67211 phpunit: Do not test the order of the running adhoc tasks. 2020-08-27 13:03:49 +10:00
Mikhail Golenkov 5934444b27 MDL-69358 backup: Do not clean up records for incomplete adhoc tasks.
Co-authored-by: Heena Agheda <heenaagheda@catalyst-au.net>
2020-08-27 10:57:48 +08:00
Andrew Nicols c187594e5b Merge branch 'MDL-66810-310' of git://github.com/peterRd/moodle into MOODLE_310_STABLE 2020-08-27 10:23:25 +08:00
Justin Hunt f9f0f1cc26 MDL-66810 mod_lti: Reinstate deprecated default permissions on iframe
microphone, webcam, camera, midi, encrypted-media, geolocation
2020-08-27 09:44:47 +08:00
Andrew Nicols f0b7948c96 MDL-66222 report_antivirus: Correct version number 2020-08-27 09:44:24 +08:00
Andrew Nicols 3114d04721 Merge branch 'MDL-66222-antivirus-reporting' of https://github.com/Peterburnett/moodle into MOODLE_310_STABLE 2020-08-27 09:36:33 +08:00
Adrian Greeve e78b9f9574 Merge branch 'MDL-69419-310' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-08-27 08:08:07 +08:00
Sara Arjona b0d96c297b Merge branch 'MDL-69389-310' of git://github.com/junpataleta/moodle into MOODLE_310_STABLE 2020-08-26 18:02:55 +02:00
Bas Brands 54d32ce4a9 MDL-69114 theme_boost: improve the color contrast for .*-info classes 2020-08-26 16:28:34 +02:00
Andrew Nicols 71f44b0611 Merge branch 'MOODLE_310_MDL-69307_v4' of https://github.com/golenkovm/moodle into MOODLE_310_STABLE 2020-08-26 15:03:01 +08:00
Mikhail Golenkov b8a0258357 MDL-69307 restore: Add CLI script to restore a course.
Co-authored-by: Matt Porritt <mattp@catalyst-au.net>
2020-08-26 14:39:41 +10:00
Jun Pataleta db8fea04f5 MDL-69389 auth: Add wcag141 test for the login page accessibility test 2020-08-26 11:05:27 +08:00
Jun Pataleta 227281d355 MDL-69389 theme_classic: Make default body font colour darker
Links and normal text should have at least a colour contrast ratio
of 3:1. To achieve this, $body-color will be using the darker
shade of gray $gray-900 (#212529).
2020-08-26 11:05:27 +08:00
Jun Pataleta fb6460ca98 MDL-69389 theme_boost: Make default body font colour darker
Links and normal text should have at least a colour contrast ratio
of 3:1. To achieve this, $body-color will be using the darker
shade of gray $gray-900 (#212529).
2020-08-26 11:05:27 +08:00
Jun Pataleta 424c5df1eb MDL-69387 pix: Create PNG versions of the darkened completion icons
Thanks to Barbara Ramiro <barbara@moodle.com> for the help in
generating these PNG versions of the darkened completion icons!
2020-08-26 11:03:06 +08:00
Jun Pataleta 64c4074699 MDL-69387 pix: Darken completion icons
Darkened the fills of completion icons in order to meet the required
minimum contrast ratio of 3:1.
* Changed gray fills (#999) to #949494.
* Changed blue fills (#76A1F0) to #6393ee
* Changed green fills (#9C3) to #79a128

Thanks to Barbara Ramiro <barbara@moodle.com> for the help in
updating the SVG icons!
2020-08-26 11:03:06 +08:00
Jun Pataleta b4ab127434 MDL-69394 calendar: Fix event colour indicator contrast
* Darkened the link and clickable icon colours inside coloured events.
* Added borders around event colour indicators inside the month-view of
  the calendar for better contrast against the white background.
2020-08-26 11:00:22 +08:00
Andrew Nicols 4d03cc37b2 MDL-69419 core: Task reset tests cannot use random test times
If a scheduled task which uses a 'R' field is picked, then the reset of
updated task times will not necessarily be correctly determined as the
randomisation is picked during reset.

This can lead to some random test failures.

Actively specifying a test which does not make use of the 'R' random
field time addresses this issue.
2020-08-26 09:58:22 +08:00
Andrew Nicols 195e7c9cf1 Merge branch 'MOODLE_310_MDL-67211_v6' of https://github.com/golenkovm/moodle into MOODLE_310_STABLE 2020-08-26 09:41:07 +08:00
Paul Holden 1ffb6b09ee MDL-55971 dataformat: method to write exports to file storage. 2020-08-25 17:30:51 +01:00
Paul Holden 06411e3689 MDL-68569 customfield_select: get field options via instance method.
Deprecate the previous static method, which was only called from
instantiated field classes.
2020-08-25 15:08:12 +01:00
Mikhail Golenkov e419e18f0d MDL-67211 Tasks: Add cron_enabled setting.
Co-authored-by: Sam Marshall <s.marshall@open.ac.uk>
2020-08-25 17:01:00 +10:00
Mikhail Golenkov 3263daba84 MDL-67211 Tasks: Front-end to display currently running tasks.
Co-authored-by: Sam Marshall <s.marshall@open.ac.uk>
2020-08-25 17:00:46 +10:00
Mikhail Golenkov 59a5923924 MDL-67211 Tasks: Record when a task is running.
Co-authored-by: Sam Marshall <s.marshall@open.ac.uk>
2020-08-25 16:59:47 +10:00
Andrew Nicols f2602288eb MDL-69464 core_output: Whitespace fix 2020-08-25 13:22:36 +08:00
Marina Glancy 4413ca209f MDL-69464 core_output: allow to avoid formatting in page->set_heading 2020-08-25 13:22:36 +08:00
Adrian Greeve 427f046cff Merge branch 'MDL-68921-310' of git://github.com/vmdef/moodle into MOODLE_310_STABLE 2020-08-25 09:43:31 +08:00
Victor Deniz Falcon e29edbe89e MDL-68921 core_h5p: Add H5P libraries metadata settings
An upgrade step updates installed H5P libraries
2020-08-25 00:30:02 +01:00
Helen Foster e9df0c43bc MDL-69501 lang: Import fixed English strings (en_fix) 2020-08-24 09:53:02 +02:00
Neill Magill d71659dd6d MDL-64525 comments: Should not be able to delete frozen comments
Before this change in a frozen context a user would be able to delete
their own comments.

After this change a user will only be able to delete their own comments
if they still have the capability to post new comments or the capability
to delete comments from any user.
2020-08-24 08:00:10 +01:00
Neill Magill fb6c682850 MDL-64525 comments: Tests for deleting frozen comments 2020-08-24 08:00:10 +01:00
Mihail Geshoski 356a8ee948 MDL-69479 core: Change 4.0 to 3.10 in theme/upgrade.txt 2020-08-24 14:08:46 +08:00
Eloy Lafuente (stronk7) fe9ecef92b MDL-69479 upgrade: Change all 4.0 occurrences to 3.10
Under parallel development, when something is worth being commented
in upgrade.txt notes, it will be applied to all the development branches
using the "earliest" one to be released. So, if something changes
in 3.10 (and also is applied to master), the upgrade.txt notes will
show 3.10 in both branches.

Of course, if something only goes to one dev branch (say master), then the
master version will be used in the notes (4.0 in this case).
2020-08-24 14:08:46 +08:00
Paul Holden 9c1f7874d8 MDL-69493 cohort: remove escaping of return URL params. 2020-08-22 17:09:23 +02:00
Eloy Lafuente (stronk7) 96fac6d9ce weekly release 3.10dev 2020-08-21 20:42:59 +02:00
Adrian Greeve 4b327e1109 MDL-68683 competencies: Update previous bad bump update.
I made a mistake with the previous version bump and updated the
line below what I should have changed. This fixes it to the
intended version numbers.
2020-08-21 14:41:09 +08:00
Jun Pataleta f649cd722f Merge branch 'MDL-66818-310' of git://github.com/andrewnicols/moodle into MOODLE_310_STABLE 2020-08-21 11:32:21 +08:00
Peter Burnett 8e0e99e4fd MDL-66222 antivirus: Improved error email capture 2020-08-21 12:21:09 +10:00
Nathan Nguyen adbe92ce0a MDL-66222 antivirus: Added antivirus failure reporting 2020-08-21 11:43:56 +10:00
Andrew Nicols 03e84b68a1 MDL-66818 mod_forum: Use cap manager to check exportability 2020-08-21 08:17:01 +08:00
Andrew Nicols 51dc7d230f MDL-42434 chat: Disable stylelint important check 2020-08-21 07:39:24 +08:00
Sara Arjona 1044e94507 MDL-42434 mod_chat: styles for chat themes to view help-icon properly
The styles for the bubble and the compact themes have been reviewed
because there weren't enough contrast for the help icon.
2020-08-20 23:44:48 +01:00
Sara Arjona c4303bba51 MDL-42434 mod_chat: display the whole help text
When testing this issue was raised that the help text was cut-off.
This patch should fix this issue changing the placement from
right/left to top.
2020-08-20 23:44:47 +01:00
Andrew Nicols 9d32114bf6 MDL-68705 testing: New CLI args to disable composer features
This commit introduces the following new flags:

  --no-composer-self-update   Disable composer self-update of the
                              composer.phar utility

  --no-composer-upgrade       Disable upgrade of development
                              dependencies using Composer.

  --disable-composer          Disable both composer self-update and
                              composer upgrade
2020-08-20 20:14:54 +02:00
Andrew Nicols 8ddb17b641 MDL-68705 testing: Allow composer updates to be disabled 2020-08-20 20:14:50 +02:00
sam marshall 30990ac512 MDL-38350 Lib: Rename directory before removing it, to reduce races 2020-08-20 16:57:06 +01:00
Tim Hunt 0c6f661def MDL-69507 duration form field: should return an int number of seconds 2020-08-20 11:31:28 +01:00
Tim Hunt 24d0335a0a MDL-69507 duration form field: modernise coding style 2020-08-20 11:31:28 +01:00
Sara Arjona 52836faa5b MDL-69055 core_badges: display password/oauth fields properly 2020-08-20 12:01:49 +08:00
Peter Burnett 64f64e44d8 MDL-69486 webservices: Added user and grade idnumber to grade items 2020-08-20 11:59:41 +08:00
carlos a133b89976 MDL-69375 mod_lti: Fix Names and Roles Link header format
- Changed line 469 of memberships.php to build Link header according to the Web Linking specification RFC8288.
2020-08-20 11:50:54 +08:00
Ferran Recio 93fec2c58c MDL-68964 mod_chat: fix theme param 2020-08-20 11:41:10 +08:00
Sara Arjona 3db6d44feb MDL-42434 mod_chat: add again the usingchat help icon
In Moodle 2.4 the help icon displayed in the chat window was
removed. It has been added to gui_ajax and gui_basic in order to help users.
2020-08-20 11:23:03 +08:00
Adrian Greeve 83aa08c7e1 MDL-68683 competencies: Fix bad version bump. 2020-08-20 11:01:31 +08:00
Simey Lameze 79082f8b6b MDL-68683 competencies: fix query to delete stale files 2020-08-20 10:21:00 +08:00
Paul Holden 544c7d68b6 MDL-69449 block_timeline: use dayslimit context data in template.
Ensures the correct value is used when initially rendering the
course timeline.
2020-08-20 09:24:46 +08:00
Bas Brands 699a82df1a MDL-68889 block_recentlyaccessedcourses: small viewport issues
- on small devices the recentlyaccessedcourses does not show any courses
2020-08-20 09:16:38 +08:00
Peter Burnett d369c098be MDL-69170 task: Added timecreated field to adhoc task table 2020-08-20 08:50:42 +08:00
Sara Arjona 191448afc5 MDL-68975 contentbank: add author field to file details view 2020-08-20 08:42:20 +08:00
Eloy Lafuente (stronk7) 606fbca6b4 MDL-67415 environment: change requirements
- mysql requirement up to 5.7
- postgres requirement up to 9.6
2020-08-20 08:29:43 +08:00
Eloy Lafuente (stronk7) 050eb97c33 MDL-67415 environment: 3.10 base information
This is a direct copy of the 3.9 branch to have
changes under control easier for next commits.
2020-08-20 08:29:43 +08:00
Simey Lameze f6f824597a MDL-66818 mod_forum: remove unnecessary behat steps 2020-08-20 08:16:49 +08:00
gthomas2 f2b4fba61e MDL-66818 mod_forum: hide portfolio export button based on caps 2020-08-20 08:16:49 +08:00
Paul Holden 3a394dd671 MDL-66900 course: don't clean category description when editing. 2020-08-20 07:54:13 +08:00
Sara Arjona 98480b3932 MDL-69473 contentbank: change incorrect ref to size in type column 2020-08-20 07:43:56 +08:00
Eloy Lafuente (stronk7) e010b2e75c MDL-69271 auth_ldap: Don't assume any ordering, just verify matches
Both ldap or the DB can return information in a non-consistent
ordering leading to events to be generated in different order.

And current tests are, right now, assuming a given order.

Note this is a rare random, but it's happening, so better
fix it, see the issue for some more details.

So we just do the tests ordering immune, verifying that all the
expected events have been triggered and done. Irrespectively of their order.
2020-08-20 07:35:59 +08:00
Sara Arjona aa3a9c7895 MDL-69054 core_badges: allow editing OBv1.0 backpacks 2020-08-20 07:31:48 +08:00
Sara Arjona f075ec01ca MDL-61215 core_user: use the new optimised_image filetype group
For the user profile picture (instead of the web_image which includes
SVG files).
2020-08-20 07:16:41 +08:00
Sara Arjona c4c770f48c MDL-61215 core_badges: use the new optimised_image filetype group
For the badge picture (instead of the web_image which includes
SVG files).
2020-08-20 07:16:41 +08:00
Sara Arjona 24ce9b8a10 MDL-61215 core_files: add new optimised_image group
Currently, PHP getimagesize method doesn't support SVG images.
As some features, such as badges, processs and optimise the images
before using them, a new filetype group has been created to exclude
SVG from there: optimised_image.
SVG can't be removed from web_image because then users won't be
able to add SVG images to their courses using labels, pages...
2020-08-20 07:16:41 +08:00
Mihail Geshoski adebc5f811 MDL-69401 book: Limit character length in chapter title 2020-08-20 07:03:24 +08:00
Peter Dias afc19a201c MDL-69297 assign: Check whether there is content for a submission
Confirm there is some content to be submitted for an assignment when processing it.
2020-08-19 23:42:27 +01:00
Sam Hemelryk 04073c7e31 MDL-68896 mod_scorm: improved sendBeacon use when unloading 2020-08-19 20:30:17 +12:00
Peter Dias aa7707cd52 MDL-66665 assign: Check whether a modified user could actually grade 2020-08-19 14:27:59 +08:00
Simey Lameze 676c840c5c MDL-68683 competencies: step to delete orphaned evidence files 2020-08-19 12:55:53 +08:00
Simey Lameze 1222c2125e MDL-68683 core: fix DML exception on upgrade step 2020-08-19 12:55:35 +08:00
Simey Lameze 776b4a85d1 MDL-26401 group: add delimiter and encoding fields to import 2020-08-19 11:11:14 +08:00
Amaia Anabitarte 29fe254b17 MDL-69089 core_contentbank: Empty content names are not allowed 2020-08-19 10:51:58 +08:00
Adrian Greeve bf84a08900 Merge branch 'MDL-69475_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2020-08-19 10:42:51 +08:00
Simey Lameze 97043c76b7 MDL-26401 group: change import to use csv_import_reader class 2020-08-19 08:51:32 +08:00
Andrew Nicols c1813ed818 MDL-67735 theme_boost: Fix incorrect whitespace 2020-08-19 08:39:15 +08:00
Bas Brands 49f1803c9d MDL-67735 theme_boost: remove bs2 and bs4alpha compatibility css 2020-08-19 08:29:50 +08:00
Amaia Anabitarte 157f8a87b4 MDL-69089 core_contentbank: Tests for empty content names 2020-08-19 08:19:44 +08:00
Leon Stringer c66bf80bd8 MDL-65847 auth_db: user_update() handle errors
The external database authentication plugin (auth_db) can update the
external database if mapped fields are set to Update external: On
update.  This change adds error handling in case this update fails.
2020-08-19 00:36:21 +02:00
Juan Leyva ad25efc776 MDL-69095 tool_mobile: Display warning if not allowed to use qr login 2020-08-19 00:20:54 +02:00
Juan Leyva 1019a2b5ba MDL-69095 tool_mobile: Avoid non-https sites using qrlogin by default 2020-08-19 00:20:54 +02:00
Matt Davidson 7404858689 MDL-63375 workshop: fix rubric grid view 2020-08-19 00:13:54 +02:00
Shamim Rezaie 7b313f407a MDL-68444 calendar: Improve how screenreaders say week titles
Also removed the scope attribute from the mini-calendar table
because according to https://www.w3.org/TR/WCAG20-TECHS/H63.html
it was not needed:
  Note 1: For simple tables that have the headers in the first row
  or column then it is sufficient to simply use the TH elements without
  scope.
2020-08-18 19:13:37 +02:00
Shamim Rezaie 931fc89e13 MDL-68444 calendar: Improve how screenreaders read day titles
Screenreaders now know if each day has any event or not
2020-08-18 19:13:27 +02:00
Mathew May fbbfe9aa00 MDL-68928 core_course: Select activity chooser footer 2020-08-18 19:02:25 +02:00
Victor Deniz Falcon b81952a23d Merge branch 'MDL-69477_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2020-08-18 12:48:09 +01:00
Eloy Lafuente (stronk7) 12ffcc5097 MDL-69475 backup: Proper handling of backup::RELEASE versions
1) Remove any floatval() casting. They are breaking / killing
   .10 versions (converting them to .1). Since Moodle 2.0 all the
   backup::RELEASE have been 100% numerical values.
2) Use version_compare() always to compare backup::RELEASE values.
   They are always versions and the function is aware of versions
   > .9, able to clean/ignore alpha chars... and everything else.

Note that I've also changed a couple of cases in formats (topics and
weeks) that were correct, but just added the same comment and used
the same version_compare() comparison parameters style, so all uses
in core are consistent (and safe to be copied out there).
2020-08-18 12:49:20 +02:00
Andrew Nicols bd1eaea02b MDL-69273 travis: Use exttests for https too 2020-08-18 10:59:13 +02:00
Andrew Nicols 99a8358b85 MDL-69273 travis: Move exttests check to after_script
The result of the final command `script` phase determines the build
result.

The cleanup belongs in the `after_script` phase.
2020-08-18 10:59:13 +02:00
Eloy Lafuente (stronk7) 0a352c4790 MDL-69477 install: Ensure CFG variables are set before using them
On installation (or also phpunit/behat unit) some CFG variables
were being used (on setting validation) before being set.

So this commit just verifies they are set before using them. Note that,
strictly speaking, only one of them ($CFG->searchenginequeryonly)
required the extra check, but I think it's better to apply it to all
them, as a reference and in case validations are run in any other order.
2020-08-17 10:53:38 +02:00
Nadav Kavalerchik 67dfb55d49 MDL-69414 qtype/ddimageortext: Fix dropzones display in RTL mode 2020-08-17 14:53:20 +08:00
Mihail Geshoski 12bd4bc5ad MDL-67943 core: Update timezone list in core_date 2020-08-17 10:36:01 +08:00
Adrian Greeve 22ec6995ea Merge branch 'MDL-69475_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE 2020-08-17 09:49:54 +08:00
Eloy Lafuente (stronk7) ae3af1d860 MDL-69475 install: Version, env. and minimal changes before branching
- Also bump travis to get builds against 310_STABLE.
- And backup release to match 3.10

Note this doesn't aim to be a complete change-set, but just the
minimum to switch to 3-digit $branches and keep installation, checks
and tests running and passing.
2020-08-17 00:12:30 +02:00
Andrew Nicols a0fc902eb1 weekly release 4.0dev 2020-08-14 14:42:18 +08:00
Andrew Nicols d665dec78e NOBUG: Fixed SVG browser compatibility 2020-08-14 14:42:17 +08:00
Andrew Nicols a059ec19b9 Merge branch 'MDL-68666-master' of git://github.com/bmbrands/moodle 2020-08-13 15:20:03 +08:00
Bas Brands 9e8cfc0235 MDL-68666 core_pix: add missing fallback icons 2020-08-13 08:47:56 +02:00
Andrew Nicols e0f91914a7 Merge branch 'MDL-69253' of https://github.com/timhunt/moodle 2020-08-13 11:50:09 +08:00
Andrew Nicols 39229f3cbd Merge branch 'MDL-60492-tagcloud_html' of https://github.com/leonstr/moodle 2020-08-13 11:44:13 +08:00
Andrew Nicols 7213b650ee Merge branch 'MDL-69381' of https://github.com/marinaglancy/moodle 2020-08-13 11:28:09 +08:00
Adrian Greeve b713aa80b4 Merge branch 'MDL-68423-master' of git://github.com/ferranrecio/moodle 2020-08-13 11:02:04 +08:00
Andrew Nicols 8bec7c109d Merge branch 'MDL-68932-master' of git://github.com/rezaies/moodle 2020-08-13 10:51:59 +08:00
Andrew Nicols 1736d2e66f Merge branch 'MDL-69421-master' of git://github.com/noeldemartin/moodle 2020-08-13 09:35:37 +08:00
Andrew Nicols 5a3e92e76c Merge branch 'MDL-67991-master' of git://github.com/aanabit/moodle 2020-08-13 08:54:35 +08:00
Andrew Nicols dec6eebdaa Merge branch 'MDL-69241-master' of git://github.com/mickhawkins/moodle 2020-08-13 08:27:01 +08:00
Andrew Nicols 48e5fbe1f5 Merge branch 'MDL-67708-master' of git://github.com/vmdef/moodle 2020-08-13 08:11:09 +08:00
Andrew Nicols c59247e1e8 Merge branch 'MDL-60260' of https://github.com/paulholden/moodle 2020-08-13 07:54:26 +08:00
Andrew Nicols f27f995522 Merge branch 'MDL-69143-master' of git://github.com/ferranrecio/moodle 2020-08-13 07:45:16 +08:00
Andrew Nicols 78193d34b4 Merge branch 'MDL-69265-email-headers' of https://github.com/brendanheywood/moodle 2020-08-13 07:28:27 +08:00
Eloy Lafuente (stronk7) d337e7a546 Merge branch 'MDL-68860' of https://github.com/paulholden/moodle into master 2020-08-13 00:55:09 +02:00
Eloy Lafuente (stronk7) 8e29cce41c Merge branch 'MDL-68558-master-plugindepscheckdeadend' of git://github.com/mudrd8mz/moodle into master 2020-08-13 00:40:10 +02:00
Eloy Lafuente (stronk7) 5374c768f3 Merge branch 'MDL-67394' of https://github.com/paulholden/moodle into master 2020-08-13 00:28:51 +02:00
Eloy Lafuente (stronk7) d40cecdb8a Merge branch 'MDL-67002' of https://github.com/timhunt/moodle into master 2020-08-13 00:08:17 +02:00
Eloy Lafuente (stronk7) a470c9064a Merge branch 'master-MDL-66716' of https://github.com/golenkovm/moodle into master 2020-08-12 20:09:40 +02:00
Ferran Recio 5132309170 MDL-69143 contentbank: catching Exception on file upload 2020-08-12 16:57:17 +02:00
Brendan Heywood 0f89884980 MDL-69265 email: Add admin setting for email headers 2020-08-12 20:51:10 +10:00
Andrew Nicols 08b8b76655 Merge branch 'MDL-69356' of https://github.com/stronk7/moodle 2020-08-12 14:00:44 +08:00
Andrew Nicols 12403bc004 Merge branch 'MDL-68618' of https://github.com/paulholden/moodle 2020-08-12 13:39:20 +08:00
Andrew Nicols b7146cdff9 Merge branch 'MDL-69353' of https://github.com/paulholden/moodle 2020-08-12 11:21:48 +08:00
Andrew Nicols 452497da41 Merge branch 'MDL-68334-master' of git://github.com/lucaboesch/moodle 2020-08-12 11:05:54 +08:00
Andrew Nicols 6c772c3b60 Merge branch 'MDL-69296' of https://github.com/NeillM/moodle 2020-08-12 10:27:55 +08:00
Andrew Nicols d6c8f14ed9 Merge branch 'MDL-68731' of https://github.com/jonof/moodle 2020-08-12 08:32:00 +08:00
Eloy Lafuente (stronk7) 62a7d2b5de Merge branch 'MDL-68729-master' of https://github.com/sammarshallou/moodle into master 2020-08-12 01:28:51 +02:00
Andrew Nicols 2a247aab70 Merge branch 'MDL-69143-master' of git://github.com/ferranrecio/moodle 2020-08-11 14:33:44 +08:00
Andrew Nicols d689b2e029 Merge branch 'MDL-69168_recently-accessed-items-block-uses-stock-lti-icon__master' of https://github.com/stopfstedt/moodle 2020-08-11 12:59:49 +08:00
Adrian Greeve b4f6fe06fd Merge branch 'MDL-69204' of https://github.com/paulholden/moodle 2020-08-11 08:42:02 +08:00
Andrew Nicols 7a6ea323e4 Merge branch 'MDL-64818_master' of git://github.com/gjb2048/moodle 2020-08-10 18:54:30 +08:00
Paul Holden e9a5485f3e MDL-68618 mod_forum: stop reverting idnumber when updating instance. 2020-08-10 09:11:02 +01:00
Paul Holden 36a34b89f6 MDL-68860 mod_lti: Oracle support for retrieving shared secrets.
Thanks to Mark van Hoek!
2020-08-10 09:05:58 +01:00
Mikhail Golenkov 1c3cd955ea MDL-66716 block_timeline: Group events by usermidnight event property. 2020-08-10 11:36:29 +10:00
Mikhail Golenkov 364d4caeec MDL-66716 calendar: Add usermidnight property for events. 2020-08-10 11:36:29 +10:00
Adrian Greeve e9d5a2b0a8 Merge branch 'MDL-60493-grader_span_tag' of https://github.com/leonstr/moodle 2020-08-10 09:20:50 +08:00
Luca Bösch 4994817908 MDL-68334 user: Display name in footer as elsewhere. 2020-08-08 10:38:56 +02:00
Stefan Topfstedt 82e868fd38 MDL-69168 block_recentlyaccesseditems: apply custom icon
Overwrite the default mod icon with the configured icon url if
applicable.
2020-08-07 09:14:01 -07:00
Gareth Barnard da4ded8a16 MDL-64818 blocks: blocks_for_region() is inefficient. 2020-08-07 13:58:35 +01:00
Amaia Anabitarte e68850295f MDL-67991 availability: Fix access restrictions labels 2020-08-07 10:02:37 +02:00
Michael Hawkins bb32174261 MDL-69241 lib: Reset dynamic tables to page 1 when filtering or sorting
This ensures consistency and that the page will always exist, which may
not be true for later pages if applying filters returns fewer results.
2020-08-07 12:51:49 +08:00
Eloy Lafuente (stronk7) 27738e1c07 MDL-69356 unit tests: make some assertions dir separator agnostic 2020-08-07 02:09:15 +02:00
Eloy Lafuente (stronk7) a7d9b53e72 weekly release 4.0dev 2020-08-06 20:51:18 +02:00
sam marshall 679e8d8b66 MDL-68729 Search: Allow query on one server while indexing another
To support transitions from one search engine to a different one, or
to a different installation of the same kind, this feature allows for
queries to use a different search engine from indexing. So you can
reindex (and do all other search operation) on one server, while
user queries are unaffected on a different server.

This feature supports changing between search engine types, and also
between two Solr installations.
2020-08-06 12:12:01 +01:00
sam marshall b58009596f MDL-68729 Admin: Allow validation of admin_setting_configselect
The admin_setting_configselect admin setting did not support validation.
It was possible to validate only by using a subclass.

This change allows validation by a callback function. It also makes it
slightly easier to handle validation in a subclass if you want to do
that.

The main advantage is for cases where a setting is not generic but
is only ever going to be required in one place, and it creates
unnecessary clutter to make a new subclass.
2020-08-06 12:12:01 +01:00
Noel De Martin b421039a5c MDL-69421 behat: Revert app behat navigation to call session visit 2020-08-06 12:08:43 +02:00
sam marshall f87597aae3 MDL-68729 Admin: Allow lazy-load of admin_setting_configselect
The admin_setting_configselect admin setting already supported lazy
loading, but this was only available for subclasses. This change
means you can use it directly within the admin setting.

The main advantage is for cases where a setting is not generic but
is only ever going to be required in one place, and it creates
unnecessary clutter to make a new subclass.
2020-08-06 10:52:13 +01:00
Jun Pataleta 0a94e31cf9 Merge branch 'MDL-60501-h4_close_tag' of https://github.com/leonstr/moodle 2020-08-06 12:11:26 +08:00
Jun Pataleta 05cc2df693 Merge branch 'MDL-69111-master' of git://github.com/bmbrands/moodle 2020-08-06 11:37:12 +08:00
Adrian Greeve 61856e5ef5 Merge branch 'MDL-40227-master-1' of git://github.com/peterRd/moodle 2020-08-06 11:25:58 +08:00
Peter 407a666064 MDL-40227 mod_lesson: Use localised float formatting
* Leverage PARAM_LOCALISEDFLOAT
* Store all numbers with standard '.' dec formatting
* Show all numbers based on locale settings
* Behat test to cover different cases using numeric questions and modified locale setting
2020-08-06 10:44:08 +08:00
Adrian Greeve 8a5f125ad7 Merge branch 'MDL-69311' of https://github.com/paulholden/moodle 2020-08-06 09:47:48 +08:00
Jordan Tomkinson ef8dff0565 MDL-69207 core_h5p: Add muc cache support for h5p library files 2020-08-06 02:40:24 +01:00
Adrian Greeve e77dc824f5 Merge branch 'master-MDL-66626' of https://github.com/golenkovm/moodle 2020-08-06 09:05:57 +08:00
Eloy Lafuente (stronk7) d55f2b787c Merge branch 'MDL-67687-master-2' of git://github.com/andrewnicols/moodle into master 2020-08-06 00:59:15 +02:00
Eloy Lafuente (stronk7) 4500d4bb3c Merge branch 'MDL-66670-master' of git://github.com/bmbrands/moodle into master 2020-08-06 00:58:20 +02:00
Victor Deniz Falcon 509bb3f351 MDL-67708 theme_boost: Remove tether.js orphaned references
Since version 4.3.1 Bootstrap is not dependent on the Tether library
and is no longer included, but it was still listed as a third party
library.
2020-08-05 13:43:52 +01:00
Leon Stringer fb4c20ee2c MDL-60492 core_tag: Fix title attribute
Attribute 'title' was specified inside a condition but closing `"` was
outside condition possibly resulting in <a href="..." class="..." ">.
Also moved </a> outside of condition to match <a>.
2020-08-05 12:52:09 +01:00
Shamim Rezaie 1e21a0b3d5 MDL-68932 core: showhidesettings to work with multiple hideIf()s 2020-08-05 19:06:08 +10:00
Adrian Greeve 71d61a7c8c Merge branch 'MDL-68647-master-forumprivacysql' of git://github.com/mudrd8mz/moodle 2020-08-05 14:18:24 +08:00
Adrian Greeve 8fcba35fd8 Merge branch 'MDL-60932-master' of git://github.com/aanabit/moodle 2020-08-05 10:07:24 +08:00
Andrew Nicols 39a736ef9a MDL-67687 behat: Login page accessibility ensurance 2020-08-05 07:41:45 +08:00
Eloy Lafuente (stronk7) ff7ec42832 Merge branch 'MDL-67831-master' of git://github.com/bmbrands/moodle into master 2020-08-05 00:45:20 +02:00
Tim Hunt 5516275fda MDL-69253 mod_quiz: unit test for the last commit 2020-08-04 14:37:25 +01:00
Josh Ebarvia 380534b0a1 MDL-69253 mod_quiz: Fix timecreated is 0 when creating a quiz activity 2020-08-04 13:43:45 +01:00
Jun Pataleta acf199345a Merge branch 'MDL-60574_master' of https://github.com/t-schroeder/moodle 2020-08-04 19:51:50 +08:00
Andrew Nicols 41eaa09bbe MDL-67687 behat: Make axe tests optional 2020-08-04 18:56:57 +08:00
Andrew Nicols 9d47a69094 MDL-67687 behat: Add axe web accessibility tool integration 2020-08-04 18:56:06 +08:00
Andrew Nicols 06d486d9a3 MDL-67687 behat: Add axe-core 3.5.5 2020-08-04 18:48:11 +08:00
Andrew Nicols b0e096d870 MDL-67687 cli: Make boolean CLI args negatable 2020-08-04 18:48:11 +08:00
Eloy Lafuente (stronk7) 30a82af15e Merge branch 'MDL-55299-master' of git://github.com/ferranrecio/moodle into master 2020-08-04 12:33:51 +02:00
Jun Pataleta 98579dd7b3 Merge branch 'MDL-69336-master' of git://github.com/mickhawkins/moodle 2020-08-04 16:54:34 +08:00
Tim Schroeder 95fc9d9399 MDL-60574 atto_undo: fixed redo erasing content
When you'd hit ctrl-y with nothing on the redo stack the entire
content of Atto would get deleted with no way of getting it back.
2020-08-04 09:24:15 +02:00
Michael Hawkins bd40419f2f MDL-69336 lib: Correctly return promises when table show/hide columns
Previously showColumn and HideColumn were returning nothing, so
attempts to catch exceptions were themselves throwing errors in the
browser console.
2020-08-04 15:18:39 +08:00
Michael Hawkins c2f188311e MDL-69336 lib: Reinstating tablelib column show/hide functionality
Also added behat testing for hide/show columns in participants table.
2020-08-04 15:18:39 +08:00
Eloy Lafuente (stronk7) c39b0d178c Merge branch 'MDL-69367' of https://github.com/paulholden/moodle into master 2020-08-03 16:26:59 +02:00
Eloy Lafuente (stronk7) 390512db4f Merge branch 'MDL-62980' of https://github.com/paulholden/moodle into master 2020-08-03 12:37:46 +02:00
Marina Glancy 6bc7645868 MDL-69381 core_backup: make progressbar selector more specific 2020-07-31 13:28:24 +02:00
Amaia Anabitarte becb9e8579 MDL-60932 core_user: Fix docs link for participants page
Co-authored by: David Mudrák <david@moodle.com>
2020-07-31 10:29:56 +02:00
Neill Magill e7008d4686 MDL-69296 resource: Pressing cancel should always exit settings form
Before this change if a user used navigated to a resource activity
from another activity and then edited the settings it was likely
that using the cancel button would result in file downloading,
rather than being returned to their last page.

After this change the user will be back on the page they came from.
2020-07-31 07:56:54 +01:00
Paul Holden 42fcf7d5da MDL-67394 dml: improve thrown exception when Oracle can't parse query. 2020-07-30 16:21:01 +01:00
Victor Deniz Falcon 07238ca511 weekly release 4.0dev 2020-07-30 12:53:40 +01:00
Victor Deniz Falcon f9c0d58da6 Merge branch 'install_master' of https://git.in.moodle.com/amosbot/moodle-install 2020-07-30 12:53:34 +01:00
Jun Pataleta 4a4905356c Merge branch 'MDL-68390-master' of git://github.com/andrewnicols/moodle 2020-07-30 11:42:53 +08:00
Andrew Nicols 7c56d5589d MDL-68390 tool_usertours: Update to use aria-hidden module 2020-07-30 11:36:23 +08:00
Jun Pataleta adcd69e11f Merge branch 'MDL-65923-40-core_grades_add_gradeitem_deleted_event' of https://github.com/tomdickman/moodle 2020-07-30 09:57:57 +08:00
Eloy Lafuente (stronk7) c39e659a33 Merge branch 'MDL-37745-master' of git://github.com/lucaboesch/moodle into master 2020-07-30 01:01:47 +02:00
Eloy Lafuente (stronk7) 8d1785fec5 Merge branch 'MDL-63252-master' of git://github.com/lameze/moodle into master 2020-07-30 00:47:40 +02:00
Tom Dickman 68049ac848 MDL-65923 core grades: Add a new event for when a grade item is deleted 2020-07-30 08:18:59 +10:00
Victor Deniz Falcon f8c999616a Merge branch 'MDL-66707-master' of git://github.com/rezaies/moodle 2020-07-29 22:36:49 +01:00
Victor Deniz Falcon 0bafd769ec Merge branch 'MDL-68968-master' of git://github.com/lameze/moodle 2020-07-29 22:01:06 +01:00
Paul Holden 9dbb05ffe0 MDL-60260 course: validate external fields on create/update course.
Ensure course fullname/shortname fields are not empty.
2020-07-29 19:57:16 +01:00
Victor Deniz Falcon fdf7db9502 Merge branch 'MDL-68706' of https://github.com/paulholden/moodle 2020-07-29 19:03:10 +01:00
Eloy Lafuente (stronk7) f8666013b3 Merge branch 'MDL-68390-master' of git://github.com/andrewnicols/moodle into master 2020-07-29 19:34:45 +02:00
Ferran Recio 910755acf5 MDL-69143 contentbank: fix tests when extra plugins installed 2020-07-29 17:49:50 +02:00
Ferran Recio 3dfbd5a16f MDL-69143 contentbank: add import file method to content 2020-07-29 17:49:50 +02:00
Victor Deniz Falcon 4d0e43ffc5 Merge branch 'MDL-69199-master' of git://github.com/aanabit/moodle 2020-07-29 11:43:32 +01:00
Jun Pataleta 6d685cef62 Merge branch 'MDL-69238-master' of git://github.com/mihailges/moodle 2020-07-29 17:44:12 +08:00
Jonathon Fowler 1ce5dbad41 MDL-68731 forum: fix digests not correctly updating post read statuses 2020-07-29 15:41:42 +10:00
Jun Pataleta 954de4f651 Merge branch 'MDL-69252-close_tag' of https://github.com/leonstr/moodle 2020-07-29 11:17:47 +08:00
Eloy Lafuente (stronk7) 8ab154a5c1 Merge branch 'MDL-69319-master' of https://github.com/snake/moodle 2020-07-29 00:16:09 +02:00
Paul Holden 279d691f58 MDL-69367 quizaccess_seb: correct foreign key table reference. 2020-07-28 13:27:45 +01:00
Leon Stringer fe2e2feef4 MDL-60493 mod_assign: Unused JS variables
Removed unused JavaScript variables fixing CI warning "ESLint error
[no-unused-vars]".
2020-07-28 12:01:26 +01:00
Leon Stringer 5a0fd52e3f MDL-60493 mod_assign: Remove rogue </span>
In the grading interface (/mod/assign/view.php?id=2&action=grader)
there was a rogue </span> with no opening <span>.  Also changed
<span><form> to <div><form> in included template fixing CiBoT HTML
Validation error.
2020-07-28 11:59:55 +01:00
Eloy Lafuente (stronk7) 24ccd6e908 Merge branch 'MDL-68107-master' of git://github.com/bmbrands/moodle 2020-07-28 12:40:04 +02:00
Jun Pataleta fcc5307e64 Merge branch 'MDL-65453-master' of git://github.com/lameze/moodle 2020-07-28 11:42:47 +08:00
Simey Lameze d208ffb0e2 MDL-65453 core: fix behaviour of --skip-database option on install 2020-07-28 11:21:35 +08:00
Paul Holden 5c36644c05 MDL-69204 tool_dataprivacy: summary link only on current user profile. 2020-07-27 17:25:09 +01:00
Jun Pataleta c84b8976e3 Merge branch 'MDL-66755-master' of https://github.com/SergioComeron/moodle 2020-07-27 16:55:34 +08:00
Bas Brands 99ddf538ca MDL-68107 mod_label: make images dropped onto courses responsive 2020-07-27 09:55:43 +02:00
C4ne 4144e278a6 MDL-68107 editor_atto: responsive images for drag and drop 2020-07-27 09:55:33 +02:00
Jun Pataleta a1b2045364 Merge branch 'MDL-69260_master' of git://github.com/adpe/moodle 2020-07-27 10:53:23 +08:00
Mihail Geshoski c4296f77e0 MDL-69238 core: Remove coursecat_sortable_records class 2020-07-27 09:43:16 +08:00
Adrian Greeve 0f70cf0497 Merge branch 'MDL-69079-master-1' of git://github.com/mihailges/moodle 2020-07-27 08:48:58 +08:00
AMOS bot 7c30725f6b Automatically generated installer lang files 2020-07-27 00:07:24 +00:00
AMOS bot 6065090736 Automatically generated installer lang files 2020-07-27 00:07:24 +00:00
Mikhail Golenkov 42f75f5a52 MDL-66626 assignfeedback_editpdf: Check page count for attempt.
Co-Authored-By: John Yao <johnyao@catalyst-au.net>
2020-07-27 09:49:56 +10:00
Mikhail Golenkov 78572f186d MDL-66626 assignfeedback_editpdf: Count files outside of foreach loop.
Co-Authored-By: John Yao <johnyao@catalyst-au.net>
2020-07-27 09:49:56 +10:00
Luca Bösch 84197640eb MDL-37745 mod_choice: Show taken and limit. 2020-07-26 00:08:37 +02:00
AMOS bot fc49ce855a Automatically generated installer lang files 2020-07-25 00:07:48 +00:00
Paul Holden 486d2a35ba MDL-68706 customfield_textarea: allow field content to be cleared. 2020-07-24 13:44:41 +01:00
Paul Holden 15af3240b3 MDL-69353 admin: set page title when prompting for upgrade key. 2020-07-24 13:24:13 +01:00
Tim Hunt 45722f4188 MDL-67002 quiz reports: fix sorting on Oracle in the responses report 2020-07-24 11:42:50 +01:00
Sergio Comerón a1087ef609 MDL-66755 forum: Subscription cancel when edit a message 2020-07-24 09:05:17 +02:00
Mihail Geshoski d6ec2d3e44 MDL-69079 core: Restore and set missing guest user 2020-07-24 11:08:25 +08:00
Mihail Geshoski 7add3440c8 MDL-69079 course: Handle missing guest when fetching recommended modules 2020-07-24 10:33:50 +08:00
Mihail Geshoski 3295288d6e MDL-69079 course: Handle fetch module data failures in activity chooser 2020-07-24 10:33:50 +08:00
Sam Marshall 3d03d2a0d4 MDL-63252 tool_xmldb: convert default to float to avoid false positives 2020-07-24 07:53:19 +08:00
Simey Lameze e3c28dffa3 MDL-68968 core: fix wrong phpdoc on admin_externalpage 2020-07-24 07:42:45 +08:00
Amaia Anabitarte 2d710f35cd MDL-69199 mod_quiz: Show timefinish in user Complete report 2020-07-23 18:53:49 +02:00
Victor Deniz Falcon 94fdac9117 weekly release 4.0dev 2020-07-23 16:10:20 +01:00
Victor Deniz Falcon 1dd722145d Merge branch 'install_master' of https://git.in.moodle.com/amosbot/moodle-install 2020-07-23 16:10:16 +01:00
David Mudrák 9d171793d7 MDL-68558 admin: Allow to go back to plugins check page on failed deps
Once the admin reaches the Plugin dependencies check with a failed
plugin dependency, the "Continue" button should take him/her to the
previous page where the dependency can be sorted out, or the plugin
installation cancelled. Also the "Cancel this installation" should work
on this page, too.

None of this was happening correctly because the page with failed
dependencies is loaded with "confirmplugincheck" set to 1 as a result
of confirming the previous step. We must explicitly override it back to
0 to navigate the user back to the previous step.
2020-07-23 16:54:14 +02:00
Bas Brands 8e039a5662 MDL-67831 core_message: use space available for message index page
- the prevents the message reply box from being out of view when
a user has many conversations.
2020-07-23 11:34:19 +02:00
AMOS bot 990bd11773 Automatically generated installer lang files 2020-07-23 00:07:42 +00:00
Victor Deniz Falcon ddcde1994d Merge branch 'MDL-48391' of https://github.com/paulholden/moodle 2020-07-22 21:51:25 +01:00
Victor Deniz Falcon cf35d0b26e Merge branch 'MDL-65819' of https://github.com/paulholden/moodle 2020-07-22 18:58:23 +01:00
Paul Holden b9a09480b2 MDL-48391 tool_uploadcourse: access checks for configuring enrolments. 2020-07-22 17:52:24 +01:00
Ferran Recio 5025c1ad82 MDL-55299 mod_feedback: fix quoted values donwload 2020-07-22 18:47:37 +02:00
Jun Pataleta 0ea341f14b Merge branch 'MDL-68586-format_topics_code_prechecks' of https://gitlab.com/drlikm/moodle 2020-07-22 23:26:24 +08:00
Jun Pataleta a03e9e0d9d Merge branch 'MDL-68874-db-sql-instrumentation' of https://github.com/brendanheywood/moodle 2020-07-22 18:10:46 +08:00
Paul Holden c1c57e816c MDL-69311 dataformat: correct license docblock.
When this class was implemented in 8844cb82, it incorrectly set the
license to Moodle Workplace.
2020-07-22 10:44:35 +01:00
Andrew Nicols b284293402 MDL-69138 behat: Update session->visit() to use visit step 2020-07-22 16:43:08 +08:00
Andrew Nicols d61fa24239 MDL-69138 behat: Add "I visit :localurl" step 2020-07-22 16:43:08 +08:00
Jun Pataleta 11eb85e494 Merge branch 'MDL-52052-master' of git://github.com/mihailges/moodle 2020-07-22 13:47:14 +08:00
Jun Pataleta c765b1f7e2 Merge branch 'MDL-68178-master' of git://github.com/mihailges/moodle 2020-07-22 12:59:09 +08:00
Eloy Lafuente (stronk7) 8e44da5653 Merge branch 'MDL-69160-master' of git://github.com/andrewnicols/moodle 2020-07-21 23:29:29 +02:00
Bas Brands 0489e9ceee MDL-69111 mod_forum: forum grading on small viewports
- changes to make the forum grading UI accessible in small
viewports to meet criterion 1.4.10 Reflow.
2020-07-21 17:42:02 +02:00
Jun Pataleta e948a6354e Merge branch 'MDL-68737_master' of https://github.com/t-schroeder/moodle 2020-07-21 21:55:41 +08:00
David Mudrák 8a6b13b71e MDL-68647 forum: Add index over posts privatereplyto field
This is to further improve the performance of searching of posts related
to the given user. Once both userid and privatereplyto are indexed, the
query planner can use the merged index to search for posts records.
2020-07-21 11:55:25 +02:00
David Mudrák e2f1e10225 MDL-68647 forum: Improve the SQL performance in the privacy provider
The idea here is to replace the existing LEFT JOINs and
OR / IS NOT NULL conditions with INNER JOINs and ANDs. So we gather the
discussions data from all three areas in individual queries, make their
UNION. The GROUP BY was present before and maybe it is not even needed
any more (due to how UNION works) but it should not hurt to keep it.

This leads to significantly improved performance.
2020-07-21 11:53:08 +02:00
David Mudrák 474e768a26 MDL-68647 forum: Add missing advanced grading library inclusion
The method get_grading_manager() is called in the file so make sure the
library is loaded. Without it, the forum's privacy provider unit test
ended with error.

Not directly related to the issue, but noticed while working on it.
2020-07-21 11:53:08 +02:00
Adrian Greeve 17e99314a2 Merge branch 'MDL-67657-master' of git://github.com/andrewnicols/moodle 2020-07-21 14:47:14 +08:00
Adrian Greeve d817ccaca5 Merge branch 'MDL-67436-master' of https://github.com/jondo/moodle 2020-07-21 08:28:53 +08:00
Eloy Lafuente (stronk7) 0cb248077c Merge branch 'MDL-68726-master' of https://github.com/sammarshallou/moodle 2020-07-21 00:37:03 +02:00
Ferran Recio 1d8cbfb81b MDL-68423 message: avoid self-xss when send a message 2020-07-20 19:48:17 +02:00
Eloy Lafuente (stronk7) 6c579b60f2 Merge branch 'master_MDL-67440' of https://github.com/danmarsden/moodle 2020-07-20 17:08:12 +02:00
Leon Stringer 6b03aebf27 MDL-60501 themes: Fix closing <h4> in template
In site admin pages (/admin/search.php) <h4> elements were generated
with an incorrect second opening <h4> instead of a closing </h4>.
2020-07-20 15:51:14 +01:00
Bas Brands 8e929fa58a MDL-66670 theme_boost: list bullet styling
Ensure lists with bullets are not cut off
2020-07-20 14:47:45 +02:00
Jake Dallimore f956926db5 MDL-69319 mod_lti: style and docs changes in external tests 2020-07-20 13:01:21 +08:00
Jake Dallimore cea2645a81 MDL-69319 mod_lti: replace try/catch with expectException in ext tests 2020-07-20 13:00:47 +08:00
Jake Dallimore 5aff8a7852 MDL-69319 mod_lti: remove unused vars from externallib_test 2020-07-20 12:51:27 +08:00
Jake Dallimore 7c7c5286a4 MDL-69319 mod_lti: move test data generation out of common setup 2020-07-20 12:51:25 +08:00
Mihail Geshoski c39bc627a0 MDL-68178 auth: CSRF protection for the resend confirmation email form
Credit to Chandra Kishor.
2020-07-20 12:30:21 +08:00
Adrian Greeve 867509ac25 Merge branch 'MDL-69113' of https://github.com/jonof/moodle 2020-07-20 10:20:47 +08:00
Jake Dallimore 261400d4ea MDL-69319 mod_lti: call clean_returnvalue in external tests 2020-07-20 09:29:40 +08:00
Mihail Geshoski f9bcf22483 MDL-52052 gradeimport_csv: Do not skip rows with blank user fields 2020-07-20 08:54:11 +08:00
Eloy Lafuente (stronk7) a16ab5697d Merge branch 'MDL-69278-master' of git://github.com/andrewnicols/moodle 2020-07-18 11:55:48 +02:00
sam marshall 9b3646417e MDL-68726 Search: Stop Solr 'optimize' behaviour
The optimize feature in Solr is usually considered harmful, especially
prior to Solr 7.5.

This change simply removes the optimize implementation from the Solr
engine.
2020-07-17 17:11:57 +01:00
Sara Arjona 741d6dde19 weekly release 4.0dev 2020-07-16 21:28:16 +02:00
Sara Arjona 14b4ee0827 Merge branch 'install_master' of https://git.in.moodle.com/amosbot/moodle-install 2020-07-16 21:28:13 +02:00
Tim Schroeder 396a282a2d MDL-68737 other: add .vscode folder to .gitignore 2020-07-16 18:46:43 +02:00
Jake Dallimore af331f08d4 Merge branch 'MDL-45849-selfenrol' of https://github.com/Peterburnett/moodle 2020-07-16 16:27:01 +02:00
Jake Dallimore 988d0d4c50 Merge branch 'MDL-69215-master-2' of git://github.com/andrewnicols/moodle 2020-07-16 16:25:55 +02:00
Eloy Lafuente (stronk7) a86f428702 Merge branch 'MDL-69214' of https://github.com/paulholden/moodle 2020-07-16 16:21:27 +02:00
Eloy Lafuente (stronk7) 5a32562f82 Merge branch 'MDL-69165-master' of https://github.com/HuongNV13/moodle 2020-07-16 16:21:27 +02:00
Eloy Lafuente (stronk7) 9e28ba2b65 Merge branch 'MDL-69074-master' of https://github.com/mackensen/moodle 2020-07-16 16:21:27 +02:00
Sara Arjona 2eb31f8bb3 Merge branch 'MDL-68605_master' of https://github.com/t-schroeder/moodle 2020-07-16 16:21:27 +02:00
Sara Arjona d189edb843 Merge branch 'MDL-68210-master' of https://github.com/snake/moodle 2020-07-16 16:21:27 +02:00
Sara Arjona 57ad9e1566 Merge branch 'MDL-67671_master' of https://github.com/marxjohnson/moodle 2020-07-16 16:21:26 +02:00
Robert Pollak beca5a9300 MDL-67436 mod_assign: "Assignments per page": Sort "All" after "100" 2020-07-16 09:34:57 +02:00
Andrew Nicols 083604ea09 MDL-67657 behat: Open course with editing using URL
This is a huge performance improvement for behat.

The current set of steps loads the page
It then looks for the Classic/Clean version of the settings menu
If it fails to find it looks for the Boost Cog
Then it clicks the "Turn editing on" button

This can take a substantial period.

We do not actually need to run these steps as we are able to jump
straight to the URL. We already have access to the sesskey value
required to do this.

There is not loss in testing functionality because the actual testing of
the Turn editing functionality is tested in other places sufficiently.
2020-07-16 11:06:43 +08:00
Andrew Nicols cd6eadd407 MDL-67657 behat: Convert existing uses of executeScript 2020-07-16 11:06:31 +08:00
Andrew Nicols 6d5d1935ea MDL-67657 behat: Add wrapper for JS execution 2020-07-16 11:05:32 +08:00
Andrew Nicols 05f23d5a2b MDL-69278 behat: Correct variable name 2020-07-16 08:29:22 +08:00
Andrew Nicols 0d751c196b MDL-69278 behat: Mark tests as failed when unable to start Session 2020-07-16 08:29:22 +08:00
Andrew Nicols 6f5f08a846 MDL-69215 output: Correct use of icon_system::instance 2020-07-16 07:29:22 +08:00
Andrew Nicols 4a4a367251 MDL-69215 output: Correct font awesome for themes 2020-07-16 07:29:22 +08:00
Paul Holden 809be05428 MDL-65819 message: send contact requests using recipient language. 2020-07-15 20:24:44 +01:00
Shamim Rezaie 4bd0eaf732 MDL-66707 mod_forum: do not blindly mark discussion replies as read 2020-07-15 22:20:40 +10:00
Sara Arjona 23f33d12ca Merge branch 'MDL-57678-master-3' of git://github.com/junpataleta/moodle 2020-07-15 12:56:02 +02:00
Brendan Heywood ef4145dd1a MDL-68874 dml: Add SQL stacktrace debugging mode 2020-07-15 20:32:43 +10:00
Jun Pataleta 4c44813e9e MDL-57678 admin: Replace usage of make_categories_options()
Replace with core_course_category::make_categories_list() instead.
2020-07-15 18:26:03 +08:00
Jun Pataleta c5438f982c MDL-57678 enrol_ldap: Replace usage of make_categories_options()
Replace with core_course_category::make_categories_list() instead.
2020-07-15 18:26:03 +08:00
Jun Pataleta 2c45ad6f18 MDL-57678 core_course: Deprecate make_categories_options()
Padding nested course categories by space to make them render in a tree
structure does not really make a lot of sense as they are already being
rendered as full paths. It's simpler to show them without the
indentation.
Given this, there's not much point keeping make_categories_options().
So it's better to deprecate this function and call
core_course_category::make_categories_list() directly instead.
2020-07-15 18:25:57 +08:00
Sara Arjona 9f9682cfe2 Merge branch 'MDL-69068-master' of git://github.com/andrewnicols/moodle 2020-07-15 12:20:20 +02:00
Sara Arjona b8d16ecad1 Merge branch 'MDL-45002_master' of https://github.com/grillonbleu/moodle 2020-07-15 09:51:37 +02:00
Andrew Nicols 45871ec48e MDL-69068 behat: Allow singular, pivotted data generators 2020-07-15 15:27:31 +08:00
Andrew Nicols b49cb92e82 MDL-69068 behat: New step to support singular generators 2020-07-15 15:27:31 +08:00
Andrew Nicols eb06f92457 MDL-68390 core: Share focusable selector 2020-07-15 15:15:34 +08:00
Andrew Nicols 7cc18dc2ad MDL-68390 js: Update to use Aria mod 2020-07-15 14:40:49 +08:00
Andrew Nicols 4f1c8ce764 MDL-68390 aria: Add new core_aria module 2020-07-15 14:40:49 +08:00
Jake Dallimore 805214b38c Merge branch 'MDL-69206-master' of git://github.com/mihailges/moodle 2020-07-15 10:29:03 +08:00
Eloy Lafuente (stronk7) 9e65bc8fa6 Merge branch 'MDL-68690-master' of https://github.com/sammarshallou/moodle 2020-07-15 00:17:11 +02:00
François Moreau 760ed019ee MDL-45002 mod_quiz: completion option, at least N attempts completed 2020-07-14 15:32:06 -04:00
Sara Arjona 22f4eab309 Merge branch 'MDL-68715' of https://github.com/paulholden/moodle 2020-07-14 14:31:44 +02:00
Paul Holden 8acaa4e356 MDL-68715 completion: fix form default value for course prerequisites.
Adds filtering on the completion criteria form to ensure we are only
selecting actual course instances of this type. Prior to this change
we would also get NULL values from unrelated criteria types.
2020-07-14 12:46:02 +01:00
Sara Arjona ebd307b396 Merge branch 'MDL-69228-master' of git://github.com/andrewnicols/moodle 2020-07-14 12:41:05 +02:00
Mihail Geshoski 2b61f1eb27 MDL-69206 course: Tidy up behat test to avoid potential failures 2020-07-14 12:09:52 +08:00
Mihail Geshoski 586ae77bc2 MDL-69206 course: Tidy up unit test to avoid potential failures 2020-07-14 12:09:52 +08:00
Paul Holden 60c92dcb4b MDL-62980 tool_dataprivacy: show persistent errors inside form. 2020-07-14 00:22:48 +01:00
adpe d4dc94ec8d MDL-69260 admin_cli: show only contributed plugins in uninstall plugins 2020-07-13 20:19:35 +02:00
Sara Arjona 168348abeb Merge branch 'MDL-69115-master' of git://github.com/junpataleta/moodle 2020-07-13 14:24:00 +02:00
Andrew Nicols b0627a1a11 MDL-69160 workshop: Ensure steps are chained 2020-07-13 14:22:32 +08:00
Andrew Nicols 2c37677635 MDL-69160 behat: Add form field setter step 2020-07-13 14:22:31 +08:00
Leon Stringer 69f0ecf605 MDL-69252 templates: Invalid HTML
Invalid HTML generated when the page count exceeded the maximum number
of page links to display: <span>...</a>.  Also added example context.
2020-07-11 12:51:02 +01:00
AMOS bot 815f256bcd Automatically generated installer lang files 2020-07-10 19:52:39 +00:00
Eloy Lafuente (stronk7) ee23a8cf25 weekly release 4.0dev 2020-07-10 20:21:44 +02:00
Eloy Lafuente (stronk7) b89a37942e Merge branch 'install_master' of https://git.in.moodle.com/amosbot/moodle-install 2020-07-10 20:21:38 +02:00
sam marshall 0deb19468d MDL-68690 Search: Allow Solr to add documents in batches
Adding documents in batches instead of one at a time can make
indexing using Solr significantly faster.

This adds new API functions for search engines, including
add_document_batch() to add a batch of documents,
supports_add_document_batch(), get_batch_max_documents() and
get_batch_max_content().
2020-07-10 11:32:46 +01:00
Jake Dallimore 0ad85f4148 Merge branch 'MDL-69232-master' of git://github.com/andrewnicols/moodle 2020-07-10 15:12:44 +08:00
Peter Burnett 37c99bd07e MDL-45849 enrol_self: Added self enrol capability 2020-07-10 11:52:10 +10:00
Andrew Nicols 4df5ee039a MDL-69232 behat: Simplify hooks
The behat hooks were needlessly complicated which made them much harder
to read, and understand, leading to bugs during development.

These have been significantly simplified to favour clarity over
overloading.
2020-07-10 08:40:30 +08:00
Andrew Nicols 5306f2f2b9 MDL-69232 behat: Make selenium start more fault tolerant
The session was previously only started once, but has now been moved to
restart between each test. Because of this the `$session->start()` is
now called more frequently which exposes a pre-existing issue whereby
Selenium will periodically fail to start.

When the session was only started at the beginning of the test, and at
occasional other times, it made sense to always stop the test runner
because it signified an issue with obtaining the session at all.

Since the session is restarted more frequently, and now between every
test, it no longer makes sense to do this. The test should only be
_stopped_ if the first attempt to obtain the Session fails. Once a
Session has been retrieved at least once it no longer makes sense to
assume that the failure was a configuration failure, but a connection
failure. Therefore subsequent tests should be attempted.
2020-07-10 08:40:30 +08:00
Mark Johnson e37cdf881e MDL-67671 backup: Fix modname display on backup form 2020-07-09 10:11:17 +01:00
Jake Dallimore 336d0d2927 Merge branch 'MDL-69135-master' of git://github.com/andrewnicols/moodle 2020-07-09 10:35:33 +08:00
Michael Hawkins f1d86e0319 MDL-68426 theme: Set a limit on paths length in yui_combo
The maximum paths length is now consistent with the YUI loader.
This fix also removes any duplicate paths, so each file is only ever
fetched once.
2020-07-09 10:05:59 +08:00
Andrew Nicols 5e99058860 MDL-69232 behat: Add debugging information to Selenium fails 2020-07-09 09:30:15 +08:00
Andrew Nicols 41426e0aa4 MDL-69232 behat: Move suite tests to BeforeSuite hook 2020-07-09 09:27:11 +08:00
Jake Dallimore 389744710a Merge branch 'MDL-62982-master' of git://github.com/mihailges/moodle 2020-07-09 09:07:49 +08:00
Jake Dallimore 848f08e126 Merge branch 'MDL-67477-master' of git://github.com/mihailges/moodle 2020-07-09 08:38:18 +08:00
Eloy Lafuente (stronk7) cdbb433c32 Merge branch 'MDL-69134-master' of git://github.com/andrewnicols/moodle 2020-07-08 20:53:11 +02:00
Jake Dallimore 0524f3ae5b Merge branch 'MDL-69104-master' of https://github.com/HuongNV13/moodle 2020-07-08 13:06:45 +08:00
Andrew Nicols 1e37778fc1 Merge branch 'MDL-56041-master-fix' of https://github.com/snake/moodle 2020-07-08 12:39:17 +08:00
Andrew Nicols fc5e5d4999 Merge branch 'MDL-68784' of https://github.com/Peterburnett/moodle 2020-07-08 12:35:37 +08:00
Andrew Nicols 954e4d1132 Merge branch 'm40_MDL-66322_Travis_Run_Using_Docker_ExtTests' of https://github.com/scara/moodle 2020-07-08 12:20:08 +08:00
Jake Dallimore 8cb0b7262b MDL-56041 core: add missing cap string for site:senderrormessage 2020-07-08 12:09:02 +08:00
Huong Nguyen 579da44a70 MDL-69165 Questions: Incorrect id used in init_submit_button function 2020-07-08 10:54:24 +07:00
Peter Burnett 7482fef18b MDL-68784: Updated variable for graph report 2020-07-08 13:48:30 +10:00
Andrew Nicols 0bf024e48a MDL-69228 tool_mobile: Hide dependant settings 2020-07-08 11:44:02 +08:00
Andrew Nicols 7d4ee9c50b Merge branch 'MDL-69031-master' of git://github.com/jleyva/moodle 2020-07-08 09:38:46 +08:00
Jake Dallimore 7a40781aeb Merge branch 'MDL-56041-custom-error-pages' of https://github.com/brendanheywood/moodle 2020-07-08 09:33:46 +08:00
Andrew Nicols 0a5291c013 Merge branch 'MDL-60494-stray_img_end' of https://github.com/leonstr/moodle 2020-07-08 09:23:31 +08:00
Andrew Nicols 63a66eb2ce MDL-69134 competencies: Behat fails randomly opening dialogues 2020-07-08 09:21:44 +08:00
Jake Dallimore c032adf341 MDL-68210 mod_lesson: fix random failure in override behat test 2020-07-08 09:08:27 +08:00
Jake Dallimore c467de9ac6 MDL-68210 overrides: allow copy and delete of inactive overrides
This brings lesson and assign in line with the expected behaviour
already implemented in quiz. When an override is inactive, all controls
are shown.
2020-07-08 09:08:27 +08:00
Andrew Nicols 145604590f Merge branch 'MDL-69109-master-2' of git://github.com/marinaglancy/moodle 2020-07-08 08:39:32 +08:00
Brendan Heywood 43999a3f2b MDL-56041 error: Enable custom 404 and 500 error pages 2020-07-08 09:36:21 +10:00
Matt Clarkson 7f55289912 MDL-67440 analytics: optimse delete's in clean up task. 2020-07-08 11:16:36 +12:00
Eloy Lafuente (stronk7) 7a5f2d0b78 Merge branch 'MDL-69086-master' of git://github.com/andrewnicols/moodle 2020-07-07 19:15:13 +02:00
Eloy Lafuente (stronk7) 3303daf3bf Merge branch 'm40_MDL-68588_Hide_Backuptempdir_From_Message_And_Debuginfo' of https://github.com/scara/moodle 2020-07-07 19:09:59 +02:00
Eloy Lafuente (stronk7) e47c53ae4a Merge branch 'MDL-68784' of https://github.com/Peterburnett/moodle 2020-07-07 18:51:50 +02:00
Paul Holden ca02422d66 MDL-69214 user: correct participant table forced group SQL. 2020-07-07 14:31:31 +01:00
Tim Schroeder 3786de22f2 MDL-68605 mod_assign: return grp submissns from ws
Co-authored-by: Septatrix <24257556+Septatrix@users.noreply.github.com>
2020-07-07 12:55:04 +02:00
Víctor Déniz Falcón d07fb8b9e8 MDL-69093 enrol_manual: added check for allowed roles a user can assign 2020-07-07 08:32:39 +02:00
Andrew Nicols 877a3f70d0 Merge branch 'MDL-69106-master' of git.in.moodle.com:cameron/moodle 2020-07-07 14:13:22 +08:00
Jake Dallimore 3d7a8a09ba Merge branch 'MDL-63966' of https://github.com/Chocolate-lightning/moodle 2020-07-07 13:54:27 +08:00
Andrew Nicols 3bf4744303 Merge branch 'MDL-67594-master-2' of git://github.com/mihailges/moodle 2020-07-07 09:32:20 +08:00
Eloy Lafuente (stronk7) 70e973d092 Merge branch 'MDL-60827-master' of git://github.com/mihailges/moodle 2020-07-07 00:14:34 +02:00
Matteo Scaramuccia 3ce1eba180 MDL-66322 travis: Configure a local copy of 'exttests' 2020-07-06 23:02:56 +02:00
Martin Drlík ca864e09b1 MDL-68586 format_topics: code prechecks 2020-07-06 13:26:09 +02:00
Andrew Nicols a95f458cde MDL-69110 table: Remove commented code 2020-07-06 13:25:31 +08:00
Andrew Nicols 1ffdc39468 Merge branch 'MDL-69110-master' of git://github.com/junpataleta/moodle 2020-07-06 13:16:38 +08:00
Mihail Geshoski 83c18a2dec MDL-67594 core_lock: Modify postgres get_lock() to avoid recursion 2020-07-06 13:04:41 +08:00
Mihail Geshoski 566b73fbfc MDL-67594 core_lock: Deprecate extend() 2020-07-06 13:04:33 +08:00
Mihail Geshoski 80736a93aa MDL-67594 core_lock: Deprecate extend_lock() 2020-07-06 13:03:08 +08:00
Mihail Geshoski 41bc63dbf3 MDL-67594 core_lock: Remove supports_recursion() usages 2020-07-06 13:01:20 +08:00
Mihail Geshoski 4b71cdcd89 MDL-67594 core_lock: Deprecate supports_recursion() 2020-07-06 13:01:16 +08:00
Andrew Nicols e4faf5fede Merge branch 'MDL-68820-referrer-policy' of https://github.com/Peterburnett/moodle 2020-07-06 12:38:29 +08:00
Andrew Nicols 8a635e3e24 Merge branch 'MDL-69158-master' of git://github.com/lucaboesch/moodle 2020-07-06 12:11:10 +08:00
Jake Dallimore 71bfe91591 Merge branch 'MDL-55192-master' of git://github.com/peterRd/moodle 2020-07-06 12:10:02 +08:00
Peter Dias ceedbf1515 MDL-55192 log: Remove add_log from unit tests 2020-07-06 11:56:47 +08:00
Jake Dallimore 68e240284c Merge branch 'MDL-63004' of https://github.com/Chocolate-lightning/moodle 2020-07-06 11:55:12 +08:00
John Okely d464fb43d6 MDL-55192 log: Final deprecation of add_to_log 2020-07-06 11:54:10 +08:00
Mathew May b44495cecc MDL-63966 messaging: Make tests pass after deprecation 2020-07-06 11:44:04 +08:00
Mathew May d0ba284421 MDL-63966 core: Remove tests covering removed functions 2020-07-06 11:44:04 +08:00
Mathew May b27a27adcd MDL-63966 core: Final deprecations in deprecatedlib 2020-07-06 11:44:01 +08:00
Mathew May f87f23777f MDL-63004 behat: Final removal of i_navigate_to_node_in 2020-07-06 11:39:13 +08:00
Jake Dallimore 6ceba9e0e8 Merge branch 'MDL-69136-master' of git://github.com/andrewnicols/moodle 2020-07-06 10:44:10 +08:00
Mihail Geshoski ecf15a63b4 MDL-60827 oauth2: Consider requireconfirmation setting on login 2020-07-06 10:04:42 +08:00
Michael Hawkins c6ffe9588e MDL-69128 admin: Convert HTML entities when populating tasklogs filter 2020-07-06 10:04:03 +08:00
Mihail Geshoski 8cdb2fcc0e MDL-62982 core_form: Final deprecation of the htmleditor form element 2020-07-06 10:02:58 +08:00
Mihail Geshoski 8efa87ed6f MDL-67477 lib: Remove renamed classes 2020-07-06 10:00:22 +08:00
AMOS bot a5b23f1f4e Automatically generated installer lang files 2020-07-06 00:08:22 +00:00
Leon Stringer 9679c49c35 MDL-60494 mod_lti: Invalid </img>, example context
<img> was followed by an invalid </img>.  Also added example context for
template so it passes CI checks.
2020-07-05 15:56:04 +01:00
Matteo Scaramuccia 82850a0418 MDL-68588 Backup: Hide ->backuptempdir in exception info 2020-07-03 21:17:42 +02:00
Jun Pataleta b583c46297 MDL-69110 core: Unset the correct sort data element 2020-07-04 00:47:14 +08:00
Eloy Lafuente (stronk7) 49a9e8b07d weekly release 4.0dev 2020-07-03 18:41:01 +02:00
Eloy Lafuente (stronk7) 419709e9b2 Merge branch 'install_master' of https://git.in.moodle.com/amosbot/moodle-install 2020-07-03 18:40:55 +02:00
Jake Dallimore 5a3b9d64dd Merge branch 'MDL-68714-master' of https://github.com/andrewnicols/moodle 2020-07-03 11:58:17 +08:00
Andrew Nicols 9eaf7a4c3f MDL-68714 clilib: Check set_process_title exists
The web cron script at /admin/cron.php pretends to be a CLI script which
means that it is not possible to rely upon the CLI_SCRIPT constant.
2020-07-03 09:49:11 +08:00
Andrew Nicols 834aba2309 MDL-68714 cron: Check value of CLI_SCRIPT not existence 2020-07-03 09:04:05 +08:00
Jake Dallimore b5878eaec9 Merge branch 'MDL-63254' of https://github.com/Chocolate-lightning/moodle 2020-07-02 12:22:17 +08:00
Jake Dallimore ccae2f74f8 Merge branch 'MDL-69130-master-enfix' of git://github.com/mudrd8mz/moodle 2020-07-02 12:07:58 +08:00
Jake Dallimore 752a073885 Merge branch 'MDL-69149-master' of git://github.com/andrewnicols/moodle 2020-07-02 11:57:04 +08:00
Jake Dallimore e96987d89e Merge branch 'MDL-69122-master' of git://github.com/bmbrands/moodle 2020-07-02 11:49:02 +08:00
Andrew Nicols 710c3f0c36 Merge branch 'MDL-68714-task-top-process-name' of https://github.com/brendanheywood/moodle 2020-07-02 11:20:45 +08:00
Jake Dallimore c39dc16da4 Merge branch 'MDL-58926-ajax-timer' of https://github.com/rboyatt/moodle 2020-07-02 09:37:00 +08:00
AMOS bot b3e45d753a Automatically generated installer lang files 2020-07-02 00:08:01 +00:00
Eloy Lafuente (stronk7) 2cadeca3eb Merge branch 'MDL-69072-master' of git://github.com/andrewnicols/moodle 2020-07-01 23:20:34 +02:00
Eloy Lafuente (stronk7) 8fb519442a Merge branch 'MDL-58931-master' of https://github.com/mackensen/moodle 2020-07-01 22:56:30 +02:00
Charles Fulton 66ba391e82 MDL-58931 dml: add support for aurora mysql 2020-07-01 22:56:20 +02:00
Jake Dallimore 2cde5c5267 Merge branch 'MDL-63167-master' of git://github.com/peterRd/moodle 2020-07-01 17:06:01 +08:00
Jake Dallimore 2c41fe81e8 Merge branch 'MDL-68584-master' of git://github.com/lucaboesch/moodle 2020-07-01 16:42:19 +08:00
Brendan Heywood 0b996db6a3 MDL-68714 task: Expose current task in cli process name 2020-07-01 18:35:32 +10:00
Brendan Heywood 73a5ba92b7 MDL-68714 clilib: Allow cli processes to set a process title suffix 2020-07-01 18:35:32 +10:00
Jun Pataleta c3015dd0c8 MDL-69115 course: More course management accessibility fixes
* Added aria-label for category single select element when on Courses
view mode.
* Fix correct labelling of custom control checkboxes. Instead of adding
aria-label in the label element, add an sr-only span within the label.
* Remove inappropriate 'group' role for the list of courses.
The list of courses is not being rendered as a tree structure
so adding a 'group' role to the list of courses is not really
necessary.
* Add aria-label for the search courses field.
* Add legend for the search courses fieldset.
* Use the primary colour for the category selection highlight instead
of the info colour.
* Changed the labels for the up/down icons using moveup/movedown
lang strings.
2020-07-01 14:42:44 +08:00
Andrew Nicols 3585c252ce Merge branch 'MDL-60583' of https://github.com/NeillM/moodle 2020-07-01 09:16:21 +08:00
Andrew Nicols e6ff582e1a Merge branch 'MDL-69150' of https://github.com/paulholden/moodle 2020-07-01 08:34:30 +08:00
Andrew Nicols 53df9e34f9 Merge branch 'MDL-69151' of https://github.com/paulholden/moodle 2020-07-01 08:27:36 +08:00
Juan Leyva 1d6683bb0e MDL-69031 tool_mobile: Add missing features that can be disabled in 3.9 2020-06-30 13:02:59 +02:00
Marina Glancy 9c10de7f35 MDL-69109 theme: try to load icons from the current theme 2020-06-30 09:56:49 +02:00
Marina Glancy 17ab4fb266 MDL-69109 core: use different cache keys for FA icon maps 2020-06-30 09:38:33 +02:00
Huong Nguyen 5fa8f1c811 MDL-69104 Questions: Drag and drop question family don't work with iOS
- Drag and Drop marker question type
 - Drag and Drop onto image question type
 - Drag and Drop into text question type
2020-06-30 13:15:48 +07:00
Peter Burnett 91f26b5874 MDL-68784 scorm: Removed limit on allowed scorm users in report 2020-06-30 15:14:53 +10:00
Andrew Nicols 1b771b1947 Merge branch 'MDL-60621-master-1' of git://github.com/mihailges/moodle 2020-06-30 12:30:48 +08:00
Cameron Ball 548c44c89c MDL-69106 assignfeedback_editpdf: Keep files in conversion queue
In some circumstances, a submission waiting to be converted needs to persist
in the conversion queue so that it can be polled on subsequent cron runs.
2020-06-30 11:03:11 +08:00
Mihail Geshoski 8ee9fbca8d MDL-60621 core_course: Disable scrollable in the activity chooser modal 2020-06-30 10:18:19 +08:00
Mihail Geshoski e13cbf9e27 MDL-60621 js: Add ability to set a modal to be scrollable or not
With this change the modal can be configured to be scrollable or not.
If enabled to be 'scrollable', the modal's body will become scrollable
when the modal's height exceeds the browser's height. This is useful
in cases where the content in the modal is quite large and extends the
modal beyond the browser's height, which usually results in a bad UI.
If 'scrollable' is not explicitely configured, it will be set as 'true'
by default as in most cases it would be the expected behaviour.
2020-06-30 10:18:19 +08:00
Luca Bösch 14f047abdb MDL-69158 block_blog_menu: format search form. 2020-06-29 11:07:28 +02:00
Neill Magill b6c7a25d60 MDL-60583 webservice: Add index to improve token lookup performance
Without this index every webservice call will do a full table scan
when it tries to validate a token. On a busy site with many tokens
this adds unnecessary load to the database.
2020-06-29 07:33:12 +01:00
Andrew Nicols d128bf726e MDL-69136 behat: Improve reliability of navigation steps 2020-06-29 11:36:36 +08:00
Andrew Nicols 3450387277 MDL-69136 behat: Support find on a NodeElement 2020-06-29 11:36:30 +08:00
Andrew Nicols aacfff0bc8 MDL-69072 behat: Remove restart_browser_after feature
This is no longer required as the Mink session is restarted after every
test regardless.
2020-06-29 11:05:53 +08:00
Paul Holden 9071b2314f MDL-69151 message_airnotifier: start output before accesskey request.
This allows debugging generated by the request to be shown on the
page.
2020-06-26 17:34:02 +01:00
Paul Holden 54393e223a MDL-69150 message_airnotifier: correct apps portal link. 2020-06-26 17:13:56 +01:00
Andrew Nicols 868a1c377d MDL-69072 mod_scorm: Stop mink reset after tests
This is now done for all scenarios. It is no longer necessary to do so
specifically for mod_scorm.
2020-06-26 21:17:23 +08:00
Andrew Nicols 675e981004 MDL-69072 behat: Relaunch browser session between scenarios 2020-06-26 21:17:22 +08:00
Andrew Nicols eed4650028 MDL-69149 core_grade: Correct xpath attribute selector 2020-06-26 19:59:56 +08:00
Andrew Nicols 94711c151d MDL-69135 core_calendar: PendingJS for event filtering 2020-06-26 07:58:36 +08:00
Luca Bösch 8dfa3027a0 MDL-68584 core_question: flexbox compatible separator for question types
* the br tag does not work well in a flexbox context, a 100% with div
works in both classic and boost.
2020-06-25 22:01:15 +02:00
Helen Foster 38d5e3db1b MDL-69130 lang: Import fixed English strings (en_fix)
Significant string change:

- presentationoraltrequired,atto_image - wording changed to mention
  'decorative only' checkbox
2020-06-25 21:54:13 +02:00
Eloy Lafuente (stronk7) c11e2517a7 weekly release 4.0dev 2020-06-25 18:05:59 +02:00
Eloy Lafuente (stronk7) 5cc173a128 Merge branch 'install_master' of https://git.in.moodle.com/amosbot/moodle-install 2020-06-25 18:05:53 +02:00
Jonathon Fowler c31a32140b MDL-69113 assign: save grader app workflow/marker filters correctly 2020-06-25 14:39:08 +10:00
Bas Brands ee658223ff MDL-69122 report_competency: fix clearfix
- a misplaced clearfix caused part of the recontrols to be
inaccessible
2020-06-24 09:06:21 +02:00
Jake Dallimore 061347a93a Merge branch 'MDL-68992-master_france_digital_age' of https://github.com/martignoni/moodle 2020-06-24 10:11:08 +08:00
Jake Dallimore c7d5af7d6e Merge branch 'MDL-69065-master' of git://github.com/peterRd/moodle 2020-06-24 10:11:08 +08:00
Eloy Lafuente (stronk7) a68004a433 Merge branch 'MDL-66568-master-2' of git://github.com/andrewnicols/moodle 2020-06-23 17:57:17 +02:00
Peter Dias c8388ead0f MDL-69065 course: Provide the id for the sr param
* Pass the section return id to the activity chooser
* Additional behat test to cover the case
2020-06-23 13:19:07 +08:00
Jake Dallimore bd23521ca0 Merge branch 'MDL-69021-master' of git://github.com/bmbrands/moodle 2020-06-23 11:31:08 +08:00
Adrian Greeve c557df533a Merge branch 'MDL-68841-master' of https://github.com/DinhHien0307/moodle 2020-06-23 09:39:44 +08:00
David Mudrák cdcb53a114 MDL-69099 tasks: Do not mark the non-enabled plugin's task as disabled
The `core\plugininfo\base::is_enabled()` uses three-state logic for its
return value. It can return null as a valid value as per its
documentation. We need to test for the explicit false value in this
case.

To make the attached Behat test able to identify the table, the caption
is added. It seems to be helpful for all users so I leave it displayed
without using the accesshide mechanism.
2020-06-22 17:23:10 +01:00
Bas Brands 6346cc3593 MDL-69021 theme_boost: improve link styles in alerts
- provide default styles for links in alerts if the .alert-link
css class is omitted.
2020-06-22 16:15:41 +02:00
Jake Dallimore 680502e4da Merge branch 'MDL-69047-master' of git://github.com/aanabit/moodle 2020-06-22 12:41:06 +08:00
Adrian Greeve 3afe61d620 Merge branch 'MDL-69077' of https://github.com/timhunt/moodle 2020-06-22 10:32:44 +08:00
AMOS bot 9272cc8498 Automatically generated installer lang files 2020-06-21 00:07:21 +00:00
Nicolas Martignoni 57a005e7c6 MDL-68992 Privacy: Update default minimal digital age of consent
Updating default minimal digital age of consent according to current legislation,
that was updated for several countries since 2018.
2020-06-19 18:00:33 +02:00
Sara Arjona a6d724fe41 Merge branch 'MDL-69008-master' of git://github.com/junpataleta/moodle 2020-06-19 16:44:53 +02:00
Andrew Nicols 94376c6910 MDL-69086 theme_boost: Improve pendingJs checks for bootstrap
Where an element, like an `alert`, is closed it is removed from the DOM
before the event fires (this is a correct behaviour).

This means that the final event confirming that the action happened
(i.e. close => closed) fires, but does not bubble up the DOM to the
document.body.

This change moves the end event listener to only be added after a start
event has been fired, and to attach directly to the HTMLElement where it
will be fired. This means that the Event handler will still be called,
even though it has been removed from the DOM, because it does not need
to bubble up to the body.
2020-06-19 08:17:45 +08:00
Amaia Anabitarte 088786d284 MDL-69047 core_contentbank: Hard coding status messages 2020-06-18 18:06:30 +02:00
Sara Arjona 1ab9522055 weekly on-sync release 4.0dev 2020-06-18 14:14:26 +02:00
Sara Arjona c6c6770268 Merge branch 'install_master' of https://git.in.moodle.com/amosbot/moodle-install 2020-06-18 14:14:23 +02:00
Victor Deniz Falcon e055a45160 Merge branch 'MDL-66899-log-quiz-regrade' of https://github.com/rboyatt/moodle 2020-06-18 04:16:53 +01:00
Víctor Déniz Falcón a59f03d4de Merge branch 'MDL-69060-master' of git://github.com/lucaboesch/moodle 2020-06-17 23:38:15 +01:00
Tim Hunt 5fbb14524d MDL-69077 questions: question tag capabilties are relevant 2020-06-17 13:06:57 +01:00
Jun Pataleta dff53373de Merge branch 'MDL-68890-master' of https://github.com/DinhHien0307/moodle 2020-06-17 19:53:29 +08:00
Jun Pataleta 63f06e0d96 MDL-69008 core: Fix accessibility issues in paged content templates
* Added menuitem role for the "Show x per page" menu.
* Added appropriate aria-labels for the links in the paging bar.
2020-06-17 15:05:07 +08:00
Jake Dallimore 32e9128333 Merge branch 'MDL-68215-master' of git://github.com/lucaboesch/moodle 2020-06-17 14:57:42 +08:00
Peter Dias d49d4ee47b MDL-63167 grade: Test functions update 2020-06-17 14:12:26 +08:00
Peter Dias c771b25c0f MDL-63167 grade: Deprecated gradingform_provider 2020-06-17 14:12:21 +08:00
Jun Pataleta 753f2dcfba Merge branch 'MDL-68971' of https://github.com/timhunt/moodle 2020-06-17 11:36:12 +08:00
Jun Pataleta 26f3788857 Merge branch 'MDL-67294-master' of git://github.com/mihailges/moodle 2020-06-17 10:33:55 +08:00
Andrew Nicols c7fb9fe55a MDL-66568 behat: Reset theme CSS between scenarios 2020-06-17 07:46:23 +08:00
Andrew Nicols ab5a81321a MDL-66568 behat: Support building of themes for behat 2020-06-17 07:46:23 +08:00
Charles Fulton 2c93ca61d0 MDL-69074 admin: ensure consistent default for getremoteaddrconf 2020-06-16 16:34:21 -04:00
Víctor Déniz Falcón f82fad44d7 Merge branch 'MDL-69049-master' of git://github.com/junpataleta/moodle 2020-06-16 18:05:42 +01:00
Mihail Geshoski 2e5e143061 MDL-67294 assignsubmission_file: Make sure record exists before updating 2020-06-17 00:50:22 +08:00
Jun Pataleta 3a679810d5 Merge branch 'MDL-68436' of https://github.com/timhunt/moodle 2020-06-16 14:38:44 +08:00
Jun Pataleta 3484f3e4b5 MDL-69049 tool_dataprivacy: Add possibly missing comment format columns
The earlier CONTRIB plugin versions of the tool (<33.2.0, <34.2.0) were
missing the following columns in the data requests table:
* commentsformat
* dpocommentformat
And the upgrade scripts for the merged tool failed in
Moodle 3.3.8+/3.3.0+ failed to add these columns.
So a site which uses the CONTRIB plugin and eventually upgrading to 3.9
will encounter an error during upgrade because of the missing
dpocommentformat column.
2020-06-16 09:25:03 +08:00
Víctor Déniz Falcón a51797cc0e Merge branch 'MDL-69044' of https://github.com/stronk7/moodle 2020-06-15 17:21:49 +01:00
Víctor Déniz Falcón bc0b4ec7f4 Merge branch 'MDL-69043' of https://github.com/stronk7/moodle 2020-06-15 15:55:22 +01:00
Luca Bösch c09a294ff4 MDL-68215 block_activity_result: Format elements more nicely. 2020-06-15 15:24:46 +02:00
Luca Bösch 061893d89b MDL-69060 core_contentbank: fix contenbank typos. 2020-06-15 13:35:43 +02:00
Mathew May 1bedd8df20 MDL-63254 core_event: Remove deprecated message events 2020-06-15 11:59:34 +08:00
hiendinh de6b084925 MDL-68890 progressbar: prevent display exist file's progress bar 2020-06-15 10:55:06 +07:00
Andrew Nicols 868c7558f8 MDL-66568 core_output: Return built theme CSS 2020-06-15 10:34:40 +08:00
Eloy Lafuente (stronk7) b764343e5a MDL-69044 upgrade: add 3.9.0 separation line to all upgrade scripts 2020-06-14 13:08:09 +02:00
Eloy Lafuente (stronk7) dbe3e2dd13 MDL-69043 backup: Bump release to 4.0 2020-06-14 12:53:38 +02:00
AMOS bot edb1a9b4f3 Automatically generated installer lang files 2020-06-14 00:07:18 +00:00
Eloy Lafuente (stronk7) a2b286ce17 weekly back-to-dev release 4.0dev 2020-06-13 20:11:29 +02:00
Eloy Lafuente (stronk7) 7be8da04cd NOBUG: Change travis.yml back to master 2020-06-13 20:04:50 +02:00
hiendinh 813c385320 MDL-68841 Modal dialogs: Wrong behavior of popup 2020-06-11 15:25:25 +07:00
Tim Hunt 157c85c20a MDL-68436 atto_recordrtc: only works once per page 2020-06-10 13:40:15 +01:00
Tim Hunt 5f26bdc5e9 MDL-68971 webservice: errors should give enough info to find the problem 2020-06-09 11:09:09 +01:00
Russell Boyatt 8a2d8ec472 MDL-66899 quiz: Adding test for regrading quiz event. 2020-06-09 09:50:34 +01:00
Russell Boyatt fad72d7177 MDL-66899 quiz: Log a regrading event when quiz attempt is regraded. 2020-06-08 20:44:23 +01:00
Russell Boyatt 747f5ba09b MDL-58926 quiz: Addition of AJAX based quiz timer. 2020-06-06 17:28:02 +01:00
Peter Burnett b4623c8975 MDL-68820 web: Added referrer policy header setting 2020-06-03 15:18:19 +10:00
3369 changed files with 69840 additions and 27225 deletions
+4 -1
View File
@@ -19,6 +19,7 @@ lib/editor/tinymce/plugins/spellchecker/rpc.php
lib/editor/tinymce/tiny_mce/
lib/mlbackend/php/phpml/
lib/adodb/
lib/behat/axe/
lib/bennu/
lib/evalmath/
lib/phpspreadsheet/
@@ -66,6 +67,9 @@ lib/babel-polyfill/
lib/polyfills/
lib/emoji-data/
lib/plist/
lib/zipstream/
lib/php-enum/
lib/http-message/
media/player/videojs/amd/src/video-lazy.js
media/player/videojs/amd/src/Youtube-lazy.js
media/player/videojs/videojs/
@@ -88,5 +92,4 @@ theme/boost/amd/src/bootstrap/tab.js
theme/boost/amd/src/bootstrap/toast.js
theme/boost/amd/src/bootstrap/tooltip.js
theme/boost/amd/src/bootstrap/util.js
theme/boost/amd/src/tether.js
theme/boost/scss/fontawesome/
+71
View File
@@ -0,0 +1,71 @@
<?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/>.
/**
* Template configuraton file for github actions CI/CD.
*
* @package core
* @copyright 2020 onwards Eloy Lafuente (stronk7) {@link https://stronk7.com}
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
// This cannot be used out from a github actions workflow, so just exit.
getenv('GITHUB_WORKFLOW') || die; // phpcs:ignore moodle.Files.MoodleInternal.MoodleInternalGlobalState
unset($CFG);
global $CFG;
$CFG = new stdClass();
$CFG->dbtype = getenv('dbtype');
$CFG->dblibrary = 'native';
$CFG->dbhost = '127.0.0.1';
$CFG->dbname = 'test';
$CFG->dbuser = 'test';
$CFG->dbpass = 'test';
$CFG->prefix = 'm_';
$CFG->dboptions = ['dbcollation' => 'utf8mb4_bin'];
$host = 'localhost';
$CFG->wwwroot = "http://{$host}";
$CFG->dataroot = realpath(dirname(__DIR__)) . '/moodledata';
$CFG->admin = 'admin';
$CFG->directorypermissions = 0777;
// Debug options - possible to be controlled by flag in future.
$CFG->debug = (E_ALL | E_STRICT); // DEBUG_DEVELOPER.
$CFG->debugdisplay = 1;
$CFG->debugstringids = 1; // Add strings=1 to url to get string ids.
$CFG->perfdebug = 15;
$CFG->debugpageinfo = 1;
$CFG->allowthemechangeonurl = 1;
$CFG->passwordpolicy = 0;
$CFG->cronclionly = 0;
$CFG->pathtophp = getenv('pathtophp');
$CFG->phpunit_dataroot = realpath(dirname(__DIR__)) . '/phpunitdata';
$CFG->phpunit_prefix = 't_';
define('TEST_EXTERNAL_FILES_HTTP_URL', 'http://localhost:8080');
define('TEST_EXTERNAL_FILES_HTTPS_URL', 'http://localhost:8080');
define('TEST_SESSION_REDIS_HOST', 'localhost');
define('TEST_CACHESTORE_REDIS_TESTSERVERS', 'localhost');
// TODO: add others (solr, mongodb, memcached, ldap...).
// Too much for now: define('PHPUNIT_LONGTEST', true); // Only leaves a few tests out and they are run later by CI.
require_once(__DIR__ . '/lib/setup.php');
+103
View File
@@ -0,0 +1,103 @@
name: Core
on: [push]
env:
php: 7.4
jobs:
Grunt:
runs-on: ubuntu-18.04
steps:
- name: Checking out code
uses: actions/checkout@v2
- name: Configuring node & npm
shell: bash -l {0}
run: nvm install
- name: Installing node stuff
run: npm install
- name: Running grunt
run: npx grunt
- name: Looking for uncommitted changes
# Add all files to the git index and then run diff --cached to see all changes.
# This ensures that we get the status of all files, including new files.
# We ignore npm-shrinkwrap.json to make the tasks immune to npm changes.
run: |
git add .
git reset -- npm-shrinkwrap.json
git diff --cached --exit-code
PHPUnit:
runs-on: ${{ matrix.os }}
services:
exttests:
image: moodlehq/moodle-exttests
ports:
- 8080:80
redis:
image: redis
ports:
- 6379:6379
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-18.04
php: 7.2
db: mysqli
- os: ubuntu-18.04
php: 7.4
db: pgsql
steps:
- name: Setting up DB mysql
if: ${{ matrix.db == 'mysqli' }}
uses: johanmeiring/mysql-action@tmpfs-patch
with:
collation server: utf8mb4_bin
mysql version: 5.7
mysql database: test
mysql user: test
mysql password: test
use tmpfs: true
- name: Setting up DB pgsql
if: ${{ matrix.db == 'pgsql' }}
uses: m4nu56/postgresql-action@v1
with:
postgresql version: 9.6
postgresql db: test
postgresql user: test
postgresql password: test
- name: Configuring git vars
uses: rlespinasse/github-slug-action@v3.x
- name: Setting up PHP ${{ matrix.php }}
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none
- name: Checking out code from ${{ env.GITHUB_REF_SLUG }}
uses: actions/checkout@v2
- name: Setting up PHPUnit
env:
dbtype: ${{ matrix.db }}
run: |
echo "pathtophp=$(which php)" >> $GITHUB_ENV # Inject installed pathtophp to env. The template config needs it.
cp .github/workflows/config-template.php config.php
mkdir ../moodledata
sudo locale-gen en_AU.UTF-8
php admin/tool/phpunit/cli/init.php --no-composer-self-update
- name: Running PHPUnit tests
env:
dbtype: ${{ matrix.db }}
run: vendor/bin/phpunit -v
+2
View File
@@ -33,6 +33,7 @@ CVS
/.project
/.buildpath
/.cache
.phpunit.result.cache
phpunit.xml
# Composer support. Do not ignore composer.json, or composer.lock. These should be shipped by us.
composer.phar
@@ -44,3 +45,4 @@ composer.phar
/lib/yuilib/*/*/*-coverage.js
atlassian-ide-plugin.xml
/node_modules/
/.vscode/
+1 -1
View File
@@ -1 +1 @@
v14.0.0
v14.15.0
+4 -1
View File
@@ -20,6 +20,7 @@ lib/editor/tinymce/plugins/spellchecker/rpc.php
lib/editor/tinymce/tiny_mce/
lib/mlbackend/php/phpml/
lib/adodb/
lib/behat/axe/
lib/bennu/
lib/evalmath/
lib/phpspreadsheet/
@@ -67,6 +68,9 @@ lib/babel-polyfill/
lib/polyfills/
lib/emoji-data/
lib/plist/
lib/zipstream/
lib/php-enum/
lib/http-message/
media/player/videojs/amd/src/video-lazy.js
media/player/videojs/amd/src/Youtube-lazy.js
media/player/videojs/videojs/
@@ -89,5 +93,4 @@ theme/boost/amd/src/bootstrap/tab.js
theme/boost/amd/src/bootstrap/toast.js
theme/boost/amd/src/bootstrap/tooltip.js
theme/boost/amd/src/bootstrap/util.js
theme/boost/amd/src/tether.js
theme/boost/scss/fontawesome/
+45 -72
View File
@@ -2,10 +2,9 @@
# process (which uses our internal CI system) this file is here for the benefit
# of community developers git clones - see MDL-51458.
# We currently disable Travis notifications entirely until https://github.com/travis-ci/travis-ci/issues/4976
# is fixed.
notifications:
email: false
email:
if: env(MOODLE_EMAIL) != no
language: php
@@ -15,32 +14,11 @@ dist: xenial
services:
- mysql
php:
# We only run the highest and lowest supported versions to reduce the load on travis-ci.org.
- 7.4
- 7.2
- docker
addons:
postgresql: "9.6"
env:
# Although we want to run these jobs and see failures as quickly as possible, we also want to get the slowest job to
# start first so that the total run time is not too high.
#
# We only run MySQL on PHP 7.2, so run that first.
# CI Tests should be second-highest in priority as these only take <= 60 seconds to run under normal circumstances.
# Postgres is significantly is pretty reasonable in its run-time.
# Run CI Tests without running PHPUnit.
- DB=none TASK=CITEST
# Run unit tests on Postgres
- DB=pgsql TASK=PHPUNIT
# Perform an upgrade test too.
- DB=pgsql TASK=UPGRADE
jobs:
# Enable fast finish.
# This will fail the build if a single job fails (except those in allow_failures).
@@ -48,12 +26,35 @@ jobs:
fast_finish: true
include:
# Run mysql only on highest - it's just too slow
- php: 7.4
# First all the lowest php ones (7.2)
- php: 7.2
env: DB=none TASK=CITEST
- php: 7.2
env: DB=none TASK=GRUNT NVM_VERSION='lts/carbon'
- if: env(MOODLE_DATABASE) = "pgsql" OR env(MOODLE_DATABASE) = "all" OR env(MOODLE_DATABASE) IS NOT present
php: 7.2
env: DB=pgsql TASK=PHPUNIT
- if: env(MOODLE_DATABASE) = "mysqli" OR env(MOODLE_DATABASE) = "all"
php: 7.2
env: DB=mysqli TASK=PHPUNIT
# Then, conditionally, all the highest php ones (7.4)
- if: env(MOODLE_PHP) = "all"
php: 7.4
env: DB=none TASK=CITEST
- if: env(MOODLE_PHP) = "all"
php: 7.4
env: DB=none TASK=GRUNT NVM_VERSION='lts/carbon'
- if: env(MOODLE_PHP) = "all" AND (env(MOODLE_DATABASE) = "pgsql" OR env(MOODLE_DATABASE) = "all" OR env(MOODLE_DATABASE) IS NOT present)
php: 7.4
env: DB=pgsql TASK=PHPUNIT
- if: env(MOODLE_PHP) = "all" AND (env(MOODLE_DATABASE) = "mysqli" OR env(MOODLE_DATABASE) = "all")
php: 7.4
env: DB=mysqli TASK=PHPUNIT
# Run grunt/npm install on highest version too ('node' is an alias for the latest node.js version.)
- php: 7.4
env: DB=none TASK=GRUNT NVM_VERSION='lts/carbon'
cache:
directories:
@@ -61,8 +62,9 @@ cache:
- $HOME/.npm
before_install:
- docker run -d -p 127.0.0.1:8080:80 --name exttests moodlehq/moodle-exttests
# Avoid IPv6 default binding as service (causes redis not to start).
sudo service redis-server start --bind 127.0.0.1
- sudo service redis-server start --bind 127.0.0.1
install:
- >
@@ -112,7 +114,7 @@ install:
before_script:
- phpenv config-rm xdebug.ini
- >
if [ "$TASK" = 'PHPUNIT' -o "$TASK" = 'UPGRADE' ];
if [ "$TASK" = 'PHPUNIT' ];
then
# Copy generic configuration in place.
cp config-dist.php config.php ;
@@ -169,6 +171,12 @@ before_script:
-e "/require_once/i \\\$CFG->phpunit_dataroot = '\/home\/travis\/roots\/phpunit';" \
-e "/require_once/i \\\$CFG->phpunit_prefix = 'p_';" \
config.php ;
# Enable test external resources
sed -i \
-e "/require_once/i \\define('TEST_EXTERNAL_FILES_HTTP_URL', 'http://127.0.0.1:8080');" \
-e "/require_once/i \\define('TEST_EXTERNAL_FILES_HTTPS_URL', 'http://127.0.0.1:8080');" \
config.php ;
# Redis cache store tests
sed -i \
-e "/require_once/i \\define('TEST_CACHESTORE_REDIS_TESTSERVERS', '127.0.0.1');" \
@@ -206,7 +214,7 @@ before_script:
# We need the official upstream for comparison
git remote add upstream https://github.com/moodle/moodle.git;
git fetch upstream MOODLE_39_STABLE;
git fetch upstream MOODLE_310_STABLE;
export GIT_PREVIOUS_COMMIT="`git merge-base FETCH_HEAD $TRAVIS_COMMIT`";
export GIT_COMMIT="$TRAVIS_COMMIT";
export UPSTREAM_FETCH_HEAD=`git rev-parse FETCH_HEAD`
@@ -217,32 +225,6 @@ before_script:
export phpcmd=`which php`;
fi
########################################################################
# Upgrade test
########################################################################
- >
if [ "$TASK" = 'UPGRADE' ];
then
# We need the official upstream.
git remote add upstream https://github.com/moodle/moodle.git;
# Checkout 30 STABLE branch (the first version compatible with PHP 7.x)
git fetch upstream MOODLE_30_STABLE;
git checkout MOODLE_30_STABLE;
# Perform the upgrade
php admin/cli/install_database.php --agree-license --adminpass=Password --adminemail=admin@example.com --fullname="Upgrade test" --shortname=Upgrade;
# Return to the previous commit
git checkout -;
# Perform the upgrade
php admin/cli/upgrade.php --non-interactive --allow-unstable ;
# The local_ci repository can be used to check upgrade savepoints.
git clone https://github.com/moodlehq/moodle-local_ci.git local/ci ;
fi
script:
- >
if [ "$TASK" = 'PHPUNIT' ];
@@ -268,19 +250,10 @@ script:
git diff --cached --exit-code ;
fi
########################################################################
# Upgrade test
########################################################################
after_script:
- >
if [ "$TASK" = 'UPGRADE' ];
if [ "$TASK" = 'PHPUNIT' ];
then
cp local/ci/check_upgrade_savepoints/check_upgrade_savepoints.php ./check_upgrade_savepoints.php
result=`php check_upgrade_savepoints.php`;
# Check if there are problems
count=`echo "$result" | grep -P "ERROR|WARN" | wc -l` ;
if (($count > 0));
then
echo "$result"
exit 1 ;
fi
EXTTESTS_HITS=$(docker logs exttests 2>&1 | grep -Fv -e 'AH00558' -e '[pid 1]' | wc -l)
echo -e "\nTest local resources number of hits: ${EXTTESTS_HITS}.\n"
fi
@@ -43,7 +43,7 @@ class testoutgoingmailconf_form extends \moodleform {
$mform = $this->_form;
// Recipient.
$options = ['maxlength' => '100', 'size' => '25'];
$options = ['maxlength' => '100', 'size' => '25', 'autocomplete' => 'email'];
$mform->addElement('text', 'recipient', get_string('testoutgoingmailconf_toemail', 'admin'), $options);
$mform->setType('recipient', PARAM_EMAIL);
$mform->addRule('recipient', get_string('required'), 'required');
@@ -0,0 +1,71 @@
<?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/>.
/**
* External admin page class that allows a callback to be provided to determine whether page can be accessed
*
* @package core_admin
* @copyright 2019 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_admin\local\externalpage;
use admin_externalpage;
defined('MOODLE_INTERNAL') || die();
require_once("{$CFG->libdir}/adminlib.php");
/**
* Admin externalpage class
*
* @package core_admin
* @copyright 2019 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class accesscallback extends admin_externalpage {
/** @var callable $accesscheckcallback */
protected $accesscheckcallback;
/**
* Class constructor
*
* @param string $name
* @param string $visiblename
* @param string $url
* @param callable $accesscheckcallback The callback method that will be executed to check whether user has access to
* this page. The setting instance ($this) is passed as an argument to the callback. Should return boolean value
* @param bool $hidden
*/
public function __construct(string $name, string $visiblename, string $url, callable $accesscheckcallback,
bool $hidden = false) {
$this->accesscheckcallback = $accesscheckcallback;
parent::__construct($name, $visiblename, $url, [], $hidden);
}
/**
* Determines if the current user has access to this external page based on access callback
*
* @return bool
*/
public function check_access() {
return ($this->accesscheckcallback)($this);
}
}
@@ -0,0 +1,206 @@
<?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/>.
/**
* Auto complete admin setting.
*
* @package core_admin
* @copyright 2020 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_admin\local\settings;
defined('MOODLE_INTERNAL') || die();
require_once($CFG->libdir . '/adminlib.php');
/**
* Auto complete setting class.
*
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @copyright 2020 The Open University
*/
class autocomplete extends \admin_setting_configmultiselect {
/** @var boolean Should we allow typing new entries to the field? */
protected $tags = false;
/** @var string Name of an AMD module to send/process ajax requests. */
protected $ajax = '';
/** @var string Placeholder text for an empty list. */
protected $placeholder = '';
/** @var bool Whether the search has to be case-sensitive. */
protected $casesensitive = false;
/** @var bool Show suggestions by default - but this can be turned off. */
protected $showsuggestions = true;
/** @var string String that is shown when there are no selections. */
protected $noselectionstring = '';
/** @var string Delimiter to store values in database. */
protected $delimiter = ',';
/** @var string Should be multiple choices? */
protected $multiple = true;
/** @var string The link to manage choices. */
protected $manageurl = true;
/** @var string The text to display in manage link. */
protected $managetext = true;
/**
* Constructor
*
* @param string $name unique ascii name, either 'mysetting' for settings that in config, or 'myplugin/mysetting'
* for ones in config_plugins.
* @param string $visiblename localised
* @param string $description long localised info
* @param array $defaultsetting array of selected items
* @param array $choices options for autocomplete field
* @param array $attributes settings for autocomplete field
*/
public function __construct($name, $visiblename, $description, $defaultsetting, $choices, $attributes = null) {
if ($attributes === null) {
$attributes = [];
}
$this->placeholder = get_string('search');
$this->noselectionstring = get_string('noselection', 'form');
$defaultattributes = [
'tags',
'showsuggestions',
'placeholder',
'noselectionstring',
'ajax',
'casesensitive',
'delimiter',
'multiple',
'manageurl',
'managetext'
];
foreach ($defaultattributes as $attributename) {
if (isset($attributes[$attributename])) {
$this->$attributename = $attributes[$attributename];
}
}
parent::__construct($name, $visiblename, $description, $defaultsetting, $choices);
}
/**
* Returns the select setting(s)
*
* @return mixed null or array. Null if no settings else array of setting(s)
*/
public function get_setting() {
$result = $this->config_read($this->name);
if (is_null($result)) {
return null;
}
if ($result === '') {
return [];
}
return explode($this->delimiter, $result);
}
/**
* Saves setting(s) provided through $data
*
* @param array $data
*/
public function write_setting($data) {
if (!is_array($data)) {
return ''; // Ignore it.
}
if (!$this->load_choices() || empty($this->choices)) {
return '';
}
unset($data['xxxxx']);
$save = [];
foreach ($data as $value) {
if (!array_key_exists($value, $this->choices)) {
continue; // Ignore it.
}
$save[] = $value;
}
return ($this->config_write($this->name, implode($this->delimiter, $save)) ? '' : get_string('errorsetting', 'admin'));
}
/**
* Returns XHTML autocomplete field
*
* @param array $data Array of values to select by default
* @param string $query
* @return string XHTML autocomplete field
*/
public function output_html($data, $query = '') {
global $OUTPUT;
if (!$this->load_choices() or empty($this->choices)) {
return '';
}
$default = $this->get_defaultsetting();
if (empty($default)) {
$default = [];
}
if (is_null($data)) {
$data = [];
}
$context = [
'id' => $this->get_id(),
'name' => $this->get_full_name()
];
$defaults = [];
$options = [];
$template = 'core_admin/local/settings/autocomplete';
foreach ($this->choices as $value => $name) {
if (in_array($value, $default)) {
$defaults[] = $name;
}
$options[] = [
'value' => $value,
'text' => $name,
'selected' => in_array($value, $data),
'disabled' => false
];
}
$context['options'] = $options;
$context['tags'] = $this->tags;
$context['placeholder'] = $this->placeholder;
$context['casesensitive'] = $this->casesensitive;
$context['multiple'] = $this->multiple;
$context['showsuggestions'] = $this->showsuggestions;
$context['manageurl'] = $this->manageurl;
$context['managetext'] = $this->managetext;
if (is_null($default)) {
$defaultinfo = null;
} if (!empty($defaults)) {
$defaultinfo = implode(', ', $defaults);
} else {
$defaultinfo = get_string('none');
}
$element = $OUTPUT->render_from_template($template, $context);
return format_admin_setting($this, $this->visiblename, $element, $this->description, true, '', $defaultinfo, $query);
}
}
@@ -178,6 +178,7 @@ class filesize extends \admin_setting {
'id' => $this->get_id(),
'name' => $this->get_full_name(),
'value' => $data['v'],
'readonly' => $this->is_readonly(),
'options' => array_map(function($unit, $title) use ($data, $defaultunit) {
return [
'value' => $unit,
@@ -0,0 +1,74 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Payment gateway admin setting.
*
* @package core_admin
* @copyright 2020 Shamim Rezaie <shamim@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_admin\local\settings;
/**
* Generic class for managing plugins in a table that allows re-ordering and enable/disable of each plugin.
*/
class manage_payment_gateway_plugins extends \admin_setting_manage_plugins {
/**
* Get the admin settings section title (use get_string).
*
* @return string
*/
public function get_section_title() {
return get_string('type_paygw_plural', 'plugin');
}
/**
* Get the type of plugin to manage.
*
* @return string
*/
public function get_plugin_type() {
return 'paygw';
}
/**
* Get the name of the second column.
*
* @return string
*/
public function get_info_column_name() {
return get_string('supportedcurrencies', 'core_payment');
}
/**
* Get the type of plugin to manage.
*
* @param plugininfo The plugin info class.
* @return string
*/
public function get_info_column($plugininfo) {
$codes = $plugininfo->get_supported_currencies();
$currencies = [];
foreach ($codes as $c) {
$currencies[$c] = new \lang_string($c, 'core_currencies');
}
return implode(get_string('listsep', 'langconfig') . ' ', $currencies);
}
}
+3
View File
@@ -57,6 +57,8 @@ class task_log_table extends \table_sql {
'userid' => get_string('user', 'admin'),
'timestart' => get_string('task_starttime', 'admin'),
'duration' => get_string('task_duration', 'admin'),
'hostname' => get_string('hostname', 'tool_task'),
'pid' => get_string('pid', 'tool_task'),
'db' => get_string('task_dbstats', 'admin'),
'result' => get_string('task_result', 'admin'),
'actions' => '',
@@ -132,6 +134,7 @@ class task_log_table extends \table_sql {
$sql = "SELECT
tl.id, tl.type, tl.component, tl.classname, tl.userid, tl.timestart, tl.timeend,
tl.hostname, tl.pid,
tl.dbreads, tl.dbwrites, tl.result,
tl.dbreads + tl.dbwrites AS db,
tl.timeend - tl.timestart AS duration,
+9
View File
@@ -37,11 +37,13 @@ list($options, $unrecognized) = cli_get_params(
'showsql' => false,
'showdebugging' => false,
'ignorelimits' => false,
'force' => false,
], [
'h' => 'help',
'e' => 'execute',
'k' => 'keep-alive',
'i' => 'ignorelimits',
'f' => 'force',
]
);
@@ -61,6 +63,7 @@ Options:
-e, --execute Run all queued adhoc tasks
-k, --keep-alive=N Keep this script alive for N seconds and poll for new adhoc tasks
-i --ignorelimits Ignore task_adhoc_concurrency_limit and task_adhoc_max_runtime limits
-f, --force Run even if cron is disabled
Example:
\$sudo -u www-data /usr/bin/php admin/cli/adhoc_task.php --execute
@@ -92,6 +95,12 @@ if (moodle_needs_upgrading()) {
if (empty($options['execute'])) {
exit(0);
}
if (!get_config('core', 'cron_enabled') && !$options['force']) {
mtrace('Cron is disabled. Use --force to override.');
exit(1);
}
if (empty($options['keep-alive'])) {
$options['keep-alive'] = 0;
}
+105 -6
View File
@@ -36,14 +36,23 @@ require_once($CFG->libdir.'/cronlib.php');
// now get cli options
list($options, $unrecognized) = cli_get_params(
array(
[
'help' => false,
'stop' => false,
),
array(
'list' => false,
'force' => false,
'enable' => false,
'disable' => false,
'disable-wait' => false,
], [
'h' => 'help',
's' => 'stop',
)
'l' => 'list',
'f' => 'force',
'e' => 'enable',
'd' => 'disable',
'w' => 'disable-wait',
]
);
if ($unrecognized) {
@@ -56,8 +65,13 @@ if ($options['help']) {
"Execute periodic cron actions.
Options:
-h, --help Print out this help
-s, --stop Notify all other running cron processes to stop after the current task
-h, --help Print out this help
-s, --stop Notify all other running cron processes to stop after the current task
-l, --list Show the list of currently running tasks and how long they have been running
-f, --force Execute task even if cron is disabled
-e, --enable Enable cron
-d, --disable Disable cron
-w, --disable-wait=600 Disable cron and wait until all tasks finished or fail after N seconds (optional param)
Example:
\$sudo -u www-data /usr/bin/php admin/cli/cron.php
@@ -74,6 +88,91 @@ if ($options['stop']) {
die;
}
if ($options['enable']) {
set_config('cron_enabled', 1);
mtrace('Cron has been enabled for the site.');
exit(0);
}
if ($options['disable']) {
set_config('cron_enabled', 0);
\core\task\manager::clear_static_caches();
mtrace('Cron has been disabled for the site.');
exit(0);
}
if ($options['list']) {
$tasks = \core\task\manager::get_running_tasks();
mtrace('The list of currently running tasks:');
$format = "%7s %-12s %-9s %-20s %-52s\n";
printf ($format,
'PID',
'HOST',
'TYPE',
'TIME',
'CLASSNAME'
);
foreach ($tasks as $task) {
printf ($format,
$task->pid,
substr($task->hostname, 0, 12),
$task->type,
format_time(time() - $task->timestarted),
substr($task->classname, 0, 52)
);
}
exit(0);
}
if ($wait = $options['disable-wait']) {
$started = time();
if (true === $wait) {
// Default waiting time.
$waitsec = 600;
} else {
$waitsec = $wait;
$wait = true;
}
set_config('cron_enabled', 0);
\core\task\manager::clear_static_caches();
mtrace('Cron has been disabled for the site.');
mtrace('Allocating '. format_time($waitsec) . ' for the tasks to finish.');
$lastcount = 0;
while ($wait) {
$tasks = \core\task\manager::get_running_tasks();
if (count($tasks) == 0) {
mtrace('');
mtrace('All scheduled and adhoc tasks finished.');
exit(0);
}
if (time() - $started >= $waitsec) {
mtrace('');
mtrace('Wait time ('. format_time($waitsec) . ') elapsed, but ' . count($tasks) . ' task(s) still running.');
mtrace('Exiting with code 1.');
exit(1);
}
if (count($tasks) !== $lastcount) {
mtrace('');
mtrace(count($tasks) . " tasks currently running.", '');
$lastcount = count($tasks);
} else {
mtrace('.', '');
}
sleep(1);
}
}
if (!get_config('core', 'cron_enabled') && !$options['force']) {
mtrace('Cron is disabled. Use --force to override.');
exit(1);
}
\core\local\cli\shutdown::script_supports_graceful_exit();
cron_run();
+100 -90
View File
@@ -215,6 +215,7 @@ define('SITEID', 1);
//Database types
$databases = array('mysqli' => moodle_database::get_driver_instance('mysqli', 'native'),
'auroramysql' => moodle_database::get_driver_instance('auroramysql', 'native'),
'mariadb'=> moodle_database::get_driver_instance('mariadb', 'native'),
'pgsql' => moodle_database::get_driver_instance('pgsql', 'native'),
'oci' => moodle_database::get_driver_instance('oci', 'native'),
@@ -266,6 +267,7 @@ list($options, $unrecognized) = cli_get_params(
);
$interactive = empty($options['non-interactive']);
$skipdatabase = $options['skip-database'];
// set up language
$lang = clean_param($options['lang'], PARAM_SAFEDIR);
@@ -637,96 +639,100 @@ do {
}
} while ($hintdatabase !== '');
// ask for fullname
if ($interactive) {
cli_separator();
cli_heading(get_string('fullsitename', 'moodle'));
// If --skip-database option is provided, we do not need to ask for site fullname, shortname, adminuser, adminpass, adminemail.
// These fields will be requested during the database install part.
if (!$skipdatabase) {
// Ask for fullname.
if ($interactive) {
cli_separator();
cli_heading(get_string('fullsitename', 'moodle'));
if ($options['fullname'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['fullname']);
if ($options['fullname'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['fullname']);
} else {
$prompt = get_string('clitypevalue', 'admin');
}
do {
$options['fullname'] = cli_input($prompt, $options['fullname']);
} while (empty($options['fullname']));
} else {
$prompt = get_string('clitypevalue', 'admin');
if (empty($options['fullname'])) {
$a = (object)['option' => 'fullname', 'value' => $options['fullname']];
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
}
}
do {
$options['fullname'] = cli_input($prompt, $options['fullname']);
} while (empty($options['fullname']));
} else {
if (empty($options['fullname'])) {
$a = (object)array('option'=>'fullname', 'value'=>$options['fullname']);
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
}
}
// Ask for shortname.
if ($interactive) {
cli_separator();
cli_heading(get_string('shortsitename', 'moodle'));
// ask for shortname
if ($interactive) {
cli_separator();
cli_heading(get_string('shortsitename', 'moodle'));
if ($options['shortname'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['shortname']);
} else {
$prompt = get_string('clitypevalue', 'admin');
}
if ($options['shortname'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['shortname']);
do {
$options['shortname'] = cli_input($prompt, $options['shortname']);
} while (empty($options['shortname']));
} else {
$prompt = get_string('clitypevalue', 'admin');
if (empty($options['shortname'])) {
$a = (object)['option' => 'shortname', 'value' => $options['shortname']];
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
}
}
do {
$options['shortname'] = cli_input($prompt, $options['shortname']);
} while (empty($options['shortname']));
} else {
if (empty($options['shortname'])) {
$a = (object)array('option'=>'shortname', 'value'=>$options['shortname']);
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
}
}
// ask for admin user name
if ($interactive) {
cli_separator();
cli_heading(get_string('cliadminusername', 'install'));
if (!empty($options['adminuser'])) {
$prompt = get_string('clitypevaluedefault', 'admin', $options['adminuser']);
// Ask for admin user name.
if ($interactive) {
cli_separator();
cli_heading(get_string('cliadminusername', 'install'));
if (!empty($options['adminuser'])) {
$prompt = get_string('clitypevaluedefault', 'admin', $options['adminuser']);
} else {
$prompt = get_string('clitypevalue', 'admin');
}
do {
$options['adminuser'] = cli_input($prompt, $options['adminuser']);
} while (empty($options['adminuser']) or $options['adminuser'] === 'guest');
} else {
if ((empty($options['adminuser']) || $options['adminuser'] === 'guest')) {
$a = (object)['option' => 'adminuser', 'value' => $options['adminuser']];
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
}
}
// Ask for admin user password.
if ($interactive) {
cli_separator();
cli_heading(get_string('cliadminpassword', 'install'));
$prompt = get_string('clitypevalue', 'admin');
do {
$options['adminpass'] = cli_input($prompt);
} while (empty($options['adminpass']) or $options['adminpass'] === 'admin');
} else {
if ((empty($options['adminpass']) or $options['adminpass'] === 'admin')) {
$a = (object)['option' => 'adminpass', 'value' => $options['adminpass']];
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
}
}
do {
$options['adminuser'] = cli_input($prompt, $options['adminuser']);
} while (empty($options['adminuser']) or $options['adminuser'] === 'guest');
} else {
if (empty($options['adminuser']) or $options['adminuser'] === 'guest') {
$a = (object)array('option'=>'adminuser', 'value'=>$options['adminuser']);
// Ask for the admin email address.
if ($interactive) {
cli_separator();
cli_heading(get_string('cliadminemail', 'install'));
$prompt = get_string('clitypevaluedefault', 'admin', $options['adminemail']);
$options['adminemail'] = cli_input($prompt, $options['adminemail']);
}
// Validate that the address provided was an e-mail address.
if (!empty($options['adminemail']) && !validate_email($options['adminemail'])) {
$a = (object)['option' => 'adminemail', 'value' => $options['adminemail']];
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
}
}
// ask for admin user password
if ($interactive) {
cli_separator();
cli_heading(get_string('cliadminpassword', 'install'));
$prompt = get_string('clitypevalue', 'admin');
do {
$options['adminpass'] = cli_input($prompt);
} while (empty($options['adminpass']) or $options['adminpass'] === 'admin');
} else {
if (empty($options['adminpass']) or $options['adminpass'] === 'admin') {
$a = (object)array('option'=>'adminpass', 'value'=>$options['adminpass']);
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
}
}
// Ask for the admin email address.
if ($interactive) {
cli_separator();
cli_heading(get_string('cliadminemail', 'install'));
$prompt = get_string('clitypevaluedefault', 'admin', $options['adminemail']);
$options['adminemail'] = cli_input($prompt, $options['adminemail']);
}
// Validate that the address provided was an e-mail address.
if (!empty($options['adminemail']) && !validate_email($options['adminemail'])) {
$a = (object) array('option' => 'adminemail', 'value' => $options['adminemail']);
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
}
// Ask for the upgrade key.
if ($interactive) {
cli_separator();
@@ -745,22 +751,26 @@ if ($options['upgradekey'] !== '') {
$CFG->upgradekey = $options['upgradekey'];
}
if ($interactive) {
if (!$options['agree-license']) {
cli_separator();
cli_heading(get_string('copyrightnotice'));
echo "Moodle - Modular Object-Oriented Dynamic Learning Environment\n";
echo get_string('gpl3')."\n\n";
echo get_string('doyouagree')."\n";
$prompt = get_string('cliyesnoprompt', 'admin');
$input = cli_input($prompt, '', array(get_string('clianswerno', 'admin'), get_string('cliansweryes', 'admin')));
if ($input == get_string('clianswerno', 'admin')) {
exit(1);
// The user does not also need to pass agree-license when --skip-database is provided as the user will need to accept
// the license again in the database install part.
if (!$skipdatabase) {
if ($interactive) {
if (!$options['agree-license']) {
cli_separator();
cli_heading(get_string('copyrightnotice'));
echo "Moodle - Modular Object-Oriented Dynamic Learning Environment\n";
echo get_string('gpl3')."\n\n";
echo get_string('doyouagree')."\n";
$prompt = get_string('cliyesnoprompt', 'admin');
$input = cli_input($prompt, '', array(get_string('clianswerno', 'admin'), get_string('cliansweryes', 'admin')));
if ($input == get_string('clianswerno', 'admin')) {
exit(1);
}
}
} else {
if (!$options['agree-license'] && !$skipdatabase) {
cli_error(get_string('climustagreelicense', 'install'));
}
}
} else {
if (!$options['agree-license']) {
cli_error(get_string('climustagreelicense', 'install'));
}
}
@@ -809,7 +819,7 @@ if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) {
cli_error(get_string('pluginschecktodo', 'admin'));
}
if (!$options['skip-database']) {
if (!$skipdatabase) {
install_cli_database($options, $interactive);
// This needs to happen at the end to ensure it occurs after all caches
// have been purged for the last time.
+109
View File
@@ -0,0 +1,109 @@
<?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/>.
/**
* This script allows to restore a course from CLI.
*
* @package core
* @subpackage cli
* @copyright 2020 Catalyst IT
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define('CLI_SCRIPT', 1);
require(__DIR__ . '/../../config.php');
require_once($CFG->libdir . '/clilib.php');
require_once($CFG->dirroot . "/backup/util/includes/restore_includes.php");
list($options, $unrecognized) = cli_get_params([
'file' => '',
'categoryid' => '',
'showdebugging' => false,
'help' => false,
], [
'f' => 'file',
'c' => 'categoryid',
's' => 'showdebugging',
'h' => 'help',
]);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
if ($options['help'] || !($options['file']) || !($options['categoryid'])) {
$help = <<<EOL
Restore backup into provided category.
Options:
-f, --file=STRING Path to the backup file.
-c, --categoryid=INT ID of the category to restore too.
-s, --showdebugging Show developer level debugging information
-h, --help Print out this help.
Example:
\$sudo -u www-data /usr/bin/php admin/cli/restore_backup.php --file=/path/to/backup/file.mbz --categoryid=1\n
EOL;
echo $help;
exit(0);
}
if ($options['showdebugging']) {
set_debugging(DEBUG_DEVELOPER, true);
}
if (!$admin = get_admin()) {
print_error('noadmins');
}
if (!file_exists($options['file'])) {
print_error('filenotfound');
}
if (!$category = $DB->get_record('course_categories', ['id' => $options['categoryid']], 'id')) {
print_error('invalidcategoryid');
}
$backupdir = "restore_" . uniqid();
$path = $CFG->tempdir . DIRECTORY_SEPARATOR . "backup" . DIRECTORY_SEPARATOR . $backupdir;
cli_heading(get_string('extractingbackupfileto', 'backup', $path));
$fp = get_file_packer('application/vnd.moodle.backup');
$fp->extract_to_pathname($options['file'], $path);
cli_heading(get_string('preprocessingbackupfile'));
try {
list($fullname, $shortname) = restore_dbops::calculate_course_names(0, get_string('restoringcourse', 'backup'),
get_string('restoringcourseshortname', 'backup'));
$courseid = restore_dbops::create_new_course($fullname, $shortname, $category->id);
$rc = new restore_controller($backupdir, $courseid, backup::INTERACTIVE_NO,
backup::MODE_GENERAL, $admin->id, backup::TARGET_NEW_COURSE);
$rc->execute_precheck();
$rc->execute_plan();
$rc->destroy();
} catch (Exception $e) {
cli_heading(get_string('cleaningtempdata'));
fulldelete($path);
print_error('generalexceptionmessage', 'error', '', $e->getMessage());
}
cli_heading(get_string('restoredcourseid', 'backup', $courseid));
exit(0);
+19 -2
View File
@@ -30,8 +30,17 @@ require_once("$CFG->libdir/clilib.php");
require_once("$CFG->libdir/cronlib.php");
list($options, $unrecognized) = cli_get_params(
array('help' => false, 'list' => false, 'execute' => false, 'showsql' => false, 'showdebugging' => false),
array('h' => 'help')
[
'help' => false,
'list' => false,
'execute' => false,
'showsql' => false,
'showdebugging' => false,
'force' => false,
], [
'h' => 'help',
'f' => 'force',
]
);
if ($unrecognized) {
@@ -49,6 +58,7 @@ if ($options['help'] or (!$options['list'] and !$options['execute'])) {
--showsql Show sql queries before they are executed
--showdebugging Show developer level debugging information
-h, --help Print out this help
-f, --force Execute task even if cron is disabled
Example:
\$sudo -u www-data /usr/bin/php admin/cli/scheduled_task.php --execute=\\core\\task\\session_cleanup_task
@@ -121,6 +131,13 @@ if ($execute = $options['execute']) {
exit(1);
}
if (!get_config('core', 'cron_enabled') && !$options['force']) {
mtrace('Cron is disabled. Use --force to override.');
exit(1);
}
\core\task\manager::scheduled_task_starting($task);
// Increase memory limit.
raise_memory_limit(MEMORY_EXTRA);
+7 -7
View File
@@ -38,17 +38,17 @@ if ($unrecognized) {
}
// If necessary add files that should be ignored - such as in 3rd party plugins.
$blacklist = array();
$ignorelist = array();
$path = $options['path'];
if (!file_exists($path)) {
cli_error("Invalid path $path");
}
if ($options['ie9fix']) {
core_admin_recurse_svgs($path, '', 'core_admin_svgtool_ie9fix', $blacklist);
core_admin_recurse_svgs($path, '', 'core_admin_svgtool_ie9fix', $ignorelist);
} else if ($options['noaspectratio']) {
core_admin_recurse_svgs($path, '', 'core_admin_svgtool_noaspectratio', $blacklist);
core_admin_recurse_svgs($path, '', 'core_admin_svgtool_noaspectratio', $ignorelist);
} else {
$help =
@@ -153,9 +153,9 @@ function core_admin_svgtool_noaspectratio($file) {
* @param string $base
* @param string $sub
* @param string $filecallback
* @param array $blacklist
* @param array $ignorelist List of files to be ignored and skipped.
*/
function core_admin_recurse_svgs($base, $sub, $filecallback, $blacklist) {
function core_admin_recurse_svgs($base, $sub, $filecallback, $ignorelist) {
if (is_dir("$base/$sub")) {
$items = new DirectoryIterator("$base/$sub");
foreach ($items as $item) {
@@ -163,7 +163,7 @@ function core_admin_recurse_svgs($base, $sub, $filecallback, $blacklist) {
continue;
}
$file = $item->getFilename();
core_admin_recurse_svgs("$base/$sub", $file, $filecallback, $blacklist);
core_admin_recurse_svgs("$base/$sub", $file, $filecallback, $ignorelist);
}
unset($item);
unset($items);
@@ -174,7 +174,7 @@ function core_admin_recurse_svgs($base, $sub, $filecallback, $blacklist) {
return;
}
$file = realpath("$base/$sub");
if (in_array($file, $blacklist)) {
if (in_array($file, $ignorelist)) {
return;
}
$filecallback($file);
+10 -2
View File
@@ -34,6 +34,7 @@ $help = "Command line tool to uninstall plugins.
Options:
-h --help Print this help.
--show-all Displays a list of all installed plugins.
--show-contrib Displays a list of all third-party installed plugins.
--show-missing Displays a list of plugins missing from disk.
--purge-missing Uninstall all missing from disk plugins.
--plugins=<plugin name> A comma separated list of plugins to be uninstalled. E.g. mod_assign,mod_forum
@@ -44,6 +45,9 @@ Examples:
# php uninstall_plugins.php --show-all
Prints tab-separated list of all installed plugins.
# php uninstall_plugins.php --show-contrib
Prints tab-separated list of all third-party installed plugins.
# php uninstall_plugins.php --show-missing
Prints tab-separated list of all missing from disk plugins.
@@ -63,6 +67,7 @@ Examples:
list($options, $unrecognised) = cli_get_params([
'help' => false,
'show-all' => false,
'show-contrib' => false,
'show-missing' => false,
'purge-missing' => false,
'plugins' => false,
@@ -84,12 +89,15 @@ if ($options['help']) {
$pluginman = core_plugin_manager::instance();
$plugininfo = $pluginman->get_plugins();
if ($options['show-all'] || $options['show-missing']) {
if ($options['show-all'] || $options['show-missing'] || $options['show-contrib']) {
foreach ($plugininfo as $type => $plugins) {
foreach ($plugins as $name => $plugin) {
if ($options['show-contrib'] && $plugin->is_standard()) {
continue;
}
$pluginstring = $plugin->component . "\t" . $plugin->displayname;
if ($options['show-all']) {
if ($options['show-all'] || $options['show-contrib']) {
cli_writeln($pluginstring);
} else {
if ($plugin->get_status() === core_plugin_manager::PLUGIN_STATUS_MISSING) {
+363
View File
@@ -3163,4 +3163,367 @@
</CUSTOM_CHECK>
</CUSTOM_CHECKS>
</MOODLE>
<MOODLE version="3.10" requires="3.5">
<UNICODE level="required">
<FEEDBACK>
<ON_ERROR message="unicoderequired" />
</FEEDBACK>
</UNICODE>
<DATABASE level="required">
<VENDOR name="mariadb" version="10.2.29" />
<VENDOR name="mysql" version="5.7" />
<VENDOR name="postgres" version="9.6" />
<VENDOR name="mssql" version="11.0" />
<VENDOR name="oracle" version="11.2" />
</DATABASE>
<PHP version="7.2.0" level="required">
</PHP>
<PCREUNICODE level="optional">
<FEEDBACK>
<ON_CHECK message="pcreunicodewarning" />
</FEEDBACK>
</PCREUNICODE>
<PHP_EXTENSIONS>
<PHP_EXTENSION name="iconv" level="required">
<FEEDBACK>
<ON_ERROR message="iconvrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="mbstring" level="required">
<FEEDBACK>
<ON_ERROR message="mbstringrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="curl" level="required">
<FEEDBACK>
<ON_ERROR message="curlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="openssl" level="required">
<FEEDBACK>
<ON_ERROR message="opensslrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="tokenizer" level="optional">
<FEEDBACK>
<ON_CHECK message="tokenizerrecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="xmlrpc" level="optional">
<FEEDBACK>
<ON_CHECK message="xmlrpcrecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="soap" level="optional">
<FEEDBACK>
<ON_CHECK message="soaprecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="ctype" level="required">
<FEEDBACK>
<ON_ERROR message="ctyperequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="zip" level="required">
<FEEDBACK>
<ON_ERROR message="ziprequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="zlib" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="gd" level="required">
<FEEDBACK>
<ON_ERROR message="gdrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="simplexml" level="required">
<FEEDBACK>
<ON_ERROR message="simplexmlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="spl" level="required">
<FEEDBACK>
<ON_ERROR message="splrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="pcre" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="dom" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="xml" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="xmlreader" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="intl" level="required">
<FEEDBACK>
<ON_ERROR message="intlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="json" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="hash" level="required"/>
<PHP_EXTENSION name="fileinfo" level="required"/>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="96M" level="required">
<FEEDBACK>
<ON_ERROR message="settingmemorylimit" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="file_uploads" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="settingfileuploads" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="opcache.enable" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="opcacherecommended" />
</FEEDBACK>
</PHP_SETTING>
</PHP_SETTINGS>
<CUSTOM_CHECKS>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_storage_engine" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbstorageengine" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="question/engine/upgrade/upgradelib.php" function="quiz_attempts_upgraded" level="required">
<FEEDBACK>
<ON_ERROR message="quizattemptsupgradedmessage" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_slasharguments" level="optional">
<FEEDBACK>
<ON_CHECK message="slashargumentswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_tables_row_format" level="optional">
<FEEDBACK>
<ON_CHECK message="unsupporteddbtablerowformat" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_unoconv_version" level="optional">
<FEEDBACK>
<ON_CHECK message="unoconvwarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_libcurl_version" level="optional">
<FEEDBACK>
<ON_CHECK message="libcurlwarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_file_format" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbfileformat" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_file_per_table" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbfilepertable" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_large_prefix" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddblargeprefix" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_is_https" level="optional">
<FEEDBACK>
<ON_CHECK message="ishttpswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_incomplete_unicode_support" level="optional">
<FEEDBACK>
<ON_CHECK message="incompleteunicodesupport" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_sixtyfour_bits" level="optional">
<FEEDBACK>
<ON_CHECK message="sixtyfourbitswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
</CUSTOM_CHECKS>
</MOODLE>
<MOODLE version="3.11" requires="3.6">
<UNICODE level="required">
<FEEDBACK>
<ON_ERROR message="unicoderequired" />
</FEEDBACK>
</UNICODE>
<DATABASE level="required">
<VENDOR name="mariadb" version="10.2.29" />
<VENDOR name="mysql" version="5.7" />
<VENDOR name="postgres" version="9.6" />
<VENDOR name="mssql" version="14.0" />
<VENDOR name="oracle" version="11.2" />
</DATABASE>
<PHP version="7.3.0" level="required">
</PHP>
<PCREUNICODE level="optional">
<FEEDBACK>
<ON_CHECK message="pcreunicodewarning" />
</FEEDBACK>
</PCREUNICODE>
<PHP_EXTENSIONS>
<PHP_EXTENSION name="iconv" level="required">
<FEEDBACK>
<ON_ERROR message="iconvrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="mbstring" level="required">
<FEEDBACK>
<ON_ERROR message="mbstringrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="curl" level="required">
<FEEDBACK>
<ON_ERROR message="curlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="openssl" level="required">
<FEEDBACK>
<ON_ERROR message="opensslrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="tokenizer" level="optional">
<FEEDBACK>
<ON_CHECK message="tokenizerrecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="xmlrpc" level="optional">
<FEEDBACK>
<ON_CHECK message="xmlrpcrecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="soap" level="optional">
<FEEDBACK>
<ON_CHECK message="soaprecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="ctype" level="required">
<FEEDBACK>
<ON_ERROR message="ctyperequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="zip" level="required">
<FEEDBACK>
<ON_ERROR message="ziprequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="zlib" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="gd" level="required">
<FEEDBACK>
<ON_ERROR message="gdrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="simplexml" level="required">
<FEEDBACK>
<ON_ERROR message="simplexmlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="spl" level="required">
<FEEDBACK>
<ON_ERROR message="splrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="pcre" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="dom" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="xml" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="xmlreader" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="intl" level="required">
<FEEDBACK>
<ON_ERROR message="intlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="json" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="hash" level="required"/>
<PHP_EXTENSION name="fileinfo" level="required"/>
<PHP_EXTENSION name="sodium" level="required"/>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="96M" level="required">
<FEEDBACK>
<ON_ERROR message="settingmemorylimit" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="file_uploads" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="settingfileuploads" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="opcache.enable" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="opcacherecommended" />
</FEEDBACK>
</PHP_SETTING>
</PHP_SETTINGS>
<CUSTOM_CHECKS>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_storage_engine" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbstorageengine" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="question/engine/upgrade/upgradelib.php" function="quiz_attempts_upgraded" level="required">
<FEEDBACK>
<ON_ERROR message="quizattemptsupgradedmessage" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_slasharguments" level="optional">
<FEEDBACK>
<ON_CHECK message="slashargumentswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_tables_row_format" level="optional">
<FEEDBACK>
<ON_CHECK message="unsupporteddbtablerowformat" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_unoconv_version" level="optional">
<FEEDBACK>
<ON_CHECK message="unoconvwarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_libcurl_version" level="optional">
<FEEDBACK>
<ON_CHECK message="libcurlwarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_file_format" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbfileformat" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_file_per_table" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbfilepertable" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_large_prefix" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddblargeprefix" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_is_https" level="optional">
<FEEDBACK>
<ON_CHECK message="ishttpswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_incomplete_unicode_support" level="optional">
<FEEDBACK>
<ON_CHECK message="incompleteunicodesupport" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_sixtyfour_bits" level="optional">
<FEEDBACK>
<ON_CHECK message="sixtyfourbitswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
</CUSTOM_CHECKS>
</MOODLE>
</COMPATIBILITY_MATRIX>
+4 -2
View File
@@ -509,7 +509,8 @@ if (!$cache and $version > $CFG->version) { // upgrade
// Always verify plugin dependencies!
$failed = array();
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed, $CFG->branch)) {
echo $output->unsatisfied_dependencies_page($version, $failed, $PAGE->url);
echo $output->unsatisfied_dependencies_page($version, $failed, new moodle_url($PAGE->url,
array('confirmplugincheck' => 0)));
die();
}
unset($failed);
@@ -701,7 +702,8 @@ if (!$cache and moodle_needs_upgrading()) {
$failed = array();
if (!$pluginman->all_plugins_ok($version, $failed, $CFG->branch)) {
$output = $PAGE->get_renderer('core', 'admin');
echo $output->unsatisfied_dependencies_page($version, $failed, $PAGE->url);
echo $output->unsatisfied_dependencies_page($version, $failed, new moodle_url($PAGE->url,
array('confirmplugincheck' => 0)));
die();
}
unset($failed);
+4 -2
View File
@@ -49,6 +49,7 @@
array($module->id));
core_plugin_manager::reset_caches();
admin_get_root(true, false); // settings not required - only pages
redirect(new moodle_url('/admin/modules.php'));
}
if (!empty($show) and confirm_sesskey()) {
@@ -66,6 +67,7 @@
array($module->id));
core_plugin_manager::reset_caches();
admin_get_root(true, false); // settings not required - only pages
redirect(new moodle_url('/admin/modules.php'));
}
echo $OUTPUT->header();
@@ -121,8 +123,8 @@
$count = -1;
}
if ($count>0) {
$countlink = "<a href=\"{$CFG->wwwroot}/course/search.php?modulelist=$module->name" .
"&amp;sesskey=".sesskey()."\" title=\"$strshowmodulecourse\">$count</a>";
$countlink = $OUTPUT->action_link(new moodle_url('/course/search.php', ['modulelist' => $module->name]),
$count, null, ['title' => $strshowmodulecourse]);
} else if ($count < 0) {
$countlink = get_string('error');
} else {
+1 -1
View File
@@ -53,7 +53,6 @@ $pageurl = new moodle_url('/admin/plugins.php', $pageparams);
$pluginman = core_plugin_manager::instance();
if ($uninstall) {
require_sesskey();
if (!$confirmed) {
admin_externalpage_setup('pluginsoverview', '', $pageparams);
@@ -92,6 +91,7 @@ if ($uninstall) {
exit();
} else {
require_sesskey();
$SESSION->pluginuninstallreturn = $pluginfo->get_return_url_after_uninstall($return);
$progress = new progress_trace_buffer(new text_progress_trace(), false);
$pluginman->uninstall_plugin($pluginfo->component, $progress);
+2 -2
View File
@@ -1110,7 +1110,7 @@ class core_admin_renderer extends plugin_renderer_base {
if (!empty($installabortable[$plugin->component])) {
$status .= $this->output->single_button(
new moodle_url($this->page->url, array('abortinstall' => $plugin->component)),
new moodle_url($this->page->url, array('abortinstall' => $plugin->component, 'confirmplugincheck' => 0)),
get_string('cancelinstallone', 'core_plugin'),
'post',
array('class' => 'actionbutton cancelinstallone d-block mt-1')
@@ -1209,7 +1209,7 @@ class core_admin_renderer extends plugin_renderer_base {
if ($installabortable) {
$out .= $this->output->single_button(
new moodle_url($this->page->url, array('abortinstallx' => 1)),
new moodle_url($this->page->url, array('abortinstallx' => 1, 'confirmplugincheck' => 0)),
get_string('cancelinstallall', 'core_plugin', count($installabortable)),
'post',
array('class' => 'singlebutton cancelinstallall mr-1')
+7 -7
View File
@@ -536,7 +536,7 @@ class core_role_privacy_testcase extends provider_testcase {
$user1->id,
$admin->id
];
$this->assertEquals($expected, $userlist2->get_userids(), '', 0.0, 10, true);
$this->assertEqualsCanonicalizing($expected, $userlist2->get_userids());
// The user list for coursecontext1 should user1, user2 and admin (role creator).
$userlist3 = new \core_privacy\local\request\userlist($coursecontext1, $component);
@@ -547,7 +547,7 @@ class core_role_privacy_testcase extends provider_testcase {
$user2->id,
$admin->id
];
$this->assertEquals($expected, $userlist3->get_userids(), '', 0.0, 10, true);
$this->assertEqualsCanonicalizing($expected, $userlist3->get_userids());
// The user list for coursecatcontext should user2 and admin (role creator).
$userlist4 = new \core_privacy\local\request\userlist($coursecatcontext, $component);
@@ -557,7 +557,7 @@ class core_role_privacy_testcase extends provider_testcase {
$user2->id,
$admin->id
];
$this->assertEquals($expected, $userlist4->get_userids(), '', 0.0, 10, true);
$this->assertEqualsCanonicalizing($expected, $userlist4->get_userids());
// The user list for systemcontext should user1 and admin (role creator).
$userlist6 = new \core_privacy\local\request\userlist($systemcontext, $component);
@@ -567,7 +567,7 @@ class core_role_privacy_testcase extends provider_testcase {
$user1->id,
$admin->id
];
$this->assertEquals($expected, $userlist6->get_userids(), '', 0.0, 10, true);
$this->assertEqualsCanonicalizing($expected, $userlist6->get_userids());
// The user list for cmcontext should user1, user2 and admin (role creator).
$userlist7 = new \core_privacy\local\request\userlist($cmcontext, $component);
@@ -578,7 +578,7 @@ class core_role_privacy_testcase extends provider_testcase {
$user2->id,
$admin->id
];
$this->assertEquals($expected, $userlist7->get_userids(), '', 0.0, 10, true);
$this->assertEqualsCanonicalizing($expected, $userlist7->get_userids());
// The user list for blockcontext should user1 and admin (role creator).
$userlist8 = new \core_privacy\local\request\userlist($blockcontext, $component);
@@ -588,7 +588,7 @@ class core_role_privacy_testcase extends provider_testcase {
$user1->id,
$admin->id
];
$this->assertEquals($expected, $userlist8->get_userids(), '', 0.0, 10, true);
$this->assertEqualsCanonicalizing($expected, $userlist8->get_userids());
}
/**
@@ -744,4 +744,4 @@ class core_role_privacy_testcase extends provider_testcase {
}
return $rolesnames;
}
}
}
+10 -3
View File
@@ -68,9 +68,16 @@ if ($errormsg !== '') {
$showsettingslinks = true;
if ($hassiteconfig) {
require_once("admin_settings_search_form.php");
$form = new admin_settings_search_form();
$form->display();
$data = [
'action' => new moodle_url('/admin/search.php'),
'btnclass' => 'btn-primary',
'inputname' => 'query',
'searchstring' => get_string('search'),
'query' => $query,
'extraclasses' => 'd-flex justify-content-center'
];
echo $OUTPUT->render_from_template('core/search_input', $data);
echo '<hr>';
if ($query) {
echo admin_search_settings_html($query);
+3 -8
View File
@@ -131,15 +131,10 @@ if ($hassiteconfig && \core_analytics\manager::is_analytics_enabled()) {
$timesplittingdefaults, $timesplittingoptions)
);
// Predictions processor output dir.
$defaultmodeloutputdir = rtrim($CFG->dataroot, '/') . DIRECTORY_SEPARATOR . 'models';
if (empty(get_config('analytics', 'modeloutputdir')) && !file_exists($defaultmodeloutputdir) &&
is_writable($defaultmodeloutputdir)) {
// Automatically create the dir for them so users don't see the invalid value red cross.
mkdir($defaultmodeloutputdir, $CFG->directorypermissions, true);
}
// Predictions processor output dir - specify default in setting description (used if left blank).
$defaultmodeloutputdir = \core_analytics\model::default_output_dir();
$settings->add(new admin_setting_configdirectory('analytics/modeloutputdir', new lang_string('modeloutputdir', 'analytics'),
new lang_string('modeloutputdirinfo', 'analytics'), $defaultmodeloutputdir));
new lang_string('modeloutputdirwithdefaultinfo', 'analytics', $defaultmodeloutputdir), ''));
// Disable web interface evaluation and get predictions.
$settings->add(new admin_setting_configcheckbox('analytics/onlycli', new lang_string('onlycli', 'analytics'),
+67
View File
@@ -22,6 +22,8 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use core_admin\local\settings\filesize;
$capabilities = array(
'moodle/backup:backupcourse',
'moodle/category:manage',
@@ -75,6 +77,17 @@ if ($hassiteconfig or has_any_capability($capabilities, $systemcontext)) {
$temp->add(new admin_setting_configselect('moodlecourse/visible', new lang_string('visible'), new lang_string('visible_help'),
1, $choices));
// Enable/disable download course content.
$choices = [
DOWNLOAD_COURSE_CONTENT_DISABLED => new lang_string('no'),
DOWNLOAD_COURSE_CONTENT_ENABLED => new lang_string('yes'),
];
$downloadcontentsitedefault = new admin_setting_configselect('moodlecourse/downloadcontentsitedefault',
new lang_string('enabledownloadcoursecontent', 'course'),
new lang_string('downloadcoursecontent_help', 'course'), 0, $choices);
$downloadcontentsitedefault->add_dependent_on('downloadcoursecontentallowed');
$temp->add($downloadcontentsitedefault);
// Course format.
$temp->add(new admin_setting_heading('courseformathdr', new lang_string('type_format', 'plugin'), ''));
@@ -161,6 +174,21 @@ if ($hassiteconfig or has_any_capability($capabilities, $systemcontext)) {
$ADMIN->add('courses', $temp);
// Download course content.
$downloadcoursedefaulturl = new moodle_url('/admin/settings.php', ['section' => 'coursesettings']);
$temp = new admin_settingpage('downloadcoursecontent', new lang_string('downloadcoursecontent', 'course'));
$temp->add(new admin_setting_configcheckbox('downloadcoursecontentallowed',
new lang_string('downloadcoursecontentallowed', 'admin'),
new lang_string('downloadcoursecontentallowed_desc', 'admin', $downloadcoursedefaulturl->out()), 0));
// 50MB default maximum size per file when downloading course content.
$defaultmaxdownloadsize = 50 * filesize::UNIT_MB;
$temp->add(new filesize('maxsizeperdownloadcoursefile', new lang_string('maxsizeperdownloadcoursefile', 'admin'),
new lang_string('maxsizeperdownloadcoursefile_desc', 'admin'), $defaultmaxdownloadsize, filesize::UNIT_MB));
$temp->hide_if('maxsizeperdownloadcoursefile', 'downloadcoursecontentallowed');
$ADMIN->add('courses', $temp);
// "courserequests" settingpage.
$temp = new admin_settingpage('courserequest', new lang_string('courserequest'));
$temp->add(new admin_setting_configcheckbox('enablecourserequests',
@@ -184,6 +212,7 @@ if ($hassiteconfig or has_any_capability($capabilities, $systemcontext)) {
// Add a category for the Activity Chooser.
$ADMIN->add('courses', new admin_category('activitychooser', new lang_string('activitychoosercategory', 'course')));
$temp = new admin_settingpage('activitychoosersettings', new lang_string('activitychoosersettings', 'course'));
// Tab mode for the activity chooser.
$temp->add(
new admin_setting_configselect(
'activitychoosertabmode',
@@ -197,6 +226,31 @@ if ($hassiteconfig or has_any_capability($capabilities, $systemcontext)) {
]
)
);
// Build a list of plugins that use the footer callback.
$pluginswithfunction = get_plugins_with_function('custom_chooser_footer', 'lib.php');
$pluginsoptions = [];
$pluginsoptions[COURSE_CHOOSER_FOOTER_NONE] = get_string('activitychooserhidefooter', 'course');
if ($pluginswithfunction) {
foreach ($pluginswithfunction as $plugintype => $plugins) {
foreach ($plugins as $pluginname => $pluginfunction) {
$plugin = $plugintype.'_'.$pluginname;
$pluginsoptions[$plugin] = get_string('pluginname', $plugin);
}
}
}
// Select what plugin to show in the footer.
$temp->add(
new admin_setting_configselect(
'activitychooseractivefooter',
new lang_string('activitychooseractivefooter', 'course'),
new lang_string('activitychooseractivefooter_desc', 'course'),
COURSE_CHOOSER_FOOTER_NONE,
$pluginsoptions
)
);
$ADMIN->add('activitychooser', $temp);
$ADMIN->add('activitychooser',
new admin_externalpage('activitychooserrecommended', new lang_string('activitychooserrecommendations', 'course'),
@@ -259,6 +313,9 @@ if ($hassiteconfig or has_any_capability($capabilities, $systemcontext)) {
['value' => 1, 'locked' => 0])
);
$temp->add(new admin_setting_configcheckbox_with_lock('backup/backup_general_legacyfiles',
new lang_string('generallegacyfiles', 'backup'),
new lang_string('configlegacyfiles', 'backup'), array('value' => 1, 'locked' => 0)));
$ADMIN->add('backups', $temp);
// Create a page for general import configuration and defaults.
@@ -285,6 +342,9 @@ if ($hassiteconfig or has_any_capability($capabilities, $systemcontext)) {
new lang_string('configgeneralcontentbankcontent', 'backup'),
['value' => 1, 'locked' => 0])
);
$temp->add(new admin_setting_configcheckbox_with_lock('backup/backup_import_legacyfiles',
new lang_string('generallegacyfiles', 'backup'),
new lang_string('configlegacyfiles', 'backup'), array('value' => 1, 'locked' => 0)));
$ADMIN->add('backups', $temp);
@@ -411,6 +471,10 @@ if ($hassiteconfig or has_any_capability($capabilities, $systemcontext)) {
1)
);
$temp->add(new admin_setting_configcheckbox('backup/backup_auto_legacyfiles',
new lang_string('generallegacyfiles', 'backup'),
new lang_string('configlegacyfiles', 'backup'), 1));
//$temp->add(new admin_setting_configcheckbox('backup/backup_auto_messages', new lang_string('messages', 'message'), new lang_string('backupmessageshelp','message'), 0));
//$temp->add(new admin_setting_configcheckbox('backup/backup_auto_blogs', new lang_string('blogs', 'blog'), new lang_string('backupblogshelp','blog'), 0));
@@ -473,6 +537,9 @@ if ($hassiteconfig or has_any_capability($capabilities, $systemcontext)) {
$temp->add(new admin_setting_configcheckbox_with_lock('restore/restore_general_contentbankcontent',
new lang_string('generalcontentbankcontent', 'backup'),
new lang_string('configrestorecontentbankcontent', 'backup'), array('value' => 1, 'locked' => 0)));
$temp->add(new admin_setting_configcheckbox_with_lock('restore/restore_general_legacyfiles',
new lang_string('generallegacyfiles', 'backup'),
new lang_string('configlegacyfiles', 'backup'), array('value' => 1, 'locked' => 0)));
// Restore defaults when merging into another course.
$temp->add(new admin_setting_heading('mergerestoredefaults', new lang_string('mergerestoredefaults', 'backup'), ''));
+7
View File
@@ -41,6 +41,13 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
$temp->add(new admin_setting_configcheckbox('debugdisplay', new lang_string('debugdisplay', 'admin'), new lang_string('configdebugdisplay', 'admin'), ini_get_bool('display_errors')));
$temp->add(new admin_setting_configcheckbox('perfdebug', new lang_string('perfdebug', 'admin'), new lang_string('configperfdebug', 'admin'), '7', '15', '7'));
$temp->add(new admin_setting_configcheckbox('debugstringids', new lang_string('debugstringids', 'admin'), new lang_string('debugstringids_desc', 'admin'), 0));
$temp->add(new admin_setting_configselect('debugsqltrace',
new lang_string('debugsqltrace', 'admin'),
new lang_string('debugsqltrace_desc', 'admin'), 0, array(
0 => new lang_string('disabled', 'admin'),
1 => new lang_string('debugsqltrace1', 'admin'),
2 => new lang_string('debugsqltrace2', 'admin'),
100 => new lang_string('debugsqltrace100', 'admin'))));
$temp->add(new admin_setting_configcheckbox('debugvalidators', new lang_string('debugvalidators', 'admin'), new lang_string('configdebugvalidators', 'admin'), 0));
$temp->add(new admin_setting_configcheckbox('debugpageinfo', new lang_string('debugpageinfo', 'admin'), new lang_string('configdebugpageinfo', 'admin'), 0));
$ADMIN->add('development', $temp);
+2
View File
@@ -8,6 +8,8 @@ if ($hassiteconfig) {
$temp = new admin_settingpage('langsettings', new lang_string('languagesettings', 'admin'));
$temp->add(new admin_setting_configcheckbox('autolang', new lang_string('autolang', 'admin'), new lang_string('configautolang', 'admin'), 1));
$temp->add(new admin_setting_configselect('lang', new lang_string('lang', 'admin'), new lang_string('configlang', 'admin'), current_language(), get_string_manager()->get_list_of_translations())); // $CFG->lang might be set in installer already, default en is in setup.php
$temp->add(new admin_setting_configcheckbox('autolangusercreation', new lang_string('autolangusercreation', 'admin'),
new lang_string('configautolangusercreation', 'admin'), 1));
$temp->add(new admin_setting_configcheckbox('langmenu', new lang_string('langmenu', 'admin'), new lang_string('configlangmenu', 'admin'), 1));
$temp->add(new admin_setting_langlist());
$temp->add(new admin_setting_configcheckbox('langcache', new lang_string('langcache', 'admin'), new lang_string('langcache_desc', 'admin'), 1));
+50 -14
View File
@@ -1,21 +1,57 @@
<?php
// This file is part of Moodle - https://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
/**
* Define administration settings on the Location settings page.
*
* @package core
* @category admin
* @copyright 2006 Martin Dougiamas <martin@moodle.com>
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
// "locations" settingpage
$temp = new admin_settingpage('locationsettings', new lang_string('locationsettings', 'admin'));
$temp->add(new admin_setting_servertimezone());
$temp->add(new admin_setting_forcetimezone());
$temp->add(new admin_settings_country_select('country', new lang_string('country', 'admin'), new lang_string('configcountry', 'admin'), 0));
$temp->add(new admin_setting_configtext('defaultcity', new lang_string('defaultcity', 'admin'), new lang_string('defaultcity_help', 'admin'), ''));
defined('MOODLE_INTERNAL') || die();
$temp->add(new admin_setting_heading('iplookup', new lang_string('iplookup', 'admin'), new lang_string('iplookupinfo', 'admin')));
$temp->add(new admin_setting_configfile('geoip2file', new lang_string('geoipfile', 'admin'),
new lang_string('configgeoipfile', 'admin', $CFG->dataroot.'/geoip/'), $CFG->dataroot.'/geoip/GeoLite2-City.mmdb'));
$temp->add(new admin_setting_configtext('googlemapkey3', new lang_string('googlemapkey3', 'admin'), new lang_string('googlemapkey3_help', 'admin'), '', PARAM_RAW, 60));
if ($hassiteconfig) {
$temp = new admin_settingpage('locationsettings', new lang_string('locationsettings', 'core_admin'));
$temp->add(new admin_setting_configtext('allcountrycodes', new lang_string('allcountrycodes', 'admin'), new lang_string('configallcountrycodes', 'admin'), '', '/^(?:\w+(?:,\w+)*)?$/'));
if ($ADMIN->fulltree) {
$temp->add(new admin_setting_servertimezone());
$temp->add(new admin_setting_forcetimezone());
$temp->add(new admin_settings_country_select('country', new lang_string('country', 'core_admin'),
new lang_string('configcountry', 'core_admin'), 0));
$temp->add(new admin_setting_configtext('defaultcity', new lang_string('defaultcity', 'core_admin'),
new lang_string('defaultcity_help', 'core_admin'), ''));
$temp->add(new admin_setting_heading('iplookup', new lang_string('iplookup', 'core_admin'),
new lang_string('iplookupinfo', 'core_admin')));
$temp->add(new admin_setting_configfile('geoip2file', new lang_string('geoipfile', 'core_admin'),
new lang_string('configgeoipfile', 'core_admin', $CFG->dataroot . '/geoip/'),
$CFG->dataroot . '/geoip/GeoLite2-City.mmdb'));
$temp->add(new admin_setting_configtext('googlemapkey3', new lang_string('googlemapkey3', 'core_admin'),
new lang_string('googlemapkey3_help', 'core_admin'), '', PARAM_RAW, 60));
$temp->add(new admin_setting_countrycodes('allcountrycodes', new lang_string('allcountrycodes', 'core_admin'),
new lang_string('configallcountrycodes', 'core_admin')));
}
$ADMIN->add('location', $temp);
} // end of speedup
}
+29
View File
@@ -0,0 +1,29 @@
<?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/>.
/**
* Adds payments links to the admin tree
*
* @package core
* @copyright 2020 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
$ADMIN->add('payment', new admin_externalpage(
'paymentaccounts',
new lang_string('paymentaccounts', 'payment'),
new moodle_url("/payment/accounts.php"),
['moodle/payment:manageaccounts', 'moodle/payment:viewpayments']));
+108 -5
View File
@@ -167,6 +167,42 @@ if ($hassiteconfig) {
$ADMIN->add('modules', new admin_category('antivirussettings', new lang_string('antiviruses', 'antivirus')));
$temp = new admin_settingpage('manageantiviruses', new lang_string('antivirussettings', 'antivirus'));
$temp->add(new admin_setting_manageantiviruses());
// Common settings.
$temp->add(new admin_setting_heading('antiviruscommonsettings', new lang_string('antiviruscommonsettings', 'antivirus'), ''));
// Alert email.
$temp->add(
new admin_setting_configtext(
'antivirus/notifyemail',
new lang_string('notifyemail', 'antivirus'),
new lang_string('notifyemail_help', 'antivirus'),
'',
PARAM_EMAIL
)
);
// Enable quarantine.
$temp->add(
new admin_setting_configcheckbox(
'antivirus/enablequarantine',
new lang_string('enablequarantine', 'antivirus'),
new lang_string('enablequarantine_help', 'antivirus',
\core\antivirus\quarantine::DEFAULT_QUARANTINE_FOLDER),
0
)
);
// Quarantine time.
$temp->add(
new admin_setting_configduration(
'antivirus/quarantinetime',
new lang_string('quarantinetime', 'antivirus'),
new lang_string('quarantinetime_desc', 'antivirus'),
\core\antivirus\quarantine::DEFAULT_QUARANTINE_TIME
)
);
$ADMIN->add('antivirussettings', $temp);
$plugins = core_plugin_manager::instance()->get_plugins_of_type('antivirus');
core_collator::asort_objects_by_property($plugins, 'displayname');
@@ -244,6 +280,25 @@ if ($hassiteconfig) {
$plugin->load_settings($ADMIN, 'mediaplayers', $hassiteconfig);
}
// Payment gateway plugins.
$ADMIN->add('modules', new admin_category('paymentgateways', new lang_string('type_paygw_plural', 'plugin')));
$temp = new admin_settingpage('managepaymentgateways', new lang_string('type_paygwmanage', 'plugin'));
$temp->add(new \core_admin\local\settings\manage_payment_gateway_plugins());
$temp->add(new admin_setting_description(
'managepaymentgatewayspostfix',
'',
new lang_string('gotopaymentaccounts', 'payment',
html_writer::link(new moodle_url('/payment/accounts.php'), get_string('paymentaccounts', 'payment')))
));
$ADMIN->add('paymentgateways', $temp);
$plugins = core_plugin_manager::instance()->get_plugins_of_type('paygw');
core_collator::asort_objects_by_property($plugins, 'displayname');
foreach ($plugins as $plugin) {
/** @var \core\plugininfo\paygw $plugin */
$plugin->load_settings($ADMIN, 'paymentgateways', $hassiteconfig);
}
// Data format settings.
$ADMIN->add('modules', new admin_category('dataformatsettings', new lang_string('dataformats')));
$temp = new admin_settingpage('managedataformats', new lang_string('managedataformats'));
@@ -549,8 +604,19 @@ if ($hassiteconfig) {
// Search engine selection.
$temp->add(new admin_setting_heading('searchengineheading', new lang_string('searchengine', 'admin'), ''));
$temp->add(new admin_setting_configselect('searchengine',
new lang_string('selectsearchengine', 'admin'), '', 'simpledb', $engines));
$searchengineselect = new admin_setting_configselect('searchengine',
new lang_string('selectsearchengine', 'admin'), '', 'simpledb', $engines);
$searchengineselect->set_validate_function(function(string $value): string {
global $CFG;
// Check nobody's setting the indexing and query-only server to the same one.
if (isset($CFG->searchenginequeryonly) && $CFG->searchenginequeryonly === $value) {
return get_string('searchenginequeryonlysame', 'admin');
} else {
return '';
}
});
$temp->add($searchengineselect);
$temp->add(new admin_setting_heading('searchoptionsheading', new lang_string('searchoptions', 'admin'), ''));
$temp->add(new admin_setting_configcheckbox('searchindexwhendisabled',
new lang_string('searchindexwhendisabled', 'admin'), new lang_string('searchindexwhendisabled_desc', 'admin'),
@@ -590,6 +656,43 @@ if ($hassiteconfig) {
new lang_string('searchhideallcategory_desc', 'admin'),
0));
$temp->add(new admin_setting_heading('searchmanagement', new lang_string('searchmanagement', 'admin'),
new lang_string('searchmanagement_desc', 'admin')));
// Get list of search engines including those with alternate settings.
$searchenginequeryonlyselect = new admin_setting_configselect('searchenginequeryonly',
new lang_string('searchenginequeryonly', 'admin'),
new lang_string('searchenginequeryonly_desc', 'admin'), '', function() use($engines) {
$options = ['' => new lang_string('searchenginequeryonly_none', 'admin')];
foreach ($engines as $name => $display) {
$options[$name] = $display;
$classname = '\search_' . $name . '\engine';
$engine = new $classname;
if ($engine->has_alternate_configuration()) {
$options[$name . '-alternate'] =
new lang_string('searchenginealternatesettings', 'admin', $display);
}
}
return $options;
});
$searchenginequeryonlyselect->set_validate_function(function(string $value): string {
global $CFG;
// Check nobody's setting the indexing and query-only server to the same one.
if (isset($CFG->searchengine) && $CFG->searchengine === $value) {
return get_string('searchenginequeryonlysame', 'admin');
} else {
return '';
}
});
$temp->add($searchenginequeryonlyselect);
$temp->add(new admin_setting_configcheckbox('searchbannerenable',
new lang_string('searchbannerenable', 'admin'), new lang_string('searchbannerenable_desc', 'admin'),
0));
$temp->add(new admin_setting_confightmleditor('searchbanner',
new lang_string('searchbanner', 'admin'), '', ''));
$ADMIN->add('searchplugins', $temp);
$ADMIN->add('searchplugins', new admin_externalpage('searchareas', new lang_string('searchareas', 'admin'),
new moodle_url('/admin/searchareas.php')));
@@ -645,14 +748,14 @@ if ($hassiteconfig) {
// Content bank content types.
if ($hassiteconfig) {
$ADMIN->add('modules', new admin_category('contenbanksettings', new lang_string('contentbank')));
$ADMIN->add('modules', new admin_category('contentbanksettings', new lang_string('contentbank')));
$temp = new admin_settingpage('managecontentbanktypes', new lang_string('managecontentbanktypes'));
$temp->add(new admin_setting_managecontentbankcontenttypes());
$ADMIN->add('contenbanksettings', $temp);
$ADMIN->add('contentbanksettings', $temp);
$plugins = core_plugin_manager::instance()->get_plugins_of_type('contenttype');
foreach ($plugins as $plugin) {
/** @var \core\plugininfo\contentbank $plugin */
$plugin->load_settings($ADMIN, 'contenbanksettings', $hassiteconfig);
$plugin->load_settings($ADMIN, 'contentbanksettings', $hassiteconfig);
}
}
+17
View File
@@ -160,6 +160,23 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
$temp->add(new admin_setting_configportlist('curlsecurityallowedport',
new lang_string('curlsecurityallowedport', 'admin'),
new lang_string('curlsecurityallowedportsyntax', 'admin'), ""));
// HTTP Header referrer policy settings.
$referreroptions = [
'default' => get_string('referrernone', 'admin'),
'no-referrer' => 'no-referrer',
'no-referrer-when-downgrade' => 'no-referrer-when-downgrade',
'origin' => 'origin',
'origin-when-cross-origin' => 'origin-when-cross-origin',
'same-origin' => 'same-origin',
'strict-origin' => 'strict-origin',
'strict-origin-when-cross-origin' => 'strict-origin-when-cross-origin',
'unsafe-url' => 'unsafe-url',
];
$temp->add(new admin_setting_configselect('referrerpolicy',
new lang_string('referrerpolicy', 'admin'),
new lang_string('referrerpolicydesc', 'admin'), 'default', $referreroptions));
$ADMIN->add('security', $temp);
// "notifications" settingpage
+460 -318
View File
@@ -1,162 +1,225 @@
<?php
// This file is part of Moodle - https://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
// This file defines settingpages and externalpages under the "server" category
/**
* Defines settingpages and externalpages under the "server" category.
*
* @package core
* @category admin
* @copyright 2006 Martin Dougiamas
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
defined('MOODLE_INTERNAL') || die();
// "systempaths" settingpage
$temp = new admin_settingpage('systempaths', new lang_string('systempaths','admin'));
$temp->add(new admin_setting_configexecutable('pathtophp', new lang_string('pathtophp', 'admin'),
new lang_string('configpathtophp', 'admin'), ''));
$temp->add(new admin_setting_configexecutable('pathtodu', new lang_string('pathtodu', 'admin'), new lang_string('configpathtodu', 'admin'), ''));
$temp->add(new admin_setting_configexecutable('aspellpath', new lang_string('aspellpath', 'admin'), new lang_string('edhelpaspellpath'), ''));
$temp->add(new admin_setting_configexecutable('pathtodot', new lang_string('pathtodot', 'admin'), new lang_string('pathtodot_help', 'admin'), ''));
$temp->add(new admin_setting_configexecutable('pathtogs', new lang_string('pathtogs', 'admin'), new lang_string('pathtogs_help', 'admin'), '/usr/bin/gs'));
$temp->add(new admin_setting_configexecutable('pathtopython', new lang_string('pathtopython', 'admin'),
new lang_string('pathtopythondesc', 'admin'), ''));
$ADMIN->add('server', $temp);
if ($hassiteconfig) {
// System paths.
$temp = new admin_settingpage('systempaths', new lang_string('systempaths', 'admin'));
$temp->add(new admin_setting_configexecutable('pathtophp', new lang_string('pathtophp', 'admin'),
new lang_string('configpathtophp', 'admin'), ''));
$temp->add(new admin_setting_configexecutable('pathtodu', new lang_string('pathtodu', 'admin'),
new lang_string('configpathtodu', 'admin'), ''));
$temp->add(new admin_setting_configexecutable('aspellpath', new lang_string('aspellpath', 'admin'),
new lang_string('edhelpaspellpath'), ''));
$temp->add(new admin_setting_configexecutable('pathtodot', new lang_string('pathtodot', 'admin'),
new lang_string('pathtodot_help', 'admin'), ''));
$temp->add(new admin_setting_configexecutable('pathtogs', new lang_string('pathtogs', 'admin'),
new lang_string('pathtogs_help', 'admin'), '/usr/bin/gs'));
$temp->add(new admin_setting_configexecutable('pathtopython', new lang_string('pathtopython', 'admin'),
new lang_string('pathtopythondesc', 'admin'), ''));
$ADMIN->add('server', $temp);
// Support contact.
$temp = new admin_settingpage('supportcontact', new lang_string('supportcontact', 'admin'));
$primaryadmin = get_admin();
if ($primaryadmin) {
$primaryadminemail = $primaryadmin->email;
$primaryadminname = fullname($primaryadmin, true);
} else {
// No defaults during installation - admin user must be created first.
$primaryadminemail = null;
$primaryadminname = null;
}
$temp->add(new admin_setting_configtext('supportname', new lang_string('supportname', 'admin'),
new lang_string('configsupportname', 'admin'), $primaryadminname, PARAM_NOTAGS));
$setting = new admin_setting_configtext('supportemail', new lang_string('supportemail', 'admin'),
new lang_string('configsupportemail', 'admin'), $primaryadminemail, PARAM_EMAIL);
$setting->set_force_ltr(true);
$temp->add($setting);
$temp->add(new admin_setting_configtext('supportpage', new lang_string('supportpage', 'admin'),
new lang_string('configsupportpage', 'admin'), '', PARAM_URL));
$ADMIN->add('server', $temp);
// Session handling.
$temp = new admin_settingpage('sessionhandling', new lang_string('sessionhandling', 'admin'));
if (empty($CFG->session_handler_class) and $DB->session_lock_supported()) {
$temp->add(new admin_setting_configcheckbox('dbsessions', new lang_string('dbsessions', 'admin'),
new lang_string('configdbsessions', 'admin'), 0));
}
// "supportcontact" settingpage
$temp = new admin_settingpage('supportcontact', new lang_string('supportcontact','admin'));
$primaryadmin = get_admin();
if ($primaryadmin) {
$primaryadminemail = $primaryadmin->email;
$primaryadminname = fullname($primaryadmin, true);
} else {
// no defaults during installation - admin user must be created first
$primaryadminemail = NULL;
$primaryadminname = NULL;
}
$temp->add(new admin_setting_configtext('supportname', new lang_string('supportname', 'admin'),
new lang_string('configsupportname', 'admin'), $primaryadminname, PARAM_NOTAGS));
$setting = new admin_setting_configtext('supportemail', new lang_string('supportemail', 'admin'),
new lang_string('configsupportemail', 'admin'), $primaryadminemail, PARAM_EMAIL);
$setting->set_force_ltr(true);
$temp->add($setting);
$temp->add(new admin_setting_configtext('supportpage', new lang_string('supportpage', 'admin'), new lang_string('configsupportpage', 'admin'), '', PARAM_URL));
$ADMIN->add('server', $temp);
$temp->add(new admin_setting_configduration('sessiontimeout', new lang_string('sessiontimeout', 'admin'),
new lang_string('configsessiontimeout', 'admin'), 8 * 60 * 60));
$temp->add(new admin_setting_configtext('sessioncookie', new lang_string('sessioncookie', 'admin'),
new lang_string('configsessioncookie', 'admin'), '', PARAM_ALPHANUM));
$temp->add(new admin_setting_configtext('sessioncookiepath', new lang_string('sessioncookiepath', 'admin'),
new lang_string('configsessioncookiepath', 'admin'), '', PARAM_RAW));
$temp->add(new admin_setting_configtext('sessioncookiedomain', new lang_string('sessioncookiedomain', 'admin'),
new lang_string('configsessioncookiedomain', 'admin'), '', PARAM_RAW, 50));
$ADMIN->add('server', $temp);
// "sessionhandling" settingpage
$temp = new admin_settingpage('sessionhandling', new lang_string('sessionhandling', 'admin'));
if (empty($CFG->session_handler_class) and $DB->session_lock_supported()) {
$temp->add(new admin_setting_configcheckbox('dbsessions', new lang_string('dbsessions', 'admin'), new lang_string('configdbsessions', 'admin'), 0));
}
// Statistics.
$temp = new admin_settingpage('stats', new lang_string('stats'), 'moodle/site:config', empty($CFG->enablestats));
$temp->add(new admin_setting_configselect('statsfirstrun', new lang_string('statsfirstrun', 'admin'),
new lang_string('configstatsfirstrun', 'admin'), 'none',
[
'none' => new lang_string('none'),
60 * 60 * 24 * 7 => new lang_string('numweeks', 'moodle', 1),
60 * 60 * 24 * 14 => new lang_string('numweeks', 'moodle', 2),
60 * 60 * 24 * 21 => new lang_string('numweeks', 'moodle', 3),
60 * 60 * 24 * 28 => new lang_string('nummonths', 'moodle', 1),
60 * 60 * 24 * 56 => new lang_string('nummonths', 'moodle', 2),
60 * 60 * 24 * 84 => new lang_string('nummonths', 'moodle', 3),
60 * 60 * 24 * 112 => new lang_string('nummonths', 'moodle', 4),
60 * 60 * 24 * 140 => new lang_string('nummonths', 'moodle', 5),
60 * 60 * 24 * 168 => new lang_string('nummonths', 'moodle', 6),
'all' => new lang_string('all')
]
));
$temp->add(new admin_setting_configselect('statsmaxruntime', new lang_string('statsmaxruntime', 'admin'),
new lang_string('configstatsmaxruntime3', 'admin'), 0,
[
0 => new lang_string('untilcomplete'),
60 * 30 => '10 ' . new lang_string('minutes'),
60 * 30 => '30 ' . new lang_string('minutes'),
60 * 60 => '1 ' . new lang_string('hour'),
60 * 60 * 2 => '2 ' . new lang_string('hours'),
60 * 60 * 3 => '3 ' . new lang_string('hours'),
60 * 60 * 4 => '4 ' . new lang_string('hours'),
60 * 60 * 5 => '5 ' . new lang_string('hours'),
60 * 60 * 6 => '6 ' . new lang_string('hours'),
60 * 60 * 7 => '7 ' . new lang_string('hours'),
60 * 60 * 8 => '8 ' . new lang_string('hours'),
]
));
$temp->add(new admin_setting_configtext('statsruntimedays', new lang_string('statsruntimedays', 'admin'),
new lang_string('configstatsruntimedays', 'admin'), 31, PARAM_INT));
$temp->add(new admin_setting_configtext('statsuserthreshold', new lang_string('statsuserthreshold', 'admin'),
new lang_string('configstatsuserthreshold', 'admin'), 0, PARAM_INT));
$ADMIN->add('server', $temp);
$temp->add(new admin_setting_configduration('sessiontimeout', new lang_string('sessiontimeout', 'admin'),
new lang_string('configsessiontimeout', 'admin'), 8 * 60 * 60));
// HTTP.
$temp = new admin_settingpage('http', new lang_string('http', 'admin'));
$temp->add(new admin_setting_configcheckbox('slasharguments', new lang_string('slasharguments', 'admin'),
new lang_string('configslasharguments', 'admin'), 1));
$temp->add(new admin_setting_heading('reverseproxy', new lang_string('reverseproxy', 'admin'), '', ''));
$options = [
0 => 'HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR, REMOTE_ADDR',
GETREMOTEADDR_SKIP_HTTP_CLIENT_IP => 'HTTP_X_FORWARDED_FOR, REMOTE_ADDR',
GETREMOTEADDR_SKIP_HTTP_X_FORWARDED_FOR => 'HTTP_CLIENT, REMOTE_ADDR',
GETREMOTEADDR_SKIP_HTTP_X_FORWARDED_FOR | GETREMOTEADDR_SKIP_HTTP_CLIENT_IP => 'REMOTE_ADDR'
];
$temp->add(new admin_setting_configselect('getremoteaddrconf', new lang_string('getremoteaddrconf', 'admin'),
new lang_string('configgetremoteaddrconf', 'admin'),
GETREMOTEADDR_SKIP_HTTP_X_FORWARDED_FOR | GETREMOTEADDR_SKIP_HTTP_CLIENT_IP, $options));
$temp->add(new admin_setting_configtext('reverseproxyignore', new lang_string('reverseproxyignore', 'admin'),
new lang_string('configreverseproxyignore', 'admin'), ''));
$temp->add(new admin_setting_configtext('sessioncookie', new lang_string('sessioncookie', 'admin'), new lang_string('configsessioncookie', 'admin'), '', PARAM_ALPHANUM));
$temp->add(new admin_setting_configtext('sessioncookiepath', new lang_string('sessioncookiepath', 'admin'), new lang_string('configsessioncookiepath', 'admin'), '', PARAM_RAW));
$temp->add(new admin_setting_configtext('sessioncookiedomain', new lang_string('sessioncookiedomain', 'admin'), new lang_string('configsessioncookiedomain', 'admin'), '', PARAM_RAW, 50));
$ADMIN->add('server', $temp);
$temp->add(new admin_setting_heading('webproxy', new lang_string('webproxy', 'admin'),
new lang_string('webproxyinfo', 'admin')));
$temp->add(new admin_setting_configtext('proxyhost', new lang_string('proxyhost', 'admin'),
new lang_string('configproxyhost', 'admin'), '', PARAM_HOST));
$temp->add(new admin_setting_configtext('proxyport', new lang_string('proxyport', 'admin'),
new lang_string('configproxyport', 'admin'), 0, PARAM_INT));
$options = ['HTTP' => 'HTTP'];
if (defined('CURLPROXY_SOCKS5')) {
$options['SOCKS5'] = 'SOCKS5';
}
$temp->add(new admin_setting_configselect('proxytype', new lang_string('proxytype', 'admin'),
new lang_string('configproxytype', 'admin'), 'HTTP', $options));
$temp->add(new admin_setting_configtext('proxyuser', new lang_string('proxyuser', 'admin'),
new lang_string('configproxyuser', 'admin'), ''));
$temp->add(new admin_setting_configpasswordunmask('proxypassword', new lang_string('proxypassword', 'admin'),
new lang_string('configproxypassword', 'admin'), ''));
$temp->add(new admin_setting_configtext('proxybypass', new lang_string('proxybypass', 'admin'),
new lang_string('configproxybypass', 'admin'), 'localhost, 127.0.0.1'));
$ADMIN->add('server', $temp);
$temp = new admin_settingpage('maintenancemode', new lang_string('sitemaintenancemode', 'admin'));
$options = [0 => new lang_string('disable'), 1 => new lang_string('enable')];
$temp->add(new admin_setting_configselect('maintenance_enabled', new lang_string('sitemaintenancemode', 'admin'),
new lang_string('helpsitemaintenance', 'admin'), 0, $options));
$temp->add(new admin_setting_confightmleditor('maintenance_message', new lang_string('optionalmaintenancemessage', 'admin'),
'', ''));
$ADMIN->add('server', $temp);
// "stats" settingpage
$temp = new admin_settingpage('stats', new lang_string('stats'), 'moodle/site:config', empty($CFG->enablestats));
$temp->add(new admin_setting_configselect('statsfirstrun', new lang_string('statsfirstrun', 'admin'), new lang_string('configstatsfirstrun', 'admin'), 'none', array('none' => new lang_string('none'),
60*60*24*7 => new lang_string('numweeks','moodle',1),
60*60*24*14 => new lang_string('numweeks','moodle',2),
60*60*24*21 => new lang_string('numweeks','moodle',3),
60*60*24*28 => new lang_string('nummonths','moodle',1),
60*60*24*56 => new lang_string('nummonths','moodle',2),
60*60*24*84 => new lang_string('nummonths','moodle',3),
60*60*24*112 => new lang_string('nummonths','moodle',4),
60*60*24*140 => new lang_string('nummonths','moodle',5),
60*60*24*168 => new lang_string('nummonths','moodle',6),
'all' => new lang_string('all') )));
$temp->add(new admin_setting_configselect('statsmaxruntime', new lang_string('statsmaxruntime', 'admin'), new lang_string('configstatsmaxruntime3', 'admin'), 0, array(0 => new lang_string('untilcomplete'),
60*30 => '10 '.new lang_string('minutes'),
60*30 => '30 '.new lang_string('minutes'),
60*60 => '1 '.new lang_string('hour'),
60*60*2 => '2 '.new lang_string('hours'),
60*60*3 => '3 '.new lang_string('hours'),
60*60*4 => '4 '.new lang_string('hours'),
60*60*5 => '5 '.new lang_string('hours'),
60*60*6 => '6 '.new lang_string('hours'),
60*60*7 => '7 '.new lang_string('hours'),
60*60*8 => '8 '.new lang_string('hours') )));
$temp->add(new admin_setting_configtext('statsruntimedays', new lang_string('statsruntimedays', 'admin'), new lang_string('configstatsruntimedays', 'admin'), 31, PARAM_INT));
$temp->add(new admin_setting_configtext('statsuserthreshold', new lang_string('statsuserthreshold', 'admin'), new lang_string('configstatsuserthreshold', 'admin'), 0, PARAM_INT));
$ADMIN->add('server', $temp);
// Cleanup.
$temp = new admin_settingpage('cleanup', new lang_string('cleanup', 'admin'));
$temp->add(new admin_setting_configselect('deleteunconfirmed', new lang_string('deleteunconfirmed', 'admin'),
new lang_string('configdeleteunconfirmed', 'admin'), 168,
[
0 => new lang_string('never'),
168 => new lang_string('numdays', '', 7),
144 => new lang_string('numdays', '', 6),
120 => new lang_string('numdays', '', 5),
96 => new lang_string('numdays', '', 4),
72 => new lang_string('numdays', '', 3),
48 => new lang_string('numdays', '', 2),
24 => new lang_string('numdays', '', 1),
12 => new lang_string('numhours', '', 12),
6 => new lang_string('numhours', '', 6),
1 => new lang_string('numhours', '', 1),
]
));
$temp->add(new admin_setting_configselect('deleteincompleteusers', new lang_string('deleteincompleteusers', 'admin'),
new lang_string('configdeleteincompleteusers', 'admin'), 0,
[
0 => new lang_string('never'),
168 => new lang_string('numdays', '', 7),
144 => new lang_string('numdays', '', 6),
120 => new lang_string('numdays', '', 5),
96 => new lang_string('numdays', '', 4),
72 => new lang_string('numdays', '', 3),
48 => new lang_string('numdays', '', 2),
24 => new lang_string('numdays', '', 1),
]
));
// "http" settingpage
$temp = new admin_settingpage('http', new lang_string('http', 'admin'));
$temp->add(new admin_setting_configcheckbox('slasharguments', new lang_string('slasharguments', 'admin'), new lang_string('configslasharguments', 'admin'), 1));
$temp->add(new admin_setting_heading('reverseproxy', new lang_string('reverseproxy', 'admin'), '', ''));
$options = array(
0 => 'HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR, REMOTE_ADDR',
GETREMOTEADDR_SKIP_HTTP_CLIENT_IP => 'HTTP_X_FORWARDED_FOR, REMOTE_ADDR',
GETREMOTEADDR_SKIP_HTTP_X_FORWARDED_FOR => 'HTTP_CLIENT, REMOTE_ADDR',
GETREMOTEADDR_SKIP_HTTP_X_FORWARDED_FOR|GETREMOTEADDR_SKIP_HTTP_CLIENT_IP => 'REMOTE_ADDR');
$temp->add(new admin_setting_configselect('getremoteaddrconf', new lang_string('getremoteaddrconf', 'admin'),
new lang_string('configgetremoteaddrconf', 'admin'),
GETREMOTEADDR_SKIP_HTTP_X_FORWARDED_FOR|GETREMOTEADDR_SKIP_HTTP_CLIENT_IP, $options));
$temp->add(new admin_setting_configtext('reverseproxyignore', new lang_string('reverseproxyignore', 'admin'), new lang_string('configreverseproxyignore', 'admin'), ''));
$temp->add(new admin_setting_configcheckbox('disablegradehistory', new lang_string('disablegradehistory', 'grades'),
new lang_string('disablegradehistory_help', 'grades'), 0));
$temp->add(new admin_setting_heading('webproxy', new lang_string('webproxy', 'admin'), new lang_string('webproxyinfo', 'admin')));
$temp->add(new admin_setting_configtext('proxyhost', new lang_string('proxyhost', 'admin'), new lang_string('configproxyhost', 'admin'), '', PARAM_HOST));
$temp->add(new admin_setting_configtext('proxyport', new lang_string('proxyport', 'admin'), new lang_string('configproxyport', 'admin'), 0, PARAM_INT));
$options = array('HTTP'=>'HTTP');
if (defined('CURLPROXY_SOCKS5')) {
$options['SOCKS5'] = 'SOCKS5';
}
$temp->add(new admin_setting_configselect('proxytype', new lang_string('proxytype', 'admin'), new lang_string('configproxytype','admin'), 'HTTP', $options));
$temp->add(new admin_setting_configtext('proxyuser', new lang_string('proxyuser', 'admin'), new lang_string('configproxyuser', 'admin'), ''));
$temp->add(new admin_setting_configpasswordunmask('proxypassword', new lang_string('proxypassword', 'admin'), new lang_string('configproxypassword', 'admin'), ''));
$temp->add(new admin_setting_configtext('proxybypass', new lang_string('proxybypass', 'admin'), new lang_string('configproxybypass', 'admin'), 'localhost, 127.0.0.1'));
$ADMIN->add('server', $temp);
$temp->add(new admin_setting_configselect('gradehistorylifetime', new lang_string('gradehistorylifetime', 'grades'),
new lang_string('gradehistorylifetime_help', 'grades'), 0,
[
0 => new lang_string('neverdeletehistory', 'grades'),
1000 => new lang_string('numdays', '', 1000),
365 => new lang_string('numdays', '', 365),
180 => new lang_string('numdays', '', 180),
150 => new lang_string('numdays', '', 150),
120 => new lang_string('numdays', '', 120),
90 => new lang_string('numdays', '', 90),
60 => new lang_string('numdays', '', 60),
30 => new lang_string('numdays', '', 30),
]
));
$temp = new admin_settingpage('maintenancemode', new lang_string('sitemaintenancemode', 'admin'));
$options = array(0=>new lang_string('disable'), 1=>new lang_string('enable'));
$temp->add(new admin_setting_configselect('maintenance_enabled', new lang_string('sitemaintenancemode', 'admin'),
new lang_string('helpsitemaintenance', 'admin'), 0, $options));
$temp->add(new admin_setting_confightmleditor('maintenance_message', new lang_string('optionalmaintenancemessage', 'admin'),
'', ''));
$ADMIN->add('server', $temp);
$temp = new admin_settingpage('cleanup', new lang_string('cleanup', 'admin'));
$temp->add(new admin_setting_configselect('deleteunconfirmed', new lang_string('deleteunconfirmed', 'admin'), new lang_string('configdeleteunconfirmed', 'admin'), 168, array(0 => new lang_string('never'),
168 => new lang_string('numdays', '', 7),
144 => new lang_string('numdays', '', 6),
120 => new lang_string('numdays', '', 5),
96 => new lang_string('numdays', '', 4),
72 => new lang_string('numdays', '', 3),
48 => new lang_string('numdays', '', 2),
24 => new lang_string('numdays', '', 1),
12 => new lang_string('numhours', '', 12),
6 => new lang_string('numhours', '', 6),
1 => new lang_string('numhours', '', 1))));
$temp->add(new admin_setting_configselect('deleteincompleteusers', new lang_string('deleteincompleteusers', 'admin'), new lang_string('configdeleteincompleteusers', 'admin'), 0, array(0 => new lang_string('never'),
168 => new lang_string('numdays', '', 7),
144 => new lang_string('numdays', '', 6),
120 => new lang_string('numdays', '', 5),
96 => new lang_string('numdays', '', 4),
72 => new lang_string('numdays', '', 3),
48 => new lang_string('numdays', '', 2),
24 => new lang_string('numdays', '', 1))));
$temp->add(new admin_setting_configcheckbox('disablegradehistory', new lang_string('disablegradehistory', 'grades'),
new lang_string('disablegradehistory_help', 'grades'), 0));
$temp->add(new admin_setting_configselect('gradehistorylifetime', new lang_string('gradehistorylifetime', 'grades'),
new lang_string('gradehistorylifetime_help', 'grades'), 0, array(0 => new lang_string('neverdeletehistory', 'grades'),
1000 => new lang_string('numdays', '', 1000),
365 => new lang_string('numdays', '', 365),
180 => new lang_string('numdays', '', 180),
150 => new lang_string('numdays', '', 150),
120 => new lang_string('numdays', '', 120),
90 => new lang_string('numdays', '', 90),
60 => new lang_string('numdays', '', 60),
30 => new lang_string('numdays', '', 30))));
$temp->add(new admin_setting_configselect('tempdatafoldercleanup', new lang_string('tempdatafoldercleanup', 'admin'),
new lang_string('configtempdatafoldercleanup', 'admin'), 168, array(
$temp->add(new admin_setting_configselect('tempdatafoldercleanup', new lang_string('tempdatafoldercleanup', 'admin'),
new lang_string('configtempdatafoldercleanup', 'admin'), 168,
[
1 => new lang_string('numhours', '', 1),
3 => new lang_string('numhours', '', 3),
6 => new lang_string('numhours', '', 6),
@@ -166,224 +229,303 @@ $temp->add(new admin_setting_configselect('tempdatafoldercleanup', new lang_stri
24 => new lang_string('numhours', '', 24),
48 => new lang_string('numdays', '', 2),
168 => new lang_string('numdays', '', 7),
)));
]
));
$ADMIN->add('server', $temp);
$ADMIN->add('server', $temp);
$temp->add(new admin_setting_configduration('filescleanupperiod',
new lang_string('filescleanupperiod', 'admin'),
new lang_string('filescleanupperiod_help', 'admin'),
86400));
$ADMIN->add('server', new admin_externalpage('environment', new lang_string('environment','admin'), "$CFG->wwwroot/$CFG->admin/environment.php"));
$ADMIN->add('server', new admin_externalpage('phpinfo', new lang_string('phpinfo'), "$CFG->wwwroot/$CFG->admin/phpinfo.php"));
$ADMIN->add('server', new admin_externalpage('testoutgoingmailconf', new lang_string('testoutgoingmailconf', 'admin'),
new moodle_url("$CFG->wwwroot/$CFG->admin/testoutgoingmailconf.php"), 'moodle/site:config', true));
// Environment.
$ADMIN->add('server', new admin_externalpage('environment', new lang_string('environment', 'admin'),
"{$CFG->wwwroot}/{$CFG->admin}/environment.php"));
// PHP info.
$ADMIN->add('server', new admin_externalpage('phpinfo', new lang_string('phpinfo'),
"{$CFG->wwwroot}/{$CFG->admin}/phpinfo.php"));
// "performance" settingpage
$temp = new admin_settingpage('performance', new lang_string('performance', 'admin'));
// Test outgoing mail configuration (hidden, accessed via direct link from the settings page).
$ADMIN->add('server', new admin_externalpage('testoutgoingmailconf', new lang_string('testoutgoingmailconf', 'admin'),
new moodle_url('/admin/testoutgoingmailconf.php'), 'moodle/site:config', true));
// Memory limit options for large administration tasks.
$memoryoptions = array(
'64M' => '64M',
'128M' => '128M',
'256M' => '256M',
'512M' => '512M',
'1024M' => '1024M',
'2048M' => '2048M');
// Performance.
$temp = new admin_settingpage('performance', new lang_string('performance', 'admin'));
// Allow larger memory usage for 64-bit sites only.
if (PHP_INT_SIZE === 8) {
$memoryoptions['3072M'] = '3072M';
$memoryoptions['4096M'] = '4096M';
}
// Memory limit options for large administration tasks.
$memoryoptions = [
'64M' => '64M',
'128M' => '128M',
'256M' => '256M',
'512M' => '512M',
'1024M' => '1024M',
'2048M' => '2048M',
];
$temp->add(new admin_setting_configselect('extramemorylimit', new lang_string('extramemorylimit', 'admin'),
new lang_string('configextramemorylimit', 'admin'), '512M',
$memoryoptions));
$temp->add(new admin_setting_configtext('maxtimelimit', new lang_string('maxtimelimit', 'admin'),
// Allow larger memory usage for 64-bit sites only.
if (PHP_INT_SIZE === 8) {
$memoryoptions['3072M'] = '3072M';
$memoryoptions['4096M'] = '4096M';
}
$temp->add(new admin_setting_configselect('extramemorylimit', new lang_string('extramemorylimit', 'admin'),
new lang_string('configextramemorylimit', 'admin'), '512M', $memoryoptions));
$temp->add(new admin_setting_configtext('maxtimelimit', new lang_string('maxtimelimit', 'admin'),
new lang_string('maxtimelimit_desc', 'admin'), 0, PARAM_INT));
$temp->add(new admin_setting_configtext('curlcache', new lang_string('curlcache', 'admin'),
new lang_string('configcurlcache', 'admin'), 120, PARAM_INT));
$temp->add(new admin_setting_configtext('curlcache', new lang_string('curlcache', 'admin'),
new lang_string('configcurlcache', 'admin'), 120, PARAM_INT));
$temp->add(new admin_setting_configtext('curltimeoutkbitrate', new lang_string('curltimeoutkbitrate', 'admin'),
new lang_string('curltimeoutkbitrate_help', 'admin'), 56, PARAM_INT));
$temp->add(new admin_setting_configtext('curltimeoutkbitrate', new lang_string('curltimeoutkbitrate', 'admin'),
new lang_string('curltimeoutkbitrate_help', 'admin'), 56, PARAM_INT));
$ADMIN->add('server', $temp);
$ADMIN->add('server', $temp);
// Tasks.
$ADMIN->add('server', new admin_category('taskconfig', new lang_string('taskadmintitle', 'admin')));
$ADMIN->add('server', new admin_category('taskconfig', new lang_string('taskadmintitle', 'admin')));
$temp = new admin_settingpage('taskprocessing', new lang_string('taskprocessing','admin'));
$temp->add(
new admin_setting_configtext(
'task_scheduled_concurrency_limit',
new lang_string('task_scheduled_concurrency_limit', 'admin'),
new lang_string('task_scheduled_concurrency_limit_desc', 'admin'),
3,
PARAM_INT
)
);
// Task processing.
$temp = new admin_settingpage('taskprocessing', new lang_string('taskprocessing', 'admin'));
$temp->add(
new admin_setting_configduration(
'task_scheduled_max_runtime',
new lang_string('task_scheduled_max_runtime', 'admin'),
new lang_string('task_scheduled_max_runtime_desc', 'admin'),
30 * MINSECS
)
);
$temp->add(
new admin_setting_configtext(
'task_adhoc_concurrency_limit',
new lang_string('task_adhoc_concurrency_limit', 'admin'),
new lang_string('task_adhoc_concurrency_limit_desc', 'admin'),
3,
PARAM_INT
)
);
$temp->add(
new admin_setting_configduration(
'task_adhoc_max_runtime',
new lang_string('task_adhoc_max_runtime', 'admin'),
new lang_string('task_adhoc_max_runtime_desc', 'admin'),
30 * MINSECS
)
);
$ADMIN->add('taskconfig', $temp);
$temp = new admin_settingpage('tasklogging', new lang_string('tasklogging','admin'));
$temp->add(
new admin_setting_configselect(
'task_logmode',
new lang_string('task_logmode', 'admin'),
new lang_string('task_logmode_desc', 'admin'),
\core\task\logmanager::MODE_ALL,
[
\core\task\logmanager::MODE_ALL => new lang_string('task_logmode_all', 'admin'),
\core\task\logmanager::MODE_FAILONLY => new lang_string('task_logmode_failonly', 'admin'),
\core\task\logmanager::MODE_NONE => new lang_string('task_logmode_none', 'admin'),
]
)
);
$temp->add(
new admin_setting_configcheckbox(
'task_logtostdout',
new lang_string('task_logtostdout', 'admin'),
new lang_string('task_logtostdout_desc', 'admin'),
$setting = new admin_setting_configcheckbox(
'cron_enabled',
new lang_string('cron_enabled', 'admin'),
new lang_string('cron_enabled_desc', 'admin'),
1
)
);
);
$setting->set_updatedcallback('theme_reset_static_caches');
$temp->add($setting);
$temp->add(
new admin_setting_configtext(
'task_scheduled_concurrency_limit',
new lang_string('task_scheduled_concurrency_limit', 'admin'),
new lang_string('task_scheduled_concurrency_limit_desc', 'admin'),
3,
PARAM_INT
)
);
if (\core\task\logmanager::uses_standard_settings()) {
$temp->add(
new admin_setting_configduration(
'task_logretention',
new \lang_string('task_logretention', 'admin'),
new \lang_string('task_logretention_desc', 'admin'),
28 * DAYSECS
'task_scheduled_max_runtime',
new lang_string('task_scheduled_max_runtime', 'admin'),
new lang_string('task_scheduled_max_runtime_desc', 'admin'),
30 * MINSECS
)
);
$temp->add(
new admin_setting_configtext(
'task_logretainruns',
new \lang_string('task_logretainruns', 'admin'),
new \lang_string('task_logretainruns_desc', 'admin'),
20,
'task_adhoc_concurrency_limit',
new lang_string('task_adhoc_concurrency_limit', 'admin'),
new lang_string('task_adhoc_concurrency_limit_desc', 'admin'),
3,
PARAM_INT
)
);
}
$ADMIN->add('taskconfig', $temp);
if (\core\task\logmanager::uses_standard_settings()) {
$ADMIN->add('taskconfig', new admin_externalpage(
'tasklogs',
new lang_string('tasklogs','admin'),
"{$CFG->wwwroot}/{$CFG->admin}/tasklogs.php"
));
}
$temp->add(
new admin_setting_configduration(
'task_adhoc_max_runtime',
new lang_string('task_adhoc_max_runtime', 'admin'),
new lang_string('task_adhoc_max_runtime_desc', 'admin'),
30 * MINSECS
)
);
$ADMIN->add('taskconfig', $temp);
// E-mail settings.
$ADMIN->add('server', new admin_category('email', new lang_string('categoryemail', 'admin')));
// Task log configuration.
$temp = new admin_settingpage('tasklogging', new lang_string('tasklogging', 'admin'));
$temp->add(
new admin_setting_configselect(
'task_logmode',
new lang_string('task_logmode', 'admin'),
new lang_string('task_logmode_desc', 'admin'),
\core\task\logmanager::MODE_ALL,
[
\core\task\logmanager::MODE_ALL => new lang_string('task_logmode_all', 'admin'),
\core\task\logmanager::MODE_FAILONLY => new lang_string('task_logmode_failonly', 'admin'),
\core\task\logmanager::MODE_NONE => new lang_string('task_logmode_none', 'admin'),
]
)
);
$temp->add(
new admin_setting_configcheckbox(
'task_logtostdout',
new lang_string('task_logtostdout', 'admin'),
new lang_string('task_logtostdout_desc', 'admin'),
1
)
);
$temp = new admin_settingpage('outgoingmailconfig', new lang_string('outgoingmailconfig', 'admin'));
if (\core\task\logmanager::uses_standard_settings()) {
$temp->add(
new admin_setting_configduration(
'task_logretention',
new \lang_string('task_logretention', 'admin'),
new \lang_string('task_logretention_desc', 'admin'),
28 * DAYSECS
)
);
$temp->add(new admin_setting_heading('smtpheading', new lang_string('smtp', 'admin'),
new lang_string('smtpdetail', 'admin')));
$temp->add(new admin_setting_configtext('smtphosts', new lang_string('smtphosts', 'admin'),
new lang_string('configsmtphosts', 'admin'), '', PARAM_RAW));
$options = array('' => new lang_string('none', 'admin'), 'ssl' => 'SSL', 'tls' => 'TLS');
$temp->add(new admin_setting_configselect('smtpsecure', new lang_string('smtpsecure', 'admin'),
new lang_string('configsmtpsecure', 'admin'), '', $options));
$authtypeoptions = array('LOGIN' => 'LOGIN', 'PLAIN' => 'PLAIN', 'NTLM' => 'NTLM', 'CRAM-MD5' => 'CRAM-MD5');
$temp->add(new admin_setting_configselect('smtpauthtype', new lang_string('smtpauthtype', 'admin'),
new lang_string('configsmtpauthtype', 'admin'), 'LOGIN', $authtypeoptions));
$temp->add(new admin_setting_configtext('smtpuser', new lang_string('smtpuser', 'admin'),
new lang_string('configsmtpuser', 'admin'), '', PARAM_NOTAGS));
$temp->add(new admin_setting_configpasswordunmask('smtppass', new lang_string('smtppass', 'admin'),
new lang_string('configsmtpuser', 'admin'), ''));
$temp->add(new admin_setting_configtext('smtpmaxbulk', new lang_string('smtpmaxbulk', 'admin'),
new lang_string('configsmtpmaxbulk', 'admin'), 1, PARAM_INT));
$temp->add(new admin_setting_heading('noreplydomainheading', new lang_string('noreplydomain', 'admin'),
$temp->add(
new admin_setting_configtext(
'task_logretainruns',
new \lang_string('task_logretainruns', 'admin'),
new \lang_string('task_logretainruns_desc', 'admin'),
20,
PARAM_INT
)
);
}
$ADMIN->add('taskconfig', $temp);
// Task logs.
if (\core\task\logmanager::uses_standard_settings()) {
$ADMIN->add('taskconfig', new admin_externalpage(
'tasklogs',
new lang_string('tasklogs', 'admin'),
"{$CFG->wwwroot}/{$CFG->admin}/tasklogs.php"
));
}
// Email.
$ADMIN->add('server', new admin_category('email', new lang_string('categoryemail', 'admin')));
// Outgoing mail configuration.
$temp = new admin_settingpage('outgoingmailconfig', new lang_string('outgoingmailconfig', 'admin'));
$temp->add(new admin_setting_heading('smtpheading', new lang_string('smtp', 'admin'),
new lang_string('smtpdetail', 'admin')));
$temp->add(new admin_setting_configtext('smtphosts', new lang_string('smtphosts', 'admin'),
new lang_string('configsmtphosts', 'admin'), '', PARAM_RAW));
$options = [
'' => new lang_string('none', 'admin'),
'ssl' => 'SSL',
'tls' => 'TLS',
];
$temp->add(new admin_setting_configselect('smtpsecure', new lang_string('smtpsecure', 'admin'),
new lang_string('configsmtpsecure', 'admin'), '', $options));
$authtypeoptions = [
'LOGIN' => 'LOGIN',
'PLAIN' => 'PLAIN',
'NTLM' => 'NTLM',
'CRAM-MD5' => 'CRAM-MD5',
];
$temp->add(new admin_setting_configselect('smtpauthtype', new lang_string('smtpauthtype', 'admin'),
new lang_string('configsmtpauthtype', 'admin'), 'LOGIN', $authtypeoptions));
$temp->add(new admin_setting_configtext('smtpuser', new lang_string('smtpuser', 'admin'),
new lang_string('configsmtpuser', 'admin'), '', PARAM_NOTAGS));
$temp->add(new admin_setting_configpasswordunmask('smtppass', new lang_string('smtppass', 'admin'),
new lang_string('configsmtpuser', 'admin'), ''));
$temp->add(new admin_setting_configtext('smtpmaxbulk', new lang_string('smtpmaxbulk', 'admin'),
new lang_string('configsmtpmaxbulk', 'admin'), 1, PARAM_INT));
$temp->add(new admin_setting_heading('noreplydomainheading', new lang_string('noreplydomain', 'admin'),
new lang_string('noreplydomaindetail', 'admin')));
$temp->add(new admin_setting_configtext('noreplyaddress', new lang_string('noreplyaddress', 'admin'),
new lang_string('confignoreplyaddress', 'admin'), 'noreply@' . get_host_from_url($CFG->wwwroot), PARAM_EMAIL));
$temp->add(new admin_setting_configtextarea('allowedemaildomains',
$temp->add(new admin_setting_configtext('noreplyaddress', new lang_string('noreplyaddress', 'admin'),
new lang_string('confignoreplyaddress', 'admin'), 'noreply@' . get_host_from_url($CFG->wwwroot), PARAM_EMAIL));
$temp->add(new admin_setting_configtextarea('allowedemaildomains',
new lang_string('allowedemaildomains', 'admin'),
new lang_string('configallowedemaildomains', 'admin'),
''));
$url = new moodle_url('/admin/testoutgoingmailconf.php');
$link = html_writer::link($url, get_string('testoutgoingmailconf', 'admin'));
$temp->add(new admin_setting_heading('testoutgoinmailc', new lang_string('testoutgoingmailconf', 'admin'),
new lang_string('testoutgoingmaildetail', 'admin', $link)));
$temp->add(new admin_setting_heading('emaildoesnotfit', new lang_string('doesnotfit', 'admin'),
new lang_string('doesnotfitdetail', 'admin')));
$charsets = get_list_of_charsets();
unset($charsets['UTF-8']); // Not needed here.
$options = array();
$options['0'] = 'UTF-8';
$options = array_merge($options, $charsets);
$temp->add(new admin_setting_configselect('sitemailcharset', new lang_string('sitemailcharset', 'admin'),
new lang_string('configsitemailcharset','admin'), '0', $options));
$temp->add(new admin_setting_configcheckbox('allowusermailcharset', new lang_string('allowusermailcharset', 'admin'),
new lang_string('configallowusermailcharset', 'admin'), 0));
$temp->add(new admin_setting_configcheckbox('allowattachments', new lang_string('allowattachments', 'admin'),
new lang_string('configallowattachments', 'admin'), 1));
$options = array('LF' => 'LF', 'CRLF' => 'CRLF');
$temp->add(new admin_setting_configselect('mailnewline', new lang_string('mailnewline', 'admin'),
new lang_string('configmailnewline', 'admin'), 'LF', $options));
$choices = array(new lang_string('never', 'admin'),
new lang_string('always', 'admin'),
new lang_string('onlynoreply', 'admin'));
$temp->add(new admin_setting_configselect('emailfromvia', new lang_string('emailfromvia', 'admin'),
new lang_string('configemailfromvia', 'admin'), 1, $choices));
$temp->add(new admin_setting_heading('divertallemailsheading', new lang_string('divertallemails', 'admin'),
new lang_string('divertallemailsdetail', 'admin')));
$temp->add(new admin_setting_configtext('divertallemailsto',
new lang_string('divertallemailsto', 'admin'),
new lang_string('divertallemailsto_desc', 'admin'),
''));
$temp->add(new admin_setting_configtextarea('divertallemailsexcept',
new lang_string('divertallemailsexcept', 'admin'),
new lang_string('divertallemailsexcept_desc', 'admin'),
'', PARAM_RAW, '50', '4'));
$noreplyaddress = isset($CFG->noreplyaddress) ? $CFG->noreplyaddress : 'noreply@example.com';
$dkimdomain = substr(strrchr($noreplyaddress, "@"), 1);
$dkimselector = empty($CFG->emaildkimselector) ? '[selector]' : $CFG->emaildkimselector;
$pempath = "\$CFG->dataroot/dkim/{$dkimdomain}/{$dkimselector}.private";
$temp->add(new admin_setting_heading('emaildkim', new lang_string('emaildkim', 'admin'),
new lang_string('emaildkiminfo', 'admin', ['path' => $pempath, 'docs' => \get_docs_url('Mail_configuration#DKIM')])));
$temp->add(new admin_setting_configtext('emaildkimselector', new lang_string('emaildkimselector', 'admin'),
new lang_string('configemaildkimselector', 'admin'), '', PARAM_FILE));
$url = new moodle_url('/admin/testoutgoingmailconf.php');
$link = html_writer::link($url, get_string('testoutgoingmailconf', 'admin'));
$temp->add(new admin_setting_heading('testoutgoinmailc', new lang_string('testoutgoingmailconf', 'admin'),
new lang_string('testoutgoingmaildetail', 'admin', $link)));
$temp->add(new admin_setting_heading('emaildoesnotfit', new lang_string('doesnotfit', 'admin'),
new lang_string('doesnotfitdetail', 'admin')));
$charsets = get_list_of_charsets();
unset($charsets['UTF-8']);
$options = [
'0' => 'UTF-8',
];
$options = array_merge($options, $charsets);
$temp->add(new admin_setting_configselect('sitemailcharset', new lang_string('sitemailcharset', 'admin'),
new lang_string('configsitemailcharset', 'admin'), '0', $options));
$temp->add(new admin_setting_configcheckbox('allowusermailcharset', new lang_string('allowusermailcharset', 'admin'),
new lang_string('configallowusermailcharset', 'admin'), 0));
$temp->add(new admin_setting_configcheckbox('allowattachments', new lang_string('allowattachments', 'admin'),
new lang_string('configallowattachments', 'admin'), 1));
$options = [
'LF' => 'LF',
'CRLF' => 'CRLF',
];
$temp->add(new admin_setting_configselect('mailnewline', new lang_string('mailnewline', 'admin'),
new lang_string('configmailnewline', 'admin'), 'LF', $options));
$choices = [
new lang_string('never', 'admin'),
new lang_string('always', 'admin'),
new lang_string('onlynoreply', 'admin'),
];
$temp->add(new admin_setting_configselect('emailfromvia', new lang_string('emailfromvia', 'admin'),
new lang_string('configemailfromvia', 'admin'), 1, $choices));
$temp->add(new admin_setting_configtext('emailsubjectprefix', new lang_string('emailsubjectprefix', 'admin'),
new lang_string('configemailsubjectprefix', 'admin'), '', PARAM_RAW));
$ADMIN->add('email', $temp);
$temp->add(new admin_setting_configtextarea('emailheaders', new lang_string('emailheaders', 'admin'),
new lang_string('configemailheaders', 'admin'), '', PARAM_RAW, '50', '3'));
// "update notifications" settingpage
if (empty($CFG->disableupdatenotifications)) {
$temp = new admin_settingpage('updatenotifications', new lang_string('updatenotifications', 'core_admin'));
$temp->add(new admin_setting_configcheckbox('updateautocheck', new lang_string('updateautocheck', 'core_admin'),
new lang_string('updateautocheck_desc', 'core_admin'), 1));
$temp->add(new admin_setting_configselect('updateminmaturity', new lang_string('updateminmaturity', 'core_admin'),
new lang_string('updateminmaturity_desc', 'core_admin'), MATURITY_STABLE,
array(
MATURITY_ALPHA => new lang_string('maturity'.MATURITY_ALPHA, 'core_admin'),
MATURITY_BETA => new lang_string('maturity'.MATURITY_BETA, 'core_admin'),
MATURITY_RC => new lang_string('maturity'.MATURITY_RC, 'core_admin'),
MATURITY_STABLE => new lang_string('maturity'.MATURITY_STABLE, 'core_admin'),
)));
$temp->add(new admin_setting_configcheckbox('updatenotifybuilds', new lang_string('updatenotifybuilds', 'core_admin'),
new lang_string('updatenotifybuilds_desc', 'core_admin'), 0));
$ADMIN->add('server', $temp);
$ADMIN->add('email', $temp);
// Update notifications.
if (empty($CFG->disableupdatenotifications)) {
$temp = new admin_settingpage('updatenotifications', new lang_string('updatenotifications', 'core_admin'));
$temp->add(new admin_setting_configcheckbox('updateautocheck', new lang_string('updateautocheck', 'core_admin'),
new lang_string('updateautocheck_desc', 'core_admin'), 1));
$temp->add(new admin_setting_configselect('updateminmaturity', new lang_string('updateminmaturity', 'core_admin'),
new lang_string('updateminmaturity_desc', 'core_admin'), MATURITY_STABLE,
[
MATURITY_ALPHA => new lang_string('maturity'.MATURITY_ALPHA, 'core_admin'),
MATURITY_BETA => new lang_string('maturity'.MATURITY_BETA, 'core_admin'),
MATURITY_RC => new lang_string('maturity'.MATURITY_RC, 'core_admin'),
MATURITY_STABLE => new lang_string('maturity'.MATURITY_STABLE, 'core_admin'),
]
));
$temp->add(new admin_setting_configcheckbox('updatenotifybuilds', new lang_string('updatenotifybuilds', 'core_admin'),
new lang_string('updatenotifybuilds_desc', 'core_admin'), 0));
$ADMIN->add('server', $temp);
}
}
} // end of speedup
+1
View File
@@ -39,6 +39,7 @@ $ADMIN->add('root', new admin_category('license', new lang_string('license')));
$ADMIN->add('root', new admin_category('location', new lang_string('location','admin')));
$ADMIN->add('root', new admin_category('language', new lang_string('language')));
$ADMIN->add('root', new admin_category('messaging', new lang_string('messagingcategory', 'admin')));
$ADMIN->add('root', new admin_category('payment', new lang_string('payments', 'payment')));
$ADMIN->add('root', new admin_category('modules', new lang_string('plugins', 'admin')));
$ADMIN->add('root', new admin_category('security', new lang_string('security','admin')));
$ADMIN->add('root', new admin_category('appearance', new lang_string('appearance','admin')));
+18
View File
@@ -261,10 +261,28 @@ if ($hassiteconfig) {
$temp->add($setting);
// See {@link https://gdpr-info.eu/art-8-gdpr/}.
// See {@link https://www.betterinternetforkids.eu/web/portal/practice/awareness/detail?articleId=3017751}.
$ageofdigitalconsentmap = implode(PHP_EOL, [
'*, 16',
'AT, 14',
'BE, 13',
'BG, 14',
'CY, 14',
'CZ, 15',
'DK, 13',
'EE, 13',
'ES, 14',
'FI, 13',
'FR, 15',
'GB, 13',
'GR, 15',
'IT, 14',
'LT, 14',
'LV, 13',
'MT, 13',
'NO, 13',
'PT, 13',
'SE, 13',
'US, 13'
]);
$setting = new admin_setting_agedigitalconsentmap('agedigitalconsentmap',
+2 -1
View File
@@ -32,6 +32,7 @@ $result = optional_param('result', null, PARAM_INT);
$pageurl = new \moodle_url('/admin/tasklogs.php');
$pageurl->param('filter', $filter);
$pageurl->param('result', $result);
$PAGE->set_url($pageurl);
$PAGE->set_context(context_system::instance());
@@ -66,7 +67,7 @@ echo $OUTPUT->header();
// Output the search form.
echo $OUTPUT->render_from_template('core_admin/tasklogs', (object) [
'action' => $pageurl->out(),
'filter' => $filter,
'filter' => htmlentities($filter),
'resultfilteroptions' => [
(object) [
'value' => -1,
@@ -0,0 +1,87 @@
{{!
This file is part of Moodle - http://moodle.org/
Moodle is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Moodle is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Moodle. If not, see <http://www.gnu.org/licenses/>.
}}
{{!
@template core_admin\local\settings\autocomplete
Admin setting auto complete.
Context variables required for this template:
* name - element name
* id - element id
* options - choices
* multiple - is multiple choices?
* manageurl - url to manage choices
* managetext - string to display manage url
* tags - Should we allow typing new entries to the field?
* ajax - Name of an AMD module to send/process ajax requests
* placeholder - Placeholder text for an empty list
* casesensitive - Whether the search has to be case-sensitive
* showsuggestions - Show suggestions by default - but this can be turned off
* noselectionstring - String that is shown when there are no selections
Example context (json):
{
"name": "name0",
"id": "id0",
"options": [{
"value": "1",
"text": "option 1",
"selected": true,
"disabled": false
}],
"multiple": true,
"manageurl": "",
"managetext": "",
"tags": false,
"ajax": "",
"placeholder": "",
"casesensitive": false,
"showsuggestions": true,
"noselectionstring": ""
}
}}
{{!
Setting autocomplete.
}}
<div class="form-select defaultsnext">
<input type="hidden" name="{{name}}[xxxxx]" value="_qf__force_multiselect_submission">
<select class="custom-select" name="{{name}}[]"
id="{{id}}"
{{#multiple}}multiple{{/multiple}}>
{{#options}}
<option value="{{value}}" {{#selected}}selected{{/selected}}>{{{text}}}</option>
{{/options}}
</select>
{{#manageurl}}
<a href="{{manageurl}}">{{managetext}}</a>
{{/manageurl}}
</div>
<br/>
{{#js}}
require(['core/form-autocomplete'], function(module) {
module.enhance({{#quote}}#{{id}}{{/quote}},
{{tags}},
{{#quote}}{{ajax}}{{/quote}},
{{#quote}}{{placeholder}}{{/quote}},
{{casesensitive}},
{{showsuggestions}},
{{#quote}}{{noselectionstring}}{{/quote}});
});
{{/js}}
@@ -25,6 +25,7 @@
* value - yes value
* id - element id
* checked - boole
* readonly - bool
Example context (json):
{
@@ -32,10 +33,11 @@
"no": "False",
"value": "True",
"id": "test0",
"checked": "checked"
"checked": "checked",
"readonly": false
}
}}
<div class="form-checkbox defaultsnext">
<input type="hidden" name="{{name}}" value="{{no}}">
<input type="checkbox" name="{{name}}" value="{{value}}" id="{{id}}" {{#checked}}checked{{/checked}}>
<input {{#readonly}}disabled{{/readonly}} type="checkbox" name="{{name}}" value="{{value}}" id="{{id}}" {{#checked}}checked{{/checked}}>
</div>
@@ -25,6 +25,7 @@
* id - element id
* value - element value
* haspreviewconfig - show preview of selected color
* readonly - bool
Example context (json):
{
@@ -32,6 +33,7 @@
"name": "name0",
"id": "id0",
"value": "#555655",
"readonly": false,
"haspreviewconfig": false
}
}}
@@ -44,7 +46,7 @@
{{>core/pix_icon}}
{{/icon}}
</div>
<input type="text" name="{{name}}" id="{{id}}" value="{{value}}" size="12" class="form-control text-ltr">
<input type="text" name="{{name}}" id="{{id}}" value="{{value}}" size="12" class="form-control text-ltr" {{#readonly}}disabled{{/readonly}}>
{{#haspreviewconfig}}
<input type="button" id="{{id}}_preview" value={{#quote}}{{#str}}preview{{/str}}{{/quote}} class="admin_colourpicker_preview">
{{/haspreviewconfig}}
@@ -33,7 +33,7 @@
"name": "test",
"value": "/my-super-secret-path/",
"id": "test0",
"readonly": true,
"readonly": false,
"showvalidity": true,
"valid": false
}
@@ -23,6 +23,7 @@
* name - form element name
* options - list of options for units containing name, value, selected
* value - yes
* readonly - bool
* id - element id
Example context (json):
@@ -30,6 +31,7 @@
"name": "test",
"value": "5",
"id": "test0",
"readonly": false,
"options": [ { "name": "Minutes", "value": "mins", "selected": true } ]
}
}}
@@ -38,9 +40,9 @@
}}
<div class="form-duration defaultsnext">
<div class="form-inline">
<input type="text" size="5" id="{{id}}v" name="{{name}}[v]" value="{{value}}" class="form-control text-ltr">
<input type="text" size="5" id="{{id}}v" name="{{name}}[v]" value="{{value}}" class="form-control text-ltr" {{#readonly}}disabled{{/readonly}}>
<label class="sr-only" for="{{id}}u">{{#str}}durationunits, admin{{/str}}</label>
<select id="{{id}}u" name="{{name}}[u]" class="form-control custom-select">
<select id="{{id}}u" name="{{name}}[u]" class="form-control custom-select" {{#readonly}}disabled{{/readonly}}>
{{#options}}
<option value="{{value}}" {{#selected}}selected{{/selected}}>{{name}}</option>
{{/options}}
@@ -33,7 +33,7 @@
"name": "test",
"value": "/usr/bin/cowsay",
"id": "test0",
"readonly": true,
"readonly": false,
"showvalidity": true,
"valid": false
}
+3 -1
View File
@@ -26,6 +26,7 @@
* readonly - Make the field readonly
* value - value
* showvalidity - Show a green check if the path is readable
* readonly - bool
* valid - True if the path is readable
Example context (json):
@@ -33,8 +34,9 @@
"name": "test",
"value": "/my-super-secret-path/file",
"id": "test0",
"readonly": true,
"readonly": false,
"showvalidity": true,
"readonly": false,
"valid": false
}
}}
@@ -24,12 +24,14 @@
* options - list of options for units containing name, value, selected
* value - yes
* id - element id
* readonly - bool
Example context (json):
{
"name": "test",
"value": "5",
"id": "test0",
"readonly": false,
"options": [ { "name": "KB", "value": "1024", "selected": true } ]
}
}}
@@ -38,9 +40,9 @@
}}
<div class="form-filesize defaultsnext">
<div class="form-inline">
<input type="text" size="5" id="{{id}}v" name="{{name}}[v]" value="{{value}}" class="form-control text-ltr">
<input type="text" size="5" id="{{id}}v" name="{{name}}[v]" value="{{value}}" class="form-control text-ltr" {{#readonly}}disabled{{/readonly}}>
<label class="sr-only" for="{{id}}u">{{#str}}filesizeunits, admin{{/str}}</label>
<select id="{{id}}u" name="{{name}}[u]" class="form-control custom-select">
<select id="{{id}}u" name="{{name}}[u]" class="form-control custom-select" {{#readonly}}disabled{{/readonly}}>
{{#options}}
<option value="{{value}}" {{#selected}}selected{{/selected}}>{{name}}</option>
{{/options}}
@@ -24,11 +24,13 @@
* id - element id
* size - element size
* options - list of options containing name, value, selected
* readonly - bool
Example context (json):
{
"name": "test",
"id": "test0",
"readonly": false,
"size": "3",
"options": [ { "name": "Option 1", "value": "V", "selected": true },
{ "name": "Option 2", "value": "V", "selected": true } ]
@@ -39,7 +41,7 @@
}}
<div class="form-select">
<input type="hidden" name="{{name}}[xxxxx]" value="1">
<select id="{{id}}" name="{{name}}[]" size="{{size}}" class="form-control" multiple>
<select {{#readonly}}disabled{{/readonly}} id="{{id}}" name="{{name}}[]" size="{{size}}" class="form-control" multiple>
{{#options}}
<option value="{{value}}" {{#selected}}selected{{/selected}}>{{name}}</option>
{{/options}}
@@ -25,11 +25,13 @@
* size - element size
* options - list of options not grouped
* optgroups - list of options grouped containing the group label and for each option: name, value, selected
* readonly - bool
Example context (json):
{
"name": "test",
"id": "test0",
"readonly": false,
"size": "3",
"options": [
{ "name": "Option 1", "value": "V", "selected": false },
@@ -58,7 +60,7 @@
}}
<div class="form-select">
<input type="hidden" name="{{name}}[xxxxx]" value="1">
<select id="{{id}}" name="{{name}}[]" size="{{size}}" class="form-control" multiple>
<select {{#readonly}}disabled{{/readonly}} id="{{id}}" name="{{name}}[]" size="{{size}}" class="form-control" multiple>
{{#options}}
<option value="{{value}}" {{#selected}}selected{{/selected}}>{{name}}</option>
{{/options}}
@@ -24,7 +24,7 @@
* size - form element size
* value - form element value
* id - element id
* forced - has value been defined in config.php
* readonly - has value been defined in config.php
Example context (json):
{
@@ -32,10 +32,10 @@
"id": "test0",
"size": "8",
"value": "secret",
"forced": false
"readonly": false
}
}}
{{#forced}}
{{#readonly}}
<div class="form-password">
<input type="text"
name = "{{ name }}"
@@ -46,8 +46,8 @@
disabled
>
</div>
{{/forced}}
{{^forced}}
{{/readonly}}
{{^readonly}}
<div class="form-password">
<span data-passwordunmask="wrapper" data-passwordunmaskid="{{ id }}">
<span data-passwordunmask="editor">
@@ -76,4 +76,4 @@ require(['core_form/passwordunmask'], function(PasswordUnmask) {
new PasswordUnmask("{{ id }}");
});
{{/js}}
{{/forced}}
{{/readonly}}
@@ -23,11 +23,13 @@
* name - form element name
* id - element id
* options - list of options containing name, value, selected
* readonly - bool
Example context (json):
{
"name": "test",
"id": "test0",
"readonly": false,
"options": [
{ "name": "Option 1", "value": "V", "selected": true },
{ "name": "Option 2", "value": "V", "selected": true }
@@ -38,7 +40,7 @@
Setting configselect.
}}
<div class="form-select defaultsnext">
<select id="{{id}}" name="{{name}}" class="custom-select">
<select {{#readonly}}disabled{{/readonly}} id="{{id}}" name="{{name}}" class="custom-select">
{{#options}}
<option value="{{value}}" {{#selected}}selected{{/selected}}>{{name}}</option>
{{/options}}
@@ -22,6 +22,7 @@
Context variables required for this template:
* name - form element name
* id - element id
* readonly - bool
* options - list of options (not grouped)
* optgroups - list of options grouped containing the group label and for each option: name, value, selected
@@ -29,6 +30,7 @@
{
"name": "test",
"id": "test0",
"readonly": false,
"options": [
{ "name": "Option 1", "value": "V", "selected": false },
{ "name": "Option 2", "value": "V", "selected": false }
@@ -55,7 +57,7 @@
Setting configselect with optgroup support.
}}
<div class="form-select defaultsnext">
<select id="{{id}}" name="{{name}}" class="custom-select">
<select {{#readonly}}disabled{{/readonly}} id="{{id}}" name="{{name}}" class="custom-select">
{{#options}}
<option value="{{value}}" {{#selected}}selected{{/selected}}>{{name}}</option>
{{/options}}
+3 -1
View File
@@ -26,6 +26,7 @@
* size - element size
* forceltr - always display as ltr
* attributes - list of additional attributes containing name, value
* readonly - bool
Example context (json):
{
@@ -34,6 +35,7 @@
"value": "A tall, dark stranger will have more fun than you.",
"size": "21",
"forceltr": false,
"readonly": false,
"attributes": [ { "name": "readonly", "value": "readonly" } ]
}
}}
@@ -41,5 +43,5 @@
Setting configtext.
}}
<div class="form-text defaultsnext">
<input type="text" name="{{name}}" value="{{value}}" size="{{size}}" id="{{id}}" class="form-control {{#forceltr}}text-ltr{{/forceltr}}">
<input type="text" name="{{name}}" value="{{value}}" size="{{size}}" id="{{id}}" class="form-control {{#forceltr}}text-ltr{{/forceltr}}" {{#readonly}}disabled{{/readonly}}>
</div>
@@ -33,6 +33,7 @@
"cols": "30",
"rows": "3",
"value": "Excellent day for putting Slinkies on an escalator.",
"readonly": false,
"id": "test0"
}
}}
@@ -40,5 +41,5 @@
Setting configtextarea.
}}
<div class="form-textarea">
<textarea rows="{{rows}}" cols="{{cols}}" id="{{id}}" name="{{name}}" spellcheck="true" class="form-control {{#forceltr}}text-ltr{{/forceltr}}">{{value}}</textarea>
<textarea {{#readonly}}disabled{{/readonly}} rows="{{rows}}" cols="{{cols}}" id="{{id}}" name="{{name}}" spellcheck="true" class="form-control {{#forceltr}}text-ltr{{/forceltr}}">{{value}}</textarea>
</div>
+4 -2
View File
@@ -24,11 +24,13 @@
* id - element id
* hours - list of valid hour options containing name, value, selected
* minutes - list of valid minute options containing name, value, selected
* readonly - bool
Example context (json):
{
"name": "test",
"id": "test0",
"readonly": false,
"minutes": [
{ "name": "00", "value": "0", "selected": true },
{ "name": "01", "value": "1", "selected": false }
@@ -45,13 +47,13 @@
<div class="form-time defaultsnext">
<div class="form-inline text-ltr">
<label class="sr-only" for="{{id}}h">{{#str}}hours{{/str}}</label>
<select id="{{id}}h" name="{{name}}[h]" class="custom-select">
<select id="{{id}}h" name="{{name}}[h]" class="custom-select" {{#readonly}}disabled{{/readonly}}>
{{#hours}}
<option value="{{value}}" {{#selected}}selected{{/selected}}>{{name}}</option>
{{/hours}}
</select>:
<label class="sr-only" for="{{id}}m">{{#str}}minutes{{/str}}</label>
<select id="{{id}}m" name="{{name}}[m]" class="custom-select">
<select id="{{id}}m" name="{{name}}[m]" class="custom-select" {{#readonly}}disabled{{/readonly}}>
{{#minutes}}
<option value="{{value}}" {{#selected}}selected{{/selected}}>{{name}}</option>
{{/minutes}}
+1 -1
View File
@@ -56,7 +56,7 @@ class behat_admin extends behat_base {
$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('query', 'admin'), $label]);
$this->execute('behat_forms::i_set_the_field_to', [get_string('search'), $label]);
$this->execute("behat_forms::press_button", get_string('search', 'admin'));
// Admin settings does not use the same DOM structure than other moodle forms
@@ -0,0 +1,29 @@
@core @core_admin
Feature: Administrator is warned and when trying to set invalid allcountrycodes value.
In order to avoid misconfiguration of the country selector fields
As an admin
I want to be warned when I try to set an invalid country code in the allcountrycodes field
Scenario: Attempting to set allcountrycodes field with valid country codes
Given I log in as "admin"
And I navigate to "Location > Location settings" in site administration
When I set the following administration settings values:
| All country codes | CZ,BE,GB,ES |
Then I should not see "Invalid country code"
Scenario: Attempting to set allcountrycodes field with invalid country code
Given I log in as "admin"
And I navigate to "Location > Location settings" in site administration
When I set the following administration settings values:
| All country codes | CZ,BE,FOOBAR,GB,ES |
Then I should see "Invalid country code: FOOBAR"
Scenario: Attempting to unset allcountrycodes field
Given I log in as "admin"
And I navigate to "Location > Location settings" in site administration
And I set the following administration settings values:
| All country codes | CZ,BE,GB,ES |
And I navigate to "Location > Location settings" in site administration
When I set the following administration settings values:
| All country codes | |
Then I should not see "Invalid country code"
@@ -0,0 +1,34 @@
@core @core_admin
Feature: Configure language settings for the site
In order to configure language settings for the site
As an admin
I want to set language settings relevant to my site users
Scenario: Set languages on language menu
Given I log in as "admin"
And I navigate to "Language > Language settings" in site administration
When I set the field "Languages on language menu" to "en"
And I press "Save changes"
Then I should not see "Invalid language code"
Scenario: Reset languages on language menu
Given I log in as "admin"
And I navigate to "Language > Language settings" in site administration
When I set the field "Languages on language menu" to ""
And I press "Save changes"
Then I should not see "Invalid language code"
Scenario Outline: Set languages on language menu with invalid language
Given I log in as "admin"
And I navigate to "Language > Language settings" in site administration
When I set the field "Languages on language menu" to "<fieldvalue>"
And I press "Save changes"
Then I should see "Invalid language code: <invalidlang>"
Examples:
| fieldvalue | invalidlang |
| xx | xx |
| xx\|Bad | xx |
| en,qq | qq |
| en,qq\|Bad | qq |
| en$$ | en$$ |
| en$$\|Bad | en$$ |
@@ -64,7 +64,7 @@ class models_list implements \renderable, \templatable {
$data = new \stdClass();
$newmodelmenu = new \action_menu();
$newmodelmenu->set_menu_trigger(get_string('newmodel', 'tool_analytics'), 'btn btn-default');
$newmodelmenu->set_menu_trigger(get_string('newmodel', 'tool_analytics'), 'btn btn-secondary');
$newmodelmenu->set_alignment(\action_menu::TL, \action_menu::BL);
$newmodelmenu->add(new \action_menu_link(
@@ -57,10 +57,10 @@
{{/trainedexternally}}
{{! Hidden by default if #trainedexternally as the default option is trainedmodel in this case.}}
<div id="id-evaluation-timesplitting-container" class="m-t-1 {{#trainedexternally}}hidden{{/trainedexternally}}">
<div id="id-evaluation-timesplitting-container" class="mt-3 {{#trainedexternally}}hidden{{/trainedexternally}}">
{{#str}} selecttimesplittingforevaluation, tool_analytics {{/str}}
<div>
<select id="id-evaluation-timesplitting" name="timesplitting" class="custom-select m-t-1">
<select id="id-evaluation-timesplitting" name="timesplitting" class="custom-select mt-3">
{{#timesplittingmethods}}
<option value="{{id}}">{{text}}</option>
{{/timesplittingmethods}}
@@ -39,7 +39,7 @@
<input class="custom-control-input" type="radio" name="exportoption" id="id-mode-exportmodel" value="exportmodel" checked>
<label class="custom-control-label" for="id-mode-exportmodel">{{#str}} exportmodel, tool_analytics {{/str}}</label>
</div>
<div class="custom-control custom-checkbox m-l-2" id="id-includeweights-container">
<div class="custom-control custom-checkbox ml-5" id="id-includeweights-container">
<input class="custom-control-input" type="checkbox" id="id-includeweights" value="1" checked>
<label class="custom-control-label" for="id-includeweights">{{#str}} exportincludeweights, tool_analytics {{/str}}</label>
</div>
+1 -2
View File
@@ -66,8 +66,6 @@ class tool_analytics_external_testcase extends externallib_advanced_testcase {
/**
* test_potential_contexts description
*
* @expectedException required_capability_exception
*/
public function test_potential_contexts_no_manager() {
$this->resetAfterTest();
@@ -75,6 +73,7 @@ class tool_analytics_external_testcase extends externallib_advanced_testcase {
$user = $this->getDataGenerator()->create_user();
$this->setUser($user);
$this->expectException(required_capability_exception::class);
$this->assertCount(2, \tool_analytics\external::potential_contexts());
}
}
+2 -2
View File
@@ -24,6 +24,6 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2020061500; // The current plugin version (Date: YYYYMMDDXX).
$plugin->requires = 2020060900; // Requires this Moodle version.
$plugin->version = 2020110900; // The current plugin version (Date: YYYYMMDDXX).
$plugin->requires = 2020110300; // Requires this Moodle version.
$plugin->component = 'tool_analytics'; // Full name of the plugin (used for diagnostics).
@@ -24,6 +24,6 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2020061500;
$plugin->requires = 2020060900;
$plugin->version = 2020110900;
$plugin->requires = 2020110300;
$plugin->component = 'tool_availabilityconditions';
+43 -11
View File
@@ -49,6 +49,10 @@ list($options, $unrecognized) = cli_get_params(
'torun' => 0,
'optimize-runs' => '',
'add-core-features-to-theme' => false,
'axe' => false,
'disable-composer' => false,
'composer-upgrade' => true,
'composer-self-update' => true,
),
array(
'j' => 'parallel',
@@ -64,18 +68,36 @@ $help = "
Behat utilities to initialise behat tests
Usage:
php init.php [--parallel=value [--maxruns=value] [--fromrun=value --torun=value]] [--help]
php init.php [--parallel=value [--maxruns=value] [--fromrun=value --torun=value]]
[--axe] [-o | --optimize-runs] [-a | --add-core-features-to-theme]
[--no-composer-self-update] [--no-composer-upgrade]
[--disable-composer]
[--help]
Options:
-j, --parallel Number of parallel behat run to initialise
-m, --maxruns Max parallel processes to be executed at one time.
--fromrun Execute run starting from (Used for parallel runs on different vms)
--torun Execute run till (Used for parallel runs on different vms)
-j, --parallel Number of parallel behat run to initialise
-m, --maxruns Max parallel processes to be executed at one time
--fromrun Execute run starting from (Used for parallel runs on different vms)
--torun Execute run till (Used for parallel runs on different vms)
--axe Include axe accessibility tests
-o, --optimize-runs Split features with specified tags in all parallel runs.
-a, --add-core-features-to-theme Add all core features to specified theme's
-o, --optimize-runs
Split features with specified tags in all parallel runs.
-h, --help Print out this help
-a, --add-core-features-to-theme
Add all core features to specified theme's
--no-composer-self-update
Prevent upgrade of the composer utility using its self-update command
--no-composer-upgrade
Prevent update development dependencies using composer
--disable-composer
A shortcut to disable composer self-update and dependency update
Note: Installation of composer and/or dependencies will still happen as required
-h, --help Print out this help
Example from Moodle root directory:
\$ php admin/tool/behat/cli/init.php --parallel=2
@@ -102,7 +124,10 @@ if ($options['parallel'] && $options['parallel'] > 1) {
}
} else {
// Only sanitize options for single run.
$cmdoptionsforsinglerun = array('add-core-features-to-theme');
$cmdoptionsforsinglerun = [
'add-core-features-to-theme',
'axe',
];
foreach ($cmdoptionsforsinglerun as $option) {
if (!empty($options[$option])) {
@@ -115,8 +140,15 @@ if ($options['parallel'] && $options['parallel'] > 1) {
$cwd = getcwd();
$output = null;
// If behat dependencies not downloaded then do it first, else symfony/process can't be used.
testing_update_composer_dependencies();
if ($options['disable-composer']) {
// Disable self-update and upgrade easily.
// Note: Installation will still occur regardless of this setting.
$options['composer-self-update'] = false;
$options['composer-upgrade'] = false;
}
// Install and update composer and dependencies as required.
testing_update_composer_dependencies($options['composer-self-update'], $options['composer-upgrade']);
// Check whether the behat test environment needs to be updated.
chdir(__DIR__);
+3 -1
View File
@@ -54,6 +54,7 @@ list($options, $unrecognized) = cli_get_params(
'torun' => 0,
'optimize-runs' => '',
'add-core-features-to-theme' => false,
'axe' => false,
),
array(
'h' => 'help',
@@ -69,7 +70,7 @@ $help = "
Behat utilities to manage the test environment
Usage:
php util.php [--install|--drop|--enable|--disable|--diag|--updatesteps|--help] [--parallel=value [--maxruns=value]]
php util.php [--install|--drop|--enable|--disable|--diag|--updatesteps|--axe|--help] [--parallel=value [--maxruns=value]]
Options:
--install Installs the test environment for acceptance tests
@@ -78,6 +79,7 @@ Options:
--disable Disables test environment
--diag Get behat test environment status code
--updatesteps Update feature step file.
--axe Include axe accessibility tests
-j, --parallel Number of parallel behat run operation
-m, --maxruns Max parallel processes to be executed at one time.
+14
View File
@@ -49,6 +49,7 @@ list($options, $unrecognized) = cli_get_params(
'updatesteps' => false,
'optimize-runs' => '',
'add-core-features-to-theme' => false,
'axe' => false,
),
array(
'h' => 'help',
@@ -75,6 +76,7 @@ Options:
--disable Disables test environment
--diag Get behat test environment status code
--updatesteps Update feature step file.
--axe Include axe accessibility tests
-o, --optimize-runs Split features with specified tags in all parallel runs.
-a, --add-core-features-to-theme Add all core features to specified theme's
@@ -164,6 +166,8 @@ if ($options['install']) {
mtrace("Acceptance tests site installed");
}
// Note: Do not build the themes here. This is done during the 'enable' stage.
} else if ($options['drop']) {
// Ensure no tests are running.
test_lock::acquire('behat');
@@ -179,8 +183,18 @@ if ($options['install']) {
behat_config_manager::set_behat_run_config_value('behatsiteenabled', 1);
}
// Define whether to run Behat with axe tests.
behat_config_manager::set_behat_run_config_value('axe', $options['axe']);
// Enable test mode.
$timestart = microtime(true);
mtrace('Creating Behat configuration ...', '');
behat_util::start_test_mode($options['add-core-features-to-theme'], $options['optimize-runs'], $parallel, $run);
mtrace(' done in ' . round(microtime(true) - $timestart, 2) . ' seconds.');
// Themes are only built in the 'enable' command.
behat_util::build_themes(true);
mtrace("Testing environment themes built");
// This is only displayed once for parallel install.
if (empty($run)) {
@@ -6,14 +6,18 @@ Feature: Edit capabilities
Background:
Given the following "users" exist:
| username | firstname | lastname | email |
| teacher1 | Teacher | 1 | teacher1@example.com |
| username | firstname | lastname |
| teacher1 | Teacher | 1 |
| tutor | Teaching | Assistant |
| student | Student | One |
And the following "courses" exist:
| fullname | shortname | category |
| Course 1 | C1 | 0 |
| fullname | shortname |
| Course 1 | C1 |
And the following "course enrolments" exist:
| user | course | role |
| teacher1 | C1 | editingteacher |
| user | course | role |
| teacher1 | C1 | editingteacher |
| tutor | C1 | teacher |
| student | C1 | student |
Scenario: Default system capabilities modification
Given I log in as "admin"
@@ -60,3 +64,25 @@ Feature: Edit capabilities
Then "mod/forum:deleteanypost" capability has "Prohibit" permission
And "mod/forum:editanypost" capability has "Prevent" permission
And "mod/forum:addquestion" capability has "Allow" permission
@javascript
Scenario: Edit permissions escapes role names correctly
When I am on the "C1" "Course" page logged in as "admin"
And I navigate to "Edit settings" in current page administration
And I set the following fields to these values:
| Your word for 'Teacher' | Teacher >= editing |
| Your word for 'Non-editing teacher' | Teacher < "editing" |
| Your word for 'Student' | Studier & 'learner' |
And I press "Save and display"
And I navigate to course participants
Then I should see "Teacher >= editing (Teacher)" in the "Teacher 1" "table_row"
And I should see "Teacher < \"editing\" (Non-editing teacher)" in the "Teaching Assistant" "table_row"
And I should see "Studier & 'learner' (Student)" in the "Student One" "table_row"
And I navigate to "Users > Permissions" in current page administration
And I should see "Teacher >= editing" in the "mod/forum:replypost" "table_row"
And I should see "Teacher < \"editing\"" in the "mod/forum:replypost" "table_row"
And I should see "Studier & 'learner'" in the "mod/forum:replypost" "table_row"
And I follow "Prohibit"
And "Teacher >= editing" "button" in the "Prohibit role" "dialogue" should be visible
And "Teacher < \"editing\"" "button" in the "Prohibit role" "dialogue" should be visible
And "Studier & 'learner'" "button" in the "Prohibit role" "dialogue" should be visible
@@ -0,0 +1,30 @@
@tool_behat
Feature: Verify that the inplace editable field works as expected
In order to use behat step definitions
As a test write
I need to ensure that the inplace editable works in forms
Background:
Given the following "course" exists:
| fullname | Course 1 |
| shortname | C1 |
And the following "activities" exist:
| activity | course | name | idnumber |
| forum | C1 | My first forum | forum1 |
| assign | C1 | My first assignment | assign1 |
| quiz | C1 | My first quiz | quiz1 |
And I log in as "admin"
And I am on "Course 1" course homepage with editing mode on
@javascript
Scenario: Using an inplace editable updates the name of an activity
When I set the field "Edit title" in the "My first assignment" "activity" to "Coursework submission"
Then I should see "Coursework submission"
And I should not see "My first assignment"
But I should see "My first forum"
And I should see "My first quiz"
And I set the field "Edit title" in the "Coursework submission" "activity" to "My first assignment"
And I should not see "Coursework submission"
But I should see "My first assignment"
And I should see "My first forum"
And I should see "My first quiz"
@@ -0,0 +1,53 @@
@tool_behat
Feature: Verify that keyboard steps work as expected
In order to use behat step definitions
As a test writer
I need to verify that the keyboard steps work as expected
@javascript
Scenario: Typing keys into a field causes them to be input
Given the following "users" exist:
| username | email | firstname | lastname | password |
| saffronr | saffron.rutledge@example.com | Saffron | Rutledge | flowerpower |
Given I click on "Log in" "link"
And I click on "Username" "field"
When I type "saffronr"
And I press the tab key
And I type "flowerpower"
And I press enter
Then I should see "You are logged in as Saffron Rutledge"
@javascript
Scenario: Using tab changes focus to the next or previous field
Given I click on "Log in" "link"
And I click on "Username" "field"
And the focused element is "Username" "field"
When I press the tab key
Then the focused element is "Password" "field"
And I press the shift tab key
And the focused element is "Username" "field"
# TODO: Uncomment the following when MDL-66979 is integrated.
# @javascript
# Scenario: Using the arrow keys allows me to navigate through menus
# Given the following "users" exist:
# | username | email | firstname | lastname |
# | saffronr | saffron.rutledge@example.com | Saffron | Rutledge |
# And I log in as "saffronr"
# And I click on "Saffron Rutledge" "link" in the ".usermenu" "css_element"
# When I press the up key
# Then the focused element is "Log out" "link"
@javascript
Scenario: The escape key can be used to close a dialogue
Given the following "course" exists:
| fullname | C1|
| shortname | C1 |
And I log in as "admin"
And I am on "C1" course homepage
And I navigate to course participants
And I press "Enrol users"
And "Enrol users" "dialogue" should be visible
When I press the escape key
Then "Enrol users" "dialogue" should not be visible
+15 -15
View File
@@ -87,7 +87,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
/**
* Setup test.
*/
public function setup() {
public function setUp(): void {
global $CFG;
$this->resetAfterTest();
@@ -165,7 +165,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
$this->assertCount(count($paths), $suites[$themename]['paths']);
foreach ($paths as $key => $feature) {
$this->assertContains($feature, $suites[$themename]['paths'][$key]);
$this->assertStringContainsString($feature, $suites[$themename]['paths'][$key]);
}
}
@@ -219,7 +219,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
$this->assertCount(count($paths), $suites[$themename]['paths']);
foreach ($paths as $key => $feature) {
$this->assertContains($feature, $suites[$themename]['paths'][$key]);
$this->assertStringContainsString($feature, $suites[$themename]['paths'][$key]);
}
}
@@ -264,7 +264,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
$this->assertCount(count($paths), $suites[$themename]['paths']);
foreach ($paths as $key => $feature) {
$this->assertContains($feature, $suites[$themename]['paths'][$key]);
$this->assertStringContainsString($feature, $suites[$themename]['paths'][$key]);
}
}
@@ -295,7 +295,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
$this->assertCount(count($paths), $suites[$themename]['paths']);
foreach ($paths as $key => $feature) {
$this->assertContains($feature, $suites[$themename]['paths'][$key]);
$this->assertStringContainsString($feature, $suites[$themename]['paths'][$key]);
}
}
// Check contexts.
@@ -324,7 +324,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
$this->assertCount(count($paths), $suites[$themename]['paths']);
foreach ($paths as $key => $feature) {
$this->assertContains($feature, $suites[$themename]['paths'][$key]);
$this->assertStringContainsString($feature, $suites[$themename]['paths'][$key]);
}
}
// Check contexts.
@@ -368,7 +368,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
$this->assertCount(count($paths), $suites[$themename]['paths']);
foreach ($paths as $key => $feature) {
$this->assertContains($feature, $suites[$themename]['paths'][$key]);
$this->assertStringContainsString($feature, $suites[$themename]['paths'][$key]);
}
}
// Check contexts.
@@ -399,7 +399,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
$this->assertCount(count($paths), $suites[$themename]['paths']);
foreach ($paths as $key => $feature) {
$this->assertContains($feature, $suites[$themename]['paths'][$key]);
$this->assertStringContainsString($feature, $suites[$themename]['paths'][$key]);
}
}
// Check contexts.
@@ -428,7 +428,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
$this->assertCount(count($paths), $suites[$themename]['paths']);
foreach ($paths as $key => $feature) {
$this->assertContains($feature, $suites[$themename]['paths'][$key]);
$this->assertStringContainsString($feature, $suites[$themename]['paths'][$key]);
}
}
// Check contexts.
@@ -532,7 +532,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
$this->assertCount(count($paths), $suites[$themename]['paths']);
foreach ($paths as $key => $feature) {
$this->assertContains($feature, $suites[$themename]['paths'][$key]);
$this->assertStringContainsString($feature, $suites[$themename]['paths'][$key]);
}
}
// Check contexts.
@@ -611,7 +611,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
$this->assertCount(count($paths), $suites[$themename]['paths']);
foreach ($paths as $key => $feature) {
$this->assertContains($feature, $suites[$themename]['paths'][$key]);
$this->assertStringContainsString($feature, $suites[$themename]['paths'][$key]);
}
}
// Check contexts.
@@ -646,7 +646,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
$this->assertCount(count($paths), $suites[$themename]['paths']);
foreach ($paths as $key => $feature) {
$this->assertContains($feature, $suites[$themename]['paths'][$key]);
$this->assertStringContainsString($feature, $suites[$themename]['paths'][$key]);
}
}
@@ -662,7 +662,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
$this->assertCount(count($paths), $suites[$themename]['paths']);
foreach ($paths as $key => $feature) {
$this->assertContains($feature, $suites[$themename]['paths'][$key]);
$this->assertStringContainsString($feature, $suites[$themename]['paths'][$key]);
}
}
@@ -678,7 +678,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
$this->assertCount(count($paths), $suites[$themename]['paths']);
foreach ($paths as $key => $feature) {
$this->assertContains($feature, $suites[$themename]['paths'][$key]);
$this->assertStringContainsString($feature, $suites[$themename]['paths'][$key]);
}
}
@@ -693,7 +693,7 @@ class tool_behat_manager_util_testcase extends advanced_testcase {
$this->assertCount(count($paths), $suites[$themename]['paths']);
foreach ($paths as $key => $feature) {
$this->assertContains($feature, $suites[$themename]['paths'][$key]);
$this->assertStringContainsString($feature, $suites[$themename]['paths'][$key]);
}
}
}
+2 -2
View File
@@ -24,6 +24,6 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2020061500; // The current plugin version (Date: YYYYMMDDXX)
$plugin->requires = 2020060900; // Requires this Moodle version
$plugin->version = 2020110900; // The current plugin version (Date: YYYYMMDDXX)
$plugin->requires = 2020110300; // Requires this Moodle version
$plugin->component = 'tool_behat'; // Full name of the plugin (used for diagnostics)
+1 -1
View File
@@ -36,7 +36,7 @@ class tool_capability_events_testcase extends advanced_testcase {
/**
* Setup testcase.
*/
public function setUp() {
public function setUp(): void {
$this->setAdminUser();
$this->resetAfterTest();
}
+2 -2
View File
@@ -24,6 +24,6 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2020061500; // The current plugin version (Date: YYYYMMDDXX).
$plugin->requires = 2020060900; // Requires this Moodle version.
$plugin->version = 2020110900; // The current plugin version (Date: YYYYMMDDXX).
$plugin->requires = 2020110300; // Requires this Moodle version.
$plugin->component = 'tool_capability'; // Full name of the plugin (used for diagnostics).
@@ -53,6 +53,13 @@ SEARCH.prototype = {
* @protected
*/
button: null,
/**
* The cancel button for the form.
* @property button
* @type Node
* @protected
*/
cancel: null,
/**
* The last search node if there is one.
* If there is a last search node then the last search term will be persisted between requests.
@@ -76,17 +83,28 @@ SEARCH.prototype = {
this.button = this.form.all('input[type=submit]');
this.lastsearch = this.form.one('input[name=search]');
var div = Y.Node.create('<div id="capabilitysearchui" data-fieldtype="text"></div>'),
label = Y.Node.create('<label for="capabilitysearch">' + this.get('strsearch') + '</label>');
this.input = Y.Node.create('<input type="text" id="capabilitysearch" />');
var div = Y.Node.create('<div id="capabilitysearchui" class="input-group simplesearchform mb-2"' +
'data-fieldtype="text"></div>'),
label = Y.Node.create('<label for="capabilitysearch"><span class="sr-only"' +
this.get('strsearch') + '</span></label>');
this.cancel = Y.Node.create('<a class="btn btn-clear d-none icon-no-margin">' +
'<i class="icon fa fa-times fa-fw " aria-hidden="true"></i>' +
'</a>');
this.input = Y.Node.create('<input type="text" class="form-control withclear" placeholder="' +
this.get('strsearch') + '"id="capabilitysearch" />');
div.append(label).append(this.input);
div.append(label).append(this.input).append(this.cancel);
this.select.insert(div, 'before');
this.input.on('keyup', this.typed, this);
this.select.on('change', this.validate, this);
this.cancel.on('click', function() {
this.input.set('value', '');
this.typed();
}, this);
if (this.lastsearch) {
this.input.set('value', this.lastsearch.get('value'));
this.typed();
@@ -133,6 +151,11 @@ SEARCH.prototype = {
last.set('selected', true);
}
}
if (search !== '') {
this.cancel.removeClass("d-none");
} else {
this.cancel.addClass("d-none");
}
this.validate();
}
};
@@ -1 +1 @@
YUI.add("moodle-tool_capability-search",function(i,t){var e=function(){e.superclass.constructor.apply(this,arguments)};e.prototype={form:null,select:null,selectoptions:{},input:null,button:null,lastsearch:null,initializer:function(){this.form=i.one("#capability-overview-form"),this.select=this.form.one("select[data-search=capability]"),this.select.setStyle("minWidth",this.select.get("offsetWidth")),this.select.get("options").each(function(t){var e=t.get("value");this.selectoptions[e]=t},this),this.button=this.form.all("input[type=submit]"),this.lastsearch=this.form.one("input[name=search]");var t=i.Node.create('<div id="capabilitysearchui" data-fieldtype="text"></div>'),e=i.Node.create('<label for="capabilitysearch">'+this.get("strsearch")+"</label>");this.input=i.Node.create('<input type="text" id="capabilitysearch" />'),t.append(e).append(this.input),this.select.insert(t,"before"),this.input.on("keyup",this.typed,this),this.select.on("change",this.validate,this),this.lastsearch&&(this.input.set("value",this.lastsearch.get("value")),this.typed(),this.select.one("option[selected]")&&this.select.set("scrollTop",this.select.one("option[selected]").get("getX"))),this.validate()},validate:function(){this.button.set("disabled",""===this.select.get("value"))},typed:function(){var t,e=this.input.get("value"),i=0,s=null;for(t in this.lastsearch&&this.lastsearch.set("value",e),this.select.all("option").remove(),this.selectoptions)0<=t.indexOf(e)&&(i++,s=this.selectoptions[t],this.select.append(this.selectoptions[t]));0===i?this.input.addClass("error"):(this.input.removeClass("error"),1===i&&s.set("selected",!0)),this.validate()}},i.extend(e,i.Base,e.prototype,{NAME:"tool_capability-search",ATTRS:{strsearch:{}}}),M.tool_capability=M.tool_capability||{},M.tool_capability.init_capability_search=function(t){new e(t)}},"@VERSION@",{requires:["base","node"]});
YUI.add("moodle-tool_capability-search",function(s,t){var e=function(){e.superclass.constructor.apply(this,arguments)};e.prototype={form:null,select:null,selectoptions:{},input:null,button:null,cancel:null,lastsearch:null,initializer:function(){this.form=s.one("#capability-overview-form"),this.select=this.form.one("select[data-search=capability]"),this.select.setStyle("minWidth",this.select.get("offsetWidth")),this.select.get("options").each(function(t){var e=t.get("value");this.selectoptions[e]=t},this),this.button=this.form.all("input[type=submit]"),this.lastsearch=this.form.one("input[name=search]");var t=s.Node.create('<div id="capabilitysearchui" class="input-group simplesearchform mb-2"data-fieldtype="text"></div>'),e=s.Node.create('<label for="capabilitysearch"><span class="sr-only"'+this.get("strsearch")+"</span></label>");this.cancel=s.Node.create('<a class="btn btn-clear d-none icon-no-margin"><i class="icon fa fa-times fa-fw " aria-hidden="true"></i></a>'),this.input=s.Node.create('<input type="text" class="form-control withclear" placeholder="'+this.get("strsearch")+'"id="capabilitysearch" />'),t.append(e).append(this.input).append(this.cancel),this.select.insert(t,"before"),this.input.on("keyup",this.typed,this),this.select.on("change",this.validate,this),this.cancel.on("click",function(){this.input.set("value",""),this.typed()},this),this.lastsearch&&(this.input.set("value",this.lastsearch.get("value")),this.typed(),this.select.one("option[selected]")&&this.select.set("scrollTop",this.select.one("option[selected]").get("getX"))),this.validate()},validate:function(){this.button.set("disabled",""===this.select.get("value"))},typed:function(){var t,e=this.input.get("value"),s=0,i=null;for(t in this.lastsearch&&this.lastsearch.set("value",e),this.select.all("option").remove(),this.selectoptions)0<=t.indexOf(e)&&(s++,i=this.selectoptions[t],this.select.append(this.selectoptions[t]));0===s?this.input.addClass("error"):(this.input.removeClass("error"),1===s&&i.set("selected",!0)),""!==e?this.cancel.removeClass("d-none"):this.cancel.addClass("d-none"),this.validate()}},s.extend(e,s.Base,e.prototype,{NAME:"tool_capability-search",ATTRS:{strsearch:{}}}),M.tool_capability=M.tool_capability||{},M.tool_capability.init_capability_search=function(t){new e(t)}},"@VERSION@",{requires:["base","node"]});
@@ -53,6 +53,13 @@ SEARCH.prototype = {
* @protected
*/
button: null,
/**
* The cancel button for the form.
* @property button
* @type Node
* @protected
*/
cancel: null,
/**
* The last search node if there is one.
* If there is a last search node then the last search term will be persisted between requests.
@@ -76,17 +83,28 @@ SEARCH.prototype = {
this.button = this.form.all('input[type=submit]');
this.lastsearch = this.form.one('input[name=search]');
var div = Y.Node.create('<div id="capabilitysearchui" data-fieldtype="text"></div>'),
label = Y.Node.create('<label for="capabilitysearch">' + this.get('strsearch') + '</label>');
this.input = Y.Node.create('<input type="text" id="capabilitysearch" />');
var div = Y.Node.create('<div id="capabilitysearchui" class="input-group simplesearchform mb-2"' +
'data-fieldtype="text"></div>'),
label = Y.Node.create('<label for="capabilitysearch"><span class="sr-only"' +
this.get('strsearch') + '</span></label>');
this.cancel = Y.Node.create('<a class="btn btn-clear d-none icon-no-margin">' +
'<i class="icon fa fa-times fa-fw " aria-hidden="true"></i>' +
'</a>');
this.input = Y.Node.create('<input type="text" class="form-control withclear" placeholder="' +
this.get('strsearch') + '"id="capabilitysearch" />');
div.append(label).append(this.input);
div.append(label).append(this.input).append(this.cancel);
this.select.insert(div, 'before');
this.input.on('keyup', this.typed, this);
this.select.on('change', this.validate, this);
this.cancel.on('click', function() {
this.input.set('value', '');
this.typed();
}, this);
if (this.lastsearch) {
this.input.set('value', this.lastsearch.get('value'));
this.typed();
@@ -133,6 +151,11 @@ SEARCH.prototype = {
last.set('selected', true);
}
}
if (search !== '') {
this.cancel.removeClass("d-none");
} else {
this.cancel.addClass("d-none");
}
this.validate();
}
};
+27 -4
View File
@@ -51,6 +51,13 @@ SEARCH.prototype = {
* @protected
*/
button: null,
/**
* The cancel button for the form.
* @property button
* @type Node
* @protected
*/
cancel: null,
/**
* The last search node if there is one.
* If there is a last search node then the last search term will be persisted between requests.
@@ -74,17 +81,28 @@ SEARCH.prototype = {
this.button = this.form.all('input[type=submit]');
this.lastsearch = this.form.one('input[name=search]');
var div = Y.Node.create('<div id="capabilitysearchui" data-fieldtype="text"></div>'),
label = Y.Node.create('<label for="capabilitysearch">' + this.get('strsearch') + '</label>');
this.input = Y.Node.create('<input type="text" id="capabilitysearch" />');
var div = Y.Node.create('<div id="capabilitysearchui" class="input-group simplesearchform mb-2"' +
'data-fieldtype="text"></div>'),
label = Y.Node.create('<label for="capabilitysearch"><span class="sr-only"' +
this.get('strsearch') + '</span></label>');
this.cancel = Y.Node.create('<a class="btn btn-clear d-none icon-no-margin">' +
'<i class="icon fa fa-times fa-fw " aria-hidden="true"></i>' +
'</a>');
this.input = Y.Node.create('<input type="text" class="form-control withclear" placeholder="' +
this.get('strsearch') + '"id="capabilitysearch" />');
div.append(label).append(this.input);
div.append(label).append(this.input).append(this.cancel);
this.select.insert(div, 'before');
this.input.on('keyup', this.typed, this);
this.select.on('change', this.validate, this);
this.cancel.on('click', function() {
this.input.set('value', '');
this.typed();
}, this);
if (this.lastsearch) {
this.input.set('value', this.lastsearch.get('value'));
this.typed();
@@ -131,6 +149,11 @@ SEARCH.prototype = {
last.set('selected', true);
}
}
if (search !== '') {
this.cancel.removeClass("d-none");
} else {
this.cancel.addClass("d-none");
}
this.validate();
}
};
+6
View File
@@ -41,5 +41,11 @@ function xmldb_tool_cohortroles_upgrade($oldversion) {
upgrade_plugin_savepoint(true, 2020020600, 'tool', 'cohortroles');
}
// Automatically generated Moodle v3.9.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v3.10.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+5 -13
View File
@@ -49,7 +49,7 @@ class tool_cohortroles_api_testcase extends advanced_testcase {
/**
* Setup function- we will create a course and add an assign instance to it.
*/
protected function setUp() {
protected function setUp(): void {
$this->resetAfterTest(true);
// Create some users.
@@ -60,9 +60,6 @@ class tool_cohortroles_api_testcase extends advanced_testcase {
cohort_add_member($this->cohort->id, $this->userassignover->id);
}
/**
* @expectedException required_capability_exception
*/
public function test_create_cohort_role_assignment_without_permission() {
$this->setUser($this->userassignto);
$params = (object) array(
@@ -70,12 +67,10 @@ class tool_cohortroles_api_testcase extends advanced_testcase {
'roleid' => $this->roleid,
'cohortid' => $this->cohort->id
);
$this->expectException(required_capability_exception::class);
api::create_cohort_role_assignment($params);
}
/**
* @expectedException core_competency\invalid_persistent_exception
*/
public function test_create_cohort_role_assignment_with_invalid_data() {
$this->setAdminUser();
$params = (object) array(
@@ -83,6 +78,7 @@ class tool_cohortroles_api_testcase extends advanced_testcase {
'roleid' => -8,
'cohortid' => $this->cohort->id
);
$this->expectException(\core_competency\invalid_persistent_exception::class);
api::create_cohort_role_assignment($params);
}
@@ -100,9 +96,6 @@ class tool_cohortroles_api_testcase extends advanced_testcase {
$this->assertEquals($result->get('cohortid'), $this->cohort->id);
}
/**
* @expectedException required_capability_exception
*/
public function test_delete_cohort_role_assignment_without_permission() {
$this->setAdminUser();
$params = (object) array(
@@ -112,12 +105,10 @@ class tool_cohortroles_api_testcase extends advanced_testcase {
);
$result = api::create_cohort_role_assignment($params);
$this->setUser($this->userassignto);
$this->expectException(required_capability_exception::class);
api::delete_cohort_role_assignment($result->get('id'));
}
/**
* @expectedException dml_missing_record_exception
*/
public function test_delete_cohort_role_assignment_with_invalid_data() {
$this->setAdminUser();
$params = (object) array(
@@ -126,6 +117,7 @@ class tool_cohortroles_api_testcase extends advanced_testcase {
'cohortid' => $this->cohort->id
);
$result = api::create_cohort_role_assignment($params);
$this->expectException(dml_missing_record_exception::class);
api::delete_cohort_role_assignment($result->get('id') + 1);
}
@@ -43,7 +43,7 @@ class tool_cohortroles_privacy_testcase extends \core_privacy\tests\provider_tes
/**
* Overriding setUp() function to always reset after tests.
*/
public function setUp() {
public function setUp(): void {
$this->resetAfterTest(true);
}
@@ -87,7 +87,7 @@ class tool_cohortroles_privacy_testcase extends \core_privacy\tests\provider_tes
CONTEXT_COURSECAT
];
// Test the User's contexts equal the system and course category context.
$this->assertEquals($expected, $contextlevels, '', 0, 10, true);
$this->assertEqualsCanonicalizing($expected, $contextlevels);
}
/**
+2 -2
View File
@@ -25,8 +25,8 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2020061500; // The current plugin version (Date: YYYYMMDDXX).
$plugin->requires = 2020060900; // Requires this Moodle version.
$plugin->version = 2020110900; // The current plugin version (Date: YYYYMMDDXX).
$plugin->requires = 2020110300; // Requires this Moodle version.
$plugin->component = 'tool_cohortroles'; // Full name of the plugin (used for diagnostics).
$plugin->dependencies = array(
@@ -0,0 +1,68 @@
<?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/>.
/**
* Creates Formular for customlang file export
*
* @package tool_customlang
* @copyright 2020 Thomas Wedekind <Thomas.Wedekind@univie.ac.at>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_customlang\form;
use tool_customlang_utils;
/**
* Formular for customlang file export
*
* @copyright 2020 Thomas Wedekind <Thomas.Wedekind@univie.ac.at>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class export extends \moodleform {
/**
* Add elements to form
*/
public function definition() {
$lng = $this->_customdata['lng'];
$mform = $this->_form;
$langdir = tool_customlang_utils::get_localpack_location($lng);
// The export button only appears if a local lang is present.
if (!check_dir_exists($langdir) || !count(glob("$langdir/*"))) {
print_error('nolocallang', 'tool_customlang');
}
$langfiles = scandir($langdir);
$fileoptions = [];
foreach ($langfiles as $file) {
if (substr($file, 0, 1) != '.') {
$fileoptions[$file] = $file;
}
}
$mform->addElement('hidden', 'lng', $lng);
$mform->setType('lng', PARAM_LANG);
$select = $mform->addElement('select', 'files', get_string('exportfilter', 'tool_customlang'), $fileoptions);
$select->setMultiple(true);
$mform->addRule('files', get_string('required'), 'required', null, 'client');
$mform->setDefault('files', $fileoptions);
$this->add_action_buttons(true, get_string('export', 'tool_customlang'));
}
}
@@ -0,0 +1,68 @@
<?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/>.
/**
* Upload a zip of custom lang php files.
*
* @package tool_customlang
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_customlang\form;
use tool_customlang\local\importer;
/**
* Upload a zip/php of custom lang php files.
*
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class import extends \moodleform {
/**
* Form definition.
*/
public function definition() {
$mform = $this->_form;
$mform->addElement('header', 'settingsheader', get_string('import', 'tool_customlang'));
$mform->addElement('hidden', 'lng');
$mform->setType('lng', PARAM_LANG);
$mform->setDefault('lng', $this->_customdata['lng']);
$filemanageroptions = array(
'accepted_types' => array('.php', '.zip'),
'maxbytes' => 0,
'maxfiles' => 1,
'subdirs' => 0
);
$mform->addElement('filepicker', 'pack', get_string('langpack', 'tool_customlang'),
null, $filemanageroptions);
$mform->addRule('pack', null, 'required');
$modes = [
importer::IMPORTALL => get_string('import_all', 'tool_customlang'),
importer::IMPORTUPDATE => get_string('import_update', 'tool_customlang'),
importer::IMPORTNEW => get_string('import_new', 'tool_customlang'),
];
$mform->addElement('select', 'importmode', get_string('import_mode', 'tool_customlang'), $modes);
$mform->addElement('submit', 'importcustomstrings', get_string('importfile', 'tool_customlang'));
}
}
@@ -0,0 +1,268 @@
<?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/>.
/**
* Custom lang importer.
*
* @package tool_customlang
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_customlang\local;
use tool_customlang\local\mlang\phpparser;
use tool_customlang\local\mlang\logstatus;
use tool_customlang\local\mlang\langstring;
use core\output\notification;
use stored_file;
use coding_exception;
use moodle_exception;
use core_component;
use stdClass;
/**
* Class containing tha custom lang importer
*
* @package tool_customlang
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class importer {
/** @var int imports will only create new customizations */
public const IMPORTNEW = 1;
/** @var int imports will only update the current customizations */
public const IMPORTUPDATE = 2;
/** @var int imports all strings */
public const IMPORTALL = 3;
/**
* @var string the language name
*/
protected $lng;
/**
* @var int the importation mode (new, update, all)
*/
protected $importmode;
/**
* @var string request folder path
*/
private $folder;
/**
* @var array import log messages
*/
private $log;
/**
* Constructor for the importer class.
*
* @param string $lng the current language to import.
* @param int $importmode the import method (IMPORTALL, IMPORTNEW, IMPORTUPDATE).
*/
public function __construct(string $lng, int $importmode = self::IMPORTALL) {
$this->lng = $lng;
$this->importmode = $importmode;
$this->log = [];
}
/**
* Returns the last parse log.
*
* @return logstatus[] mlang logstatus with the messages
*/
public function get_log(): array {
return $this->log;
}
/**
* Import customlang files.
*
* @param stored_file[] $files array of files to import
*/
public function import(array $files): void {
// Create a temporal folder to store the files.
$this->folder = make_request_directory(false);
$langfiles = $this->deploy_files($files);
$this->process_files($langfiles);
}
/**
* Deploy all files into a request folder.
*
* @param stored_file[] $files array of files to deploy
* @return string[] of file paths
*/
private function deploy_files(array $files): array {
$result = [];
// Desploy all files.
foreach ($files as $file) {
if ($file->get_mimetype() == 'application/zip') {
$result = array_merge($result, $this->unzip_file($file));
} else {
$path = $this->folder.'/'.$file->get_filename();
$file->copy_content_to($path);
$result = array_merge($result, [$path]);
}
}
return $result;
}
/**
* Unzip a file into the request folder.
*
* @param stored_file $file the zip file to unzip
* @return string[] of zip content paths
*/
private function unzip_file(stored_file $file): array {
$fp = get_file_packer('application/zip');
$zipcontents = $fp->extract_to_pathname($file, $this->folder);
if (!$zipcontents) {
throw new moodle_exception("Error Unzipping file", 1);
}
$result = [];
foreach ($zipcontents as $contentname => $success) {
if ($success) {
$result[] = $this->folder.'/'.$contentname;
}
}
return $result;
}
/**
* Import strings from a list of langfiles.
*
* @param string[] $langfiles an array with file paths
*/
private function process_files(array $langfiles): void {
$parser = phpparser::get_instance();
foreach ($langfiles as $filepath) {
$component = $this->component_from_filepath($filepath);
if ($component) {
$strings = $parser->parse(file_get_contents($filepath));
$this->import_strings($strings, $component);
}
}
}
/**
* Try to get the component from a filepath.
*
* @param string $filepath the filepath
* @return stdCalss|null the DB record of that component
*/
private function component_from_filepath(string $filepath) {
global $DB;
// Get component from filename.
$pathparts = pathinfo($filepath);
if (empty($pathparts['filename'])) {
throw new coding_exception("Cannot get filename from $filepath", 1);
}
$filename = $pathparts['filename'];
$normalized = core_component::normalize_component($filename);
if (count($normalized) == 1 || empty($normalized[1])) {
$componentname = $normalized[0];
} else {
$componentname = implode('_', $normalized);
}
$result = $DB->get_record('tool_customlang_components', ['name' => $componentname]);
if (!$result) {
$this->log[] = new logstatus('notice_missingcomponent', notification::NOTIFY_ERROR, null, $componentname);
return null;
}
return $result;
}
/**
* Import an array of strings into the customlang tables.
*
* @param langstring[] $strings the langstring to set
* @param stdClass $component the target component
*/
private function import_strings(array $strings, stdClass $component): void {
global $DB;
foreach ($strings as $newstring) {
// Check current DB entry.
$customlang = $DB->get_record('tool_customlang', [
'componentid' => $component->id,
'stringid' => $newstring->id,
'lang' => $this->lng,
]);
if (!$customlang) {
$customlang = null;
}
if ($this->can_save_string($customlang, $newstring, $component)) {
$customlang->local = $newstring->text;
$customlang->timecustomized = $newstring->timemodified;
$customlang->outdated = 0;
$customlang->modified = 1;
$DB->update_record('tool_customlang', $customlang);
}
}
}
/**
* Determine if a specific string can be saved based on the current importmode.
*
* @param stdClass $customlang customlang original record
* @param langstring $newstring the new strign to store
* @param stdClass $component the component target
* @return bool if the string can be stored
*/
private function can_save_string(?stdClass $customlang, langstring $newstring, stdClass $component): bool {
$result = false;
$message = 'notice_success';
if (empty($customlang)) {
$message = 'notice_inexitentstring';
$this->log[] = new logstatus($message, notification::NOTIFY_ERROR, null, $component->name, $newstring);
return $result;
}
switch ($this->importmode) {
case self::IMPORTNEW:
$result = empty($customlang->local);
$warningmessage = 'notice_ignoreupdate';
break;
case self::IMPORTUPDATE:
$result = !empty($customlang->local);
$warningmessage = 'notice_ignorenew';
break;
case self::IMPORTALL:
$result = true;
break;
}
if ($result) {
$errorlevel = notification::NOTIFY_SUCCESS;
} else {
$errorlevel = notification::NOTIFY_ERROR;
$message = $warningmessage;
}
$this->log[] = new logstatus($message, $errorlevel, null, $component->name, $newstring);
return $result;
}
}
@@ -0,0 +1,177 @@
<?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/>.
/**
* Language string based on David Mudrak langstring from local_amos.
*
* @package tool_customlang
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_customlang\local\mlang;
use moodle_exception;
use stdclass;
/**
* Class containing a lang string cleaned.
*
* @package tool_customlang
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* Represents a single string
*/
class langstring {
/** @var string identifier */
public $id = null;
/** @var string */
public $text = '';
/** @var int the time stamp when this string was saved */
public $timemodified = null;
/** @var bool is deleted */
public $deleted = false;
/** @var stdclass extra information about the string */
public $extra = null;
/**
* Class constructor.
*
* @param string $id string identifier
* @param string $text string text
* @param int $timemodified
* @param int $deleted
* @param stdclass $extra
*/
public function __construct(string $id, string $text = '', int $timemodified = null,
int $deleted = 0, stdclass $extra = null) {
if (is_null($timemodified)) {
$timemodified = time();
}
$this->id = $id;
$this->text = $text;
$this->timemodified = $timemodified;
$this->deleted = $deleted;
$this->extra = $extra;
}
/**
* Given a string text, returns it being formatted properly for storing in AMOS repository.
*
* Note: This method is taken directly from local_amos as it is highly tested and robust.
* The Moodle 1.x part is keep on puspose to make it easier the copy paste from both codes.
* This could change in the future when AMOS stop suporting the 1.x langstrings.
*
* We need to know for what branch the string should be prepared due to internal changes in
* format required by get_string()
* - for get_string() in Moodle 1.6 - 1.9 use $format == 1
* - for get_string() in Moodle 2.0 and higher use $format == 2
*
* Typical usages of this methods:
* $t = langstring::fix_syntax($t); // sanity new translations of 2.x strings
* $t = langstring::fix_syntax($t, 1); // sanity legacy 1.x strings
* $t = langstring::fix_syntax($t, 2, 1); // convert format of 1.x strings into 2.x
*
* Backward converting 2.x format into 1.x is not supported
*
* @param string $text string text to be fixed
* @param int $format target get_string() format version
* @param int $from which format version does the text come from, defaults to the same as $format
* @return string
*/
public static function fix_syntax(string $text, int $format = 2, ?int $from = null): string {
if (is_null($from)) {
$from = $format;
}
// Common filter.
$clean = trim($text);
$search = [
// Remove \r if it is part of \r\n.
'/\r(?=\n)/',
// Control characters to be replaced with \n
// LINE TABULATION, FORM FEED, CARRIAGE RETURN, END OF TRANSMISSION BLOCK,
// END OF MEDIUM, SUBSTITUTE, BREAK PERMITTED HERE, NEXT LINE, START OF STRING,
// STRING TERMINATOR and Unicode character categorys Zl and Zp.
'/[\x{0B}-\r\x{17}\x{19}\x{1A}\x{82}\x{85}\x{98}\x{9C}\p{Zl}\p{Zp}]/u',
// Control characters to be removed
// NULL, ENQUIRY, ACKNOWLEDGE, BELL, SHIFT {OUT,IN}, DATA LINK ESCAPE,
// DEVICE CONTROL {ONE,TWO,THREE,FOUR}, NEGATIVE ACKNOWLEDGE, SYNCHRONOUS IDLE, ESCAPE,
// DELETE, PADDING CHARACTER, HIGH OCTET PRESET, NO BREAK HERE, INDEX,
// {START,END} OF SELECTED AREA, CHARACTER TABULATION {SET,WITH JUSTIFICATION},
// LINE TABULATION SET, PARTIAL LINE {FORWARD,BACKWARD}, REVERSE LINE FEED,
// SINGLE SHIFT {TWO,THREE}, DEVICE CONTROL STRING, PRIVATE USE {ONE,TWO},
// SET TRANSMIT STATE, MESSAGE WAITING, {START,END} OF GUARDED AREA,
// {SINGLE {GRAPHIC,} CHARACTER,CONTROL SEQUENCE} INTRODUCER, OPERATING SYSTEM COMMAND,
// PRIVACY MESSAGE, APPLICATION PROGRAM COMMAND, ZERO WIDTH {,NO-BREAK} SPACE,
// REPLACEMENT CHARACTER.
'/[\0\x{05}-\x{07}\x{0E}-\x{16}\x{1B}\x{7F}\x{80}\x{81}\x{83}\x{84}\x{86}-\x{93}\x{95}-\x{97}\x{99}-\x{9B}\x{9D}-\x{9F}\x{200B}\x{FEFF}\x{FFFD}]++/u',
// Remove trailing whitespace at the end of lines in a multiline string.
'/[ \t]+(?=\n)/',
];
$replace = [
'',
"\n",
'',
'',
];
$clean = preg_replace($search, $replace, $clean);
if (($format === 2) && ($from === 2)) {
// Sanity translations of 2.x strings.
$clean = preg_replace("/\n{3,}/", "\n\n\n", $clean); // Collapse runs of blank lines.
} else if (($format === 2) && ($from === 1)) {
// Convert 1.x string into 2.x format.
$clean = preg_replace("/\n{3,}/", "\n\n\n", $clean); // Collapse runs of blank lines.
$clean = preg_replace('/%+/', '%', $clean); // Collapse % characters.
$clean = str_replace('\$', '@@@___XXX_ESCAPED_DOLLAR__@@@', $clean); // Remember for later.
$clean = str_replace("\\", '', $clean); // Delete all slashes.
$clean = preg_replace('/(^|[^{])\$a\b(\->[a-zA-Z0-9_]+)?/', '\\1{$a\\2}', $clean); // Wrap placeholders.
$clean = str_replace('@@@___XXX_ESCAPED_DOLLAR__@@@', '$', $clean);
$clean = str_replace('&#36;', '$', $clean);
} else if (($format === 1) && ($from === 1)) {
// Sanity legacy 1.x strings.
$clean = preg_replace("/\n{3,}/", "\n\n", $clean); // Collapse runs of blank lines.
$clean = str_replace('\$', '@@@___XXX_ESCAPED_DOLLAR__@@@', $clean);
$clean = str_replace("\\", '', $clean); // Delete all slashes.
$clean = str_replace('$', '\$', $clean); // Escape all embedded variables.
// Unescape placeholders: only $a and $a->something are allowed. All other $variables are left escaped.
$clean = preg_replace('/\\\\\$a\b(\->[a-zA-Z0-9_]+)?/', '$a\\1', $clean); // Unescape placeholders.
$clean = str_replace('@@@___XXX_ESCAPED_DOLLAR__@@@', '\$', $clean);
$clean = str_replace('"', "\\\"", $clean); // Add slashes for ".
$clean = preg_replace('/%+/', '%', $clean); // Collapse % characters.
$clean = str_replace('%', '%%', $clean); // Duplicate %.
} else {
throw new moodle_exception('Unknown get_string() format version');
}
return $clean;
}
}
@@ -0,0 +1,92 @@
<?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/>.
/**
* Language string based on David Mudrak langstring from local_amos.
*
* @package tool_customlang
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_customlang\local\mlang;
use moodle_exception;
use stdclass;
/**
* Class containing a lang string cleaned.
*
* @package tool_customlang
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* Represents a single string
*/
class logstatus {
/** @var langstring the current string */
public $langstring = null;
/** @var string the component */
public $component = null;
/** @var string the string ID */
public $stringid = null;
/** @var string the original filename */
public $filename = null;
/** @var int the error level */
public $errorlevel = null;
/** @var string the message identifier */
private $message;
/**
* Class creator.
*
* @param string $message the message identifier to display
* @param string $errorlevel the notice level
* @param string|null $filename the filename of this log
* @param string|null $component the component of this log
* @param langstring|null $langstring the langstring of this log
*/
public function __construct(string $message, string $errorlevel, ?string $filename = null,
?string $component = null, ?langstring $langstring = null) {
$this->filename = $filename;
$this->component = $component;
$this->langstring = $langstring;
$this->message = $message;
$this->errorlevel = $errorlevel;
if ($langstring) {
$this->stringid = $langstring->id;
}
}
/**
* Get the log message.
*
* @return string the log message.
*/
public function get_message(): string {
return get_string($this->message, 'tool_customlang', $this);
}
}
@@ -0,0 +1,260 @@
<?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/>.
/**
* Mlang PHP based on David Mudrak phpparser for local_amos.
*
* @package tool_customlang
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_customlang\local\mlang;
use coding_exception;
use moodle_exception;
/**
* Parser of Moodle strings defined as associative array.
*
* Moodle core just includes this file format directly as normal PHP code. However
* for security reasons, we must not do this for files uploaded by anonymous users.
* This parser reconstructs the associative $string array without actually including
* the file.
*/
class phpparser {
/** @var holds the singleton instance of self */
private static $instance = null;
/**
* Prevents direct creation of object
*/
private function __construct() {
}
/**
* Prevent from cloning the instance
*/
public function __clone() {
throw new coding_exception('Cloning os singleton is not allowed');
}
/**
* Get the singleton instance fo this class
*
* @return phpparser singleton instance of phpparser
*/
public static function get_instance(): phpparser {
if (is_null(self::$instance)) {
self::$instance = new phpparser();
}
return self::$instance;
}
/**
* Parses the given data in Moodle PHP string format
*
* Note: This method is adapted from local_amos as it is highly tested and robust.
* The priority is keeping it similar to the original one to make it easier to mantain.
*
* @param string $data definition of the associative array
* @param int $format the data format on the input, defaults to the one used since 2.0
* @return langstring[] array of langstrings of this file
*/
public function parse(string $data, int $format = 2): array {
$result = [];
$strings = $this->extract_strings($data);
foreach ($strings as $id => $text) {
$cleaned = clean_param($id, PARAM_STRINGID);
if ($cleaned !== $id) {
continue;
}
$text = langstring::fix_syntax($text, 2, $format);
$result[] = new langstring($id, $text);
}
return $result;
}
/**
* Low level parsing method
*
* Note: This method is adapted from local_amos as it is highly tested and robust.
* The priority is keeping it similar to the original one to make it easier to mantain.
*
* @param string $data
* @return string[] the data strings
*/
protected function extract_strings(string $data): array {
$strings = []; // To be returned.
if (empty($data)) {
return $strings;
}
// Tokenize data - we expect valid PHP code.
$tokens = token_get_all($data);
// Get rid of all non-relevant tokens.
$rubbish = [T_WHITESPACE, T_INLINE_HTML, T_COMMENT, T_DOC_COMMENT, T_OPEN_TAG, T_CLOSE_TAG];
foreach ($tokens as $i => $token) {
if (is_array($token)) {
if (in_array($token[0], $rubbish)) {
unset($tokens[$i]);
}
}
}
$id = null;
$text = null;
$line = 0;
$expect = 'STRING_VAR'; // The first expected token is '$string'.
// Iterate over tokens and look for valid $string array assignment patterns.
foreach ($tokens as $token) {
$foundtype = null;
$founddata = null;
if (is_array($token)) {
$foundtype = $token[0];
$founddata = $token[1];
if (!empty($token[2])) {
$line = $token[2];
}
} else {
$foundtype = 'char';
$founddata = $token;
}
if ($expect == 'STRING_VAR') {
if ($foundtype === T_VARIABLE and $founddata === '$string') {
$expect = 'LEFT_BRACKET';
continue;
} else {
// Allow other code at the global level.
continue;
}
}
if ($expect == 'LEFT_BRACKET') {
if ($foundtype === 'char' and $founddata === '[') {
$expect = 'STRING_ID';
continue;
} else {
throw new moodle_exception('Parsing error. Expected character [ at line '.$line);
}
}
if ($expect == 'STRING_ID') {
if ($foundtype === T_CONSTANT_ENCAPSED_STRING) {
$id = $this->decapsulate($founddata);
$expect = 'RIGHT_BRACKET';
continue;
} else {
throw new moodle_exception('Parsing error. Expected T_CONSTANT_ENCAPSED_STRING array key at line '.$line);
}
}
if ($expect == 'RIGHT_BRACKET') {
if ($foundtype === 'char' and $founddata === ']') {
$expect = 'ASSIGNMENT';
continue;
} else {
throw new moodle_exception('Parsing error. Expected character ] at line '.$line);
}
}
if ($expect == 'ASSIGNMENT') {
if ($foundtype === 'char' and $founddata === '=') {
$expect = 'STRING_TEXT';
continue;
} else {
throw new moodle_exception('Parsing error. Expected character = at line '.$line);
}
}
if ($expect == 'STRING_TEXT') {
if ($foundtype === T_CONSTANT_ENCAPSED_STRING) {
$text = $this->decapsulate($founddata);
$expect = 'SEMICOLON';
continue;
} else {
throw new moodle_exception(
'Parsing error. Expected T_CONSTANT_ENCAPSED_STRING array item value at line '.$line
);
}
}
if ($expect == 'SEMICOLON') {
if (is_null($id) or is_null($text)) {
throw new moodle_exception('Parsing error. NULL string id or value at line '.$line);
}
if ($foundtype === 'char' and $founddata === ';') {
if (!empty($id)) {
$strings[$id] = $text;
}
$id = null;
$text = null;
$expect = 'STRING_VAR';
continue;
} else {
throw new moodle_exception('Parsing error. Expected character ; at line '.$line);
}
}
}
return $strings;
}
/**
* Given one T_CONSTANT_ENCAPSED_STRING, return its value without quotes
*
* Also processes escaped quotes inside the text.
*
* Note: This method is taken directly from local_amos as it is highly tested and robust.
*
* @param string $text value obtained by token_get_all()
* @return string value without quotes
*/
protected function decapsulate(string $text): string {
if (strlen($text) < 2) {
throw new moodle_exception('Parsing error. Expected T_CONSTANT_ENCAPSED_STRING in decapsulate()');
}
if (substr($text, 0, 1) == "'" and substr($text, -1) == "'") {
// Single quoted string.
$text = trim($text, "'");
$text = str_replace("\'", "'", $text);
$text = str_replace('\\\\', '\\', $text);
return $text;
} else if (substr($text, 0, 1) == '"' and substr($text, -1) == '"') {
// Double quoted string.
$text = trim($text, '"');
$text = str_replace('\"', '"', $text);
$text = str_replace('\\\\', '\\', $text);
return $text;
} else {
throw new moodle_exception(
'Parsing error. Unexpected quotation in T_CONSTANT_ENCAPSED_STRING in decapsulate(): '.$text
);
}
}
}
@@ -57,8 +57,9 @@ class renderer extends \plugin_renderer_base {
protected function render_tool_customlang_menu(\tool_customlang_menu $menu) {
$output = '';
foreach ($menu->get_items() as $item) {
$output .= $this->single_button($item->url, $item->title, $item->method);
$button = $this->single_button($item->url, $item->title, $item->method);
$output .= $this->box($button, 'menu');
}
return $this->box($output, 'menu');
return $output;
}
}
+135
View File
@@ -0,0 +1,135 @@
<?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/>.
/**
* Export custom language strings to zip files.
*
* @package tool_customlang
* @subpackage customlang
* @copyright 2020 Thomas Wedekind <thomas.wedekind@univie.ac.at>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define('CLI_SCRIPT', true);
require(__DIR__ . '/../../../../config.php');
require_once("$CFG->libdir/clilib.php");
require_once("$CFG->dirroot/$CFG->admin/tool/customlang/locallib.php");
$usage = <<<EOF
"Export custom language files to a target folder.
Useful for uploading custom langstrings to AMOS or importing or syncing them to other moodle instances.
Options:
-l, --lang Comma seperated language ids to export, default: all
-c, --components Comma seperated components to export, default: all
-t, --target Target to copy the zip files to, default: $CFG->tempdir/customlang
-o, --overwrite Overwrite existing files in the target folder.
Note: If the target is not set, the files are always overwritten!
-h, --help Print out this help
Examples:
Export all custom language files to the default folder:
\$ sudo -u www-data /usr/bin/php admin/tool/customlang/cli/export.php
Export just the english files of moodle core and the activity 'quiz' in a subfolder in my home folder:
\$ sudo -u www-data /usr/bin/php admin/tool/customlang/cli/export.php --lang='en' --components='moodle,quiz' --target='~/customdir'
EOF;
$dafaulttarget = "$CFG->tempdir/customlang/";
// Now get cli options.
list($options, $unrecognized) = cli_get_params(
[
'lang' => '',
'components' => '',
'target' => $dafaulttarget,
'overwrite' => false,
'help' => false,
],
['h' => 'help', 'c' => 'components', 't' => 'target', 'o' => 'overwrite']
);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
if ($options['help']) {
echo $usage;
die;
}
if (!file_exists($options['target'])) {
mkdir($options['target'], 0777, true);
}
cli_writeln(get_string('cliexportheading', 'tool_customlang'));
$langs = [];
if ($options['lang']) {
$langs = explode(',', $options['lang']);
} else {
// No language set. We export all installed languages.
$langs = array_keys(get_string_manager()->get_list_of_translations(true));
}
foreach ($langs as $lang) {
$filename = $options['target'] . get_string('exportzipfilename', 'tool_customlang', ['lang' => $lang]);
// If the file exists and we are not using the temp folder it requires an ovewrite.
if ($options['target'] != $dafaulttarget && file_exists($filename) && !$options['overwrite']) {
cli_problem(get_string('cliexportfileexists', 'tool_customlang', $lang));
continue;
}
cli_heading(get_string('cliexportstartexport', 'tool_customlang', $lang));
$langdir = tool_customlang_utils::get_localpack_location($lang);
if (!file_exists($langdir)) {
// No custom files set for this language set.
cli_writeln(get_string('cliexportnofilefoundforlang', 'tool_customlang', ['lang' => $lang]));
continue;
}
$zipper = get_file_packer();
$tempzip = tempnam($CFG->tempdir . '/', 'tool_customlang_export');
$filelist = [];
if ($options['components']) {
$components = explode(',', $options['components']);
foreach ($components as $component) {
$filepath = "$langdir/$component.php";
if (file_exists($filepath)) {
$filelist["$component.php"] = $filepath;
} else {
cli_problem(
get_string('cliexportfilenotfoundforcomponent', 'tool_customlang', ['lang' => $lang, 'file' => $filepath])
);
}
}
} else {
$langfiles = scandir($langdir);
foreach ($langfiles as $file) {
if (substr($file, 0, 1) != '.') {
$filelist[$file] = "$langdir/$file";
}
}
}
if (empty($filelist)) {
cli_problem(get_string('cliexportnofilefoundforlang', 'tool_customlang', ['lang' => $lang]));
continue;
}
if ($zipper->archive_to_pathname($filelist, $filename)) {
cli_writeln(get_string('cliexportzipdone', 'tool_customlang', $filename));
} else {
cli_problem(get_string('cliexportzipfail', 'tool_customlang', $filename));
}
}
+204
View File
@@ -0,0 +1,204 @@
<?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/>.
/**
* CLI customlang import tool.
*
* @package tool_customlang
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use tool_customlang\local\importer;
use core\output\notification;
define('CLI_SCRIPT', true);
require(__DIR__ . '/../../../../config.php');
require_once($CFG->dirroot.'/'.$CFG->admin.'/tool/customlang/locallib.php');
require_once("$CFG->libdir/clilib.php");
$usage =
"Import lang customization.
It can get a single file or a folder.
If no lang is provided it will try to infere from the filename
Options:
--lang The target language (will get from filename if not provided)
--source=path File or folder of the custom lang files (zip or php files)
--mode What string should be imported. Options are:
- all: all string will be imported (default)
- new: only string with no previous customisation
- update: only strings already modified
--checkin Save strings to the language pack
-h, --help Print out this help
Examples:
\$ sudo -u www-data /usr/bin/php admin/tool/customlang/cli/import.php --lang=en --source=customlangs.zip
\$ sudo -u www-data /usr/bin/php admin/tool/customlang/cli/import.php --source=/tmp/customlangs --checkin
\$ sudo -u www-data /usr/bin/php admin/tool/customlang/cli/import.php --lang=en --source=/tmp/customlangs
";
list($options, $unrecognized) = cli_get_params(
[
'help' => false,
'lang' => false,
'source' => false,
'mode' => 'all',
'checkin' => false,
],
['h' => 'help']
);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
if ($options['help']) {
cli_write($usage);
exit(0);
}
$source = $options['source'] ?? null;
$lang = $options['lang'] ?? null;
$modeparam = $options['mode'] ?? 'all';
$checkin = $options['checkin'] ?? false;
$modes = [
'all' => importer::IMPORTALL,
'update' => importer::IMPORTUPDATE,
'new' => importer::IMPORTNEW,
];
if (!isset($modes[$modeparam])) {
cli_error(get_string('climissingmode', 'tool_customlang'));
}
$mode = $modes[$modeparam];
if (empty($source)) {
$source = $CFG->dataroot.'/temp/customlang';
}
if (!file_exists($source)) {
cli_error(get_string('climissingsource', 'tool_customlang'));
}
// Emulate normal session - we use admin account by default.
cron_setup_user();
// Get the file list.
$files = [];
$langfiles = [];
if (is_file($source)) {
$files[] = $source;
}
if (is_dir($source)) {
$filelist = glob("$source/*");
foreach ($filelist as $filename) {
$files[] = "$filename";
}
}
$countfiles = 0;
foreach ($files as $filepath) {
// Try to get the lang.
$filelang = $lang;
// Get component from filename.
$pathparts = pathinfo($filepath);
$filename = $pathparts['filename'];
$extension = $pathparts['extension'];
if ($extension == 'zip') {
if (!$filelang) {
// Try to get the lang from the filename.
if (strrpos($filename, 'customlang_') === 0) {
$parts = explode('_', $filename);
if (!empty($parts[1])) {
$filelang = $parts[1];
}
}
}
} else if ($extension != 'php') {
// Ignore any other file extension.
continue;
}
if (empty($filelang)) {
cli_error(get_string('climissinglang', 'tool_customlang'));
}
if (!isset($langfiles[$filelang])) {
$langfiles[$filelang] = [];
}
$langfiles[$filelang][] = $filepath;
$countfiles ++;
}
if (!$countfiles) {
cli_error(get_string('climissingfiles', 'tool_customlang'));
}
foreach ($langfiles as $lng => $files) {
$importer = new importer($lng, $mode);
$storedfiles = [];
$fs = get_file_storage();
cli_heading(get_string('clifiles', 'tool_customlang', $lng));
foreach ($files as $file) {
// Generate a valid stored_file from this file.
$record = (object)[
'filearea' => 'draft',
'component' => 'user',
'filepath' => '/',
'itemid' => file_get_unused_draft_itemid(),
'license' => $CFG->sitedefaultlicense,
'author' => '',
'filename' => clean_param(basename($file), PARAM_FILE),
'contextid' => \context_user::instance($USER->id)->id,
'userid' => $USER->id,
];
cli_writeln($file);
$storedfiles[] = $fs->create_file_from_pathname($record, $file);
}
cli_writeln("");
// Import files.
cli_heading(get_string('cliimporting', 'tool_customlang', $modeparam));
$importer->import($storedfiles);
// Display logs.
$log = $importer->get_log();
if (empty($log)) {
cli_problem(get_string('clinolog', 'tool_customlang', $lng));
}
foreach ($log as $message) {
if ($message->errorlevel == notification::NOTIFY_ERROR) {
cli_problem($message->get_message());
} else {
cli_writeln($message->get_message());
}
}
// Do the checkin if necessary.
if ($checkin) {
tool_customlang_utils::checkin($lng);
cli_writeln(get_string('savecheckin', 'tool_customlang'));
}
cli_writeln("");
}
exit(0);
+9
View File
@@ -46,5 +46,14 @@ $capabilities = array(
'manager' => CAP_ALLOW
),
),
/* allows the user to export the current language customization */
'tool/customlang:export' => array(
'riskbitmask' => RISK_CONFIG,
'captype' => 'read',
'contextlevel' => CONTEXT_SYSTEM,
'archetypes' => array(
'manager' => CAP_ALLOW
),
),
);
+6
View File
@@ -41,5 +41,11 @@ function xmldb_tool_customlang_upgrade($oldversion) {
// Automatically generated Moodle v3.8.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v3.9.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v3.10.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+68
View File
@@ -0,0 +1,68 @@
<?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/>.
/**
* Performs the custom lang export.
*
* @package tool_customlang
* @subpackage customlang
* @copyright 2020 Thomas Wedekind <thomas.wedekind@univie.ac.at>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require(__DIR__ . '/../../../config.php');
require_once($CFG->dirroot.'/'.$CFG->admin.'/tool/customlang/locallib.php');
require_once($CFG->libdir.'/adminlib.php');
global $PAGE, $CFG;
require_login(SITEID, false);
require_capability('tool/customlang:export', context_system::instance());
$lng = required_param('lng', PARAM_LANG);
admin_externalpage_setup('toolcustomlang', '', null,
new moodle_url('/admin/tool/customlang/import.php', ['lng' => $lng]));
$form = new \tool_customlang\form\export(null, ['lng' => $lng]);
if ($form->is_cancelled()) {
redirect('index.php');
die();
} else if ($formdata = $form->get_data()) {
$tempzip = tempnam($CFG->tempdir . '/', 'tool_customlang_export');
$filelist = [];
foreach ($formdata->files as $file) {
$filepath = tool_customlang_utils::get_localpack_location($lng). '/' . $file;
if (file_exists($filepath)) {
$filelist[$file] = $filepath;
}
}
$zipper = new zip_packer();
if (!empty($filelist) && $zipper->archive_to_pathname($filelist, $tempzip)) {
// Filename include the lang name so the file can be imported with automatic language detection.
send_temp_file($tempzip, "customlang_$lng.zip");
die();
}
}
$output = $PAGE->get_renderer('tool_customlang');
echo $output->header();
echo $output->heading(get_string('pluginname', 'tool_customlang'));
$form->display();
echo $OUTPUT->footer();
-1
View File
@@ -32,7 +32,6 @@ class tool_customlang_filter_form extends moodleform {
function definition() {
$mform = $this->_form;
$current = $this->_customdata['current'];
$mform->addElement('header', 'filtersettings', get_string('filter', 'tool_customlang'));
+74
View File
@@ -0,0 +1,74 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Import custom lang files.
*
* @package tool_customlang
* @subpackage customlang
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use tool_customlang\form\import;
use tool_customlang\local\importer;
require(__DIR__ . '/../../../config.php');
require_once($CFG->dirroot.'/'.$CFG->admin.'/tool/customlang/locallib.php');
require_once($CFG->libdir.'/adminlib.php');
require_login(SITEID, false);
require_capability('tool/customlang:edit', context_system::instance());
$lng = required_param('lng', PARAM_LANG);
admin_externalpage_setup('toolcustomlang', '', null,
new moodle_url('/admin/tool/customlang/import.php', ['lng' => $lng]));
$output = $PAGE->get_renderer('tool_customlang');
$form = new import(null, ['lng' => $lng]);
if ($data = $form->get_data()) {
require_sesskey();
// Get the file from the users draft area.
$usercontext = context_user::instance($USER->id);
$fs = get_file_storage();
$files = $fs->get_area_files($usercontext->id, 'user', 'draft', $data->pack, 'id',
false);
// Send files to the importer.
$importer = new importer($data->lng, $data->importmode);
$importer->import($files);
echo $output->header();
// Display logs.
$log = $importer->get_log();
foreach ($log as $message) {
echo $output->notification($message->get_message(), $message->errorlevel);
}
// Show continue button.
echo $output->continue_button(new moodle_url('index.php', array('lng' => $lng)));
} else {
echo $output->header();
$form->display();
}
echo $OUTPUT->footer();
+17 -2
View File
@@ -35,6 +35,7 @@ require_capability('tool/customlang:view', context_system::instance());
$action = optional_param('action', '', PARAM_ALPHA);
$confirm = optional_param('confirm', false, PARAM_BOOL);
$lng = optional_param('lng', '', PARAM_LANG);
$next = optional_param('next', 'edit', PARAM_ALPHA);
admin_externalpage_setup('toolcustomlang');
$langs = get_string_manager()->get_list_of_translations();
@@ -59,11 +60,10 @@ if ($action === 'checkout') {
raise_memory_limit(MEMORY_EXTRA);
tool_customlang_utils::checkout($lng, $progressbar);
echo $output->continue_button(new moodle_url('/admin/tool/customlang/edit.php', array('lng' => $lng)), 'get');
echo $output->continue_button(new moodle_url("/admin/tool/customlang/{$next}.php", array('lng' => $lng)), 'get');
echo $output->footer();
exit;
}
if ($action === 'checkin') {
require_sesskey();
require_capability('tool/customlang:edit', context_system::instance());
@@ -132,6 +132,21 @@ if (has_capability('tool/customlang:edit', context_system::instance())) {
'method' => 'post',
);
}
$menu['import'] = array(
'title' => get_string('import', 'tool_customlang'),
'url' => new moodle_url($PAGE->url, ['action' => 'checkout', 'lng' => $lng, 'next' => 'import']),
'method' => 'post',
);
}
if (has_capability('tool/customlang:export', context_system::instance())) {
$langdir = tool_customlang_utils::get_localpack_location($lng);
if (check_dir_exists(dirname($langdir)) && count(glob("$langdir/*"))) {
$menu['export'] = [
'title' => get_string('export', 'tool_customlang'),
'url' => new moodle_url("/admin/tool/customlang/export.php", ['lng' => $lng]),
'method' => 'post',
];
}
}
echo $output->render(new tool_customlang_menu($menu));
@@ -30,13 +30,30 @@ $string['checkin'] = 'Save strings to language pack';
$string['checkout'] = 'Open language pack for editing';
$string['checkoutdone'] = 'Language pack loaded';
$string['checkoutinprogress'] = 'Loading language pack';
$string['cliexportfileexists'] = 'File for {$a->lang} already exists, skipping. If you want to overwrite add the --override=true option.';
$string['cliexportheading'] = 'Starting to export lang files.';
$string['cliexportnofilefoundforlang'] = 'No file found to export. Skipping export for this language.';
$string['cliexportfilenotfoundforcomponent'] = 'File {$a->filepath} not found for language {$a->lang}. Skipping this file.';
$string['cliexportstartexport'] = 'Exporting language {$a}';
$string['cliexportzipdone'] = 'Zip created: {$a}';
$string['cliexportzipfail'] = 'Cannot create zip {$a}';
$string['clifiles'] = 'Files to import into {$a}';
$string['cliimporting'] = 'Import files string (mode {$a})';
$string['clinolog'] = 'Nothing to import into {$a}';
$string['climissinglang'] = 'Missing language';
$string['climissingfiles'] = 'Missing valid files';
$string['climissingmode'] = 'Missing or invalid mode (valid is all, new or update)';
$string['climissingsource'] = 'Missing file or folder';
$string['confirmcheckin'] = 'You are about to save modifications to your local language pack. This will export the customised strings from the translator into your site data directory and your site will start using the modified strings. Press \'Continue\' to proceed with saving.';
$string['customlang:edit'] = 'Edit local translation';
$string['customlang:export'] = 'Export local translation';
$string['customlang:view'] = 'View local translation';
$string['export'] = 'Export custom strings';
$string['exportfilter'] = 'Select component(s) to export';
$string['filter'] = 'Filter strings';
$string['filtercomponent'] = 'Show strings of these components';
$string['filtercustomized'] = 'Customised only';
$string['filtermodified'] = 'Modified only';
$string['filtermodified'] = 'Modified in this session only';
$string['filteronlyhelps'] = 'Help only';
$string['filtershowstrings'] = 'Show strings';
$string['filterstringid'] = 'String identifier';
@@ -45,11 +62,24 @@ $string['headingcomponent'] = 'Component';
$string['headinglocal'] = 'Local customisation';
$string['headingstandard'] = 'Standard text';
$string['headingstringid'] = 'String';
$string['import'] = 'Import custom strings';
$string['import_mode'] = 'Import mode';
$string['import_new'] = 'Create only strings without local customisation';
$string['import_update'] = 'Update only strings with local customisation';
$string['import_all'] = 'Create or update all strings from the component(s)';
$string['importfile'] = 'Import file';
$string['langpack'] = 'Language component(s)';
$string['markinguptodate'] = 'Marking the customisation as up-to-date';
$string['markinguptodate_help'] = 'The customised translation may get outdated if either the English original or the master translation has modified since the string was customised on your site. Review the customised translation. If you find it up-to-date, click the checkbox. Edit it otherwise.';
$string['markuptodate'] = 'mark as up-to-date';
$string['modifiedno'] = 'There are no modified strings to save.';
$string['modifiednum'] = 'There are {$a} modified strings. Do you wish to save these changes to your local language pack?';
$string['nolocallang'] = 'No local strings found.';
$string['notice_ignorenew'] = 'Ignoring string {$a->component}/{$a->stringid} because it is not customised.';
$string['notice_ignoreupdate'] = 'Ignoring string {$a->component}/{$a->stringid} because it is already defined.';
$string['notice_inexitentstring'] = 'String {$a->component}/{$a->stringid} not found.';
$string['notice_missingcomponent'] = 'Missing component {$a->component}.';
$string['notice_success'] = 'String {$a->component}/{$a->stringid} updated successfully.';
$string['nostringsfound'] = 'No strings found, please modify the filter settings';
$string['placeholder'] = 'Placeholders';
$string['placeholder_help'] = 'Placeholders are special statements like `{$a}` or `{$a->something}` within the string. They are replaced with a value when the string is actually printed.
+1 -1
View File
@@ -243,7 +243,7 @@ class tool_customlang_utils {
* @param string $lang language code
* @return string full path
*/
protected static function get_localpack_location($lang) {
public static function get_localpack_location($lang) {
global $CFG;
return $CFG->langlocalroot.'/'.$lang.'_local';
@@ -59,7 +59,7 @@
<input type="hidden" name="sesskey" value="{{{ sesskey }}}">
<input type="hidden" name="p" value="{{ currentpage }}">
<fieldset class="m-a-1 m-3">
<fieldset class="m-3">
<button type="submit" name="savecontinue" class="btn btn-secondary">
{{#str}}savecontinue, tool_customlang{{/str}}
</button>
@@ -70,7 +70,7 @@
<div class="list-group">
<div class="container-fluid d-none d-md-block list-group-item border-bottom-0">
<div class="row-fluid">
<div class="row">
<div class="col-sm-4 col-md-2">
<strong>{{#str}}headingcomponent, tool_customlang{{/str}}</strong>
</div>
@@ -81,7 +81,7 @@
<strong>{{#str}}headingstandard, tool_customlang{{/str}}</strong>
</div>
<div class="col-sm-12 col-md-6">
<span class="p-l-1 pl-3">
<span class="pl-3">
<strong>{{#str}}headinglocal, tool_customlang{{/str}}</strong>
</span>
</div>
@@ -96,7 +96,7 @@
{{#outdated}}list-group-item-warning{{/outdated}}
{{#modified}}list-group-item-info{{/modified}}"
>
<div class="row-fluid ">
<div class="row">
<div class="col-sm-4 col-md-2">
<div class="d-md-none">
<strong>{{#str}}headingcomponent, tool_customlang{{/str}}</strong>
@@ -129,8 +129,8 @@
<strong>{{#str}}headinglocal, tool_customlang{{/str}}</strong>
</div>
<div class="py-2 py-md-0 px-md-3">
<textarea class="form-control w-100 border-box" name="cust[{{id}}]" cols="40" rows="3">{{{ local }}}</textarea>
<label for="{{id}}" class="sr-only sr-only-focusable">{{{ component }}}/{{{ stringid }}}</label>
<textarea class="form-control w-100 border-box" id="{{id}}" name="cust[{{id}}]" cols="40" rows="3">{{{ local }}}</textarea>
{{#checkupdated}}
<div class="uptodatewrapper">
<div class="form-check">
@@ -147,7 +147,7 @@
{{/strings}}
</div>
<fieldset class="m-a-1 m-3">
<fieldset class="m-3">
<button type="submit" name="savecontinue" class="btn btn-secondary">
{{#str}}savecontinue, tool_customlang{{/str}}
</button>

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