Compare commits

..

1730 Commits

Author SHA1 Message Date
Eloy Lafuente (stronk7) 2a591e36a9 Moodle release 3.2.8 2018-03-17 01:18:24 +01:00
Eloy Lafuente (stronk7) 73aca3b00c Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2018-03-17 01:18:21 +01:00
Eloy Lafuente (stronk7) a9cffb2445 Merge branch 'MDL-61600-32' of git://github.com/dpalou/moodle into MOODLE_32_STABLE 2018-03-14 14:43:59 +01:00
Dani Palou b3fe61f9ea MDL-61600 recaptcha: Create a script to display recaptcha 2018-03-14 10:36:37 +01:00
David Mudrák b117c4e23f MDL-61392 enrol_paypal: Improve IPN input parameters checking 2018-03-14 09:12:48 +08:00
David Mudrák c19d2c324b MDL-61392 enrol_paypal: Improve the IPN notifications handling
* Notify administrators once incoming IPN request is verified by PayPal.
* Fix the HTTP status as expected by the IPN protocol.
2018-03-14 09:12:48 +08:00
Eloy Lafuente (stronk7) 9538e66f1b Merge branch 'MDL-48501-mdl32' of git://github.com/jswebster/moodle into MOODLE_32_STABLE 2018-03-12 23:51:19 +01:00
Jeff Webster 0fc009e6a6 MDL-48501 auth/email: update external class to use reCAPTCHA v2 2018-03-07 17:54:03 -05:00
Jeff Webster 6504585b75 MDL-48501 mod_feedback: update feedback to use reCAPTCHA v2 2018-03-07 17:54:03 -05:00
Jeff Webster 1f7125f372 MDL-48501 login: update signup_form to use reCAPTCHA v2 2018-03-07 17:54:02 -05:00
Jeff Webster 35842437e6 MDL-48501 form/recaptcha: update to use reCAPTCHA v2 2018-03-07 16:58:21 -05:00
Jeff Webster 4a09cd7dad MDL-48501 recaptchalib_v2: add new lib to support reCAPTCHA v2 2018-03-07 16:58:21 -05:00
AMOS bot cab14fc8b2 Automatically generated installer lang files 2018-03-07 00:06:50 +00:00
Jeff Webster ff2962fdcf MDL-48501 lang: update reCAPTCHA language strings 2018-03-04 01:25:21 -05:00
AMOS bot 0f6d6d90ac Automatically generated installer lang files 2018-02-19 00:06:46 +00:00
AMOS bot 9334d08ba7 Automatically generated installer lang files 2018-02-17 00:06:49 +00:00
David Monllao 41a39d24e1 weekly release 3.2.7+ 2018-02-08 17:40:24 +01:00
Andrew Nicols b85d42a3d7 Merge branch 'MDL-61269_32' of git://github.com/stronk7/moodle into MOODLE_32_STABLE 2018-02-05 17:54:50 +08:00
Eloy Lafuente (stronk7) 372f8da557 MDL-61269 composer: better license GPL-3.0-or-later
Source: https://spdx.org/licenses/
2018-02-04 19:40:43 +01:00
David Monllao b4b1dab0a9 weekly release 3.2.7+ 2018-02-01 14:26:50 +01:00
David Monllao 0e24f8be19 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2018-02-01 14:26:49 +01:00
AMOS bot 06ffbbf1de Automatically generated installer lang files 2018-02-01 00:07:09 +00:00
David Mudrák 749bdfe00d MDL-61242 repository_equella: Fix missing class repository
The call to the class 'repository' introduced in the commit d05c2ac7cc
didn't fully work and threw: "Exception - Class 'repository' not found".
This fixes the missing library inclusion.
2018-01-31 23:41:37 +01:00
AMOS bot 6beb85435b Automatically generated installer lang files 2018-01-31 00:06:55 +00:00
AMOS bot 3d8ce1728e Automatically generated installer lang files 2018-01-30 00:06:55 +00:00
Eloy Lafuente (stronk7) 2e6ffa6a73 Merge branch 'wip-MDL-61242-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2018-01-29 16:36:27 +08:00
Andrew Nicols c7ae3e37e6 weekly release 3.2.7+ 2018-01-29 11:01:19 +08:00
Andrew Nicols 1f82f1fa65 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2018-01-29 11:01:17 +08:00
Eloy Lafuente (stronk7) 14c2f54c3d MDL-61269 behat-extension: bump to fix some caps & defaults 2018-01-25 00:39:06 +01:00
Adrian Greeve db1fd7f53f MDL-61242 repository_equella: Add source key when sending the source.
A thank you to Nelson Cheng for find this issue and suggesting a patch.
2018-01-20 11:02:57 +08:00
AMOS bot e797ad651e Automatically generated installer lang files 2018-01-19 00:07:22 +00:00
AMOS bot f67cd86431 Automatically generated installer lang files 2018-01-17 00:06:48 +00:00
Jun Pataleta 4b3926de7a Merge branch 'MDL-61221-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2018-01-16 23:01:56 +08:00
Andrew Nicols 83740af0c6 MDL-61221 badges: Ignore site availabilty for behat
Behat sites should not be available publically, and the check against
the backpack API for site availablity can time out in some situations.

We should be testing as though the site _is_ available, as this is the
standard expectation.
2018-01-16 13:26:15 +08:00
Eloy Lafuente (stronk7) c254733047 Merge branch 'MDL-61204-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2018-01-16 02:17:22 +01:00
Andrew Nicols 3e9a86affe MDL-61204 user: Fix random failure in behat
We need to get into the habit of not using usernames like 'student1'
and 'student10' as our matches are non-strict, and the tests become
dependent upon DB sort order.

This change adds a character after the varying value to act as a
delimter for all of these tests.
2018-01-16 08:32:44 +08:00
AMOS bot a6726e4977 Automatically generated installer lang files 2018-01-16 00:07:01 +00:00
Eloy Lafuente (stronk7) 36c7af0e7e Moodle release 3.2.7 2018-01-12 20:35:36 +01:00
Eloy Lafuente (stronk7) 4ef5597d7d Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2018-01-12 20:35:34 +01:00
Cameron Ball e490115306 MDL-61143 core_files: Don't append dot when checking domain names or IP addresses.
Previously we appended a dot at the end of IP addresses and domain names in the
cURL security helper, but it causes issues with Google OAuth so this patch removes it.
2018-01-10 15:24:17 +08:00
Adrian Greeve 5124deed08 MDL-61131 repositories: Added a key to verify incoming urls. 2018-01-09 11:34:58 +01:00
Cameron Ball 7f0420d619 MDL-61143 core_files: Update unit tests for curl_security_helper
Previously some of the unit tests were passing "by accident" becuase
we had the security helper letting through domains where the DNS lookup
failed. That behaviour has changed and now such domains are blocked.

Additionally tests for domains with multiple A records and weird Unicode
stuff have been added.

This patch also mocks the DNS resolution in the test, rather than actually
resolving the domain.
2018-01-09 12:23:06 +08:00
Cameron Ball 811fae41ac MDL-61143 core_files: Block hosts that cannot be determined to be an IP address of domain name
Freaky deaky Unicode/octal/hex domains can be resolved by cURL but are technically not valid.

This patch causes anything that Moodle does not consider to be a valid domain or IP to be blocked
by the cURL security helper.
2018-01-09 12:23:06 +08:00
Cameron Ball a7c779c738 MDL-61143 core_files: Check all A records when testing blocked IPs 2018-01-09 12:23:06 +08:00
Juan Leyva f850097c93 MDL-60908 mod_quiz: Return question state only when configured
The question state should be returned following the quiz review options
settings.
2018-01-08 22:05:33 +08:00
Simey Lameze 65254822e7 MDL-60235 core_calendar: clean event name field 2018-01-08 22:05:33 +08:00
David Monllao 4a0dfea83f Merge branch 'MDL-61169-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2018-01-08 14:59:19 +01:00
Andrew Nicols bce737d1a5 MDL-61169 iplookup: Change to github.com IP 2018-01-08 17:16:32 +08:00
AMOS bot 3c9ddce77e Automatically generated installer lang files 2018-01-04 00:07:24 +00:00
AMOS bot 641f227228 Automatically generated installer lang files 2018-01-03 00:06:45 +00:00
AMOS bot 47751e701b Automatically generated installer lang files 2017-12-18 00:06:39 +00:00
AMOS bot 71e7fb3a20 Automatically generated installer lang files 2017-12-14 00:06:31 +00:00
AMOS bot 471566fde2 Automatically generated installer lang files 2017-12-08 00:10:14 +00:00
Jun Pataleta 21f89c034c weekly release 3.2.6+ 2017-12-08 09:10:00 +13:00
Andrew Nicols 3a3f575f4d Merge branch 'MDL-59159_32' of git://github.com/stronk7/moodle into MOODLE_32_STABLE 2017-12-06 10:05:49 +08:00
Eloy Lafuente (stronk7) e2b71acd1f MDL-59159 environment: 3.1 (LTS) required 2017-12-04 02:05:10 +01:00
Eloy Lafuente (stronk7) 0551e106ba MDL-59159 environment: 3.5 base information
This is a direct copy of the 3.4 branch to
have changes under control easier in next commits.
2017-12-04 02:05:09 +01:00
David Monllao 40c64cf9ff weekly release 3.2.6+ 2017-11-23 13:35:13 +01:00
Neill Magill 3df77c0829 MDL-60436 blocks: Unit test for dashboard block positioning 2017-11-17 14:37:01 +00:00
Neill Magill f01bcdcbe3 MDL-60436 blocks: Improve performance of block loading 2017-11-13 09:11:40 +00:00
Eloy Lafuente (stronk7) c0523b9857 Moodle release 3.2.6 2017-11-11 19:29:31 +01:00
AMOS bot becebd955f Automatically generated installer lang files 2017-11-11 00:05:56 +00:00
David Monllao 0c7a83a632 weekly release 3.2.5+ 2017-11-10 15:15:20 +01:00
David Monllao 92d19efe4c Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-11-10 15:15:19 +01:00
Jun Pataleta 13c21e81b8 Merge branch 'MDL-60771-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-11-10 18:03:08 +13:00
Damyon Wiese 7121cdfc3e Merge branch 'MDL-60749-32' of git://github.com/sarjona/moodle into MOODLE_32_STABLE 2017-11-10 12:06:56 +08:00
Simey Lameze 1d24a0fe2f MDL-60771 mod_scorm: typecast score to integer 2017-11-10 12:02:59 +08:00
Andrew Nicols dab49d9fcd Merge branch 'MDL-52838-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-11-10 11:50:19 +08:00
Damyon Wiese eecc7ff372 MDL-52838 workshop: Each criterion > 0 levels
Add validation to the edit assessment form so each criterion in a rubric requires at least one level.
2017-11-10 10:22:35 +08:00
Sara Arjona adfc2dd7a6 MDL-60749 scorm: Remove   from files when downloading 2017-11-09 10:56:51 +01:00
Sara Arjona 80ad2ce7ce MDL-60550 user: Add more restrictions in keyword searches
Original patch provided by Tim Schroeder.
2017-11-09 15:50:27 +08:00
David Monllao fda021dcc6 Merge branch 'MDL-60615-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-11-09 08:49:11 +01:00
Damyon Wiese 7b47a1e464 Merge branch 'MDL-60752-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-11-09 15:11:02 +08:00
Damyon Wiese 49212a0e82 MDL-60615 imscc: string to array fix
Sloppy typing in the imscc converter is causing errors on php7.1

Variable is initialised as a string and then used as an array.
2017-11-09 15:06:48 +08:00
Andrew Nicols 9875c6c899 MDL-60752 lti: Compare text in types_config properly 2017-11-09 14:27:16 +08:00
AMOS bot 83939aeed6 Automatically generated installer lang files 2017-11-09 00:05:20 +00:00
David Monllao b5a794e133 Merge branch 'MDL-60720-m32' of https://github.com/sammarshallou/moodle into MOODLE_32_STABLE 2017-11-08 17:32:48 +01:00
David Monllao ab05a777b8 Merge branch 'MDL-58699-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-11-08 15:56:50 +01:00
David Monllao 4126e44fa3 MDL-60733 oauth: Remove outdated comment 2017-11-08 12:05:10 +01:00
David Monllao 768e1558be Merge branch 'MDL-60733-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-11-08 12:05:03 +01:00
David Monllao f42720e3f9 weekly release 3.2.5+ 2017-11-08 09:47:23 +01:00
David Monllao 60fbdc0e23 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-11-08 09:47:21 +01:00
Damyon Wiese 306a3eba3f MDL-60733 core: B/C for google_oauth
The google_oauth class extends oauth2client which was modified to send "Accept" headers.

The "Accept" headers break picasa and could break any other plugin that was using google_oauth.
2017-11-08 15:25:37 +08:00
Jun Pataleta 3d75433495 Merge branch 'MDL-60717-32-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-11-08 14:43:54 +13:00
AMOS bot f55ffd1d37 Automatically generated installer lang files 2017-11-08 00:05:21 +00:00
Helen Foster 2ab4e9e320 MDL-60717 lang: Merge English strings from the en_fix language pack
Significant string changes:

- needbcmath,auth_ldap - 'grace logins' changed to 'expired password
  checking'
2017-11-07 21:59:23 +01:00
sam marshall 016d93e1df MDL-60720 core_search: Indexing halts on failed get_document
The recordsets used for search indexing sometimes return results
which are invalid (e.g. cannot be found in database). When this
happens, the result in the iterator for the recordset will be
false. Due to a bug, the iterator used to stop when it encountered
a false value, which prevented indexing from getting past the
problematic record.

In addition, the iterator that skips future data resulted in the
current() function of its parent indicator being called twice per
entry, which meant that search indexing called get_document()
twice as many times.
2017-11-07 16:47:58 +00:00
Jake Dallimore a15fae38cb Merge branch 'MDL-57772-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-11-07 15:02:12 +08:00
Damyon Wiese c1d666c078 MDL-58699 mod_quiz: Require javascript for popup
If any of the access rules require the attempt to open in a new window, assume we
require javascript to attempt the quiz. This makes it harder to bypass the javascript
pseudo security restrictions.
2017-11-07 12:50:26 +08:00
Damyon Wiese ccca9cf794 MDL-57772 chat: BEEP is back baby! 2017-11-07 11:25:21 +08:00
sam marshall 9f9350068b MDL-60671 core_search: Cron output should use mtrace
The mtrace function is preferable for plain text logging/progress
output because it can be redirected if necessary. By convention it
is normally used in cron and can be used in CLI tasks if required.

This change makes the text_progress_trace class use mtrace instead
of echo and then flush. (Default behaviour of mtrace is to do
exactly that, but it can be redirected too.)

Before this change, if anybody is relying on mtrace behaviour to
redirect logs of cron output, this will fail for some parts of the
search cron output (and some other places like auth plugins).
2017-11-07 11:08:13 +08:00
David Monllao 3c665aed99 Merge branch 'MDL-60424-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-11-06 21:12:39 +01:00
Damyon Wiese da0bb6a820 Merge branch 'MDL-59858-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-11-06 11:15:14 +08:00
Damyon Wiese 36043eacd3 Merge branch 'MDL-60437_32-multilang-html-block-titles' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-11-06 10:12:17 +08:00
Jun Pataleta 9434133480 MDL-59858 amd: Focus on the element that actually triggers the modal 2017-11-06 13:23:23 +13:00
AMOS bot 2e6b69cbca Automatically generated installer lang files 2017-11-05 00:06:23 +00:00
Luca Bösch a0ec6413d5 MDL-60437 blocks: HTML block title multilang 2017-11-03 16:37:13 +01:00
David Monllao 1d1086e3e5 weekly release 3.2.5+ 2017-11-03 10:25:12 +01:00
Juan Leyva 311076f3a2 MDL-60424 webservice: Allow CORS requests in webservice/upload.php
This will allow to upload files via Web Services using AJAX from
different domains, browser plugins, web apps, etc…
2017-11-03 09:42:00 +01:00
Jake Dallimore 107ea0f3c7 Merge branch 'MDL-58047-32-fix1' of http://github.com/damyon/moodle into MOODLE_32_STABLE 2017-11-03 16:11:19 +08:00
Damyon Wiese bd2c01bb9e MDL-58047 assign: submission sorting
Only exclude new submission records from the sorting, draft and reopened submission are valid.
2017-11-03 15:56:36 +08:00
David Monllao 0e7e457214 Merge branch 'MDL-58047-32-sortbysubmission' of https://github.com/roperto/moodle into MOODLE_32_STABLE 2017-11-02 16:58:05 +01:00
David Monllao 1e802bb449 Merge branch 'MDL-51945-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-11-02 16:55:51 +01:00
David Monllao 5bd85d7f4f Merge branch 'MDL-60634-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-11-02 13:26:12 +01:00
David Monllao ed76eb03f7 Merge branch 'MDL-60633-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-11-02 12:04:27 +01:00
David Monllao db1898291d Merge branch 'MDL-53501-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-11-02 08:30:57 +01:00
Jake Dallimore 2d56bc1c72 Merge branch 'MOODLE_32_STABLE_MDL-60007' of https://github.com/CengageEng/moodle into MOODLE_32_STABLE 2017-11-02 08:51:26 +08:00
Eloy Lafuente (stronk7) 2ba8535459 weekly release 3.2.5+ 2017-11-01 13:38:55 +01:00
Eloy Lafuente (stronk7) 88bbfa1dc2 Merge branch 'MDL-60503-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-11-01 11:51:23 +01:00
Damyon Wiese c4c6e31630 MDL-60503 npm: Lock required node 8.9.x (LTS) 2017-11-01 14:54:03 +08:00
Daniel Thee Roperto f6db012818 MDL-58047 gradebook: fix sort by submission order. 2017-11-01 15:11:16 +11:00
Damyon Wiese d83e2ba4cd Merge branch 'MDL-52037-32-fix' of https://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-11-01 11:15:44 +08:00
Andrew Nicols baab74b9d3 MDL-52037 theme: Correct question feedback width
This relates to the cloze question answer when hovered.
2017-11-01 11:13:52 +08:00
Vervoort, Claude 44b817cf60 MDL-60007 mod lti: allow delete without content-type 2017-10-31 09:58:54 -04:00
Juan Leyva 590706db1f MDL-60634 tool_mobile: Avoid CURL request to check HTTPS 2017-10-31 12:07:08 +01:00
David Monllao a7f16bb296 MDL-52037 theme: Update compiled css 2017-10-31 11:03:55 +01:00
Luca Bösch 042dd6335d MDL-52037 questions: „Whether correct“-feedback marks adaptive width 2017-10-31 10:44:00 +01:00
Jake Dallimore 0bd1bd92dc Merge branch 'MDL-60607_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-10-31 13:00:19 +08:00
Jun Pataleta c03a53e8d8 Merge branch 'MDL-57560-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-10-31 15:41:40 +13:00
Andrew Nicols 267a719a17 Merge branch 'MDL-60139_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-10-31 09:16:10 +08:00
Andrew Nicols eaea57597c Merge branch 'MDL-60522-32' of https://github.com/Kathrin84/moodle into MOODLE_32_STABLE 2017-10-31 08:21:26 +08:00
Andrew Nicols 0dc5bfa27e MDL-60633 core: Add pendingjs checks for inplace editable 2017-10-31 07:05:06 +08:00
Tim Hunt b18cde3450 MDL-60607 quiz reports: catch separate groups & user has no group case 2017-10-30 17:58:25 +00:00
Tim Hunt a0b2649a16 MDL-60607 quiz reports: move duplicate code to superclass method 2017-10-30 17:58:23 +00:00
David Monllao 9a11ca8fd6 Merge branch 'MDL-60528-m32' of https://github.com/micaherne/moodle into MOODLE_32_STABLE 2017-10-30 17:59:48 +01:00
Juan Leyva 7ec9a6daa7 MDL-51945 core_user: Prevent duplicated emails in update_users WS 2017-10-30 17:42:34 +01:00
David Monllao ee461eee7f Merge branch 'MDL-52037_32-cloze-whether-correct-feedback-width' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-10-30 16:06:17 +01:00
Juan Leyva 55711a938a MDL-53501 webservice: Avoid values higher than PHP_INT_MAX
Integers coming from site settings needs casting to int to avoid
returning values higher than PHP_INT_MAX.
2017-10-30 16:04:39 +01:00
Michael Aherne c860ca5c91 MDL-60528 grading: Accurate class names in PHPDoc 2017-10-30 14:31:04 +00:00
Tim Hunt 828a24f784 MDL-60139 question manual grading: move code to reduce confusion
Move the variable definition closer to where it is used.
2017-10-30 12:58:26 +00:00
Tim Hunt 78e92b3fb1 MDL-60139 question manual grading: redisplay mark as typed if editing
When the teacher is upgrading a previously entered grade, we re-display
exactly what they typed before if possible, rather than displaying with
a set number of decimal places.
2017-10-30 12:58:24 +00:00
Tim Hunt 48dbf89252 MDL-60139 phpunit: Make assertTag verify attribute values with ===
I had a test that cared about the difference between value="5.0" and value="5".
2017-10-30 12:58:22 +00:00
David Monllao 83d284be42 Merge branch 'MDL-60377-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-10-30 11:42:55 +01:00
Luca Bösch 263528b0d8 MDL-52037 questions: „Whether correct“-feedback marks adaptive width 2017-10-30 10:41:16 +00:00
Kathrin Osswald 966c52eb3d MDL-60522 message: Removed additional tooltips
I removed the additional tooltips because I think that they are just used
in the notifications and messages context and duplicate the all over used
title tag that gives the same information when hovering. So the whole system
stays more consistently.
2017-10-30 08:04:08 +01:00
Damyon Wiese 438da5c13b MDL-57560 boost: File upload progress
Copy / adapt some styles from the bootstrap progress widget to match the DOM used for file upload progress.

Bootstrap changed this alot in the current beta so I opted to do a minimal change (affect the scss for boost only), rather
than adapt the HTML to something that will change again anyway when we upgrade to the release version of bootstrap 4.
2017-10-30 13:14:04 +08:00
Jake Dallimore bc299c8d4d Merge branch 'MDL-59606_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-10-30 11:24:03 +08:00
Andrew Nicols 29e276eeea Merge branch 'MDL-60605-32' of https://github.com/dvdcastro/moodle into MOODLE_32_STABLE 2017-10-30 10:51:54 +08:00
Andrew Nicols 4c28e8abe3 Merge branch 'MOODLE_32_STABLE_MDL-60360_enable_file_indexing_retroactively' of https://github.com/mattporritt/moodle into MOODLE_32_STABLE 2017-10-30 09:21:27 +08:00
Jun Pataleta 570b297303 Merge branch 'MDL-60572-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-10-30 10:26:05 +13:00
David Castro 261af24e61 MDL-60605 assignment: Added some styles to fix spacing in YUI file tree 2017-10-27 11:05:25 -05:00
Tim Hunt 20df9e8faa MDL-59606 quiz responses: fix edge cases in the report
This patch conbines valuable contributions from Kashmira Nagwekar and
Luca Bösch. Many thanks to them. However, the final form of the fix,
and hence the blame, falls to me -- Tim.

There were several issues here:

* The load_questions_usages_by_activity method in
  question/engine/datalib.php was incorrectly treating the case
  when no data was returned. (Looks like a historic copy-pase from
  other methods that fetch one item by unique id, which therefore
  must exist.)

* The report was not correctly handling the display when the 'Which
  tries' was set to 'with, and without, attempts'.

* It was possible to select the 'All tries' option when also saying
  'Users without attempts'. This combination makes not sense, so
  a disabledIf rule was added to the form.
2017-10-27 16:57:34 +01:00
David Monllao 14f2ce60a7 weekly release 3.2.5+ 2017-10-27 12:48:27 +02:00
Juan Leyva 00c2d21bab MDL-60572 admin: Fix forgottenpasswordurl for WS
We should expect URLs in that field.
The tool_mobile change is to not break the WS response if
forgottenpasswordurl does not contain a URL.
2017-10-27 10:48:54 +02:00
Matt Porritt ba3904e81b MDL-60360 Global Search: Enable file indexing message update.
If you have Global Search set up on a site without file
indexing enabled, then at a later date you enable file indexing
files associated with existing objects are not added.

The only way to have files for existing objects indexed is to
run a reindex of all content.

This patches updates the file indexing language string in the
solr search settings of Global Search to make this clear
to the site administrator.
2017-10-27 11:16:35 +11:00
Jun Pataleta 6e90b081c2 Merge branch 'MDL-60265-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-10-27 11:52:47 +13:00
David Monllao 1a4b29ae88 Merge branch 'wip-MDL-57055-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-10-26 19:18:05 +02:00
Juan Leyva b627bcfd25 MDL-60265 tool_mobile: Return sitepolicy in tool_mobile_get_config WS 2017-10-26 11:05:51 +02:00
Damyon Wiese 8e378ca989 Merge branch 'MDL-60366_feedback_upgrade_32' of git://github.com/davosmith/moodle into MOODLE_32_STABLE 2017-10-26 15:41:02 +08:00
Andrew Nicols 41c8216718 Merge branch 'wip-MDL-60543-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-10-26 14:35:12 +08:00
Andrew Nicols ad80abc65c Merge branch 'MDL-60162_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-10-26 14:07:51 +08:00
Adrian Greeve 40be01a636 MDL-57055 mod_label: Add label administration for boost.
This patch adds the label adminstration settings to the
label edit page.
2017-10-26 13:58:57 +08:00
Andrew Nicols 5b497b1bde Merge branch 'MDL-60535_32-questionbank-button-styled' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-10-26 13:19:24 +08:00
Andrew Nicols fc6209584d Merge branch 'MOODLE_32_MDL-51892' of https://github.com/fwsl/moodle into MOODLE_32_STABLE 2017-10-26 11:31:06 +08:00
Jake Dallimore 3a3198767c Merge branch 'MDL-59686-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-10-26 10:20:30 +08:00
Simey Lameze f94376bfc4 MDL-59686 form: fix autosave support for editor field 2017-10-26 09:05:00 +08:00
Jun Pataleta 086815b1d6 Merge branch 'MDL-60571_32-manualgrading-savegotonextpage-styled' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-10-26 10:04:01 +13:00
David Monllao 5a03d41860 Merge branch 'MDL-60538-32' of https://github.com/mihailges/moodle into MOODLE_32_STABLE 2017-10-25 15:09:50 +02:00
David Monllao 470a2e32fa weekly release 3.2.5+ 2017-10-25 11:13:48 +02:00
David Monllao 1a58e38ea2 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-10-25 11:13:47 +02:00
Andrew Nicols 3e2732fbc7 Merge branch 'MDL-36580_32' of https://github.com/stronk7/moodle into MOODLE_32_STABLE 2017-10-25 12:19:14 +08:00
Andrew Nicols 494d18b16a Merge branch 'MDL-36580_32' of https://github.com/stronk7/moodle into MOODLE_32_STABLE 2017-10-25 12:19:14 +08:00
Mihail Geshoski 6b818f0534 MDL-60538 lesson: check if max attempts exceeded, use new lang string 2017-10-25 09:11:26 +08:00
Eloy Lafuente (stronk7) cf3ee0a406 MDL-36580 backup: Avoid PHP notice restoring old backups
Before this implementation, both resourcekey and password
were not being included in the backups, so old backups are
missing them. To keep upwards compatibility and avoid a PHP
Notice (undefined property), existence is checked via isset(),
that is the usual way all over the restore process.
2017-10-24 23:03:29 +02:00
Tim Hunt 4635a07e6a MDL-60162 quiz reports: refactor duplicated code into the base class
This is needed to fix the unit test in the last commit.
2017-10-24 18:14:41 +01:00
Tim Hunt 661e129873 MDL-60162 quiz reports: too many rows fetched on download
This happened if one user had multiple enrolments in a course, and was
quite inefficient.
2017-10-24 18:14:39 +01:00
AMOS bot 6644d7328e Automatically generated installer lang files 2017-10-25 00:06:15 +08:00
Luca Bösch d969814e09 MDL-60535 quiz: question bank button styled 2017-10-24 16:09:26 +01:00
Luca Bösch a00083a947 MDL-60571 quiz: Manual grading Save and go to next page button styled 2017-10-24 12:17:48 +01:00
Grzegorz Ziółek 858fd41248 MDL-51892 logging: Proper description of login errors. 2017-10-24 10:56:53 +02:00
Davo Smith c69f396769 MDL-60366 mod_feedback: fix deletion of valid anonymous duplicates 2017-10-24 09:38:06 +01:00
Andrew Nicols 8fa79442fd MDL-57477 session: Comment tidyup 2017-10-24 08:23:22 +08:00
Andrew Nicols 03488ecc9c Merge branch 'MDL-57477_32' of https://github.com/appalachianstate/moodle into MOODLE_32_STABLE 2017-10-24 08:13:37 +08:00
Fred Woolard c4bb09b742 MDL-57477 core: If memcached 3.x mimic 2.2.0 lock acquisition behavior 2017-10-23 13:49:01 -04:00
David Monllao 0b3e013f64 Merge branch 'MDL-60527_32-action-menu-links-missing-spaces-attributes' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-10-23 16:59:31 +02:00
Andrew Nicols fde74736a4 MDL-60489 javascript: Add missing promise fails 2017-10-23 20:32:01 +08:00
Andrew Nicols 17b978cd90 Merge branch 'MDL-60489-32' of git://github.com/ryanwyllie/moodle into MOODLE_32_STABLE 2017-10-23 20:30:50 +08:00
Eloy Lafuente (stronk7) 73728cb33e Merge branch 'm32_MDL-59100_MySQL8_INFORMATION_SCHEMAs_Need_Lowercasing' of https://github.com/scara/moodle into MOODLE_32_STABLE 2017-10-23 12:11:15 +02:00
Ryan Wyllie 9f021bd587 MDL-60489 javascript: add animations to modal setBody 2017-10-23 08:12:05 +00:00
Marina Glancy 43f269a3d8 MDL-60543 env: Moodle 3.2 and 3.3 do no support PHP7.2 2017-10-23 14:16:57 +08:00
Damyon Wiese 8caec2eb7a Merge branch 'MDL-52653-32' of http://github.com/damyon/moodle into MOODLE_32_STABLE 2017-10-23 13:20:02 +08:00
Damyon Wiese a1dee21ec1 MDL-52653 scorm: Comment for cms.completion_status 2017-10-23 13:12:56 +08:00
Christian Lawson-Perfect 56df23be4f MDL-52653 SCORM: fix scorm_check_mode on v1.3
SCORM 2004 uses the element 'cmi.completion_status' to store the
completion status of a SCO, not 'cmi.core.lesson_status'.

This amends scorm_check_mode so that the right element is looked up.

When scorm_version_check returns false, SCORM 1.2 is assumed.
2017-10-23 13:12:55 +08:00
Luca Bösch 1712134d00 MDL-60527 templates: missing spaces round attribute and aria-labelledby 2017-10-22 22:55:56 +01:00
Matteo Scaramuccia 71db3b4410 MDL-59100 dml: Lower the case of INFORMATION_SCHEMA.* fields. 2017-10-21 14:35:59 +02:00
Eloy Lafuente (stronk7) b8e10f239b weekly release 3.2.5+ 2017-10-20 23:54:56 +02:00
Andrew Nicols a3b0fce39c Merge branch 'MDL-60456-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-10-20 10:29:24 +08:00
David Monllao 1b0d340042 Merge branch 'MDL-60123-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-10-20 02:22:43 +02:00
Eloy Lafuente (stronk7) 81b900a2f2 Merge branch 'MDL-60342-32' of https://github.com/patkira/moodle into MOODLE_32_STABLE 2017-10-19 23:25:13 +02:00
Eloy Lafuente (stronk7) 4c3d434cb4 Merge branch 'wip-MDL-60314-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-10-19 23:19:36 +02:00
Eloy Lafuente (stronk7) 8835fd01c5 Merge branch 'MDL-60449-32-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-10-19 22:21:37 +02:00
Helen Foster a57c2774e8 MDL-60449 lang: Merge English strings from the en_fix language pack
Significant string changes:

* errorretrievingkey in message_airnotifier - improved wording and
  removing reference to Moodle.org
* enddate_help and courseduration_desc in core - clearer wording
  explaining what the date actually does
* restore:viewautomatedfilearea in core_role - changing wording to match
  the behaviour
* dropzones_help in qtype_ddmarker - improved wording
* autologinkeygenerationlockout in tool_mobile - updated error message
* configallowemailaddresses in core_admin - clearer description
* subscriptionmode_helpin mod_forum - removing misleading sentence about
  subscription mode changes not affecting existing users
2017-10-19 18:16:51 +02:00
David Monllao 9a4fbd4574 Merge branch 'wip-MDL-58915-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-10-19 15:44:43 +02:00
David Monllao 4270255272 Merge branch 'MDL-60233-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-10-19 13:52:23 +02:00
Nadav Kavalerchik 778d746f6c MDL-60182 Glossary: Fix print icon label in RTL mode 2017-10-19 13:40:42 +02:00
David Monllao 4e41d6c56f Merge branch 'MDL-60469-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-10-19 10:56:01 +02:00
David Monllao 04b1f4254e Merge branch 'MDL-60247_32-multilang-html-glossary-block-titles' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-10-19 10:34:54 +02:00
Eloy Lafuente (stronk7) d58ae0c075 MDL-36580 backup: Apply the decrypt() method to lti "secrets" 2017-10-19 10:20:21 +02:00
Eloy Lafuente (stronk7) dab2233925 MDL-36580 backup: General support for decrypted contents in restore
- Uses site generated (on backup) key.
- Can be applied potentially everywhere in the restore process.
- Covered with unit tests.
- Authentication / integrity aware so can be used between any 2 servers
  (just requires matching key).
2017-10-19 10:20:21 +02:00
Eloy Lafuente (stronk7) 370f78715e MDL-36580 backup: Use the encrypted_final_element for lti "secrets" 2017-10-19 10:20:21 +02:00
Eloy Lafuente (stronk7) 6c436ac37e MDL-36580 backup: General support for encrypted contents in backups
- Built using standard backup custom fields.
- Can be applied potentially everywhere.
- Automatically addded 'encrypted' attribute.
- Defaults to site generated key.
- Enforces key robutness / provides authentication (hmac integrity)
- Covered with unit tests.
2017-10-19 10:20:18 +02:00
Andrew Nicols 6df049fa3c MDL-60469 behat: Replace I press with I click on 2017-10-19 11:59:44 +08:00
Damyon Wiese c7813fa674 MDL-60456 javascript: Rebuild npm-shrinkwrap
Build npm-shrinkwrap with the latest node version and only test the latest node version on travis.
2017-10-19 11:53:17 +08:00
Jun Pataleta 61a96642f0 Merge branch 'wip-MDL-60335-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-10-19 15:37:37 +13:00
Jun Pataleta 09b1711d94 Merge branch 'mdl59843-moodle32' of https://github.com/tlock/moodle into MOODLE_32_STABLE 2017-10-19 13:20:19 +13:00
Eloy Lafuente (stronk7) 0fe0954344 weekly release 3.2.5+ 2017-10-19 00:11:06 +02:00
Eloy Lafuente (stronk7) f6d4edd3aa Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-10-19 00:11:04 +02:00
Pat Kira 18f5851994 MDL-60342 test: Reset user agent after tests
- Add a test that proves this useragent is not being reset after a test
- Reset user agent
2017-10-18 13:59:17 +11:00
Marina Glancy b9fef33112 MDL-60335 admin: fix encoding of nonlatin site names in blocked hosts 2017-10-17 12:59:39 +08:00
Jake Dallimore 0730e8a380 Merge branch 'wip-MDL-60033-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-10-16 15:37:24 +08:00
Jake Dallimore cdd836011f MDL-60123 assign: Allow teachers to deselect pdf annotations in editpdf
Clicking a blank area of the canvas will now deselect any currently
selected annotation.
2017-10-16 08:45:33 +08:00
AMOS bot c9b29b832b Automatically generated installer lang files 2017-10-14 00:08:45 +08:00
Luca Bösch d93d2a0d86 MDL-60247 blocks: Multilang in Random glossary and in HTML block titles. 2017-10-13 13:52:50 +02:00
Jake Dallimore ef89f89988 weekly release 3.2.5+ 2017-10-13 14:33:13 +08:00
Jake Dallimore fe53da02a3 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-10-13 14:33:12 +08:00
Marina Glancy 0233c84101 MDL-58915 search_solr: connection to solr can use blocked hosts 2017-10-13 12:18:15 +08:00
Jake Dallimore c3b3d04ca6 Merge branch 'MDL-60357-32-fix' of https://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-10-13 11:40:46 +08:00
Andrew Nicols 59dd0cc761 MDL-60357 search: Ensure that the document is valid
We were previously testing tha the parent is valid, which it was, and
then fetching the current record, before fetching data from it.

However, the way in which the recordset walk works, the valid function
checks whether the _record_ itself is valid, whilst the current allows
for a callback to be applied.

In this instance, the data-entry was failing because the count of
indexfields was < 2. The recordset data itself was valid, but the view
was not, and as a result, the current() function returned false.

This false was not previously handled.

I've changed the logic so that we handle this case, and have removed a
double-negative in the process.
2017-10-13 09:46:43 +08:00
Jun Pataleta 7fa35eca49 Merge branch 'MDL-59854-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-10-12 12:28:24 +08:00
Tobias Reischmann cf266bd3e2 MDL-59854 forum: Created unique db key for forum_subscriptions
Due to race conditions in the function subscribe_user
it was possible to create duplicate forum subscriptions.
This lead to error messages, when displaying the list of
all subscriptions.
This patch removes all existing duplicate entries and
creates a unique db key to prevent this from happening in
the future.
2017-10-12 12:19:21 +08:00
Eloy Lafuente (stronk7) 6b0bf399e2 Merge branch 'MDL-60357-m32' of https://github.com/sammarshallou/moodle into MOODLE_32_STABLE 2017-10-11 20:50:11 +02:00
Andrew Nicols fb00e2dc97 Merge branch 'MOODLE_32_STABLE_MDL-60276' of https://github.com/CengageEng/moodle into MOODLE_32_STABLE 2017-10-11 09:41:00 +08:00
Eloy Lafuente (stronk7) abfaf22dfb Merge branch 'MDL-60300-m32' of https://github.com/NeillM/moodle into MOODLE_32_STABLE 2017-10-11 01:40:13 +02:00
Eloy Lafuente (stronk7) 69865a1de3 Merge branch 'MDL-60346-m32' of https://github.com/sammarshallou/moodle into MOODLE_32_STABLE 2017-10-11 01:13:57 +02:00
Eloy Lafuente (stronk7) 66ccbfeb99 Merge branch 'MDL-60364-m32' of https://github.com/NeillM/moodle into MOODLE_32_STABLE 2017-10-11 01:00:48 +02:00
Juan Leyva 19bda8aa7e MDL-60377 webservice: Format correctly text returned by WS 2017-10-10 15:17:12 +02:00
AMOS bot e17f45f120 Automatically generated installer lang files 2017-10-10 00:12:25 +08:00
Andrew Nicols c63b1749ba Merge branch 'MDL-60317_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-10-09 14:10:44 +08:00
Marina Glancy 6f7bff5aa9 MDL-60314 navigation: fix overriding variable value 2017-10-09 10:19:18 +08:00
sam marshall 68049f376f MDL-60357 core_search: Future modified times cause serious problems 2017-10-06 14:16:54 +01:00
Neill Magill cf97659678 MDL-60300 Quiz: Offline update time not set correctly 2017-10-06 13:30:50 +01:00
Neill Magill 6a74606965 MDL-60364 Web service: E_ERROR in course_check_updates web service
The error stated that course_check_updates() is undefined, this function
is in the course lib.php file.
2017-10-06 13:30:31 +01:00
sam marshall 4d286aa730 MDL-60346 core_search: Solr connection ignores proxy settings 2017-10-06 11:41:28 +01:00
Jake Dallimore ff93f3915a weekly release 3.2.5+ 2017-10-06 14:34:34 +08:00
Jake Dallimore 95b73b0858 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-10-06 14:34:33 +08:00
Jake Dallimore 3c051e549a Merge branch 'MDL-57228_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-10-04 13:45:45 +08:00
Eloy Lafuente (stronk7) e4b90ebdab Merge branch 'MDL-59882-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-10-03 20:52:14 +02:00
Eloy Lafuente (stronk7) 939b9ab977 Merge branch 'MDL-60198-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-10-03 20:16:09 +02:00
AMOS bot 2b3ebab6dd Automatically generated installer lang files 2017-10-04 00:10:47 +08:00
Andrew Nicols a5fc11023b Merge branch 'MDL-60210-32-upgradecheck' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-10-03 10:34:05 +08:00
Tim Hunt 2923e19928 MDL-60317 quiz reports: fix regression caused by MDL-57511 2017-10-02 18:24:56 +01:00
Andrew Nicols c26afb9b76 Merge branch 'MDL-58790_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-10-02 15:40:41 +08:00
Andrew Nicols ac5e3e9c6b MDL-59882 behat: Update known uses of dialogue CSS 2017-10-02 12:50:41 +08:00
Andrew Nicols a9739a84dc MDL-59882 behat: Add newer modal type to selectors 2017-10-02 12:50:41 +08:00
Andrew Nicols 4b1402490a Merge branch 'MDL-60306-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-10-02 10:17:44 +08:00
Jun Pataleta 3ee60271fa MDL-60306 calendar: Fix rrule_manager unit test
* The calculation of the expected date should depend on the comparison
with the start date's date and not it's exact timestamp.
2017-10-02 09:18:57 +08:00
ddelblanco 579b44ef14 MDL-60276 LTI Content Item: does not populate tool url when https 2017-09-28 09:51:58 -07:00
AMOS bot 76fd4da35d Automatically generated installer lang files 2017-09-29 00:06:26 +08:00
Jake Dallimore c2d1467a7d weekly release 3.2.5+ 2017-09-28 14:27:27 +08:00
Tim Lock 6eb39155d4 MDL-59843 mod_choice: Fix horizontal display mode
This re-implements the feature in the boost and bootstrap themes.
2017-09-28 12:29:05 +10:00
Eloy Lafuente (stronk7) b3b909e1b4 Merge branch 'MDL-60243-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-09-27 20:48:48 +02:00
Jake Dallimore 77917ed26b Merge branch 'MDL-59780-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-09-27 13:44:16 +08:00
Ankit Agarwal 1da8d303ef MDL-59780 mathjax: Make sure mathjax url doesn't become empty 2017-09-27 09:16:11 +05:30
Jake Dallimore 6d01904503 MDL-60243 competencies: fix ordering bug in api_test unit test
list_user_competencies_to_review() orders by shortname, but the test
creates 2 user competencies with the same short name, resulting in
unpredictable results. This patch fixes that.
2017-09-27 09:28:36 +08:00
Eloy Lafuente (stronk7) fe6903b33f Merge branch 'MDL-59931_32_STABLE' of https://github.com/ctam/moodle into MOODLE_32_STABLE 2017-09-27 01:16:26 +02:00
Eloy Lafuente (stronk7) 1dbe5c038e Merge branch 'MDL-59220-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-09-27 00:52:20 +02:00
Juan Leyva c457cf5d35 MDL-60198 webservice: Add missing MOODLE_INTERNAL checks 2017-09-26 23:04:51 +02:00
Eloy Lafuente (stronk7) 4495103f17 Merge branch 'MDL-59645-32-flickr' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-09-26 19:35:39 +02:00
Tim Hunt ce7cb88198 MDL-58790 quiz editing: translate hard-coded new heading string 2017-09-26 11:18:28 +01:00
Juan Leyva 67ad699c28 MDL-60233 mod_assign: Avoid HTML in the item field of external warnings
The item field is defined as PARAM_TEXT (no HTML tags allowed except
for multilang).
Using the s that add quotes to HTML characters we avoid potential Web
Services invalid parameters errors.
2017-09-26 12:13:40 +02:00
Andrew Nicols d94ac2bfbc Merge branch 'MDL-60141-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-09-26 15:48:46 +08:00
Jake Dallimore 3a1a441a7b Merge branch 'MDL-60121-multi-enrol-backup-MOODLE_32_STABLE' of https://github.com/mpetrowi/moodle into MOODLE_32_STABLE 2017-09-26 15:25:42 +08:00
Juan Leyva 7b7f45307a MDL-60141 auth_email: Fix sitepolicy field type in get_signup_settings 2017-09-26 09:11:27 +02:00
Simey Lameze 5f3cb3de39 MDL-60052 theme_bootstrapbase: proper handling of large modals 2017-09-26 11:21:28 +08:00
Andrew Nicols 1284339766 Merge branch 'MDL-60052-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-09-26 09:31:38 +08:00
Andrew Nicols b1517ff214 Merge branch 'MOODLE_32_STABLE' of https://github.com/ConnorSheremeta/moodle into MOODLE_32_STABLE 2017-09-26 09:26:34 +08:00
Carson Tam e9f31bb710 MDL-59931 mod_quiz: Fixing incorrect pagination count. 2017-09-25 12:51:58 -07:00
Eloy Lafuente (stronk7) 0c95cbef53 Merge branch 'wip-MDL-60167-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-09-25 20:19:50 +02:00
Shamim Rezaie c4a970c345 MDL-57228 quiz editing: unit test for the move case 2017-09-25 12:55:27 +01:00
Tim Hunt 0525300ebc MDL-57228 quiz: fix editing when there are one-question sections
Fix based on a patch by Joost van der Borg <j.van.der.borg@ssr.nl>.
2017-09-25 12:55:26 +01:00
Marina Glancy 930ef87ff8 MDL-60167 upgrade: Fix duplicate site registrations 2017-09-24 18:53:23 +08:00
Dan Poltawski 469c46aa3a weekly release 3.2.5+ 2017-09-22 12:43:15 +01:00
Dan Poltawski facf5f3b6f Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-09-22 12:43:13 +01:00
David Mudrák f4ef37425a MDL-60210 admin: Check if the site needs upgrade on admin/search.php too
The page admin/search.php is the default administration page in Boost
based themes. It should behave the same as admin/index.php or
my/index.php and check if the site needs upgrade.
2017-09-22 13:24:18 +02:00
Jun Pataleta c27af3af45 Merge branch 'MDL-37810-32-fix' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-09-22 10:55:06 +08:00
Ryan Wyllie 9648379ea2 MDL-60052 javascript: fix large styling for modals 2017-09-22 10:03:45 +08:00
Damyon Wiese 074034db86 MDL-59220 setuplib: Redirect on https mismatch
When the wwwroot indicates https support and a page is accessed over http,
redirect to the wwwroot. This is a better experience than displaying an error.

Backport of MDL-58318.
2017-09-22 09:48:35 +08:00
AMOS bot 9c65fc25cb Automatically generated installer lang files 2017-09-22 00:08:32 +08:00
AMOS bot 74b092ca47 Automatically generated installer lang files 2017-09-22 00:08:31 +08:00
Jake Dallimore 9cd7403fe6 MDL-37810 roles: fix profile roles logic to include all roles
If the user has the role:assign capability then the list of profile roles
will include any role assigned in the context or above.
2017-09-21 22:27:42 +08:00
AMOS bot e667a98f86 Automatically generated installer lang files 2017-09-21 00:06:31 +08:00
Eloy Lafuente (stronk7) d016049dc9 Merge branch 'MDL-60132-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-09-19 22:38:56 +02:00
David Mudrák 82aab5855c MDL-59645 flickrlib: Show debug notice when using legacy authentication 2017-09-19 14:45:44 +02:00
David Mudrák 38bd68868d MDL-59645 portfolio_flickr: Make the Flickr portfolio export work again
The patch modifies the Flickr portfolio to make it use of the new oauth1
based client.
2017-09-19 14:45:44 +02:00
David Mudrák df61d236f5 MDL-59645 repository_flickr: Drop legacy auth tokens and nsids
The values stored in these user preferences were valid for the old
flickr auth mechanism and are not usable any more. The new oauth1 based
version needs to store both the token (in the flickr_access_token
preference) and the token secret (flickr_access_token_secret). The new
version does not need to store the user's nsid.

The cryptic names of these legacy settings are a result of how dealing
with user preferences was originally implemented.
2017-09-19 14:45:44 +02:00
David Mudrák 6c0671bbf0 MDL-59645 repository_flickr: Make the Flickr repository work again
The patch makes the Flickr repository use the new oauth1 based client.
Beside that, other improvements include:

* Does not attempt to guess the photo URL any more. Instead uses
  url_sq and url_o extras of the flickr.photos.search call.
* The photos.search does not return the information about the photo size
  so we set it to null (previously was returned as 'unknown' which made
  it be displayed as zero).
* Does not perform additional API request to obtain the manage URL, uses
  https://www.flickr.com/photos/organize instead.
2017-09-19 14:45:44 +02:00
David Mudrák a7c710c1b8 MDL-59645 oauth1: Implement a new simple Flickr API client
Flickr has switched over to OAuth 1.0 based authentication. This is a
simple client allowing Moodle to perform authenticated calls to the
Flickr API.
2017-09-19 14:45:44 +02:00
David Mudrák a247bf678e MDL-59645 oauth1: Improve reporting of token errors
Provide a more meaningful error message and debuginfo allowing to
diagnose what is going on. In case of flickr, this is typically thrown
when flickr API responses with their "bad, bad panda" HTML page instead
of the expected reply.
2017-09-19 14:45:44 +02:00
David Mudrák c51c6351b3 MDL-59645 oauth1: Pass oauth_callback only to obtain the request token
As per the oauth1 spec, the oauth_callback is supposed to be passed only
when obtaining the initial request token. The client used to append it
automatically to all requests which broke the request signature.
2017-09-19 14:45:44 +02:00
Matt Petro 5b9fc0b69b MDL-60121 enrol: Fix enrol plugin backup
Allow more than one enrol plugin to add backup structure.
2017-09-19 07:05:48 -04:00
Jun Pataleta a1a2903db4 Merge branch 'MDL-60048-32' of https://github.com/Kathrin84/moodle into MOODLE_32_STABLE 2017-09-19 17:21:02 +08:00
Dan Poltawski 821c414049 Merge branch 'MDL-60018-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-09-19 07:28:08 +01:00
Eloy Lafuente (stronk7) 2904e5e987 Merge branch 'MDL-60105_32' of git://github.com/dmonllao/moodle into MOODLE_32_STABLE 2017-09-19 01:56:54 +02:00
Eloy Lafuente (stronk7) 2337e280cf Merge branch 'MDL-52131-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-09-19 01:54:02 +02:00
Eloy Lafuente (stronk7) f5a1435789 Merge branch 'MDL-37810-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-09-19 01:49:20 +02:00
Eloy Lafuente (stronk7) 335f04772b Merge branch 'MDL-53244_32_STABLE' of git://github.com/Chocolate-lightning/moodle into MOODLE_32_STABLE 2017-09-19 01:43:52 +02:00
Jake Dallimore cb617fa262 MDL-37810 roles: added manager case to test_get_user_roles_in_course()
Managers can assign managers, and should be able to see that role on
the course profile page, as a link to the participants page.
2017-09-18 10:22:54 +08:00
Jun Pataleta d19291fbf3 Merge branch 'MDL-59994-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-09-18 09:09:28 +08:00
Jake Dallimore 7fb6fdf6a7 MDL-37810 roles: get_user_roles_in_course returns all relevant roles
Fixed to return both those roles in the profileroles site policy and
any roles which the current user can assign in the respective context,
meaning a user can see a link to any role they can assign.
2017-09-18 09:01:50 +08:00
Jake Dallimore d4fd2325fe MDL-37810 roles: unit tests for get_profile_roles() 2017-09-18 09:01:50 +08:00
Jake Dallimore d549a9d973 MDL-37810 roles: fix get_profile_roles() so it returns assignable roles 2017-09-18 09:01:50 +08:00
Simey Lameze 437a07a572 MDL-59994 core_competency: improve unit test to cover deleted users 2017-09-18 08:34:33 +08:00
Simey Lameze c225ebf975 MDL-59994 core_competency: dont list competencies from deleted users 2017-09-18 08:34:33 +08:00
Dan Poltawski cc60733069 weekly release 3.2.5+ 2017-09-15 08:49:26 +01:00
Dan Poltawski 7e364756ae Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-09-15 08:49:25 +01:00
Kathrin Osswald 43d4117912 MDL-60048 theme_boost: Center logo within the navbar
My solution is to remove the padding that's added within scss/bootstrap/_navbar.scss (line 72)
for the case that a logo (has-logo) is uploaded and displayed within the navbar.
Removing this padding will center the image within the navbar.
2017-09-14 14:01:03 +02:00
Juan Leyva 3a960acf1e MDL-60132 tool_mobile: Handle correctly moodle_url instances
In Moodle there are some functions that can be overridden by themes.
Some themes are returning incorrect value types in those functions
2017-09-14 12:18:08 +02:00
Juan Segarra Montesinos 3e55e065fe MDL-52131 qbehaviour: respect manualcomment format
The format of a manual comment in a question is respected when
the preferred editor is "Plain text area".
2017-09-14 13:31:30 +08:00
Matt Clarkson 856fa58440 MDL-60105 mod_folder: Set timemodified on change
Changes to the folder contents were not resulting in the
timemodied of the folder activity being set. This prevented
global search from picking up the changes.
2017-09-13 13:53:46 +02:00
Matt Clarkson 0a64999259 MDL-60105 search: Fix fatal error
If an indexed file has been modified or deleted the search index
will still reference the old file. Remove the file from search
results until the change has been indexed.
2017-09-13 13:53:46 +02:00
AMOS bot 9f861ddcbb Automatically generated installer lang files 2017-09-13 00:06:59 +08:00
Dan Poltawski dff980ab44 Merge branch 'MDL-60039_32' of git://github.com/dmonllao/moodle into MOODLE_32_STABLE 2017-09-12 11:24:21 +01:00
David Monllao 8aab2713e9 MDL-60039 search: Force messaging search areas to be reindexed 2017-09-12 12:04:47 +02:00
David Monllao f7d3978d8d MDL-60039 messaging: global search index using timeread 2017-09-12 12:01:01 +02:00
Dan Poltawski cc15eb08e7 Merge branch 'MDL-59929_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-09-12 10:56:03 +01:00
Eloy Lafuente (stronk7) 75788c63c5 Merge branch 'MDL-60086-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-09-12 09:56:39 +02:00
David Monllao 57d11528b0 Merge branch 'MDL-59399-32' of git://github.com/ryanwyllie/moodle into MOODLE_32_STABLE 2017-09-12 08:12:46 +02:00
David Monllao 52155a2496 Merge branch 'MDL-59867-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-09-12 07:11:11 +02:00
David Monllao 1b81de7861 Merge branch 'MDL-59879-32' of https://github.com/abias/moodle into MOODLE_32_STABLE 2017-09-12 07:04:58 +02:00
Eloy Lafuente (stronk7) 5258d49a10 Merge branch 'wip-MDL-59808-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-09-12 00:14:01 +02:00
Eloy Lafuente (stronk7) 7e14be9814 Merge branch 'MDL-60025-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-09-11 23:51:12 +02:00
Dan Poltawski df68f1fcbd Merge branch 'MDL-35849-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-09-11 14:19:22 +01:00
Jake Dallimore 9b7b9d2740 MDL-60086 travis: Bumping the postgres version to 9.6
The new Travis images don't have 9.1 installed any more.
2017-09-11 14:39:00 +08:00
Jun Pataleta 3b92e304d3 Merge branch 'wip-MDL-55849-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-09-11 13:30:46 +08:00
Adrian Greeve cb9f449c71 MDL-55849 mod_assign: Behat update for group submission reopening. 2017-09-11 12:01:38 +08:00
Adrian Greeve 255ef8e427 MDL-55849 mod_assign: Reopening assignments only increases by one.
Group assignments when being reopened will only increase the
attempt total by one.
2017-09-11 12:01:38 +08:00
Eloy Lafuente (stronk7) 9146c518ec Moodle release 3.2.5 2017-09-09 22:48:05 +02:00
Mathew May c84a3c9c40 MDL-53244 login: Add error message for recaptcha 2017-09-08 12:58:11 +12:00
David Monllao 43343ee9fc weekly release 3.2.4+ 2017-09-07 11:39:06 +02:00
David Mudrák fad00feee6 MDL-59969 admin: Warn admins if a development libs directory exists
We can't really control the direct web access to directories in dirroot,
that is part of the server setup. So we at least warn admins as they may
not realize the risks of having directories like vendor or node_modules
exposed.

Credit goes to Petr Škoda for mentioning the PHPUnit issue CVE-2017-9841
to me.
2017-09-07 11:06:39 +02:00
Marina Glancy e6f067b27d MDL-59972 mod_feedback: escape subject when showing the contact form 2017-09-07 11:06:39 +02:00
Jake Dallimore be365f2dbe MDL-58953 user: additional test case for user_can_view_profile() 2017-09-07 11:06:38 +02:00
Jake Dallimore 420440b2c1 MDL-58953 user: fix course checking logic in user_can_view_profile()
Make sure to check that $user in enrolled in $course before checking
whether the current user has capabilities in that course, and make sure
that we don't check user context caps when handling a specific course.
2017-09-07 11:06:38 +02:00
Simey Lameze 84650826a8 MDL-59776 core_calendar: unit tests of module events deletion 2017-09-07 11:06:37 +02:00
Simey Lameze 14d47d237e MDL-59776 core_calendar: prevent deletion of module events 2017-09-07 11:06:37 +02:00
Juan Leyva c70c7b65f0 MDL-58762 core: Get full course objects on navigation
The course object passed as parameter to extend_navigation_user
callback contained only a few parameters, some parameters like
showgrades or showreports were missing.
The callback should receive a full course object.
2017-09-07 11:06:37 +02:00
Juan Leyva efa8edcb86 MDL-58762 report: Check group permissions in course user reports
Teachers were able to see any student report even with forced separated
groups and capability moodle/course:accessallgroups off.
2017-09-07 11:06:36 +02:00
Jun Pataleta c97838cd76 Merge branch 'm32_MDL-59635_Properly_Escape_Column_Names_Reserved_Words_Proof' of https://github.com/scara/moodle into MOODLE_32_STABLE 2017-09-07 11:06:36 +02:00
Eloy Lafuente (stronk7) 730d8c788d Merge branch 'MDL-59696-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-09-07 11:06:35 +02:00
Eloy Lafuente (stronk7) 21d2db211d Merge branch 'MDL-59198-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-09-07 11:06:35 +02:00
David Monllao 9b18d1df37 Merge branch 'MOODLE_32_STABLE-MDL-59799' of https://github.com/jojoob/moodle into MOODLE_32_STABLE 2017-09-07 11:06:34 +02:00
Dan Poltawski 5da7d05120 Merge branch 'wip-MDL-59992-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-09-07 11:06:34 +02:00
David Monllao 3a3dab265b Merge branch 'wip-MDL-59815-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-09-07 11:06:33 +02:00
Dan Poltawski 999d7ecc45 Merge branch 'MOODLE_32_STABLE-MDL_59834-Indexing_of_personal_messages' of https://github.com/mattporritt/moodle into MOODLE_32_STABLE 2017-09-07 11:06:33 +02:00
David Monllao d9d159e6fb Merge branch 'wip-MDL-59898-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-09-07 11:06:32 +02:00
David Monllao 04bfebf961 Merge branch 'MDL-59963_32-report-logs-origin-pagination' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-09-07 11:06:32 +02:00
Damyon Wiese 6961e8882d MDL-59867 autocomplete: Prevent duplicate ids.
Rendering a form with 2 autocompletes in it can get messed up because of duplicated ids.
2017-09-07 09:34:04 +08:00
Marina Glancy c079d43dc1 MDL-59808 webservice_rest: comply with restformat argument 2017-09-07 08:34:40 +08:00
Juan Leyva b46369041c MDL-60025 mod_book: Return correct values for chapters update time
Instead returning the time when the chapter was created or modified we
were returning the time when the book was created or modified.
2017-09-06 12:38:34 +02:00
Juan Leyva 51cd0c4072 MDL-60018 mod_chat: Fix chatmethod field type in get_chats_by_courses WS 2017-09-06 12:16:43 +02:00
Marina Glancy def68f84a0 MDL-60033 webservice_xmlrpc: extra escaping in the server URL 2017-09-06 13:44:06 +08:00
Ryan Wyllie ad445893db MDL-59399 atto: make media plugin shortform explandable 2017-09-06 05:28:04 +00:00
Ankit Agarwal fec32f3cd7 MDL-35849 login: Add role alert to error messages
Error messages should be prominent to screen readers as well as visual users,
adding the role alert is recommended way to achieve it for screen readers and this is
also what we do for ->notification apis
2017-09-05 12:50:29 +05:30
Matteo Scaramuccia f550fd73ba MDL-59635 tool_replace: Escape the column name. 2017-09-04 13:39:08 +02:00
Matteo Scaramuccia 2a266d605a MDL-59635 ddl: Added test_get_enc_quoted(). 2017-09-04 13:39:07 +02:00
Jun Pataleta 011f82f04d MDL-59696 theme_bootstrapbase: Set max-width for custom-select elements
* Set custom-select elements with a maximum width of 100% of their
container.
2017-09-04 10:12:48 +08:00
Jun Pataleta 25c9f019b6 MDL-59696 templates: Remove form-group div for url-select template
* Removed the div with the class 'form-group' that's enclosing the
select element and friends. It's not needed since the urlselect template
is an inline form.
* Also, for completeness, I added the helpicon data for the template's
context.
2017-09-04 10:12:48 +08:00
Tobias Garske ec4bcc0a02 MDL-59898 access: Added Icon references. 2017-09-04 09:56:53 +08:00
Matt Porritt 72870eb4ff MDL-59834 Global Search: Indexing user messages
Make indexing of user messages tolerant to user deletion.
When creating the search document for user messages,
add a check to see if the user has been deleted in the
system. If they have been deleted abort creating the search
document.
This is to avoid rasining an error when trying to get the
user context for a deleted user.
2017-09-04 09:18:22 +10:00
Johannes Burk 5405eda8cb MDL-59799 course: Include course/lib.php before using move_courses(). 2017-09-01 16:44:37 +02:00
Luca Bösch 799da2b41e MDL-53936 reports: State default index page explicitly in pagination url 2017-09-01 11:51:32 +02:00
Luca Bösch d7a5ede0ef MDL-59963 reports: origin parameter looked at in log reports 2017-09-01 11:50:28 +02:00
Jun Pataleta 3393db1467 weekly release 3.2.4+ 2017-09-01 13:26:59 +08:00
Jun Pataleta c8b9ac4d4d Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-09-01 13:26:58 +08:00
Andrew Nicols 8c0221add0 Merge branch 'MDL-56646-32-fix' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-08-31 15:01:03 +08:00
John Okely 0a6282a861 MDL-56646 mod_assign: Improve grade fix strings 2017-08-31 14:54:16 +08:00
John Okely ab0e6eed08 MDL-56646 mod_assign: Make rescale behat more specific 2017-08-31 14:54:10 +08:00
Marina Glancy a0aac0bd6b MDL-59992 webservice: fix debugging message event context already set 2017-08-31 12:14:01 +08:00
Eloy Lafuente (stronk7) a7df7cbe77 Merge branch 'MDL-59927-32-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-08-30 11:06:09 +02:00
Peter Spicer b8dcc85f7c MDL-59815 access: Fix definition of risks for user:delete. 2017-08-30 11:35:22 +08:00
Connor Sheremeta bd937195eb MDL-54540 lti: Add allowfullscreen attribute to LTI IFrames 2017-08-29 13:46:34 -06:00
Helen Foster f2d07696c1 MDL-59927 lang: Merge English strings from the en_fix language pack
Significant string changes:

- firstpagetitle_help,mod_wiki - improved wording
- completionicons_help,core_completion - removing confusing sentence
  about the tick being optional
2017-08-29 16:01:27 +02:00
Dan Poltawski 5391a3ccea Merge branch 'MDL-59195_assign_comment_permissions_32' of git://github.com/davosmith/moodle into MOODLE_32_STABLE 2017-08-29 11:59:18 +01:00
Jun Pataleta 5b13b5438d Merge branch 'MDL-59908-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-08-29 17:42:27 +08:00
Andrew Nicols ceec1f258f Merge branch 'MDL-56646-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-08-29 15:52:16 +08:00
John Okely 75c1e649b1 MDL-56646 assign: Fix negative grades in restore 2017-08-29 07:18:52 +00:00
John Okely 167507dcf8 MDL-56646 assign: Add ability to fix errant grades 2017-08-29 07:18:52 +00:00
Ankit Agarwal f644ae8a7d MDL-59198 lti: Make params LTI2 compatible
LTI2 recommends to include both upper case and lower case of custom params.
This patch makes our implementation confer to that standard.
2017-08-29 11:43:51 +05:30
Andrew Nicols d7d8b68ae3 Merge branch 'MDL-35290-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-08-29 13:17:12 +08:00
Jake Dallimore 100a53119a MDL-35290 files: File manager reports files which can't be read 2017-08-29 11:13:37 +08:00
Eloy Lafuente (stronk7) ba88f2a04f Merge branch 'MDL-59870_32-participants-th-top-vertical-aligned' of http://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-08-29 01:03:49 +02:00
AMOS bot 7440a3e306 Automatically generated installer lang files 2017-08-29 00:08:21 +08:00
John Okely 1b8ca8081b MDL-56646 assign: Don't rescale any negative grades 2017-08-28 07:31:45 +00:00
John Okely 7bd00375bc MDL-56646 assign: Behat test rescaling after viewing student 2017-08-28 07:31:45 +00:00
Jun Pataleta 144bf3064c Merge branch 'wip-MDL-59708-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-08-28 15:02:24 +08:00
Jake Dallimore 655b454366 MDL-35290 files: File manager shouldn't break with lost/moved files 2017-08-28 08:41:24 +08:00
AMOS bot e8e1e9cbc7 Automatically generated installer lang files 2017-08-28 00:09:46 +08:00
AMOS bot c338b3ddaf Automatically generated installer lang files 2017-08-26 00:07:31 +08:00
Eloy Lafuente (stronk7) 1626cc036e Merge branch 'wip-MDL-59881-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-08-25 01:00:18 +02:00
Luca Bösch 9b8b0c907a MDL-59870 users: Default align participant table header row.
Instead of putting vertical-align: middle as indication for participants table
headers, none is set which leads to theme default, i.e. bottom in Clean and Boost.
2017-08-25 00:11:00 +02:00
AMOS bot 765e7e426a Automatically generated installer lang files 2017-08-25 00:05:58 +08:00
AMOS bot 17f0da3a56 Automatically generated installer lang files 2017-08-25 00:05:57 +08:00
Tim Hunt e3993969d6 MDL-59929 signup: inprove usability when duplicate email entered 2017-08-24 16:33:24 +01:00
Eloy Lafuente (stronk7) 5e7cb19d97 weekly release 3.2.4+ 2017-08-24 14:14:23 +02:00
Ankit Agarwal f78533b6ae MDL-59908 backup: Backup rule should use both http and https schemes 2017-08-24 11:34:12 +05:30
Ankit Agarwal 9c086d3891 MDL-59908 backup: Add tests to make sure both http(s) schemes are parsed 2017-08-24 11:34:11 +05:30
Eloy Lafuente (stronk7) 32e408c9f4 Merge branch 'MDL-59790-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-08-23 11:38:28 +02:00
Andrew Nicols 9fd6166e32 Merge branch 'MDL-57412-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-08-23 16:58:38 +08:00
John Okely 360c8b7a8f MDL-57412 adminlib: change linkcoursesections default to 1 2017-08-23 15:09:42 +08:00
John Okely 7681e279d4 MDL-57412 upgrade: Set linkcoursesections to 1 if boost in use 2017-08-23 15:09:42 +08:00
Simey Lameze 490a62a963 MDL-59790 core: fix tooltip for pie chart 2017-08-23 12:28:29 +08:00
Andrew Nicols 95eb86b4d4 Merge branch 'MDL-51827_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-08-23 09:38:51 +08:00
Eloy Lafuente (stronk7) 7330fa406d Merge branch 'MDL-59663-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-08-22 21:04:00 +02:00
Tim Hunt 64d7716d76 MDL-51827 account confirm: take users to their dashboard
This is an old bit of UI inconsistency. For some reason it used to take
people to the list of all courses. Given modern Moodle usability
conventions, that does not really make sense any more.
2017-08-22 14:34:57 +01:00
Eloy Lafuente (stronk7) 4d5d8cd090 Merge branch 'MDL-59784-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-08-22 12:29:01 +02:00
Andrew Nicols 1862ff1afb Merge branch 'MDL-59826-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-08-22 16:01:46 +08:00
Andrew Nicols 0030a24f5c Merge branch 'MDL-59825-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-08-22 15:35:35 +08:00
Jun Pataleta b0a0e7abf9 Merge branch 'MDL-57775-32-xmlrpc' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-08-22 15:00:34 +08:00
Andrew Nicols e9fc0c3145 Merge branch 'MDL-59893-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-08-22 14:33:59 +08:00
Jake Dallimore 5dde47c0d1 MDL-59893 assign: don't prefix file links when downloading as folders
Change to download_rewrite_pluginfile_urls() ensuring prefix isn't
added to file links when downloading with the  downloadasfolders
user preference set to true. Links to files in onlinetext now work
when downloading as folders.
2017-08-22 13:00:02 +08:00
Jake Dallimore 6f363ad9e1 MDL-59893 assign: fixes for groupname prefix when downloading
assign->download_submissions():
- groupname now only added to zip file name if not empty, fixing a
double hyphen bug in the file name.
assign->download_rewrite_pluginfile_urls():
- groupname is now correctly determined using get_submission_group()
instead of using groups_get_activity_group() which fails when there
is no active activity group set. Uses the same logic that
download_submission() uses to prefix file names. Fixes a bug where an
empty groupname prefix was generated, resulting in broken links.
2017-08-22 12:59:57 +08:00
Andrew Nicols 576f9bf393 Merge branch 'MDL-57246-32-forumredirect' of git://github.com/roperto/moodle into MOODLE_32_STABLE 2017-08-22 12:34:28 +08:00
Adrian Greeve c63aff3469 MDL-59881 question bank: Use supplied function parameters.
question_usage_by_activity::start_all_questions now uses all
three of the parameters that are defined.
2017-08-22 09:37:16 +08:00
Eloy Lafuente (stronk7) 5b7bb8c728 Merge branch 'MDL-55937-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-08-21 23:22:24 +02:00
Eloy Lafuente (stronk7) 817db54ce6 Merge branch 'MDL-59049-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-08-21 23:09:26 +02:00
Davo Smith ce5bf80ab6 MDL-59195 mod_assign: add behat tests for comments error 2017-08-21 10:28:32 +01:00
Davo Smith 31fb71994e MDL-59195 assignsubmission_comments: fix permission checks 2017-08-21 10:28:32 +01:00
Alexander Bias 6eeaf27bd1 MDL-59879 navigation: Add node key to competencies navigation node 2017-08-21 10:55:37 +02:00
John Okely e0fc3b6d52 MDL-57412 course: Unit test get_view_url for course formats 2017-08-21 12:56:02 +08:00
John Okely 2a9926f8b4 MDL-57412 navigationlib: Respect linkcoursesections again 2017-08-21 12:56:02 +08:00
Jun Pataleta c0361874e1 MDL-59663 course: Render the appropriate course-category tree action 2017-08-21 10:02:04 +08:00
Eloy Lafuente (stronk7) 7e74569bd8 Merge branch 'MDL-59836-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-08-18 12:36:40 +02:00
Jake Dallimore 9d78a83e27 MDL-59825 user: user_can_view_profile() checks all of a $user's courses
This function used to check only those courses shared by both users
when it should have been checking all courses in which $user is
enrolled. Managers can view a user's course profile without necessarily
sharing the course (being enrolled in) with the $user.
2017-08-18 11:38:21 +08:00
Jun Pataleta 1932699a0e MDL-59836 core_amd: Use only one input event handler
* We have duplicate input event handlers for the autocomplete element
which are both firing when the input element's value is being set.
In case an AJAX handler is defined for the autocomplete suggestions,
this causes the autocomplete suggestions so show "No suggestions" first
and then load the results from the AJAX handler a little bit later.
2017-08-18 11:37:38 +08:00
Jake Dallimore 458be04b51 MDL-59826 output: make context_header() aware of page context.
There are times, such as when viewing a user profile within a course,
when user_can_view_profile() should be passed a course to force it to
restrict its capability checks to only the supplied course. This change
makes sure that core_renderer->context_header() calls this correctly.
2017-08-18 11:33:01 +08:00
Andrew Nicols be115c1097 MDL-59784 core: Modal factory should listen before fetching templates 2017-08-18 11:19:50 +08:00
Andrew Nicols fb6da21229 MDL-59784 core: Modal should accept title as a promise 2017-08-18 11:19:50 +08:00
Jake Dallimore 17c7a576e3 MDL-59049 badges: allows users to view badges from deleted courses 2017-08-18 10:52:41 +08:00
Andrew Nicols 2f8dec8a00 MDL-59784 core: Refactor addblock to listen earlier 2017-08-18 09:37:17 +08:00
Eloy Lafuente (stronk7) fca5d3d71d weekly release 3.2.4+ 2017-08-17 10:39:20 +02:00
Eloy Lafuente (stronk7) 261b8a8663 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-08-17 10:39:19 +02:00
AMOS bot f6b077722c Automatically generated installer lang files 2017-08-17 00:08:48 +08:00
David Mudrák ddbbe8b563 MDL-57775 xmlrpc: Formal fix of coding style and phpdocs
- There was missing MOODLE_INTERNAL check.
- The client is not used for unit tests only so the class description
  was obsolete.
2017-08-15 21:43:28 +02:00
David Mudrák 9943a9b471 MDL-57775 xmlrpc: Test webservice_xmlrpc_client request encoding
The patch wraps the underlying xmlrpc_encode_request() call into a
standalone method that can be then unit-tested.
2017-08-15 21:43:28 +02:00
David Mudrák aafd4121d5 MDL-57775 xmlrpc: Pass escaping to xmlrpc_encode_request() calls
This patch adds the missing 'escaping' option to all remaining
xmlrpc_encode_request() calls in the moodle core code.

Without this, the xmlrpc_decode_request() call on the server side may
lead to wrongly decoded non-ascii characters.
2017-08-15 21:43:27 +02:00
Eloy Lafuente (stronk7) 05f4445462 Merge branch 'MDL-58435-m32' of https://github.com/NeillM/moodle into MOODLE_32_STABLE 2017-08-15 16:35:49 +02:00
Eloy Lafuente (stronk7) 71cd7f8f89 Merge branch 'MDL-59667-32-2' of git://github.com/ryanwyllie/moodle into MOODLE_32_STABLE 2017-08-15 13:13:26 +02:00
Neill Magill 326938cdfc MDL-58435 behat: Update existing tests to use section editing steps 2017-08-15 09:59:50 +01:00
Ankit Agarwal b48c52b48d MDL-55937 assign: Check for group submission caps when userid=0 2017-08-15 11:15:59 +05:30
Jun Pataleta 03173aad6e Merge branch 'MDL-57611-moodle32' of https://github.com/jebarviabb/moodle into MOODLE_32_STABLE 2017-08-15 11:51:02 +08:00
gthomas2 56d1010f4c MDL-59708 file: Add CUD callbacks, backport of MDL-57476 2017-08-15 09:51:41 +08:00
Ryan Wyllie fbc1d6810f MDL-59667 form: stop datepicker from rendering outside viewport
Stop the date picker panel from being rendered outside of the
viewport, for example when being displayed in a modal.
2017-08-15 01:25:51 +00:00
Jun Pataleta cc6a0292a8 Merge branch 'MDL-59785-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-08-14 16:57:18 +08:00
Jun Pataleta 6b040158b9 Merge branch 'MDL-59740_32' of git://github.com/markn86/moodle into MOODLE_32_STABLE 2017-08-14 13:48:34 +08:00
Andrew Nicols 7bf9b144e1 Merge branch 'wip-MDL-57188-32-2' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-08-14 13:16:58 +08:00
Andrew Nicols 7be5ceab6f Merge branch 'MDL-59737_32' of git://github.com/markn86/moodle into MOODLE_32_STABLE 2017-08-14 12:30:09 +08:00
Simey Lameze 826f8dcfad MDL-59785 mod_book: all navigation styles must mark as completed 2017-08-14 11:44:09 +08:00
AMOS bot e56476777a Automatically generated installer lang files 2017-08-14 00:08:48 +08:00
Josh Ebarvia 2a772b417a MDL-57611 report_log: Fix capability checks for viewing logs 2017-08-11 13:07:22 +09:30
David Monllao a19dda0243 weekly release 3.2.4+ 2017-08-10 09:11:32 +02:00
David Monllao 4693ab804f NOBUG: Fixed SVG browser compatibility 2017-08-10 09:11:31 +02:00
Neill Magill f29641a554 MDL-58435 behat: Behat section editing step should work on section 0 2017-08-09 15:24:15 +01:00
Marina Glancy a7b9152399 MDL-57188 course: correct return url to manage page 2017-08-08 14:49:06 +08:00
Eloy Lafuente (stronk7) 5dad2e2824 Merge branch 'MDL-59506-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-08-07 19:55:40 +02:00
Eloy Lafuente (stronk7) 8d5c561c07 Merge branch 'MDL-59504-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-08-07 19:27:31 +02:00
Dan Poltawski 5b6eae27eb Merge branch 'MDL-59172-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-08-07 16:20:16 +01:00
David Monllao 0783b383b9 Merge branch 'MDL-59642-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-08-07 14:41:53 +02:00
Mark Nelson 51fdfc53b7 MDL-59740 core_form: add ability to specify if a button is primary 2017-08-07 17:38:26 +08:00
Mark Nelson 1a20218834 MDL-59737 core_backup: changed reference to domain doesntexist.com 2017-08-07 17:18:45 +08:00
David Monllao 74cf6f09d0 Merge branch 'wip-MDL-59055-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-08-07 09:22:07 +02:00
Andrew Nicols 1cc7c1c1cf Merge branch 'MDL-51745-moodle32' of https://github.com/jebarviabb/moodle into MOODLE_32_STABLE 2017-08-07 14:49:09 +08:00
Josh Ebarvia 9e3a44b58a MDL-51745 mod_lesson: Use format_text in response feedback 2017-08-07 15:51:10 +09:30
Andrew Nicols 8002fc9e27 Merge branch 'MDL-59662_32-errors-typo' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-08-07 13:36:57 +08:00
Andrew Nicols 284eec64a7 Merge branch 'MDL-59698-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-08-07 12:57:04 +08:00
Andrew Nicols 046fc0386f Merge branch 'MDL-59728_32-boost-question-bank-header-align' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-08-07 12:40:27 +08:00
Damyon Wiese 782f95ce5e MDL-59055 grades: behat test 2017-08-07 10:09:54 +08:00
Marina Glancy b8bb94808c MDL-59055 grades: provide backward-compatibility of changes 2017-08-07 10:09:53 +08:00
Marina Glancy 1b735f2761 MDL-59055 grades: fix bug displaying item id instead of grade
Thanks to Marcelo Santos for initial patch
2017-08-07 10:09:53 +08:00
Andrew Nicols 39c4326890 MDL-59506 core_lock: use a null lock during install
Use a different lock factory during installation which does not actually
lock at all.
2017-08-07 10:01:11 +08:00
Jake Dallimore 52f2f22fba MDL-59172 user: user_can_view_profile() now checks viewalldetails cap 2017-08-07 09:30:57 +08:00
Pierre Guinoiseau 98982ba82b MDL-59504 pix: update icon for Mahara 2017-08-07 09:02:42 +08:00
Luca Bösch 893888e2ab MDL-59728 questions: Align question bank headers. 2017-08-04 15:25:17 +02:00
Luca Bösch 34816abc7e MDL-59662 database: Typo in variable name. 2017-08-04 10:30:52 +02:00
Andrew Nicols cd0978d66c MDL-59642 stats: Correct random unit test failure
The unit test was creating four events, and then relying on them being
retrieved in the order in which they were created.

I've modified the test to:
* ensure timecreated are spaced apart; and
* add an order by timecreated when fetching them.
2017-08-04 15:07:38 +08:00
Andrew Nicols 66cfaa5f43 weekly release 3.2.4+ 2017-08-04 11:50:07 +08:00
Andrew Nicols 18bdade5d7 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-08-04 11:49:48 +08:00
AMOS bot 84ed229ae6 Automatically generated installer lang files 2017-08-04 00:11:14 +08:00
Andrew Nicols ecebcb44e2 Merge branch 'MDL-59582-32' of git://github.com/danpoltawski/moodle into MOODLE_32_STABLE 2017-08-03 15:50:46 +08:00
Dan Poltawski dee212c897 MDL-59582 npm: update shrinkwrap file for npm 8.2.0 2017-08-03 08:28:39 +01:00
Andrew Nicols 6702f7a907 Merge branch 'm32_MDL-59583_Fix_MariaDB_10d2d7_Breaking_Change' of https://github.com/scara/moodle into MOODLE_32_STABLE 2017-08-03 12:34:22 +08:00
Damyon Wiese d3e49e59f3 MDL-59698 behat: Remove bad tests
These tests are an abuse and should not have been accepted. Behat tests should use real pages.
Adding testing only entry points to Moodle is a bad security practice and is not the purpose of behat.
2017-08-03 10:30:40 +08:00
Matteo Scaramuccia f597bb1def MDL-59583 dml: fixed NULL values w/ MariaDB 10.2.7+ 2017-08-03 00:30:26 +02:00
Andrew Nicols b3dd3a0278 Merge branch 'MDL-57259-32' of git://github.com/ryanwyllie/moodle into MOODLE_32_STABLE 2017-08-02 13:40:28 +08:00
Ryan Wyllie d92ef7d2c5 MDL-57259 external: fix page url debug in fragment loading 2017-08-02 03:44:34 +00:00
Andrew Nicols 082ea214c7 Merge branch 'MDL-55364-32-fix' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-08-02 10:52:51 +08:00
John Okely 3971cdc602 MDL-55364 forum: Combine user picture and user name rows 2017-08-02 10:30:55 +08:00
Dan Poltawski fb982745a6 Merge branch 'MDL-55364-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-08-01 11:36:39 +01:00
David Monllao 8e7d737d39 Merge branch 'wip-MDL-53492-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-08-01 09:23:01 +02:00
Andrew Nicols 8b60f9b1c2 Merge branch 'MDL-58928_32-alt-attribute-enrolment-edit-delete-icons' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-08-01 14:56:44 +08:00
Andrew Nicols e0818e74b6 Merge branch 'MDL-59473-MOODLE_32_STABLE' of https://github.com/sytabaresa/moodle into MOODLE_32_STABLE 2017-08-01 10:51:57 +08:00
Luca Bösch 387e76f6a9 MDL-58928 enrol: delete and edit icon alt attribute 2017-07-31 17:33:19 +02:00
David Monllao 99c6170e39 Merge branch 'wip-MDL-59496-32-3' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-07-31 17:15:14 +02:00
David Monllao bcc09bcf64 Merge branch 'wip-MDL-59311-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-07-31 14:47:35 +02:00
David Monllao f97f4c2e8c Merge branch 'MDL-59535-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-07-31 14:20:14 +02:00
David Monllao 629dbe65bf Merge branch 'MDL-57546-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-07-31 14:10:12 +02:00
Dan Poltawski 5d65c618b4 Merge branch 'MDL-59632_32' of git://github.com/dmonllao/moodle into MOODLE_32_STABLE 2017-07-31 11:33:09 +01:00
Dan Poltawski 15e9965d66 Merge branch 'wip-MDL-59476-32-2' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-07-31 10:21:33 +01:00
Andrew Nicols b42b18958a Merge branch 'MDL-58196-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-07-31 15:30:11 +08:00
David Monllao 683241a7b1 Merge branch 'MDL-58744-32' of https://github.com/jacac/moodle into MOODLE_32_STABLE 2017-07-31 08:36:56 +02:00
Ankit Agarwal 3e0beaa76b MDL-58196 availability: Fix UI for pass/fail config
For pass/fail setting to work properly, activities must have 'Require grade' completion set,
just make sure we don't allow activities without this setting to be set
2017-07-31 11:56:39 +05:30
Ankit Agarwal f13679ffff MDL-58196 availability: Add appropriate dependencies in mform 2017-07-31 11:56:39 +05:30
Andrew Nicols 8c5da164a5 Merge branch 'm32_MDL-59583_Fix_MariaDB_10d2d7_Breaking_Change' of https://github.com/scara/moodle into MOODLE_32_STABLE 2017-07-31 11:51:24 +08:00
Marina Glancy 37975e9873 MDL-53492 registration: Moodle.net is more correct than Moodle.org 2017-07-31 11:38:38 +08:00
Marina Glancy 35d13bc3fa MDL-53492 registration: use https://moodle.net as hub url 2017-07-31 11:38:34 +08:00
Daniel Materka 557c609d7b MDL-55364 forum: fix overlapping columns in the table at low resolutions 2017-07-31 11:24:35 +08:00
Marina Glancy 7824b31705 MDL-59496 registration: display unregistered warning consistently 2017-07-31 11:24:20 +08:00
AMOS bot 9ea038335d Automatically generated installer lang files 2017-07-31 00:10:33 +08:00
AMOS bot 8c61b3fa9e Automatically generated installer lang files 2017-07-29 00:10:53 +08:00
Simey Lameze 40e3615636 MDL-59535 tool_behat: fix fatal error if there is no setup 2017-07-28 08:47:45 +08:00
AMOS bot 26c6b51f3c Automatically generated installer lang files 2017-07-28 00:07:58 +08:00
Jakob Ackermann 69dd75f44c MDL-58744 blocks: Add system context block position in non user context. 2017-07-27 09:03:53 -07:00
Dan Poltawski 8d826b10c6 weekly release 3.2.4+ 2017-07-27 10:10:49 +01:00
Dan Poltawski 87269161af Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-07-27 10:10:48 +01:00
David Monllao 3ac7b54f9c MDL-59632 search: Style search box for boost 2017-07-27 11:01:17 +02:00
Marina Glancy 2ecdf3527f MDL-59311 course: duplicate module rebuilds cache twice
slightly refactor duplicate_module() code so it does not rebuild course cache
twice and also we do not need to move module if it is already the last module in a section
2017-07-27 08:17:07 +08:00
Dan Poltawski 8ab93c866d Merge branch 'MDL-57698-32-fix' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-07-26 09:41:41 +01:00
John Okely b1fce6b62e MDL-57698 backup: Decrease deadlock fixture size 2017-07-26 10:41:39 +08:00
Andrew Nicols 05caa18842 MDL-57546 mediaplayer_youtube: Respect mobile URLs 2017-07-26 10:41:29 +08:00
Sebastian Tabares Amaya 21f36301a6 MDL-59473 request: Fix Loop Redirection in Oauth2
Conflicts:
	lib/oauthlib.php
2017-07-25 20:22:22 -05:00
AMOS bot eb0c054eb2 Automatically generated installer lang files 2017-07-26 00:07:52 +08:00
Dan Poltawski 097e33c3c8 Merge branch 'MDL-57698-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-07-25 11:48:12 +01:00
Matteo Scaramuccia 6a1af02a0c MDL-59583 dml: fixed breaking change added w/ MariaDB 10.2.7+ 2017-07-25 12:34:29 +02:00
Matteo Scaramuccia bd586072ae MDL-59583 dml: improve perfs by unsetting the key. 2017-07-25 12:31:52 +02:00
Dan Poltawski 1d7c7a52ff Merge branch 'MDL-58761_bad_regex_in_custom_step_MOODLE_32_STABLE' of https://github.com/gthomas2/moodle into MOODLE_32_STABLE 2017-07-25 11:06:24 +01:00
David Monllao 7dfe16bf72 Merge branch 'MDL-59485-32' of https://github.com/IMSGlobal/moodle into MOODLE_32_STABLE 2017-07-25 11:11:23 +02:00
Dan Poltawski 7ec1dd5900 Merge branch 'MDL-59432-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-07-25 07:58:47 +01:00
Marina Glancy f3f2867300 MDL-59476 dml: temporary mysql tables should not use compressed rows 2017-07-25 14:25:30 +08:00
David Monllao 6832876b63 Merge branch 'MDL-59509-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-07-24 13:04:04 +02:00
Dan Poltawski 894c661782 Merge branch 'MDL-58174-32' of https://github.com/abias/moodle into MOODLE_32_STABLE 2017-07-24 09:05:49 +01:00
Andrew Nicols 40310fa348 Merge branch 'wip-MDL-38129-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-07-24 15:29:57 +08:00
Andrew Nicols bd9a279c0e Merge branch 'wip-MDL-59561-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-07-24 13:22:51 +08:00
Andrew Nicols 614b87e26e Merge branch 'MDL-59490-32' of https://github.com/spvickers/moodle into MOODLE_32_STABLE 2017-07-24 12:53:20 +08:00
AMOS bot 83fd7eee00 Automatically generated installer lang files 2017-07-23 00:08:55 +08:00
AMOS bot 7c7b2b57cb Automatically generated installer lang files 2017-07-22 00:08:01 +08:00
John Okely 60eb84c9a8 MDL-57698 sqlsrv: Unit test NOLOCK 2017-07-21 14:46:53 +08:00
John Okely 5c409b7e78 MDL-57698 sqlsrv: Query temp tables with no lock 2017-07-21 14:46:53 +08:00
John Okely 5c1b2fbbbf MDL-57698 sqlsrv: Unit test deadlock case 2017-07-21 14:46:53 +08:00
Andrew Nicols 62d4895808 MDL-59509 dml: sqlsrv should respect port setting
Details of how to connect to a specific port are available at
https://docs.microsoft.com/en-us/sql/connect/php/how-to-connect-on-a-specified-port
2017-07-21 13:24:10 +08:00
Adrian Greeve 30b8eb2d46 MDL-59561 database: Update to creating new indexes in mysql.
When updating the mysql system to utf8mb4 not all tables are
converted to the row format of compressed or dynamic. If a new
index is created there is a possibility that the table could be
using compact or redundant and then an error will be shown saying
that the index size is too large. This fix handles this exception
and converts the table over to compressed.
2017-07-21 09:32:19 +08:00
AMOS bot 98c7360862 Automatically generated installer lang files 2017-07-21 00:07:06 +08:00
Dan Poltawski 0581a9be05 weekly release 3.2.4+ 2017-07-20 13:20:50 +01:00
Dan Poltawski e760f0978f Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-07-20 13:20:49 +01:00
Marco Ferrante 4e184445f2 MDL-59432 auth_db: add aliases to field mapping query
This patch fixes an issue with mapping different internal fields
to the same external field.
2017-07-20 15:00:09 +08:00
Andrew Nicols bfc16833c6 Merge branch 'MDL-59527-32-fix1' of http://github.com/damyon/moodle into MOODLE_32_STABLE 2017-07-20 10:44:15 +08:00
Andrew Nicols 4fc7dd679a Merge branch 'wip-MDL-57649-32-fix2' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-07-20 10:23:56 +08:00
Damyon Wiese e00ed4b740 MDL-59527 autocomplete: Don't fetch ajax twice 2017-07-20 10:02:40 +08:00
Adrian Greeve 4a162dc36a MDL-57649 mod_lesson: Improvement to upgrade query.
We only need one record for each filearea that we
are removing.
2017-07-20 10:02:08 +08:00
AMOS bot 40727c30b0 Automatically generated installer lang files 2017-07-20 00:06:51 +08:00
Dan Poltawski 39bf55dc27 Merge branch 'wip-MDL-57649-32-fix' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-07-19 09:33:16 +01:00
Adrian Greeve e651adf8e4 MDL-57649 mod_lesson: Additional refinement to upgrade script. 2017-07-19 15:46:17 +08:00
Dan Poltawski 9a79219353 Merge branch 'MDL-59569-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-07-19 08:44:00 +01:00
Andrew Nicols 43591af1ea Merge branch 'wip-MDL-39471-32-fix' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-07-19 14:59:38 +08:00
Adrian Greeve c6e1eb9729 MDL-39471 mod_assign: Fix for missing function in 3.2
Moodle 3.2 doesn't have can_edit_group_submission.
This replaces the lack of that function.
2017-07-19 12:58:47 +08:00
Andrew Nicols 4f2e59fba6 MDL-59569 travis: Remove haveged 2017-07-19 12:22:26 +08:00
Stephen Vickers dad0b29a9c MDL-59485 mod_lti: Add missing capabilities
Capabilities missing which should allow Moodle to pass IMS certification
for LTI 2.0
2017-07-18 10:58:44 +01:00
Dan Poltawski e28350a3ad Merge branch 'MDL-59255-MOODLE_32_STABLE' of github.com:lucisgit/moodle into MOODLE_32_STABLE 2017-07-18 10:54:07 +01:00
Marina Glancy a2a9067174 MDL-59255 media: support rtmp:// in URLs 2017-07-18 10:28:19 +01:00
David Monllao 849895e2ad Merge branch 'wip-MDL-39471-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-07-18 10:49:33 +02:00
Dan Poltawski 09c63a0cb4 Merge branch 'm32_MDL-59109_Backup_Missing_AutoCommit' of https://github.com/scara/moodle into MOODLE_32_STABLE 2017-07-18 09:45:38 +01:00
David Monllao 7ea1012da8 Merge branch 'MDL-57991-m32' of https://github.com/micaherne/moodle into MOODLE_32_STABLE 2017-07-18 09:40:36 +02:00
David Monllao 1eabeab91c Merge branch 'wip-MDL-58362-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-07-18 09:08:58 +02:00
Marina Glancy b048026672 MDL-38129 gradeexport: custom profile fields case problem
Do not use custom pfofile field name as a field alias in DB query, use field id instead.
DML lowercases all column aliases and fields with uppercase letters no longer match.
2017-07-18 11:06:28 +08:00
David Monllao 7b735c2537 MDL-59411 course: Fix unavailable typo 2017-07-17 16:40:54 +02:00
David Monllao 6f90ebe723 Merge branch 'wip-MDL-59411-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-07-17 15:48:28 +02:00
David Monllao a1fbd17805 Merge branch 'MDL-59527-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-07-17 14:08:36 +02:00
Dan Poltawski 46fdac233f Merge branch 'm32_MDL-58119_Add_Cache_Control_Immutable_Support' of https://github.com/scara/moodle into MOODLE_32_STABLE 2017-07-17 11:46:39 +01:00
Alexander Bias b539369338 MDL-58174 themes: Make build_action_menu_from_navigation() protected 2017-07-17 11:16:08 +02:00
David Monllao a419a8c997 Merge branch 'wip-MDL-59377-32-3' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-07-17 11:05:42 +02:00
David Monllao 5ed5e269c3 Merge branch 'MDL-59068-32' of git://github.com/dpalou/moodle into MOODLE_32_STABLE 2017-07-17 10:10:09 +02:00
Dan Poltawski 14356a747d Merge branch 'wip-MDL-57649-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-07-17 09:01:09 +01:00
David Monllao 0e314c3d57 Merge branch 'MDL-54607-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-07-17 09:32:20 +02:00
David Monllao e788c61ef1 Merge branch 'wip-MDL-55912-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-07-17 09:09:16 +02:00
Marina Glancy f7b3577b49 MDL-59377 mod_label: set showdescription to be always 1 2017-07-17 13:44:36 +08:00
Marina Glancy e7d88a04ff MDL-59377 course: when module intro is visible display embedded files
Even when course module is not available the intro text can still be visible on the
course page. In this case the availability restriction is displayed to the student
but link to the activity is not available
2017-07-17 13:44:30 +08:00
Andrew Nicols 5d3bf18f21 Merge branch 'mdl55979-moodle32' of https://github.com/tlock/moodle into MOODLE_32_STABLE 2017-07-17 12:29:44 +08:00
Andrew Nicols 98f10b0102 Merge branch 'MDL-59371-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-07-17 10:24:37 +08:00
Adrian Greeve d6dfe368d2 MDL-39471 mod_assign: Comment visibility in blind marking.
Students can now see the identity of anyone making comments.
Markers on the otherhand can only see the identity of themselves
when making comments.
2017-07-17 09:26:50 +08:00
Adrian Greeve bbd50f0350 MDL-55912 mod_assign: Set grader details to the correct user. 2017-07-17 09:23:22 +08:00
Adrian Greeve 8782b691a5 MDL-57649 mod_lesson: Delete answer files correctly.
The files associated with answers and responses were
not being deleted due to the fact that the wrong itemid
was being used.
2017-07-17 09:19:00 +08:00
AMOS bot ad06286d06 Automatically generated installer lang files 2017-07-17 00:06:58 +08:00
Matteo Scaramuccia 49950dcb9c MDL-58119 files: Reviewed lifetime value 2017-07-15 00:18:48 +02:00
Matteo Scaramuccia 2168357af1 MDL-58119 files: Use immutable Cache-Control extension. 2017-07-15 00:18:48 +02:00
Matteo Scaramuccia bcaee8da27 MDL-58119 files: Used if-then instead of ternary operators 2017-07-15 00:18:48 +02:00
Matteo Scaramuccia a81049f6d4 MDL-58119 files: Let send_stored_file() rely on send_file(). 2017-07-15 00:18:48 +02:00
Matteo Scaramuccia afc5de4613 MDL-59109 scorm: Save autocommit setting in the backup. 2017-07-15 00:13:55 +02:00
Dan Poltawski bc60c1a2eb weekly release 3.2.4+ 2017-07-14 11:46:47 +01:00
Dan Poltawski 47ff6a3cb3 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-07-14 11:46:46 +01:00
Damyon Wiese 69f7abf28b MDL-59527 forms: Race cond with ajax autocomplete
Sometimes (rarely) the auto complete will show "No suggestions" when there are valid suggestions.
2017-07-14 12:44:50 +08:00
Ankit Agarwal 50769c72ad MDL-54607 calendar: Export 0 duration events properly
Thanks to Paul Prencis for initial suggestion of this patch
2017-07-14 09:36:11 +05:30
Ankit Agarwal bf4f34f276 MDL-54607 calendar: Update benu lib to allow for instantaneous events 2017-07-14 09:36:11 +05:30
Simey Lameze 2abb0ed3a1 MDL-59371 gradereport_overview: allow auth user role to view report 2017-07-12 17:58:00 +08:00
Simey Lameze 97663c81c9 MDL-59371 gradereport_overview: add missing course id to url 2017-07-12 14:33:03 +08:00
Andrew Nicols f3a6c1d383 MDL-59431 requirejs: Prioritise errors 2017-07-12 10:06:36 +08:00
Andrew Nicols b4ebecb7d7 MDL-59431 requirejs: Correct failed JS check 2017-07-12 10:06:36 +08:00
Eloy Lafuente (stronk7) 3336effb72 MDL-56629 dataformat_html: Adding UTF-8 charset
Also adding the HEAD tag which was missing.

(credit goes to Frédéric Massart - FMCorz, thanks!)
2017-07-11 13:55:04 +02:00
Eloy Lafuente (stronk7) 3b5086345e Merge branch 'MDL-54965-32' of git://github.com/tobiasreischmann/moodle into MOODLE_32_STABLE 2017-07-11 13:41:50 +02:00
David Monllao bb245a5462 Merge branch 'wip-MDL-59363-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-07-11 12:37:26 +02:00
David Monllao 8a1518fe54 Merge branch 'MDL-59431_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-07-11 12:05:53 +02:00
David Monllao 625ec8107e Merge branch 'wip-MDL-59441-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-07-11 11:41:24 +02:00
Eloy Lafuente (stronk7) 2a5e99e1fa Merge branch 'MDL-57432-32' of git://github.com/danpoltawski/moodle into MOODLE_32_STABLE 2017-07-11 10:19:35 +02:00
Stephen Vickers 6d114ec627 MDL-59490 mod_lti: Prevent text wrapping
Update html_to_text method calls with a width of zero.
2017-07-10 17:29:23 +01:00
AMOS bot 23d8296f6a Automatically generated installer lang files 2017-07-11 00:06:48 +08:00
Dan Poltawski 807a0908fa Merge branch 'wip-MDL-40408-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-07-10 14:36:54 +01:00
David Monllao e635e8d6fd Merge branch 'MDL-52501-m32' of https://github.com/NeillM/moodle into MOODLE_32_STABLE 2017-07-10 14:39:07 +02:00
Dan Poltawski 56a9e58990 Merge branch 'MDL-59317-m32' of https://github.com/NeillM/moodle into MOODLE_32_STABLE 2017-07-10 13:28:24 +01:00
David Monllao baf675f111 Merge branch 'MDL-58332-32' of git://github.com/ryanwyllie/moodle into MOODLE_32_STABLE 2017-07-10 14:22:22 +02:00
Tobias Reischmann 038a740720 MDL-54965 mod_data: removed unused code in display_add_field()
Since the refactoring towards using the filepicker for file and picture
fields there are several variables, which are set but never read. Thus,
I removed them.
2017-07-10 14:15:31 +02:00
Tobias Reischmann 016c8adf69 MDL-54965 mod_data: Init draft area for empty file/pic fields
When a file or picture field was added with existing records, these
records could not be saved, since the draft area was not created
properly.

Co-authored-by: Jérôme Mouneyrac <mouneyrac>
2017-07-10 14:15:31 +02:00
Dan Poltawski 8543b83fce Merge branch 'wip-MDL-46495-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-07-10 13:15:22 +01:00
Michael Aherne 6eaed6226e MDL-57991 media: Prevent mediaplayer taking up too much space 2017-07-10 10:23:40 +01:00
Dan Poltawski 379e9f845c MDL-57432 environment: raise Moodle requirement
Due to Moodle 2.7 and Moodle 3.4 not having a common compatible php version
between them to upgrade from Moodle 3.4 from Moodle 2.7 you'll need to upgrade
to a higher version first or upgrade php at the same time as upgrade,
this encourages the former.
2017-07-10 09:22:03 +01:00
Dan Poltawski 342c1613e3 MDL-57432 environment: raise Moodle 3.4 requirements
1) PHP minimum version raised to 7.0.0
2) Intl extension raised from optional to required
2017-07-10 09:22:03 +01:00
Dan Poltawski cc417612da MDL-57432 environment: 3.4 base information
This is a direct copy of the 3.3 branch to
have changes under control easier in next commits.
2017-07-10 09:22:03 +01:00
Ryan Wyllie 118f7f0b8c MDL-58332 message: remove concat in get_popup_notifications sql
Removed the concat to generate the uniqueid field for the popup
notifications data. The concat can't be used directly in the SQL because
the syntax changes between databases. The sql_concat helper can't be
used because it assumes all values are database columns (which they
aren't in this case).

Instead I've just removed the uniqueid field because it isn't required
for the union all to work and the field isn't being used by anything.
This should fixed the compatibility issues between databases.
2017-07-10 02:09:02 +00:00
Eloy Lafuente (stronk7) 23360fd95b Moodle release 3.2.4 2017-07-08 20:43:34 +02:00
AMOS bot 0ed1c5d259 Automatically generated installer lang files 2017-07-08 00:16:24 +08:00
Jake Dallimore 28f52bc329 weekly release 3.2.3+ 2017-07-07 12:10:16 +08:00
Jake Dallimore 8c18772edc Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-07-07 12:10:14 +08:00
AMOS bot dd819dbb88 Automatically generated installer lang files 2017-07-07 00:06:39 +08:00
Neill Magill 6ab7d00049 MDL-52501 assign: Fix group submissions without submission record
Based on work by Tim Lock <tim.lock@blackboard.com>

While upgrading to Moodle 2.8 or above it is possible for it to fail if
the site has multiple graded attempts for a user without an associated
submission record. This caused the upgrade to violate the databases
unique key rules.

This same issue could apply to a backup that was created of an
assignment that had this issue, when it is restored into Moodle 2.8 or
later.

This change adds the attempt number from the grade table into the query
that is inserting the new submission record (thanks to Tim). It also
moves the insert query before the latest flag is set on submission
records to ensure that only one has it, without this it is possible that
multiple submission records would be marked as the latest after an
upgrade or restore.
2017-07-06 15:30:22 +01:00
Neill Magill 4f20f1eb43 MDL-59317 message: Message page taking long time to load
The OR clause in these queries used different sets of columns to select
userid which meant that the indexes that included user id could not be
used.

This change splits the query so that each individual part can use one of
the indexes that includes a userid which speeds them up considerably.
2017-07-06 15:30:06 +01:00
Simey Lameze 4c48d88c46 MDL-59456 auth_cas: patch phpCAS auth bypass vulnerability 2017-07-06 09:33:27 +01:00
Jun Pataleta af16b393ea MDL-58651 logstore_database: Set dbhandlesoptions in test page 2017-07-05 23:04:51 +08:00
Dan Poltawski 2dc0dc6293 MDL-57021 passwords: only use unmask field with shared secrets
When a user is entering a password which isn't returned back to them
then its not correct to use the unmask element - this element was
designed for places where we are storing shared secrets.
2017-07-05 12:25:41 +02:00
Eloy Lafuente (stronk7) a3aa1600de Merge branch 'MDL-59398-32-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-07-05 11:52:42 +02:00
Eloy Lafuente (stronk7) fb629ce56a Merge branch 'MDL-59294-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-07-05 09:44:54 +02:00
Eloy Lafuente (stronk7) 33f31a12d4 Merge branch 'MDL-58286-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-07-05 09:40:55 +02:00
Helen Foster 92033f7e9d MDL-59398 lang: Merge English strings from the en_fix language pack 2017-07-05 09:34:14 +02:00
John Okely 8e28bc402b MDL-58286 enrol_ldap: Pass connection to ldap_paged_results_supported
Thanks to Bianco Veigel for the original patch.
2017-07-05 09:50:10 +08:00
Eloy Lafuente (stronk7) 1cee1602be Merge branch 'MDL-58651_32' of git://github.com/aolley/moodle into MOODLE_32_STABLE 2017-07-05 01:23:39 +02:00
Dani Palou a939a4757f MDL-59068 lesson: Revert MDL-54849
MDL-54859 made the 'wrong jump' setting useless, since clicking 'No' always sends the user to the next page.
2017-07-04 10:34:40 +02:00
Jake Dallimore bea116e2ff Merge branch 'MDL-59380-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-07-04 16:29:36 +08:00
Marina Glancy 822d05775a MDL-59441 calendar: unittest fix for modules without generators 2017-07-04 11:18:33 +08:00
Marina Glancy 106eb4921a MDL-59409 admin: set admin user in unittest 2017-07-04 11:05:24 +08:00
Ankit Agarwal bc1d916868 MDL-56565 forum: Add sitename as heading when there is nothing to display 2017-07-04 10:11:39 +08:00
Ankit Agarwal a053131595 MDL-56565 forum: Make sure userfullname is not disclosed 2017-07-04 10:11:39 +08:00
Jake Dallimore f3b9685ad0 MDL-56565 navigation: fix for cap checks in nav and context header
Fix to:
- Make sure we properly check both user and course contexts in
the load_for_user function in navigation lib and user the
user_can_view_profile function for same-course access checks.
- Use user_can_view_profile in the renderer's context_header to
properly decide whether a user can view another user's picture
and messaging options in the page header.
2017-07-04 10:11:39 +08:00
Jake Dallimore 93e09909ab MDL-56565 navigation: fix user details disclosure in nav tree
Fixes a bug in which a user's full name might be disclosed via the
nav tree. Nav generation now checks the current user's access to the
user before adding the node, else adds a dummy node.
2017-07-04 10:11:39 +08:00
Jake Dallimore f373c08314 MDL-56565 core: fix user details disclosure in page context header
Fixes a bug with context_header function in which user details were
displayed regardless of the current user's capabilities.
2017-07-04 10:11:39 +08:00
Marina Glancy dacac4d10b MDL-59409 admin: check access to every setting in category 2017-07-04 10:03:42 +08:00
Tim Hunt e526050151 MDL-59431 requirejs: better reporting if a JS file cannot be loaded 2017-06-30 17:26:14 +01:00
Marina Glancy 57e71a0f92 MDL-46495 tool_uploadcourse: set enablecompletion to default 2017-06-30 10:26:13 +08:00
Jake Dallimore 35d1b3da7a weekly release 3.2.3+ 2017-06-29 16:23:47 +08:00
Jake Dallimore a52742dea7 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-06-29 16:23:46 +08:00
Marina Glancy b235d79cff MDL-59411 course: display access restriction in access error message 2017-06-29 13:47:47 +08:00
Jun Pataleta ffd642a654 MDL-59294 block_login: Make display of ID provider buttons consistent 2017-06-29 09:36:56 +08:00
Marina Glancy 9995cdb506 MDL-58362 registration: correctly retrieve registration values 2017-06-29 08:32:03 +08:00
Mark Nelson dbbbf02dc0 MDL-56046 mod_quiz: do not close the sheet twice 2017-06-28 14:15:36 +08:00
Jun Pataleta e29ea1b2c9 MDL-59294 theme_bootstrapbase: Fix display of ID provider buttons 2017-06-28 13:39:02 +08:00
Jake Dallimore 74accbdd85 Merge branch 'wip-MDL-59308-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-06-28 13:10:16 +08:00
Adam Olley eea5900c13 MDL-58651 logstore_database: Add ability to not send database options
In the core dml:
PostgreSQL connections now use advanced options to reduce connection overhead.
These options are not compatible with some connection poolers. The
dbhandlesoptions parameter has been added to allow the database to configure
the required defaults.

This item adds a setting to the logstore_database plugin to let you set the
same flag for your destination database - without it you won't be able to ship
logs to a postgresql database with a pgbouncer frontend.
2017-06-28 13:20:36 +09:30
Marina Glancy c204ffed0d MDL-59363 mod_workshop: user object must have alternative name fields 2017-06-28 11:37:17 +08:00
Marina Glancy 01005ff69a MDL-59308 calendar: pass module context when known
this will protect us from exceptions when context for removed instance can not be retrieved
2017-06-28 11:18:03 +08:00
Eloy Lafuente (stronk7) ee3ba0c3f8 Merge branch 'MDL-57809-32-progressbar' of https://github.com/roperto/moodle into MOODLE_32_STABLE 2017-06-27 20:17:55 +02:00
Eloy Lafuente (stronk7) 5bbc58a7fb Merge branch 'wip-MDL-59136-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-06-27 18:09:50 +02:00
David Monllao c6a447f1b7 Merge branch 'MDL-32151-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-06-27 17:47:47 +02:00
Eloy Lafuente (stronk7) 2584ce25c7 Merge branch 'MDL-59362_32' of git://github.com/markn86/moodle into MOODLE_32_STABLE 2017-06-27 17:22:11 +02:00
Danny Jung 2dd87cb37a MDL-59073 Workshop: Prevent submission without content or file 2017-06-27 17:06:02 +02:00
David Monllao 53456587f6 Merge branch 'MDL-59158-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-06-27 16:40:07 +02:00
David Monllao b9874d0c13 Merge branch 'MDL-57927-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-06-27 15:55:40 +02:00
Eloy Lafuente (stronk7) bf58adf836 Merge branch 'MDL-58844-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-06-27 11:42:22 +02:00
Eloy Lafuente (stronk7) afeb42ed9e Merge branch 'MDL-59296-32' of git://github.com/crazyserver/moodle into MOODLE_32_STABLE 2017-06-27 11:40:10 +02:00
Jake Dallimore 52cabc8f66 Merge branch 'MDL-59312-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-06-27 15:10:41 +08:00
Damyon Wiese 4197baf775 MDL-59380 fragments: Include js from templates
Mustache templates containing {{#js}} blocks are not returned via the
fragments API. This is because the requirements manager is assigned when the renderer is created
and not updated by the call to start collecting page requirements.
2017-06-27 13:35:40 +08:00
Jake Dallimore ba9f218e17 Merge branch 'MDL-56046_32-fix' of git://github.com/markn86/moodle into MOODLE_32_STABLE 2017-06-27 13:18:50 +08:00
Mark Nelson 32dc9a45d6 MDL-56046 dataformat: minor changes to PHPDocs and upgrade.txt 2017-06-27 11:26:35 +08:00
Andrew Nicols 8c696ccafc MDL-58844 testing: Move to GCE build infrastructure
Switch back to GCE build infrastructure for Travis Builds and move
databases to RAM Disk.

This also adds a software entropy generator (haveged) which is
recommended when using a RAMdisk for the database.
2017-06-27 09:39:20 +08:00
Eloy Lafuente (stronk7) 0bfbdaef20 Merge branch 'MDL-56046_32' of git://github.com/markn86/moodle into MOODLE_32_STABLE 2017-06-27 02:43:00 +02:00
Eloy Lafuente (stronk7) 55fc1104d5 Merge branch 'MDL-40818-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-06-27 01:50:48 +02:00
Eloy Lafuente (stronk7) 7032ff37b7 Merge branch 'MDL-59295-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-06-27 00:54:25 +02:00
Eloy Lafuente (stronk7) 1d0867ae48 Merge branch 'mdl58813-moodle32' of https://github.com/tlock/moodle into MOODLE_32_STABLE 2017-06-26 19:38:51 +02:00
Mark Nelson 4e50a38018 MDL-56046 core: enable multiple sheets for flexible table 2017-06-26 13:55:21 +08:00
Mark Nelson a54703d88f MDL-56046 dataformat: added related information to upgrade.txt 2017-06-26 13:55:21 +08:00
Mark Nelson 4ba0709401 MDL-56046 dataformat_*: convert core plugins 2017-06-26 13:28:02 +08:00
Mark Nelson f72bc10fe3 MDL-56046 core: convert download_as_dataformat to use new API 2017-06-26 13:28:02 +08:00
Mark Nelson b15859b879 MDL-56046 core_dataformat: added functions to support multiple sheets
Also removed write_header() and write_footer(). The reason for this
is because in core we want to know if the format being used supports
multiple sheets. To do this, and ensure we do not break third-party
dataformat plugins, we are using method_exist(). If write_header()
and write_footer() remain in the base class then this will always
be true.
2017-06-26 13:19:09 +08:00
Mark Nelson ed248331a4 MDL-59362 core: ensure we use 'new' when throwing exceptions 2017-06-26 13:10:43 +08:00
Marina Glancy 5b8ca7ac93 MDL-59136 roles: avoid double escaping in role names 2017-06-26 11:57:49 +08:00
Jake Dallimore 0efb93bbe9 Merge branch 'MDL-49484-moodle32' of github.com:jebarviabb/moodle into MOODLE_32_STABLE 2017-06-26 10:52:49 +08:00
Josh Ebarvia f3008f556c MDL-49484 mod_lesson: Fix lesson page headers when editing 2017-06-24 05:23:16 +09:30
AMOS bot aac5a4f103 Merge branch 'MOODLE_32_STABLE' into install_32_STABLE 2017-06-24 00:09:03 +08:00
Pau Ferrer Ocaña e5881ad801 MDL-59296 data: Fix latlong field search 2017-06-23 09:15:31 +02:00
Andrew Nicols c244743775 MDL-59312 js: Improve display of exception stacktrace 2017-06-23 10:50:11 +08:00
John Okely deb442a293 MDL-59312 notification: Normalise backtrace/stacktrace 2017-06-23 10:50:11 +08:00
Andrew Nicols 93a935049e MDL-59312 js: Add exception on AJAX error 2017-06-23 10:50:11 +08:00
Jun Pataleta f2fb8f5a7f MDL-32151 group: Use appropriate error langstring error key 2017-06-23 10:28:13 +08:00
Jun Pataleta 3a5ae742f1 MDL-32151 grade: Use appropriate error langstring error key 2017-06-23 10:28:13 +08:00
Jun Pataleta 017d8f1aec MDL-59158 theme_boost: Remove auto width and height for user picture 2017-06-23 10:13:00 +08:00
Jun Pataleta 95e1ac08fe MDL-40818 calendar: Require login to calendar pages
* Make sure that the course ID being passed points to an existing course
* Require user to login before granting access to calendar pages.
2017-06-23 09:21:05 +08:00
Daniel Thee Roperto ef43566698 MDL-57809 weblib: Added missing NO_OUTPUT_BUFFERING directive. 2017-06-23 09:42:37 +10:00
Daniel Thee Roperto d33f7642dd MDL-57809 weblib: Added opening disclaimer and file-level phpdocs. 2017-06-23 09:42:37 +10:00
Daniel Thee Roperto a9a72025b6 MDL-57809 weblib: Progress bar and output buffer - added debugging
This fix makes Moodle show a debbuging message if using progressbar without defining NO_OUTPUT_BUFFERING.
2017-06-23 09:42:37 +10:00
AMOS bot 222189cc75 Automatically generated installer lang files 2017-06-23 00:08:05 +08:00
Dan Poltawski 62c58d22be weekly release 3.2.3+ 2017-06-22 15:40:47 +01:00
Simey Lameze b962ac2439 MDL-59295 tool_lp: remove useless ng-label attribute 2017-06-22 15:49:46 +08:00
Tim Lock c2f08942d9 MDL-58813 webservice: create_courses() initialise all section records 2017-06-22 11:13:38 +09:30
Eloy Lafuente (stronk7) 9072b59c0e Merge branch 'MDL-59217-32' of git://github.com/ryanwyllie/moodle into MOODLE_32_STABLE 2017-06-20 20:40:45 +02:00
Eloy Lafuente (stronk7) f86bb360b5 Merge branch 'MDL-59269-32-languninstall' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-06-20 17:57:15 +02:00
Mathieu Petit-Clair 90e86c7568 MDL-58952 admin: use valid default for language selection dropdown. 2017-06-20 11:31:55 +01:00
Dan Poltawski f730eb2a81 Merge branch 'MDL-59005-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-06-20 09:52:46 +01:00
Dan Poltawski 485decb3a2 Merge branch 'MDL-58472-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-06-20 09:36:53 +01:00
Jun Pataleta b95a012124 Merge branch 'MDL-57770-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-06-20 16:28:31 +08:00
Jake Dallimore f7e3be1bbb Merge branch 'wip-MDL-58729-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-06-20 15:19:13 +08:00
Simey Lameze 5a5efa8bd9 MDL-57927 tool_lp: make both buttons consistent 2017-06-20 08:50:32 +08:00
Dan Poltawski 079c73c98d Merge branch 'MDL-59048_32' of https://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-06-19 15:43:19 +01:00
Dan Poltawski 3fb4b3a9ed Merge branch 'MDL-59173-32' of git://github.com/tobiasreischmann/moodle into MOODLE_32_STABLE 2017-06-19 12:27:45 +01:00
Dan Poltawski c7d6a0e356 Merge branch 'wip-MDL-51917-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-06-19 12:21:50 +01:00
Dan Poltawski 8b57dd0768 Merge branch 'MDL-46418-32-hiddenrepos' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-06-19 10:33:34 +01:00
Jun Pataleta 97d966df08 Merge branch 'MDL-44961-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-06-19 16:25:18 +08:00
Jun Pataleta fe67ec46da Merge branch 'MDL-58310-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-06-19 13:26:46 +08:00
John Okely 285e7e5eb3 MDL-58310 ajax: suppress errors upon page unload 2017-06-19 11:45:45 +08:00
John Okely 53e3825619 MDL-58310 message: No longer need to supress errors from messaging 2017-06-19 11:45:45 +08:00
Vladimir Zhirov 90156e427c MDL-59005 resource: fixed zip extraction for filenames in CP-1251/CP-866 2017-06-19 08:51:19 +08:00
David Mudrák 5074849703 MDL-59269 lang: Fix ability to uninstall certain language packs
In the issue MDL-39319 (6ddf92c77), the ability to uninstall multiple
language packs at once was added. By a mistake, the PARAM_ALPHAEXT was
used as paramater type for the dash-separated list of language packs to
be uninstalled. Language packs with a number in the name (such as
en_us_k12) do not pass the ALPHAEXT cleaning.

This patch changes the parameter cleaning to PARAM_SAFEPATH which is
more appropriate for the given scenario as language code themselves must
be SAFEDIRs.
2017-06-16 14:15:31 +02:00
Tobias Reischmann c5a8568799 MDL-59173 tablelib.php: changed default of $params in set_sql to array()
Default of $params = null leads to a problem in query_db().
There this value is used in array_merge, which can not handle null
values. If null is passed for one of the params the outcome will be null
independent of the value of the second param!
2017-06-16 10:27:21 +02:00
Jake Dallimore ab7056032d weekly release 3.2.3+ 2017-06-16 13:29:36 +08:00
David Mudrák 0d063c69ac MDL-46418 repositories: Fix how enabled repositories are populated
Repository instances are stored in the 'repository' table. Repositories
in the table are either 'Enabled and visible' or 'Enabled but hidden'.
Hidden repositories still serve their files, but are not visible in the
filepicker UI. Disabling a repository instance removes its record from
the table.

In the original implementation of the plugin manager (see b9934a17), the
method plugintype_repository::get_enabled_repositories() correctly
returned all records from the repository table. Then as a part of the
bigger refactoring in MDL-41437, the commit bde002b8 replaced the
original method with the new get_enabled_plugins() one which started to
return visible repositories only.

As a consequence, the admin tree stopped populating setting page nodes
for hidden repository instances. So attempting to visit their setting
page threw a section error. Credit goes to Ike Quigley for debugging and
tracing this down.

This patch fixes the way how the list of enabled repositories is
populated by the plugin manager so that both visible and hidden
repositories are returned again. This does not affect the filepicker
itself as it is using its own methods for obtaining the list.
2017-06-15 21:22:48 +02:00
Simey Lameze ac6ab5b8d2 MDL-57770 tool_lp: style fixes for the competency rule dialog 2017-06-15 15:39:17 +08:00
Ankit Agarwal 74fbdebd0d MDL-59217 restore: Check for userride only for activity events 2017-06-15 06:02:38 +00:00
Mark Nelson e523626603 MDL-59140 core: apply limit only on courses to be shown in specific nav
There can be a different number of courses displayed in the
'Navigation' block and in the 'Flat' navigation. This patch
decides what courses we want to display on each, then
applies the 'navcourselimit' setting individually.
2017-06-15 13:36:35 +08:00
Ankit Agarwal c33e03ae95 MDL-44961 logs: Keep log dates constant during restore 2017-06-14 15:21:36 +05:30
Jake Dallimore b3f3c3c395 Merge branch 'MDL-59142-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-06-14 11:40:13 +08:00
Marina Glancy d2a5e259b7 MDL-40408 mod_data: skip metadata fields during import 2017-06-14 11:32:14 +08:00
Dan Poltawski 072c0b4196 Merge branch 'MDL-59171-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-06-13 14:40:47 +01:00
Dan Poltawski 638aa54cbb Merge branch 'MDL-59140_32' of git://github.com/markn86/moodle into MOODLE_32_STABLE 2017-06-13 13:23:39 +01:00
Mark Nelson 8d9e621f2c MDL-59140 core: upgrade 'navcourselimit' if set to old default value 2017-06-13 18:27:04 +08:00
Mark Nelson bb3956eb5c MDL-59140 core: limit the number of courses shown in the navigation
If the user is enrolled in more courses than the limit then a 'More...'
link is displayed which takes the user to the course/index.php page.
2017-06-13 18:27:04 +08:00
Mark Nelson a8fc3a33ab MDL-59140 core: changes to the 'navcourselimit' setting
Changed the default and description.
2017-06-13 18:23:52 +08:00
Eloy Lafuente (stronk7) 2c6f3befeb Merge branch 'wip-MDL-58523-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-06-13 11:21:48 +02:00
Jun Pataleta d11850101e Merge branch 'MDL-58991-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-06-14 16:56:36 +08:00
Dan Poltawski 531c1ec0be Merge branch 'MDL-41426_32-block-completionstatus-spaces' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-06-13 09:53:56 +01:00
Eloy Lafuente (stronk7) 8ae8ed4aca MDL-46322 database: alias sort fields to avoid ambiguous naming 2017-06-13 09:17:08 +01:00
Jake Dallimore 1faba07075 Merge branch 'MDL-58136-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-06-13 15:55:45 +08:00
Damyon Wiese 587b99609d MDL-58136 course: Remove lines from unit test
Remove unused vars and logic from the unit test for classifying a course.
2017-06-13 15:08:18 +08:00
Marina Glancy c9192ffccb MDL-51917 course completion: order activities in reports
Thanks to Nick Phillips for initial patch
2017-06-13 14:49:24 +08:00
Marina Glancy 4290182491 MDL-58523 mod_feedback: deleting response should reset completion 2017-06-13 14:36:35 +08:00
Jake Dallimore cb1c0ae4dc Merge branch 'MDL-51691-moodle32' of https://github.com/jebarviabb/moodle into MOODLE_32_STABLE 2017-06-13 10:35:37 +08:00
Damyon Wiese ffc7fda945 MDL-58136 navigation: Ensure we have all course fields
To properly classify courses we need the start/end dates etc.
2017-06-13 10:10:22 +08:00
Marcus Green a9ba142326 MDL-58248 theme_boost: label/span for sidepanel expand button
Add string "Side panel" to make the purpose of
trigram/hamburger icon at top left clearer, particularly
when using screen readers e.g. Jaws/NVDA.
Currently it reads out only "expand"
2017-06-13 09:51:07 +08:00
Simey Lameze 59527f3e7a MDL-59142 core_theme: cache post-processed css
Thanks Cameron Ball for the base patch
2017-06-13 09:39:56 +08:00
Damyon Wiese 8122557661 MDL-58472 videojs: Force manual initialise
If we let videojs auto-init the video/audio tags present in the page - we cannot guarantee that the
youtube library will be loaded by the time video.js is processing the tag.

Video.js uses the presence of a data-setup attibute to signal that it should auto-init this tag, so
we have to rename our config attribute to something else.
2017-06-13 09:13:07 +08:00
Eloy Lafuente (stronk7) ae84db35c7 Merge branch 'MDL-40015-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-06-13 01:23:52 +02:00
Eloy Lafuente (stronk7) ab8b6fae1a Merge branch 'mdl58161-moodle32' of https://github.com/tlock/moodle into MOODLE_32_STABLE 2017-06-13 01:22:09 +02:00
Josh Ebarvia b3ca553f3a MDL-51691 assignsubmission_feedback: Fix delete comments 2017-06-13 08:39:08 +09:30
Tim Lock 7e31bb6dc2 MDL-58161 user: tests: user_can_view_profile fails under certain cases 2017-06-13 08:09:14 +09:30
Eloy Lafuente (stronk7) 5e39900691 Merge branch 'MDL-59112-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-06-12 14:39:22 +02:00
Dan Poltawski a4f5cdddcf Merge branch 'mdl46322-moodle32' of https://github.com/AndresMelo/moodle into MOODLE_32_STABLE 2017-06-12 10:29:53 +01:00
Damyon Wiese 4d26fcd737 MDL-58136 cache: Add a course completion cache
The last change added 1 db read per course per page which is not OK. Add a cache to compensate.
2017-06-12 16:11:52 +08:00
Damyon Wiese 11127354db MDL-58136 boost: Limit courses in flatnav
Only show "in-progress" courses in the boost flat navigation (as per the myoverview block).
2017-06-12 16:09:56 +08:00
Adrian Greeve f751b97393 MDL-58729 database: Improve performance of CLI tool.
Imporve the speed with which mysql_collation converts to
a different collation.
2017-06-12 14:15:34 +08:00
Jake Dallimore 9265a5db56 Merge branch 'MDL-57103-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-06-12 13:59:57 +08:00
Jun Pataleta f5942f3e6f Merge branch 'MDL-59154-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-06-12 13:45:33 +08:00
John Okely 3ad8f33235 MDL-57103 lib: Force ajax renderer for all ajax fatal errors 2017-06-12 10:37:37 +08:00
Jun Pataleta abeb033dfb MDL-59171 mod_lti: Set mod_lti_view_lti's type to 'read' 2017-06-12 08:34:52 +08:00
Tim Lock bb4b394482 MDL-55979 quiz: Fix error moving question from last page
When moving the last question from the last page to the last slot of the previous page would show the error in the error
log but move successfully.
2017-06-09 08:35:38 +09:30
Luca Bösch 98b955d665 MDL-41426 block: Whitespace lacking in completion status block 2017-06-08 19:10:21 +02:00
Dan Poltawski 7624f86fb2 weekly release 3.2.3+ 2017-06-08 12:16:21 +01:00
Dan Poltawski 7f4835a7da Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-06-08 12:16:20 +01:00
Juan Leyva ba76815aaf MDL-40015 core_course: Fix description of duplicate_course WS
It said that the duplication didn’t include user data, but that’s not
true since there is a parameter to include it.
2017-06-08 10:20:46 +01:00
Juan Leyva 70dcc1e39a MDL-59112 theme_clean: Always return expected moodle_url
The function was returned some times a moodle_url object and another
times just a string with a relative URL.
2017-06-08 09:40:47 +01:00
Andrew Nicols 25ffa9a67f MDL-59154 theme: Lock for all caching builds
The previous behaviour was to only lock when in theme designer mode.
As a result, when generating the theme for after a reset, each new
client was starting the generation afresh and no locking was taking
place at all.
2017-06-08 12:05:39 +08:00
Dan Poltawski 99864cdf74 Merge branch 'MDL-59101-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-06-07 16:26:21 +01:00
Jun Pataleta d356128f05 MDL-59101 calendar: Properly calculate expected until date 2017-06-07 23:12:52 +08:00
Dan Poltawski c33c78a33c Merge branch 'MDL-58658_32' of https://github.com/sk-unikent/moodle into MOODLE_32_STABLE 2017-06-06 10:01:44 +01:00
Dan Poltawski 3ec562a322 Merge branch 'MDL-59086_32' of git://github.com/markn86/moodle into MOODLE_32_STABLE 2017-06-06 08:44:52 +01:00
Simey Lameze 07e6a3c6c1 MDL-58991 report_stats: use same date handling on chart rendering
This commmit fixes applies the same date handling used on stats
table render to the charts render.
2017-06-06 13:56:04 +08:00
Jun Pataleta 5ec875b281 Merge branch 'MDL-58646-32' of git://github.com/danpoltawski/moodle into MOODLE_32_STABLE 2017-06-06 12:24:46 +08:00
Jake Dallimore a202546fd3 Merge branch 'MDL-58900-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-06-06 11:40:12 +08:00
Eloy Lafuente (stronk7) 589b4c0360 Merge branch 'MDL-58826_32_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_32_STABLE 2017-06-06 01:45:17 +02:00
Dan Poltawski 5f6cf92f97 Merge branch 'MDL-59080_M32' of git://github.com/lazydaisy/moodle into MOODLE_32_STABLE 2017-06-05 12:49:48 +01:00
Mark Johnson 43391de3e2 MDL-58826 theme_boost: Prevent fatal errors in action menu behat steps 2017-06-05 09:04:06 +01:00
AMOS bot fbf621bd29 Automatically generated installer lang files 2017-06-04 00:07:23 +08:00
AMOS bot 5a10b55442 Automatically generated installer lang files 2017-06-04 00:07:23 +08:00
AMOS bot 554167b43a Automatically generated installer lang files 2017-06-03 00:07:58 +08:00
Dan Poltawski c90e9381d2 MDL-58646 lib: import latest sabberworm/PHP-CSS-Parser
This version includes a fix[1] contributed by Frédéric Massart investigating
our compilation time issues, which significantly improves the speed of
processing font awesome.

Thanks, Fred!

[1] https://github.com/sabberworm/PHP-CSS-Parser/pull/120
2017-06-02 11:03:51 +01:00
Mary Evans 8ac3e5ea59 MDL-59080 theme_boost: make drawer.scss variables default
--author="Urs Hunkler <urs.hunkler@unodo.de>"
2017-06-02 07:58:43 +01:00
Dan Poltawski 74554368a0 weekly release 3.2.3+ 2017-06-01 09:28:23 +01:00
Dan Poltawski 6f4d9a89d5 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-06-01 09:28:22 +01:00
Jake Dallimore 7fd70c34a0 Merge branch 'MDL-59094-32' of git://github.com/danpoltawski/moodle into MOODLE_32_STABLE 2017-06-01 15:29:15 +08:00
AMOS bot a31c6bc4b9 Automatically generated installer lang files 2017-06-01 00:12:41 +08:00
Dan Poltawski 6160631e28 Merge branch 'MDL-59093-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-05-31 11:09:27 +01:00
Dan Poltawski c82ad7c6e0 MDL-59094 npm: Update shrinkwrap file to npm 5 generated
Starting with npm version 5, npm install will generate a lockfile
(now named package-lock.json) or update the existing npm-shrinkwrap.json

To prevent changes being generated in the codebase when this happens, we
need to commit the version 5 generated shrinkwrap.

This is related to a general overhaul [1] of how npm manages things. But
for our purposes, we the lockfile should be BC to previous versions [2].

Going forward, we need to ensure we generate the lockfile on npm >=5 to
prevent differences from the previously un-versioned lockfile.

[1] http://blog.npmjs.org/post/161081169345/v500
[2] https://github.com/npm/npm/issues/16728#issuecomment-305104149
2017-05-31 10:13:45 +01:00
Jun Pataleta 087ab1e345 MDL-59093 calendar: Use a fixed start day for forever BYMONTH test 2017-05-31 15:02:15 +08:00
Simey Lameze f7c9dd2158 MDL-58900 mod_assign: fix incorrect overrides ordering 2017-05-31 10:51:01 +08:00
Jake Dallimore 984bcd770c Merge branch 'MDL-54887-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-05-31 08:40:43 +08:00
Eloy Lafuente (stronk7) e84d284e65 Merge branch 'MDL-49988_fix_wiki_preview_32_STABLE' of https://github.com/DMaterka/moodle into MOODLE_32_STABLE 2017-05-31 00:30:45 +02:00
Dan Poltawski 352b9b00d6 Merge branch 'MDL-58997_32-group-names-multilang' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-05-30 16:56:23 +01:00
Luca Bösch 2a7bb7a0f8 MDL-58997 calendar: Group names passing multilang filters. 2017-05-30 16:52:07 +02:00
Dan Poltawski 269e1f027e Merge branch 'MDL-49040-moodle32' of https://github.com/jebarviabb/moodle into MOODLE_32_STABLE 2017-05-30 11:42:35 +01:00
Jun Pataleta 48903d67ea Merge branch 'MDL-57313-32-clibootswatch' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-05-30 16:58:15 +08:00
Jun Pataleta 3bfdb64f43 MDL-54887 calendar: PR fixes
* Use the calendar_event::description property and format it using
format_text() on it in order to apply the appropriate filters.
* Then use html_to_text() on it to strip the tags and convert the
description to plain text while converting <br> and <p> tags to
line breaks.
2017-05-30 16:53:57 +08:00
Soon-Systems a42233487e MDL-54887 calendar: Format summary + description of an event for export 2017-05-30 16:53:57 +08:00
Mark Nelson 07da0155a7 MDL-59086 gradereport_grader: style 'Save changes' button 2017-05-30 13:44:15 +08:00
AMOS bot 1a7cf17ed8 Automatically generated installer lang files 2017-05-28 14:07:41 +08:00
David Mudrák 818bc4c9a7 MDL-57313 boost: Fix the CLI utility import-bootswatch.php 2017-05-26 09:48:28 +02:00
Dan Poltawski 8708ea0968 weekly release 3.2.3+ 2017-05-24 19:14:43 +01:00
Dan Poltawski cdffe52b28 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-05-24 19:14:41 +01:00
Tim Hunt 67970b8675 MDL-59048 user tours: avoid white-on-white text in Clean 2017-05-24 17:25:23 +01:00
AMOS bot d979b4614d Automatically generated installer lang files 2017-05-25 00:04:44 +08:00
gthomas2 3aed71750d MDL-58761 behat: Fix regex in i_open_my_profile_in_edit_mode step 2017-05-24 13:57:54 +01:00
Andrew Nicols 85eacc3a31 MDL-58577 stats: Correct groupby when getting report options 2017-05-23 19:46:55 +08:00
Andrew Nicols bfc16e66a5 Merge branch 'MDL-58577_32-statistics-report-header-multilang' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-05-23 19:45:56 +08:00
Luca Bösch 3a8f07f241 MDL-58577 stats: Use multilang with role in header 2017-05-23 11:14:09 +02:00
Jun Pataleta e621a47c48 Merge branch 'MDL-58895-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-05-23 16:54:35 +08:00
Jake Dallimore 4bb9787760 Merge branch 'MDL-58921_32-calculated-question-name-multilang' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-05-23 16:27:06 +08:00
Jun Pataleta 2469a838f1 Merge branch 'MDL-58165-32' of https://github.com/abias/moodle into MOODLE_32_STABLE 2017-05-23 14:47:38 +08:00
Ankit Agarwal c28e5eaee2 MDL-58895 groups: Add bootstrap classes to buttons 2017-05-23 12:05:42 +05:30
Alexander Bias f85f0c80da MDL-58165 navigation: Add node key to private files navigation node 2017-05-23 07:24:11 +02:00
Josh Ebarvia 4643358a5c MDL-49040 gradereport_grader: Fix feedback truncation after & char 2017-05-23 13:04:23 +09:30
AMOS bot 2774649389 Automatically generated installer lang files 2017-05-23 00:05:47 +08:00
Dan Poltawski 18d41005e3 Merge branch 'MDL-58922_32-calculatedmulti-question-name-multilang' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-05-22 10:44:52 +01:00
Luca Bösch a281621189 MDL-58921 questions: Calculated question name passing multilang.
In edit calculated question the question name does pass format_string to process multilang tags.
2017-05-22 11:37:22 +02:00
Luca Bösch ab8fa2ff7a MDL-58922 questions: Calculatedmulti question name passing multilang.
In edit calculatedmulti question the question name does pass format_string to process multilang tags.
2017-05-22 11:32:52 +02:00
David Monllao fb0e1b10fe Merge branch 'MOODLE_32_STABLE-MDL-56973' of https://github.com/fwsl/moodle into MOODLE_32_STABLE 2017-05-22 15:14:19 +08:00
Jake Dallimore 78f7595fd9 Merge branch 'MDL-56617_32-course-cbm-grade-to-pass' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-05-22 14:33:32 +08:00
David Monllao 338097adce Merge branch 'MDL-58986_32' of git://github.com/markn86/moodle into MOODLE_32_STABLE 2017-05-22 12:22:37 +08:00
David Monllao f98e259ddb Merge branch 'MDL-57957_32' of https://github.com/bostelm/moodle into MOODLE_32_STABLE 2017-05-22 10:44:32 +08:00
Luca Bösch 0e106b8332 MDL-56617 mod_quiz: No grade to pass check if CBM used
When certainty-based marking is used, grades can 'exceed' the maximum grade
(because they are multiplied by factors). Therefore, in such cases, don't show
no warning.
2017-05-19 12:43:07 +02:00
Grzegorz Ziółek 25e3a8a14c MDL-56973 wiki: New page title readonly after changing course language 2017-05-19 11:10:41 +02:00
David Monllao 46280f7478 weekly release 3.2.3+ 2017-05-19 13:08:36 +08:00
David Monllao 80bf9ac40a Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-05-19 13:08:34 +08:00
Andres e2b4084bfd MDL-46322 mod_assign: Only list enrolled graders as potential markers 2017-05-18 22:22:45 -05:00
Mark Nelson 2a667a0820 MDL-58986 mod_quiz: add CSS classes to buttons on comment page 2017-05-18 16:50:06 +08:00
Andres Melo a4ad655bf1 MDL-46322 mod_assign: Only list enrolled graders as potential markers 2017-05-17 15:54:40 -05:00
AMOS bot 653e23bcc1 Automatically generated installer lang files 2017-05-18 00:07:20 +08:00
Mark Nelson 80d970cd0e MDL-58776 core_tag: removed whitespace from id attribute
This was preventing the JS from finding the element.
2017-05-17 12:13:40 +01:00
Simey Lameze f8962b4270 MDL-58884 core_competency: add exporter required course fields 2017-05-17 15:01:49 +08:00
Jake Dallimore e2f921ea2a Merge branch 'MDL-58947-m32' of https://github.com/sammarshallou/moodle into MOODLE_32_STABLE 2017-05-17 09:16:55 +08:00
Andrew Nicols 3586517ff8 Merge branch 'MDL-58795-moodle32' of https://github.com/jebarviabb/moodle into MOODLE_32_STABLE 2017-05-17 07:05:31 +08:00
Daniel Materka 4e8f93abba MDL-49988 wiki: fix broken page layout if html contains line breaks 2017-05-16 19:00:02 +01:00
Dan Poltawski 164d1e290e Merge branch 'MDL-58776-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-05-16 17:49:07 +01:00
AMOS bot 373bd248b9 Automatically generated installer lang files 2017-05-17 00:09:11 +08:00
Henning Bostelmann c6bbd48e23 MDL-57957 mod_assign: show feedback file in absence of grade item 2017-05-16 12:00:46 +01:00
Iñaki Arenaza 4db85a5943 MDL-57558 ldap: fix ldap_get_entries_moodle()
While ldap_get_entries_moodle() PHPdocs state that it returns "array
ldap-entries with lower-cased attributes as indexes.", this is not true. It
uses ldap_get_attributes() internally, which returns both numerically indexed
attribute names, and dictionary-like entries indexed by attribute names.

Current code lowercases the dictionary-like entries, but then uses the
numerically indexed entries for the attribute names used as keys in the
returned array. The numerically indexed names might or might not be lowercased,
depending on the LDAP server and PHP version) version. E.g., OpenLDAP 2.x,
Novell eDirectory 8.x and MS Active Directory return mixed-cased attribute
names, and PHP 5.x and PHP 7.x don't lowercase them inside ldap_get_entries().

This is probably why all calls to ldap_get_entries_moodle() are followed by
calls to array_change_key_case(), even if that shouldn't be necessary.

So make sure we always return lower-cased attributs as indexes and add some
unit tests to avoid regressions in the future.
2017-05-16 10:47:22 +01:00
Jun Pataleta 726fce53e7 Merge branch 'MDL-58811-32-extra-slash' of https://github.com/dmitriim/moodle into MOODLE_32_STABLE 2017-05-16 17:43:14 +08:00
Josh Ebarvia 5607f04f15 MDL-58795 gradereport_grader: Prevent duplicates in grader report
Currently, the sorting being used for the grader report table
(asc/desc arrows) is just the grade_grades.finalgrade.
This adds grade_grades.userid in the sort to prevent duplicate
in records returned when using pages.
2017-05-16 16:56:44 +09:30
Jake Dallimore 5d37f70d68 Merge branch 'MDL-58723-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-05-16 15:17:57 +08:00
Jun Pataleta 163e56dfbb MDL-58723 calendar: Better testing of forever recurring events
* Change the start date of the parent event to the current date
  for tests that with events that recur forever.
* Limit query results to 100 for events that recur forever that can
  generate more than 100 event records.
2017-05-16 14:40:29 +08:00
Andrew Nicols 07f1e2b49c Merge branch 'MDL-58756_32-statslib-roles-multilang' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-05-16 13:53:23 +08:00
Luca Bösch 328159027c MDL-58756 stats: Use multilang with role. 2017-05-16 07:28:43 +02:00
Dmitrii Metelkin c6e47712f5 MDL-58811 backup: fix an extra slash on restore for the legacy files 2017-05-16 14:31:05 +10:00
David Monllao 4a1d28e6c6 Merge branch 'MDL-58884-32' of git://github.com/StudiUM/moodle into MOODLE_32_STABLE 2017-05-16 10:41:53 +08:00
Jake Dallimore cbbfaad531 Merge branch 'MDL-58770-32' of https://github.com/IMSGlobal/moodle into MOODLE_32_STABLE 2017-05-16 09:58:42 +08:00
sam marshall bb78b2fd22 MDL-58947 Search: Label URLs not correctly calculated 2017-05-15 17:56:41 +01:00
AMOS bot 021b544c7a Automatically generated installer lang files 2017-05-16 00:07:22 +08:00
Dan Poltawski 71e94edfd8 Merge branch 'MDL-58916-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-05-15 11:01:43 +01:00
Dan Poltawski 37b143aeaf Merge branch 'MDL-58841-32' of git://github.com/cameron1729/moodle into MOODLE_32_STABLE 2017-05-15 10:46:11 +01:00
Dan Poltawski d1e6ca40a0 Merge branch 'MDL-58852_32-choice-chart-options-multilang' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-05-15 10:23:05 +01:00
Andrew Nicols d926390fba Merge branch 'MDL-58893-32-missing-div' of https://github.com/dmitriim/moodle into MOODLE_32_STABLE 2017-05-15 15:15:34 +08:00
Andrew Nicols 1dcc39e9a1 Merge branch 'MDL-58920_32-calculated-question-edit-name-multilang' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-05-15 14:54:20 +08:00
Dmitrii Metelkin e48bab0b24 MDL-58893 portfolio: add missing closing div 2017-05-15 15:52:52 +10:00
David Monllao bc71da7f50 Merge branch 'MDL-58656-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-05-15 11:39:39 +08:00
AMOS bot 3739127caf Automatically generated installer lang files 2017-05-14 00:04:48 +08:00
Luca Bösch 4321953314 MDL-58920 questions: Calculated question name passing multilang.
In "Shared wild cards" table calculated question name do pass format_string to process multilang tags.
Thus, not breaking the layout any more.
2017-05-12 18:07:55 +02:00
AMOS bot d69fcc7bc1 Automatically generated installer lang files 2017-05-13 00:04:43 +08:00
Dan Poltawski 723ed522a5 weekly release 3.2.3+ 2017-05-12 10:02:00 +01:00
Dan Poltawski 0d011d9ad3 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-05-12 10:01:59 +01:00
John Okely 15e5a39266 MDL-58916 user_profile: Pass site context when determining menu options 2017-05-12 15:59:48 +08:00
AMOS bot 1a63aaddeb Automatically generated installer lang files 2017-05-12 00:04:33 +08:00
Issam Taboubi ec66fbbeec MDL-58884 competency: Inaccurate stats proficient competencies in course 2017-05-11 11:51:53 -04:00
Skylar Kelty 11580ef62a MDL-58658 caching: Add static acceleration unit test for empty arrays 2017-05-11 11:04:25 +01:00
Skylar Kelty 8afd92382e MDL-58658 caching: Fix static acceleration for empty arrays 2017-05-11 11:04:15 +01:00
AMOS bot cf4753e354 Automatically generated installer lang files 2017-05-11 00:04:44 +08:00
David Monllao ed8c3327fb Merge branch 'MDL-58833-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-05-10 14:07:59 +08:00
David Monllao 3bd5edccf8 Merge branch 'MDL-58843-32-exchandler' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-05-10 14:06:06 +08:00
Dan Poltawski 01932fa6fa Merge branch 'MDL-58836-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-05-10 06:57:12 +01:00
Andrew Nicols db8ff4bc78 Merge branch 'MDL-58780-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-05-10 11:49:07 +08:00
Eloy Lafuente (stronk7) 2dced48edf Merge branch 'wip-MDL-58854-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-05-10 02:09:34 +02:00
AMOS bot 835bc90d7c Automatically generated installer lang files 2017-05-10 00:05:27 +08:00
Dan Poltawski 4d160525d3 weekly release 3.2.3+ 2017-05-09 12:41:47 +01:00
Dan Poltawski b3d4341009 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-05-09 12:41:44 +01:00
Cameron Ball bfa2ed7f6c MDL-58841 mod_assign: Style "view all" link on grading summary 2017-05-09 15:05:58 +08:00
David Mudrák 00fe8e5e3f MDL-58843 core: Do not expect a particular class of the thrown exception
Since PHP 7, the custom exception handlers are also called to handle
thrown Errors which are not Exceptions.
2017-05-09 08:42:53 +02:00
Andrew Nicols 5aeb8b003c Merge branch 'MDL-58822-32' of git://github.com/ryanwyllie/moodle into MOODLE_32_STABLE 2017-05-09 14:16:57 +08:00
Ryan Wyllie d90b7b734c MDL-58822 backup: backup and restore user override events 2017-05-09 05:49:25 +00:00
Jun Pataleta 26aaa71667 MDL-58780 mod_assign: Remove AS keyword in table alias
* The AS keyword is not recognised by Oracle for table aliases.
This is okay with other databases, but optional, so better to
remove it.
2017-05-09 12:00:45 +08:00
Marina Glancy 2265e74a31 MDL-58854 theme_boost: override templates for columns 2017-05-09 10:36:38 +08:00
Damyon Wiese 04f82f5669 MDL-58836 auth: Improve backwards compatibility
Auth plugins with custom signup forms may not be using renderables / renderers - or
even if they are they may return a renderable that can only be rendered with the renderer from the auth
plugin.

This change checks if the signup form is a renderable - if so try the plugin renderer or fall back on the general renderer.
Otherwise call display() from the mform which is the previous way of rendering an mform.
2017-05-09 10:27:39 +08:00
Luca Bösch e4d2487dd2 MDL-58852 choice: Use multilang for choice options in charts 2017-05-08 23:29:40 +02:00
AMOS bot b603370a23 Automatically generated installer lang files 2017-05-09 00:06:57 +08:00
Andrew Nicols 6ed25aee09 MDL-58833 tool_templatelibrary: Skip if directory empty 2017-05-08 15:02:20 +08:00
Jun Pataleta 9fff50ae00 MDL-58810 calendar: Fix rrule_manager issues
* Set the correct repeat ID for the recurring event
* Unset UUID for 'child' events of recurring events
2017-05-08 09:48:46 +08:00
Jun Pataleta 787d1a8f53 MDL-58810 calendar: Add coverage for UUID in recurring events 2017-05-08 09:40:19 +08:00
Eloy Lafuente (stronk7) 896ce9b4e6 Moodle release 3.2.3 2017-05-07 21:32:59 +02:00
AMOS bot c41605e282 Automatically generated installer lang files 2017-05-08 00:06:07 +08:00
AMOS bot 70ae23829f Automatically generated installer lang files 2017-05-07 00:05:59 +08:00
Eloy Lafuente (stronk7) f29a819640 weekly release 3.2.2+ 2017-05-05 17:26:59 +02:00
Andrew Nicols c89d29f8e0 Merge branch 'wip-MDL-50670-32-fix' of https://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-05-05 15:08:55 +08:00
Marina Glancy dc5cbf1532 MDL-50670 course: apply defaults when format was switched 2017-05-05 14:51:15 +08:00
Jun Pataleta 08c1b6eff4 Merge branch 'MDL-58807_32-activities-result-title-multilang' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-05-05 12:09:44 +08:00
Andrew Nicols 02660c64ff MDL-58259 mod_forum: Check if attachments allowed
If the current user is not allowed to submit attachments with a post,
and attachments are incldued, they are now dropped.
2017-05-05 10:29:11 +08:00
Andrew Nicols 787573a007 Merge branch 'MDL-55371-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-05-05 10:07:52 +08:00
Eloy Lafuente (stronk7) 6585f80f29 MDL-58772 behat: change step to 3.2 and up alternative 2017-05-05 08:26:56 +08:00
Dan Poltawski 7bcc28ac2f Merge branch 'MDL-58709-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-05-04 15:15:05 +01:00
Luca Bösch cc22e91f8f MDL-58807 block_activity_results: Use multilang in block title
The title passes format_string now.
2017-05-04 11:29:00 +02:00
Juan Leyva 3b2ea17ec4 MDL-55371 mod_assign: Do not return empty users in get_participant WS
The WS was returning null users making the WS to fail.
2017-05-04 10:10:23 +02:00
Jun Pataleta ce37064429 Merge branch 'MDL-58749-32-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-05-04 14:50:18 +08:00
Andrew Nicols 6aa0203deb MDL-56675 cachestore_memcached: Check all connected servers for support 2017-05-04 13:36:35 +08:00
Andrew Nicols d6d9c4a9c3 Merge branch 'MDL-58707-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-05-04 11:45:03 +08:00
Andrew Nicols 993a1ac38f Merge branch 'MDL-58431-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-05-04 11:02:59 +08:00
David Monllao e76a83ebf9 Merge branch 'MDL-56675-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-05-04 10:56:46 +08:00
Andrew Nicols e6d2eb3792 Merge branch 'MDL-58514-32' of git://github.com/cameron1729/moodle into MOODLE_32_STABLE 2017-05-04 08:54:43 +08:00
Helen Foster 0f11ec17ca MDL-58749 lang: Merge English strings from the en_fix language pack
Significant string changes:

* errorinvalidbyhour,core_calendar - correcting number from 59 to 23
* cron_help,core_admin - updated recommendation to run cron
  every minute
2017-05-03 22:07:22 +02:00
Eloy Lafuente (stronk7) c09577b5f3 Merge branch 'MDL-58754-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-05-03 20:53:44 +02:00
Eloy Lafuente (stronk7) 68124fe0af Merge branch 'MDL-58788-32' of git://github.com/danpoltawski/moodle into MOODLE_32_STABLE 2017-05-03 18:45:57 +02:00
Dan Poltawski 5611053587 MDL-58788 behat: backport of course navigation with editing step 2017-05-03 17:31:23 +01:00
Dan Poltawski c493c6ba2a Merge branch 'MDL-58772_32' of git://github.com/aolley/moodle into MOODLE_32_STABLE 2017-05-03 16:50:32 +01:00
Dan Poltawski ce589fb4fe Merge branch 'MDL-35913-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-05-03 14:13:21 +01:00
Dan Poltawski d8564f56f0 Merge branch 'MDL-58434-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-05-03 14:03:10 +01:00
Dan Poltawski e17ee1e9c5 Merge branch 'MDL-50670_32' of git://github.com/markn86/moodle into MOODLE_32_STABLE 2017-05-03 13:30:47 +01:00
Dan Poltawski 9ddd0bd72a MDL-58788 behat: backport of course navigation step
These got introduced in master on
3353cfd8c1 / MDL-58265

It will be useful for third party devs sharing feature files between
multiple branches.
2017-05-03 10:36:41 +01:00
Cameron Ball fba8a2e290 MDL-58514 mod_assign: Apply consistent logic for overrides
Previously the assign submission page was using "lenient" logic
for overrides when more than one group override applied to a user
(i.e., use the earliest "open" date and the latest "due" date)
when really it should be using the sortorder as per the assign
grading table.
2017-05-03 17:10:47 +08:00
Jake Dallimore 6f4f3946f6 Merge branch 'MDL-58650_32' of git://github.com/markn86/moodle into MOODLE_32_STABLE 2017-05-03 15:58:34 +08:00
Marina Glancy b6098b92b0 MDL-58740 block_course_overview: check session key
Thanks to Kukas Schmidt for initial patch
2017-05-03 10:48:18 +08:00
Marina Glancy a42ebf3385 MDL-58670 blog: respect capability to search entries 2017-05-03 10:48:18 +08:00
Marina Glancy 6acdd1f3ab MDL-58635 blogs: check edited blog belongs to current user 2017-05-03 10:48:18 +08:00
Andrew Hancox 602b3815a0 MDL-58172 mod_choice: Make export choice respect id fields 2017-05-03 10:48:18 +08:00
David Monllao b06b50cf1a weekly release 3.2.2+ 2017-05-03 10:27:47 +08:00
David Monllao 9c2f96a13d Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-05-03 10:27:46 +08:00
Andrew Nicols 9214bc50a2 MDL-56675 cachestore_memcached: Disable store if not purgeable
If the store is shared and the getAllKeys function is broken due to an
incompatability between libmemcached and memcached >= 1.4.23, then it is
not possible to purge the cache, and we cannot support the plugin.

This patch adjusts the isready check to additionally check if the
combination of libmemcached and memcached is affected by this issue.
2017-05-03 09:24:51 +08:00
Andrew Nicols 45e0bc6372 MDL-58746 core: Simplify environment check 2017-05-03 08:32:52 +08:00
Juan Leyva b1e73801d1 MDL-58434 mod_lesson: Display invalid responses in detailed report
In the detailed statistics view for one user attempt, the user response
for numerical question types was not being displayed.
This was only happening for incorrect responses.
2017-05-02 19:57:18 +02:00
AMOS bot 445308fc3b Automatically generated installer lang files 2017-05-03 00:05:56 +08:00
Marina Glancy 3179ca58b7 MDL-50670 course: correctly apply defaults for format options 2017-05-02 17:36:53 +08:00
Mark Nelson 86cbb2c450 MDL-58650 core_message: always use 'popup' processor for messages 2017-05-02 16:07:20 +08:00
Ankit Agarwal b84949f618 MDL-58776 tags: Add bootstrap classes to buttons 2017-05-02 12:26:20 +05:30
Andrew Nicols 0c4220fba5 MDL-58754 competency: Change query for DISTINCT COUNT 2017-05-02 14:49:11 +08:00
Adam Olley 743ad4f126 MDL-58772 mod_feedback: Dont overwrite anonymous entries
The feedback module lets you alternate between responses being anonymised and
not anonymised. When the module is in anonymous mode, its possible for a single
user to make multiple responses.

However when the activity is switched to non-anon mode, if a user leaves a
follow up feedback, one of their previously anonymous responses is used, so
their new response stays anonymous and their old anon response is lost.

This change lets them leave a new non-anonymised feedback entry and retains all
previous anonymous responses instead of incorrectly reusing one of their anon
ones at random.
2017-05-02 12:49:53 +09:30
Andrew Nicols 4a5e209d8c Merge branch 'MDL-57704-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-05-02 10:39:26 +08:00
John Okely 6b50178e4e MDL-57704 ltiprovider: Don't force SSLv3 2017-05-02 09:34:01 +08:00
Stephen Vickers 22227b7701 MDL-58770 mod_lti: Strip HTML from parameters
Remove HTML tags from parameters which should be plain text.
2017-05-01 21:10:40 +01:00
Marina Glancy db4031fa52 MDL-55468 mod_feedback: revive export analysis to excel 2017-05-01 14:33:49 +01:00
Jun Pataleta 9a68e396e8 Merge branch 'MDL-58632-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-05-01 14:28:13 +08:00
Andrew Nicols b5cc09d20b MDL-58746 core: Add environment check for finfo 2017-05-01 13:06:34 +08:00
Dan Poltawski 75528e9305 weekly release 3.2.2+ 2017-04-28 12:35:55 +01:00
Dan Poltawski 1082da020e Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-04-28 12:35:54 +01:00
Damyon Wiese 7d085745be MDL-54849 lesson: Fix backport
The backport branch was using undefined behat steps and functions.
2017-04-28 10:29:56 +08:00
Dan Poltawski d46c89d4e7 Merge branch 'wip-MDL-58689-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-04-27 18:35:29 +01:00
Juan Leyva 8817bcf7ba MDL-58709 registration: Fix incorrect setType 2017-04-27 16:58:20 +02:00
Dan Poltawski 00b7c8a2fd Merge branch 'MDL-58722-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-04-27 14:36:26 +01:00
David Monllao c1d089b1be Merge branch 'MDL-58628-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-04-27 17:09:41 +08:00
Damyon Wiese 3bbd2e7892 MDL-58722 mathjax: Update to 2.7.1 and remove a11y
2.7.1 bundles the accessibility and mchem extensions so we no longer need to bundle them and apply custom config.
2017-04-27 16:55:58 +08:00
Juan Leyva c35f42e679 MDL-58628 mod_quiz: Return missing fields in get_quizzes_by_courses
These fields must be returned always (even if the quiz is closed).
Those fields are required to display data to users that, for example,
finished a timed quiz.
2017-04-27 08:52:19 +02:00
Jake Dallimore 070262c8f9 Merge branch 'MDL-58701-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-04-27 13:33:45 +08:00
Ankit Agarwal ac3022fb0e MDL-58701 phpunit: Add tests for external_settings 2017-04-27 09:40:31 +05:30
Ankit Agarwal eed84bfd4b MDL-58701 libraries: Use pluginfile.php as rewrite url for web req. 2017-04-27 09:40:30 +05:30
David Monllao 133c06b2e1 Merge branch 'MDL-58698-32-strlang' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-04-27 11:34:58 +08:00
David Monllao 6c18a3c802 Merge branch 'wip-MDL-57807-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-04-27 11:33:43 +08:00
David Monllao e7c4f87a5d Merge branch 'MDL-58372-32' of git://github.com/Dagefoerde/moodle into MOODLE_32_STABLE 2017-04-27 11:32:00 +08:00
Andrew Nicols 2e95bfa5f2 Merge branch 'MDL-58691-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-04-27 11:26:52 +08:00
David Monllao f8ca828c02 Merge branch 'MDL-54849-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-04-27 11:20:27 +08:00
Marina Glancy 22e22a39af MDL-58689 dml: prevent logging during setup 2017-04-27 10:05:25 +08:00
Adrian Greeve 6823ac39cc MDL-57807 mod_data: Advanced search with menu item.
It is now possible to search other criteria without first
setting the menu items.

Thanks to Sergey Gorbatov for providing this patch.
2017-04-27 09:06:17 +08:00
AMOS bot 1e5a1eb77b Automatically generated installer lang files 2017-04-27 00:05:35 +08:00
Jan Dageförde 910247b15e MDL-58372 repository_webdav: Explicitly pass some filename
Not passing anything triggers PHP 7.1 "Too few arguments" exception.
2017-04-26 11:28:47 +02:00
David Mudrák b94131a90e MDL-58698 js: Fix the detection of the language in core_str module
This is the same problem that we had in MDL-52486. When the language
pack with multiple underscores (such as "en_us_k12") is selected, the
html root element's "lang" attribute is set to

    <html lang="en-us-12" ...>

which we then map back to the Moodle lang code using the JS function
replace().

What was missed in MDL-52486 was that when replacing a value (and not a
regular expression), only the first instance of the value is replaced.
So the value "en_us-k12" was sent as the lang parameter which is invalid
PARAM_LANG value and the exception was thrown.
2017-04-26 10:21:10 +02:00
Jake Dallimore cfe4df185c weekly release 3.2.2+ 2017-04-26 14:49:13 +08:00
Jake Dallimore 41c817ef38 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-04-26 14:49:12 +08:00
Jun Pataleta 32549792c2 Merge branch 'MDL-58668-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-04-26 11:05:48 +08:00
John Okely b6c6b99470 MDL-58632 assignsubmission_file: Don't allow any extension 2017-04-26 09:35:44 +08:00
Juan Leyva 72f7cc6a07 MDL-58707 mod_assign: Fix param type for returned field
The ‘description’ field is populated via a get_string call, this means
that it may content html.
The component used for translation is also fixed in this commit.
2017-04-25 14:42:27 +02:00
Juan Leyva a6757673a2 MDL-58668 mod_lesson: Fix how multi answers are processed
The module was choosing as incorrect the first possible incorrect
answer instead the first student incorrect answer.
In the patch I also refactored the foreach loop to avoid code
duplication.
2017-04-24 13:33:18 +02:00
Dan Poltawski e47c42f4a8 Merge branch 'MDL-58556-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-04-24 11:05:17 +01:00
Ankit Agarwal c51e98722b MDL-58691 exporter: Filters should always apply for web pages
The variables AJAX_SCIRPT, CLI_SCRIPT, WS_SERVER are always defined (and set to false)
when webpages are rendered, hence the check of 'defined' is invalid
2017-04-24 13:45:17 +05:30
Jake Dallimore d513f79a24 Merge branch 'MDL-57793-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-04-24 15:17:27 +08:00
Damyon Wiese e7048861a6 MDL-58556 auth: better expired password
If the auth plugin is using a custom url to change password - don't rely on forcepasswordchange
user preference being reset.
2017-04-24 15:09:05 +08:00
Damyon Wiese a188724a19 MDL-54849 lesson: Move on to next question
Move on to next question button takes you to the same question again.
2017-04-24 14:50:10 +08:00
Jun Pataleta d165d2cf24 Merge branch 'MDL-58586-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-04-24 09:34:49 +08:00
AMOS bot 6db0ef42d4 Automatically generated installer lang files 2017-04-23 00:04:28 +08:00
Dan Poltawski 0e526f9ea6 weekly release 3.2.2+ 2017-04-21 15:47:44 +01:00
Dan Poltawski f2520ef454 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-04-21 15:47:40 +01:00
Ryan Wyllie 9fd041ad16 MDL-58349 mod_assign: text wrap for comment search while grading 2017-04-21 13:36:29 +08:00
Damyon Wiese 608923c445 MDL-58586 css: add margin to userpictures
Boost has a right margin on the userpicture but this is missing in bootstrapbase (it is
added only on random pages).

Add a margin to bootstrapbase so it matches boost.
2017-04-21 11:39:57 +08:00
Jun Pataleta ec3ade054f Merge branch 'MDL-58636-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-04-21 11:39:34 +08:00
Andrew Nicols 0edc92e6bf MDL-58636 course: Ensure that the drag constraint has height 2017-04-21 10:48:32 +08:00
Jake Dallimore ebdcc591a2 Merge branch 'MDL-58613-32-workshopfullname' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-04-21 10:27:13 +08:00
David Monllao 029a29a3cf Merge branch 'MDL-58590_32' of https://github.com/sk-unikent/moodle into MOODLE_32_STABLE 2017-04-21 10:05:25 +08:00
Jun Pataleta 856dbae2cb Merge branch 'MDL-58482-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-04-21 09:05:53 +08:00
Simey Lameze 729c7f143b MDL-58482 theme_boost: css fixes for view badge page 2017-04-21 08:57:25 +08:00
AMOS bot 5f42866391 Automatically generated installer lang files 2017-04-21 00:10:40 +08:00
Skylar Kelty e0b69258fb MDL-58590 mobile: Cache mobile-supporting plugins 2017-04-20 09:34:40 +01:00
David Monllao e684411988 Merge branch 'MDL-58349-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-04-20 15:20:46 +08:00
Jake Dallimore 1e15527fa5 Merge branch 'wip-MDL-58452-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-04-20 15:10:42 +08:00
David Monllao 0373f42728 Merge branch 'MDL-58278-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-04-20 14:08:35 +08:00
Damyon Wiese 8a33f2a530 MDL-58656 competencies: Fix buggy scale caching
This affects the competency breakdown report in a course.
2017-04-20 13:24:56 +08:00
Damyon Wiese 864cf11c2f MDL-58278 mod_assign: Ignore send notify with mw
When marking workflow is on and the grade is not released we never send notifications anyway.
Instead of preventing the grading form from submitting (validation error) we silently ignore it.
2017-04-20 11:47:39 +08:00
AMOS bot ba6e9f22b4 Automatically generated installer lang files 2017-04-20 00:07:04 +08:00
Juan Leyva 554afbe2cd MDL-58431 mod_lesson: Fix error in random jumps on first visit
Random jumps to content pages were not working when they were set in
the first page.
This was caused because the page where the jump was, was not being
marked as visited before calculating the jump.
2017-04-19 17:48:05 +02:00
David Mudrák a0f9277b51 MDL-58613 workshop: Provide all data to display user name
Additional fields such as middlename, alternatename and others were not
passed to the fullname(), causing a debugging message.
2017-04-19 14:19:49 +02:00
David Monllao ebda22d612 Merge branch 'MDL-54901_32' of git://github.com/stronk7/moodle into MOODLE_32_STABLE 2017-04-19 11:31:57 +08:00
David Monllao 0ad03ab13c Merge branch 'MDL-58096-32' of git://github.com/StudiUM/moodle into MOODLE_32_STABLE 2017-04-19 05:18:22 +08:00
Gilles-Philippe Leblanc 4dcdab69f6 MDL-58096 reports: Add SQL required by preload_from_record() 2017-04-18 15:42:01 -04:00
Dan Poltawski a8321fc3ac Merge branch 'MDL-58463-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-04-18 18:54:01 +01:00
David Monllao 167a73cffc Merge branch 'MDL-58116-32' of https://github.com/barrasroger/moodle-1 into MOODLE_32_STABLE 2017-04-19 00:49:56 +08:00
AMOS bot b19bf809dc Automatically generated installer lang files 2017-04-19 00:04:41 +08:00
Dan Poltawski d2f333357d Merge branch 'MDL-58374-32-ltierrorlog' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-04-18 16:49:03 +01:00
Gilles-Philippe Leblanc a1d78eac23 MDL-58096 reports: Optimize database request 2017-04-18 11:00:08 -04:00
Dan Poltawski 937831c736 weekly release 3.2.2+ 2017-04-18 12:34:09 +01:00
Dan Poltawski de7951b817 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-04-18 12:34:08 +01:00
barrasroger 0e1c96a44c MDL-58116 core_enrol: fix handling of users on different methods 2017-04-18 13:06:54 +02:00
Jun Pataleta cdabef710d MDL-57793 calendar: Additional edge-case tests
* Added leap year and 31th day of the month tests.
2017-04-18 13:57:39 +08:00
Jun Pataleta 2a7b253e82 MDL-57793 calendar: Add recursion to satisfy COUNT rule
* Add recursion to the creation of recurring calendar events to satisfy
  the COUNT rule, if necessary.
2017-04-18 13:57:39 +08:00
Jun Pataleta b87f4d1ea5 MDL-58463 mod_assign: Improve coverage of test_assign_refresh_events() 2017-04-18 13:22:33 +08:00
Jun Pataleta c3606bf9ba MDL-58463 mod_assign: Use correct course ID for fetching assignment's CM 2017-04-18 11:57:45 +08:00
Andrew Nicols 6806700b01 Merge branch 'MDL-58559-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-04-18 09:47:41 +08:00
Andrew Nicols 071633c194 Merge branch 'MDL-58582-32' of https://github.com/Dagefoerde/moodle into MOODLE_32_STABLE 2017-04-18 09:32:32 +08:00
Andrew Nicols ef01fb49a6 Merge branch 'MDL-58539_32' of https://github.com/dmonllao/moodle into MOODLE_32_STABLE 2017-04-18 09:04:48 +08:00
Simey Lameze b9fb0ede39 MDL-58559 block_community: check if the course has subject 2017-04-18 08:57:15 +08:00
Eloy Lafuente (stronk7) 3567a37302 MDL-54901 environment: pg93, openssl, https & utf8mb4 2017-04-18 02:53:47 +02:00
Eloy Lafuente (stronk7) 34770e55b2 MDL-54901 environment: 3.3 base information
This is a direct copy of the 3.2 branch to
have changes under control easier in next commits.
2017-04-18 02:53:46 +02:00
Ruslan Kabalin f7e9dbcbe2 MDL-58539 assignfeedback_editpdf: Fix group assignment fatal error.
This makes sure that $grade->attemptnumber is not NULL before using its
value.
2017-04-17 16:58:44 +02:00
Jan Dageförde e353a80475 MDL-58582 theme: Improve PHPDoc comment on SVG image resolution 2017-04-17 15:24:32 +02:00
Dan Poltawski 8226afc20e MDL-58486 userprefs: clarifying comment 2017-04-17 12:17:57 +01:00
Dan Poltawski 535abb009d Merge branch 'MDL-58486_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-04-17 12:17:54 +01:00
Dan Poltawski 3125397713 Merge branch 'MDL-58479-32-weblib-notice-phpdoc' of git://github.com/roperto/moodle into MOODLE_32_STABLE 2017-04-17 10:46:10 +01:00
Dan Poltawski 9ce8250f77 Merge branch 'MDL-58465-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-04-17 10:41:18 +01:00
Dan Poltawski 1eefc40296 Merge branch 'MDL-58393-32_filter-order' of https://github.com/roperto/moodle into MOODLE_32_STABLE 2017-04-17 10:30:41 +01:00
Dan Poltawski a3d444a3af Merge branch 'MDL-58593-32' of git://github.com/merrill-oakland/moodle into MOODLE_32_STABLE 2017-04-17 10:03:23 +01:00
Dan Poltawski 3509e3771a MDL-39913 behat: fix filetype search
Like the previous commit, the string had been badly backported from 33
on 32 th gdocs extension is not in spreadhseet files.
2017-04-17 08:36:20 +01:00
Dan Poltawski d7dd9aa732 MDL-39913 behat: fix steps which don't exist
'And I am on "Course 1" course homepage' is a step introduced into 33.
2017-04-17 08:31:39 +01:00
Eric Merrill 2335a0018d MDL-58593 database: More efficiently track issued key names 2017-04-13 12:24:27 -04:00
Dan Poltawski 6cb68d8d3a Merge branch 'MDL-32596_32' of https://github.com/rezaies/moodle into MOODLE_32_STABLE 2017-04-13 15:57:23 +01:00
David Monllao a3b99f1c03 Merge branch 'MDL-58244-32' of https://github.com/MartinGauk/moodle into MOODLE_32_STABLE 2017-04-13 13:00:40 +02:00
David Monllao 139c549e3c Merge branch 'MDL-58171_32-report-role-format_text' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-04-13 12:40:08 +02:00
Martin Gauk 8336d2be91 MDL-58244 shibboleth: handle users who are logged out
If the user is (already) logged out, do not access $USER->auth and redirect him to the return URL.
2017-04-13 10:07:04 +00:00
Andrew Nicols 46629407c2 Merge branch 'MDL-39913-32-new-validation' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-04-13 09:18:15 +08:00
AMOS bot f1996f596b Automatically generated installer lang files 2017-04-13 00:04:26 +08:00
David Monllao db2718a65d Merge branch 'MDL57475-MOODLE_32_STABLE' of https://github.com/mmafrar/moodle into MOODLE_32_STABLE 2017-04-12 16:19:08 +02:00
Luca Bösch 2e26127821 MDL-58171 report: role name passing format_text
Have the role name in h2 of the participation report passing filters
like multilang2 by having it call format_text.

Signed-off-by: Luca Bösch <luca.boesch@bfh.ch>
2017-04-12 15:32:45 +02:00
David Monllao ccbc8fadf8 Merge branch 'MDL-58555_32' of https://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-04-12 14:09:33 +02:00
David Monllao 0905763270 weekly release 3.2.2+ 2017-04-12 09:32:38 +02:00
David Monllao 558d773213 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-04-12 09:32:36 +02:00
Tim Hunt 4288a75a48 MDL-58555 ajax: make ajax web service log entries more useful
It is not used for anything, but we put the method name(s) being called in the URL.
2017-04-11 09:41:02 +01:00
Andrew Nicols cdcb157b7e Merge branch 'wip-MDL-57616-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-04-11 12:01:28 +08:00
Andrew Nicols 12d454cb4c Merge branch 'MDL-58461-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-04-11 11:34:43 +08:00
AMOS bot c1d1c098f4 Automatically generated installer lang files 2017-04-11 00:04:44 +08:00
David Monllao 402ce4d5f5 Merge branch 'patch-25' of https://github.com/sk-unikent/moodle into MOODLE_32_STABLE 2017-04-10 16:59:34 +02:00
David Monllao f8db8073a2 Merge branch 'mdl-58489-m32' of https://github.com/Dagefoerde/moodle into MOODLE_32_STABLE 2017-04-10 16:56:23 +02:00
David Monllao 2eb6dd8cdc Merge branch 'mdl-58485-m32' of https://github.com/Dagefoerde/moodle into MOODLE_32_STABLE 2017-04-10 16:34:28 +02:00
David Monllao 32cf700c31 Merge branch 'wip-MDL-55950-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-04-10 16:10:04 +02:00
David Monllao c2542c35f6 Merge branch 'MDL-57858-32' of git://github.com/pavelsokolov/moodle into MOODLE_32_STABLE 2017-04-10 14:15:12 +02:00
David Monllao a563739951 MDL-56370 mod_feedback: Note about undeprecation 2017-04-10 13:17:14 +02:00
David Monllao 04d312fbcc Merge branch 'wip-MDL-56370-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-04-10 13:15:24 +02:00
David Monllao e82c98f26d Merge branch 'wip-MDL-55939-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-04-10 12:57:50 +02:00
David Monllao f40585c94d Merge branch 'MDL-58104-32' of git://github.com/pavelsokolov/moodle into MOODLE_32_STABLE 2017-04-10 09:58:44 +02:00
Andrew Nicols b91250e430 Merge branch 'wip-MDL-58180-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-04-10 13:40:29 +08:00
John Okely ea3f8fa0cb MDL-39913 assignsubmission_file: Add validation 2017-04-10 12:12:07 +08:00
AMOS bot e1f11ce7b1 Automatically generated installer lang files 2017-04-08 00:05:54 +08:00
David Mudrák 7c920b5706 MDL-58374 lti: Log the error message of a failed message verification
Previously the exception message (which holds the actual explanation of
what went wrong) was thrown away so the user had no way to debug.
2017-04-07 11:27:19 +02:00
Jan Dageförde 3abc7d1c4e MDL-58485 admin: Show all SVG plugin icons 2017-04-07 10:10:42 +02:00
Jan Dageförde d2decc7fb0 MDL-58489 core: Fix unreachable HTTP error handling 2017-04-07 10:07:54 +02:00
Marina Glancy 784e8588ee MDL-58452 ajax: do not show popup when can't retrieve the message count 2017-04-07 16:06:07 +08:00
John Okely d00a536a0c MDL-39913 assign: Add help on filetype submissions 2017-04-07 16:04:56 +08:00
Jonathon Fowler 9a9a841497 MDL-39913 assignsubmission_file: add file types restriction
Testing for uploading a non-permitted file won't work as things stand
currently because the filemanager throws an exception that Behat
catches, which causes a fail.
2017-04-07 16:04:53 +08:00
Jonathon Fowler e319e5a2d0 MDL-39913 filetypes: mimetypes remediation
Going by http://www.iana.org/assignments/media-types/media-types.xhtml.
Disambiguated the Office 2007 types, Apple iWorks and other types
changes by tonyjbutler.
2017-04-07 16:04:13 +08:00
Jun Pataleta 90574fd1c8 weekly release 3.2.2+ 2017-04-07 12:45:57 +08:00
Jun Pataleta 67e8ddc65f Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-04-07 12:45:56 +08:00
Marina Glancy a41f004fb7 MDL-56370 mod_feedback: behat for repeat completion 2017-04-07 08:22:58 +08:00
AMOS bot 22c756c644 Automatically generated installer lang files 2017-04-07 00:04:53 +08:00
Skylar Kelty b42298d3fa MDL-58456 chat: Add missing new in throw 2017-04-06 09:47:41 +01:00
Shamim Rezaie e13c169ded MDL-32596 tool_xmldb: Updated confirmcheckforeignkeys
Updated $string['confirmcheckforeignkeys']
2017-04-06 18:29:24 +10:00
Marina Glancy 766a5891b6 MDL-55950 mod_feedback: correct link to response in the email 2017-04-06 15:44:14 +08:00
Marina Glancy 5108b3e7c1 MDL-55939 course: no permission is needed to view frontpage 2017-04-06 14:52:54 +08:00
Damyon Wiese 87f417f510 MDL-58461 filter_mathjaxloader: Update defaults
Also included a version bump for Moodle in order to trigger a filter upgrade.
2017-04-06 13:58:28 +08:00
Damyon Wiese 7a75832faa MDL-58461 mathjax: Ship accessibility extensions
There are not mirrored on the new CDN so we need to ship them with moodle.
2017-04-06 13:58:24 +08:00
AMOS bot 8b2d2a5fc6 Automatically generated installer lang files 2017-04-06 00:07:27 +08:00
AMOS bot 5b9dead542 Automatically generated installer lang files 2017-04-06 00:07:27 +08:00
Marina Glancy 50b024746e MDL-56370 mod_feedback: allow to restore values from last attempt 2017-04-05 15:45:16 +08:00
Andrew Nicols c0ab266dd0 MDL-58055 theme_bootstrap: Change padding around unread link 2017-04-05 00:34:29 +02:00
Eloy Lafuente (stronk7) a90270455e Merge branch 'MDL-55326-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-04-04 19:26:36 +02:00
Eloy Lafuente (stronk7) f0be825426 Merge branch 'MDL-55499-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-04-04 18:24:04 +02:00
AMOS bot dce24b2a5a Automatically generated installer lang files 2017-04-05 00:04:46 +08:00
Tim Hunt 985b62f3a9 MDL-58486 user_prefs: always update $USER cache when applicable
set_user_preference and unset_user_preference let you pass the user to
set preferences for as an id. Previously, if you passed $USER->id there,
those methods did not update the Cache in $USER, which was surprising,
and not easy to debug.

Now, we always update the preference cache in $USER if the preference is
being changed for the current user.
2017-04-04 16:22:52 +01:00
Daniel Thee Roperto d92499f4c4 MDL-58479 documentation: fixed phpdoc for notice(). 2017-04-04 16:20:01 +10:00
Daniel Thee Roperto e7d8b8031f MDL-57246 forum: Fixed mod/forum/view.php redirection.
Fixed: Trying to view a forum without the capability may lead you to a broken page.
2017-04-04 16:15:50 +10:00
Marina Glancy 6c61222fbb MDL-57616 label: allow to drag and drop video/audio files 2017-04-04 12:31:32 +08:00
Andrew Nicols 6e19e0c175 Merge branch 'wip-MDL-41809-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-04-04 10:54:44 +08:00
Mohamed Afrar 92ae0fda60 MDL-57475 Forum: Fixing issue with the 'preferences' link in emails 2017-04-04 03:08:22 +05:30
AMOS bot 9702e72bd7 Automatically generated installer lang files 2017-04-04 00:05:38 +08:00
Daniel Thee Roperto 1401dd8f47 MDL-58394 filters: Fixed order not being respected. 2017-04-03 14:47:26 +10:00
Ankit Agarwal aae0a865bb MDL-58465 unittests: Fix invalid use of exception 2017-04-03 09:25:46 +05:30
Damyon Wiese fed7bdfa96 MDL-58461 filter_mathjaxloader: Change CDN url
The MathJax CDN url is going away - we need to switch to another mirror.
2017-04-03 11:18:20 +08:00
Dan Poltawski 57a38cf813 weekly release 3.2.2+ 2017-03-31 11:15:47 +01:00
David Monllao ed6478fb7e MDL-58450 mod_forum: Force groups to be returned as they are created
Long history resumed: The test relies on the first group
being the first that is created, the first group is
actually the first one ordering by name. If  is
group-999 and  is group-1000  is returned
as the first group.
2017-03-31 11:14:16 +01:00
Pavel Sokolov 26ce8a1f15 MDL-57858 mod_assign: fix submissions count for assign with scales 2017-03-31 12:01:03 +03:00
Dan Poltawski f2ceab9582 weekly release 3.2.2+ 2017-03-31 09:16:40 +01:00
Dan Poltawski 02151fbe85 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-03-31 09:16:39 +01:00
Pavel Sokolov 6db9bc560d MDL-58104 mod_assign: Show attempt settings for the latest attempt 2017-03-30 11:10:52 +03:00
Andrew Nicols 440b00b7d3 MDL-55499 mod_forum: Use context when formatting e-mail text 2017-03-30 11:38:37 +08:00
Dan Poltawski ba0bd5b9ab Merge branch 'MDL-58264_32' of https://github.com/darrencocco/moodle into MOODLE_32_STABLE 2017-03-28 18:02:42 +01:00
AMOS bot cf2cda4b31 Automatically generated installer lang files 2017-03-29 00:05:39 +08:00
David Monllao 3cc6435b18 MDL-58079 enrol: Move new test to existing test case 2017-03-28 17:35:48 +02:00
David Monllao e0b383aae0 Merge branch 'MDL-58079_32' of https://github.com/kiklop74/moodle into MOODLE_32_STABLE 2017-03-28 17:35:05 +02:00
Juan Leyva 2121f50755 MDL-35913 site home: Set the page layout before setting blocks
When the default home page is set by user preference the site home
blocks are gone.
This is caused because the page layout is not correctly set before
manipulating the navigation block (the base layout it is used instead).
2017-03-28 17:11:07 +02:00
Dan Poltawski 121c9d3099 MDL-58227 mod_feedback: remove uncessary if 2017-03-28 16:00:08 +01:00
Dan Poltawski 32e709a9dc Merge branch 'MDL-58227-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-03-28 15:59:23 +01:00
Dan Poltawski 397a8936cb Merge branch 'MOODLE_32_STABLE' of https://github.com/fwsl/moodle into MOODLE_32_STABLE 2017-03-28 12:07:29 +01:00
Dan Poltawski 4e3551004e Merge branch 'MDL-58160_32' of git://github.com/aolley/moodle into MOODLE_32_STABLE 2017-03-28 11:34:59 +01:00
Dan Poltawski e48dd18997 Merge branch 'wip-MDL-58092-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-03-28 10:56:00 +01:00
Dan Poltawski 6d36432f2f Merge branch 'MDL-58257_M32' of https://github.com/ak4t0sh/moodle into MOODLE_32_STABLE 2017-03-28 10:50:59 +01:00
AMOS bot aaf67d012b Automatically generated installer lang files 2017-03-28 00:06:38 +08:00
Dan Poltawski 316706511d Merge branch 'MDL-57510-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-03-27 09:41:35 +01:00
Andrew Nicols b407285890 MDL-55326 core_text: Correct typo3 file permissions 2017-03-27 15:07:59 +08:00
Luca Bösch 042b90d078 MDL-58180 lib: Role name pass format_text.
In function stats_get_report_options, the role names are returned after
having been processed through format_text which lets the filters work on them.

Signed-off-by: Luca Bösch <luca.boesch@bfh.ch>
2017-03-27 10:41:38 +08:00
Darren Cocco c2465fa0e3 MDL-58264 quiz: removed additional = symbol
Removed superflous = symbol from SQL snippet
2017-03-27 11:11:47 +11:00
AMOS bot 4b4f760bfa Automatically generated installer lang files 2017-03-27 00:04:24 +08:00
Ankit Agarwal 9ec4ffe9be MDL-57510 questionbank: Add horizontal navigation 2017-03-24 19:08:13 +05:30
Grzegorz Ziółek 08e1b1e49e MDL-58325 config_log: Record changes in editor management to config_log. 2017-03-24 09:41:20 +01:00
Marina Glancy 8bf0e602c6 MDL-58092 gradingform_guide: behat to demonstrate double quote fix 2017-03-24 13:28:40 +08:00
gthomas2 4583242dd6 MDL-58092 grading methods: Fix double escape for freq used questions 2017-03-24 13:28:40 +08:00
Eloy Lafuente (stronk7) af97a17395 weekly release 3.2.2+ 2017-03-23 20:31:01 +01:00
Eloy Lafuente (stronk7) 89574179da Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-03-23 20:30:59 +01:00
Marina Glancy 6ee2dd680e MDL-41809 course: do not rely on page context
page context may not be set, use the correct course context when calling format_string
2017-03-23 14:41:47 +08:00
Andrew Nicols 72fce6fc46 Merge branch 'MDL-57429-32-fix' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-03-23 11:52:39 +08:00
Jake Dallimore 3c57ce6e72 MDL-57429 badges: handle curl problems nicely during connection creation
- Properly validate the displayer API response before sending the
verification email.
- Properly validate the displayer API response before creating the
saved connection.
2017-03-23 11:36:11 +08:00
Jun Pataleta 79d55f5dee MDL-58255 mod_assign: Fix one more incorrect assign context usage 2017-03-23 09:31:33 +08:00
AMOS bot d9864df62c Automatically generated installer lang files 2017-03-23 00:08:55 +08:00
Dan Poltawski a04b4d89b2 Merge branch 'MDL-58274-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-03-22 09:30:40 +00:00
Damyon Wiese 21735b6075 MDL-58349 assign: editpdf search comments style
The line height and margins are messed up on the comment search dialog.
2017-03-22 13:33:02 +08:00
Jun Pataleta 156371af9c MDL-57994 course: Fix newsitems setting for course formats without news 2017-03-22 09:33:05 +08:00
Dan Poltawski a3a8a4a970 Merge branch 'MDL-56324-32' of https://github.com/lucisgit/moodle into MOODLE_32_STABLE 2017-03-21 11:27:41 +00:00
Juan Leyva 3848d57eef MDL-58227 mod_feedback: Delete duplicated completions records
This commit also fixes the way the previous completion record was
fetched to avoid the creation of new duplicates.
2017-03-21 09:55:37 +01:00
Dan Poltawski 4afdece091 Merge branch 'MDL-58317-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-03-21 07:57:59 +00:00
John Okely 649bad89a2 MDL-37168 mod_lti: Fix rename behat 2017-03-21 10:30:52 +08:00
Eloy Lafuente (stronk7) 886ce4cfcb Merge branch 'MDL-57840-32-get_users_by_field' of https://github.com/roperto/moodle into MOODLE_32_STABLE 2017-03-21 01:05:55 +01:00
AMOS bot 8da74658b5 Automatically generated installer lang files 2017-03-21 00:04:24 +08:00
Dan Poltawski 59f2ef03ae Merge branch 'MDL-58262-32' of git://github.com/merrill-oakland/moodle into MOODLE_32_STABLE 2017-03-20 15:20:18 +00:00
Dan Poltawski d1b41e0a34 Merge branch 'wip-mdl-58261-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-03-20 13:51:30 +00:00
Dan Poltawski c2e2d38d99 Merge branch 'MDL-58050-32-msgtrans' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-03-20 13:19:26 +00:00
Dan Poltawski 7bde88208c Merge branch 'MDL-58121-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-03-20 13:15:15 +00:00
Dan Poltawski 2e2686acf2 Merge branch 'MDL-58255-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-03-20 13:08:52 +00:00
Dan Poltawski ed532e8f3b Merge branch 'MDL-58273-32-ldapenrol' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-03-20 11:08:46 +00:00
David Monllao 94535cbc8a Merge branch 'MDL-37168-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-03-20 10:16:18 +01:00
Dan Poltawski 12d3875811 Merge branch 'MDL-58285-m32' of https://github.com/NeillM/moodle into MOODLE_32_STABLE 2017-03-20 08:54:02 +00:00
John Okely be52d0dace MDL-37168 grade: Debugging if gradebook callbacks are not both present 2017-03-20 16:31:31 +08:00
John Okely e078aa1351 MDL-37168 mod_lti: Add behat test to cover lti quick edit 2017-03-20 16:00:15 +08:00
Sam Chaffee 1b13df8f65 MDL-37168 mod_lti: Fix LTI activity quick edit title 2017-03-20 16:00:14 +08:00
Darko Miletic 3111a4f120 MDL-58079 core_enrol: Fixed invalid category tag 2017-03-20 04:11:48 -03:00
David Monllao aacfdda594 Merge branch 'MDL-57419-32-2' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-03-20 07:33:38 +01:00
David Monllao 349027033c Merge branch 'MDL-57254-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-03-20 06:49:29 +01:00
Damyon Wiese 4ca5db7c0b MDL-58317 templates: Fix async template render
There is an edge case where we do not wait for all promises before
rendering a template. This can generate "failed to pre-fetch the template" JS errors.
2017-03-20 13:36:51 +08:00
David Monllao 4c72716d43 Merge branch 'MDL-57994_M32' of https://github.com/ak4t0sh/moodle into MOODLE_32_STABLE 2017-03-20 06:32:44 +01:00
David Monllao 733e84fc26 Merge branch 'MDL-58166-32' of git://github.com/pavelsokolov/moodle into MOODLE_32_STABLE 2017-03-20 05:12:03 +01:00
David Monllao 594253c322 Merge branch 'MDL-58182-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-03-20 05:04:40 +01:00
Andrew Nicols 1cf3129e86 Merge branch 'MDL-57429-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-03-20 10:19:52 +08:00
AMOS bot 6178a8c820 Automatically generated installer lang files 2017-03-20 00:07:29 +08:00
AMOS bot 4c22adddef Automatically generated installer lang files 2017-03-19 00:05:46 +08:00
AMOS bot 91b779aa02 Automatically generated installer lang files 2017-03-18 00:09:29 +08:00
Pavel Sokolov 27946d0c65 MDL-58166 mod_assign: markingworkflow breaks assign for non-graders 2017-03-17 17:52:11 +03:00
Tony Butler 9ac0280f80 MDL-56324 assignfeedback_editpdf: Revert erroneous commits
This reverts commits 88d309d and 3cd718e.
2017-03-17 11:04:04 +00:00
Arnaud Trouve b2931bc620 MDL-58257 course: fix search containing a hyphen
In case a hyphen (-) was preceded and followed by spaces,
the pattern for the "not regex" was empty causing an empty response from the database
2017-03-17 08:28:25 +01:00
Damyon Wiese 7acd833a3c MDL-58274 boost: div is not the same as span
display: block and display: inline are very different - you can't just
change tags and expect everything to look fine.
2017-03-17 10:03:10 +08:00
Jun Pataleta 8f48fbf6f6 MDL-58255 mod_assign: Fix usage of assign object for overrides
* Fix the parameters being passed for the assign constructor.
* Use assign::get_instance() instead of assign::get_context() to fetch
the assignment instance's properties.
2017-03-17 09:34:03 +08:00
Jake Dallimore 81636e4694 MDL-58121 email: ensure support user is defined in email_to_user 2017-03-17 09:13:17 +08:00
Jake Dallimore 91df0eb289 MDL-58182 javascript: Fix for buttons regression in core dialog.
Fixes a regression caused by MDL-56364, wherein the buttons were made
readOnly, meaning addButtons wouldn't work. This removes that change,
while maintaining the original dependency between the buttons and the
closeButton config options.
2017-03-17 09:06:30 +08:00
Arnaud Trouve 27e0254e8f MDL-57994 course: fix newsitems value 2017-03-16 18:37:12 +01:00
Darko Miletic 1929107b8c MDL-58079 core_enrol: Implementing fix and unit test 2017-03-16 14:27:22 -03:00
Neill Magill e587b9be09 MDL-58285 tool_mobile: Web service generates incorrect fileurl on IIS
The tool_mobile_get_plugins_supporting_mobile generated an incorrect
fileurl on IIS. The /mobile/filename.zip part was generated as
\mobile\filename.zip, this failed the PARAM_URL check.

This change stops the use of OS specific directory separators and uses
the linux/web separator. PHP file functions recognise this properly.
2017-03-16 12:10:59 +00:00
Dan Poltawski 80ff09db28 weekly release 3.2.2+ 2017-03-16 11:52:59 +00:00
Dan Poltawski 61495ffbcb Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-03-16 11:52:57 +00:00
John Okely 3bc489a0ec MDL-57419 messaging: Don't use enter to send 2017-03-16 10:50:06 +08:00
Rajesh Taneja 6d3a686c2c MDL-58261 behat: Fixed missing @_file_upload tags 2017-03-16 09:36:02 +08:00
Jake Dallimore e9fe4cc37c MDL-57429 badges: add email verification for openbackpack connections
With the Persona provider now out of commission, no new connections to
the Mozilla openbackpack can be created. This patch adds an email
verification step to core to restore the openbackpack functionality.
2017-03-16 09:33:30 +08:00
David Mudrák 4457c6605b MDL-58273 enrol_ldap: Fix the name of the capability
This capability controls who can hide/show the enrolment instance.
2017-03-15 18:33:04 +01:00
Andrew Nicols d82b0d8ed9 Merge branch 'MDL-57658-32-integration-fix-2' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-03-15 15:14:33 +08:00
Jun Pataleta f16b97eb8c MDL-57658 calendar: Remove BYDAY filtering dependence on NumberFormatter 2017-03-15 14:24:12 +08:00
Andrew Nicols dda3512514 Merge branch 'MDL-57658-32-integration-fix' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-03-15 11:42:06 +08:00
Jun Pataleta f4fe47705e MDL-57658 calendar: Set sort order for fetched DB records 2017-03-15 11:26:31 +08:00
Eloy Lafuente (stronk7) 3ec84d746a Merge branch 'MDL-57066-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-03-15 00:58:45 +01:00
Eric Merrill 330f45b6e2 MDL-58262 assign: Use unique sql parameter 2017-03-14 15:10:00 -04:00
Dan Poltawski cddbbc1752 Merge branch 'MDL-58023_behat_find_node_in_navigation_improvement_MOODLE_32_STABLE' of https://github.com/gthomas2/moodle into MOODLE_32_STABLE 2017-03-14 16:47:52 +00:00
Dan Poltawski 9407afa0ba Merge branch 'MDL-57658-32-3' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-03-14 16:06:20 +00:00
AMOS bot a62863c658 Automatically generated installer lang files 2017-03-15 00:04:51 +08:00
Juan Leyva 1164882eff MDL-57254 mod_choice: Add not open case in choice_can_view_results
If the choice is not available (not open yet), the function must return
false even is CHOICE_SHOWRESULTS_ALWAYS is set to true.
This was failing only in Web Services, in Web that function is not
reached (execution stops when the time open check is done).
2017-03-14 13:35:38 +01:00
David Monllao 7b0a42b20c Merge branch 'MDL-58114-32-excparams' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-03-14 11:02:50 +01:00
Rajesh Taneja ff14679150 MDL-58169 phpunit: Clear opcode cache before checking file
In unit test, we write cache file often and
opcache might fail to detect changes. It will
be nice to invalidate opcode cache to ensure
we have the correct file_exists status
2017-03-14 09:07:28 +00:00
Andrew Nicols e79a53e370 Merge branch 'MDL-57583-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-03-14 12:47:59 +08:00
Rajesh Taneja e78f6b391a MDL-58250 behat: Status should be new exit code
Oring should not be done with old status,
as it will always return failure.
2017-03-14 07:30:44 +08:00
AMOS bot 5a04868aec Automatically generated installer lang files 2017-03-14 00:04:43 +08:00
gthomas2 b3a6face59 MDL-58023 behat: Improve find_node_in_navigation function 2017-03-13 11:39:23 +00:00
Krishnan e7714135a4 MDL-57066 theme_boost: Fix course section move icon alignment 2017-03-13 14:43:29 +08:00
Jake Dallimore e2b2fad613 MDL-57583 completion: fix bug with advcheckbox in course completion form
Added the appropriate checks to handle the advcheckbox post data.
2017-03-13 09:21:54 +08:00
AMOS bot b85bdc91d4 Automatically generated installer lang files 2017-03-13 00:04:18 +08:00
Eloy Lafuente (stronk7) 70fa678586 Moodle release 3.2.2 2017-03-11 22:16:10 +01:00
AMOS bot 0c6de97371 Automatically generated installer lang files 2017-03-12 00:04:17 +08:00
AMOS bot 63981e5a82 Automatically generated installer lang files 2017-03-12 00:04:17 +08:00
Eloy Lafuente (stronk7) 6a0dfc60d6 weekly release 3.2.1+ 2017-03-10 20:59:59 +01:00
Eloy Lafuente (stronk7) 38c4435a37 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-03-10 20:59:55 +01:00
Damyon Wiese 3cc4e2f725 MDL-57596 forms: CLEANHTML in persistent forms
Add special handling for text fields with the CLEANHTML type. This should
be used when students and teachers can edit the same field (you can't trust those students).

Applies cleaning on submitted data, and on data stored in the DB before it is put back in an editing form.
2017-03-10 18:07:55 +00:00
Marina Glancy ca3cbbc233 MDL-58010 user: allow to update only whitelisted user preferences 2017-03-10 18:07:54 +00:00
Andrew Nicols 7d196ef3b3 Merge branch 'wip-mdl-57940-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-03-10 18:07:53 +00:00
Eloy Lafuente (stronk7) 069b9d5820 Merge branch 'MDL-58123-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-03-10 18:07:53 +00:00
Dan Poltawski 454a3d34d5 Merge branch 'MDL-58035_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-03-10 18:07:52 +00:00
Ankit Agarwal db3a985faf MDL-56526 userlib: Do not allow not loggedin users if forceloginforprofile is set 2017-03-10 18:07:52 +00:00
Ankit Agarwal c535520966 MDL-56526 globalsearch: Fix bug in phpdocs 2017-03-10 18:07:51 +00:00
David Mudrák e35ad40de1 MDL-57597 competency: Fix serving of prior learning evidence files
For security reasons, all files submitted by students must be disposed
as attachments, not inline contents.
2017-03-10 18:07:51 +00:00
AMOS bot 436acc27fe Automatically generated installer lang files 2017-03-10 00:04:27 +08:00
Jun Pataleta 39f02182de MDL-57658 calendar: Fix rrulemanager and unit tests
Issues fixed:
* Additional rule validations.
* Rewrote recurrence logic.
* Additional unit tests, especially from the examples in the RFC.
* The date format "YmdThis" results into an incorrect date for the
  "UNTIL" parameter. The literal "T" should be escaped, and a literal
  "Z" is also needed at the end of the format string to indicate UTC.
* Implemented handling of negative modifier values for BYxxx rules.
* Implemented handling of BYWEEKNO, BYYEARDAY, BYSETPOS, BYHOUR,
  BYMINUTE, BYSECOND rules.
2017-03-09 16:11:29 +08:00
Dan Poltawski 73fd6f2928 Merge branch 'MDL-57990-32' of git://github.com/crazyserver/moodle into MOODLE_32_STABLE 2017-03-07 13:59:15 -03:00
AMOS bot 84e17f59c5 Automatically generated installer lang files 2017-03-08 00:05:55 +08:00
Eloy Lafuente (stronk7) 63464df041 Merge branch 'MDL-58064-32-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-03-07 16:37:36 +01:00
Dan Poltawski 17c82085fc Merge branch 'wip-mdl-58056-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-03-07 11:08:23 -03:00
Dan Poltawski 5e3ce67f37 Merge branch 'MDL-57361-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-03-07 11:07:46 -03:00
Tim Hunt ec02a34e1f MDL-58035 tool_templatelibrary: fix unit test using removed base theme 2017-03-07 13:35:34 +00:00
Tim Hunt 1e1e1b8229 MDL-58035 lib: log when the expected theme cannot be initialised 2017-03-07 13:35:32 +00:00
David Monllao f7af2c5fc7 Merge branch 'MDL-58106_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-03-07 13:38:18 +01:00
David Monllao 92194c1c8d Merge branch 'wip-mdl-58091-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-03-07 13:16:03 +01:00
David Mudrák 7bbe8a1c76 MDL-58064 lang: Clarify the PHP 7.x limitations
These are related to SQL*Server support only and affect all PHP 7
versions, not just 7.0.x. Credit goes to Eloy Lafuente for spotting
this.
2017-03-07 13:00:46 +01:00
Dan Poltawski 22ee65c275 MDL-58040 blocks: add upgrade.txt note 2017-03-07 08:34:54 -03:00
Dan Poltawski 9354f9de64 Merge branch 'MDL-58040_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-03-07 08:34:48 -03:00
David Monllao 04d2305788 Merge branch 'wip-MDL-57485-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-03-07 12:16:48 +01:00
David Monllao e21e294072 Merge branch 'MDL-58057-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-03-07 12:09:35 +01:00
Dan Poltawski 19b7ac05ad Merge branch 'MDL-55859-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-03-07 07:02:31 -03:00
Dan Poltawski 4294bbd50f Merge branch 'MDL-58052_behat_get_session_user_MOODLE_32_STABLE' of https://github.com/gthomas2/moodle into MOODLE_32_STABLE 2017-03-07 06:54:34 -03:00
Adrian Greeve b1ffb73177 MDL-57485 themes: Set images to default display type.
Imported images in atto would no longer hold a URL
tag around it. display: block was the culprit.
2017-03-07 17:33:23 +08:00
Ankit Agarwal cde1ac3eea MDL-57362 assign: Fix permission checks 2017-03-07 13:04:01 +05:30
Jake Dallimore 059759aab9 MDL-58057 core_files: properly trim curl whitelist config when fetching 2017-03-07 09:49:50 +08:00
Dan Poltawski 188d41ccc9 Merge branch 'MDL-57362-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-03-06 10:18:30 -03:00
Adam Olley fc73f127eb MDL-58160 coursecat: Use set_many to populate category cache
When the course category cache needs to be repopulated, two entries are added
to the cache for each category. In core this is currently done in a for-loop,
resulting in N set calls to the cache (where N is twice the number of
categories in Moodle).

This change switches that code to using a single set_many cache call instead,
which makes this an O(1) operation instead of O(N).

For a site with say, 1000 categories, this results in only 1 set call to the
cachestore instead of 2000.
2017-03-06 12:06:13 +10:30
gthomas2 0b5f9f6e60 MDL-58052 behat: user session function - use to edit current profile 2017-03-03 12:29:47 +00:00
Pau Ferrer Ocaña fa60a11522 MDL-57990 course: Add sortorder as public field 2017-03-03 11:52:10 +01:00
Eloy Lafuente (stronk7) 29cdf58116 weekly release 3.2.1+ 2017-03-03 10:33:52 +01:00
Eloy Lafuente (stronk7) 3db24b8015 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-03-03 10:33:47 +01:00
Tim Hunt b21b210f41 MDL-58106 random Q restore: avoid MySQL performance issues 2017-03-02 19:40:53 +00:00
Ankit Agarwal 79482e3fe8 MDL-55859 assign_editpdf: cleanup htmlfile in case of errors 2017-03-02 21:16:37 +05:30
Cameron Ball 3935371599 MDL-57321 theme_boost: Remove extra quotation mark 2017-03-02 16:05:55 +08:00
Jun Pataleta 14026572ae MDL-58123 mod_lesson: Fix lesson table name in refresh_events DB query 2017-03-02 10:55:42 +08:00
Eloy Lafuente (stronk7) ee66d63054 Merge branch 'MDL-57321-32' of git://github.com/cameron1729/moodle into MOODLE_32_STABLE 2017-03-02 00:01:47 +01:00
Juan Leyva af2d6085cd MDL-57361 auth_email: Force policy agreed on sign-up 2017-03-01 18:20:59 +01:00
David Mudrák e35a24916f MDL-58114 plugin manager: Fix exception parameters 2017-03-01 15:01:38 +01:00
Cameron Ball e615d70923 MDL-57321 theme_boost: Remove duplicate aria-labelledby attribute 2017-03-01 11:37:29 +08:00
Cameron Ball ae8388d51c MDL-57321 theme_boost: Fix improperly nested ul elements in footer 2017-03-01 11:37:28 +08:00
Cameron Ball 962e3eb662 MDL-57321 theme_boost: Use div instead of span for dropdown items 2017-03-01 11:37:28 +08:00
Cameron Ball 4c586b025e MDL-57321 theme_boost: Consistently apply attributes on elements 2017-03-01 11:37:28 +08:00
Andrew Nicols 8612c8aa3e Merge branch 'MDL-58072_32_tabtree_mustache' of https://github.com/mchurchward/moodle into MOODLE_32_STABLE 2017-03-01 11:10:18 +08:00
Eloy Lafuente (stronk7) a7db91030b Merge branch 'wip-MDL-48228-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-03-01 02:57:16 +01:00
Adrian Greeve d807d3c603 MDL-48228 database: Unit test addition and update. 2017-03-01 09:05:40 +08:00
Adrian Greeve 8f61b909e8 MDL-48228 database: Make utf8mb4 the default character set for mysql.
Thanks to Jetha Chan for providing the initial patch that this is
based on.
2017-03-01 09:05:40 +08:00
Eloy Lafuente (stronk7) e44ce23c9f Merge branch 'MDL-58071-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-02-28 23:00:42 +01:00
Eloy Lafuente (stronk7) 6c87b08240 Merge branch 'MDL-55762-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-02-28 20:40:51 +01:00
David Monllao 9afdc8fc12 MDL-51833 docs: Move upgrade note under 3.2.2 2017-02-28 11:32:39 +01:00
David Monllao e30a500fb9 Merge branch 'wip-MDL-51833-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-02-28 11:31:09 +01:00
Ankit Agarwal 121d3e0d29 MDL-57362 assignlib: Fix minor bug in phpdocs 2017-02-28 10:34:41 +05:30
Ankit Agarwal 5b7356cdde MDL-57362 assignlib: Check for sep groups edge case 2017-02-28 10:34:41 +05:30
Andrew Nicols 169d972bf6 Merge branch 'MDL-58038-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-02-28 12:25:43 +08:00
Rajesh Taneja 4fef0dadf0 MDL-58091 behat: Added missing @_file_upload tag 2017-02-28 11:22:38 +08:00
Andrew Nicols 96a0d1bc7a Merge branch 'MDL-35980-32' of git://github.com/snake/moodle into MOODLE_32_STABLE 2017-02-28 10:34:00 +08:00
Jake Dallimore 01c2ca76c0 MDL-35980 behat: fix link text in submission_comments feature 2017-02-28 10:24:53 +08:00
Andrew Nicols 46c68c1b42 MDL-55547 tool_monitor: Coding style fixes 2017-02-28 09:42:44 +08:00
Andrew Nicols e65f6a7e40 Merge branch 'wip-MDL-55547-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-02-28 09:42:39 +08:00
Eloy Lafuente (stronk7) 800da1b13d Merge branch 'MDL-58041_32' of https://github.com/sam-moodle/moodle into MOODLE_32_STABLE 2017-02-28 02:35:20 +01:00
Eloy Lafuente (stronk7) a53008f1f0 Merge branch 'MDL-57524_M32' of https://github.com/nadavkav/moodle into MOODLE_32_STABLE 2017-02-28 01:40:54 +01:00
Eloy Lafuente (stronk7) f1a117b86b Merge branch 'MDL-58030_32' of git://github.com/aolley/moodle into MOODLE_32_STABLE 2017-02-27 22:47:22 +01:00
Helen Foster bcbd4140a1 MDL-58064 lang: Merge English strings from the en_fix language pack 2017-02-27 10:20:17 +01:00
Rajesh Taneja c99c5a436e MDL-57940 behat: Allow behat parallel run to start with delay
Behat parallel run if executed together
then selenium might fail to launch browser
and timeout. It would be nice to have a
custom delay between the start of each process
2017-02-27 16:16:06 +08:00
Andrew Nicols b7d36bdbaf Merge branch 'MDL-50719-fast-locks-MOODLE_32_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_32_STABLE 2017-02-27 13:47:02 +08:00
Andrew Nicols c21f12e786 Merge branch 'MDL-35980-32' of git://github.com/snake/moodle into MOODLE_32_STABLE 2017-02-27 12:20:02 +08:00
Ankit Agarwal 2dd1bb44c2 MDL-55762 assignpdf: Handle errored pages better 2017-02-27 09:27:23 +05:30
Ankit Agarwal 63de9b5cdb MDL-55762 assignpdf: Fix bug in phpdocs 2017-02-27 09:27:23 +05:30
Andrew Nicols 24a00cadec Merge branch 'MDL-58032-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-02-27 11:51:13 +08:00
Adrian Greeve 3f709d3272 MDL-51833 tool_monitor: Improve access check for monitor. 2017-02-27 09:00:54 +08:00
Nadav Kavalerchik def32a798d MDL-57524 theme_boost: Fix ignored input size on admin pages 2017-02-24 21:51:43 +02:00
Juan Leyva b63524492f MDL-58071 user: Return usernotfullysetup exception in WS
If there is an empty required custom user profile field, Web Services
should return the usernotfullysetup exception instead ignoring it.
The mobile app already handles this exception for core fields
redirecting the user to web in order to fill the missing field.
2017-02-24 20:17:19 +01:00
Mike Churchward 46f0136a5a MDL-58072 theme_boost: Added quotes to title; removed extra spaces. 2017-02-24 11:10:56 -05:00
Brendan Heywood 83dbc72f38 MDL-50719 cron: Fixed parallel task lock contention issues 2017-02-24 13:19:12 +11:00
Jake Dallimore c6911cefb4 MDL-56364 javascript: Prevent bad prototype chains in core dialogue
The DIALOGUE object was using Y.clone to copy the input config, messing
up the prototype chains for any objects in the config param. Really,
this doesn't need to clone the config, so I've refactored to avoid doing
so. Also moved some of the other attribute init and setup calls to the
appropriate places (initializer and modifyAttrs).
2017-02-24 08:27:44 +08:00
Jake Dallimore dfbdf40af9 MDL-35980 comment: add comment info to delete button for screen readers
For each delete button in the comments widget, make the spoken text a
string containing the name of the poster and the datetime.
2017-02-24 08:16:38 +08:00
Jake Dallimore 3e0fb6862e MDL-58038 email: make sure all allowedemaildomain entries are respected
Fixes a bug with exploding the config var, in which trailing carriage
returns were causing string matches to fail.
2017-02-24 08:07:59 +08:00
AMOS bot 0e8eba7e1f Automatically generated installer lang files 2017-02-24 00:07:41 +08:00
David Monllao d0209e611f weekly release 3.2.1+ 2017-02-23 08:07:49 +01:00
David Monllao ec9ed6d067 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-02-23 08:07:48 +01:00
Rajesh Taneja 3e340aba45 MDL-58056 behat: Ensure form element exists
Before getting form field, ensure node is
visible. Else it may fail to get form
field
2017-02-23 14:45:43 +08:00
Rajesh Taneja de80be59bb MDL-58056 behat: Catch webdriver exception if element removed
While checking for element visibility, ensure
that element is there in dom
2017-02-23 14:45:43 +08:00
AMOS bot 310172571b Automatically generated installer lang files 2017-02-23 00:05:42 +08:00
David Mudrák 36916193d2 MDL-58050 message: Commit the transaction before the early return
If there was no conversation found and the method returned early, the
active transaction was not marked as committable and the error was
reported by the request shutdown handler.

Attaching a unit test for the case just because it did not seem to be
covered. I was trying to reproduce the thrown error in the unit test but
it can't be used in this case. The shutdown handler puts the warning
directly into the error_log and it is not guaranteed where such messages
go (depending on the PHP configuration). And we do not even raise it
during the unit test execution (presumably due to noise it would
produce) anyway.
2017-02-22 14:02:34 +01:00
David Mudrák c85f8d3f93 MDL-58050 message: Fix the DB transaction handling
Consumer code is not supposed to call commit_delegated_transaction()
method directly, this was incorrect usage of the delegated transactions.
2017-02-22 14:02:34 +01:00
David Monllao a550b70a94 MDL-58014 messaging: Note about behavioural change in message_count_unread_messages 2017-02-22 09:47:12 +01:00
Daniel Thee Roperto 4bdc05f059 MDL-57840 libraries: Fixed missing fields in get_users_by_field(). 2017-02-22 16:06:38 +11:00
Ankit Agarwal 3cd6842501 MDL-58032 core_user: Fix case when acting user is a visitor 2017-02-22 09:55:58 +05:30
Rajesh Taneja f17c1aadb3 MDL-57765 behat: Allow exact selectors to be used
In Blocks with boost theme selector to
find block with name is partial match
it might fail in some cases. It would
be nice to use exact match to avoid
unexpected failures
2017-02-21 23:57:37 +01:00
Sam Chaffee 043dffdd34 MDL-58041 tool_monitor: Fix event monitor subscription behat failures 2017-02-21 11:24:17 -07:00
Tim Hunt 6fef2ab3db MDL-58040 blocklib: never use global in block manager class
This switches everything to ->page, including coverting static method to real one.
2017-02-21 15:19:55 +00:00
Adam Olley 9ffcf8a3e9 MDL-58030 gradingform_guide: Init $commentchooser before use
The initialisation of $commentschooser was moved into an IF condition,
whilst still using it outside of that IF conditions scope. As such, if
there are no comments to choose from, the variable is never init'd but
it still goes to use it, emitting a PHP notice.
2017-02-21 14:36:49 +10:30
Eloy Lafuente (stronk7) 56b8f8c8be Merge branch 'wip-MDL-57113-MOODLE_32_STABLE' of https://github.com/kwiliarty/moodle into MOODLE_32_STABLE 2017-02-21 01:00:53 +01:00
Eloy Lafuente (stronk7) fede68a0ac Merge branch 'wip-mdl-56616-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-02-21 00:58:13 +01:00
Eloy Lafuente (stronk7) 6588079c5d Merge branch 'MDL-55867_m32v1' of https://github.com/sbourget/moodle into MOODLE_32_STABLE 2017-02-21 00:53:21 +01:00
Eloy Lafuente (stronk7) f7e4c3627c Merge branch 'MDL-56206_32-text-enrolled-users-page-aligned' of https://github.com/lucaboesch/moodle into MOODLE_32_STABLE 2017-02-20 19:26:35 +01:00
David Monllao 6c3f7e0ae6 Merge branch 'MDL-57576-32-updatefeedbackfile' of git://github.com/roperto/moodle into MOODLE_32_STABLE 2017-02-20 12:27:33 +01:00
Dan Poltawski 89d948d86b Merge branch 'MDL-57962-32' of git://github.com/dpalou/moodle into MOODLE_32_STABLE 2017-02-20 11:19:17 +00:00
David Monllao e1dcad3d13 Merge branch 'MDL-57795-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-02-20 10:28:23 +01:00
David Monllao 07d000c51e Merge branch 'MDL-57801-32' of https://github.com/lucisgit/moodle into MOODLE_32_STABLE 2017-02-20 10:10:15 +01:00
David Monllao 636e7a13b6 Merge branch 'MDL-58014_32' of git://github.com/markn86/moodle into MOODLE_32_STABLE 2017-02-20 09:34:43 +01:00
David Monllao a57bdfa055 Merge branch 'MDL-56679-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-02-20 09:20:26 +01:00
David Monllao 80a57cf924 Merge branch 'MDL-57274-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-02-20 09:07:25 +01:00
David Monllao 059d6ffd9f Merge branch 'MDL-50729-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-02-20 08:27:07 +01:00
Mark Nelson fd13953a8a MDL-58014 core_message: fixed unread message count 2017-02-20 13:59:33 +08:00
Marina Glancy 488e115027 MDL-55547 tool_monitor: fix exceptions when course was deleted
Delete subscriptions when course is deleted
2017-02-20 12:16:27 +08:00
Jake Dallimore 72e3ff3c15 MDL-57274 upgrade: fix curl security notices during upgrade/install
Handles the case where $CFG->curlsecurityxxx vars don't yet exist
during install or upgrade by treating not set the same as empty.
2017-02-20 08:56:47 +08:00
Jake Dallimore bd4f6ce186 MDL-57795 mod_assign: fix for filters killing review pane when grading
Fixes a bug in which the review pane was destroyed if the user selected
a combination of filters resulting in no matched users. Now, the pane
is just hidden in such cases, and displayed again if subsequent filter
changes return one or more users.
2017-02-20 08:53:00 +08:00
Dan Poltawski 5416d932d7 Merge branch 'MDL-57967_32' of git://github.com/markn86/moodle into MOODLE_32_STABLE 2017-02-19 19:44:51 +00:00
Matteo Scaramuccia 27e719e709 MDL-57379 Files: Improved file argument evaluation.
get_file_argument() is responsible to extract the relative path
of the file to be served by a specific Moodle component
like a theme or a module.
Some modules like scorm and imscp require slasharguments support
and they force it when creating the URLs to serve their files.
It should honor the slasharguments setting but this could break
those instances where existing hard-coded links still make usage of
the "old" format, the one when slasharguments is set to No i.e. '?file='.

Its logic has been improved by looking at when the URL is related to
serving a plug-in file in a "forced" slasharguments way of serving it
i.e. using '/pluginfile.php/' and not '/pluginfile.php?'.
2017-02-19 18:44:48 +00:00
Tony Butler b577d34861 MDL-57801 core_filestorage: Delete temp file if disk space runs out 2017-02-16 12:46:46 +00:00
Tony Butler dcd27d9cee MDL-57801 core_filestorage: Verify hash of temp file before committing
This addresses an edge scenario on NFS filesystems with no space
remaining, where subsequent uploads fail silently while zero byte files
are saved to the pool (and for some reason the filesize check passes).
2017-02-16 12:46:46 +00:00
Gergely Kún 863dcb14a8 MDL-56679 core: Initialise $SESSION if necessary 2017-02-16 16:19:42 +08:00
Dan Poltawski 1a754e8446 weekly release 3.2.1+ 2017-02-16 08:14:54 +00:00
Dan Poltawski 95e9f4cc02 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-02-16 08:14:48 +00:00
Mark Nelson bac13609ca MDL-57967 core_message: do not process conversations from deleted users 2017-02-16 13:03:02 +08:00
Rajesh Taneja df90a44f3f MDL-57030 behat: Save run status after execution 2017-02-15 10:38:43 +01:00
Eloy Lafuente (stronk7) 23fd4f3afc Merge branch 'MDL-53991_m32v4' of https://github.com/sbourget/moodle into MOODLE_32_STABLE 2017-02-14 18:16:24 +01:00
Eloy Lafuente (stronk7) 9b39a92170 Merge branch 'wip-mdl-57030-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-02-14 16:53:59 +01:00
David Monllao 69c5e60f8c MDL-56122 editpdf: Fix ghostscript checking 2017-02-14 13:45:39 +01:00
Brendan Heywood cc36a37ea4 MDL-57810 lib: Disable nginx buffers when not required 2017-02-14 11:36:01 +00:00
Dani Palou 2678ee4e81 MDL-57962 forum: Allow creating new discussions with groupid -1 2017-02-14 10:44:00 +01:00
David Monllao 5a9f3039a7 Merge branch 'MDL-56122-32' of https://github.com/lucisgit/moodle into MOODLE_32_STABLE 2017-02-14 09:53:39 +01:00
Ankit Agarwal 667784420f MDL-50729 gradelib: Regrade event should be assigned to system 2017-02-14 11:40:54 +05:30
Ankit Agarwal f628e0ecf6 MDL-50729 events: Add user constants to events base class 2017-02-14 11:40:54 +05:30
Damyon Wiese 9ae3b89cc5 MDL-57766 assign: Put back the manual marker filter
I removed too much from gradingtable.php in the last patch.
2017-02-14 10:19:15 +08:00
Eloy Lafuente (stronk7) 098a875e4e Merge branch 'MDL-57868-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-02-13 23:42:46 +01:00
Eloy Lafuente (stronk7) 9d64f4f078 Merge branch 'MDL-57708-32' of git://github.com/merrill-oakland/moodle into MOODLE_32_STABLE 2017-02-13 23:33:00 +01:00
Tony Butler 5fac573391 MDL-56122 assignfeedback_editpdf: Add test assertions for pdf generation 2017-02-13 17:30:15 +00:00
Tony Butler def9c15904 MDL-56122 assignfeedback_editpdf: Regenerate PDF & page images if blank 2017-02-13 17:30:15 +00:00
Dan Poltawski d4e9fe521e Merge branch 'MDL-56841_32' of https://github.com/andrewhancox/moodle into MOODLE_32_STABLE 2017-02-13 16:39:39 +00:00
B Krishnan Iyer 343cdba46b MDL-57354 output: Render continue button as a primary button. 2017-02-13 15:50:43 +00:00
Davo Smith aca74d0d74 MDL-57752 session: fix check_security() session termination 2017-02-13 13:54:43 +00:00
Dan Poltawski ce01dbab40 Merge branch 'MDL-57768-webservice-config-error-MOODLE_32_STABLE' of https://github.com/ilya-catalyst/moodle into MOODLE_32_STABLE 2017-02-13 13:31:04 +00:00
David Monllao 21cf201536 Merge branch 'MDL-57766-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-02-13 09:44:25 +01:00
David Monllao dfefe26665 Merge branch 'wip-MDL-50770-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-02-13 09:15:08 +01:00
Rajesh Taneja de70bc556c MDL-56616 theme_boost: Fix style for performance info 2017-02-13 14:39:23 +08:00
AMOS bot 7b06a12ef3 Automatically generated installer lang files 2017-02-11 00:11:46 +08:00
Ilya Tregubov a415eb505e MDL-57768 webservice: Delete manual setting of config in test 2017-02-10 11:48:44 +11:00
Damyon Wiese 54a20ea8fc MDL-57766 mod_assign: Marker allocation fixes
Marking allocation was only ever applied in the view for the grading table. It should
have been added to the list_participants function because that is used by webservices and
the new grading UI.
2017-02-09 17:15:10 +08:00
David Monllao a1740aad65 weekly release 3.2.1+ 2017-02-09 08:00:10 +01:00
David Monllao 3680b1efa0 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-02-09 08:00:09 +01:00
Ryan Wyllie b90c2e2627 MDL-57370 message: add unread count to conversation tests 2017-02-09 13:46:31 +08:00
Ryan Wyllie 5c53893f97 MDL-57370 message: improve message union sql 2017-02-09 13:46:30 +08:00
Rajesh Taneja 3049c086a3 MDL-57030 behat: Added option to automatically rerun failures 2017-02-09 07:16:00 +08:00
Eric Merrill c644b03f02 MDL-57708 assign: Fix display of overridden submissions 2017-02-08 14:54:11 -05:00
David Monllao 7693409caa Merge branch 'wip-MDL-57316-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-02-08 13:11:40 +01:00
Dan Poltawski eac59c38f8 Merge branch 'MDL-57370-32-int-fix-1' of git://github.com/ryanwyllie/moodle into MOODLE_32_STABLE 2017-02-08 09:14:22 +00:00
Dan Poltawski cd6612b079 MDL-57370 messaging: fix mesed up versions
(Again, I didn't have a good day yesterday...)
2017-02-08 09:08:02 +00:00
Ryan Wyllie 7d88829470 MDL-57370 message: fix duplicate ids 2017-02-08 07:43:14 +00:00
Rajesh Taneja 9fde80dfa0 MDL-56954 behat: Fixed string to pass behat
colon is not concatenated to Search courses string
2017-02-08 12:19:26 +08:00
Damyon Wiese e787fa6ab4 MDL-57009 javascript: Fix "failed to prefetch"
The scanForPartials in amd/src/templates.js function is not handling
nested sections (the list of tokens is a tree not a flat list).
2017-02-08 11:17:39 +08:00
Marina Glancy 24cfd4c7d8 MDL-57316 media: create different instances for different pages 2017-02-08 10:17:18 +08:00
AMOS bot de33f85405 Automatically generated installer lang files 2017-02-08 00:09:21 +08:00
Damyon Wiese 57e38e1d12 MDL-57009 javascript: Reject on all errors
Not all error paths were resulting in a reject() call to fail a promise.
2017-02-07 12:37:10 +00:00
Damyon Wiese ddbf8c29ae MDL-57009 javascript: Always use when.apply
Or it does not really wait for the promises.
2017-02-07 12:37:02 +00:00
Dan Poltawski f265312fcf Merge branch 'MDL-57009-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2017-02-07 12:36:27 +00:00
Dan Poltawski 7dc6674cc4 MDL-57370 upgrade: fix versions 2017-02-07 10:49:49 +00:00
Dan Poltawski c1b9c51914 Merge branch 'MDL-57370-32' of git://github.com/ryanwyllie/moodle into MOODLE_32_STABLE 2017-02-07 10:25:27 +00:00
Luca Bösch 14da7f58a4 MDL-56206 themes: Text on Enrolled users page well aligned
Helps to align the table row content.
2017-02-07 07:19:37 +01:00
Eloy Lafuente (stronk7) 18221902bc Merge branch 'MDL-56954-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-02-07 06:35:08 +01:00
Ryan Wyllie 7d9ee66a2f MDL-57370 message: change indexes on message tables 2017-02-07 01:44:39 +00:00
John Okely de60425a16 MDL-57316 media: Setup media plugins in media_manager::instance() 2017-02-07 09:43:49 +08:00
John Okely 4eb3f8d9b7 MDL-57316 videojs: Add behat tests for lesson, url and resource 2017-02-07 09:43:48 +08:00
Ryan Wyllie 994e94bf76 MDL-57370 message: unit tests for get_conversations 2017-02-07 01:43:33 +00:00
Ryan Wyllie 2f9f8b5903 MDL-57370 message: remove joins from get_conversations
I have broken up the single query that was doing multiple joins on the
messaging and user tables. It no longer does any joins and will instead
query each data set individually.

This may cost more in terms of PHP processing but it will mean that
standard database tunings should be able to handle larger data sets.

For example this function was taking a long time to run on moodle.org
and was causing the MySQL join buffer to overflow.
2017-02-07 01:43:32 +00:00
Eloy Lafuente (stronk7) 3923610e6c Merge branch 'wip-mdl-57851-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-02-07 01:26:21 +01:00
Eloy Lafuente (stronk7) 0913eb3c2a Merge branch 'wip-mdl-57853-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-02-06 21:55:05 +01:00
AMOS bot f5b50e0472 Automatically generated installer lang files 2017-02-07 00:05:29 +08:00
Eloy Lafuente (stronk7) 09261027b6 Merge branch 'MDL-53349-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-02-06 16:09:46 +01:00
Dan Poltawski e0c4e6496f Merge branch 'MDL-57660-32' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-02-06 13:47:29 +00:00
Dan Poltawski 672ce4c6cd Merge branch 'MDL-57587_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-02-06 11:04:00 +00:00
Juan Leyva 13a2a8344c MDL-57868 mod_feedback: Fix incorrect query parameters order
get_records_menu call get_records using the same params ordering, it is
causing a duplicated value error for the first column
2017-02-06 11:32:33 +01:00
David Monllao 8184f47d6c Merge branch 'MDL-57777-m32' of https://github.com/micaherne/moodle into MOODLE_32_STABLE 2017-02-06 09:41:52 +01:00
Rajesh Taneja 7a7320af90 MDL-57853 phpunit: Remove use of setExpectedException 2017-02-06 11:45:45 +08:00
Stephen Bourget 70fd9fbb39 MDL-55867 block_activity_results: Sort activities alphabetically. 2017-02-05 21:30:01 -05:00
Rajesh Taneja e16448d3f1 MDL-57851 behat: Add some more wait for scenario to pass
On slow machine with phnatomjs profile
this scenario keeps failing. Add some more
wait to ensure the page is stable and next
step can be executed
2017-02-03 12:54:45 +08:00
AMOS bot 2b4eb2cb71 Automatically generated installer lang files 2017-02-03 00:04:16 +08:00
Andrew Hancox ed798679bb MDL-56841 mod_folder: Display edit and download buttons inline 2017-02-02 15:17:00 +00:00
Simey Lameze 299dcca1b1 MDL-56954 theme_boost: apply bs4 styles to course management page 2017-02-02 15:52:51 +08:00
Andrew Nicols c16c53d137 weekly release 3.2.1+ 2017-02-02 11:32:16 +08:00
Andrew Nicols 52723e1e3f Merge branch 'MDL-57630-m32' of https://github.com/micaherne/moodle into MOODLE_32_STABLE 2017-02-02 09:19:08 +08:00
Rajesh Taneja 0bcbd5b205 MDL-54628 behat: Rerun command now include replace option passed 2017-02-02 08:21:31 +08:00
Nadav Kavalerchik ec319d13df MDL-53349 Autocomplete: Support multi lingual COMMA keycode (44) 2017-02-01 16:30:23 +08:00
Ankit Agarwal 0c4422af0b MDL-57300 lti: Make tool provider page more readable 2017-02-01 11:51:32 +05:30
Ankit Agarwal 40dcbac3d6 MDL-57027 accesslib: Improve perf of sql 2017-02-01 13:06:03 +08:00
Petr Skoda 62eb5ef8eb MDL-57027 fix get_users_by_capability()
Change-Id: I98dc88784dfa0293f88a19c3d36e7a46a3f52672
2017-02-01 13:06:02 +08:00
Eloy Lafuente (stronk7) 434e8abac8 Merge branch 'MDL-57592-32' of https://github.com/mwehr/moodle into MOODLE_32_STABLE 2017-02-01 13:06:01 +08:00
Dan Poltawski 28add18d9b Merge branch 'MDL-57588_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2017-02-01 13:06:01 +08:00
Dan Poltawski f9220d8138 Merge branch 'wip-mdl-54628-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-02-01 13:06:00 +08:00
Dan Poltawski 32237b8308 Merge branch 'MDL-57300-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-02-01 13:06:00 +08:00
Dan Poltawski c2ae90c553 Merge branch 'MDL-57728_m32v1' of https://github.com/sbourget/moodle into MOODLE_32_STABLE 2017-02-01 13:05:59 +08:00
Michael Aherne 7035e0f5b5 MDL-57777 rss: Return 404 when context not found. 2017-01-31 09:31:31 +00:00
Andrew Nicols 6a3777f90c Merge branch 'wip-MDL-57785-32' of git://github.com/amygroshek/moodle into MOODLE_32_STABLE 2017-01-31 12:21:37 +08:00
Andrew Nicols de7a6ff47e Merge branch 'MDL-35978-32-blockfix' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-01-31 11:51:17 +08:00
Jake Dallimore 46e26a1b69 MDL-35978 comments: fix for comments block which has no toggler 2017-01-31 11:33:02 +08:00
Andrew Nicols 0db0a63e50 Merge branch 'MDL-57296-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-01-31 08:54:47 +08:00
wehr 120798e85f MDL-57592 assignment: Adds filtering of assignment name in grader view 2017-01-30 18:25:17 +01:00
Tim Hunt 4679634e36 MDL-57588 questions: regrading should not lose flags 2017-01-30 14:32:16 +00:00
Dan Poltawski 1c0462deb3 Merge branch 'wip-MDL-57782-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-01-30 10:08:28 +00:00
Dan Poltawski 7dc8cc1ab6 Merge branch 'MDL-35978-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-01-30 09:54:13 +00:00
Dan Poltawski 170cd579ff Merge branch 'MDL-36233-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2017-01-30 09:34:54 +00:00
Ankit Agarwal 6c83de1d51 MDL-57296 gradelib: Fix get_hidding_effect for grade_type_none items 2017-01-30 13:49:57 +05:30
Ankit Agarwal 0ef42d5f6d MDL-57296 gradebook: Fix issue with gradebook while collapsing grades 2017-01-30 13:49:57 +05:30
Mike Churchward ffc60d23b4 MDL-36233 mod_assign: fixed submission time comparison sql and test. 2017-01-30 09:26:39 +08:00
Rajesh Taneja 4f5a6ca40e MDL-54628 behat: Set behat dir for each run under behat_dataroot
Before this patch behat_dataroot for parallel runs
were created at same level as ->behat_dataroot
After this patch, it will be created 1 level under
->behat_dataroot with BEHAT_PARALLEL_SITE_NAME
prefix and run number as suffix. This will allow
common files as test enabled and parallel run info
to be saved in parent directory and access it easily.
2017-01-30 09:23:58 +08:00
Rajesh Taneja a669c6b21e MDL-54628 behat: Show parallel run command with proper rerun option 2017-01-30 09:23:58 +08:00
Kevin Wiliarty e7734513b8 MDL-57113 boost: min-width for region-main in grade views 2017-01-28 11:47:13 -05:00
Amy Groshek 44b4f83298 MDL-57785 scorm: Prevents SCORM nav refresh when nav not shown.
This improvement prevents refresh of SCORM 1.2 navigation menu
when the navigation menu is not displayed.
2017-01-27 09:12:45 -06:00
Marina Glancy 49053808a2 MDL-57782 enrol_self: fix check when email needs to be sent
Thanks to Leandro for providing a fix
2017-01-27 14:25:17 +08:00
Helson Castro 8ea5d72218 MDL-57568 forms: Added missing include for button element. 2017-01-27 14:01:16 +08:00
Jake Dallimore e33b7b342a MDL-35978 comments: expandable comments announce change when toggled
Added role and aria-expanded attributes to the toggler link and added
a key handler for the space and enter keys.
2017-01-27 13:07:12 +08:00
Jun Pataleta f33a8d4eee MDL-57660 mod_forum: Preserve forum ID selection after form submission 2017-01-27 10:09:54 +08:00
Eloy Lafuente (stronk7) 6a4a1d812c weekly release 3.2.1+ 2017-01-27 00:28:06 +01:00
Eloy Lafuente (stronk7) c94dce9c89 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-01-27 00:28:01 +01:00
Tim Hunt a551ea0210 MDL-57587 question file access: fix regression caused by MDL-53744 2017-01-26 18:54:28 +00:00
Michael Aherne 72b489ef65 MDL-57777 rss: Return 404 when context not found. 2017-01-26 10:51:47 +00:00
Eloy Lafuente (stronk7) 827d93f88a Merge branch 'MDL-55915_32' of https://github.com/rezaies/moodle into MOODLE_32_STABLE 2017-01-24 22:11:41 +01:00
AMOS bot 884f4d3ec3 Automatically generated installer lang files 2017-01-25 00:04:42 +08:00
Ankit Agarwal a072271853 MDL-57300 lti: Rename lti2 as registration url
AMOS BEGIN
CPY [registrationurl,mod_lti],[registrationurl,enrol_lti]
AMOS END
2017-01-24 16:41:04 +05:30
Ankit Agarwal 95c794075a MDL-57300 lti: Fix incorrect variable types in docs 2017-01-24 16:41:04 +05:30
Dan Poltawski 890f84cdb2 Merge branch 'MDL-57639-32' of git://github.com/andrewnicols/moodle into MOODLE_32_STABLE 2017-01-24 10:11:29 +00:00
Dan Poltawski b4e1bbef47 Merge branch 'MDL-57667-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-01-24 09:40:57 +00:00
Andrew Nicols 678d051bee Merge branch 'm32_MDL-46782' of git://github.com/danmarsden/moodle into MOODLE_32_STABLE 2017-01-24 10:44:03 +08:00
Dan Marsden c83ef7e25b MDL-46782 mod_scorm: fix completion test, remove redundant test. 2017-01-24 13:06:57 +13:00
Dan Poltawski 1ee447d3a4 Merge branch 'wip_32_mdl-50625_ldap_better_check_paged_results_support' of https://github.com/iarenaza/moodle into MOODLE_32_STABLE 2017-01-23 16:21:02 +00:00
Dan Poltawski 217d523d43 Merge branch 'wip-MDL-57511-32' of git://github.com/Beedell/moodle into MOODLE_32_STABLE 2017-01-23 15:39:57 +00:00
Dan Poltawski 76cebe50cb Merge branch 'MDL-57415_m32v1' of https://github.com/sbourget/moodle into MOODLE_32_STABLE 2017-01-23 12:24:11 +00:00
Dan Poltawski 7dfc04ff98 Merge branch 'MDL-57287-32' of git://github.com/snake/moodle into MOODLE_32_STABLE 2017-01-23 12:19:23 +00:00
Dan Poltawski ff037d9698 Merge branch 'mdl57668-moodle32' of https://github.com/tlock/moodle into MOODLE_32_STABLE 2017-01-23 12:05:33 +00:00
Dan Poltawski 39dc183d9f Merge branch 'wip-mdl-57700-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-01-23 11:59:11 +00:00
Dan Poltawski f7ddcd23f8 Merge branch 'MDL-57677-32-usermodified' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-01-23 09:48:12 +00:00
Dan Poltawski 92f57f8397 Merge branch 'm32_MDL-46782' of git://github.com/danmarsden/moodle into MOODLE_32_STABLE 2017-01-23 09:28:31 +00:00
Dan Poltawski 98f246ae97 Merge branch 'MDL-57737-32' of git://github.com/crazyserver/moodle into MOODLE_32_STABLE 2017-01-23 09:26:56 +00:00
Pau Ferrer Ocaña f9e7ee4534 MDL-57737 glossary: Add entry description accepts HTML 2017-01-20 13:26:02 +01:00
Shamim Rezaie b14507a31f MDL-55915 enrol_manual: let fullname()know if user has viewfullnames cap
fullname() relies on its second parameter to determine wheter it should use fullnamedisplay or alternativefullnameformat.
We need to check for moodle/site:viewfullnames capability and pass true as the second parameter to fullname() whereever
the user has this capability.
2017-01-20 19:31:08 +11:00
Shamim Rezaie 4436b9e9dd MDL-55915 core_user: let fullname() know if user has viewfullnames cap
Added $viewfullnames property to the user_selector_base class so anyone using a child class of this class can
let it know if user has viewfullnames capability or not.
2017-01-20 19:30:21 +11:00
Shamim Rezaie 2568183232 MDL-55915 Gradebook: let fullname() know if user has viewfullnames cap
Instruct fullname() to format names on the gradebook grader report with alternativefullnameformat when user
has moodle/site:viewfullnames capability.
2017-01-20 19:28:36 +11:00
Shamim Rezaie bcca23f9c5 MDL-55915 mod_assign: let fullname() know if user has viewfullnames cap
Instruct fullname() to format names on the assignment grading page with alternativefullnameformat when user
has moodle/site:viewfullnames capability.
2017-01-20 19:26:33 +11:00
Rajesh Taneja bab24efe70 MDL-57700 behat: Fixed undefined RuntimeException 2017-01-20 11:05:10 +08:00
Jake Dallimore 45a46ecbd8 MDL-57667 theme: change base layout for boost to columns2
Ensures capability errors are displayed on a page with full navigation.
2017-01-20 08:48:38 +08:00
Stephen Bourget 64cfe467f8 MDL-57728 theme: Fix text display when using tabs 2017-01-19 11:32:52 -05:00
AMOS bot 48f0ebcd49 Automatically generated installer lang files 2017-01-20 00:07:16 +08:00
John Beedell 6537c557b5 MDL-57511 Quiz: Attempts report shows non-unique debugging 2017-01-19 14:44:16 +00:00
Iñaki Arenaza 225e039e73 MDL-50625 auth_ldap: Better check for paged results support
There is at least one LDAP server (Sun Directory Server) that doesn't
support Paged Results extension, even if it supports LDAP version 3. So
checking just for LDAP version is not enough.

If possible, we check the supportedControl attribute of the LDAP rootDSE
and see if the paged results control is available. This needs an LDAP
connection, which might not be possible to establish before we configure
some essential LDAP settings (server, bind user, password, etc.). Thus
we try to establish the connection and check the supportedControl
attribute. But if we fail, we perform only basic checks that are less
accurate and err on the side of cautiousness.
2017-01-19 10:58:13 +01:00
Andrew Nicols c8dddb5ccb MDL-57639 mod_forum: Update to use correct variable name
This addresses a regression where unnecessary attributes were removed
from the old variable. This one was missed.
2017-01-19 13:47:45 +08:00
Andrew Nicols 3e276d6efa weekly release 3.2.1+ 2017-01-19 12:17:57 +08:00
Andrew Nicols adf2ea6166 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-01-19 12:17:56 +08:00
Andrew Nicols fd90d0e925 MDL-57613 enrol_lti: Correct location of upgrade step 2017-01-19 07:56:17 +08:00
Tim Lock 58a4ce4774 MDL-57668 mod_assign: Fix optional_param() form processing 2017-01-19 08:08:07 +10:30
Stephen Bourget b44972cc8b MDL-57415 user: Add missing bootstrap classes to participants page 2017-01-18 10:38:33 -05:00
Dan Poltawski 655570df00 MDL-57604 mod_assign: fix empty case in user selector
Sadly the js arguments object gives an arguments.length of 1 when
no arguments are passed, so we have to explicitly check for it.
2017-01-18 09:59:33 +01:00
Dan Marsden dbf70dec42 MDL-46782 mod_scorm: Load first incomplete sco on re-entry. 2017-01-18 21:03:52 +13:00
Rajesh Taneja c40ed5f6ff MDL-45821 behat: navigate back to scorm to avoid scroll
On Exiting scrom activity, it goes back to course
and scrolls to section. On slow machines next step
fails. To avoid such case navigate to home screen
and then follow next step.
2017-01-18 13:03:07 +08:00
Andrew Nicols 2827c7f997 Merge branch 'MDL-57634-m32' of https://github.com/micaherne/moodle into MOODLE_32_STABLE 2017-01-18 12:38:14 +08:00
Andrew Nicols 2259fb5f36 Merge branch 'wip_MDL-57590_32_forum_search' of https://github.com/mchurchward/moodle into MOODLE_32_STABLE 2017-01-18 08:38:10 +08:00
Dan Poltawski 6dc7039af9 MDL-57604 mod_assign: Adding some missing stuff in 32_STABLE
In order to keep 31, 32 and master the same.
2017-01-18 01:04:48 +01:00
Eloy Lafuente (stronk7) ee7b977a8b Merge branch 'MDL-57604-32' of git://github.com/danpoltawski/moodle into MOODLE_32_STABLE 2017-01-18 00:17:11 +01:00
Eloy Lafuente (stronk7) f4841f394c Merge branch 'wip-MDL-57608-32-3' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-01-17 20:46:19 +01:00
David Mudrák 6973e38a91 MDL-57677 mod_forum: Fix wrong user displayed as the last post's author
In the recent issue MDL-56225, we started to record the current user as
the usermodified in the forum_discussions table when updating a forum
post. It made sense but it was a mistake.

Even if the current user really modifies the discussion by updating the
post, the field usermodified has actually been always interpreted and
displayed as the last post' author. Not as the last user who touched the
discussion.

This patch reverts that particular change to the previous behaviour and
adds explicit unit test for it.
2017-01-17 19:39:40 +01:00
AMOS bot c1b158b569 Automatically generated installer lang files 2017-01-18 00:07:24 +08:00
Dan Poltawski 21a8a95869 Merge branch 'wip-mdl-57669-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-01-17 10:28:52 +00:00
sam marshall 359914c8f6 MDL-57515 Resource: 'not very efficient' with a large number of files
Fixes bug where the resource module loads metadata for all files while
building course modinfo, even though it only needs the first file.
(This causes problems if you have ~10k files.)
2017-01-17 10:22:13 +00:00
Jake Dallimore 95208fe135 MDL-57287 themes: fix buttons in default dashboard page header
This fix modifies styling for pages having no navbar, such as the
dashboard, site home and default dashboard pages and fixes an overlap
problem with the buttons and context header.
2017-01-17 15:55:39 +08:00
Rajesh Taneja df428648ee MDL-57669 behat: Exit with error code if step undefined 2017-01-17 10:32:47 +08:00
Dan Poltawski 9148905e9a Merge branch 'MDL-57368-32-2' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-01-16 16:19:57 +00:00
Dan Poltawski 64df3fed13 Merge branch 'MDL-57613-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2017-01-16 16:17:16 +00:00
Mike Churchward ed4aaea57b MDL-57590 mod_forum: fixed search form with forumid and actionurl. 2017-01-16 11:16:27 -05:00
AMOS bot 163fc8588d Automatically generated installer lang files 2017-01-17 00:08:10 +08:00
Dan Poltawski 39e34b9586 Merge branch 'MDL-57452_behat_completion_fix_master_MOODLE_32_STABLE' of https://github.com/gthomas2/moodle into MOODLE_32_STABLE 2017-01-16 13:34:09 +00:00
Dan Poltawski 5c63ab7ee8 Merge branch 'MDL-57601-m32' of https://github.com/sammarshallou/moodle into MOODLE_32_STABLE 2017-01-16 12:23:06 +00:00
Dan Poltawski 3e3068cd11 Merge branch 'MDL-57374_m32' of https://github.com/dasistwas/moodle into MOODLE_32_STABLE 2017-01-16 12:10:51 +00:00
Dan Poltawski a27dde0ba7 Merge branch 'MDL-57554-32' of git://github.com/crazyserver/moodle into MOODLE_32_STABLE 2017-01-16 11:17:59 +00:00
Dan Poltawski b92400a49f Merge branch 'm32_MDL-45821' of git://github.com/danmarsden/moodle into MOODLE_32_STABLE 2017-01-16 09:17:50 +00:00
Dan Poltawski a477c8b752 Merge branch 'wip-MDL-56271-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2017-01-16 08:01:23 +00:00
Pau Ferrer Ocaña 7f52d5c740 MDL-57554 forum: Mark as read on view_forum_discussion calls 2017-01-13 09:27:06 +01:00
John Okely f52bdbb885 MDL-57613 enrol_lti: Allow longer nonces 2017-01-13 11:22:19 +08:00
David Bogner 7c519588f1 MDL-57374 editor: Pasting plain text in Atto removes all styles/classes 2017-01-12 18:00:37 +01:00
AMOS bot 7345917de4 Automatically generated installer lang files 2017-01-13 00:05:19 +08:00
Stephen Bourget 8a71b10a68 MDL-53991 calendar: fix repeating events on course import 2017-01-12 09:40:38 -05:00
Michael Aherne 18907a51d5 MDL-57634 messaging: Ensure test uses a configured plugin 2017-01-12 12:31:56 +00:00
gthomas2 11d04ffe8a MDL-57452 behat: Make completion check work with manual completion input 2017-01-12 11:38:59 +00:00
Dan Poltawski 5e1014a76e weekly release 3.2.1+ 2017-01-12 07:42:37 +00:00
Dan Poltawski 6e497e6e7d Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-01-12 07:42:36 +00:00
Jake Dallimore 66a4a376ee MDL-57368 mod_feeback: fix drag and drop question reordering in boost 2017-01-12 11:37:43 +08:00
Jake Dallimore 3563244314 MDL-57368 templates: add example context to core_form/element-template 2017-01-12 11:37:34 +08:00
Dan Poltawski bf02dc9819 MDL-57608 media_videojs: lazily load videojs on demand
The videojs javascript is over 1MB of javascript which we don't need to
load on every page, now that we only require it demand, the js can be
lazily loaded when its needed, which keeps the first.js smaller and more
likely to stay in browser cache.
2017-01-12 10:56:06 +08:00
Dan Poltawski 8e8c066448 MDL-57608 media_videojs: fix third party locations 2017-01-12 10:56:06 +08:00
Marina Glancy 67f83d9279 MDL-57608 media_videojs: load youtube module only when requested 2017-01-12 10:56:06 +08:00
Michael Aherne bcd1915dd0 MDL-57630 messaging: Pass unit test with third-party plugins 2017-01-11 16:39:31 +00:00
Eloy Lafuente (stronk7) 992ffccfd2 Merge branch 'wip-mdl-57595-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-01-11 02:29:56 +01:00
Dan Poltawski 97fd5a9841 Merge branch 'MDL-57480-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2017-01-10 08:40:12 +00:00
Marina Glancy 6b47a070e7 MDL-56271 mod_feedback: recaptcha was not working 2017-01-10 14:08:26 +08:00
David Monllao b4cfb7d733 Merge branch 'MDL-57385-32-2' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2017-01-10 05:27:11 +01:00
Marina Glancy a9fa51024f MDL-50770 blocks: copy sitewide blocks positions when cloning dashboards 2017-01-10 11:40:27 +08:00
Jun Pataleta 2eec6ffc6c MDL-57385 core: Set page layouts of non-mydashboard pages to standard
The following pages are using the "mydashboard" page layout:
* User preferences > Badges > Manage badges
* User preferences > Badges > Backpack settings
* User preferences > Repositories > Manage instances
* Private files
However, the "mydashboard" page layout should only be used for the user's
dashboard page. Changing these to use the "standard" page layout.
2017-01-10 09:46:18 +08:00
Rajesh Taneja 3f1574f849 MDL-57595 behat: Added redirect and wait to ensure next step pass 2017-01-10 08:45:43 +08:00
Jake Dallimore 40b78a23e9 MDL-57480 core_course: make drag and drop fire a dom updated event
When adding media via drag and drop, the notifyFilterContentUpdated
event should be called after the item is added to the DOM. This allows
things like videojs for example, to process the new content.
2017-01-10 07:47:18 +08:00
Dan Poltawski fb5655b5c2 MDL-57604 mod_assign: fix incorrect user being selector from chooser
Previously there was a logic bug where by if some students were filtered
from the list, the label for another student could be attached to the
'filered' student.

This fix reworks the promises a bit so we render the student summary and
then build an row with the explict user id, rather than itterating through
the array later.

I also remove the storing of the initial promise in a varible because
this is an easy way to introduce a bug (not waiting for the .then()
chained promise)
2017-01-09 20:28:01 +00:00
sam marshall 405dcba6f3 MDL-57601 Grade report: Error for ungraded quiz without view hidden
If a course contains an ungraded quiz (max grade set to 0), and there
is a user account which can view the grader reports but does not have
permission to view hidden grades, they will get errors.
2017-01-09 17:14:44 +00:00
Dan Poltawski 7f32c5a447 Merge branch 'MDL-57427_m32' of https://github.com/jrchamp/moodle into MOODLE_32_STABLE 2017-01-09 16:26:18 +00:00
AMOS bot ec3eeb7ace Automatically generated installer lang files 2017-01-10 00:04:55 +08:00
Jonathan Champ 1af3d13bf3 MDL-57427 cache: Use perfdebug only when enabled 2017-01-09 10:18:41 -05:00
David Monllao 84122523ba Merge branch 'wip-mdl-55042-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-01-09 12:56:12 +01:00
godric 382c069e52 MDL-40132 lib: Using compare rule results in fatal error.
In getValidationScript function variable $element can be an array or object.
Function attempt get non-existing attributes.
To avoid this we should check before accessing.
2017-01-09 10:30:03 +00:00
Dan Poltawski 3f58a36504 Merge branch 'wip-mdl-56211-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-01-09 09:58:42 +00:00
Dan Poltawski 9e41e4e8ea Merge branch 'MDL-57373-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-01-09 09:42:17 +00:00
Dan Poltawski 7523d99558 Merge branch 'MDL-53367_32' of https://github.com/juancs/moodle into MOODLE_32_STABLE 2017-01-09 08:27:56 +00:00
Dan Marsden 9a375bdf6c MDL-45821 mod_scorm: Check lesson_status correctly for multi-sco. 2017-01-09 20:08:10 +13:00
Eloy Lafuente (stronk7) 07f6358b03 Moodle release 3.2.1 2017-01-08 11:04:37 +01:00
AMOS bot 7ffb98d0f5 Automatically generated installer lang files 2017-01-08 00:04:57 +08:00
Dan Poltawski dda99bb3f2 weekly release 3.2+ 2017-01-06 01:30:59 +00:00
Dan Poltawski 9cff26295b Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2017-01-06 01:30:57 +00:00
Rajesh Taneja 2fd5ceadb5 MDL-56211 behat: Add suite name to faildump path
If suite is not default then add suite name
to end of faildump file name
2017-01-06 09:20:10 +08:00
David Mudrák 5865a6875b MDL-57580 mod_assign: Fix the incorrect type of some input parameters
The PARAM_TEXT has been misused in certain cases here. The 'action'
parameter seems to always be alphabetic, with values like
savesubmission, editsubmission and others as handled in assign::view().

Fixing the action handling fixes the reported XSS issue. While working
on it, I spotted two more places where PARAM_TEXT does not seem
appropriate. I include changes for them too, even if they are no
strictly related to the reported bug and there are no known ways to
abuse it.

* The 'plugin' looks like PARAM_PLUGIN and is even declared as such in
  some other parts of the assignment code (such as feedback forms).

* The 'workflowstate' is one of the ASSIGN_MARKING_WORKFLOW_STATE
  constants and is supposed to be alpha in external function input
  parameters handling, too.
2017-01-05 17:39:51 +01:00
Dan Poltawski ef2eed1b3c Merge branch 'MDL-57563-32-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-01-05 10:11:40 +00:00
Rajesh Taneja 6601017d02 MDL-57531 behat: Set noreplyaddress to valid address
noreplyaddress should be a valid address, else
it will not be saved. For behat we don't send
email, so set it to noreply@example.com, to
avoid failing validation on localhost
2017-01-05 06:52:06 +00:00
Daniel Thee Roperto a204d7d921 MDL-57576 assignment: Overwrite feedback file if it has the same name. 2017-01-05 15:32:51 +11:00
Damyon Wiese bf345fc4ca MDL-57009 javascript: cibot nagging 2017-01-05 09:36:09 +08:00
Damyon Wiese 2722404791 MDL-57009 javascript: Dont rely on async ajax
Recursively pre-scan mustache templates to extract the list of blocks and partials. Then
we can pre-fetch them all and don't have to rely on jquery async ajax (which is deprecated).

This is part of a refactoring of the promises code in the templates module to prevent duplicate requests.
2017-01-05 09:36:09 +08:00
Damyon Wiese 256f820dfd MDL-57009 js: Do not fetch the same template twice
Also clean up promises use of done vs then.
2017-01-05 09:36:09 +08:00
Damyon Wiese 173f5515e3 MDL-57009 js: Skip ajax request for same string
This is done by caching the first promise generated to fetch a string.
2017-01-05 09:36:09 +08:00
David Mudrák 7ed6f330c6 MDL-57563 lang: Use the new newsitemsnumber wording in behat 2017-01-04 22:19:32 +01:00
Helen Foster 418d01aaf4 MDL-57563 lang: Merge English strings from the en_fix language pack 2017-01-04 22:18:31 +01:00
AMOS bot 11f9ff55e1 Automatically generated installer lang files 2017-01-05 00:05:20 +08:00
Dan Poltawski 04d4796089 Merge branch 'MDL-57531-32-phpmailer' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2017-01-04 13:28:39 +00:00
David Mudrák e889aee562 MDL-57531 mail: Validate the sender's email address
The patch adds validation for the noreplyaddress setting variable, for
the explicit $replyto parameter and for the sender's email. In case of
misconfigured noreplyaddress setting, it falls back to the default
noreply address value. In case of invalid email in the user's record,
the email is not sent.

The patch also adds unit test for the value returned by the function
generate_email_processing_address() so that it can be considered as a
valid email, too.

This is supposed to significantly minimise the risk of exploiting the
vulnerability in PHPMailer's Sender field.
2017-01-04 12:37:36 +01:00
David Mudrák 228157ebf5 MDL-57531 mail: Do not let admins set invalid email addresses
The noreply and support emails should always be valid.
2017-01-04 12:37:36 +01:00
Eloy Lafuente (stronk7) c77ae4e017 Merge branch 'MDL-57192-32' of git://github.com/ankitagarwal/moodle into MOODLE_32_STABLE 2017-01-04 11:34:23 +00:00
David Mudrák 1da3022e50 MDL-56225 mod_forum: Fix inability to edit attachments
The 'attachments' is not a real DB field here. It comes from the form's
filepicker and holds the id of the attachments filearea. The function
forum_add_attachment() expects it as a property of the first argument.

There were two possible approaches here. Either to pass the raw $newpost
to forum_add_attachment(), or add the attachments into the list
modifiable fields. The second approach is safer.
2017-01-04 11:34:22 +00:00
David Monllao f6507b8e35 Merge branch 'm32_MDL-49557' of git://github.com/danmarsden/moodle into MOODLE_32_STABLE 2017-01-04 11:34:22 +00:00
David Monllao d52b937932 MDL-57338 templates: Fix modal_cancel template name 2017-01-04 11:34:21 +00:00
Rajesh Taneja ce36e3626f MDL-57536 availability: Fixed css for clean theme 2017-01-04 11:34:21 +00:00
Ankit Agarwal 063f7c198b MDL-56992 core_scss: Don't allow invalid files to be included
We allow only .scss files so allow files to be included only and only if they end in .scss and they exist on server under theme directory.
2017-01-04 11:34:20 +00:00
Andrew Nicols 83dedbcd33 MDL-56225 mod_forum: Remove unnecessary attributes from update 2017-01-04 11:34:20 +00:00
Dan Marsden 0ad466926d MDL-49557 mod_scorm: optionally strip quotes. 2017-01-04 15:45:08 +13:00
Ankit Agarwal ced9a33352 MDL-57192 dml: Temporarily disable query logging during setup 2017-01-03 17:27:08 +05:30
Ankit Agarwal 3b4fba5588 MDL-57192 dml: Support temporarily disabling query logs during setup 2017-01-03 17:27:08 +05:30
Rajesh Taneja 926d5a53ff MDL-55042 phpunit: Get sorted sections
Sometimes db doesn't return records in order
So enusre it is in order so that last record
doesn't have section equal 0. As section 0
can't be deleted.
2017-01-03 10:00:05 +08:00
Eloy Lafuente (stronk7) 9cc9dabf17 Merge branch 'wip-mdl-57494-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2017-01-03 02:35:10 +01:00
Eloy Lafuente (stronk7) cb8be0b6b8 Merge branch 'MDL-57536-32' of git://github.com/jleyva/moodle into MOODLE_32_STABLE 2017-01-02 18:59:55 +01:00
Juan Leyva c6bd4c1a45 MDL-57536 availability: Document required selectors changes
MDL-55839 Introduced some changes in CSS selectors used by the form.js
file.

This caused contributed plugins to not work (javascript stop working)
when editing a module.
2017-01-02 18:52:22 +01:00
Davo Smith 31e4c05002 MDL-47198 filelib: fix curl handling headers with no value 2017-01-02 16:43:52 +01:00
Dan Poltawski c5f11c0f3c Merge branch 'm32_MDL-49557' of git://github.com/danmarsden/moodle into MOODLE_32_STABLE 2017-01-02 12:35:10 +00:00
Dan Poltawski 6158379f75 Merge branch 'MDL-57080-m32' of https://github.com/micaherne/moodle into MOODLE_32_STABLE 2017-01-02 12:15:02 +00:00
Dan Poltawski bc076bf1b8 Merge branch 'wip-MDL-57464-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2017-01-02 11:16:24 +00:00
Dan Poltawski 27a3a42efd MDL-57532 calendar: tidy up button grouping 2017-01-02 10:45:24 +00:00
Dan Poltawski b0c2ea4640 Merge branch 'MDL-57532_m32v1' of https://github.com/sbourget/moodle into MOODLE_32_STABLE 2017-01-02 10:45:20 +00:00
David Monllao 00ef7b1caa Merge branch 'MDL-56926_32' of git://github.com/dmonllao/moodle into MOODLE_32_STABLE 2016-12-30 10:00:08 +01:00
David Monllao 7914b0035f MDL-56926 theme_boost: Restore filepicker's filename and icons original spacing 2016-12-30 09:57:41 +01:00
Nadav Kavalerchik cb358279b7 MDL-56926 Theme/Boost: Fix filepicker folder tree YUI guides 2016-12-30 09:57:35 +01:00
AMOS bot 339edb47e2 Automatically generated installer lang files 2016-12-30 00:05:21 +08:00
Dan Poltawski bd6bc508df Merge branch 'MDL-57512-32' of git://github.com/crazyserver/moodle into MOODLE_32_STABLE 2016-12-29 11:50:58 +00:00
Dan Poltawski c53194f3f9 Merge branch 'm32_MDL-50643' of git://github.com/danmarsden/moodle into MOODLE_32_STABLE 2016-12-29 11:46:48 +00:00
Pau Ferrer Ocaña c477dc23c0 MDL-57512 categories: Use maxcategorydepth only when getting all cats 2016-12-29 12:05:27 +01:00
David Monllao 8cd421e941 Merge branch 'MDL-57338-32' of git://github.com/danpoltawski/moodle into MOODLE_32_STABLE 2016-12-29 10:52:30 +01:00
Dan Poltawski f18c2a9d15 MDL-57338 templates: fix missing example variables
From Davids review, thanks
2016-12-29 08:05:04 +00:00
David Monllao 403e0d96e5 Merge branch 'MDL-57331-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2016-12-28 22:32:33 +01:00
Dan Poltawski 5984ffded4 Merge branch 'MDL-57451-32' of https://github.com/lucisgit/moodle into MOODLE_32_STABLE 2016-12-28 21:17:48 +00:00
Dan Poltawski cd9a925e6a Merge branch 'MDL-55955_32' of git://github.com/markn86/moodle into MOODLE_32_STABLE 2016-12-28 21:17:47 +00:00
Dan Poltawski 40471ed54c Merge branch 'wip-MDL-57366-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2016-12-28 21:17:46 +00:00
David Monllao 000b0949e6 Merge branch 'MDL-57491_m32v3' of https://github.com/sbourget/moodle into MOODLE_32_STABLE 2016-12-28 21:17:46 +00:00
Dan Poltawski 6c7f60dbc0 Merge branch 'MDL-57417-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2016-12-28 21:17:45 +00:00
David Monllao 3b37e372f2 Merge branch 'MDL-52366-32-mustachethemedir' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2016-12-28 12:23:49 +01:00
David Monllao 44b94d9324 Merge branch 'MDL-57450-32' of git://github.com/danpoltawski/moodle into MOODLE_32_STABLE 2016-12-28 11:48:05 +01:00
Dan Poltawski e5bc84f84f MDL-57251 upgrade: bump versions
and remove uncessary ->mark_dirty()
2016-12-28 10:28:37 +00:00
Dan Poltawski a38d0650d4 Merge branch 'wip-MDL-57251-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2016-12-28 10:28:31 +00:00
David Monllao 8d9edc0e7c Merge branch 'MDL-57357-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2016-12-28 11:17:11 +01:00
David Monllao 4e0357c1e3 Merge branch 'MDL-56488-32' of git://github.com/danpoltawski/moodle into MOODLE_32_STABLE 2016-12-28 10:58:22 +01:00
Dan Poltawski 9efd73abec Merge branch 'wip-MDL-57292-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2016-12-28 09:13:37 +00:00
Dan Poltawski c31b5bbf9d Merge branch 'MDL-57474-32-messageid' of git://github.com/mudrd8mz/moodle into MOODLE_32_STABLE 2016-12-28 08:56:06 +00:00
Dan Marsden 7606ba2133 MDL-49557 mod_scorm: fix AICC pre-requisite handling. 2016-12-28 10:09:00 +13:00
Ankit Agarwal 88c0fcb03f MDL-57373 navigation: Fix course names in flat nav 2016-12-27 12:21:02 +05:30
Stephen Bourget 51b7f8f0a4 MDL-57532 calendar: Add missing bootstrap classes 2016-12-26 11:41:50 -05:00
AMOS bot 40fdf0f84f Automatically generated installer lang files 2016-12-27 00:08:58 +08:00
AMOS bot 3e99f4f642 Automatically generated installer lang files 2016-12-26 00:05:52 +08:00
AMOS bot 324e613b48 Automatically generated installer lang files 2016-12-25 00:04:37 +08:00
Adrian Greeve 502397dcbc MDL-57464 mod_lesson: fix notice with sub-clusters. 2016-12-23 11:12:27 +08:00
Jake Dallimore f1f83c3ba1 MDL-57357 auth: add behat coverage for remember username login feature 2016-12-23 11:04:19 +08:00
Jake Dallimore 2c3f09ccf7 MDL-57357 auth: fix the remember username feature on login page 2016-12-23 10:45:06 +08:00
Adrian Greeve e2f5592b8f MDL-57366 mod_lesson: Zero now acceptable numeric answer.
When creating a numerical question. If the answer to the
question is 0 then the answer will not save.
2016-12-23 10:36:12 +08:00
Mark Nelson 522fcf2ffc MDL-55955 mod_quiz: ensure duplicated override events are removed 2016-12-23 10:02:47 +08:00
Jake Dallimore 96e743ff78 MDL-57417 navigation: fix legacy_activity_onclick_handler callback scope 2016-12-23 08:43:37 +08:00
Dan Marsden e514ae345e MDL-50643 mod_scorm: redirect using current window instead of parent. 2016-12-23 10:18:52 +13:00
Stephen Bourget 2659b808ab MDL-57491 report_log: Improve filtering code by using static entries 2016-12-22 16:12:34 -05:00
AMOS bot 54037cf3e2 Automatically generated installer lang files 2016-12-23 00:04:18 +08:00
Dan Poltawski b0773d70c6 MDL-57338 message: fix template component 2016-12-22 12:57:11 +00:00
Dan Poltawski 4348fffe0c MDL-57338 templates: add missing example context 2016-12-22 12:57:11 +00:00
Dan Poltawski 216c68b834 MDL-57338 chart: add example context
And fix aria roles
2016-12-22 12:57:11 +00:00
Dan Poltawski a3c1bd86ed MDL-57338 mustache: fix admin_setting_tabs
* Add example context
* Fix validation issue (need role="tablist" to contain the tabs)
2016-12-22 12:57:11 +00:00
Michael Aherne e0006399ff MDL-57080 completion: Update completion expected date on reset 2016-12-22 11:43:39 +00:00
Tony Butler 2084c59b82 MDL-57451 theme_boost: Add checkboxgroup class to checkbox input element 2016-12-22 11:30:24 +00:00
Dan Poltawski a09a9879e5 weekly release 3.2+ 2016-12-22 08:15:17 +00:00
Dan Poltawski a3a095b6eb Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2016-12-22 08:15:15 +00:00
Adrian Greeve 0edf724367 MDL-57292 tool_lpimportcsv: Fix for unit tests. 2016-12-22 14:41:32 +08:00
Simey Lameze a953ac5942 MDL-57292 tool_lpimportcsv: display progress bar for large imports 2016-12-22 14:41:17 +08:00
Rajesh Taneja 5627b0b1a1 MDL-57494 behat: Fixed tags and removed reset in after_scenario
1. Added missing switch_window tags
2. Fixed switch_frame tags to use switch_iframe
3. Removed reset from after_scenario.
2016-12-22 12:44:38 +08:00
David Monllao 5d3a7be453 Merge branch 'MDL-55575_B_32' of https://github.com/bostelm/moodle into MOODLE_32_STABLE 2016-12-21 05:50:17 +01:00
David Mudrák 8f27fdf1ab MDL-57474 mailer: Make sure that our exlicit MessageID is trimmed
The new version of phpmailer shipped with Moodle 3.2 has added check
that the explicitly provided MessageID matches /^<.*@.*>$/.

Values coming from our overridden moodle_phpmailer::addCustomHeader()
had a whitespace at the start. So the requested value was not used as
the Message-ID header and the default phpmailer value was used.

As a result, forum posts threading was broken in email clients.
2016-12-21 01:11:32 +01:00
AMOS bot 1d5c2c6560 Automatically generated installer lang files 2016-12-21 00:04:00 +08:00
Simey Lameze 18317c7c1c MDL-57114 filemanager: apply btn-sm class to buttons
This commit also creates a new css rule to fix the file picker icons misalignment.
2016-12-20 10:34:08 +00:00
Dan Poltawski b83fd5b1fe Merge branch 'MDL-54996_m32v1' of https://github.com/sbourget/moodle into MOODLE_32_STABLE 2016-12-20 09:19:27 +00:00
Juan Segarra Montesinos 972304f4cb MDL-53367 mod_forum: Subscribe current users when importing a forum
Subscribes currently enrolled users when importing a forum with
automatic subscription enabled.
2016-12-20 08:55:34 +01:00
Adrian Greeve 11eeb2e347 MDL-57251 navigation: Correct permission shows site admin
If the user does not have the moodle/site:configview
capability then do not show them the site administration
link.
2016-12-20 14:54:34 +08:00
Adrian Greeve 0aa8b11f5c MDL-57251 administration: Updated coursecreator role.
The coursecreator role now has the moodle/site:configview
capability so that they have access to the required admin
pages.
2016-12-20 14:54:34 +08:00
John Okely 829cafc050 MDL-57331 messaging: Fix sent messages appearing twice. 2016-12-20 10:48:01 +08:00
John Okely 25474b5e84 MDL-57268 auth_db: Unit tests for deletion from a large user set 2016-12-20 02:27:05 +01:00
Rafal Domagalski b7f902b5b3 MDL-52366 themes: check for templates in themedir 2016-12-19 18:08:37 +01:00
Dan Poltawski 11488775eb Merge branch 'MDL-57386-32' of git://github.com/damyon/moodle into MOODLE_32_STABLE 2016-12-19 15:46:59 +00:00
Dan Poltawski 32ec7e3d30 Merge branch 'MDL-55568_m32v2' of https://github.com/sbourget/moodle into MOODLE_32_STABLE 2016-12-19 14:33:06 +00:00
Dan Poltawski 1a1eef4345 Merge branch 'wip-MDL-56912-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2016-12-19 12:21:23 +00:00
Eloy Lafuente (stronk7) 4942dfc7cd Merge branch 'MDL-57270_32' of git://github.com/markn86/moodle into MOODLE_32_STABLE 2016-12-19 13:04:25 +01:00
Eloy Lafuente (stronk7) d469fb2181 Merge branch 'MDL-57293-32' of git://github.com/danpoltawski/moodle into MOODLE_32_STABLE 2016-12-19 13:02:16 +01:00
Dan Poltawski 0213ce081c Merge branch 'MDL-52098_32_STABLE' of git://github.com/Chocolate-lightning/moodle into MOODLE_32_STABLE 2016-12-19 11:25:49 +00:00
David Monllao 70b6a6618a Merge branch 'MDL-57402_32' of git://github.com/timhunt/moodle into MOODLE_32_STABLE 2016-12-19 12:23:45 +01:00
Dan Poltawski 089cf944f3 MDL-57450 enviroment: remove tls library check
Unfortunately it has come to light that the version sniffing is just not
reliable at all, operating system vendors backport security patches to
older versions - so in many cases we reporting a problem which is not a
problem. False positives and the solution to self-compile or something
like php will be causing more harm than good.
2016-12-19 10:53:59 +00:00
Dan Poltawski 68d9adcba8 Merge branch 'MDL-53044-m32' of https://github.com/ak4t0sh/moodle into MOODLE_32_STABLE 2016-12-19 08:47:23 +00:00
Dan Poltawski 32636d1757 Merge branch 'MDL-55715_m32v1' of https://github.com/sbourget/moodle into MOODLE_32_STABLE 2016-12-19 08:35:43 +00:00
Stephen Bourget 48ff43d3bd MDL-54996 Calendar: Fix dates for future multi-day events
Thanks to Martin Cunliffe for providing the fix
2016-12-17 10:53:00 -05:00
Mathew May 725863abe4 MDL-52098 enrol: cohort now looks at instance status 2016-12-16 11:22:06 +13:00
Arnaud Trouve 9de4bbf8a8 MDL-53044 auth : force change on expired password 2016-12-15 15:11:30 +01:00
Dan Poltawski cd7ca81fdd MDL-57293 lang/email: Improve emailvia string
* Strip the https? part of url for existing strings
* Switch the string to (via shortname)
2016-12-15 09:54:34 +00:00
Andrew Nicols 1ca30f2503 weekly release 3.2+ 2016-12-15 11:34:25 +08:00
Andrew Nicols c47a9439d3 Merge branch 'install_32_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_32_STABLE 2016-12-15 11:34:21 +08:00
Damyon Wiese 2ce5b1d637 MDL-57386 blocklib: wrong variable in is_block_present
This isn't reachable code in core moodle, but themes/plugins could call is_block_present to trigger it.
2016-12-15 10:51:31 +08:00
Tim Hunt c4ade76ee5 MDL-57402 quiz editing: fix add heading after remove page break 2016-12-14 16:35:17 +00:00
AMOS bot 62fc665ff6 Automatically generated installer lang files 2016-12-15 00:04:14 +08:00
Dan Poltawski 263865899e MDL-56488 boost: validate scss settings for parsable scss
* Parses the scss and fails validation if a parse error is found

* Does not detect the situation when variables are not present - this
  would involve us parsing the entire tree and would be slow. It could
  also change over time, depending on whats defined in the scss
  from themes.

* Introduces a new admin_setting_scsscode to do this
2016-12-14 11:34:25 +00:00
Mark Nelson f927f3e196 MDL-57270 core_message: trim message before it is sent 2016-12-14 12:19:24 +08:00
Stephen Bourget 70f5e9ba61 MDL-55715 calendar: Only update events from the current subscription
The iCal import should only update calendar events from the current
subscription not any subscription that contains the same event.
2016-12-13 22:06:44 -05:00
Andrew Nicols 3b7bf2cee0 Merge branch 'wip-mdl-57380-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2016-12-14 09:56:57 +08:00
Mark Nelson a57a9053d7 MDL-55062 tool_uploaduser: prevent defaults when not selected 2016-12-14 09:49:04 +08:00
Rajesh Taneja 0292245755 MDL-57380 behat: Check for list tags and text
after list tag span can be added on few browsers
like chrome 51.0, so test if text starts with
list tag and contains text
2016-12-14 09:38:35 +08:00
Stephen Bourget dd7aa695b2 MDL-55568 chat: chat_refresh_events should only create published events 2016-12-13 18:53:40 -05:00
Eloy Lafuente (stronk7) 2626dce64c Merge branch 'MDL-55809-32' of https://github.com/xow/moodle into MOODLE_32_STABLE 2016-12-13 20:05:23 +01:00
Dan Poltawski 7e2e135943 Merge branch 'MDL-57125-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2016-12-13 16:34:58 +00:00
Matt Davidson cc15b9d46f MDL-56810 unoconv: task fails if user removed
If the user is removed from a course after a submission has been made,
the task will crash and never continue.  This removes submissions from
the cron task if the user isn't enrolled in the course.
2016-12-13 14:56:52 +00:00
Eloy Lafuente (stronk7) ce47bacfe9 Merge branch 'MOODLE_32_STABLE' of https://github.com/fwsl/moodle into MOODLE_32_STABLE 2016-12-13 12:00:58 +01:00
ak4t0sh 7c89091995 MDL-55720 course: fix potential undefined variable and cleaning
This commit replace $e usage by $returnfromfunc.
Indeed $returnfromfunc always exists in the scope and take $e value in case of moodle_exception.

This commit also remove useless $modcontext affectation.
2016-12-13 11:49:32 +01:00
Henning Bostelmann 7766ffc618 MDL-55575 mod_glossary: Allow viewing all entries on one page 2016-12-13 11:46:03 +01:00
Mark Nelson 75efa0860c MDL-57250 core: show admin settings when only one category exists 2016-12-13 10:25:19 +00:00
Dan Poltawski d31412392c Merge branch 'MDL-56859-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2016-12-13 09:45:19 +00:00
Dan Poltawski da694c75ff Merge branch 'MDL-57074-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2016-12-13 09:26:08 +00:00
Adrian Greeve 76f5d7b9ab MDL-57216 navigation: Updated parent behat test. 2016-12-13 09:04:40 +00:00
Adrian Greeve e7d8926583 MDL-57216 navigation: Added missing grade overview link.
For theme_boost the grade overview link has been added
to the user profile page.
2016-12-13 09:04:36 +00:00
Dan Poltawski c87f1ac4c7 Merge branch 'MDL-57182-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2016-12-13 08:47:35 +00:00
Dan Poltawski 75c4f5b0ca Merge branch 'wip-MDL-57257-32' of git://github.com/abgreeve/moodle into MOODLE_32_STABLE 2016-12-13 08:46:03 +00:00
Marina Glancy f7b3774380 MDL-56912 feedback: empty multichoice questions do not submit 2016-12-13 15:01:04 +08:00
Andrew Nicols 78293c74bf Merge branch 'MDL-57213-32-2' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2016-12-13 13:06:25 +08:00
Simey Lameze 406fc019c1 MDL-57125 comment: prevent js execution if there are no comments 2016-12-13 11:55:05 +08:00
Jun Pataleta 903cd37434 MDL-57213 navigation: Load all my course categories into navigation tree
* Load all of the relevant course categories of the courses that a user
  is enrolled in.
2016-12-13 11:43:22 +08:00
Nadav Kavalerchik 6fd8b0098a MDL-57056 Theme/Boost: Fix "Skip to" link when Tab key pressed 2016-12-13 10:47:50 +08:00
Jan Dageförde 34954a6050 MDL-57257 lesson: Validate type of numerical answer 2016-12-13 10:34:36 +08:00
Mark Nelson 949d8ae04e MDL-57222 mod_assign: show validation message on visible element 2016-12-13 10:30:38 +08:00
Eloy Lafuente (stronk7) 1c7cbed23c Merge branch 'wip-mdl-57328-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2016-12-13 02:30:06 +01:00
Eloy Lafuente (stronk7) 9156498826 Merge branch 'mdl32_MDL-57324' of git://github.com/danmarsden/moodle into MOODLE_32_STABLE 2016-12-13 02:02:02 +01:00
Jake Dallimore 71adc9a9a3 MDL-57182 navigation: fix login failures display in page footer.
A bug introduced with MDL-45893 meant that the failure count was being
reset, causing the footer code to be skipped. This patch fixes that
bug and adds behat tests covering the displayloginfailures feature.
2016-12-13 07:20:58 +08:00
Eloy Lafuente (stronk7) 49612b733f Merge branch 'MDL-57319-32' of git://github.com/danpoltawski/moodle into MOODLE_32_STABLE 2016-12-12 16:23:20 +01:00
Arnaud Trouve bc0721c7d9 MDL-56525 forum: remove targeted user enrolment check
By removing the check on the targeted user's enrolment we allow to show his forum posts even if he is unenrol from a course (obviouly we need to have access to this course to view them)
2016-12-12 14:10:21 +00:00
Ryan Wyllie c5452484ee MDL-55782 groups: wrap long group names (theme: boost)
In the groups UI if a group name is very long it now no longer underlaps
the user column on its right hand side.
2016-12-12 13:19:18 +00:00
= 74eecb6078 MDL-55782 groups: wrap long group names
In the groups UI if a group name is very long it now no longer underlaps the user
column on its right hand side.
2016-12-12 13:19:15 +00:00
Dan Poltawski 725be51c11 Merge branch 'wip-mdl-52796-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2016-12-12 13:00:56 +00:00
Philipp Hager d0d8a7f984 MDL-57198 course: add css-classes to restrictbygroup-button 2016-12-12 12:46:52 +00:00
Adrian Greeve 4a50811ae3 MDL-57299 Atto: Theme boost fix for manage files.
Theme boost removed a selector that was being used
to remove used files and so the page wasn't loading
properly.
2016-12-12 12:40:09 +00:00
Dan Poltawski b82ddcbcac Merge branch 'wip-mdl-57325-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2016-12-12 12:23:25 +00:00
Dan Poltawski 6e4cc6caf4 Merge branch 'wip-mdl-57314-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2016-12-12 12:21:31 +00:00
Dan Poltawski fe8e9b1b4e Merge branch 'wip-mdl-57343-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2016-12-12 12:21:13 +00:00
Dan Poltawski 72770e9a60 Merge branch 'MDL-57171-32-2' of git://github.com/junpataleta/moodle into MOODLE_32_STABLE 2016-12-12 10:31:13 +00:00
Dan Poltawski a847efc70b Merge branch 'MDL-56566_32' of https://github.com/bostelm/moodle into MOODLE_32_STABLE 2016-12-12 09:20:13 +00:00
Ilya Tregubov 9e99327888 MDL-55906 table: Update user preferences table when reset preferences 2016-12-12 09:07:30 +00:00
Andrew Nicols 9973eebb91 Merge branch 'MDL-46714-32-nadav' of git://github.com/FMCorz/moodle into MOODLE_32_STABLE 2016-12-12 13:26:58 +08:00
Nadav Kavalerchik a162f636d8 MDL-46714 Calendar: Properly order Date & Time fields in RTL mode 2016-12-12 12:38:45 +08:00
Rajesh Taneja 8ff8d598fe MDL-57343 behat: Ensure we wait enough for page to be fully loaded 2016-12-12 10:38:32 +08:00
Ramindu Deshapriya 8704d2e5fc MDL-52796 behat: Behat feature to test reset wiki page, tags & comments 2016-12-12 10:27:44 +08:00
Bram Tassyns f9dd21a17a MDL-56859 SCORM: player shouldn't display TOC while loading 2016-12-12 09:11:50 +08:00
Jake Dallimore eb349bdfc4 MDL-57074 Filepicker: Fix alias and link icons in RTL mode
Fixed alignment of the images in RTL mode. Also fixed a z-index problem
in which the icons were displayed above the open drawer on narrow
screens.
2016-12-12 08:48:15 +08:00
AMOS bot 89d186af72 Automatically generated installer lang files 2016-12-10 00:04:00 +08:00
Dan Poltawski 65de977483 MDL-57319 outputlib: raise timeout for scss/less compilation 2016-12-09 08:47:05 +00:00
Rajesh Taneja e167481759 MDL-57328 core: Remove xdebug extension, so test run faster 2016-12-09 10:24:01 +08:00
Rajesh Taneja 457c913461 MDL-57325 behat: Fixed backup/restore steps to use proper api 2016-12-09 09:31:13 +08:00
Rajesh Taneja 422449dca8 MDL-57328 core: Run tests with php 7.1 2016-12-09 08:49:21 +08:00
Dan Marsden 53c8f0ca3c MDL-57324 scorm: exclude objective raw.score from grade update 2016-12-09 10:13:20 +13:00
Henning Bostelmann b094b88a9a MDL-56566 mod_assign: ignore "doanything" in course overview
Do not count site admin "doanything" capability for determining
what should be shown in the course overview for assignments.
2016-12-08 20:28:10 +00:00
AMOS bot 49e5d04a8d Merge branch 'MOODLE_32_STABLE' into install_32_STABLE 2016-12-09 00:04:15 +08:00
AMOS bot 38e28dfbcd Automatically generated installer lang files 2016-12-08 18:11:21 +08:00
Dan Poltawski 44047dc78d weekly release 3.2+ 2016-12-08 08:43:05 +00:00
Marina Glancy c06b8145b1 MDL-56614 behat: add missing wait for page is ready 2016-12-08 13:51:53 +08:00
Franziska Hübler 79da2c5bfa MDL-55809 glossary: Keep file author and license across import/export 2016-12-08 12:28:22 +08:00
Andrew Nicols a5800adaf0 Merge branch 'MDL-57278-32-5' of https://github.com/xow/moodle into MOODLE_32_STABLE 2016-12-08 10:53:37 +08:00
John Okely c1c3f50965 MDL-57278 signup: Fix double encoding of confirmation links 2016-12-08 10:17:50 +08:00
John Okely cff14cf0d1 MDL-57278 signup: Unit tests covering confirmation link generation 2016-12-08 10:17:50 +08:00
Rajesh Taneja c95ea731bc MDL-57314 behat: Press enter after setting password unmask 2016-12-08 09:24:37 +08:00
Rajesh Taneja b98f14632b MDL-56642 dataformat: Fixed method_exits parameters 2016-12-08 00:37:03 +01:00
Mark Nelson a1e1b45ae7 MDL-57283 core: fixed function call on null 2016-12-07 10:17:36 +00:00
Kenneth Hendricks 2d44bb544b MDL-56674 core: Fix test_get_all_observers 2016-12-07 08:46:04 +00:00
Marina Glancy c60d333578 MDL-56614 behat: corrections to new steps 2016-12-07 14:58:39 +08:00
Andrew Nicols 182690b018 Merge branch 'wip-mdl-56353-m32' of https://github.com/rajeshtaneja/moodle into MOODLE_32_STABLE 2016-12-07 12:03:36 +08:00
Rajesh Taneja b36b54179d MDL-56353 behat: Added test for multi select dependency 2016-12-07 11:19:01 +08:00
Andrew Nicols fc4b768e25 Merge branch 'wip-MDL-56642-32' of git://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2016-12-07 10:00:59 +08:00
Andrew Nicols 7e0f1972f1 Merge branch 'MDL-57266_32' of git://github.com/stronk7/moodle into MOODLE_32_STABLE 2016-12-07 09:54:33 +08:00
Andrew Nicols 93e64c823c Merge branch 'MDL-56240_32' of git://github.com/stronk7/moodle into MOODLE_32_STABLE 2016-12-07 09:51:07 +08:00
Rajesh Taneja 20d598f094 MDL-56614 behat: Fixed steps to use new definition 2016-12-07 09:43:06 +08:00
Marina Glancy e376549179 MDL-56642 dataformat: set temp dir
Thanks to Chien Wen-Chang for proposing a patch
2016-12-07 09:30:25 +08:00
Rajesh Taneja 163a317bcc MDL-57137 behat: Subcategory has black space before name 2016-12-07 09:13:26 +08:00
Dan Poltawski 7ecf13ac1d Merge branch 'MDL-45873_32' of https://github.com/bostelm/moodle into MOODLE_32_STABLE 2016-12-06 15:56:28 +00:00
Ankit Agarwal 2fbe4fca87 MDL-57284 boost: Fix booktool_print icons 2016-12-06 15:50:57 +00:00
Jun Pataleta d07a8ebd7e MDL-57171 admin: Make environment check table look better
* Use Bootstrap label classes for the text under the status column.
* theme_bootstrapbase:
  - Cleanup unnecessary classes and make .error styles consistent
    with .warn styles
* theme_boost:
  - Set font color appropriate for success, warning and error strings.
* Enclose report text in div so that the feedback texts will be
  displayed right below it.
2016-12-06 22:18:55 +08:00
SSRF d4feb70e17 MDL-53677 tool_spamcleaner: CSRF Fix
Resolves minor CSRF within Moodle spamcleaner.
2016-12-06 12:48:31 +00:00
Dan Poltawski f477809e38 Merge branch 'MDL-56836-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2016-12-06 12:46:19 +00:00
Daniel Thee Roperto 94caed45db MDL-56233 forms library: Fixed form identifier when mocking a form.
If the plugin is using namespaces instead of frankenstyle class name,
get_called_class() will return 'type\name' instead of 'type_name'.

Added code to replace backslashes to underscores and fix that issue.
2016-12-06 12:42:17 +00:00
Dan Poltawski 8c4fdb1073 MDL-56778 enrol: add note about legacy css 2016-12-06 12:32:30 +00:00
Nadav Kavalerchik e5bbe44230 MDL-56778 Enrollment: Fix enroll users dialog in RTL mode (theme:Boost) 2016-12-06 12:32:23 +00:00
Tim Hunt d0a58fe035 MDL-57199 question preview: make HTML ids unique 2016-12-06 12:25:45 +00:00
Michael Aherne 9c68157292 MDL-56971 enrol: Use autoloading in enrol_get_plugin() 2016-12-06 11:08:17 +00:00
Grzegorz Ziółek 44f71599df MDL-56830 config_log: Add block plugin visibility changes to config_log. 2016-12-06 11:51:48 +01:00
Alexander Melihov 1fac7b914b MDL-57137 quiz: Create question category with specified parent category
Fix question category generator bug. Now it is possible to specify parent category of subcategory, supply only name of parent category
2016-12-06 15:34:13 +08:00
Tony Butler cede73411f MDL-56346 assignfeedback_editpdf: Correct typo in property name 2016-12-06 14:38:01 +08:00
Andrew Nicols 47deb83b5c Merge branch 'MDL-56301-32' of https://github.com/snake/moodle into MOODLE_32_STABLE 2016-12-06 14:27:03 +08:00
Andrew Nicols 4ea56c1c80 Merge branch 'wip-MDL-56614-m32-2' of https://github.com/marinaglancy/moodle into MOODLE_32_STABLE 2016-12-06 13:38:08 +08:00
Marina Glancy 311121b16c MDL-56614 behat: add navigation block when required
Most of these hacks have links to corresponding MDL issues
2016-12-06 13:35:40 +08:00
Marina Glancy 5863f1b073 MDL-56614 behat: rename step for navigating in the gradebook 2016-12-06 13:35:40 +08:00
Marina Glancy 2bb195f64f MDL-56614 behat: navigate without navigation and admin blocks 2016-12-06 13:35:40 +08:00
Marina Glancy f6b50d9901 MDL-56614 block_navigation: Add block in behat tests 2016-12-06 13:35:39 +08:00
Marina Glancy a0b0234a18 MDL-56614 behat: new steps for navigation without blocks 2016-12-06 13:35:39 +08:00
Andrew Nicols f8b8a363ae Merge branch 'MDL-57161-32' of git://github.com/lameze/moodle into MOODLE_32_STABLE 2016-12-06 13:10:40 +08:00
Donald Barrett b197272987 MDL-56301 course: Use value for intro field if set in a mods function
Respects a module that has set a value for the db field intro in it's lib function modulename_add_instance.
2016-12-06 10:40:49 +08:00
Juan Leyva e4976aefc5 MDL-57255 gradereport_user: Fix default value for graderaw
graderaw is a PARAM_FLOAT, the default to empty string was incorrect
2016-12-06 10:18:53 +08:00
David Monllao dcd408b81f MDL-57161 search: Set the correct HTTP header
All credit goes to Test Valley School
2016-12-06 10:00:07 +08:00
Simey Lameze 4a564ca40b MDL-56759 themes: fix badge list alignment issues 2016-12-06 09:24:31 +08:00
Eloy Lafuente (stronk7) 5da06d632a MDL-57266 upgrade: add 3.2.0 separation line to all upgrade scripts 2016-12-05 17:17:54 +01:00
Eloy Lafuente (stronk7) d797e57255 MDL-56240 upgrade: delete incorrect lines, manually added
Note that, with MDL-57266, we are changine the comment to be:

// Automatically generated Moodle v3.2.0 release upgrade line

in order to make to make to make it clearer that it's an
automatic (part of the release process) comment and should not
be added manually ever.
2016-12-05 16:52:31 +01:00
Frederic Massart 55d2042f0a MDL-56459 competency: Invalid use of indirect property key
This change ensures that PHP7 and earlier work the same way. Before
the patch PHP < 7 would not expand the property as we expected it.

More information here:
http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.variable-handling.indirect
2016-12-05 15:48:47 +00:00
David Mudrák 8cd6972966 MDL-57256 course: Fix display of the Legacy course files link
The patch fixes the classical operator precedence bug.
2016-12-05 15:45:38 +00:00
Henning Bostelmann 9cbc0a0cdb MDL-45873 mode_data: Allow "0" entries in menu field 2016-12-05 09:21:07 +00:00
John Okely 931d12b589 MDL-54921 signup: Only clear wanturl when necessary
Thanks to Juho Jaakkola for original patch idea.
2016-12-05 15:35:25 +08:00
Shamim Rezaie 0beeb95a8a MDL-52840 assignsubmission_file: Change default setting file size
The default value of the assignsubmission_file/maxbytes setting is changed to $CFG->maxbytes.
2016-12-05 13:02:20 +08:00
Mark Nelson 617f8bb911 MDL-57084 core_message: prevent duplication of day separator 2016-12-05 12:28:56 +08:00
Michael Spall 75dd21a002 MDL-56893 grades: Fix edit grade item when grade_report_showmin is false
Check to make sure $data['grademin'] exists. When grade_report_showmin
is false $data['grademin'] doesn't exist.
2016-12-05 12:05:19 +08:00
Bram Tassyns a0c13477ab MDL-56836 SCORM: player doesn't remember display mode when not logged in 2016-12-05 09:25:31 +08:00
23549 changed files with 822492 additions and 2269452 deletions
+79
View File
@@ -0,0 +1,79 @@
# Generated by "grunt ignorefiles"
*/**/yui/src/*/meta/
*/**/build/
node_modules/
vendor/
admin/tool/usertours/amd/src/tour.js
admin/tool/usertours/amd/src/popper.js
auth/cas/CAS/
auth/fc/fcFPP.php
enrol/lti/ims-blti/
filter/algebra/AlgParser.pm
filter/tex/mimetex.*
lib/editor/atto/yui/src/rangy/js/*.*
lib/editor/tinymce/plugins/pdw/tinymce/
lib/editor/tinymce/plugins/spellchecker/rpc.php
lib/editor/tinymce/tiny_mce/
lib/adodb/
lib/bennu/
lib/evalmath/
lib/lessphp/
lib/phpexcel/
lib/google/
lib/htmlpurifier/
lib/jabber/
lib/minify/matthiasmullie-minify/
lib/minify/matthiasmullie-pathconverter/
lib/pear/Auth/RADIUS.php
lib/pear/Crypt/CHAP.php
lib/pear/HTML/Common.php
lib/pear/HTML/QuickForm.php
lib/pear/HTML/QuickForm/
lib/pear/PEAR.php
lib/phpmailer/
lib/simplepie/
lib/tcpdf/
lib/typo3/
lib/yuilib/
lib/yuilib/gallery/
lib/jquery/
lib/html2text/
lib/markdown/
lib/recaptchalib.php
lib/xhprof/
lib/xmlize.php
lib/horde/
lib/requirejs/
lib/amd/src/loglevel.js
lib/mustache/
lib/amd/src/mustache.js
lib/graphlib.php
lib/php-css-parser/
lib/rtlcss/
lib/scssphp/
lib/spout/
lib/amd/src/chartjs-lazy.js
lib/maxmind/GeoIp2/
lib/maxmind/MaxMind/
lib/ltiprovider/
media/player/videojs/amd/src/video-lazy.js
media/player/videojs/amd/src/Youtube-lazy.js
media/player/videojs/videojs/
mod/assign/feedback/editpdf/fpdi/
repository/s3/S3.php
theme/boost/scss/bootstrap/
theme/boost/amd/src/alert.js
theme/boost/amd/src/button.js
theme/boost/amd/src/carousel.js
theme/boost/amd/src/collapse.js
theme/boost/amd/src/dropdown.js
theme/boost/amd/src/modal.js
theme/boost/amd/src/popover.js
theme/boost/amd/src/scrollspy.js
theme/boost/amd/src/tab.js
theme/boost/amd/src/tooltip.js
theme/boost/amd/src/util.js
theme/boost/amd/src/tether.js
theme/bootstrapbase/less/bootstrap/
theme/bootstrapbase/javascript/html5shiv.js
theme/bootstrapbase/amd/src/bootstrap.js
+2 -134
View File
@@ -1,15 +1,6 @@
{
'plugins': [
'babel',
'promise',
'jsdoc',
],
'env': {
'browser': true,
// Enable ES6+ features by default.
// See http://eslint.org/docs/user-guide/configuring#specifying-environments
// Note: The YUI override must exactly match this when disabling the ES6+ version because those features are not supported by Shifter.
'es2020': true,
'amd': true
},
'globals': {
@@ -22,7 +13,6 @@
// === Possible Errors ===
'comma-dangle': 'off',
'no-compare-neg-zero': 'error',
'no-cond-assign': 'error',
'no-console': 'error',
'no-constant-condition': 'error',
@@ -74,6 +64,7 @@
'no-fallthrough': 'error',
'no-floating-decimal': 'warn',
'no-global-assign': 'warn',
// Enabled by grunt for AMD modules: 'no-implicit-globals': 'error',
'no-implied-eval': 'error',
'no-invalid-this': 'error',
'no-iterator': 'error',
@@ -87,7 +78,6 @@
'no-octal-escape': 'error',
'no-proto': 'error',
'no-redeclare': 'warn',
'no-restricted-globals': ['error', { 'name': 'Notification' }],
'no-return-assign': 'error',
'no-script-url': 'error',
'no-self-assign': 'error',
@@ -113,7 +103,6 @@
'block-spacing': 'warn',
'brace-style': ['warn', '1tbs'],
'camelcase': 'warn',
'capitalized-comments': ['warn', 'always', { 'ignoreConsecutiveComments': true }],
'comma-spacing': ['warn', { 'before': false, 'after': true }],
'comma-style': ['warn', 'last'],
'computed-property-spacing': 'error',
@@ -181,132 +170,11 @@
'unicode-bom': 'error',
'wrap-regex': 'off',
// === Promises ===
'promise/always-return': 'warn',
'promise/no-return-wrap': 'warn',
'promise/param-names': 'warn',
'promise/catch-or-return': ['warn', {terminationMethod: ['catch', 'fail']}],
'promise/no-native': 'warn',
'promise/no-promise-in-callback': 'warn',
'promise/no-callback-in-promise': 'warn',
'promise/avoid-new': 'warn',
// === Deprecations ===
"no-restricted-properties": ['warn', {
'object': 'M',
'property': 'str',
'message': 'Use AMD module "core/str" or M.util.get_string()'
}],
},
overrides: [
{
files: ["**/yui/src/**/*.js"],
'env': {
// Disable ES6+ for YUI files.
'es2020': false,
},
// Disable some rules which we can't safely define for YUI rollups.
rules: {
'no-undef': 'off',
'no-unused-vars': 'off',
'no-unused-expressions': 'off',
// === JSDocs ===
"jsdoc/check-access": 'off',
"jsdoc/check-alignment": 'off',
"jsdoc/check-param-names": 'off',
"jsdoc/check-property-names": 'off',
"jsdoc/empty-tags": 'off',
"jsdoc/implements-on-classes": 'off',
"jsdoc/multiline-blocks": 'off',
"jsdoc/require-jsdoc": 'off',
"jsdoc/require-param": 'off',
"jsdoc/require-param-name": 'off',
"jsdoc/require-param-type": 'off',
"jsdoc/require-property": 'off',
"jsdoc/require-property-name": 'off',
"jsdoc/require-property-type": 'off',
}
},
{
files: ["**/amd/src/*.js", "**/amd/src/**/*.js", "Gruntfile.js", ".grunt/*.js", ".grunt/tasks/*.js", "jsdoc.conf.js"],
// We're using babel transpiling so use their parser
// for linting.
parser: '@babel/eslint-parser',
// Check AMD with some slightly stricter rules.
rules: {
'no-unused-vars': 'error',
'no-implicit-globals': 'error',
// Disable all of the rules that have babel versions.
'new-cap': 'off',
// Not using this rule for the time being because it isn't
// compatible with jQuery and ES6.
'no-invalid-this': 'off',
'object-curly-spacing': 'off',
'quotes': 'off',
'semi': 'off',
'no-unused-expressions': 'off',
// Enable all of the babel version of these rules.
'babel/new-cap': ['warn', { 'properties': false }],
// Not using this rule for the time being because it isn't
// compatible with jQuery and ES6.
'babel/no-invalid-this': 'off',
'babel/object-curly-spacing': 'warn',
// This is off in the original style int.
'babel/quotes': 'off',
'babel/semi': 'error',
'babel/no-unused-expressions': 'error',
// === Promises ===
// We have Promise now that we're using ES6.
'promise/no-native': 'off',
'promise/avoid-new': 'off',
// === JSDocs ===
"jsdoc/check-access": [
'error',
],
"jsdoc/check-alignment": 1, // Recommended.
"jsdoc/check-param-names": [
'error',
],
"jsdoc/check-property-names": [
'error',
],
"jsdoc/empty-tags": [
'error',
],
"jsdoc/implements-on-classes": [
'error',
],
"jsdoc/multiline-blocks": [
'error',
],
"jsdoc/require-jsdoc": [
'error',
],
"jsdoc/require-param": [
'error',
],
"jsdoc/require-param-name": [
'error',
],
"jsdoc/require-param-type": [
'error',
],
"jsdoc/require-property": [
'error',
],
"jsdoc/require-property-name": [
'error',
],
"jsdoc/require-property-type": [
'error',
],
},
parserOptions: {
'sourceType': 'module',
'requireConfigFile': false,
}
}
]
}
}
-24
View File
@@ -1,24 +0,0 @@
{
"indentation": ["on",{
"Feature": 0,
"Background": 2,
"Scenario": 2,
"Examples": 4,
"example": 6,
"Step": 4,
"given": 4,
"and": 4
}],
"no-dupe-feature-names": "on",
"no-dupe-scenario-names": "off",
"no-empty-file": "on",
"no-files-without-scenarios": "on",
"no-multiple-empty-lines": "on",
"no-partially-commented-tag-lines": "on",
"no-trailing-spaces": "on",
"no-unnamed-features": "on",
"no-unnamed-scenarios": "on",
"no-scenario-outlines-without-examples": "on",
"no-examples-in-scenarios": "on",
"new-line-at-eof": ["on", "yes"]
}
+2 -1
View File
@@ -1,3 +1,4 @@
**/yui/build/** -diff
**/amd/build/** -diff
lib/dml/oci_native_moodle_package.sql text eol=lf
theme/bootstrapbase/style/editor.css -diff
theme/bootstrapbase/style/moodle.css -diff
-2
View File
@@ -1,2 +0,0 @@
# Primary donations pages.
custom: ["https://moodle.com/donations/", moodle.org]
-71
View File
@@ -1,71 +0,0 @@
<?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');
-118
View File
@@ -1,118 +0,0 @@
name: Core
on:
push:
branches-ignore:
- master
- MOODLE_[0-9]+_STABLE
tags-ignore:
- v[0-9]+.[0-9]+.[0-9]+*
env:
php: 8.1
jobs:
Grunt:
runs-on: ubuntu-22.04
steps:
- name: Checking out code
uses: actions/checkout@v3
- name: Configuring node & npm
uses: actions/setup-node@v3
with:
node-version-file: '.nvmrc'
- 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:
# MySQL builds always run with the lowest PHP supported version.
- os: ubuntu-22.04
php: 8.0
extensions:
db: mysqli
# PostgreSQL builds always run with the highest PHP supported version.
- os: ubuntu-22.04
php: 8.1
db: pgsql
steps:
- name: Setting up DB mysql
if: ${{ matrix.db == 'mysqli' }}
uses: moodlehq/mysql-action@v1
with:
collation server: utf8mb4_bin
mysql version: 8.0
mysql database: test
mysql user: test
mysql password: test
use tmpfs: true
tmpfs size: '1024M'
extra conf: --skip-log-bin
- name: Setting up DB pgsql
if: ${{ matrix.db == 'pgsql' }}
uses: m4nu56/postgresql-action@v1
with:
postgresql version: 13
postgresql db: test
postgresql user: test
postgresql password: test
- name: Configuring git vars
uses: rlespinasse/github-slug-action@v4
- name: Setting up PHP ${{ matrix.php }}
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: ${{ matrix.extensions }}
ini-values: max_input_vars=5000
coverage: none
- name: Checking out code from ${{ env.GITHUB_REF_SLUG }}
uses: actions/checkout@v3
- 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 }}
phpunit_options: ${{ secrets.phpunit_options }}
run: vendor/bin/phpunit $phpunit_options
-144
View File
@@ -1,144 +0,0 @@
name: Windows Testing
on:
workflow_dispatch
env:
php: 8.1
jobs:
Grunt:
runs-on: windows-latest
steps:
- name: Set git to use LF
run: |
git config --global core.autocrlf false
git config --global core.eol lf
- name: Checking out code
uses: actions/checkout@v3
- name: Configuring node & npm
uses: actions/setup-node@v3
with:
node-version-file: '.nvmrc'
- name: Installing node stuff
run: npm ci
- 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 }}
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
php: 8.1
# Ideally we should use mysql/mariadb, but they are 4x slower without tweaks and configuration
# so let's run only postgres (1.5h vs 6h) only, If some day we want to improve the mysql runs,
# this is the place to enable them.
# db: mysqli
db: pgsql
extensions: exif, fileinfo, gd, intl, pgsql, mysql, redis, soap, sodium
- os: windows-latest
php: 8.0
db: pgsql
extensions: exif, fileinfo, gd, intl, pgsql, mysql, redis, soap, sodium
steps:
- name: Setting up DB mysql
if: ${{ matrix.db == 'mysqli' }}
uses: shogo82148/actions-setup-mysql@v1
with:
mysql-version: 8.0
user: test
password: test
- name: Creating DB mysql
if: ${{ matrix.db == 'mysqli' }}
run: mysql --host 127.0.0.1 -utest -ptest -e 'CREATE DATABASE IF NOT EXISTS test COLLATE = utf8mb4_bin;';
- name: Setting up DB pgsql
if: ${{ matrix.db == 'pgsql' }}
run: |
# TODO: Remove these conf. modifications when php74 or php80 are lowest.
# Change to old md5 auth, because php73 does not support it.
# #password_encryption = scram-sha-256
(Get-Content "$env:PGDATA\postgresql.conf"). `
replace('#password_encryption = scram-sha-256', 'password_encryption = md5') | `
Set-Content "$env:PGDATA\postgresql.conf"
(Get-Content "$env:PGDATA\pg_hba.conf"). `
replace('scram-sha-256', 'md5') | `
Set-Content "$env:PGDATA\pg_hba.conf"
$pgService = Get-Service -Name postgresql*
Set-Service -InputObject $pgService -Status running -StartupType automatic
Start-Process -FilePath "$env:PGBIN\pg_isready" -Wait -PassThru
& $env:PGBIN\psql --command="CREATE USER test PASSWORD 'test'" --command="\du"
- name: Creating DB pgsql
if: ${{ matrix.db == 'pgsql' }}
run: |
& $env:PGBIN\createdb --owner=test test
$env:PGPASSWORD = 'test'
& $env:PGBIN\psql --username=test --host=localhost --list test
- name: Configuring git vars
uses: rlespinasse/github-slug-action@v4
- name: Setting up PHP ${{ matrix.php }}
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: ${{ matrix.extensions }}
ini-values: max_input_vars=5000
coverage: none
- name: Set git to use LF
run: |
git config --global core.autocrlf false
git config --global core.eol lf
- name: Checking out code from ${{ env.GITHUB_REF_SLUG }}
uses: actions/checkout@v3
# Needs to be done after php is available, git configured and Moodle checkout has happened.
- name: Setting up moodle-exttests service
run: |
git clone https://github.com/moodlehq/moodle-exttests.git
nssm install php-built-in C:\tools\php\php.exe -S localhost:8080 -t D:\a\moodle\moodle\moodle-exttests
nssm start php-built-in
- name: Setting up redis service
run: |
choco install redis-64 --version 3.0.503 --no-progress
nssm install redis redis-server
nssm start redis
- name: Setting up PHPUnit
env:
dbtype: ${{ matrix.db }}
shell: bash
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
php admin/tool/phpunit/cli/init.php --no-composer-self-update
- name: Running PHPUnit tests
env:
dbtype: ${{ matrix.db }}
phpunit_options: ${{ secrets.phpunit_options }}
run: vendor/bin/phpunit $phpunit_options
+3 -22
View File
@@ -9,23 +9,15 @@
#
# See gitignore(5) man page for more details
#
# Swap files (vim)
[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-rt-v][a-z]
[._]ss[a-gi-z]
[._]sw[a-p]
# Temporary files including undo
*~
#
/config.php
/lib/editor/tinymce/extra/tools/temp/
*~
*.swp
/tags
/TAGS
/cscope.*
/.patches/
/.idea/
.phpstorm.*
/nbproject/
CVS
.DS_Store
@@ -33,7 +25,6 @@ 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
@@ -45,13 +36,3 @@ composer.phar
/lib/yuilib/*/*/*-coverage.js
atlassian-ide-plugin.xml
/node_modules/
/.vscode/
moodle-plugin-ci.phar
.eslintignore
.stylelintignore
/jsdoc
/admin/tool/componentlibrary/docs
/admin/tool/componentlibrary/hugo/site/data/my-index.json
.hugo_build.lock
phpcs.xml
jsconfig.json
-169
View File
@@ -1,169 +0,0 @@
// 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 is a babel plugin to add the Moodle module names to the AMD modules
* as part of the transpiling process.
*
* In addition it will also add a return statement for the default export if the
* module is using default exports. This is a highly specific Moodle thing because
* we're transpiling to AMD and none of the existing Babel 7 plugins work correctly.
*
* This will fix the issue where an ES6 module using "export default Foo" will be
* transpiled into an AMD module that returns {default: Foo}; Instead it will now
* just simply return Foo.
*
* Note: This means all other named exports in that module are ignored and won't be
* exported.
*
* @copyright 2018 Ryan Wyllie <ryan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
"use strict";
/* eslint-env node */
module.exports = ({template, types}) => {
const fs = require('fs');
const path = require('path');
const cwd = process.cwd();
const ComponentList = require(path.join(process.cwd(), '.grunt', 'components.js'));
/**
* Search the list of components that match the given file name
* and return the Moodle component for that file, if found.
*
* Throw an exception if no matching component is found.
*
* @throws {Error}
* @param {string} searchFileName The file name to look for.
* @return {string} Moodle component
*/
function getModuleNameFromFileName(searchFileName) {
searchFileName = fs.realpathSync(searchFileName);
const relativeFileName = searchFileName.replace(`${cwd}${path.sep}`, '').replace(/\\/g, '/');
const [componentPath, file] = relativeFileName.split('/amd/src/');
const fileName = file.replace('.js', '');
// Check subsystems first which require an exact match.
const componentName = ComponentList.getComponentFromPath(componentPath);
if (componentName) {
return `${componentName}/${fileName}`;
}
// This matches the previous PHP behaviour that would throw an exception
// if it couldn't parse an AMD file.
throw new Error(`Unable to find module name for ${searchFileName} (${componentPath}::${file}}`);
}
/**
* This is heavily inspired by the babel-plugin-add-module-exports plugin.
* See: https://github.com/59naga/babel-plugin-add-module-exports
*
* This is used when we detect a module using "export default Foo;" to make
* sure the transpiled code just returns Foo directly rather than an object
* with the default property (i.e. {default: Foo}).
*
* Note: This means that we can't support modules that combine named exports
* with a default export.
*
* @param {String} path
* @param {String} exportObjectName
*/
function addModuleExportsDefaults(path, exportObjectName) {
const rootPath = path.findParent(path => {
return path.key === 'body' || !path.parentPath;
});
// HACK: `path.node.body.push` instead of path.pushContainer(due doesn't work in Plugin.post).
// This is hardcoded to work specifically with AMD.
rootPath.node.body.push(template(`return ${exportObjectName}.default`)());
}
return {
pre() {
this.seenDefine = false;
this.addedReturnForDefaultExport = false;
},
visitor: {
// Plugin ordering is only respected if we visit the "Program" node.
// See: https://babeljs.io/docs/en/plugins.html#plugin-preset-ordering
//
// We require this to run after the other AMD module transformation so
// let's visit the "Program" node.
Program: {
exit(path) {
path.traverse({
CallExpression(path) {
// If we find a "define" function call.
if (!this.seenDefine && path.get('callee').isIdentifier({name: 'define'})) {
// We only want to modify the first instance of define that we find.
this.seenDefine = true;
// Get the Moodle component for the file being processed.
var moduleName = getModuleNameFromFileName(this.file.opts.filename);
// The function signature of `define()` is:
// define = function (name, deps, callback) {...}
// Ensure that if the moduel supplied its own name that it is replaced.
if (path.node.arguments.length > 0) {
// Ensure that there is only one name.
if (path.node.arguments[0].type === 'StringLiteral') {
// eslint-disable-next-line
console.log(`Replacing module name '${path.node.arguments[0].extra.rawValue}' with ${moduleName}`);
path.node.arguments.shift();
}
}
// Add the module name as the first argument to the define function.
path.node.arguments.unshift(types.stringLiteral(moduleName));
// Add a space after the define function in the built file so that previous versions
// of Moodle will not try to add the module name to the file when it's being served
// by PHP. This forces the regex in PHP to not match for this file.
path.node.callee.name = 'define ';
}
// Check for any Object.defineProperty('exports', 'default') calls.
if (!this.addedReturnForDefaultExport && path.get('callee').matchesPattern('Object.defineProperty')) {
const [identifier, prop] = path.get('arguments');
const objectName = identifier.get('name').node;
const propertyName = prop.get('value').node;
if ((objectName === 'exports' || objectName === '_exports') && propertyName === 'default') {
addModuleExportsDefaults(path, objectName);
this.addedReturnForDefaultExport = true;
}
}
},
AssignmentExpression(path) {
// Check for an exports.default assignments.
if (
!this.addedReturnForDefaultExport &&
(
path.get('left').matchesPattern('exports.default') ||
path.get('left').matchesPattern('_exports.default')
)
) {
const objectName = path.get('left.object.name').node;
addModuleExportsDefaults(path, objectName);
this.addedReturnForDefaultExport = true;
}
}
}, this);
}
}
}
};
};
-394
View File
@@ -1,394 +0,0 @@
// 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/>.
/**
* Helper functions for working with Moodle component names, directories, and sources.
*
* @copyright 2019 Andrew Nicols <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
"use strict";
/* eslint-env node */
/** @var {Object} A list of subsystems in Moodle */
const componentData = {};
/**
* Load details of all moodle modules.
*
* @returns {object}
*/
const fetchComponentData = () => {
const fs = require('fs');
const path = require('path');
const glob = require('glob');
const gruntFilePath = process.cwd();
if (!Object.entries(componentData).length) {
componentData.subsystems = {};
componentData.pathList = [];
// Fetch the component definiitions from the distributed JSON file.
const components = JSON.parse(fs.readFileSync(`${gruntFilePath}/lib/components.json`));
// Build the list of moodle subsystems.
componentData.subsystems.lib = 'core';
componentData.pathList.push(process.cwd() + path.sep + 'lib');
for (const [component, thisPath] of Object.entries(components.subsystems)) {
if (thisPath) {
// Prefix "core_" to the front of the subsystems.
componentData.subsystems[thisPath] = `core_${component}`;
componentData.pathList.push(process.cwd() + path.sep + thisPath);
}
}
// The list of components incldues the list of subsystems.
componentData.components = componentData.subsystems;
// Go through each of the plugintypes.
Object.entries(components.plugintypes).forEach(([pluginType, pluginTypePath]) => {
// We don't allow any code in this place..?
glob.sync(`${pluginTypePath}/*/version.php`).forEach(versionPath => {
const componentPath = fs.realpathSync(path.dirname(versionPath));
const componentName = path.basename(componentPath);
const frankenstyleName = `${pluginType}_${componentName}`;
componentData.components[`${pluginTypePath}/${componentName}`] = frankenstyleName;
componentData.pathList.push(componentPath);
// Look for any subplugins.
const subPluginConfigurationFile = `${componentPath}/db/subplugins.json`;
if (fs.existsSync(subPluginConfigurationFile)) {
const subpluginList = JSON.parse(fs.readFileSync(fs.realpathSync(subPluginConfigurationFile)));
Object.entries(subpluginList.plugintypes).forEach(([subpluginType, subpluginTypePath]) => {
glob.sync(`${subpluginTypePath}/*/version.php`).forEach(versionPath => {
const componentPath = fs.realpathSync(path.dirname(versionPath));
const componentName = path.basename(componentPath);
const frankenstyleName = `${subpluginType}_${componentName}`;
componentData.components[`${subpluginTypePath}/${componentName}`] = frankenstyleName;
componentData.pathList.push(componentPath);
});
});
}
});
});
}
return componentData;
};
/**
* Get the list of component paths.
*
* @param {string} relativeTo
* @returns {array}
*/
const getComponentPaths = (relativeTo = '') => fetchComponentData().pathList.map(componentPath => {
return componentPath.replace(relativeTo, '');
});
/**
* Get the list of paths to build AMD sources.
*
* @returns {Array}
*/
const getAmdSrcGlobList = () => {
const globList = [];
fetchComponentData().pathList.forEach(componentPath => {
globList.push(`${componentPath}/amd/src/*.js`);
globList.push(`${componentPath}/amd/src/**/*.js`);
});
return globList;
};
/**
* Get the list of paths to build YUI sources.
*
* @param {String} relativeTo
* @returns {Array}
*/
const getYuiSrcGlobList = relativeTo => {
const globList = [];
fetchComponentData().pathList.forEach(componentPath => {
const relativeComponentPath = componentPath.replace(relativeTo, '');
globList.push(`${relativeComponentPath}/yui/src/**/*.js`);
});
return globList;
};
/**
* Get the list of paths to thirdpartylibs.xml.
*
* @param {String} relativeTo
* @returns {Array}
*/
const getThirdPartyLibsList = relativeTo => {
const fs = require('fs');
const path = require('path');
return fetchComponentData().pathList
.map(componentPath => path.relative(relativeTo, componentPath) + '/thirdpartylibs.xml')
.map(componentPath => componentPath.replace(/\\/g, '/'))
.filter(path => fs.existsSync(path))
.sort();
};
/**
* Get the list of thirdparty library paths.
*
* @returns {array}
*/
const getThirdPartyPaths = () => {
const DOMParser = require('@xmldom/xmldom').DOMParser;
const fs = require('fs');
const path = require('path');
const xpath = require('xpath');
const thirdpartyfiles = getThirdPartyLibsList(fs.realpathSync('./'));
const libs = ['node_modules/', 'vendor/'];
const addLibToList = lib => {
if (!lib.match('\\*') && fs.statSync(lib).isDirectory()) {
// Ensure trailing slash on dirs.
lib = lib.replace(/\/?$/, '/');
}
// Look for duplicate paths before adding to array.
if (libs.indexOf(lib) === -1) {
libs.push(lib);
}
};
thirdpartyfiles.forEach(function(file) {
const dirname = path.dirname(file);
const xmlContent = fs.readFileSync(file, 'utf8');
const doc = new DOMParser().parseFromString(xmlContent);
const nodes = xpath.select("/libraries/library/location/text()", doc);
nodes.forEach(function(node) {
let lib = path.posix.join(dirname, node.toString());
addLibToList(lib);
});
});
return libs;
};
/**
* Find the name of the component matching the specified path.
*
* @param {String} path
* @returns {String|null} Name of matching component.
*/
const getComponentFromPath = path => {
const componentList = fetchComponentData().components;
if (componentList.hasOwnProperty(path)) {
return componentList[path];
}
return null;
};
/**
* Check whether the supplied path, relative to the Gruntfile.js, is in a known component.
*
* @param {String} checkPath The path to check. This can be with either Windows, or Linux directory separators.
* @returns {String|null}
*/
const getOwningComponentDirectory = checkPath => {
const path = require('path');
// Fetch all components into a reverse sorted array.
// This ensures that components which are within the directory of another component match first.
const pathList = Object.keys(fetchComponentData().components).sort().reverse();
for (const componentPath of pathList) {
// If the componentPath is the directory being checked, it will be empty.
// If the componentPath is a parent of the directory being checked, the relative directory will not start with ..
if (!path.relative(componentPath, checkPath).startsWith('..')) {
return componentPath;
}
}
return null;
};
/**
* Get the latest tag in a remote GitHub repository.
*
* @param {string} url The remote repository.
* @returns {Array}
*/
const getRepositoryTags = async(url) => {
const gtr = require('git-tags-remote');
try {
const tags = await gtr.get(url);
if (tags !== undefined) {
return tags;
}
} catch (error) {
return [];
}
return [];
};
/**
* Get the list of thirdparty libraries that could be upgraded.
*
* @returns {Array}
*/
const getThirdPartyLibsUpgradable = async() => {
const libraries = getThirdPartyLibsData().filter((library) => !!library.repository);
const upgradableLibraries = [];
const versionCompare = (a, b) => {
if (a === b) {
return 0;
}
const aParts = a.split('.');
const bParts = b.split('.');
for (let i = 0; i < Math.min(aParts.length, bParts.length); i++) {
const aPart = parseInt(aParts[i], 10);
const bPart = parseInt(bParts[i], 10);
if (aPart > bPart) {
// 1.1.0 > 1.0.9
return 1;
} else if (aPart < bPart) {
// 1.0.9 < 1.1.0
return -1;
} else {
// Same version.
continue;
}
}
if (aParts.length > bParts.length) {
// 1.0.1 > 1.0
return 1;
}
// 1.0 < 1.0.1
return -1;
};
for (let library of libraries) {
upgradableLibraries.push(
getRepositoryTags(library.repository).then((tagMap) => {
library.version = library.version.replace(/^v/, '');
const currentVersion = library.version.replace(/moodle-/, '');
const currentMajorVersion = library.version.split('.')[0];
const tags = [...tagMap]
.map((tagData) => tagData[0])
.filter((tag) => !tag.match(/(alpha|beta|rc)/))
.map((tag) => tag.replace(/^v/, ''))
.sort((a, b) => versionCompare(b, a));
if (!tags.length) {
library.warning = "Unable to find any comparable tags.";
return library;
}
library.latestVersion = tags[0];
tags.some((tag) => {
if (!tag) {
return false;
}
// See if the version part matches.
const majorVersion = tag.split('.')[0];
if (majorVersion === currentMajorVersion) {
library.latestSameMajorVersion = tag;
return true;
}
return false;
});
if (versionCompare(currentVersion, library.latestVersion) > 0) {
// Moodle somehow has a newer version than the latest version.
library.warning = `Newer version found: ${currentVersion} > ${library.latestVersion} for ${library.name}`;
return library;
}
if (library.version !== library.latestVersion) {
// Delete version and add it again at the end of the array. That way, current and new will stay closer.
delete library.version;
library.version = currentVersion;
return library;
}
return null;
})
);
}
return (await Promise.all(upgradableLibraries)).filter((library) => !!library);
};
/**
* Get the list of thirdparty libraries.
*
* @returns {Array}
*/
const getThirdPartyLibsData = () => {
const DOMParser = require('@xmldom/xmldom').DOMParser;
const fs = require('fs');
const xpath = require('xpath');
const path = require('path');
const libraryList = [];
const libraryFields = [
'location',
'name',
'version',
'repository',
];
const thirdpartyfiles = getThirdPartyLibsList(fs.realpathSync('./'));
thirdpartyfiles.forEach(function(libraryPath) {
const xmlContent = fs.readFileSync(libraryPath, 'utf8');
const doc = new DOMParser().parseFromString(xmlContent);
const libraries = xpath.select("/libraries/library", doc);
for (const library of libraries) {
const libraryData = [];
for (const field of libraryFields) {
libraryData[field] = xpath.select(`${field}/text()`, library)?.toString();
}
libraryData.location = path.join(path.dirname(libraryPath), libraryData.location);
libraryList.push(libraryData);
}
});
return libraryList.sort((a, b) => a.location.localeCompare(b.location));
};
module.exports = {
fetchComponentData,
getAmdSrcGlobList,
getComponentFromPath,
getComponentPaths,
getOwningComponentDirectory,
getYuiSrcGlobList,
getThirdPartyLibsList,
getThirdPartyPaths,
getThirdPartyLibsUpgradable,
};
-19
View File
@@ -1,19 +0,0 @@
# Moodle JavaScript Documentation
```
.-..-.
_____ | || |
/____/-.---_ .---. .---. .-.| || | .---.
| | _ _ |/ _ \/ _ \/ _ || |/ __ \
* | | | | | || |_| || |_| || |_| || || |___/
|_| |_| |_|\_____/\_____/\_____||_|\_____)
Moodle - the world's open source learning platform
```
## About
This generated documentation includes API documentation for JavaScript written in the AMD and ES2015 module formats within Moodle.
## Related information
See [https://docs.moodle.org/dev](https://docs.moodle.org/dev) for other related Developer Documentation.
-131
View File
@@ -1,131 +0,0 @@
// 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/>.
/**
* Helper functions for working with Moodle component names, directories, and sources.
*
* @copyright 2019 Andrew Nicols <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
"use strict";
/* eslint-env node */
// Do not include any plugins as stanard.
const plugins = [];
plugins.push('plugins/markdown');
/**
* Get the source configuration.
*
* @return {Object}
*/
const getSource = () => {
const glob = require('glob');
const path = require('path');
const ComponentList = require(path.resolve('.grunt/components.js'));
const thirdPartyPaths = ComponentList.getThirdPartyPaths();
const source = {
include: [],
includePattern: ".+\\.js$",
};
let includeList = [];
ComponentList.getAmdSrcGlobList().forEach(async pattern => {
includeList.push(...glob.sync(pattern));
});
const cwdLength = process.cwd().length + 1;
includeList.forEach(path => {
if (source.include.indexOf(path) !== -1) {
// Ensure no duplicates.
return;
}
const relPath = path.substring(cwdLength);
if (thirdPartyPaths.indexOf(relPath) !== -1) {
return;
}
source.include.push(path);
});
source.include.push('.grunt/jsdoc/README.md');
return source;
};
const tags = {
// Allow the use of unknown tags.
// We have a lot of legacy uses of these.
allowUnknownTags: true,
// We make use of jsdoc and closure dictionaries as standard.
dictionaries: [
'jsdoc',
'closure',
],
};
// Template configuraiton.
const templates = {
cleverLinks: false,
monospaceLinks: false,
};
module.exports = {
opts: {
destination: "./jsdoc/",
template: "node_modules/docdash",
},
plugins,
recurseDepth: 10,
source: getSource(),
sourceType: 'module',
tags,
templates,
docdash: {
collapse: true,
search: true,
sort: true,
sectionOrder: [
"Namespaces",
"Modules",
"Events",
"Classes",
"Externals",
"Mixins",
"Tutorials",
"Interfaces"
],
"menu": {
"Developer Docs": {
href: "https://docs.moodle.org/dev",
target: "_blank",
"class": "menu-item",
id: "devdocs"
},
"MDN Docs": {
href: "https://developer.mozilla.org/en-US/docs/Web/JavaScript",
target: "_blank",
"class": "menu-item",
id: "mdndocs",
},
},
typedefs: true,
},
};
-142
View File
@@ -1,142 +0,0 @@
// 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/>.
/* jshint node: true, browser: false */
/* eslint-env node */
/**
* Component Library build tasks.
*
* @copyright 2021 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
module.exports = grunt => {
/**
* Get a child path of the component library.
*
* @param {string} path
* @returns {string}
*/
const getCLPath = path => `admin/tool/componentlibrary/${path}`;
/**
* Get a spawn handler.
*
* This is a generic function to write the spawn output, and then to exit if required and mark the async task as
* complete.
*
* @param {Promise} done
* @returns {function}
*/
const getSpawnHandler = done => (error, result, code) => {
grunt.log.write(result);
if (error) {
grunt.log.error(result.stdout);
process.exit(code);
}
done();
};
/**
* Spawn a function against Node with the provided args.
*
* @param {array} args
* @returns {object}
*/
const spawnNodeCall = (args) => grunt.util.spawn({
cmd: 'node',
args,
}, getSpawnHandler(grunt.task.current.async()));
/**
* Build the docs using Hugo.
*
* @returns {Object} Reference to the spawned task
*/
const docsBuild = () => spawnNodeCall([
'node_modules/hugo-bin/cli.js',
'--config', getCLPath('config.yml'),
'--cleanDestinationDir',
]);
/**
* Build the docs index using the hugo-lunr-indexer.
*
* @returns {Object} Reference to the spawned task
*/
const indexBuild = () => spawnNodeCall([
'node_modules/hugo-lunr-indexer/bin/hli.js',
'-i', getCLPath('content/**'),
'-o', getCLPath('hugo/site/data/my-index.json'),
'-l', 'yaml',
'-d', '---',
]);
/**
* Build the hugo CSS.
*
* @returns {Object} Reference to the spawned task
*/
const cssBuild = () => spawnNodeCall([
'node_modules/sass/sass.js',
'--style', 'expanded',
'--source-map',
'--embed-sources',
'--precision', 6,
'--load-path', process.cwd(),
getCLPath('hugo/scss/docs.scss'),
getCLPath('hugo/dist/css/docs.css'),
]);
// Register the various component library tasks.
grunt.registerTask('componentlibrary:docsBuild', 'Build the component library', docsBuild);
grunt.registerTask('componentlibrary:cssBuild', 'Build the component library', cssBuild);
grunt.registerTask('componentlibrary:indexBuild', 'Build the component library', indexBuild);
grunt.registerTask('componentlibrary', 'Build the component library', [
'componentlibrary:docsBuild',
'componentlibrary:cssBuild',
'componentlibrary:indexBuild',
]);
grunt.config.merge({
watch: {
componentLibraryDocs: {
files: [
getCLPath('content/**/*.md'),
getCLPath('hugo'),
],
tasks: ['componentlibrary:docsBuild', 'componentlibrary:indexBuild'],
},
componentLibraryCSS: {
files: [
getCLPath('hugo/scss/**/*.scss'),
'hugo',
],
tasks: ['componentlibrary:cssBuild'],
},
},
});
// Add the 'componentlibrary' task as a startup task.
grunt.moodleEnv.startupTasks.push('componentlibrary');
return {
docsBuild,
cssBuild,
indexBuild,
};
};
-64
View File
@@ -1,64 +0,0 @@
// 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/>.
/* jshint node: true, browser: false */
/* eslint-env node */
/**
* @copyright 2021 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
module.exports = grunt => {
const files = grunt.moodleEnv.files;
// Project configuration.
grunt.config.merge({
eslint: {
// Even though warnings dont stop the build we don't display warnings by default because
// at this moment we've got too many core warnings.
// To display warnings call: grunt eslint --show-lint-warnings
// To fail on warnings call: grunt eslint --max-lint-warnings=0
// Also --max-lint-warnings=-1 can be used to display warnings but not fail.
options: {
quiet: (!grunt.option('show-lint-warnings')) && (typeof grunt.option('max-lint-warnings') === 'undefined'),
maxWarnings: ((typeof grunt.option('max-lint-warnings') !== 'undefined') ? grunt.option('max-lint-warnings') : -1)
},
// Check AMD src files.
amd: {src: files ? files : grunt.moodleEnv.amdSrc},
// Check YUI module source files.
yui: {src: files ? files : grunt.moodleEnv.yuiSrc},
},
});
grunt.loadNpmTasks('grunt-eslint');
// On watch, we dynamically modify config to build only affected files. This
// method is slightly complicated to deal with multiple changed files at once (copied
// from the grunt-contrib-watch readme).
let changedFiles = Object.create(null);
const onChange = grunt.util._.debounce(function() {
const files = Object.keys(changedFiles);
grunt.config('eslint.amd.src', files);
grunt.config('eslint.yui.src', files);
changedFiles = Object.create(null);
}, 200);
grunt.event.on('watch', (action, filepath) => {
changedFiles[filepath] = action;
onChange();
});
};
-92
View File
@@ -1,92 +0,0 @@
// 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/>.
/* jshint node: true, browser: false */
/* eslint-env node */
/**
* @copyright 2021 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
module.exports = grunt => {
/**
* Get the list of feature files to pass to the gherkin linter.
*
* @returns {Array}
*/
const getGherkinLintTargets = () => {
if (grunt.moodleEnv.files) {
// Specific files were requested. Only check these.
return grunt.moodleEnv.files;
}
if (grunt.moodleEnv.inComponent) {
return [`${grunt.moodleEnv.runDir}/tests/behat/*.feature`];
}
return ['**/tests/behat/*.feature'];
};
const handler = function() {
const done = this.async();
const options = grunt.config('gherkinlint.options');
// Grab the gherkin-lint linter and required scaffolding.
const linter = require('gherkin-lint/dist/linter.js');
const featureFinder = require('gherkin-lint/dist/feature-finder.js');
const configParser = require('gherkin-lint/dist/config-parser.js');
const formatter = require('gherkin-lint/dist/formatters/stylish.js');
// Run the linter.
return linter.lint(
featureFinder.getFeatureFiles(grunt.file.expand(options.files)),
configParser.getConfiguration(configParser.defaultConfigFileName)
)
.then(results => {
// Print the results out uncondtionally.
formatter.printResults(results);
return results;
})
.then(results => {
// Report on the results.
// The done function takes a bool whereby a falsey statement causes the task to fail.
return results.every(result => result.errors.length === 0);
})
.then(done); // eslint-disable-line promise/no-callback-in-promise
};
grunt.registerTask('gherkinlint', 'Run gherkinlint against the current directory', handler);
grunt.config.set('gherkinlint', {
options: {
files: getGherkinLintTargets(),
}
});
grunt.config.merge({
watch: {
gherkinlint: {
files: [grunt.moodleEnv.inComponent ? 'tests/behat/*.feature' : '**/tests/behat/*.feature'],
tasks: ['gherkinlint'],
},
},
});
// Add the 'gherkinlint' task as a startup task.
grunt.moodleEnv.startupTasks.push('gherkinlint');
return handler;
};
-100
View File
@@ -1,100 +0,0 @@
// 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/>.
/* jshint node: true, browser: false */
/* eslint-env node */
/**
* @copyright 2021 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
module.exports = grunt => {
/**
* Generate the PHPCS configuration.
*
* @param {Object} thirdPartyPaths
*/
const phpcsIgnore = (thirdPartyPaths) => {
const {toXML} = require('jstoxml');
const config = {
_name: 'ruleset',
_attrs: {
name: "MoodleCore",
},
_content: [
{
rule: {
_attrs: {
ref: './phpcs.xml.dist',
},
},
},
],
};
thirdPartyPaths.forEach(library => {
config._content.push({
'exclude-pattern': library,
});
});
grunt.file.write('phpcs.xml', toXML(config, {
header: true,
indent: ' ',
}) + "\n");
};
/**
* Generate ignore files (utilising thirdpartylibs.xml data)
*/
const handler = function() {
const path = require('path');
const ComponentList = require(path.join(process.cwd(), '.grunt', 'components.js'));
// An array of paths to third party directories.
const thirdPartyPaths = ComponentList.getThirdPartyPaths();
// Generate .eslintignore.
const eslintIgnores = [
'# Generated by "grunt ignorefiles"',
// Do not ignore the .grunt directory.
'!/.grunt',
// Ignore all yui/src meta directories and build directories.
'*/**/yui/src/*/meta/',
'*/**/build/',
].concat(thirdPartyPaths);
grunt.file.write('.eslintignore', eslintIgnores.join('\n') + '\n');
// Generate .stylelintignore.
const stylelintIgnores = [
'# Generated by "grunt ignorefiles"',
'**/yui/build/*',
'theme/boost/style/moodle.css',
'theme/classic/style/moodle.css',
'jsdoc/styles/*.css',
'admin/tool/componentlibrary/hugo/dist/css/docs.css',
].concat(thirdPartyPaths);
grunt.file.write('.stylelintignore', stylelintIgnores.join('\n') + '\n');
phpcsIgnore(thirdPartyPaths);
};
grunt.registerTask('ignorefiles', 'Generate ignore files for linters', handler);
return handler;
};
-227
View File
@@ -1,227 +0,0 @@
// 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/>.
/* jshint node: true, browser: false */
/* eslint-env node */
/**
* @copyright 2021 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* Function to generate the destination for the uglify task
* (e.g. build/file.min.js). This function will be passed to
* the rename property of files array when building dynamically:
* http://gruntjs.com/configuring-tasks#building-the-files-object-dynamically
*
* @param {String} destPath the current destination
* @param {String} srcPath the matched src path
* @return {String} The rewritten destination path.
*/
const babelRename = function(destPath, srcPath) {
destPath = srcPath.replace(`amd/src`, `amd/build`);
destPath = destPath.replace(/\.js$/, '.min.js');
return destPath;
};
module.exports = grunt => {
// Load the Ignorefiles tasks.
require('./ignorefiles')(grunt);
// Load the Shifter tasks.
require('./shifter')(grunt);
// Load ESLint.
require('./eslint')(grunt);
// Load jsconfig.
require('./jsconfig')(grunt);
// Load JSDoc.
require('./jsdoc')(grunt);
const path = require('path');
// Register JS tasks.
grunt.registerTask('yui', ['eslint:yui', 'shifter']);
grunt.registerTask('amd', ['ignorefiles', 'eslint:amd', 'rollup']);
grunt.registerTask('js', ['amd', 'yui']);
// Register NPM tasks.
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-rollup');
const babelTransform = require('@babel/core').transform;
const babel = (options = {}) => {
return {
name: 'babel',
transform: (code, id) => {
grunt.log.debug(`Transforming ${id}`);
options.filename = id;
const transformed = babelTransform(code, options);
return {
code: transformed.code,
map: transformed.map
};
}
};
};
// Note: We have to use a rate limit plugin here because rollup runs all tasks asynchronously and in parallel.
// When we kick off a full run, if we kick off a rollup of every file this will fork-bomb the machine.
// To work around this we use a concurrent Promise queue based on the number of available processors.
const rateLimit = () => {
const queue = [];
let queueRunner;
const startQueue = () => {
if (queueRunner) {
return;
}
queueRunner = setTimeout(() => {
const limit = Math.max(1, require('os').cpus().length / 2);
grunt.log.debug(`Starting rollup with queue size of ${limit}`);
runQueue(limit);
}, 100);
};
// The queue runner will run the next `size` items in the queue.
const runQueue = (size = 1) => {
queue.splice(0, size).forEach(resolve => {
resolve();
});
};
return {
name: 'ratelimit',
// The options hook is run in parallel.
// We can return an unresolved Promise which is queued for later resolution.
options: async() => {
return new Promise(resolve => {
queue.push(resolve);
startQueue();
});
},
// When an item in the queue completes, start the next item in the queue.
buildEnd: () => {
runQueue();
},
};
};
const terser = require('rollup-plugin-terser').terser;
grunt.config.merge({
rollup: {
options: {
format: 'esm',
dir: 'output',
sourcemap: true,
treeshake: false,
context: 'window',
plugins: [
rateLimit(),
babel({
sourceMaps: true,
comments: false,
compact: false,
plugins: [
'transform-es2015-modules-amd-lazy',
'system-import-transformer',
// This plugin modifies the Babel transpiling for "export default"
// so that if it's used then only the exported value is returned
// by the generated AMD module.
//
// It also adds the Moodle plugin name to the AMD module definition
// so that it can be imported as expected in other modules.
path.resolve('.grunt/babel-plugin-add-module-to-define.js'),
'@babel/plugin-syntax-dynamic-import',
'@babel/plugin-syntax-import-meta',
['@babel/plugin-proposal-class-properties', {'loose': false}],
'@babel/plugin-proposal-json-strings'
],
presets: [
['@babel/preset-env', {
targets: {
browsers: [
">0.3%",
"last 2 versions",
"not ie >= 0",
"not op_mini all",
"not Opera > 0",
"not dead"
]
},
modules: false,
useBuiltIns: false
}]
]
}),
terser({
// Do not mangle variables.
// Makes debugging easier.
mangle: false,
}),
],
},
dist: {
files: [{
expand: true,
src: grunt.moodleEnv.files ? grunt.moodleEnv.files : grunt.moodleEnv.amdSrc,
rename: babelRename
}],
},
},
});
grunt.config.merge({
watch: {
amd: {
files: grunt.moodleEnv.inComponent
? ['amd/src/*.js', 'amd/src/**/*.js']
: ['**/amd/src/**/*.js'],
tasks: ['amd']
},
},
});
// Add the 'js' task as a startup task.
grunt.moodleEnv.startupTasks.push('js');
// On watch, we dynamically modify config to build only affected files. This
// method is slightly complicated to deal with multiple changed files at once (copied
// from the grunt-contrib-watch readme).
let changedFiles = Object.create(null);
const onChange = grunt.util._.debounce(function() {
const files = Object.keys(changedFiles);
grunt.config('rollup.dist.files', [{expand: true, src: files, rename: babelRename}]);
changedFiles = Object.create(null);
}, 200);
grunt.event.on('watch', function(action, filepath) {
changedFiles[filepath] = action;
onChange();
});
return {
babelRename,
};
};
-53
View File
@@ -1,53 +0,0 @@
// 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/>.
/* jshint node: true, browser: false */
/* eslint-env node */
/**
* @copyright 2022 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
const configuration = {
compilerOptions: {
baseUrl: ".",
paths: {
},
target: "es2015",
allowSyntheticDefaultImports: false,
},
exclude: [
"node_modules",
],
include: [],
};
module.exports = (grunt) => {
const handler = () => {
const jsconfigData = Object.assign({}, configuration);
const path = require('path');
const {fetchComponentData} = require(path.join(process.cwd(), '.grunt', 'components.js'));
const componentData = fetchComponentData().components;
for (const [thisPath, component] of Object.entries(componentData)) {
jsconfigData.compilerOptions.paths[`${component}/*`] = [`${thisPath}/amd/src/*`];
jsconfigData.include.push(`${thisPath}/amd/src/**/*`);
}
grunt.file.write('jsconfig.json', JSON.stringify(jsconfigData, null, " ") + "\n");
};
grunt.registerTask('jsconfig', 'Generate a jsconfig configuration compatible with the LSP', handler);
};
-36
View File
@@ -1,36 +0,0 @@
// 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/>.
/* jshint node: true, browser: false */
/* eslint-env node */
/**
* @copyright 2021 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
module.exports = grunt => {
// Project configuration.
grunt.config.merge({
jsdoc: {
dist: {
options: {
configure: ".grunt/jsdoc/jsdoc.conf.js",
},
},
},
});
grunt.loadNpmTasks('grunt-jsdoc');
};
-40
View File
@@ -1,40 +0,0 @@
// 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/>.
/* jshint node: true, browser: false */
/* eslint-env node */
/**
* @copyright 2021 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
module.exports = grunt => {
grunt.loadNpmTasks('grunt-sass');
grunt.config.merge({
sass: {
dist: {
files: {
"theme/boost/style/moodle.css": "theme/boost/scss/preset/default.scss",
"theme/classic/style/moodle.css": "theme/classic/scss/classicgrunt.scss"
}
},
options: {
implementation: require('sass'),
includePaths: ["theme/boost/scss/", "theme/classic/scss/"]
}
},
});
};
-155
View File
@@ -1,155 +0,0 @@
// 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/>.
/* jshint node: true, browser: false */
/* eslint-env node */
/**
* @copyright 2021 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/* eslint-env node */
module.exports = grunt => {
/**
* Shifter task. Is configured with a path to a specific file or a directory,
* in the case of a specific file it will work out the right module to be built.
*
* Note that this task runs the invidiaul shifter jobs async (becase it spawns
* so be careful to to call done().
*/
const handler = function() {
const done = this.async();
const options = grunt.config('shifter.options');
const async = require('async');
const path = require('path');
// Run the shifter processes one at a time to avoid confusing output.
async.eachSeries(options.paths, function(src, filedone) {
var args = [];
args.push(path.normalize(process.cwd() + '/node_modules/shifter/bin/shifter'));
// Always ignore the node_modules directory.
args.push('--excludes', 'node_modules');
// Determine the most appropriate options to run with based upon the current location.
if (grunt.file.isMatch('**/yui/**/*.js', src)) {
// When passed a JS file, build our containing module (this happen with
// watch).
grunt.log.debug('Shifter passed a specific JS file');
src = path.dirname(path.dirname(src));
options.recursive = false;
} else if (grunt.file.isMatch('**/yui/src', src)) {
// When in a src directory --walk all modules.
grunt.log.debug('In a src directory');
args.push('--walk');
options.recursive = false;
} else if (grunt.file.isMatch('**/yui/src/*', src)) {
// When in module, only build our module.
grunt.log.debug('In a module directory');
options.recursive = false;
} else if (grunt.file.isMatch('**/yui/src/*/js', src)) {
// When in module src, only build our module.
grunt.log.debug('In a source directory');
src = path.dirname(src);
options.recursive = false;
}
if (grunt.option('watch')) {
grunt.fail.fatal('The --watch option has been removed, please use `grunt watch` instead');
}
// Add the stderr option if appropriate
if (grunt.option('verbose')) {
args.push('--lint-stderr');
}
if (grunt.option('no-color')) {
args.push('--color=false');
}
var execShifter = function() {
grunt.log.ok("Running shifter on " + src);
grunt.util.spawn({
cmd: "node",
args: args,
opts: {cwd: src, stdio: 'inherit', env: process.env}
}, function(error, result, code) {
if (code) {
grunt.fail.fatal('Shifter failed with code: ' + code);
} else {
grunt.log.ok('Shifter build complete.');
filedone();
}
});
};
// Actually run shifter.
if (!options.recursive) {
execShifter();
} else {
// Check that there are yui modules otherwise shifter ends with exit code 1.
if (grunt.file.expand({cwd: src}, '**/yui/src/**/*.js').length > 0) {
args.push('--recursive');
execShifter();
} else {
grunt.log.ok('No YUI modules to build.');
filedone();
}
}
}, done);
};
// Register the shifter task.
grunt.registerTask('shifter', 'Run Shifter against the current directory', handler);
// Configure it.
grunt.config.set('shifter', {
options: {
recursive: true,
// Shifter takes a relative path.
paths: grunt.moodleEnv.files ? grunt.moodleEnv.files : [grunt.moodleEnv.runDir]
}
});
grunt.config.merge({
watch: {
yui: {
files: grunt.moodleEnv.inComponent
? ['yui/src/*.json', 'yui/src/**/*.js']
: ['**/yui/src/**/*.js'],
tasks: ['yui']
},
},
});
// On watch, we dynamically modify config to build only affected files. This
// method is slightly complicated to deal with multiple changed files at once (copied
// from the grunt-contrib-watch readme).
let changedFiles = Object.create(null);
const onChange = grunt.util._.debounce(function() {
const files = Object.keys(changedFiles);
grunt.config('shifter.options.paths', files);
changedFiles = Object.create(null);
}, 200);
grunt.event.on('watch', (action, filepath) => {
changedFiles[filepath] = action;
onChange();
});
return handler;
};
-46
View File
@@ -1,46 +0,0 @@
// 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/>.
/* jshint node: true, browser: false */
/* eslint-env node */
/**
* @copyright 2021 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
module.exports = grunt => {
/**
* Generate ignore files (utilising thirdpartylibs.xml data)
*/
const handler = function() {
const path = require('path');
// Are we in a YUI directory?
if (path.basename(path.resolve(grunt.moodleEnv.cwd, '../../')) == 'yui') {
grunt.task.run('yui');
// Are we in an AMD directory?
} else if (grunt.moodleEnv.inAMD) {
grunt.task.run('amd');
} else {
// Run all of the requested startup tasks.
grunt.moodleEnv.startupTasks.forEach(taskName => grunt.task.run(taskName));
}
};
// Register the startup task.
grunt.registerTask('startup', 'Run the correct tasks for the current directory', handler);
return handler;
};
-35
View File
@@ -1,35 +0,0 @@
// 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/>.
/* jshint node: true, browser: false */
/* eslint-env node */
/**
* @copyright 2021 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
module.exports = grunt => {
// Load the ignorefiles tasks.
require('./ignorefiles')(grunt);
// Load the Style Lint tasks.
require('./stylelint')(grunt);
// Load the SASS tasks.
require('./sass')(grunt);
// Add the 'css' task as a startup task.
grunt.moodleEnv.startupTasks.push('css');
};
-183
View File
@@ -1,183 +0,0 @@
// 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/>.
/* jshint node: true, browser: false */
/* eslint-env node */
/**
* @copyright 2021 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
module.exports = grunt => {
const getCssConfigForFiles = files => {
return {
stylelint: {
css: {
// Use a fully-qualified path.
src: files,
options: {
configOverrides: {
rules: {
// These rules have to be disabled in .stylelintrc for scss compat.
"at-rule-no-unknown": true,
}
}
}
},
},
};
};
const getScssConfigForFiles = files => {
return {
stylelint: {
scss: {
options: {syntax: 'scss'},
src: files,
},
},
};
};
/**
* Register any stylelint tasks.
*
* @param {Object} grunt
* @param {Array} files
* @param {String} fullRunDir
*/
const registerStyleLintTasks = () => {
const glob = require('glob');
// The stylelinters do not handle the case where a configuration was provided but no files were included.
// Keep track of whether any files were found.
let hasCss = false;
let hasScss = false;
// The stylelint processors do not take a path argument. They always check all provided values.
// As a result we must check through each glob and determine if any files match the current directory.
const scssFiles = [];
const cssFiles = [];
const requestedFiles = grunt.moodleEnv.files;
if (requestedFiles) {
// Grunt was called with a files argument.
// Check whether each of the requested files matches either the CSS or SCSS source file list.
requestedFiles.forEach(changedFilePath => {
let matchesGlob;
// Check whether this watched path matches any watched SCSS file.
matchesGlob = grunt.moodleEnv.scssSrc.some(watchedPathGlob => {
return glob.sync(watchedPathGlob).indexOf(changedFilePath) !== -1;
});
if (matchesGlob) {
scssFiles.push(changedFilePath);
hasScss = true;
}
// Check whether this watched path matches any watched CSS file.
matchesGlob = grunt.moodleEnv.cssSrc.some(watchedPathGlob => {
return glob.sync(watchedPathGlob).indexOf(changedFilePath) !== -1;
});
if (matchesGlob) {
cssFiles.push(changedFilePath);
hasCss = true;
}
});
} else {
// Grunt was called without a list of files.
// The start directory (runDir) may be a child dir of the project.
// Check each scssSrc file to see if it's in the start directory.
// This means that we can lint just mod/*/styles.css if started in the mod directory.
grunt.moodleEnv.scssSrc.forEach(path => {
if (path.startsWith(grunt.moodleEnv.runDir)) {
scssFiles.push(path);
hasScss = true;
}
});
grunt.moodleEnv.cssSrc.forEach(path => {
if (path.startsWith(grunt.moodleEnv.runDir)) {
cssFiles.push(path);
hasCss = true;
}
});
}
// Register the tasks.
const scssTasks = ['sass'];
if (hasScss) {
grunt.config.merge(getScssConfigForFiles(scssFiles));
scssTasks.unshift('stylelint:scss');
}
scssTasks.unshift('ignorefiles');
const cssTasks = ['ignorefiles'];
if (hasCss) {
grunt.config.merge(getCssConfigForFiles(cssFiles));
cssTasks.push('stylelint:css');
}
// The tasks must be registered, even if empty to ensure a consistent command list.
// They jsut won't run anything.
grunt.registerTask('scss', scssTasks);
grunt.registerTask('rawcss', cssTasks);
};
// Register CSS tasks.
grunt.loadNpmTasks('grunt-stylelint');
// Register the style lint tasks.
registerStyleLintTasks();
grunt.registerTask('css', ['scss', 'rawcss']);
const getCoreThemeMatches = () => {
const scssMatch = 'scss/**/*.scss';
if (grunt.moodleEnv.inTheme) {
return [scssMatch];
}
if (grunt.moodleEnv.runDir.startsWith('theme')) {
return [`*/${scssMatch}`];
}
return [`theme/*/${scssMatch}`];
};
// Add the watch configuration for rawcss, and scss.
grunt.config.merge({
watch: {
rawcss: {
files: [
'**/*.css',
],
excludes: [
'**/moodle.css',
'**/editor.css',
'jsdoc/styles/*.css',
],
tasks: ['rawcss']
},
scss: {
files: getCoreThemeMatches(),
tasks: ['scss']
},
},
});
};
-42
View File
@@ -1,42 +0,0 @@
// 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/>.
/* jshint node: true, browser: false */
/* eslint-env node */
/**
* @copyright 2023 Sara Arjona <sara@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
module.exports = grunt => {
/**
* Generate upgradable third-party libraries (utilising thirdpartylibs.xml data)
*/
grunt.registerTask('upgradablelibs', 'Generate upgradable third-party libraries', async function() {
const done = this.async();
const path = require('path');
const ComponentList = require(path.join(process.cwd(), '.grunt', 'components.js'));
// An array of third party libraries that have a newer version in their repositories.
const thirdPartyLibs = await ComponentList.getThirdPartyLibsUpgradable({progress: true});
for (let library of thirdPartyLibs) {
grunt.log.ok(JSON.stringify(Object.assign({}, library), null, 4));
}
done();
});
};
-272
View File
@@ -1,272 +0,0 @@
/**
* This is a wrapper task to handle the grunt watch command. It attempts to use
* Watchman to monitor for file changes, if it's installed, because it's much faster.
*
* If Watchman isn't installed then it falls back to the grunt-contrib-watch file
* watcher for backwards compatibility.
*/
/* eslint-env node */
module.exports = grunt => {
/**
* This is a wrapper task to handle the grunt watch command. It attempts to use
* Watchman to monitor for file changes, if it's installed, because it's much faster.
*
* If Watchman isn't installed then it falls back to the grunt-contrib-watch file
* watcher for backwards compatibility.
*/
const watchHandler = function() {
const async = require('async');
const watchTaskDone = this.async();
let watchInitialised = false;
let watchTaskQueue = {};
let processingQueue = false;
const watchman = require('fb-watchman');
const watchmanClient = new watchman.Client();
// Grab the tasks and files that have been queued up and execute them.
var processWatchTaskQueue = function() {
if (!Object.keys(watchTaskQueue).length || processingQueue) {
// If there is nothing in the queue or we're already processing then wait.
return;
}
processingQueue = true;
// Grab all tasks currently in the queue.
var queueToProcess = watchTaskQueue;
// Reset the queue.
watchTaskQueue = {};
async.forEachSeries(
Object.keys(queueToProcess),
function(task, next) {
var files = queueToProcess[task];
var filesOption = '--files=' + files.join(',');
grunt.log.ok('Running task ' + task + ' for files ' + filesOption);
// Spawn the task in a child process so that it doesn't kill this one
// if it failed.
grunt.util.spawn(
{
// Spawn with the grunt bin.
grunt: true,
// Run from current working dir and inherit stdio from process.
opts: {
cwd: grunt.moodleEnv.fullRunDir,
stdio: 'inherit'
},
args: [task, filesOption]
},
function(err, res, code) {
if (code !== 0) {
// The grunt task failed.
grunt.log.error(err);
}
// Move on to the next task.
next();
}
);
},
function() {
// No longer processing.
processingQueue = false;
// Once all of the tasks are done then recurse just in case more tasks
// were queued while we were processing.
processWatchTaskQueue();
}
);
};
const originalWatchConfig = grunt.config.get(['watch']);
const watchConfig = Object.keys(originalWatchConfig).reduce(function(carry, key) {
if (key == 'options') {
return carry;
}
const value = originalWatchConfig[key];
const taskNames = value.tasks;
const files = value.files;
let excludes = [];
if (value.excludes) {
excludes = value.excludes;
}
taskNames.forEach(function(taskName) {
carry[taskName] = {
files,
excludes,
};
});
return carry;
}, {});
watchmanClient.on('error', function(error) {
// We have to add an error handler here and parse the error string because the
// example way from the docs to check if Watchman is installed doesn't actually work!!
// See: https://github.com/facebook/watchman/issues/509
if (error.message.match('Watchman was not found')) {
// If watchman isn't installed then we should fallback to the other watch task.
grunt.log.ok('It is recommended that you install Watchman for better performance using the "watch" command.');
// Fallback to the old grunt-contrib-watch task.
grunt.renameTask('watch-grunt', 'watch');
grunt.task.run(['watch']);
// This task is finished.
watchTaskDone(0);
} else {
grunt.log.error(error);
// Fatal error.
watchTaskDone(1);
}
});
watchmanClient.on('subscription', function(resp) {
if (resp.subscription !== 'grunt-watch') {
return;
}
resp.files.forEach(function(file) {
grunt.log.ok('File changed: ' + file.name);
var fullPath = grunt.moodleEnv.fullRunDir + '/' + file.name;
Object.keys(watchConfig).forEach(function(task) {
const fileGlobs = watchConfig[task].files;
var match = fileGlobs.some(function(fileGlob) {
return grunt.file.isMatch(`**/${fileGlob}`, fullPath);
});
if (match) {
// If we are watching a subdirectory then the file.name will be relative
// to that directory. However the grunt tasks expect the file paths to be
// relative to the Gruntfile.js location so let's normalise them before
// adding them to the queue.
var relativePath = fullPath.replace(grunt.moodleEnv.gruntFilePath + '/', '');
if (task in watchTaskQueue) {
if (!watchTaskQueue[task].includes(relativePath)) {
watchTaskQueue[task] = watchTaskQueue[task].concat(relativePath);
}
} else {
watchTaskQueue[task] = [relativePath];
}
}
});
});
processWatchTaskQueue();
});
process.on('SIGINT', function() {
// Let the user know that they may need to manually stop the Watchman daemon if they
// no longer want it running.
if (watchInitialised) {
grunt.log.ok('The Watchman daemon may still be running and may need to be stopped manually.');
}
process.exit();
});
// Initiate the watch on the current directory.
watchmanClient.command(['watch-project', grunt.moodleEnv.fullRunDir], function(watchError, watchResponse) {
if (watchError) {
grunt.log.error('Error initiating watch:', watchError);
watchTaskDone(1);
return;
}
if ('warning' in watchResponse) {
grunt.log.error('warning: ', watchResponse.warning);
}
var watch = watchResponse.watch;
var relativePath = watchResponse.relative_path;
watchInitialised = true;
watchmanClient.command(['clock', watch], function(clockError, clockResponse) {
if (clockError) {
grunt.log.error('Failed to query clock:', clockError);
watchTaskDone(1);
return;
}
// Generate the expression query used by watchman.
// Documentation is limited, but see https://facebook.github.io/watchman/docs/expr/allof.html for examples.
// We generate an expression to match any value in the files list of all of our tasks, but excluding
// all value in the excludes list of that task.
//
// [anyof, [
// [allof, [
// [anyof, [
// ['match', validPath, 'wholename'],
// ['match', validPath, 'wholename'],
// ],
// [not,
// [anyof, [
// ['match', invalidPath, 'wholename'],
// ['match', invalidPath, 'wholename'],
// ],
// ],
// ],
var matchWholeName = fileGlob => ['match', fileGlob, 'wholename'];
var matches = Object.keys(watchConfig).map(function(task) {
const matchAll = [];
matchAll.push(['anyof'].concat(watchConfig[task].files.map(matchWholeName)));
if (watchConfig[task].excludes.length) {
matchAll.push(['not', ['anyof'].concat(watchConfig[task].excludes.map(matchWholeName))]);
}
return ['allof'].concat(matchAll);
});
matches = ['anyof'].concat(matches);
var sub = {
expression: matches,
// Which fields we're interested in.
fields: ["name", "size", "type"],
// Add our time constraint.
since: clockResponse.clock
};
if (relativePath) {
/* eslint-disable camelcase */
sub.relative_root = relativePath;
}
watchmanClient.command(['subscribe', watch, 'grunt-watch', sub], function(subscribeError) {
if (subscribeError) {
// Probably an error in the subscription criteria.
grunt.log.error('failed to subscribe: ', subscribeError);
watchTaskDone(1);
return;
}
grunt.log.ok('Listening for changes to files in ' + grunt.moodleEnv.fullRunDir);
});
});
});
};
// Rename the grunt-contrib-watch "watch" task because we're going to wrap it.
grunt.renameTask('watch', 'watch-grunt');
// Register the new watch handler.
grunt.registerTask('watch', 'Run tasks on file changes', watchHandler);
grunt.config.merge({
watch: {
options: {
nospawn: true // We need not to spawn so config can be changed dynamically.
},
},
});
return watchHandler;
};
-2
View File
@@ -1,2 +0,0 @@
**/amd/**
/*.js
-1
View File
@@ -1 +0,0 @@
lts/gallium
+80
View File
@@ -0,0 +1,80 @@
# Generated by "grunt ignorefiles"
theme/bootstrapbase/style/
theme/clean/style/custom.css
theme/more/style/custom.css
node_modules/
vendor/
admin/tool/usertours/amd/src/tour.js
admin/tool/usertours/amd/src/popper.js
auth/cas/CAS/
auth/fc/fcFPP.php
enrol/lti/ims-blti/
filter/algebra/AlgParser.pm
filter/tex/mimetex.*
lib/editor/atto/yui/src/rangy/js/*.*
lib/editor/tinymce/plugins/pdw/tinymce/
lib/editor/tinymce/plugins/spellchecker/rpc.php
lib/editor/tinymce/tiny_mce/
lib/adodb/
lib/bennu/
lib/evalmath/
lib/lessphp/
lib/phpexcel/
lib/google/
lib/htmlpurifier/
lib/jabber/
lib/minify/matthiasmullie-minify/
lib/minify/matthiasmullie-pathconverter/
lib/pear/Auth/RADIUS.php
lib/pear/Crypt/CHAP.php
lib/pear/HTML/Common.php
lib/pear/HTML/QuickForm.php
lib/pear/HTML/QuickForm/
lib/pear/PEAR.php
lib/phpmailer/
lib/simplepie/
lib/tcpdf/
lib/typo3/
lib/yuilib/
lib/yuilib/gallery/
lib/jquery/
lib/html2text/
lib/markdown/
lib/recaptchalib.php
lib/xhprof/
lib/xmlize.php
lib/horde/
lib/requirejs/
lib/amd/src/loglevel.js
lib/mustache/
lib/amd/src/mustache.js
lib/graphlib.php
lib/php-css-parser/
lib/rtlcss/
lib/scssphp/
lib/spout/
lib/amd/src/chartjs-lazy.js
lib/maxmind/GeoIp2/
lib/maxmind/MaxMind/
lib/ltiprovider/
media/player/videojs/amd/src/video-lazy.js
media/player/videojs/amd/src/Youtube-lazy.js
media/player/videojs/videojs/
mod/assign/feedback/editpdf/fpdi/
repository/s3/S3.php
theme/boost/scss/bootstrap/
theme/boost/amd/src/alert.js
theme/boost/amd/src/button.js
theme/boost/amd/src/carousel.js
theme/boost/amd/src/collapse.js
theme/boost/amd/src/dropdown.js
theme/boost/amd/src/modal.js
theme/boost/amd/src/popover.js
theme/boost/amd/src/scrollspy.js
theme/boost/amd/src/tab.js
theme/boost/amd/src/tooltip.js
theme/boost/amd/src/util.js
theme/boost/amd/src/tether.js
theme/bootstrapbase/less/bootstrap/
theme/bootstrapbase/javascript/html5shiv.js
theme/bootstrapbase/amd/src/bootstrap.js
+10 -11
View File
@@ -1,22 +1,18 @@
{
"plugins": [
"stylelint-csstree-validator"
],
"rules": {
"csstree/validator": true,
"at-rule-empty-line-before": [ "always",
{"except": [ "blockless-after-blockless"], ignore: ["after-comment", "inside-block"]}
{"except": [ "blockless-group"], ignore: ["after-comment", "all-nested"]}
],
"at-rule-name-case": "lower",
"at-rule-name-space-after": "always-single-line",
"at-rule-no-unknown": null, # Enabled for non-scss in grunt.
"at-rule-semicolon-newline-after": "always",
"at-rule-semicolon-space-before": "never",
"block-closing-brace-newline-after": "always",
"block-closing-brace-newline-before": "always",
"block-closing-brace-newline-before": "always-multi-line",
"block-closing-brace-space-before": "always-single-line",
"block-no-empty": true,
"block-opening-brace-newline-after": "always",
"block-no-single-line": true,
"block-opening-brace-newline-after": "always-multi-line",
"block-opening-brace-space-after": "always-single-line",
"block-opening-brace-space-before": "always",
"color-hex-case": ["lower", { "severity": "warning" }],
@@ -25,6 +21,7 @@
"declaration-bang-space-after": "never",
"declaration-bang-space-before": "always",
"declaration-block-no-duplicate-properties": true,
"declaration-block-no-ignored-properties": true,
"declaration-block-no-shorthand-property-overrides": true,
"declaration-block-semicolon-newline-after": "always-multi-line",
"declaration-block-semicolon-space-after": "always-single-line",
@@ -35,7 +32,6 @@
"declaration-colon-space-after": "always-single-line",
"declaration-colon-space-before": "never",
"declaration-no-important": true,
"font-family-no-duplicate-names": true,
"function-calc-no-unspaced-operator": true,
"function-comma-newline-after": "always-multi-line",
"function-comma-space-after": "always-single-line",
@@ -45,7 +41,7 @@
"function-name-case": "lower",
"function-parentheses-newline-inside": "always-multi-line",
"function-parentheses-space-inside": "never-single-line",
"function-url-scheme-blacklist": ["data"],
"function-url-data-uris": never,
"function-whitespace-after": "always",
"indentation": 4,
"keyframe-declaration-no-important": true,
@@ -54,12 +50,14 @@
"max-line-length": [132, { "severity": "warning" }],
"media-feature-colon-space-after": "always",
"media-feature-colon-space-before": "never",
"media-feature-no-missing-punctuation": true,
"media-feature-parentheses-space-inside": "never",
"media-feature-range-operator-space-after": "always",
"media-feature-range-operator-space-before": "always",
"media-query-list-comma-newline-after": "always-multi-line",
"media-query-list-comma-space-after": "always-single-line",
"media-query-list-comma-space-before": "never",
"no-browser-hacks": null, # Enabled for non-scss in grunt.
"no-empty-source": true,
"no-eol-whitespace": true,
"no-extra-semicolons": [true, { "severity": "warning" }],
@@ -80,10 +78,11 @@
"selector-pseudo-class-parentheses-space-inside": "never",
"selector-pseudo-element-case": "lower",
"selector-pseudo-element-no-unknown": true,
"selector-root-no-composition": true,
"selector-type-case": "lower",
"selector-type-no-unknown": true,
"string-no-newline": true,
"time-min-milliseconds": 100,
"time-no-imperceptible": true,
"unit-blacklist": ["pt"],
"unit-case": "lower",
"unit-no-unknown": true,
+285
View File
@@ -0,0 +1,285 @@
# PLEASE NOTE: Travis is not currently utilised by the Moodle core integration
# process (which uses our internal CI system) this file is here for the benefit
# of community developers git clones - see MDL-51458.
sudo: required
# We currently disable Travis notifications entirely until https://github.com/travis-ci/travis-ci/issues/4976
# is fixed.
notifications:
email: false
language: php
php:
# We only run the highest and lowest supported versions to reduce the load on travis-ci.org.
- 7.1
- 5.6
addons:
packages:
- mysql-server-5.6
- mysql-client-core-5.6
- mysql-client-5.6
services:
- redis-server
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.1, 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 unit tests on MySQL
- DB=mysqli TASK=PHPUNIT
# 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
matrix:
# Enable fast finish.
# This will fail the build if a single job fails (except those in allow_failures).
# It will not stop the jobs from running.
fast_finish: true
include:
# Run grunt/npm install on highest version ('node' is an alias for the latest node.js version.)
- php: 7.1
env: DB=none TASK=GRUNT NVM_VERSION='8.9'
exclude:
# MySQL - it's just too slow.
# Exclude it on all versions except for 7.1
- env: DB=mysqli TASK=PHPUNIT
php: 5.6
# Moodle 2.7 is not compatible with PHP 7 for the upgrade test.
- env: DB=pgsql TASK=UPGRADE
php: 7.1
cache:
directories:
- $HOME/.composer/cache
- $HOME/.npm
install:
- >
if [ "$DB" = 'mysqli' ];
then
sudo mkdir /mnt/ramdisk
sudo mount -t tmpfs -o size=1024m tmpfs /mnt/ramdisk
sudo stop mysql
sudo mv /var/lib/mysql /mnt/ramdisk
sudo ln -s /mnt/ramdisk/mysql /var/lib/mysql
sudo start mysql
fi
- >
if [ "$DB" = 'pgsql' ];
then
sudo mkdir /mnt/ramdisk
sudo mount -t tmpfs -o size=1024m tmpfs /mnt/ramdisk
sudo service postgresql stop
sudo mv /var/lib/postgresql /mnt/ramdisk
sudo ln -s /mnt/ramdisk/postgresql /var/lib/postgresql
sudo service postgresql start 9.6
fi
- >
if [ "$TASK" = 'PHPUNIT' ];
then
if [ -n "$GITHUB_APITOKEN" ]; then
composer config github-oauth.github.com $GITHUB_APITOKEN;
echo 'auth.json' >> .git/info/exclude
fi
# Enable Redis.
echo 'extension="redis.so"' > /tmp/redis.ini
phpenv config-add /tmp/redis.ini
# Install composer dependencies.
# We need --no-interaction in case we hit API limits for composer. This causes it to fall back to a standard clone.
# Typically it should be able to use the Composer cache if any other job has already completed before we started here.
travis_retry composer install --prefer-dist --no-interaction;
fi
- >
if [ "$TASK" = 'GRUNT' ];
then
nvm install $NVM_VERSION ;
nvm use $NVM_VERSION ;
fi
before_script:
- phpenv config-rm xdebug.ini
- >
if [ "$TASK" = 'PHPUNIT' -o "$TASK" = 'UPGRADE' ];
then
# Copy generic configuration in place.
cp config-dist.php config.php ;
# Create the moodledata directory.
mkdir -p "$HOME"/roots/base
# The database name and password.
sed -i \
-e "s%= 'moodle'%= 'travis_ci_test'%" \
-e "s%= 'password'%= ''%" \
config.php ;
# The wwwroot and dataroot.
sed -i \
-e "s%http://example.com/moodle%http://localhost%" \
-e "s%/home/example/moodledata%/home/travis/roots/base%" \
config.php ;
if [ "$DB" = 'pgsql' ];
then
# Postgres-specific setup.
sed -i \
-e "s%= 'username'%= 'postgres'%" \
config.php ;
psql -c 'CREATE DATABASE travis_ci_test;' -U postgres;
fi
if [ "$DB" = 'mysqli' ];
then
# MySQL-specific setup.
sed -i \
-e "s%= 'pgsql'%= 'mysqli'%" \
-e "s%= 'username'%= 'travis'%" \
-e "s%=> 'utf8mb4_unicode_ci'%=> 'utf8mb4_bin'%" \
config.php;
mysql -u root -e 'SET GLOBAL innodb_file_format=barracuda;' ;
mysql -u root -e 'SET GLOBAL innodb_file_per_table=ON;' ;
mysql -u root -e 'SET GLOBAL innodb_large_prefix=ON;' ;
mysql -e 'CREATE DATABASE travis_ci_test DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_bin;' ;
fi
fi
- >
if [ "$TASK" = 'PHPUNIT' ];
then
# Create a directory for the phpunit dataroot.
mkdir -p "$HOME"/roots/phpunit
# The phpunit dataroot and prefix..
sed -i \
-e "/require_once/i \\\$CFG->phpunit_dataroot = '\/home\/travis\/roots\/phpunit';" \
-e "/require_once/i \\\$CFG->phpunit_prefix = 'p_';" \
-e "/require_once/i \\define('TEST_SESSION_REDIS_HOST', '127.0.0.1');" \
config.php ;
# Initialise PHPUnit for Moodle.
php admin/tool/phpunit/cli/init.php
fi
- >
if [ "$TASK" = 'GRUNT' ];
then
npm install --no-spin;
npm install --no-spin -g grunt ;
fi
########################################################################
# CI Tests
########################################################################
- >
if [ "$TASK" = 'CITEST' ];
then
# Note - this is deliberately placed in the script section as we
# should not add any code until after phpunit has run.
# The following repositories are required.
# The local_ci repository does the actual checking.
git clone https://github.com/moodlehq/moodle-local_ci.git local/ci
# We need the official upstream for comparison
git remote add upstream https://github.com/moodle/moodle.git;
git fetch upstream MOODLE_32_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`
# Variables required by our linter.
export gitcmd=`which git`;
export gitdir="$TRAVIS_BUILD_DIR";
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 27 STABLE branch.
git fetch upstream MOODLE_27_STABLE;
git checkout MOODLE_27_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' ];
then
vendor/bin/phpunit;
fi
- >
if [ "$TASK" = 'CITEST' ];
then
bash local/ci/php_lint/php_lint.sh;
fi
- >
if [ "$TASK" = 'GRUNT' ];
then
grunt ;
# 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.
git add . ;
git diff --cached --exit-code ;
fi
########################################################################
# Upgrade test
########################################################################
- >
if [ "$TASK" = 'UPGRADE' ];
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
fi
+329 -220
View File
@@ -16,251 +16,360 @@
/* eslint-env node */
/**
* Grunt configuration for Moodle.
*
* @copyright 2014 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* Setup the Grunt Moodle environment.
*
* @param {Grunt} grunt
* @returns {Object}
* Grunt configuration
*/
const setupMoodleEnvironment = grunt => {
const fs = require('fs');
const path = require('path');
const ComponentList = require(path.join(process.cwd(), '.grunt', 'components.js'));
const getAmdConfiguration = () => {
// If the cwd is the amd directory in the current component then it will be empty.
// If the cwd is a child of the component's AMD directory, the relative directory will not start with ..
let inAMD = !path.relative(`${componentDirectory}/amd`, cwd).startsWith('..');
// Globbing pattern for matching all AMD JS source files.
let amdSrc = [];
if (inComponent) {
amdSrc.push(
componentDirectory + "/amd/src/*.js",
componentDirectory + "/amd/src/**/*.js"
);
} else {
amdSrc = ComponentList.getAmdSrcGlobList();
}
return {
inAMD,
amdSrc,
};
};
const getYuiConfiguration = () => {
let yuiSrc = [];
if (inComponent) {
yuiSrc.push(componentDirectory + "/yui/src/**/*.js");
} else {
yuiSrc = ComponentList.getYuiSrcGlobList(gruntFilePath + '/');
}
return {
yuiSrc,
};
};
const getStyleConfiguration = () => {
const ComponentList = require(path.join(process.cwd(), '.grunt', 'components.js'));
// Build the cssSrc and scssSrc.
// Valid paths are:
// [component]/styles.css; and either
// [theme/[themename]]/scss/**/*.scss; or
// [theme/[themename]]/style/*.css.
//
// If a theme has scss, then it is assumed that the style directory contains generated content.
let cssSrc = [];
let scssSrc = [];
const checkComponentDirectory = componentDirectory => {
const isTheme = componentDirectory.startsWith('theme/');
if (isTheme) {
const scssDirectory = `${componentDirectory}/scss`;
if (fs.existsSync(scssDirectory)) {
// This theme has an SCSS directory.
// Include all scss files within it recursively, but do not check for css files.
scssSrc.push(`${scssDirectory}/*.scss`);
scssSrc.push(`${scssDirectory}/**/*.scss`);
} else {
// This theme has no SCSS directory.
// Only hte CSS files in the top-level directory are checked.
cssSrc.push(`${componentDirectory}/style/*.css`);
}
} else {
// This is not a theme.
// All other plugin types are restricted to a single styles.css in their top level.
cssSrc.push(`${componentDirectory}/styles.css`);
}
};
if (inComponent) {
checkComponentDirectory(componentDirectory);
} else {
ComponentList.getComponentPaths(`${gruntFilePath}/`).forEach(componentPath => {
checkComponentDirectory(componentPath);
});
}
return {
cssSrc,
scssSrc,
};
};
/**
* Calculate the cwd, taking into consideration the `root` option (for Windows).
*
* @param {Object} grunt
* @returns {String} The current directory as best we can determine
*/
const getCwd = grunt => {
let cwd = fs.realpathSync(process.env.PWD || process.cwd());
// Windows users can't run grunt in a subdirectory, so allow them to set
// the root by passing --root=path/to/dir.
if (grunt.option('root')) {
const root = grunt.option('root');
if (grunt.file.exists(__dirname, root)) {
cwd = fs.realpathSync(path.join(__dirname, root));
grunt.log.ok('Setting root to ' + cwd);
} else {
grunt.fail.fatal('Setting root to ' + root + ' failed - path does not exist');
}
}
return cwd;
};
// Detect directories:
// * gruntFilePath The real path on disk to this Gruntfile.js
// * cwd The current working directory, which can be overridden by the `root` option
// * relativeCwd The cwd, relative to the Gruntfile.js
// * componentDirectory The root directory of the component if the cwd is in a valid component
// * inComponent Whether the cwd is in a valid component
// * runDir The componentDirectory or cwd if not in a component, relative to Gruntfile.js
// * fullRunDir The full path to the runDir
const gruntFilePath = fs.realpathSync(process.cwd());
const cwd = getCwd(grunt);
const relativeCwd = path.relative(gruntFilePath, cwd);
const componentDirectory = ComponentList.getOwningComponentDirectory(relativeCwd);
const inComponent = !!componentDirectory;
const inTheme = !!componentDirectory && componentDirectory.startsWith('theme/');
const runDir = inComponent ? componentDirectory : relativeCwd;
const fullRunDir = fs.realpathSync(gruntFilePath + path.sep + runDir);
const {inAMD, amdSrc} = getAmdConfiguration();
const {yuiSrc} = getYuiConfiguration();
const {cssSrc, scssSrc} = getStyleConfiguration();
let files = null;
if (grunt.option('files')) {
// Accept a comma separated list of files to process.
files = grunt.option('files').split(',');
}
grunt.log.debug('============================================================================');
grunt.log.debug(`= Node version: ${process.versions.node}`);
grunt.log.debug(`= grunt version: ${grunt.package.version}`);
grunt.log.debug(`= process.cwd: '` + process.cwd() + `'`);
grunt.log.debug(`= process.env.PWD: '${process.env.PWD}'`);
grunt.log.debug(`= path.sep '${path.sep}'`);
grunt.log.debug('============================================================================');
grunt.log.debug(`= gruntFilePath: '${gruntFilePath}'`);
grunt.log.debug(`= relativeCwd: '${relativeCwd}'`);
grunt.log.debug(`= componentDirectory: '${componentDirectory}'`);
grunt.log.debug(`= inComponent: '${inComponent}'`);
grunt.log.debug(`= runDir: '${runDir}'`);
grunt.log.debug(`= fullRunDir: '${fullRunDir}'`);
grunt.log.debug('============================================================================');
if (inComponent) {
grunt.log.ok(`Running tasks for component directory ${componentDirectory}`);
}
return {
amdSrc,
componentDirectory,
cwd,
cssSrc,
files,
fullRunDir,
gruntFilePath,
inAMD,
inComponent,
inTheme,
relativeCwd,
runDir,
scssSrc,
yuiSrc,
};
};
/**
* Verify tha tthe current NodeJS version matches the required version in package.json.
*
* @param {Grunt} grunt
*/
const verifyNodeVersion = grunt => {
const semver = require('semver');
module.exports = function(grunt) {
var path = require('path'),
tasks = {},
cwd = process.env.PWD || process.cwd(),
async = require('async'),
DOMParser = require('xmldom').DOMParser,
xpath = require('xpath'),
semver = require('semver');
// Verify the node version is new enough.
var expected = semver.validRange(grunt.file.readJSON('package.json').engines.node);
var actual = semver.valid(process.version);
if (!semver.satisfies(actual, expected)) {
grunt.fail.fatal('Node version not satisfied. Require ' + expected + ', version installed: ' + actual);
grunt.fail.fatal('Node version too old. Require ' + expected + ', version installed: ' + actual);
}
};
/**
* Grunt configuration.
*
* @param {Grunt} grunt
*/
module.exports = function(grunt) {
// Verify that the Node version meets our requirements.
verifyNodeVersion(grunt);
// Windows users can't run grunt in a subdirectory, so allow them to set
// the root by passing --root=path/to/dir.
if (grunt.option('root')) {
var root = grunt.option('root');
if (grunt.file.exists(__dirname, root)) {
cwd = path.join(__dirname, root);
grunt.log.ok('Setting root to ' + cwd);
} else {
grunt.fail.fatal('Setting root to ' + root + ' failed - path does not exist');
}
}
// Setup the Moodle environemnt within the Grunt object.
grunt.moodleEnv = setupMoodleEnvironment(grunt);
var inAMD = path.basename(cwd) == 'amd';
// Globbing pattern for matching all AMD JS source files.
var amdSrc = [inAMD ? cwd + '/src/*.js' : '**/amd/src/*.js'];
/**
* Add the named task.
* Function to generate the destination for the uglify task
* (e.g. build/file.min.js). This function will be passed to
* the rename property of files array when building dynamically:
* http://gruntjs.com/configuring-tasks#building-the-files-object-dynamically
*
* @param {string} name
* @param {Grunt} grunt
* @param {String} destPath the current destination
* @param {String} srcPath the matched src path
* @return {String} The rewritten destination path.
*/
const addTask = (name, grunt) => {
const path = require('path');
const taskPath = path.resolve(`./.grunt/tasks/${name}.js`);
grunt.log.debug(`Including tasks for ${name} from ${taskPath}`);
require(path.resolve(`./.grunt/tasks/${name}.js`))(grunt);
var uglifyRename = function(destPath, srcPath) {
destPath = srcPath.replace('src', 'build');
destPath = destPath.replace('.js', '.min.js');
destPath = path.resolve(cwd, destPath);
return destPath;
};
// Startup tasks.
grunt.moodleEnv.startupTasks = [];
/**
* Find thirdpartylibs.xml and generate an array of paths contained within
* them (used to generate ignore files and so on).
*
* @return {array} The list of thirdparty paths.
*/
var getThirdPartyPathsFromXML = function() {
var thirdpartyfiles = grunt.file.expand('*/**/thirdpartylibs.xml');
var libs = ['node_modules/', 'vendor/'];
// Add Moodle task configuration.
addTask('gherkinlint', grunt);
addTask('ignorefiles', grunt);
thirdpartyfiles.forEach(function(file) {
var dirname = path.dirname(file);
addTask('javascript', grunt);
addTask('style', grunt);
addTask('componentlibrary', grunt);
var doc = new DOMParser().parseFromString(grunt.file.read(file));
var nodes = xpath.select("/libraries/library/location/text()", doc);
addTask('watch', grunt);
addTask('startup', grunt);
nodes.forEach(function(node) {
var lib = path.join(dirname, node.toString());
if (grunt.file.isDir(lib)) {
// Ensure trailing slash on dirs.
lib = lib.replace(/\/?$/, '/');
}
addTask('upgradablelibs', grunt);
// Look for duplicate paths before adding to array.
if (libs.indexOf(lib) === -1) {
libs.push(lib);
}
});
});
return libs;
};
// Project configuration.
grunt.initConfig({
eslint: {
// Even though warnings dont stop the build we don't display warnings by default because
// at this moment we've got too many core warnings.
options: {quiet: !grunt.option('show-lint-warnings')},
amd: {
src: amdSrc,
// Check AMD with some slightly stricter rules.
rules: {
'no-unused-vars': 'error',
'no-implicit-globals': 'error'
}
},
// Check YUI module source files.
yui: {
src: ['**/yui/src/**/*.js', '!*/**/yui/src/*/meta/*.js'],
options: {
// Disable some rules which we can't safely define for YUI rollups.
rules: {
'no-undef': 'off',
'no-unused-vars': 'off',
'no-unused-expressions': 'off'
}
}
}
},
uglify: {
amd: {
files: [{
expand: true,
src: amdSrc,
rename: uglifyRename
}],
options: {report: 'none'}
}
},
less: {
bootstrapbase: {
files: {
"theme/bootstrapbase/style/moodle.css": "theme/bootstrapbase/less/moodle.less",
"theme/bootstrapbase/style/editor.css": "theme/bootstrapbase/less/editor.less",
},
options: {
compress: false // We must not compress to keep the comments.
}
}
},
watch: {
options: {
nospawn: true // We need not to spawn so config can be changed dynamically.
},
amd: {
files: ['**/amd/src/**/*.js'],
tasks: ['amd']
},
bootstrapbase: {
files: ["theme/bootstrapbase/less/**/*.less"],
tasks: ["css"]
},
yui: {
files: ['**/yui/src/**/*.js'],
tasks: ['yui']
},
},
shifter: {
options: {
recursive: true,
paths: [cwd]
}
},
stylelint: {
less: {
options: {
syntax: 'less',
configOverrides: {
rules: {
// These rules have to be disabled in .stylelintrc for scss compat.
"at-rule-no-unknown": true,
"no-browser-hacks": [true, {"severity": "warning"}]
}
}
},
src: ['theme/**/*.less']
},
scss: {
options: {syntax: 'scss'},
src: ['*/**/*.scss']
},
css: {
src: ['*/**/*.css'],
options: {
configOverrides: {
rules: {
// These rules have to be disabled in .stylelintrc for scss compat.
"at-rule-no-unknown": true,
"no-browser-hacks": [true, {"severity": "warning"}]
}
}
}
}
}
});
/**
* Generate ignore files (utilising thirdpartylibs.xml data)
*/
tasks.ignorefiles = function() {
// An array of paths to third party directories.
var thirdPartyPaths = getThirdPartyPathsFromXML();
// Generate .eslintignore.
var eslintIgnores = ['# Generated by "grunt ignorefiles"', '*/**/yui/src/*/meta/', '*/**/build/'].concat(thirdPartyPaths);
grunt.file.write('.eslintignore', eslintIgnores.join('\n'));
// Generate .stylelintignore.
var stylelintIgnores = [
'# Generated by "grunt ignorefiles"',
'theme/bootstrapbase/style/',
'theme/clean/style/custom.css',
'theme/more/style/custom.css'
].concat(thirdPartyPaths);
grunt.file.write('.stylelintignore', stylelintIgnores.join('\n'));
};
/**
* Shifter task. Is configured with a path to a specific file or a directory,
* in the case of a specific file it will work out the right module to be built.
*
* Note that this task runs the invidiaul shifter jobs async (becase it spawns
* so be careful to to call done().
*/
tasks.shifter = function() {
var done = this.async(),
options = grunt.config('shifter.options');
// Run the shifter processes one at a time to avoid confusing output.
async.eachSeries(options.paths, function(src, filedone) {
var args = [];
args.push(path.normalize(__dirname + '/node_modules/shifter/bin/shifter'));
// Always ignore the node_modules directory.
args.push('--excludes', 'node_modules');
// Determine the most appropriate options to run with based upon the current location.
if (grunt.file.isMatch('**/yui/**/*.js', src)) {
// When passed a JS file, build our containing module (this happen with
// watch).
grunt.log.debug('Shifter passed a specific JS file');
src = path.dirname(path.dirname(src));
options.recursive = false;
} else if (grunt.file.isMatch('**/yui/src', src)) {
// When in a src directory --walk all modules.
grunt.log.debug('In a src directory');
args.push('--walk');
options.recursive = false;
} else if (grunt.file.isMatch('**/yui/src/*', src)) {
// When in module, only build our module.
grunt.log.debug('In a module directory');
options.recursive = false;
} else if (grunt.file.isMatch('**/yui/src/*/js', src)) {
// When in module src, only build our module.
grunt.log.debug('In a source directory');
src = path.dirname(src);
options.recursive = false;
}
if (grunt.option('watch')) {
grunt.fail.fatal('The --watch option has been removed, please use `grunt watch` instead');
}
// Add the stderr option if appropriate
if (grunt.option('verbose')) {
args.push('--lint-stderr');
}
if (grunt.option('no-color')) {
args.push('--color=false');
}
var execShifter = function() {
grunt.log.ok("Running shifter on " + src);
grunt.util.spawn({
cmd: "node",
args: args,
opts: {cwd: src, stdio: 'inherit', env: process.env}
}, function(error, result, code) {
if (code) {
grunt.fail.fatal('Shifter failed with code: ' + code);
} else {
grunt.log.ok('Shifter build complete.');
filedone();
}
});
};
// Actually run shifter.
if (!options.recursive) {
execShifter();
} else {
// Check that there are yui modules otherwise shifter ends with exit code 1.
if (grunt.file.expand({cwd: src}, '**/yui/src/**/*.js').length > 0) {
args.push('--recursive');
execShifter();
} else {
grunt.log.ok('No YUI modules to build.');
filedone();
}
}
}, done);
};
tasks.startup = function() {
// Are we in a YUI directory?
if (path.basename(path.resolve(cwd, '../../')) == 'yui') {
grunt.task.run('yui');
// Are we in an AMD directory?
} else if (inAMD) {
grunt.task.run('amd');
} else {
// Run them all!.
grunt.task.run('css');
grunt.task.run('js');
}
};
// On watch, we dynamically modify config to build only affected files. This
// method is slightly complicated to deal with multiple changed files at once (copied
// from the grunt-contrib-watch readme).
var changedFiles = Object.create(null);
var onChange = grunt.util._.debounce(function() {
var files = Object.keys(changedFiles);
grunt.config('eslint.amd.src', files);
grunt.config('eslint.yui.src', files);
grunt.config('uglify.amd.files', [{expand: true, src: files, rename: uglifyRename}]);
grunt.config('shifter.options.paths', files);
grunt.config('stylelint.less.src', files);
changedFiles = Object.create(null);
}, 200);
grunt.event.on('watch', function(action, filepath) {
changedFiles[filepath] = action;
onChange();
});
// Register NPM tasks.
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-eslint');
grunt.loadNpmTasks('grunt-stylelint');
// Register JS tasks.
grunt.registerTask('shifter', 'Run Shifter against the current directory', tasks.shifter);
grunt.registerTask('ignorefiles', 'Generate ignore files for linters', tasks.ignorefiles);
grunt.registerTask('yui', ['eslint:yui', 'shifter']);
grunt.registerTask('amd', ['eslint:amd', 'uglify']);
grunt.registerTask('js', ['amd', 'yui']);
// Register CSS taks.
grunt.registerTask('css', ['stylelint:scss', 'stylelint:less', 'less:bootstrapbase', 'stylelint:css']);
// Register the startup task.
grunt.registerTask('startup', 'Run the correct tasks for the current directory', tasks.startup);
// Register the default task.
grunt.registerTask('default', ['startup']);
+35 -53
View File
@@ -1,66 +1,48 @@
MOODLE TRADEMARKS POLICY
========================
The Moodle Trademark
--------------------
The word "Moodle" is trademarked in many countries around the world. The word
was originally an acronym: Modular Object-Oriented Dynamic Learning
Environment. The trademark is owned by Martin Dougiamas, Founder and Director
of Moodle.
The brand and word "Moodle" has trade mark protection in many countries around
the world. Various Moodle™ trade marks are owned by either Moodle Pty Ltd or
one of its associated entities. The law obligates trade mark owners to police
their trade marks and prevent the use of confusingly similar names by
third parties.
The law obligates trademark owners to police their marks and prevent the use of
confusingly similar names by third parties. Through this policy wed like to
make it clear how Moodle-related projects, organisations, and people can use
the Moodle trademark. Wed also like to be clear about how use of the word is
restricted when used to promote commercial Moodle services. We do this to
protect the very business model that allows us to continue developing Moodle
for you.
We have created a more concise and thorough set of Trademark Guidelines
(https://moodle.com/wp-content/uploads/2023/02/Moodle-Trademark-Guidelines-2023-4.pdf)
to help you understand how to comply with Moodle's trade mark requirements.
The Trademark Guidelines will also assist our Moodle Certified Partners and the
community to understand some of the principles that inform Moodle's stance
whenever potential infringement has been detected by us or our community.
Allowed uses
------------
We need to be clear about use of the word "Moodle" and how we restrict its use
when promoting commercial Moodle™ branded services. The proper use of
trade marks reliably assures consumers about the quality of the associated
products or services and where they have been derived from. Because the
Moodle LMS is made available under the open source GNU General Public License'
that permits you to modify the copyrighted software, the distribution of such
modified software in combination with Moodle trade marks can potentially
mislead others in the community. To be clear, the GNU GPL does not include an
implied right or licence to use Moodle's trade marks.
The following uses dont require any permission at all:
We do all this to protect the very business model that allows us to continue
developing various Moodle software solutions for you.
Allowed uses of "Moodle"
------------------------
The following uses don't require any permission at all:
* Referring to the software or the Moodle project as the "Moodle™ software"
or the "Moodle™ project"
* Describing your own implementation of the Moodle™ software platform
(including within corporate settings).
* Referring to the software or the Moodle project.
* Describing your own Moodle implementation (including within corporate
settings).
* Describing a Moodle-based community hub.
* Describing certain software you've made that integrates with Moodle
branded software (e.g. a Moodle integration feature on another system).
* Describing some software youve made that integrates with Moodle
(eg a Moodle integration feature on another system).
Restricted uses of "Moodle"
---------------------------
Restricted uses
---------------
The following uses are generally prohibited without explicit and direct
permission being granted to you by Moodle Pty Ltd. We do this to protect the
Moodle project from software and sites which could confuse people. If in
doubt, reach out for clarification at <trademarks@moodle.com>
Moodle project from software and sites which could confuse people. Please
contact us to ask for permission in writing.
* You can't use the word "Moodle" or any Moodle logos for commercial purposes
without prior written permission from Moodle HQ.
* You can't use "Moodle" in the name of your software (including Mobile apps).
* You can't use "Moodle" in your company name.
* You can't use "Moodle" in your domain name.
* You can't use "Moodle" in advertising-related keywords (such as Adsense).
* You can't use "Moodle" to describe services around Moodle
(such as hosting, training, support, consulting, course creation services,
theme development, customisation, installation, integration, analytics
and certification) that cause consumers to be confused that you are
associated with Moodle HQ if you are not.
This applies even if you do not charge for the services.
Note that usually only Moodle Partners have this permission.
* You cant use "Moodle" in the name of your software (including Mobile apps)
* You cant use "Moodle" in your company name
* You cant use "Moodle" in your domain name
* You cant use "Moodle" in advertising-related keywords (such as Adsense)
* You cant use "Moodle" to describe services around Moodle (such as hosting,
training, support, consulting, course creation services, theme development,
customisation, installation, integration and certification). This applies
even if you do not charge for the services. Note that usually only Moodle
Partners have this permission.
For information about the Moodle Partner Certification Mark as well as for how
to contact us, please see <https://moodle.com/trademarks/>.
+48
View File
@@ -0,0 +1,48 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Admin settings search form
*
* @package admin
* @copyright 2016 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
require_once $CFG->libdir.'/formslib.php';
/**
* Admin settings search form
*
* @package admin
* @copyright 2016 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class admin_settings_search_form extends moodleform {
function definition () {
$mform = $this->_form;
//$mform->addElement('header', 'settingsheader', get_string('search', 'admin'));
$elements = [];
$elements[] = $mform->createElement('text', 'query', get_string('query', 'admin'));
$elements[] = $mform->createElement('submit', 'search', get_string('search'));
$mform->addGroup($elements);
$mform->setType('query', PARAM_RAW);
$mform->setDefault('query', optional_param('query', '', PARAM_RAW));
}
}
-3
View File
@@ -1,3 +0,0 @@
define("core_admin/block_management_table",["exports","./plugin_management_table","core_table/dynamic","core/ajax","core/pending","core/notification"],(function(_exports,_plugin_management_table,_dynamic,_ajax,_pending,_notification){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_plugin_management_table=_interopRequireDefault(_plugin_management_table),_pending=_interopRequireDefault(_pending);class _default extends _plugin_management_table.default{constructor(){super(),this.addClickHandler(this.handleBlockProtectToggle)}setBlockProtectState(plugin,state){return(0,_ajax.call)([{methodname:"core_admin_set_block_protection",args:{plugin:plugin,state:state}}])[0]}async handleBlockProtectToggle(tableRoot,e){const stateToggle=e.target.closest('[data-action="toggleprotectstate"]');if(stateToggle){e.preventDefault();const pendingPromise=new _pending.default("core_table/dynamic:processAction");await this.setBlockProtectState(stateToggle.dataset.plugin,"1"===stateToggle.dataset.targetState?1:0);const[updatedRoot]=await Promise.all([(0,_dynamic.refreshTableContent)(tableRoot),(0,_notification.fetchNotifications)()]);updatedRoot.querySelector('[data-action="toggleprotectstate"][data-plugin="'.concat(stateToggle.dataset.plugin,'"]')).focus(),pendingPromise.resolve()}}}return _exports.default=_default,_exports.default}));
//# sourceMappingURL=block_management_table.min.js.map
@@ -1 +0,0 @@
{"version":3,"file":"block_management_table.min.js","sources":["../src/block_management_table.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\nimport PluginManagementTable from './plugin_management_table';\nimport {refreshTableContent} from 'core_table/dynamic';\nimport {call as fetchMany} from 'core/ajax';\nimport Pending from 'core/pending';\nimport {fetchNotifications} from 'core/notification';\n\nexport default class extends PluginManagementTable {\n constructor() {\n super();\n this.addClickHandler(this.handleBlockProtectToggle);\n }\n\n /**\n * Set the block protection state.\n *\n * @param {string} plugin\n * @param {number} state\n * @returns {Promise}\n */\n setBlockProtectState(plugin, state) {\n return fetchMany([{\n methodname: 'core_admin_set_block_protection',\n args: {\n plugin,\n state,\n },\n }])[0];\n }\n\n /**\n * Handle toggling of block protection.\n *\n * @param {HTMLElement} tableRoot\n * @param {Event} e\n */\n async handleBlockProtectToggle(tableRoot, e) {\n const stateToggle = e.target.closest('[data-action=\"toggleprotectstate\"]');\n if (stateToggle) {\n e.preventDefault();\n const pendingPromise = new Pending('core_table/dynamic:processAction');\n\n await this.setBlockProtectState(\n stateToggle.dataset.plugin,\n stateToggle.dataset.targetState === '1' ? 1 : 0\n );\n\n const [updatedRoot] = await Promise.all([\n refreshTableContent(tableRoot),\n fetchNotifications(),\n ]);\n\n // Refocus on the link that as pressed in the first place.\n updatedRoot.querySelector(`[data-action=\"toggleprotectstate\"][data-plugin=\"${stateToggle.dataset.plugin}\"]`).focus();\n pendingPromise.resolve();\n }\n }\n}\n"],"names":["PluginManagementTable","constructor","addClickHandler","this","handleBlockProtectToggle","setBlockProtectState","plugin","state","methodname","args","tableRoot","e","stateToggle","target","closest","preventDefault","pendingPromise","Pending","dataset","targetState","updatedRoot","Promise","all","querySelector","focus","resolve"],"mappings":"uhBAqB6BA,iCACzBC,2BAESC,gBAAgBC,KAAKC,0BAU9BC,qBAAqBC,OAAQC,cAClB,cAAU,CAAC,CACdC,WAAY,kCACZC,KAAM,CACFH,OAAAA,OACAC,MAAAA,UAEJ,kCASuBG,UAAWC,SAChCC,YAAcD,EAAEE,OAAOC,QAAQ,yCACjCF,YAAa,CACbD,EAAEI,uBACIC,eAAiB,IAAIC,iBAAQ,0CAE7Bd,KAAKE,qBACPO,YAAYM,QAAQZ,OACgB,MAApCM,YAAYM,QAAQC,YAAsB,EAAI,SAG3CC,mBAAqBC,QAAQC,IAAI,EACpC,gCAAoBZ,YACpB,wCAIJU,YAAYG,wEAAiEX,YAAYM,QAAQZ,cAAYkB,QAC7GR,eAAeS"}
-3
View File
@@ -1,3 +0,0 @@
define("core_admin/plugin_management_table",["exports","core_table/dynamic","core_table/local/dynamic/selectors","core/ajax","core/pending","core/notification"],(function(_exports,_dynamic,Selectors,_ajax,_pending,_notification){var obj;function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Selectors=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(Selectors),_pending=(obj=_pending)&&obj.__esModule?obj:{default:obj};let watching=!1;return _exports.default=class{constructor(){!function(obj,key,value){key in obj?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value}(this,"clickHandlers",[]),this.addClickHandler(this.handleStateToggle),this.addClickHandler(this.handleMoveUpDown),this.registerEventListeners()}static init(){watching||(watching=!0,new this)}addClickHandler(handler){this.clickHandlers.push(handler.bind(this))}registerEventListeners(){document.addEventListener("click",function(e){const tableRoot=this.getTableRoot(e);tableRoot&&this.clickHandlers.forEach((handler=>handler(tableRoot,e)))}.bind(this))}getTableRoot(e){const tableRoot=e.target.closest(Selectors.main.region);return tableRoot||!1}setPluginState(methodname,plugin,state){return(0,_ajax.call)([{methodname:methodname,args:{plugin:plugin,state:state}}])[0]}setPluginOrder(methodname,plugin,direction){return(0,_ajax.call)([{methodname:methodname,args:{plugin:plugin,direction:direction}}])[0]}async handleStateToggle(tableRoot,e){const stateToggle=e.target.closest('[data-action="togglestate"][data-toggle-method]');if(stateToggle){e.preventDefault();const pendingPromise=new _pending.default("core_table/dynamic:togglestate");await this.setPluginState(stateToggle.dataset.toggleMethod,stateToggle.dataset.plugin,"1"===stateToggle.dataset.state?0:1);const[updatedRoot]=await Promise.all([(0,_dynamic.refreshTableContent)(tableRoot),(0,_notification.fetchNotifications)()]);updatedRoot.querySelector('[data-action="togglestate"][data-plugin="'.concat(stateToggle.dataset.plugin,'"]')).focus(),pendingPromise.resolve()}}async handleMoveUpDown(tableRoot,e){const actionLink=e.target.closest('[data-action="move"][data-method][data-direction]');if(!actionLink)return;e.preventDefault();const pendingPromise=new _pending.default("core_table/dynamic:processAction");await this.setPluginOrder(actionLink.dataset.method,actionLink.dataset.plugin,"up"===actionLink.dataset.direction?-1:1);const[updatedRoot]=await Promise.all([(0,_dynamic.refreshTableContent)(tableRoot),(0,_notification.fetchNotifications)()]),exactMatch=updatedRoot.querySelector('[data-action="move"][data-plugin="'.concat(actionLink.dataset.plugin,'"][data-direction="').concat(actionLink.dataset.direction,'"]'));var _updatedRoot$querySel;exactMatch?exactMatch.focus():null===(_updatedRoot$querySel=updatedRoot.querySelector('[data-action="move"][data-plugin="'.concat(actionLink.dataset.plugin,'"]')))||void 0===_updatedRoot$querySel||_updatedRoot$querySel.focus();pendingPromise.resolve()}},_exports.default}));
//# sourceMappingURL=plugin_management_table.min.js.map
File diff suppressed because one or more lines are too long
-72
View File
@@ -1,72 +0,0 @@
// 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 PluginManagementTable from './plugin_management_table';
import {refreshTableContent} from 'core_table/dynamic';
import {call as fetchMany} from 'core/ajax';
import Pending from 'core/pending';
import {fetchNotifications} from 'core/notification';
export default class extends PluginManagementTable {
constructor() {
super();
this.addClickHandler(this.handleBlockProtectToggle);
}
/**
* Set the block protection state.
*
* @param {string} plugin
* @param {number} state
* @returns {Promise}
*/
setBlockProtectState(plugin, state) {
return fetchMany([{
methodname: 'core_admin_set_block_protection',
args: {
plugin,
state,
},
}])[0];
}
/**
* Handle toggling of block protection.
*
* @param {HTMLElement} tableRoot
* @param {Event} e
*/
async handleBlockProtectToggle(tableRoot, e) {
const stateToggle = e.target.closest('[data-action="toggleprotectstate"]');
if (stateToggle) {
e.preventDefault();
const pendingPromise = new Pending('core_table/dynamic:processAction');
await this.setBlockProtectState(
stateToggle.dataset.plugin,
stateToggle.dataset.targetState === '1' ? 1 : 0
);
const [updatedRoot] = await Promise.all([
refreshTableContent(tableRoot),
fetchNotifications(),
]);
// Refocus on the link that as pressed in the first place.
updatedRoot.querySelector(`[data-action="toggleprotectstate"][data-plugin="${stateToggle.dataset.plugin}"]`).focus();
pendingPromise.resolve();
}
}
}
-179
View File
@@ -1,179 +0,0 @@
// 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 {refreshTableContent} from 'core_table/dynamic';
import * as Selectors from 'core_table/local/dynamic/selectors';
import {call as fetchMany} from 'core/ajax';
import Pending from 'core/pending';
import {fetchNotifications} from 'core/notification';
let watching = false;
export default class {
/**
* @property {function[]} clickHandlers a list of handlers to call on click.
*/
clickHandlers = [];
constructor() {
this.addClickHandler(this.handleStateToggle);
this.addClickHandler(this.handleMoveUpDown);
this.registerEventListeners();
}
/**
* Initialise an instance of the class.
*
* This is just a way of making it easier to initialise an instance of the class from PHP.
*/
static init() {
if (watching) {
return;
}
watching = true;
new this();
}
/**
* Add a click handler to the list of handlers.
*
* @param {Function} handler A handler to call on a click event
*/
addClickHandler(handler) {
this.clickHandlers.push(handler.bind(this));
}
/**
* Register the event listeners for this instance.
*/
registerEventListeners() {
document.addEventListener('click', function(e) {
const tableRoot = this.getTableRoot(e);
if (!tableRoot) {
return;
}
this.clickHandlers.forEach((handler) => handler(tableRoot, e));
}.bind(this));
}
/**
* Get the table root from an event.
*
* @param {Event} e
* @returns {HTMLElement|bool}
*/
getTableRoot(e) {
const tableRoot = e.target.closest(Selectors.main.region);
if (!tableRoot) {
return false;
}
return tableRoot;
}
/**
* Set the plugin state (enabled or disabled)
*
* @param {string} methodname The web service to call
* @param {string} plugin The name of the plugin to set the state for
* @param {number} state The state to set
* @returns {Promise}
*/
setPluginState(methodname, plugin, state) {
return fetchMany([{
methodname,
args: {
plugin,
state,
},
}])[0];
}
setPluginOrder(methodname, plugin, direction) {
return fetchMany([{
methodname,
args: {
plugin,
direction,
},
}])[0];
}
/**
* Handle state toggling.
*
* @param {HTMLElement} tableRoot
* @param {Event} e
*/
async handleStateToggle(tableRoot, e) {
const stateToggle = e.target.closest('[data-action="togglestate"][data-toggle-method]');
if (stateToggle) {
e.preventDefault();
const pendingPromise = new Pending('core_table/dynamic:togglestate');
await this.setPluginState(
stateToggle.dataset.toggleMethod,
stateToggle.dataset.plugin,
stateToggle.dataset.state === '1' ? 0 : 1
);
const [updatedRoot] = await Promise.all([
refreshTableContent(tableRoot),
fetchNotifications(),
]);
// Refocus on the link that as pressed in the first place.
updatedRoot.querySelector(`[data-action="togglestate"][data-plugin="${stateToggle.dataset.plugin}"]`).focus();
pendingPromise.resolve();
}
}
async handleMoveUpDown(tableRoot, e) {
const actionLink = e.target.closest('[data-action="move"][data-method][data-direction]');
if (!actionLink) {
return;
}
e.preventDefault();
const pendingPromise = new Pending('core_table/dynamic:processAction');
await this.setPluginOrder(
actionLink.dataset.method,
actionLink.dataset.plugin,
actionLink.dataset.direction === 'up' ? -1 : 1,
);
const [updatedRoot] = await Promise.all([
refreshTableContent(tableRoot),
fetchNotifications(),
]);
// Refocus on the link that as pressed in the first place.
const exactMatch = updatedRoot.querySelector(
`[data-action="move"][data-plugin="${actionLink.dataset.plugin}"][data-direction="${actionLink.dataset.direction}"]`
);
if (exactMatch) {
exactMatch.focus();
} else {
// The move link is not present anymore, so we need to focus on the other one.
updatedRoot.querySelector(`[data-action="move"][data-plugin="${actionLink.dataset.plugin}"]`)?.focus();
}
pendingPromise.resolve();
}
}
+9 -16
View File
@@ -33,7 +33,8 @@ $confirm = optional_param('confirm', 0, PARAM_BOOL);
$PAGE->set_url('/admin/antiviruses.php', array('action' => $action, 'antivirus' => $antivirus));
$PAGE->set_context(context_system::instance());
require_admin();
require_login();
require_capability('moodle/site:config', context_system::instance());
$returnurl = "$CFG->wwwroot/$CFG->admin/settings.php?section=manageantiviruses";
@@ -54,19 +55,18 @@ if (!confirm_sesskey()) {
redirect($returnurl);
}
$needsupdate = false;
switch ($action) {
case 'disable':
// Remove from enabled list.
$class = \core_plugin_manager::resolve_plugininfo_class('antivirus');
$class::enable_plugin($antivirus, false);
$key = array_search($antivirus, $activeantiviruses);
unset($activeantiviruses[$key]);
break;
case 'enable':
// Add to enabled list.
if (!in_array($antivirus, $activeantiviruses)) {
$class = \core_plugin_manager::resolve_plugininfo_class('antivirus');
$class::enable_plugin($antivirus, true);
$activeantiviruses[] = $antivirus;
$activeantiviruses = array_unique($activeantiviruses);
}
break;
@@ -79,7 +79,6 @@ switch ($action) {
$fsave = $activeantiviruses[$key];
$activeantiviruses[$key] = $activeantiviruses[$key + 1];
$activeantiviruses[$key + 1] = $fsave;
$needsupdate = true;
}
}
break;
@@ -93,7 +92,6 @@ switch ($action) {
$fsave = $activeantiviruses[$key];
$activeantiviruses[$key] = $activeantiviruses[$key - 1];
$activeantiviruses[$key - 1] = $fsave;
$needsupdate = true;
}
}
break;
@@ -102,12 +100,7 @@ switch ($action) {
break;
}
if ($needsupdate) {
$new = implode(',', $activeantiviruses);
add_to_config_log('antiviruses', $CFG->antiviruses, $new, 'core');
set_config('antiviruses', $new);
core_plugin_manager::reset_caches();
}
set_config('antiviruses', implode(',', $activeantiviruses));
core_plugin_manager::reset_caches();
redirect ($returnurl);
redirect ($returnurl);
+29 -16
View File
@@ -11,7 +11,8 @@ require_once('../config.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->libdir.'/tablelib.php');
require_admin();
require_login();
require_capability('moodle/site:config', context_system::instance());
$returnurl = new moodle_url('/admin/settings.php', array('section'=>'manageauths'));
@@ -28,7 +29,7 @@ if (empty($CFG->auth)) {
}
if (!empty($auth) and !exists_auth_plugin($auth)) {
throw new \moodle_exception('pluginnotinstalled', 'auth', $returnurl, $auth);
print_error('pluginnotinstalled', 'auth', $returnurl, $auth);
}
////////////////////////////////////////////////////////////////////////////////
@@ -40,31 +41,43 @@ if (!confirm_sesskey()) {
switch ($action) {
case 'disable':
// Remove from enabled list.
$class = \core_plugin_manager::resolve_plugininfo_class('auth');
$class::enable_plugin($auth, false);
// remove from enabled list
$key = array_search($auth, $authsenabled);
if ($key !== false) {
unset($authsenabled[$key]);
set_config('auth', implode(',', $authsenabled));
}
if ($auth == $CFG->registerauth) {
set_config('registerauth', '');
}
\core\session\manager::gc(); // Remove stale sessions.
core_plugin_manager::reset_caches();
break;
case 'enable':
// Add to enabled list.
$class = \core_plugin_manager::resolve_plugininfo_class('auth');
$class::enable_plugin($auth, true);
// add to enabled list
if (!in_array($auth, $authsenabled)) {
$authsenabled[] = $auth;
$authsenabled = array_unique($authsenabled);
set_config('auth', implode(',', $authsenabled));
}
\core\session\manager::gc(); // Remove stale sessions.
core_plugin_manager::reset_caches();
break;
case 'down':
$key = array_search($auth, $authsenabled);
// check auth plugin is valid
if ($key === false) {
throw new \moodle_exception('pluginnotenabled', 'auth', $returnurl, $auth);
print_error('pluginnotenabled', 'auth', $returnurl, $auth);
}
// move down the list
if ($key < (count($authsenabled) - 1)) {
$fsave = $authsenabled[$key];
$authsenabled[$key] = $authsenabled[$key + 1];
$authsenabled[$key + 1] = $fsave;
$value = implode(',', $authsenabled);
add_to_config_log('auth', $CFG->auth, $value, 'core');
set_config('auth', $value);
set_config('auth', implode(',', $authsenabled));
}
break;
@@ -72,16 +85,14 @@ switch ($action) {
$key = array_search($auth, $authsenabled);
// check auth is valid
if ($key === false) {
throw new \moodle_exception('pluginnotenabled', 'auth', $returnurl, $auth);
print_error('pluginnotenabled', 'auth', $returnurl, $auth);
}
// move up the list
if ($key >= 1) {
$fsave = $authsenabled[$key];
$authsenabled[$key] = $authsenabled[$key - 1];
$authsenabled[$key - 1] = $fsave;
$value = implode(',', $authsenabled);
add_to_config_log('auth', $CFG->auth, $value, 'core');
set_config('auth', $value);
set_config('auth', implode(',', $authsenabled));
}
break;
@@ -90,3 +101,5 @@ switch ($action) {
}
redirect($returnurl);
+187
View File
@@ -0,0 +1,187 @@
<?php
/**
* Edit configuration for an individual auth plugin
*/
require_once '../config.php';
require_once $CFG->libdir.'/adminlib.php';
$auth = required_param('auth', PARAM_PLUGIN);
$PAGE->set_pagetype('admin-auth-' . $auth);
admin_externalpage_setup('authsetting'.$auth);
$authplugin = get_auth_plugin($auth);
$err = array();
$returnurl = "$CFG->wwwroot/$CFG->admin/settings.php?section=manageauths";
// save configuration changes
if ($frm = data_submitted() and confirm_sesskey()) {
$authplugin->validate_form($frm, $err);
if (count($err) == 0) {
// save plugin config
if ($authplugin->process_config($frm)) {
// save field lock configuration
foreach ($frm as $name => $value) {
if (preg_match('/^lockconfig_(.+?)$/', $name, $matches)) {
$plugin = "auth/$auth";
$name = $matches[1];
set_config($name, $value, $plugin);
}
}
redirect($returnurl);
exit;
}
} else {
foreach ($err as $key => $value) {
$focus = "form.$key";
}
}
} else {
$frmlegacystyle = get_config('auth/'.$auth);
$frmnewstyle = get_config('auth_'.$auth);
$frm = (object)array_merge((array)$frmlegacystyle, (array)$frmnewstyle);
}
$user_fields = $authplugin->userfields;
//$user_fields = array("firstname", "lastname", "email", "phone1", "phone2", "institution", "department", "address", "city", "country", "description", "idnumber", "lang");
/// Get the auth title (from core or own auth lang files)
$authtitle = $authplugin->get_title();
/// Get the auth descriptions (from core or own auth lang files)
$authdescription = $authplugin->get_description();
// output configuration form
echo $OUTPUT->header();
// choose an authentication method
echo "<form id=\"authmenu\" method=\"post\" action=\"auth_config.php\">\n";
echo "<div>\n";
echo "<input type=\"hidden\" name=\"sesskey\" value=\"".sesskey()."\" />\n";
echo "<input type=\"hidden\" name=\"auth\" value=\"".$auth."\" />\n";
// auth plugin description
echo $OUTPUT->box_start();
echo $OUTPUT->heading($authtitle);
echo $OUTPUT->box_start('informationbox');
echo $authdescription;
echo $OUTPUT->box_end();
echo "<hr />\n";
$authplugin->config_form($frm, $err, $user_fields);
echo $OUTPUT->box_end();
echo '<p style="text-align: center"><input type="submit" value="' . get_string("savechanges") . "\" /></p>\n";
echo "</div>\n";
echo "</form>\n";
$PAGE->requires->string_for_js('unmaskpassword', 'core_form');
$PAGE->requires->yui_module('moodle-auth-passwordunmask', 'M.auth.passwordunmask');
echo $OUTPUT->footer();
exit;
/// Functions /////////////////////////////////////////////////////////////////
// Good enough for most auth plugins
// but some may want a custom one if they are offering
// other options
// Note: lockconfig_ fields have special handling.
function print_auth_lock_options($auth, $user_fields, $helptext, $retrieveopts, $updateopts, $customfields = array()) {
global $DB, $OUTPUT;
echo '<tr><td colspan="3">';
if ($retrieveopts) {
echo $OUTPUT->heading(get_string('auth_data_mapping', 'auth'));
} else {
echo $OUTPUT->heading(get_string('auth_fieldlocks', 'auth'));
}
echo '</td></tr>';
$lockoptions = array ('unlocked' => get_string('unlocked', 'auth'),
'unlockedifempty' => get_string('unlockedifempty', 'auth'),
'locked' => get_string('locked', 'auth'));
$updatelocaloptions = array('oncreate' => get_string('update_oncreate', 'auth'),
'onlogin' => get_string('update_onlogin', 'auth'));
$updateextoptions = array('0' => get_string('update_never', 'auth'),
'1' => get_string('update_onupdate', 'auth'));
$pluginconfig = get_config("auth/$auth");
// Helptext is on a field with rowspan.
if (empty($helptext)) {
$helptext = '&nbsp;';
}
// If we have custom fields then merge them with user fields.
if (!empty($customfields)) {
$user_fields = array_merge($user_fields, $customfields);
}
if (!empty($customfields)) {
$customfieldname = $DB->get_records('user_info_field', null, '', 'shortname, name');
}
foreach ($user_fields as $field) {
// Define some vars we'll work with.
if (!isset($pluginconfig->{"field_map_$field"})) {
$pluginconfig->{"field_map_$field"} = '';
}
if (!isset($pluginconfig->{"field_updatelocal_$field"})) {
$pluginconfig->{"field_updatelocal_$field"} = '';
}
if (!isset($pluginconfig->{"field_updateremote_$field"})) {
$pluginconfig->{"field_updateremote_$field"} = '';
}
if (!isset($pluginconfig->{"field_lock_$field"})) {
$pluginconfig->{"field_lock_$field"} = '';
}
// Define the fieldname we display to the user.
$fieldname = $field;
if ($fieldname === 'lang') {
$fieldname = get_string('language');
} elseif (!empty($customfields) && in_array($field, $customfields)) {
// If custom field then pick name from database.
$fieldshortname = str_replace('profile_field_', '', $fieldname);
$fieldname = $customfieldname[$fieldshortname]->name;
} elseif ($fieldname == 'url') {
$fieldname = get_string('webpage');
} else {
$fieldname = get_string($fieldname);
}
if ($retrieveopts) {
$varname = 'field_map_' . $field;
echo '<tr valign="top"><td align="right">';
echo '<label for="lockconfig_'.$varname.'">'.$fieldname.'</label>';
echo '</td><td>';
echo "<input id=\"lockconfig_{$varname}\" name=\"lockconfig_{$varname}\" type=\"text\" size=\"30\" value=\"{$pluginconfig->$varname}\" />";
echo '<div style="text-align: right">';
echo '<label for="menulockconfig_field_updatelocal_'.$field.'">'.get_string('auth_updatelocal', 'auth') . '</label>&nbsp;';
echo html_writer::select($updatelocaloptions, "lockconfig_field_updatelocal_{$field}", $pluginconfig->{"field_updatelocal_$field"}, false);
echo '<br />';
if ($updateopts) {
echo '<label for="menulockconfig_field_updateremote_'.$field.'">'.get_string('auth_updateremote', 'auth') . '</label>&nbsp;';
echo html_writer::select($updateextoptions, "lockconfig_field_updateremote_{$field}", $pluginconfig->{"field_updateremote_$field"}, false);
echo '<br />';
}
echo '<label for="menulockconfig_field_lock_'.$field.'">'.get_string('auth_fieldlock', 'auth') . '</label>&nbsp;';
echo html_writer::select($lockoptions, "lockconfig_field_lock_{$field}", $pluginconfig->{"field_lock_$field"}, false);
echo '</div>';
} else {
echo '<tr valign="top"><td align="right">';
echo '<label for="menulockconfig_field_lock_'.$field.'">'.$fieldname.'</label>';
echo '</td><td>';
echo html_writer::select($lockoptions, "lockconfig_field_lock_{$field}", $pluginconfig->{"field_lock_$field"}, false);
}
echo '</td>';
if (!empty($helptext)) {
echo '<td rowspan="' . count($user_fields) . '">' . $helptext . '</td>';
$helptext = '';
}
echo '</tr>';
}
}
+223 -79
View File
@@ -1,94 +1,238 @@
<?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/>.
/**
* Allows the admin to configure blocks (hide/show, uninstall and configure)
*
* @package core_admin
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
// Allows the admin to configure blocks (hide/show, uninstall and configure)
require_once('../config.php');
require_once("{$CFG->libdir}/adminlib.php");
require_once("{$CFG->libdir}/blocklib.php");
require_once("{$CFG->libdir}/tablelib.php");
require_once('../config.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->libdir.'/blocklib.php');
require_once($CFG->libdir.'/tablelib.php');
admin_externalpage_setup('manageblocks');
admin_externalpage_setup('manageblocks');
$plugin = optional_param('plugin', '', PARAM_PLUGIN);
$action = optional_param('action', '', PARAM_ALPHA);
$unprotect = optional_param('unprotect', 0, PARAM_PLUGIN);
$protect = optional_param('protect', 0, PARAM_PLUGIN);
$confirm = optional_param('confirm', 0, PARAM_BOOL);
$hide = optional_param('hide', 0, PARAM_INT);
$show = optional_param('show', 0, PARAM_INT);
$unprotect = optional_param('unprotect', 0, PARAM_INT);
$protect = optional_param('protect', 0, PARAM_INT);
$strmanageblocks = get_string('manageblocks');
/// Print headings
// If data submitted, then process and store.
if (!empty($plugin) && !empty($action) && confirm_sesskey()) {
$manager = \core_plugin_manager::resolve_plugininfo_class('block');
$pluginname = get_string('pluginname', "block_{$plugin}");
$strmanageblocks = get_string('manageblocks');
$struninstall = get_string('uninstallplugin', 'core_admin');
$strversion = get_string('version');
$strhide = get_string('hide');
$strshow = get_string('show');
$strsettings = get_string('settings');
$strcourses = get_string('blockinstances', 'admin');
$strname = get_string('name');
$strshowblockcourse = get_string('showblockcourse');
$strprotecthdr = get_string('blockprotect', 'admin'). $OUTPUT->help_icon('blockprotect','admin');
$strprotect = get_string('blockprotect', 'admin');
$strunprotect = get_string('blockunprotect', 'admin');
if ($action === 'disable' && $manager::enable_plugin($plugin, 0)) {
\core\notification::add(
get_string('plugin_disabled', 'core_admin', $pluginname),
\core\notification::SUCCESS
);
// Settings not required - only pages.
admin_get_root(true, false);
} else if ($action === 'enable' && $manager::enable_plugin($plugin, 1)) {
\core\notification::add(
get_string('plugin_enabled', 'core_admin', $pluginname),
\core\notification::SUCCESS
);
/// If data submitted, then process and store.
// Settings not required - only pages.
admin_get_root(true, false);
if (!empty($hide) && confirm_sesskey()) {
if (!$block = $DB->get_record('block', array('id'=>$hide))) {
print_error('blockdoesnotexist', 'error');
}
$DB->set_field('block', 'visible', '0', array('id'=>$block->id)); // Hide block
add_to_config_log('block_visibility', $block->visible, '0', $block->name);
core_plugin_manager::reset_caches();
admin_get_root(true, false); // settings not required - only pages
}
// Redirect back to the page with out any params.
redirect(new moodle_url('/admin/blocks.php'));
}
if (!empty($show) && confirm_sesskey() ) {
if (!$block = $DB->get_record('block', array('id'=>$show))) {
print_error('blockdoesnotexist', 'error');
}
$DB->set_field('block', 'visible', '1', array('id'=>$block->id)); // Show block
add_to_config_log('block_visibility', $block->visible, '1', $block->name);
core_plugin_manager::reset_caches();
admin_get_root(true, false); // settings not required - only pages
}
if (!empty($protect) && confirm_sesskey()) {
block_manager::protect_block($protect);
$pluginname = get_string('pluginname', "block_{$protect}");
\core\notification::add(
get_string('blockprotected', 'core_admin', $pluginname),
\core\notification::SUCCESS
);
// Settings not required - only pages.
admin_get_root(true, false);
}
if (!empty($protect) && confirm_sesskey()) {
block_manager::protect_block((int)$protect);
admin_get_root(true, false); // settings not required - only pages
}
if (!empty($unprotect) && confirm_sesskey()) {
block_manager::unprotect_block($unprotect);
$pluginname = get_string('pluginname', "block_{$unprotect}");
\core\notification::add(
get_string('blockunprotected', 'core_admin', $pluginname),
\core\notification::SUCCESS
);
// Settings not required - only pages.
admin_get_root(true, false);
}
if (!empty($unprotect) && confirm_sesskey()) {
block_manager::unprotect_block((int)$unprotect);
admin_get_root(true, false); // settings not required - only pages
}
$undeletableblocktypes = block_manager::get_undeletable_block_types();
echo $OUTPUT->header();
echo $OUTPUT->heading($strmanageblocks);
/// Main display starts here
/// Get and sort the existing blocks
if (!$blocks = $DB->get_records('block', array(), 'name ASC')) {
print_error('noblocks', 'error'); // Should never happen
}
$incompatible = array();
/// Print the table of all blocks
$table = new flexible_table('admin-blocks-compatible');
$table->define_columns(array('name', 'instances', 'version', 'hideshow', 'undeletable', 'settings', 'uninstall'));
$table->define_headers(array($strname, $strcourses, $strversion, $strhide.'/'.$strshow, $strprotecthdr, $strsettings, $struninstall));
$table->define_baseurl($CFG->wwwroot.'/'.$CFG->admin.'/blocks.php');
$table->set_attribute('class', 'admintable blockstable generaltable');
$table->set_attribute('id', 'compatibleblockstable');
$table->setup();
$tablerows = array();
// Sort blocks using current locale.
$blocknames = array();
foreach ($blocks as $blockid=>$block) {
$blockname = $block->name;
if (file_exists("$CFG->dirroot/blocks/$blockname/block_$blockname.php")) {
$blocknames[$blockid] = get_string('pluginname', 'block_'.$blockname);
} else {
$blocknames[$blockid] = $blockname;
}
}
core_collator::asort($blocknames);
foreach ($blocknames as $blockid=>$strblockname) {
$block = $blocks[$blockid];
$blockname = $block->name;
$dbversion = get_config('block_'.$block->name, 'version');
if (!file_exists("$CFG->dirroot/blocks/$blockname/block_$blockname.php")) {
$blockobject = false;
$strblockname = '<span class="notifyproblem">'.$strblockname.' ('.get_string('missingfromdisk').')</span>';
$plugin = new stdClass();
$plugin->version = $dbversion;
} else {
$plugin = new stdClass();
$plugin->version = '???';
if (file_exists("$CFG->dirroot/blocks/$blockname/version.php")) {
include("$CFG->dirroot/blocks/$blockname/version.php");
}
if (!$blockobject = block_instance($block->name)) {
$incompatible[] = $block;
continue;
}
}
if ($uninstallurl = core_plugin_manager::instance()->get_uninstall_url('block_'.$blockname, 'manage')) {
$uninstall = html_writer::link($uninstallurl, $struninstall);
} else {
$uninstall = '';
}
$settings = ''; // By default, no configuration
if ($blockobject and $blockobject->has_config()) {
$blocksettings = admin_get_root()->locate('blocksetting' . $block->name);
if ($blocksettings instanceof admin_externalpage) {
$settings = '<a href="' . $blocksettings->url . '">' . get_string('settings') . '</a>';
} else if ($blocksettings instanceof admin_settingpage) {
$settings = '<a href="'.$CFG->wwwroot.'/'.$CFG->admin.'/settings.php?section=blocksetting'.$block->name.'">'.$strsettings.'</a>';
} else if (!file_exists($CFG->dirroot.'/blocks/'.$block->name.'/settings.php')) {
// If the block's settings node was not found, we check that the block really provides the settings.php file.
// Note that blocks can inject their settings to other nodes in the admin tree without using the default locations.
// This can be done by assigning null to $setting in settings.php and it is a valid case.
debugging('Warning: block_'.$block->name.' returns true in has_config() but does not provide a settings.php file',
DEBUG_DEVELOPER);
}
}
// MDL-11167, blocks can be placed on mymoodle, or the blogs page
// and it should not show up on course search page
$totalcount = $DB->count_records('block_instances', array('blockname'=>$blockname));
$count = $DB->count_records('block_instances', array('blockname'=>$blockname, 'pagetypepattern'=>'course-view-*'));
if ($count>0) {
$blocklist = "<a href=\"{$CFG->wwwroot}/course/search.php?blocklist=$blockid&amp;sesskey=".sesskey()."\" ";
$blocklist .= "title=\"$strshowblockcourse\" >$totalcount</a>";
}
else {
$blocklist = "$totalcount";
}
$class = ''; // Nothing fancy, by default
if (!$blockobject) {
// ignore
$visible = '';
} else if ($blocks[$blockid]->visible) {
$visible = '<a href="blocks.php?hide='.$blockid.'&amp;sesskey='.sesskey().'" title="'.$strhide.'">'.
'<img src="'.$OUTPUT->pix_url('t/hide') . '" class="iconsmall" alt="'.$strhide.'" /></a>';
} else {
$visible = '<a href="blocks.php?show='.$blockid.'&amp;sesskey='.sesskey().'" title="'.$strshow.'">'.
'<img src="'.$OUTPUT->pix_url('t/show') . '" class="iconsmall" alt="'.$strshow.'" /></a>';
$class = 'dimmed_text';
}
if ($dbversion == $plugin->version) {
$version = $dbversion;
} else {
$version = "$dbversion ($plugin->version)";
}
if (!$blockobject) {
// ignore
$undeletable = '';
} else if (in_array($blockname, $undeletableblocktypes)) {
$undeletable = '<a href="blocks.php?unprotect='.$blockid.'&amp;sesskey='.sesskey().'" title="'.$strunprotect.'">'.
'<img src="'.$OUTPUT->pix_url('t/unlock') . '" class="iconsmall" alt="'.$strunprotect.'" /></a>';
} else {
$undeletable = '<a href="blocks.php?protect='.$blockid.'&amp;sesskey='.sesskey().'" title="'.$strprotect.'">'.
'<img src="'.$OUTPUT->pix_url('t/lock') . '" class="iconsmall" alt="'.$strprotect.'" /></a>';
}
$row = array(
$strblockname,
$blocklist,
$version,
$visible,
$undeletable,
$settings,
$uninstall,
);
$table->add_data($row, $class);
}
$table->print_html();
if (!empty($incompatible)) {
echo $OUTPUT->heading(get_string('incompatibleblocks', 'blockstable', 'admin'));
$table = new flexible_table('admin-blocks-incompatible');
$table->define_columns(array('block', 'uninstall'));
$table->define_headers(array($strname, $struninstall));
$table->define_baseurl($CFG->wwwroot.'/'.$CFG->admin.'/blocks.php');
$table->set_attribute('class', 'incompatibleblockstable generaltable');
$table->setup();
foreach ($incompatible as $block) {
if ($uninstallurl = core_plugin_manager::instance()->get_uninstall_url('block_'.$block->name, 'manage')) {
$uninstall = html_writer::link($uninstallurl, $struninstall);
} else {
$uninstall = '';
}
$table->add_data(array(
$block->name,
$uninstall,
));
}
$table->print_html();
}
echo $OUTPUT->footer();
echo $OUTPUT->header();
echo $OUTPUT->heading($strmanageblocks);
echo $OUTPUT->notification(get_string('noteunneededblocks', 'admin'), 'info', false);
// Print the table of all blocks.
$table = new \core_admin\table\block_management_table();
$table->out();
echo $OUTPUT->footer();
+20 -26
View File
@@ -30,6 +30,7 @@ $category = required_param('category', PARAM_SAFEDIR);
$return = optional_param('return','', PARAM_ALPHA);
$adminediting = optional_param('adminedit', -1, PARAM_BOOL);
/// no guest autologin
require_login(0, false);
$PAGE->set_context(context_system::instance());
$PAGE->set_url('/admin/category.php', array('category' => $category));
@@ -41,34 +42,26 @@ $adminroot = admin_get_root(); // need all settings
$settingspage = $adminroot->locate($category, true);
if (empty($settingspage) or !($settingspage instanceof admin_category)) {
throw new \moodle_exception('categoryerror', 'error', "$CFG->wwwroot/$CFG->admin/");
print_error('categoryerror', 'admin', "$CFG->wwwroot/$CFG->admin/");
}
if (!($settingspage->check_access())) {
throw new \moodle_exception('accessdenied', 'admin');
print_error('accessdenied', 'admin');
}
$hassiteconfig = has_capability('moodle/site:config', $PAGE->context);
if ($hassiteconfig) {
$PAGE->add_header_action($OUTPUT->render_from_template('core_admin/header_search_input', [
'action' => new moodle_url('/admin/search.php'),
]));
}
$statusmsg = '';
$errormsg = '';
if ($data = data_submitted() and confirm_sesskey()) {
$count = admin_write_settings($data);
if (admin_write_settings($data)) {
$statusmsg = get_string('changessaved');
}
if (empty($adminroot->errors)) {
// No errors. Did we change any setting? If so, then indicate success.
if ($count) {
$statusmsg = get_string('changessaved');
} else {
switch ($return) {
case 'site': redirect("$CFG->wwwroot/");
case 'admin': redirect("$CFG->wwwroot/$CFG->admin/");
}
switch ($return) {
case 'site': redirect("$CFG->wwwroot/");
case 'admin': redirect("$CFG->wwwroot/$CFG->admin/");
}
} else {
$errormsg = get_string('errorwithsettings', 'admin');
@@ -80,8 +73,8 @@ if ($data = data_submitted() and confirm_sesskey()) {
if ($PAGE->user_allowed_editing() && $adminediting != -1) {
$USER->editing = $adminediting;
}
$buttons = null;
if ($PAGE->user_allowed_editing() && !$PAGE->theme->haseditswitch) {
if ($PAGE->user_allowed_editing()) {
$url = clone($PAGE->url);
if ($PAGE->user_is_editing()) {
$caption = get_string('blockseditoff');
@@ -134,9 +127,7 @@ if ($savebutton) {
$visiblepathtosection = array_reverse($settingspage->visiblepath);
$PAGE->set_title("$SITE->shortname: " . implode(": ",$visiblepathtosection));
$PAGE->set_heading($SITE->fullname);
if ($buttons) {
$PAGE->set_button($buttons);
}
$PAGE->set_button($buttons);
echo $OUTPUT->header();
@@ -146,7 +137,13 @@ if ($errormsg !== '') {
echo $OUTPUT->notification($statusmsg, 'notifysuccess');
}
echo $OUTPUT->heading(get_string('admincategory', 'admin', $settingspage->visiblename), 2);
$path = array_reverse($settingspage->visiblepath);
if (is_array($path)) {
$visiblename = join(' / ', $path);
} else {
$visiblename = $path;
}
echo $OUTPUT->heading(get_string('admincategory', 'admin', $visiblename), 2);
echo html_writer::start_tag('form', array('action' => '', 'method' => 'post', 'id' => 'adminsettings'));
echo html_writer::start_tag('div');
@@ -158,7 +155,4 @@ echo $outputhtml;
echo html_writer::end_tag('fieldset');
echo html_writer::end_tag('form');
// Add the form change checker.
$PAGE->requires->js_call_amd('core_form/changechecker', 'watchFormById', ['adminsettings']);
echo $OUTPUT->footer();
@@ -1,127 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_admin\admin;
use admin_setting;
use core_plugin_manager;
use core_text;
/**
* Admin setting plugin manager.
*
* @package core_admin
* @subpackage admin
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class admin_setting_plugin_manager extends admin_setting {
/** @var core_plugin_manager The plugin manager instance */
protected core_plugin_manager $pluginmanager;
/** @var string The plugintype that this manager covers */
protected string $plugintype;
/** @var string The class of the management table to use */
protected string $tableclass;
public function __construct(
string $plugintype,
string $tableclass,
string $name,
string $visiblename,
string $description = '',
string $defaultsetting = '',
) {
$this->nosave = true;
$this->pluginmanager = core_plugin_manager::instance();
$this->plugintype = $plugintype;
$this->tableclass = $tableclass;
parent::__construct($name, $visiblename, $description, $defaultsetting);
}
/**
* Always returns true, does nothing
*
* @return true
*/
public function get_setting(): bool {
return true;
}
/**
* Always returns true, does nothing
*
* @return true
*/
public function get_defaultsetting(): bool {
return true;
}
/**
* Always returns '', does not write anything
*
* @return string Always returns ''
*/
// phpcs:disable VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
public function write_setting($data): string {
// Do not write any setting.
return '';
}
/**
* Checks if $query is one of the available editors
*
* @param string $query The string to search for
* @return bool Returns true if found, false if not
*/
public function is_related($query) {
if (parent::is_related($query)) {
return true;
}
$plugins = $this->pluginmanager->get_installed_plugins($this->plugintype);
foreach (array_keys($plugins) as $plugin) {
$plugin = "{$this->plugintype}_{$plugin}";
if (str_contains($plugin, $query)) {
return true;
}
$pluginname = get_string('pluginname', $plugin);
if (strpos(core_text::strtolower($pluginname), $query) !== false) {
return true;
}
}
return false;
}
/**
* Builds the XHTML to display the control
*
* @param string $data Unused
* @param string $query
* @return string
*/
public function output_html($data, $query = ''): string {
$table = new $this->tableclass();
if (!($table instanceof \core_admin\table\plugin_management_table)) {
throw new \coding_exception("{$this->tableclass} must be an instance of \\core_admin\\table\\plugin_management_table");
}
return highlight($query, $table->get_content());
}
}
-97
View File
@@ -1,97 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_admin\external;
use block_manager;
use core_external\external_api;
use core_external\external_function_parameters;
use core_external\external_single_structure;
use core_external\external_value;
/**
* Web Service to control the state of a plugin.
*
* @package core_admin
* @category external
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class set_block_protection extends external_api {
/**
* Returns description of method parameters
*
* @return external_function_parameters
*/
public static function execute_parameters(): external_function_parameters {
return new external_function_parameters([
'plugin' => new external_value(PARAM_PLUGIN, 'The name of the plugin', VALUE_REQUIRED),
'state' => new external_value(PARAM_INT, 'The target state', VALUE_REQUIRED),
]);
}
/**
* Set the block protection state.
*
* @param string $plugin The name of the plugin
* @param int $state The target state
* @return null
*/
public static function execute(
string $plugin,
int $state,
): array {
[
'plugin' => $plugin,
'state' => $state,
] = self::validate_parameters(self::execute_parameters(), [
'plugin' => $plugin,
'state' => $state,
]);
$context = \context_system::instance();
self::validate_context($context);
require_capability('moodle/site:config', $context);
[, $pluginname] = explode('_', \core_component::normalize_componentname($plugin), 2);
$displayname = get_string('pluginname', $plugin);
if ($state) {
block_manager::protect_block($pluginname);
\core\notification::add(
get_string('blockprotected', 'core_admin', $displayname),
\core\notification::SUCCESS
);
} else {
block_manager::unprotect_block($pluginname);
\core\notification::add(
get_string('blockunprotected', 'core_admin', $displayname),
\core\notification::SUCCESS
);
}
return [];
}
/**
* Describe the return structure of the external service.
*
* @return external_single_structure
*/
public static function execute_returns(): external_single_structure {
return new external_single_structure([]);
}
}
-84
View File
@@ -1,84 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_admin\external;
use core_external\external_api;
use core_external\external_function_parameters;
use core_external\external_single_structure;
use core_external\external_value;
/**
* Web Service to control the order of a plugin.
*
* @package core_admin
* @category external
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class set_plugin_order extends external_api {
/**
* Returns description of method parameters
*
* @return external_function_parameters
*/
public static function execute_parameters(): external_function_parameters {
return new external_function_parameters([
'plugin' => new external_value(PARAM_PLUGIN, 'The name of the plugin', VALUE_REQUIRED),
'direction' => new external_value(PARAM_INT, 'The direction to move', VALUE_REQUIRED),
]);
}
/**
* Set the plugin state.
*
* @param string $plugin The name of the plugin
* @param int $direction The direction to move the plugin
* @return array
*/
public static function execute(
string $plugin,
int $direction,
): array {
[
'plugin' => $plugin,
'direction' => $direction,
] = self::validate_parameters(self::execute_parameters(), [
'plugin' => $plugin,
'direction' => $direction,
]);
$context = \context_system::instance();
self::validate_context($context);
require_capability('moodle/site:config', $context);
[$plugintype, $pluginname] = explode('_', \core_component::normalize_componentname($plugin), 2);
$manager = \core_plugin_manager::resolve_plugininfo_class($plugintype);
$manager::change_plugin_order($pluginname, $direction);
return [];
}
/**
* Describe the return structure of the external service.
*
* @return external_single_structure
*/
public static function execute_returns(): external_single_structure {
return new external_single_structure([]);
}
}
-98
View File
@@ -1,98 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_admin\external;
use core_external\external_api;
use core_external\external_function_parameters;
use core_external\external_single_structure;
use core_external\external_value;
/**
* Web Service to control the state of a plugin.
*
* @package core_admin
* @category external
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class set_plugin_state extends external_api {
/**
* Returns description of method parameters
*
* @return external_function_parameters
*/
public static function execute_parameters(): external_function_parameters {
return new external_function_parameters([
'plugin' => new external_value(PARAM_PLUGIN, 'The name of the plugin', VALUE_REQUIRED),
'state' => new external_value(PARAM_INT, 'The target state', VALUE_REQUIRED),
]);
}
/**
* Set the plugin state.
*
* @param string $plugin The name of the plugin
* @param int $state The target state
* @return null
*/
public static function execute(
string $plugin,
int $state,
): array {
[
'plugin' => $plugin,
'state' => $state,
] = self::validate_parameters(self::execute_parameters(), [
'plugin' => $plugin,
'state' => $state,
]);
$context = \context_system::instance();
self::validate_context($context);
require_capability('moodle/site:config', $context);
[$plugintype, $pluginname] = explode('_', \core_component::normalize_componentname($plugin), 2);
$manager = \core_plugin_manager::resolve_plugininfo_class($plugintype);
$displayname = get_string('pluginname', $plugin);
if ($manager::enable_plugin($pluginname, $state)) {
if (!empty($state)) {
\core\notification::add(
get_string('plugin_enabled', 'core_admin', $displayname),
\core\notification::SUCCESS
);
} else {
\core\notification::add(
get_string('plugin_disabled', 'core_admin', $displayname),
\core\notification::SUCCESS
);
}
}
return [];
}
/**
* Describe the return structure of the external service.
*
* @return external_single_structure
*/
public static function execute_returns(): external_single_structure {
return new external_single_structure([]);
}
}
-76
View File
@@ -1,76 +0,0 @@
<?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/>.
/**
* Form for selective purging of caches.
*
* @package core
* @copyright 2018 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_admin\form;
defined('MOODLE_INTERNAL') || die();
require_once($CFG->libdir.'/formslib.php');
/**
* Form for selecting which caches to purge on admin/purgecaches.php
*
* @package core
* @copyright 2018 The Open University
* @author Mark Johnson <mark.johnson@open.ac.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class purge_caches extends \moodleform {
/**
* Define a "Purge all caches" button, and a fieldset with checkboxes for selectively purging separate caches.
*/
public function definition() {
$mform = $this->_form;
$mform->addElement('hidden', 'returnurl', $this->_customdata['returnurl']);
$mform->setType('returnurl', PARAM_LOCALURL);
$mform->addElement('submit', 'all', get_string('purgecaches', 'admin'));
$mform->addElement('header', 'purgecacheheader', get_string('purgeselectedcaches', 'admin'));
$checkboxes = [
$mform->createElement('advcheckbox', 'theme', '', get_string('purgethemecache', 'admin')),
$mform->createElement('advcheckbox', 'lang', '', get_string('purgelangcache', 'admin')),
$mform->createElement('advcheckbox', 'js', '', get_string('purgejscache', 'admin')),
$mform->createElement('advcheckbox', 'template', '', get_string('purgetemplates', 'admin')),
$mform->createElement('advcheckbox', 'filter', '', get_string('purgefiltercache', 'admin')),
$mform->createElement('advcheckbox', 'muc', '', get_string('purgemuc', 'admin')),
$mform->createElement('advcheckbox', 'other', '', get_string('purgeothercaches', 'admin'))
];
$mform->addGroup($checkboxes, 'purgeselectedoptions');
$mform->addElement('submit', 'purgeselectedcaches', get_string('purgeselectedcaches', 'admin'));
}
/**
* If the "Purge selected caches" button was pressed, ensure at least one cache was selected.
*
* @param array $data
* @param array $files
* @return array Error messages
*/
public function validation($data, $files) {
$errors = [];
if (isset($data['purgeselectedcaches']) && empty(array_filter($data['purgeselectedoptions']))) {
$errors['purgeselectedoptions'] = get_string('purgecachesnoneselected', 'admin');
}
return $errors;
}
}
@@ -1,92 +0,0 @@
<?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/>.
/**
* Testing outgoing mail configuration form
*
* @package core
* @copyright 2019 Victor Deniz <victor@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_admin\form;
defined('MOODLE_INTERNAL') || die();
require_once($CFG->libdir.'/formslib.php');
/**
* Test mail form
*
* @package core
* @copyright 2019 Victor Deniz <victor@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class testoutgoingmailconf_form extends \moodleform {
/**
* Add elements to form
*/
public function definition() {
$mform = $this->_form;
// Recipient.
$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');
// From user.
$options = ['maxlength' => '100', 'size' => '25'];
$mform->addElement('text', 'from', get_string('testoutgoingmailconf_fromemail', 'admin'), $options);
$mform->setType('from', PARAM_TEXT);
$mform->addHelpButton('from', 'testoutgoingmailconf_fromemail', 'admin');
// Additional subject text.
$options = ['size' => '25'];
$mform->addElement('text', 'additionalsubject', get_string('testoutgoingmailconf_subjectadditional', 'admin'), $options);
$mform->setType('additionalsubject', PARAM_TEXT);
$buttonarray = array();
$buttonarray[] = $mform->createElement('submit', 'send', get_string('testoutgoingmailconf_sendtest', 'admin'));
$buttonarray[] = $mform->createElement('cancel');
$mform->addGroup($buttonarray, 'buttonar', '', array(' '), false);
$mform->closeHeaderBefore('buttonar');
}
/**
* Validate Form field, should be a valid email format or a username that matches with a Moodle user.
*
* @param array $data
* @param array $files
* @return array
* @throws \dml_exception|\coding_exception
*/
public function validation($data, $files): array {
$errors = parent::validation($data, $files);
if (isset($data['from']) && $data['from']) {
$userfrom = \core_user::get_user_by_username($data['from']);
if (!$userfrom && !validate_email($data['from'])) {
$errors['from'] = get_string('testoutgoingmailconf_fromemail_invalid', 'admin');
}
}
return $errors;
}
}
@@ -1,71 +0,0 @@
<?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);
}
}
@@ -1,206 +0,0 @@
<?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);
}
}
-197
View File
@@ -1,197 +0,0 @@
<?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/>.
/**
* File size admin setting.
*
* @package core_admin
* @copyright 2019 Shamim Rezaie <shamim@moodle.com>
* @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');
/**
* An admin setting to support entering and displaying of file sizes in Bytes, KB, MB or GB.
*
* @copyright 2019 Shamim Rezaie <shamim@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class filesize extends \admin_setting {
/** @var int The byte unit. Number of bytes in a byte */
const UNIT_B = 1;
/** @var int The kilobyte unit (number of bytes in a kilobyte) */
const UNIT_KB = 1024;
/** @var int The megabyte unit (number of bytes in a megabyte) */
const UNIT_MB = 1048576;
/** @var int The gigabyte unit (number of bytes in a gigabyte) */
const UNIT_GB = 1073741824;
/** @var int default size unit */
protected $defaultunit;
/**
* 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 name
* @param string $description localised long description
* @param int|null $defaultvalue Value of the settings in bytes
* @param int|null $defaultunit GB, MB, etc. (in bytes)
*/
public function __construct(string $name, string $visiblename, string $description,
int $defaultvalue = null, int $defaultunit = null) {
$defaultsetting = self::parse_bytes($defaultvalue);
if ($defaultunit && array_key_exists($defaultunit, self::get_units())) {
$this->defaultunit = $defaultunit;
} else {
$this->defaultunit = self::UNIT_MB;
}
parent::__construct($name, $visiblename, $description, $defaultsetting);
}
/**
* Returns selectable units.
*
* @return array
*/
protected static function get_units(): array {
return [
self::UNIT_GB => get_string('sizegb'),
self::UNIT_MB => get_string('sizemb'),
self::UNIT_KB => get_string('sizekb'),
self::UNIT_B => get_string('sizeb'),
];
}
/**
* Converts bytes to some more user friendly string.
*
* @param int $bytes The number of bytes we want to convert from
* @return string
*/
protected static function get_size_text(int $bytes): string {
if (empty($bytes)) {
return get_string('none');
}
return display_size($bytes, 0);
}
/**
* Finds suitable units for given file size.
*
* @param int $bytes The number of bytes
* @return array Parsed file size in the format of ['v' => value, 'u' => unit]
*/
protected static function parse_bytes(int $bytes): array {
foreach (self::get_units() as $unit => $unused) {
if ($bytes % $unit === 0) {
return ['v' => (int)($bytes / $unit), 'u' => $unit];
}
}
return ['v' => (int)$bytes, 'u' => self::UNIT_B];
}
/**
* Get the selected file size as array.
*
* @return array|null An array containing 'v' => xx, 'u' => xx, or null if not set
*/
public function get_setting(): ?array {
$bytes = $this->config_read($this->name);
if (is_null($bytes)) {
return null;
}
$bytes = intval($bytes);
return self::parse_bytes($bytes);
}
/**
* Store the file size as bytes.
*
* @param array $data Must be form 'h' => xx, 'm' => xx
* @return string The error string if any
*/
public function write_setting($data): string {
if (!is_array($data)) {
return '';
}
if (!is_numeric($data['v']) || $data['v'] < 0) {
return get_string('errorsetting', 'admin');
}
// Calculate size in bytes, ensuring we don't overflow PHP_INT_MAX.
$bytes = $data['v'] * $data['u'];
$result = (is_int($bytes) && $this->config_write($this->name, $bytes));
return ($result ? '' : get_string('errorsetting', 'admin'));
}
/**
* Returns file size text+select fields.
*
* @param array $data The current setting value. Must be form 'v' => xx, 'u' => xx.
* @param string $query Admin search query to be highlighted.
* @return string File size text+select fields and wrapping div(s).
*/
public function output_html($data, $query = ''): string {
global $OUTPUT;
$default = $this->get_defaultsetting();
if (is_number($default)) {
$defaultinfo = self::get_size_text($default);
} else if (is_array($default)) {
$defaultinfo = self::get_size_text($default['v'] * $default['u']);
} else {
$defaultinfo = null;
}
$inputid = $this->get_id() . 'v';
$units = self::get_units();
$defaultunit = $this->defaultunit;
$context = (object) [
'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,
'name' => $title,
'selected' => ($data['v'] == 0 && $unit == $defaultunit) || $unit == $data['u']
];
}, array_keys($units), $units)
];
$element = $OUTPUT->render_from_template('core_admin/setting_configfilesize', $context);
return format_admin_setting($this, $this->visiblename, $element, $this->description, $inputid, '', $defaultinfo, $query);
}
}
@@ -1,37 +0,0 @@
<?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/>.
/**
* A settings page which can be viewed with a link directly.
*
* @package core_admin
* @copyright 2021 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_admin\local\settings;
use moodle_url;
interface linkable_settings_page {
/**
* Get the URL to view this settings page.
*
* @return moodle_url
*/
public function get_settings_page_url(): moodle_url;
}
@@ -1,74 +0,0 @@
<?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);
}
}
@@ -1,121 +0,0 @@
<?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/>.
/**
* Admin setting to show current scheduled task's status.
*
* @package core
* @copyright 2021 Universitat Rovira i Virgili
* @author Jordi Pujol-Ahulló <jpahullo@gmail.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_admin\local\settings;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->libdir . '/adminlib.php');
require_once($CFG->libdir . '/moodlelib.php');
use admin_setting_description;
use core\task\manager;
use core\task\scheduled_task;
use html_writer;
use lang_string;
use moodle_url;
use stdClass;
/**
* This admin setting tells whether a given scheduled task is enabled, providing a link to its configuration page.
*
* The goal of this setting is to help contextualizing the configuration settings with related scheduled task status,
* providing the big picture of that part of the system.
*
* @package core
* @copyright 2021 Universitat Rovira i Virgili
* @author Jordi Pujol-Ahulló <jpahullo@gmail.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class setting_scheduled_task_status extends admin_setting_description {
/**
* @var string fully qualified class name of a scheduled task.
*/
private $classname;
/**
* @var string additional text to append to the description.
*/
private $extradescription;
/**
* setting_scheduled_task_status constructor.
* @param string $name unique setting name.
* @param string $scheduledtaskclassname full classpath class name of the scheduled task.
* @param string $extradescription extra detail to append to the scheduled task status to add context in the setting
* page.
*/
public function __construct(string $name, string $scheduledtaskclassname, string $extradescription = '') {
$visiblename = new lang_string('task_status', 'admin');
$this->classname = $scheduledtaskclassname;
$this->extradescription = $extradescription;
parent::__construct($name, $visiblename, '');
}
/**
* Calculates lazily the content of the description.
* @param mixed $data nothing expected in this case.
* @param string $query nothing expected in this case.
* @return string the HTML content to print for this setting.
*/
public function output_html($data, $query = ''): string {
if (empty($this->description)) {
$this->description = $this->get_task_description();
}
return parent::output_html($data, $query);
}
/**
* Returns the HTML to print as the description.
* @return string description to be printed.
*/
private function get_task_description(): string {
$task = manager::get_scheduled_task($this->classname);
if ($task->is_enabled()) {
$taskenabled = get_string('enabled', 'admin');
} else {
$taskenabled = get_string('disabled', 'admin');
}
$taskenabled = strtolower($taskenabled);
$gotourl = new moodle_url(
'/admin/tool/task/scheduledtasks.php',
[],
scheduled_task::get_html_id($this->classname)
);
if (!empty($this->extradescription)) {
$this->extradescription = '<br />' . $this->extradescription;
}
$taskdetail = new stdClass();
$taskdetail->class = $this->classname;
$taskdetail->name = $task->get_name();
$taskdetail->status = $taskenabled;
$taskdetail->gotourl = $gotourl->out(false);
$taskdetail->extradescription = $this->extradescription;
return html_writer::tag('p', get_string('task_status_desc', 'admin', $taskdetail));
}
}
-41
View File
@@ -1,41 +0,0 @@
<?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/>.
/**
* Privacy Subsystem implementation for core_admin.
*
* @package core_admin
* @copyright 2018 Carlos Escobedo <carlos@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_admin\privacy;
defined('MOODLE_INTERNAL') || die();
/**
* Privacy Subsystem for core_admin implementing null_provider.
*
* @copyright 2018 Carlos Escobedo <carlos@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class provider implements \core_privacy\local\metadata\null_provider {
/**
* Get the language string identifier with the component's language
* file to explain why this plugin stores no data.
*
* @return string
*/
public static function get_reason() : string {
return 'privacy:metadata';
}
}
@@ -1,117 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
declare(strict_types=1);
namespace core_admin\reportbuilder\datasource;
use core_admin\reportbuilder\local\entities\task_log;
use core_reportbuilder\datasource;
use core_reportbuilder\local\entities\user;
use core_reportbuilder\local\filters\select;
/**
* Task logs datasource
*
* @package core_admin
* @copyright 2022 Paul Holden <paulh@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class task_logs extends datasource {
/**
* Return user friendly name of the report source
*
* @return string
*/
public static function get_name(): string {
return get_string('tasklogs', 'core_admin');
}
/**
* Initialise report
*/
protected function initialise(): void {
$tasklogentity = new task_log();
$tasklogalias = $tasklogentity->get_table_alias('task_log');
$this->set_main_table('task_log', $tasklogalias);
$this->add_entity($tasklogentity);
// Join the user entity to represent the associated user.
$userentity = new user();
$useralias = $userentity->get_table_alias('user');
$this->add_entity($userentity->add_join("
LEFT JOIN {user} {$useralias}
ON {$useralias}.id = {$tasklogalias}.userid")
);
// Add report elements from each of the entities we added to the report.
$this->add_all_from_entities();
}
/**
* Return the columns that will be added to the report upon creation
*
* @return string[]
*/
public function get_default_columns(): array {
return [
'task_log:name',
'task_log:starttime',
'task_log:duration',
'task_log:result',
];
}
/**
* Return the filters that will be added to the report upon creation
*
* @return string[]
*/
public function get_default_filters(): array {
return [
'task_log:timestart',
'task_log:result',
];
}
/**
* Return the conditions that will be added to the report upon creation
*
* @return string[]
*/
public function get_default_conditions(): array {
return [
'task_log:type',
'task_log:timestart',
'task_log:result',
];
}
/**
* Return the condition values that will be set for the report upon creation
*
* @return array
*/
public function get_default_condition_values(): array {
return [
'task_log:type_operator' => select::EQUAL_TO,
'task_log:type_value' => \core\task\database_logger::TYPE_SCHEDULED,
];
}
}
@@ -1,427 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_admin\reportbuilder\local\entities;
use core_reportbuilder\local\filters\date;
use core_reportbuilder\local\filters\duration;
use core_reportbuilder\local\filters\number;
use core_reportbuilder\local\filters\select;
use core_reportbuilder\local\filters\text;
use core_reportbuilder\local\filters\autocomplete;
use core_reportbuilder\local\helpers\format;
use lang_string;
use core_reportbuilder\local\entities\base;
use core_reportbuilder\local\report\column;
use core_reportbuilder\local\report\filter;
use stdClass;
use core_collator;
/**
* Task log entity class implementation
*
* @package core_admin
* @copyright 2021 David Matamoros <davidmc@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class task_log extends base {
/** @var int Result success */
protected const SUCCESS = 0;
/** @var int Result failed */
protected const FAILED = 1;
/**
* Database tables that this entity uses and their default aliases
*
* @return array
*/
protected function get_default_table_aliases(): array {
return ['task_log' => 'tl'];
}
/**
* The default title for this entity in the list of columns/conditions/filters in the report builder
*
* @return lang_string
*/
protected function get_default_entity_title(): lang_string {
return new lang_string('entitytasklog', 'admin');
}
/**
* Initialise the entity
*
* @return base
*/
public function initialise(): base {
$columns = $this->get_all_columns();
foreach ($columns as $column) {
$this->add_column($column);
}
// All the filters defined by the entity can also be used as conditions.
$filters = $this->get_all_filters();
foreach ($filters as $filter) {
$this
->add_filter($filter)
->add_condition($filter);
}
return $this;
}
/**
* Returns list of all available columns
*
* @return column[]
*/
protected function get_all_columns(): array {
global $DB;
$tablealias = $this->get_table_alias('task_log');
// Name column.
$columns[] = (new column(
'name',
new lang_string('name'),
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_TEXT)
->add_field("$tablealias.classname")
->set_is_sortable(true)
->add_callback(static function(string $classname): string {
$output = '';
if (class_exists($classname)) {
$task = new $classname;
if ($task instanceof \core\task\task_base) {
$output = $task->get_name();
}
}
$output .= \html_writer::tag('div', "\\{$classname}", [
'class' => 'small text-muted',
]);
return $output;
});
// Component column.
$columns[] = (new column(
'component',
new lang_string('plugin'),
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_TEXT)
->add_field("{$tablealias}.component")
->set_is_sortable(true);
// Type column.
$columns[] = (new column(
'type',
new lang_string('tasktype', 'admin'),
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_TEXT)
->add_field("{$tablealias}.type")
->set_is_sortable(true)
->add_callback(static function($value): string {
if (\core\task\database_logger::TYPE_SCHEDULED === (int) $value) {
return get_string('task_type:scheduled', 'admin');
}
return get_string('task_type:adhoc', 'admin');
});
// Start time column.
$columns[] = (new column(
'starttime',
new lang_string('task_starttime', 'admin'),
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_TIMESTAMP)
->add_field("{$tablealias}.timestart")
->set_is_sortable(true)
->add_callback([format::class, 'userdate'], get_string('strftimedatetimeshortaccurate', 'core_langconfig'));
// End time column.
$columns[] = (new column(
'endtime',
new lang_string('task_endtime', 'admin'),
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_TIMESTAMP)
->add_field("{$tablealias}.timeend")
->set_is_sortable(true)
->add_callback([format::class, 'userdate'], get_string('strftimedatetimeshortaccurate', 'core_langconfig'));
// Duration column.
$columns[] = (new column(
'duration',
new lang_string('task_duration', 'admin'),
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_FLOAT)
->add_field("{$tablealias}.timeend - {$tablealias}.timestart", 'duration')
->set_is_sortable(true)
->add_callback(static function(float $value): string {
$duration = round($value, 2);
if (empty($duration)) {
// The format_time function returns 'now' when the difference is exactly 0.
// Note: format_time performs concatenation in exactly this fashion so we should do this for consistency.
return '0 ' . get_string('secs', 'moodle');
}
return format_time($duration);
});
// Hostname column.
$columns[] = (new column(
'hostname',
new lang_string('hostname', 'admin'),
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_TEXT)
->add_field("$tablealias.hostname")
->set_is_sortable(true);
// PID column.
$columns[] = (new column(
'pid',
new lang_string('pid', 'admin'),
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_INTEGER)
->add_field("{$tablealias}.pid")
->set_is_sortable(true)
// Although this is an integer column, it doesn't make sense to perform numeric aggregation on it.
->set_disabled_aggregation(['avg', 'count', 'countdistinct', 'max', 'min', 'sum']);
// Database column.
$columns[] = (new column(
'database',
new lang_string('task_dbstats', 'admin'),
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_INTEGER)
->add_fields("{$tablealias}.dbreads, {$tablealias}.dbwrites")
->set_is_sortable(true, ["{$tablealias}.dbreads", "{$tablealias}.dbwrites"])
->add_callback(static function(int $value, stdClass $row): string {
$output = '';
$output .= \html_writer::div(get_string('task_stats:dbreads', 'admin', $row->dbreads));
$output .= \html_writer::div(get_string('task_stats:dbwrites', 'admin', $row->dbwrites));
return $output;
})
// Although this is an integer column, it doesn't make sense to perform numeric aggregation on it.
->set_disabled_aggregation(['avg', 'count', 'countdistinct', 'max', 'min', 'sum']);
// Database reads column.
$columns[] = (new column(
'dbreads',
new lang_string('task_dbreads', 'admin'),
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_INTEGER)
->add_fields("{$tablealias}.dbreads")
->set_is_sortable(true);
// Database writes column.
$columns[] = (new column(
'dbwrites',
new lang_string('task_dbwrites', 'admin'),
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_INTEGER)
->add_fields("{$tablealias}.dbwrites")
->set_is_sortable(true);
// Result column.
$columns[] = (new column(
'result',
new lang_string('task_result', 'admin'),
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_BOOLEAN)
// For accurate aggregation, we need to return boolean success = true by xor'ing the field value.
->add_field($DB->sql_bitxor("{$tablealias}.result", 1), 'success')
->set_is_sortable(true)
->add_callback(static function(bool $success): string {
if (!$success) {
return get_string('task_result:failed', 'admin');
}
return get_string('success');
});
return $columns;
}
/**
* Return list of all available filters
*
* @return filter[]
*/
protected function get_all_filters(): array {
global $DB;
$tablealias = $this->get_table_alias('task_log');
// Name filter (Filter by classname).
$filters[] = (new filter(
autocomplete::class,
'name',
new lang_string('classname', 'tool_task'),
$this->get_entity_name(),
"{$tablealias}.classname"
))
->add_joins($this->get_joins())
->set_options_callback(static function(): array {
global $DB;
$classnames = $DB->get_fieldset_sql('SELECT DISTINCT classname FROM {task_log} ORDER BY classname ASC');
$options = [];
foreach ($classnames as $classname) {
if (class_exists($classname)) {
$task = new $classname;
$options[$classname] = $task->get_name();
}
}
core_collator::asort($options);
return $options;
});
// Component filter.
$filters[] = (new filter(
text::class,
'component',
new lang_string('plugin'),
$this->get_entity_name(),
"{$tablealias}.component"
))
->add_joins($this->get_joins());
// Type filter.
$filters[] = (new filter(
select::class,
'type',
new lang_string('tasktype', 'admin'),
$this->get_entity_name(),
"{$tablealias}.type"
))
->add_joins($this->get_joins())
->set_options([
\core\task\database_logger::TYPE_ADHOC => new lang_string('task_type:adhoc', 'admin'),
\core\task\database_logger::TYPE_SCHEDULED => new lang_string('task_type:scheduled', 'admin'),
]);
// Output filter (Filter by task output).
$filters[] = (new filter(
text::class,
'output',
new lang_string('task_logoutput', 'admin'),
$this->get_entity_name(),
$DB->sql_cast_to_char("{$tablealias}.output")
))
->add_joins($this->get_joins());
// Start time filter.
$filters[] = (new filter(
date::class,
'timestart',
new lang_string('task_starttime', 'admin'),
$this->get_entity_name(),
"{$tablealias}.timestart"
))
->add_joins($this->get_joins())
->set_limited_operators([
date::DATE_ANY,
date::DATE_RANGE,
date::DATE_PREVIOUS,
date::DATE_CURRENT,
]);
// End time.
$filters[] = (new filter(
date::class,
'timeend',
new lang_string('task_endtime', 'admin'),
$this->get_entity_name(),
"{$tablealias}.timeend"
))
->add_joins($this->get_joins())
->set_limited_operators([
date::DATE_ANY,
date::DATE_RANGE,
date::DATE_PREVIOUS,
date::DATE_CURRENT,
]);
// Duration filter.
$filters[] = (new filter(
duration::class,
'duration',
new lang_string('task_duration', 'admin'),
$this->get_entity_name(),
"{$tablealias}.timeend - {$tablealias}.timestart"
))
->add_joins($this->get_joins());
// Database reads.
$filters[] = (new filter(
number::class,
'dbreads',
new lang_string('task_dbreads', 'admin'),
$this->get_entity_name(),
"{$tablealias}.dbreads"
))
->add_joins($this->get_joins());
// Database writes.
$filters[] = (new filter(
number::class,
'dbwrites',
new lang_string('task_dbwrites', 'admin'),
$this->get_entity_name(),
"{$tablealias}.dbwrites"
))
->add_joins($this->get_joins());
// Result filter.
$filters[] = (new filter(
select::class,
'result',
new lang_string('task_result', 'admin'),
$this->get_entity_name(),
"{$tablealias}.result"
))
->add_joins($this->get_joins())
->set_options([
self::SUCCESS => get_string('success'),
self::FAILED => get_string('task_result:failed', 'admin'),
]);
return $filters;
}
}
@@ -1,159 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_admin\reportbuilder\local\systemreports;
use context_system;
use core_admin\reportbuilder\local\entities\task_log;
use core_reportbuilder\local\entities\user;
use core_reportbuilder\local\report\action;
use lang_string;
use moodle_url;
use pix_icon;
use core_reportbuilder\system_report;
/**
* Task logs system report class implementation
*
* @package core_admin
* @copyright 2021 David Matamoros <davidmc@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class task_logs extends system_report {
/**
* Initialise report, we need to set the main table, load our entities and set columns/filters
*/
protected function initialise(): void {
// Our main entity, it contains all of the column definitions that we need.
$entitymain = new task_log();
$entitymainalias = $entitymain->get_table_alias('task_log');
$this->set_main_table('task_log', $entitymainalias);
$this->add_entity($entitymain);
// Any columns required by actions should be defined here to ensure they're always available.
$this->add_base_fields("{$entitymainalias}.id");
// We can join the "user" entity to our "main" entity and use the fullname column from the user entity.
$entityuser = new user();
$entituseralias = $entityuser->get_table_alias('user');
$this->add_entity($entityuser->add_join(
"LEFT JOIN {user} {$entituseralias} ON {$entituseralias}.id = {$entitymainalias}.userid"
));
// Now we can call our helper methods to add the content we want to include in the report.
$this->add_columns();
$this->add_filters();
$this->add_actions();
// Set if report can be downloaded.
$this->set_downloadable(true, get_string('tasklogs', 'admin'));
}
/**
* Validates access to view this report
*
* @return bool
*/
protected function can_view(): bool {
return has_capability('moodle/site:config', context_system::instance());
}
/**
* Get the visible name of the report
*
* @return string
*/
public static function get_name(): string {
return get_string('entitytasklog', 'admin');
}
/**
* Adds the columns we want to display in the report
*
* They are all provided by the entities we previously added in the {@see initialise} method, referencing each by their
* unique identifier
*/
public function add_columns(): void {
$columns = [
'task_log:name',
'task_log:type',
'user:fullname',
'task_log:starttime',
'task_log:duration',
'task_log:hostname',
'task_log:pid',
'task_log:database',
'task_log:result',
];
$this->add_columns_from_entities($columns);
// It's possible to override the display name of a column, if you don't want to use the value provided by the entity.
if ($column = $this->get_column('user:fullname')) {
$column->set_title(new lang_string('user', 'admin'));
}
// It's possible to set a default initial sort direction for one column.
$this->set_initial_sort_column('task_log:starttime', SORT_DESC);
}
/**
* Adds the filters we want to display in the report
*
* They are all provided by the entities we previously added in the {@see initialise} method, referencing each by their
* unique identifier
*/
protected function add_filters(): void {
$filters = [
'task_log:name',
'task_log:type',
'task_log:output',
'task_log:result',
'task_log:timestart',
'task_log:duration',
];
$this->add_filters_from_entities($filters);
}
/**
* Add the system report actions. An extra column will be appended to each row, containing all actions added here
*
* Note the use of ":id" placeholder which will be substituted according to actual values in the row
*/
protected function add_actions(): void {
// Action to view individual task log on a popup window.
$this->add_action((new action(
new moodle_url('/admin/tasklogs.php', ['logid' => ':id']),
new pix_icon('e/search', ''),
[],
true,
new lang_string('view'),
)));
// Action to download individual task log.
$this->add_action((new action(
new moodle_url('/admin/tasklogs.php', ['logid' => ':id', 'download' => true]),
new pix_icon('t/download', ''),
[],
false,
new lang_string('download'),
)));
}
}
@@ -1,118 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_admin\table;
use core_plugin_manager;
use dml_exception;
use html_writer;
use moodle_url;
use stdClass;
/**
* Activity Module admin settings.
*
* @package core_admin
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class activity_management_table extends plugin_management_table {
public function setup() {
$this->set_attribute('id', 'modules');
$this->set_attribute('class', 'admintable generaltable');
parent::setup();
}
protected function get_table_id(): string {
return 'module-administration-table';
}
protected function get_plugintype(): string {
return 'mod';
}
public function guess_base_url(): void {
$this->define_baseurl(
new moodle_url('/admin/modules.php')
);
}
protected function get_action_url(array $params = []): moodle_url {
return new moodle_url('/admin/modules.php', $params);
}
protected function get_column_list(): array {
$columns = parent::get_column_list();
return array_merge(
array_slice($columns, 0, 1, true),
['activities' => get_string('activities')],
array_slice($columns, 1, null, true),
);
}
protected function col_name(stdClass $row): string {
global $OUTPUT;
$status = $row->plugininfo->get_status();
if ($status === core_plugin_manager::PLUGIN_STATUS_MISSING) {
return html_writer::span(
get_string('pluginmissingfromdisk', 'core', $row->plugininfo),
'notifyproblem'
);
}
return html_writer::span(
html_writer::img(
$OUTPUT->image_url('monologo', $row->plugininfo->name),
'',
[
'class' => 'icon',
],
) . get_string('modulename', $row->plugininfo->name)
);
}
/**
* Show the number of activities present, with a link to courses containing activity if relevant.
*
* @param mixed $row
* @return string
*/
protected function col_activities(stdClass $row): string {
global $DB, $OUTPUT;
try {
$count = $DB->count_records_select($row->plugininfo->name, "course <> 0");
} catch (dml_exception $e) {
$count = -1;
}
if ($count > 0) {
return $OUTPUT->action_link(
new moodle_url('/course/search.php', [
'modulelist' => $row->plugininfo->name,
]),
$count,
null,
['title' => get_string('showmodulecourse')]
);
} else if ($count < 0) {
return get_string('error');
} else {
return $count;
}
}
}
@@ -1,153 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_admin\table;
use html_writer;
use moodle_url;
use stdClass;
/**
* Tiny admin settings.
*
* @package core_admin
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class block_management_table extends \core_admin\table\plugin_management_table {
/** @var plugininfo[] A list of blocks which cannot be deleted */
protected array $undeletableblocktypes;
/** @var stdClass[] A list of basic block data */
protected array $blockdata;
/** @var array<string,int> A list of course counts */
protected array $courseblocks;
public function __construct() {
global $DB;
parent::__construct();
$this->undeletableblocktypes = \block_manager::get_undeletable_block_types();
$sql = 'SELECT b.name,
b.id,
COUNT(DISTINCT binst.id) as totalcount
FROM {block} b
LEFT JOIN {block_instances} binst ON binst.blockname = b.name
GROUP BY b.id,
b.name
ORDER BY b.name ASC';
$this->blockdata = $DB->get_records_sql($sql);
$sql = "SELECT blockname
FROM {block_instances}
WHERE pagetypepattern = 'course-view-*'
GROUP BY blockname";
$this->courseblocks = $DB->get_records_sql($sql);
}
protected function get_plugintype(): string {
return 'block';
}
public function guess_base_url(): void {
$this->define_baseurl(
new moodle_url('/admin/blocks.php')
);
}
protected function get_action_url(array $params = []): moodle_url {
return new moodle_url('/admin/blocks.php', $params);
}
protected function get_table_js_module(): string {
return 'core_admin/block_management_table';
}
protected function get_column_list(): array {
$columns = parent::get_column_list();
return array_merge(
array_slice($columns, 0, 1, true),
['instances' => get_string('blockinstances', 'admin')],
array_slice($columns, 1, 2, true),
['protect' => get_string('blockprotect', 'admin')],
array_slice($columns, 3, null, true),
);
}
protected function get_columns_with_help(): array {
return [
'protect' => new \help_icon('blockprotect', 'admin'),
];
}
/**
* Render the instances column
* @param stdClass $row
* @return string
*/
protected function col_instances(stdClass $row): string {
$blockdata = $this->blockdata[$row->plugininfo->name];
if (array_key_exists($blockdata->name, $this->courseblocks)) {
return html_writer::link(
new moodle_url('/course/search.php', [
'blocklist' => $blockdata->id,
]),
$blockdata->totalcount,
);
}
return $blockdata->totalcount;
}
/**
* Render the protect column.
*
* @param stdClass $row
* @return string
*/
protected function col_protect(stdClass $row): string {
global $OUTPUT;
$params = [
'sesskey' => sesskey(),
];
$protected = in_array($row->plugininfo->name, $this->undeletableblocktypes);
$pluginname = $row->plugininfo->displayname;
if ($protected) {
$params['unprotect'] = $row->plugininfo->name;
$icon = $OUTPUT->pix_icon('t/unlock', get_string('blockunprotectblock', 'admin', $pluginname));
} else {
$params['protect'] = $row->plugininfo->name;
$icon = $OUTPUT->pix_icon('t/lock', get_string('blockprotectblock', 'admin', $pluginname));
}
return html_writer::link(
$this->get_action_url($params),
$icon,
[
'data-action' => 'toggleprotectstate',
'data-plugin' => $row->plugin,
'data-target-state' => $protected ? 0 : 1,
],
);
return '';
}
}
@@ -1,63 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_admin\table;
use moodle_url;
/**
* Tiny admin settings.
*
* @package core_admin
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class editor_management_table extends \core_admin\table\plugin_management_table {
protected function get_plugintype(): string {
return 'editor';
}
public function guess_base_url(): void {
$this->define_baseurl(
new moodle_url('/admin/settings.php', ['section' => 'manageeditors'])
);
}
protected function get_action_url(array $params = []): moodle_url {
return new moodle_url('/admin/editors.php', $params);
}
protected function order_plugins(array $plugins): array {
global $CFG;
// The Editor list is stored in an ordered string.
$activeeditors = explode(',', $CFG->texteditors);
$sortedplugins = [];
foreach ($activeeditors as $editor) {
if (isset($plugins[$editor])) {
$sortedplugins[$editor] = $plugins[$editor];
unset($plugins[$editor]);
}
}
$otherplugins = parent::order_plugins($plugins);
return array_merge(
$sortedplugins,
$otherplugins
);
}
}
@@ -1,71 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_admin\table;
use moodle_url;
use stdClass;
/**
* Media plugin admin settings.
*
* @package core_admin
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class media_management_table extends \core_admin\table\plugin_management_table {
/** @var array The list of used extensions */
protected array $usedextensions = [];
protected function get_plugintype(): string {
return 'media';
}
protected function get_action_url(array $params = []): moodle_url {
return new moodle_url('/admin/media.php', $params);
}
protected function get_column_list(): array {
$columns = parent::get_column_list();
return array_merge(
array_slice($columns, 0, 1, true),
['supports' => get_string('supports', 'core_media')],
array_slice($columns, 1, null, true),
);
}
protected function col_name(stdClass $row): string {
global $OUTPUT, $PAGE;
$name = $row->plugininfo->name;
if ($PAGE->theme->resolve_image_location('icon', 'media_' . $name, false)) {
$icon = $OUTPUT->pix_icon('icon', '', "media_{$name}", ['class' => 'icon pluginicon']);
} else {
$icon = $OUTPUT->pix_icon('spacer', '', 'moodle', ['class' => 'icon pluginicon noicon']);
}
$help = '';
if (get_string_manager()->string_exists('pluginname_help', 'media_' . $name)) {
$help = '&nbsp;' . $OUTPUT->help_icon('pluginname', 'media_' . $name);
}
return $icon . $row->plugininfo->displayname . $help;
}
protected function col_supports(stdClass $row): string {
return $row->plugininfo->supports($this->usedextensions);
}
}
@@ -1,503 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_admin\table;
use context_system;
use core_plugin_manager;
use core_table\dynamic as dynamic_table;
use flexible_table;
use html_writer;
use moodle_url;
use stdClass;
defined('MOODLE_INTERNAL') || die();
require_once("{$CFG->libdir}/tablelib.php");
/**
* Plugin Management table.
*
* @package core_admin
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
abstract class plugin_management_table extends flexible_table implements dynamic_table {
/** @var \core\plugininfo\base[] The plugin list */
protected array $plugins = [];
/** @var int The number of enabled plugins of this type */
protected int $enabledplugincount = 0;
/** @var core_plugin_manager */
protected core_plugin_manager $pluginmanager;
/** @var string The plugininfo class for this plugintype */
protected string $plugininfoclass;
public function __construct() {
global $CFG;
parent::__construct($this->get_table_id());
require_once($CFG->libdir . '/adminlib.php');
// Fetch the plugininfo class.
$this->pluginmanager = core_plugin_manager::instance();
$this->plugininfoclass = $this->pluginmanager::resolve_plugininfo_class($this->get_plugintype());
$this->guess_base_url();
$this->plugins = $this->get_sorted_plugins();
$this->enabledplugincount = count(array_filter($this->plugins, function ($plugin) {
return $plugin->is_enabled();
}));
$this->setup_column_configuration();
$this->set_filterset(new plugin_management_table_filterset());
$this->setup();
}
/**
* Get the list of sorted plugins.
*
* @return \core\plugininfo\base[]
*/
protected function get_sorted_plugins(): array {
if ($this->plugininfoclass::plugintype_supports_ordering()) {
return $this->plugininfoclass::get_sorted_plugins();
} else {
$plugins = $this->pluginmanager->get_plugins_of_type($this->get_plugintype());
return self::sort_plugins($plugins);
}
}
/**
* Sort the plugins list.
*
* Note: This only applies to plugins which do not support ordering.
*
* @param \core\plugininfo\base[] $plugins
* @return \core\plugininfo\base[]
*/
protected function sort_plugins(array $plugins): array {
// The asort functions work by reference.
\core_collator::asort_objects_by_property($plugins, 'displayname');
return $plugins;
}
/**
* Set up the column configuration for this table.
*/
protected function setup_column_configuration(): void {
$columnlist = $this->get_column_list();
$this->define_columns(array_keys($columnlist));
$this->define_headers(array_values($columnlist));
$columnswithhelp = $this->get_columns_with_help();
$columnhelp = array_map(function (string $column) use ($columnswithhelp): ?\renderable {
if (array_key_exists($column, $columnswithhelp)) {
return $columnswithhelp[$column];
}
return null;
}, array_keys($columnlist));
$this->define_help_for_headers($columnhelp);
}
/**
* Set the standard order of the plugins.
*
* @param array $plugins
* @return array
*/
protected function order_plugins(array $plugins): array {
uasort($plugins, function ($a, $b) {
if ($a->is_enabled() && !$b->is_enabled()) {
return -1;
} else if (!$a->is_enabled() && $b->is_enabled()) {
return 1;
}
return strnatcasecmp($a->name, $b->name);
});
return $plugins;
}
/**
* Get the plugintype for this table.
*
* @return string
*/
abstract protected function get_plugintype(): string;
/**
* Get the action URL for this table.
*
* The action URL is used to perform all actions when JS is not available.
*
* @param array $params
* @return moodle_url
*/
abstract protected function get_action_url(array $params = []): moodle_url;
/**
* Provide a default implementation for guessing the base URL from the action URL.
*/
public function guess_base_url(): void {
$this->define_baseurl($this->get_action_url());
}
/**
* Get the web service method used to toggle state.
*
* @return null|string
*/
protected function get_toggle_service(): ?string {
return 'core_admin_set_plugin_state';
}
/**
* Get the web service method used to order plugins.
*
* @return null|string
*/
protected function get_sortorder_service(): ?string {
return 'core_admin_set_plugin_order';
}
/**
* Get the ID of the table.
*
* @return string
*/
protected function get_table_id(): string {
return 'plugin_management_table-' . $this->get_plugintype();
}
/**
* Get a list of the column titles
* @return string[]
*/
protected function get_column_list(): array {
$columns = [
'name' => get_string('name', 'core'),
'version' => get_string('version', 'core'),
];
if ($this->supports_disabling()) {
$columns['enabled'] = get_string('pluginenabled', 'core_plugin');
}
if ($this->supports_ordering()) {
$columns['order'] = get_string('order', 'core');
}
$columns['settings'] = get_string('settings', 'core');
$columns['uninstall'] = get_string('uninstallplugin', 'core_admin');
return $columns;
}
protected function get_columns_with_help(): array {
return [];
}
/**
* Get the context for this table.
*
* @return context_system
*/
public function get_context(): context_system {
return context_system::instance();
}
/**
* Get the table content.
*/
public function get_content(): string {
ob_start();
$this->out();
$content = ob_get_contents();
ob_end_clean();
return $content;
}
/**
* Print the table.
*/
public function out(): void {
$plugintype = $this->get_plugintype();
foreach ($this->plugins as $plugininfo) {
$plugin = "{$plugintype}_{$plugininfo->name}";
$rowdata = (object) [
'plugin' => $plugin,
'plugininfo' => $plugininfo,
'name' => $plugininfo->displayname,
'version' => $plugininfo->versiondb,
];
$this->add_data_keyed(
$this->format_row($rowdata),
$this->get_row_class($rowdata)
);
}
$this->finish_output(false);
}
/**
* This table is not downloadable.
* @param bool $downloadable
* @return bool
*/
// phpcs:disable VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
public function is_downloadable($downloadable = null): bool {
return false;
}
/**
* Show the name column content.
*
* @param stdClass $row
* @return string
*/
protected function col_name(stdClass $row): string {
$status = $row->plugininfo->get_status();
if ($status === core_plugin_manager::PLUGIN_STATUS_MISSING) {
return html_writer::span(
get_string('pluginmissingfromdisk', 'core', $row->plugininfo),
'notifyproblem'
);
}
if ($row->plugininfo->is_installed_and_upgraded()) {
return $row->plugininfo->displayname;
}
return html_writer::span(
$row->plugininfo->displayname,
'notifyproblem'
);
}
/**
* Show the enable/disable column content.
*
* @param stdClass $row
* @return string
*/
protected function col_enabled(stdClass $row): string {
global $OUTPUT;
$enabled = $row->plugininfo->is_enabled();
$params = [
'sesskey' => sesskey(),
'plugin' => $row->plugininfo->name,
'action' => $enabled ? 'disable' : 'enable',
];
if ($enabled) {
$icon = $OUTPUT->pix_icon('t/hide', get_string('disableplugin', 'core_admin', $row->plugininfo->displayname));
} else {
$icon = $OUTPUT->pix_icon('t/show', get_string('enableplugin', 'core_admin', $row->plugininfo->displayname));
}
return html_writer::link(
$this->get_action_url($params),
$icon,
[
'data-toggle-method' => $this->get_toggle_service(),
'data-action' => 'togglestate',
'data-plugin' => $row->plugin,
'data-state' => $enabled ? 1 : 0,
],
);
}
protected function col_order(stdClass $row): string {
global $OUTPUT;
if (!$this->supports_ordering()) {
return '';
}
if (!$row->plugininfo->is_enabled()) {
return '';
}
if ($this->enabledplugincount <= 1) {
// There is only one row.
return '';
}
$hasup = true;
$hasdown = true;
if (empty($this->currentrow)) {
// This is the top row.
$hasup = false;
}
if ($this->currentrow === ($this->enabledplugincount - 1)) {
// This is the last row.
$hasdown = false;
}
if ($this->supports_ordering()) {
$dataattributes = [
'data-method' => $this->get_sortorder_service(),
'data-action' => 'move',
'data-plugin' => $row->plugin,
];
} else {
$dataattributes = [];
}
if ($hasup) {
$upicon = html_writer::link(
$this->get_action_url([
'sesskey' => sesskey(),
'action' => 'up',
'plugin' => $row->plugininfo->name,
]),
$OUTPUT->pix_icon('t/up', get_string('moveup')),
array_merge($dataattributes, ['data-direction' => 'up']),
);
} else {
$upicon = $OUTPUT->spacer();
}
if ($hasdown) {
$downicon = html_writer::link(
$this->get_action_url([
'sesskey' => sesskey(),
'action' => 'down',
'plugin' => $row->plugininfo->name,
]),
$OUTPUT->pix_icon('t/down', get_string('movedown')),
array_merge($dataattributes, ['data-direction' => 'down']),
);
} else {
$downicon = $OUTPUT->spacer();
}
// For now just add the up/down icons.
return html_writer::span($upicon . $downicon);
}
/**
* Show the settings column content.
*
* @param stdClass $row
* @return string
*/
protected function col_settings(stdClass $row): string {
if ($settingsurl = $row->plugininfo->get_settings_url()) {
return html_writer::link($settingsurl, get_string('settings'));
}
return '';
}
/**
* Show the Uninstall column content.
*
* @param stdClass $row
* @return string
*/
protected function col_uninstall(stdClass $row): string {
$status = $row->plugininfo->get_status();
if ($status === core_plugin_manager::PLUGIN_STATUS_NEW) {
return get_string('status_new', 'core_plugin');
}
if ($status === core_plugin_manager::PLUGIN_STATUS_MISSING) {
$uninstall = get_string('status_missing', 'core_plugin') . '<br/>';
} else {
$uninstall = '';
}
if ($uninstallurl = $this->pluginmanager->get_uninstall_url($row->plugin)) {
$uninstall .= html_writer::link($uninstallurl, get_string('uninstallplugin', 'core_admin'));
}
return $uninstall;
}
/**
* Get the JS module used to manage this table.
*
* This should be a class which extends 'core_admin/plugin_management_table'.
*
* @return string
*/
protected function get_table_js_module(): string {
return 'core_admin/plugin_management_table';
}
/**
* Add JS specific to this implementation.
*
* @return string
*/
protected function get_dynamic_table_html_end(): string {
global $PAGE;
$PAGE->requires->js_call_amd($this->get_table_js_module(), 'init');
return parent::get_dynamic_table_html_end();
}
/**
* Get any class to add to the row.
*
* @param mixed $row
* @return string
*/
protected function get_row_class($row): string {
$plugininfo = $row->plugininfo;
if ($plugininfo->get_status() === core_plugin_manager::PLUGIN_STATUS_MISSING) {
return '';
}
if (!$plugininfo->is_enabled()) {
return 'dimmed_text';
}
return '';
}
public static function get_filterset_class(): string {
return self::class . '_filterset';
}
/**
* Whether this plugin type supports the disabling of plugins.
*
* @return bool
*/
protected function supports_disabling(): bool {
return $this->plugininfoclass::plugintype_supports_disabling();
}
/**
* Whether this table should show ordering fields.
*
* @return bool
*/
protected function supports_ordering(): bool {
return $this->plugininfoclass::plugintype_supports_ordering();
}
}
@@ -1,27 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_admin\table;
/**
* This file contains the dynamic interface.
*
* @package core_admin
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class plugin_management_table_filterset extends \core_table\local\filter\filterset {
}
@@ -1,50 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_admin\table;
use moodle_url;
/**
* Tiny admin settings.
*
* @package core_admin
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class tool_plugin_management_table extends \core_admin\table\plugin_management_table {
protected function get_plugintype(): string {
return 'tool';
}
public function guess_base_url(): void {
$this->define_baseurl(
new moodle_url('/admin/tools.php')
);
}
protected function get_column_list(): array {
$columns = parent::get_column_list();
unset($columns['settings']);
return $columns;
}
protected function get_action_url(array $params = []): moodle_url {
return new moodle_url('/admin/tool.php', $params);
}
}
-174
View File
@@ -1,174 +0,0 @@
<?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/>.
/**
* Task executor for adhoc tasks.
*
* @package core
* @subpackage cli
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
* @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");
list($options, $unrecognized) = cli_get_params(
[
'help' => false,
'showsql' => false,
'showdebugging' => false,
'execute' => false,
'keep-alive' => 0,
'ignorelimits' => false,
'force' => false,
'id' => null,
'classname' => null,
'taskslimit' => null,
'failed' => false,
], [
'h' => 'help',
'e' => 'execute',
'k' => 'keep-alive',
'i' => 'ignorelimits',
'f' => 'force',
'c' => 'classname',
'l' => 'taskslimit',
]
);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
$help = <<<EOT
Ad hoc cron tasks.
Options:
-h, --help Print out this help
--showsql Show sql queries before they are executed
--showdebugging Show developer level debugging information
-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
--id Run (failed) task with id
-c, --classname Run tasks with a certain classname (FQN)
-l, --taskslimit=N Run at most N tasks
--failed Run only tasks that failed, ie those with a fail delay
Run all queued tasks:
\$sudo -u www-data /usr/bin/php admin/cli/adhoc_task.php --execute
Run all queued tasks of specific class:
\$sudo -u www-data /usr/bin/php admin/cli/adhoc_task.php --classname=\\\\core_course\\\\task\\\\course_delete_modules
Double backslash for the shell escape reasons.
Run a specific task:
\$sudo -u www-data /usr/bin/php admin/cli/adhoc_task.php --id=123456
Run a specific task with debugging:
\$sudo -u www-data /usr/bin/php admin/cli/adhoc_task.php --id=123456 --showsql --showdebugging
To profile a long running task:
\$sudo -u www-data /usr/bin/php admin/cli/adhoc_task.php --taskslimit=1 --classname='\\some\\class\\name' --ignorelimits
EOT;
if ($options['help']) {
echo $help;
exit(0);
}
if (CLI_MAINTENANCE) {
echo "CLI maintenance mode active, cron execution suspended.\n";
exit(1);
}
if (moodle_needs_upgrading()) {
echo "Moodle upgrade pending, cron execution suspended.\n";
exit(1);
}
if (!get_config('core', 'cron_enabled') && !$options['force']) {
mtrace('Cron is disabled. Use --force to override.');
exit(1);
}
// Common debugging options.
if ($options['showdebugging']) {
set_debugging(DEBUG_DEVELOPER, true);
}
if ($options['showsql']) {
$DB->set_debug(true);
}
if (!empty($CFG->showcronsql)) {
$DB->set_debug(true);
}
if (!empty($CFG->showcrondebugging)) {
set_debugging(DEBUG_DEVELOPER, true);
}
// Process params.
core_php_time_limit::raise();
// Increase memory limit.
raise_memory_limit(MEMORY_EXTRA);
// Emulate normal session - we use admin account by default.
\core\cron::setup_user();
\core\local\cli\shutdown::script_supports_graceful_exit();
$humantimenow = date('r', time());
mtrace("Server Time: {$humantimenow}\n");
$classname = $options['classname'];
// Run a single adhoc task only, if requested.
if (!empty($options['id'])) {
$taskid = (int) $options['id'];
\core\cron::run_adhoc_task($taskid);
exit(0);
}
// Run all failed tasks.
if (!empty($options['failed'])) {
\core\cron::run_failed_adhoc_tasks($classname);
exit(0);
}
// Examine params and determine if we should run.
$execute = (bool) $options['execute'];
$keepalive = empty($options['keep-alive']) ? 0 : (int) $options['keep-alive'];
$taskslimit = empty($options['taskslimit']) ? null : (int) $options['taskslimit'];
$checklimits = empty($options['ignorelimits']);
if ($classname || $keepalive || $taskslimit) {
$execute = true;
}
// Output the help text if no criteria for running the adhoc tasks are given.
if (!$execute) {
echo $help;
exit(0);
}
\core\cron::run_adhoc_tasks(time(), $keepalive, $checklimits, null, $taskslimit, $classname);
+5 -4
View File
@@ -30,6 +30,7 @@ define('CLI_SCRIPT', true);
require(__DIR__.'/../../config.php');
require_once($CFG->libdir.'/clilib.php'); // cli only functions
require_once($CFG->libdir.'/cronlib.php');
// now get cli options
list($options, $unrecognized) = cli_get_params(array('help'=>false),
@@ -79,10 +80,10 @@ if (!empty($CFG->showcrondebugging)) {
$starttime = microtime();
// Emulate normal session.
\core\cron::setup_user();
/// emulate normal session
cron_setup_user();
// Start output log.
/// Start output log
$timenow = time();
mtrace("Server Time: ".date('r',$timenow)."\n\n");
@@ -95,4 +96,4 @@ backup_cron_automated_helper::run_automated_backup(backup_cron_automated_helper:
mtrace("Automated cron backups completed correctly");
$difftime = microtime_diff($starttime, microtime());
mtrace("Execution took ".$difftime." seconds");
mtrace("Execution took ".$difftime." seconds");
-119
View File
@@ -1,119 +0,0 @@
<?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/>.
/**
* Build and store theme CSS.
*
* @package core
* @subpackage cli
* @copyright 2017 Ryan Wyllie <ryan@moodle.com>
* @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->libdir/csslib.php");
require_once("$CFG->libdir/outputlib.php");
$longparams = [
'themes' => null,
'direction' => null,
'help' => false,
'verbose' => false
];
$shortmappings = [
't' => 'themes',
'd' => 'direction',
'h' => 'help',
'v' => 'verbose'
];
// Get CLI params.
list($options, $unrecognized) = cli_get_params($longparams, $shortmappings);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
if ($options['help']) {
echo
"Compile the CSS for one or more installed themes.
Existing CSS caches will replaced.
By default all themes will be recompiled unless otherwise specified.
Options:
-t, --themes A comma separated list of themes to be compiled
-d, --direction Only compile a single direction (either ltr or rtl)
-v, --verbose Print info comments to stdout
-h, --help Print out this help
Example:
\$ sudo -u www-data /usr/bin/php admin/cli/build_theme_css.php --themes=boost --direction=ltr
";
die;
}
if (empty($options['verbose'])) {
$trace = new null_progress_trace();
} else {
$trace = new text_progress_trace();
}
cli_heading('Build theme css');
// Determine which themes we need to build.
$themenames = [];
if (is_null($options['themes'])) {
$trace->output('No themes specified. Finding all installed themes.');
$themenames = array_keys(core_component::get_plugin_list('theme'));
} else {
if (is_string($options['themes'])) {
$themenames = explode(',', $options['themes']);
} else {
cli_error('--themes must be a comma separated list of theme names');
}
}
$trace->output('Checking that each theme is correctly installed...');
$themeconfigs = [];
foreach ($themenames as $themename) {
if (is_null(theme_get_config_file_path($themename))) {
cli_error("Unable to find theme config for {$themename}");
}
// Load the config for the theme.
$themeconfigs[] = theme_config::load($themename);
}
$directions = ['ltr', 'rtl'];
if (!is_null($options['direction'])) {
if (!in_array($options['direction'], $directions)) {
cli_error("--direction must be either ltr or rtl");
}
$directions = [$options['direction']];
}
$trace->output('Building CSS for themes: ' . implode(', ', $themenames));
theme_build_css_for_themes($themeconfigs, $directions);
exit(0);
-185
View File
@@ -1,185 +0,0 @@
<?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 script allowing to get and set config values.
*
* This is technically just a thin wrapper for {@link get_config()} and
* {@link set_config()} functions.
*
* @package core
* @subpackage cli
* @copyright 2017 David Mudrák <david@moodle.com>
* @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');
$usage = "Displays the current value of the given site setting. Allows to set it to the given value, too.
Usage:
# php cfg.php [--component=<componentname>] [--json] [--shell-arg]
# php cfg.php --name=<configname> [--component=<componentname>] [--shell-arg] [--no-eol]
# php cfg.php --name=<configname> [--component=<componentname>] --set=<value>
# php cfg.php --name=<configname> [--component=<componentname>] --unset
# php cfg.php [--help|-h]
Options:
-h --help Print this help.
--component=<frankenstyle> Name of the component the variable is part of. Defaults to core.
--name=<configname> Name of the configuration variable to get/set. If missing, print all
configuration variables of the given component.
--set=<value> Set the given variable to this value.
--unset Unset the given variable.
--shell-arg Escape output values so that they can be directly used as shell script arguments.
--json Encode output list of values using JSON notation.
--no-eol Do not include the trailing new line character when printing the value.
The list of all variables of the given component can be printed as
tab-separated list (default) or JSON object (--json). Particular values are
printed as raw text values, optionally escaped so that they can be directly
used as shell script arguments (--shell-arg). Single values are displayed with
trailing new line by default, unless explicitly disabled (--no-eol).
In the read mode, the script exits with success status 0 if the requested value
is found. If the requested variable is not set, the script exits with status 3.
When listing all variables of the component, the exit status is always 0 even
if no variables for the given component are found. When setting/unsetting a
value, the exit status is 0. When attempting to set/unset a value that has
already been hard-set in config.php, the script exits with error status 4. In
case of unexpected error, the script exits with error status 1.
Examples:
# php cfg.php
Prints tab-separated list of all core configuration variables and their values.
# php cfg.php --json
Prints list of all core configuration variables and their values as a JSON object.
# php cfg.php --name=release
Prints the given configuration variable - e.g. \$CFG->release in this case.
# php cfg.php --component=tool_recyclebin
# Prints tab-separated list of the plugin's configuration variables.
# export DATAROOT=\$(php cfg.php --name=dataroot --shell-arg --no-eol)
Stores the given configuration variable in the shell variable, escaped
so that it can be safely used as a shell argument.
# php cfg.php --name=theme --set=classic
Sets the given configuration variable to the given value.
# php cfg.php --name=noemailever --unset
Unsets the previously configured variable.
";
list($options, $unrecognised) = cli_get_params([
'help' => false,
'component' => null,
'name' => null,
'set' => null,
'unset' => false,
'shell-arg' => false,
'json' => false,
'no-eol' => false,
], [
'h' => 'help'
]);
if ($unrecognised) {
$unrecognised = implode(PHP_EOL.' ', $unrecognised);
cli_error(get_string('cliunknowoption', 'core_admin', $unrecognised));
}
if ($options['help']) {
cli_writeln($usage);
exit(2);
}
if ($options['unset'] || $options['set'] !== null) {
// Unset the variable or set it to the given value.
if (empty($options['name'])) {
cli_error('Missing configuration variable name', 2);
}
// Check that the variable is not hard-set in the main config.php already.
$component = $options['component'];
if (!empty($component)) {
$componentsettings = $CFG->forced_plugin_settings[$component] ?? [];
$settinginconfig = array_key_exists($options['name'], $componentsettings);
} else {
$settinginconfig = array_key_exists($options['name'], $CFG->config_php_settings);
}
if ($settinginconfig) {
cli_error('The configuration variable is hard-set in the config.php, unable to change.', 4);
}
$new = $options['set'];
$old = get_config($options['component'], $options['name']);
if ($new !== $old) {
set_config($options['name'], $options['set'], $options['component']);
add_to_config_log($options['name'], $old, $new, $options['component']);
}
exit(0);
}
if ($options['name'] === null) {
// List all variables provided by the component (defaults to core).
$got = get_config($options['component']);
if ($options['json']) {
cli_writeln(json_encode($got));
} else {
foreach ($got as $name => $value) {
if ($options['shell-arg']) {
$value = escapeshellarg($value);
}
cli_writeln($name."\t".$value);
}
}
exit(0);
} else {
// Display the value of a single variable.
$got = get_config($options['component'], $options['name']);
if ($got === false) {
cli_error('No such configuration variable found.', 3);
}
if ($options['shell-arg']) {
$got = escapeshellarg($got);
}
if ($options['json']) {
$got = json_encode($got);
}
if ($options['no-eol']) {
cli_write($got);
} else {
cli_writeln($got);
}
exit(0);
}
-171
View File
@@ -1,171 +0,0 @@
<?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 tool for system checks
*
* @package core
* @category check
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
* @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');
use core\check\result;
list($options, $unrecognized) = cli_get_params([
'help' => false,
'filter' => '',
'type' => 'status',
'verbose' => false,
], [
'h' => 'help',
'f' => 'filter',
'v' => 'verbose',
't' => 'type',
]);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
$checks = \core\check\manager::get_checks($options['type']);
$types = join(', ', \core\check\manager::TYPES);
$help = "Run Moodle system checks
Options:
-h, --help Print out this help
-f, --filter Filter to a subset of checks
-t, --type Which set of checks? Defaults to 'status'
One of $types
-v, --verbose Show details of all checks, not just failed checks
Example:
sudo -u www-data php admin/cli/checks.php
sudo -u www-data php admin/cli/checks.php -v
sudo -u www-data php admin/cli/checks.php -v --filter=environment
";
if ($options['help']) {
echo $help;
die();
}
$filter = $options['filter'];
if ($filter) {
$checks = array_filter($checks, function($check, $key) use ($filter) {
$ref = $check->get_ref();
return (strpos($ref, $filter) !== false);
}, 1);
}
// These shell exit codes and labels align with the NRPE standard.
$exitcodes = [
result::NA => 0,
result::OK => 0,
result::INFO => 0,
result::UNKNOWN => 3,
result::WARNING => 1,
result::ERROR => 2,
result::CRITICAL => 2,
];
$exitlabel = [
result::NA => 'OK',
result::OK => 'OK',
result::INFO => 'OK',
result::UNKNOWN => 'UNKNOWN',
result::WARNING => 'WARNING',
result::ERROR => 'CRITICAL',
result::CRITICAL => 'CRITICAL',
];
$format = "% 10s| % -60s\n";
$spacer = "----------+--------------------------------------------------------------------\n";
$prefix = ' |';
$output = '';
$header = $exitlabel[result::OK] . ': ' . get_string('checksok', '', $options['type']) . "\n";
$exitcode = $exitcodes[result::OK];
foreach ($checks as $check) {
$ref = $check->get_ref();
$result = $check->get_result();
$status = $result->get_status();
$checkexitcode = $exitcodes[$status];
// Summary is treated as html.
$summary = $result->get_summary();
$summary = html_to_text($summary, 60, false);
if ($checkexitcode > $exitcode) {
$exitcode = $checkexitcode;
$header = $exitlabel[$status] . ': ' . $check->get_name() . " (" . $check->get_ref() . ")\n";
}
if (empty($messages[$status])) {
$messages[$status] = $result;
}
$len = strlen(get_string('status' . $status));
if ($options['verbose'] ||
$status == result::WARNING ||
$status == result::CRITICAL ||
$status == result::ERROR) {
$output .= sprintf(
$format,
$OUTPUT->check_result($result),
sprintf('%s (%s)', $check->get_name(), $ref)
);
$summary = str_replace("\n", "\n" . $prefix . ' ', $summary);
$output .= sprintf( $format, '', ' ' . $summary);
if ($options['verbose']) {
$actionlink = $check->get_action_link();
if ($actionlink) {
$output .= sprintf( $format, '', ' ' . $actionlink->url);
}
$output .= sprintf( $format, '', '');
}
}
}
// Print NRPE header.
print $header;
// Only show the table header if there is anything to show.
if ($output) {
print sprintf($format,
get_string('status'). ' ',
get_string('check')
) . $spacer;
print $output;
}
// NRPE shell exit code.
exit($exitcode);
+10 -135
View File
@@ -1,4 +1,5 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
@@ -29,32 +30,13 @@
define('CLI_SCRIPT', true);
require(__DIR__ . '/../../config.php');
require_once($CFG->libdir . '/clilib.php');
require(__DIR__.'/../../config.php');
require_once($CFG->libdir.'/clilib.php'); // cli only functions
require_once($CFG->libdir.'/cronlib.php');
// Now get cli option.
[$options, $unrecognized] = cli_get_params(
[
'help' => false,
'stop' => false,
'list' => false,
'force' => false,
'enable' => false,
'disable' => false,
'disable-wait' => false,
'keep-alive' => null,
],
[
'h' => 'help',
's' => 'stop',
'l' => 'list',
'f' => 'force',
'e' => 'enable',
'd' => 'disable',
'w' => 'disable-wait',
'k' => 'keep-alive',
]
);
// now get cli options
list($options, $unrecognized) = cli_get_params(array('help'=>false),
array('h'=>'help'));
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
@@ -63,19 +45,10 @@ if ($unrecognized) {
if ($options['help']) {
$help =
"Execute periodic cron actions.
"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
-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)
-k, --keep-alive=N Keep this script alive for N seconds and poll for new tasks
The default value can be set by administrators in:
Site administration > Server > Tasks > Task processing > Keep alive time
-h, --help Print out this help
Example:
\$sudo -u www-data /usr/bin/php admin/cli/cron.php
@@ -85,102 +58,4 @@ Example:
die;
}
if ($options['stop']) {
// By clearing the caches this signals to other running processes
// to exit after finishing the current task.
\core\task\manager::clear_static_caches();
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();
$keepalive = $options['keep-alive'];
\core\cron::run_main_process($keepalive);
cron_run();
-65
View File
@@ -1,65 +0,0 @@
<?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 script to reset dashboards.
*
* @package core
* @subpackage cli
* @copyright 2021 Brendan Heywood (brendan@catalyst-au.net)
* @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.'/my/lib.php');
list($options, $unrecognized) = cli_get_params([
'help' => false,
'execute' => false,
], [
'h' => 'help',
'e' => 'execute',
]);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized), 2);
}
if (!$options['execute']) {
$help = <<<EOF
Resets Moodle dashboards for all users
Options:
-h, --help Print out this help
-e, --execute Actually run the reset
Example:
\$ sudo -u www-data /usr/bin/php admin/cli/dashboard_reset.php -e
EOF;
echo $help;
exit(0);
}
$progressbar = new progress_bar();
$progressbar->create();
my_reset_page_for_all_users(MY_PAGE_PRIVATE, 'my-index', $progressbar);
-123
View File
@@ -1,123 +0,0 @@
<?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 script to delete a course.
*
* @package core
* @subpackage cli
* @author Mikhail Golenkov <mikhailgolenkov@catalyst-au.net>
* @copyright 2022 Catalyst IT
* @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');
list($options, $unrecognized) = cli_get_params(
[
'courseid' => false,
'help' => false,
'showsql' => false,
'showdebugging' => false,
'disablerecyclebin' => false,
'non-interactive' => false,
], [
'c' => 'courseid',
'h' => 'help',
]
);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
if ($options['help'] || empty($options['courseid'])) {
$help = <<<EOT
CLI script to delete a course.
Options:
-h, --help Print out this help
--showsql Show sql queries before they are executed
--showdebugging Show developer level debugging information
--disablerecyclebin Skip backing up the course
--non-interactive No interactive questions or confirmations
-c, --courseid Course id to be deleted
Example:
\$sudo -u www-data /usr/bin/php admin/cli/delete_course.php --courseid=123456
\$sudo -u www-data /usr/bin/php admin/cli/delete_course.php --courseid=123456 --showdebugging
\$sudo -u www-data /usr/bin/php admin/cli/delete_course.php --courseid=123456 --disablerecyclebin
EOT;
echo $help;
die;
}
$interactive = empty($options['non-interactive']);
if ($options['showdebugging']) {
mtrace('Enabling debugging...');
set_debugging(DEBUG_DEVELOPER, true);
}
if ($options['showsql']) {
mtrace('Enabling SQL debugging...');
$DB->set_debug(true);
}
if (CLI_MAINTENANCE) {
cli_error('CLI maintenance mode active, CLI execution suspended');
}
if (moodle_needs_upgrading()) {
cli_error('Moodle upgrade pending, CLI execution suspended');
}
$course = $DB->get_record('course', array('id' => $options['courseid']));
if (empty($course)) {
cli_error('Course not found');
}
mtrace('Deleting course id ' . $course->id);
mtrace('Course name: ' . $course->fullname);
mtrace('Short name: ' . $course->shortname);
if ($interactive) {
mtrace('');
$input = cli_input('Are you sure you wish to delete this course? (y/N)', 'N', ['y', 'Y', 'n', 'N']);
if (strtolower($input) != 'y') {
exit(0);
}
}
if ($options['disablerecyclebin']) {
mtrace('Disabling recycle bin...');
$overrideconfig = ['tool_recyclebin' => ['coursebinenable' => false, 'categorybinenable' => false]];
$CFG->forced_plugin_settings = array_merge($CFG->forced_plugin_settings, $overrideconfig);
}
core_php_time_limit::raise();
delete_course($course);
mtrace('Updating course count in categories...');
fix_course_sortorder();
mtrace('Done!');
-209
View File
@@ -1,209 +0,0 @@
<?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 you to view and change the emailstop flag of any user.
*
* @package core
* @subpackage cli
* @copyright 2023 Stephan Robotta (stephan.robotta@bfh.ch)
* @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');
// Define the input options.
$longparams = [
'email' => '',
'help' => false,
'id' => '',
'quiet' => false,
'stop' => '',
'username' => '',
];
$shortparams = [
'e' => 'email',
'h' => 'help',
'i' => 'id',
'q' => 'quiet',
's' => 'stop',
'u' => 'username',
];
// Define exit codes.
$exitsuccess = 0;
$exitunknownoption = 1;
$exitmissinguserarg = 2;
$exittoomanyuserarg = 3;
$exitnosearchargs = 4;
$exitnousersfound = 5;
$exitinvalidstopflag = 6;
$exiterrordb = 7;
// Now get cli options that are set by the caller.
list($options, $unrecognized) = cli_get_params($longparams, $shortparams);
$verbose = empty($options['quiet']);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
if ($verbose) {
cli_error(get_string('cliunknowoption', 'admin', $unrecognized), $exitunknownoption);
}
exit($exitunknownoption);
}
if ($options['help']) {
$help =
"Set/unset or show status of emailstop flag for a user, identified by username or email.
There are no security checks here because anybody who is able to
execute this file may execute any PHP too.
Options:
-h, --help Print out this help
-e, --email=email Specify user by email, separate many users by comma
-i, --id=id Specify user by id, separate many users by comma
-q, --quiet No output to stdout
-s, --stop=0|1|off|on Set new value for emailstop flag
-u, --username=username Specify user by username, separate many users by comma
Example:
\$sudo -u www-data /usr/bin/php admin/cli/emailstop.php --email=student1@example.com --stop=1
\$sudo -u www-data /usr/bin/php admin/cli/emailstop.php --email=student1@example.com,student2@example.com
\$sudo -u www-data /usr/bin/php admin/cli/emailstop.php --u=student1,student2 -s=on
";
echo $help;
exit($exitsuccess);
}
$cntempty = 0;
$cntfilled = 0;
$searchargs = [];
// Try to find out which option is used to fetch the users from. Also do sanitize etc.
foreach (['email', 'username', 'id'] as $option) {
if (empty($options[$option])) {
$cntempty++;
} else {
$cntfilled++;
$argname = $option;
// The search args must be: split by the comma, trimmed, and empty elements filtered out.
$searchargs = array_flip(array_filter(
array_map(
function ($item) {
return trim($item);
},
explode(',', $options[$option])
),
function ($item) {
return $item !== '';
}
));
}
}
if ($cntempty === 3) {
if ($verbose) {
cli_error('One of username, email, or id must be set.', $exitmissinguserarg);
}
exit($exitmissinguserarg);
}
if ($cntfilled > 1) {
if ($verbose) {
cli_error('Only one of email, username, or id can be set to identify a user.', $exittoomanyuserarg);
}
exit($exittoomanyuserarg);
}
if (empty($searchargs)) {
if ($verbose) {
cli_error('No values are provided for users.', $exitnosearchargs);
}
exit($exitnosearchargs);
}
try {
$users = $DB->get_records_list('user', $argname, array_keys($searchargs));
} catch (Exception $e) {
if ($verbose) {
cli_error("Could not fetch data from db by {$argname}: '{$options[$argname]}'.", $exiterrordb);
}
exit($exiterrordb);
}
if (empty($users)) {
if ($verbose) {
cli_error("Can not find any user by {$argname}: '{$options[$argname]}'.", $exitnousersfound);
}
exit($exitnousersfound);
}
// No stop flag set, then just print the user and the current emailstop flag state.
if ($options['stop'] === '') {
foreach ($users as $user) {
if ($verbose) {
echo 'user=' . $user->{$argname} . ' - emailstop=' . (int)$user->emailstop . PHP_EOL;
unset($searchargs[$user->{$argname}]);
}
}
if ($verbose) {
foreach (array_keys($searchargs) as $arg) {
echo 'user=' . $arg . ' - not found' . PHP_EOL;
}
}
exit($exitsuccess);
}
// Allowed values for the stop flag enabled are 1 and on, for disabled are 0 and off.
$validvalues = ['0', '1', 'off', 'on'];
$stopflag = strtolower($options['stop']);
if (!in_array($stopflag, $validvalues)) {
if ($verbose) {
cli_error('Value for the emailstop flag must be one of: ' . implode(', ', $validvalues) . '.', $exitinvalidstopflag);
}
exit($exitinvalidstopflag);
}
foreach ($validvalues as $value) {
if ($value === $stopflag) {
$stopflag = ($value === '1' || $value === 'on') ? 1 : 0;
break;
}
}
// Update each user with the stop flag to be set if it is necessary.
foreach ($users as $user) {
$line = 'Update user ' . $user->{$argname} . ($argname !== 'id' ? ' (' . $user->id . ')' : '') . ' - ';
if ((int)$user->emailstop !== $stopflag) {
$DB->set_field('user', 'emailstop', $stopflag, ['id' => $user->id]);
$line .= 'ok';
} else {
$line .= 'already done';
}
if ($verbose) {
echo $line . PHP_EOL;
unset($searchargs[$user->{$argname}]);
}
}
if ($verbose) {
foreach (array_keys($searchargs) as $arg) {
echo 'user=' . $arg . ' - not found' . PHP_EOL;
}
}
exit($exitsuccess);
-1
View File
@@ -73,7 +73,6 @@ foreach ($rs as $user) {
echo "Redeleting user $user->id: $user->username ($user->email)\n";
delete_user($user);
}
$rs->close();
cli_heading('Deleting all leftovers');
-138
View File
@@ -1,138 +0,0 @@
<?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/>.
/**
* Fix orphaned calendar events that were broken by MDL-67494.
*
* This script will look for all the calendar events which userids
* where broken by a wrong upgrade step, affecting to Moodle 3.9.5
* and up.
*
* It performs checks to both:
* a) Detect if the site was affected (ran the wrong upgrade step).
* b) Look for orphaned calendar events, categorising them as:
* - standard: site / category / course / group / user events
* - subscription: events created via subscriptions.
* - action: normal action events, created to show common important dates.
* - override: user and group override events, particular, that some activities support.
* - custom: other events, not being any of the above, common or particular.
* By specifying it (--fix) try to recover as many broken events (missing userid) as
* possible. Standard, subscription, action, override events in core are fully supported but
* override or custom events should be fixed by each plugin as far as there isn't any standard
* API (plugin-wise) to launch a rebuild of the calendar events.
*
* @package core
* @copyright 2021 onwards Simey Lameze <simey@moodle.com>
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define('CLI_SCRIPT', true);
require_once(__DIR__ . '/../../config.php');
require_once($CFG->libdir . "/clilib.php");
require_once($CFG->libdir . '/db/upgradelib.php');
// Supported options.
$long = ['fix' => false, 'help' => false];
$short = ['f' => 'fix', 'h' => 'help'];
// CLI options.
[$options, $unrecognized] = cli_get_params($long, $short);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
if ($options['help']) {
$help = <<<EOT
Fix orphaned calendar events.
This script detects calendar events that have had their
userid lost. By default it will perform various checks
and report them, showing the site status in an easy way.
Also, optionally (--fix), it wil try to recover as many
lost userids as possible from different sources. Note that
this script aims to process well-know events in core,
leaving custom events in 3rd part plugins mostly unmodified
because there isn't any consistent way to regenerate them.
For more details: https://tracker.moodle.org/browse/MDL-71156
Options:
-h, --help Print out this help.
-f, --fix Fix the orphaned calendar events in the DB.
If not specified only check and report problems to STDERR.
Usage:
- Only report: \$ sudo -u www-data /usr/bin/php admin/cli/fix_orphaned_calendar_events.php
- Report and fix: \$ sudo -u www-data /usr/bin/php admin/cli/fix_orphaned_calendar_events.php -f
EOT;
cli_writeln($help);
die;
}
// Check various usual pre-requisites.
if (empty($CFG->version)) {
cli_error('Database is not yet installed.');
}
$admin = get_admin();
if (!$admin) {
cli_error('Error: No admin account was found.');
}
if (moodle_needs_upgrading()) {
cli_error('Moodle upgrade pending, script execution suspended.');
}
// Do everything as admin by default.
\core\session\manager::set_user($admin);
// Report current site status.
cli_heading('Checking the site status');
$needsfix = upgrade_calendar_site_status();
// Report current calendar events status.
cli_heading('Checking the calendar events status');
$info = upgrade_calendar_events_status();
$hasbadevents = $info['total']->bad > 0 || $info['total']->bad != $info['other']->bad;
$needsfix = $needsfix || $hasbadevents;
// If, selected, fix as many calendar events as possible.
if ($options['fix']) {
// If the report has told us that the fix was not needed... ask for confirmation!
if (!$needsfix) {
cli_writeln("This site DOES NOT NEED to run the calendar events fix.");
$input = cli_input('Are you completely sure that you want to run the fix? (y/N)', 'N', ['y', 'Y', 'n', 'N']);
if (strtolower($input) != 'y') {
exit(0);
}
cli_writeln("");
}
cli_heading('Fixing as many as possible calendar events');
upgrade_calendar_events_fix_remaining($info);
// Report current (after fix) calendar events status.
cli_heading('Checking the calendar events status (after fix)');
upgrade_calendar_events_status();
} else if ($needsfix) {
// Fix option was not provided but problem events have been found. Notify the user and provide info how to fix these events.
cli_writeln("This site NEEDS to run the calendar events fix!");
cli_writeln("To fix the calendar events, re-run this script with the --fix option.");
}
-79
View File
@@ -1,79 +0,0 @@
<?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/>.
/**
* Generates a secure key for the current server (presuming it does not already exist).
*
* @package core_admin
* @copyright 2020 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use \core\encryption;
define('CLI_SCRIPT', true);
require(__DIR__ . '/../../config.php');
require_once($CFG->libdir . '/clilib.php');
// Get cli options.
[$options, $unrecognized] = cli_get_params(
['help' => false, 'method' => null],
['h' => 'help']);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
// TODO: MDL-71421 - Remove the openssl alternative once sodium becomes a requirement in Moodle 4.2.
if ($options['help']) {
echo "Generate secure key
This script manually creates a secure key within the secret data root folder (configured in
config.php as \$CFG->secretdataroot). You must run it using an account with access to write
to that folder.
In normal use Moodle automatically creates the key; this script is intended when setting up
a new Moodle system, for cases where the secure folder is not on shared storage and the key
may be manually installed on multiple servers.
Options:
-h, --help Print out this help
--method <method> Generate key for specified encryption method instead of default.
* sodium
* openssl-aes-256-ctr
Example:
php admin/cli/generate_key.php
";
exit;
}
$method = $options['method'];
if (encryption::key_exists($method)) {
echo 'Key already exists: ' . encryption::get_key_file($method) . "\n";
exit;
}
// Creates key with default permissions (no chmod).
echo "Generating key...\n";
encryption::create_key($method, false);
echo "\nKey created: " . encryption::get_key_file($method) . "\n\n";
echo "If the key folder is not shared storage, then key files should be copied to all servers.\n";
+190 -233
View File
@@ -74,8 +74,6 @@ Options:
--adminpass=PASSWORD Password for the moodle admin account,
required in non-interactive mode.
--adminemail=STRING Email address for the moodle admin account.
--sitepreset=STRING Admin site preset to be applied during the installation process.
--supportemail=STRING Email address for support and help.
--upgradekey=STRING The upgrade key to be set in the config.php, leave empty to not set it.
--non-interactive No interactive questions, installation fails if any
problem encountered.
@@ -148,9 +146,14 @@ define('PHPUNIT_TEST', false);
define('IGNORE_COMPONENT_CACHE', true);
// Check that PHP is of a sufficient version as soon as possible.
require_once(__DIR__.'/../../lib/phpminimumversionlib.php');
moodle_require_minimum_php_version();
// Check that PHP is of a sufficient version
if (version_compare(phpversion(), "5.6.5") < 0) {
$phpversion = phpversion();
// do NOT localise - lang strings would not work here and we CAN NOT move it after installib
fwrite(STDERR, "Moodle 3.2 or later requires at least PHP 5.6.5 (currently using version $phpversion).\n");
fwrite(STDERR, "Please upgrade your server software or install older Moodle version.\n");
exit(1);
}
// set up configuration
global $CFG;
@@ -217,11 +220,11 @@ 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'),
'sqlsrv' => moodle_database::get_driver_instance('sqlsrv', 'native'), // MS SQL*Server PHP driver
'mssql' => moodle_database::get_driver_instance('mssql', 'native'), // FreeTDS driver
);
foreach ($databases as $type=>$database) {
if ($database->driver_installed() !== true) {
@@ -256,8 +259,6 @@ list($options, $unrecognized) = cli_get_params(
'adminuser' => 'admin',
'adminpass' => '',
'adminemail' => '',
'sitepreset' => '',
'supportemail' => '',
'upgradekey' => '',
'non-interactive' => false,
'agree-license' => false,
@@ -271,7 +272,6 @@ 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);
@@ -280,12 +280,6 @@ if (array_key_exists($lang, $languages)) {
$CFG->lang = $lang;
}
// Set up site admin preset.
$sitepreset = clean_param($options['sitepreset'], PARAM_RAW);
if (!empty($sitepreset)) {
$CFG->setsitepresetduringinstall = $sitepreset;
}
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
@@ -403,6 +397,7 @@ if ($interactive) {
$CFG->wwwroot = $wwwroot;
$CFG->httpswwwroot = $CFG->wwwroot;
//We need dataroot before lang download
$CFG->dataroot = $options['dataroot'];
if ($interactive) {
@@ -453,7 +448,6 @@ if ($interactive) {
}
}
$CFG->tempdir = $CFG->dataroot.'/temp';
$CFG->backuptempdir = $CFG->tempdir.'/backup';
$CFG->cachedir = $CFG->dataroot.'/cache';
$CFG->localcachedir = $CFG->dataroot.'/localcache';
@@ -525,105 +519,100 @@ if ($interactive) {
$database = $databases[$CFG->dbtype];
// We cannot do any validation until all DB connection data is provided.
$hintdatabase = '';
do {
echo $hintdatabase;
// Ask for db host.
if ($interactive) {
cli_separator();
cli_heading(get_string('databasehost', 'install'));
if ($options['dbhost'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbhost']);
} else {
$prompt = get_string('clitypevalue', 'admin');
}
$CFG->dbhost = cli_input($prompt, $options['dbhost']);
// ask for db host
if ($interactive) {
cli_separator();
cli_heading(get_string('databasehost', 'install'));
if ($options['dbhost'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbhost']);
} else {
$CFG->dbhost = $options['dbhost'];
$prompt = get_string('clitypevalue', 'admin');
}
$CFG->dbhost = cli_input($prompt, $options['dbhost']);
// Ask for db name.
if ($interactive) {
cli_separator();
cli_heading(get_string('databasename', 'install'));
if ($options['dbname'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbname']);
} else {
$prompt = get_string('clitypevalue', 'admin');
}
$CFG->dbname = cli_input($prompt, $options['dbname']);
} else {
$CFG->dbhost = $options['dbhost'];
}
// ask for db name
if ($interactive) {
cli_separator();
cli_heading(get_string('databasename', 'install'));
if ($options['dbname'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbname']);
} else {
$CFG->dbname = $options['dbname'];
$prompt = get_string('clitypevalue', 'admin');
}
$CFG->dbname = cli_input($prompt, $options['dbname']);
// Ask for db prefix.
if ($interactive) {
cli_separator();
cli_heading(get_string('dbprefix', 'install'));
//TODO: solve somehow the prefix trouble for oci.
if ($options['prefix'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['prefix']);
} else {
$prompt = get_string('clitypevalue', 'admin');
}
$CFG->prefix = cli_input($prompt, $options['prefix']);
} else {
$CFG->dbname = $options['dbname'];
}
// ask for db prefix
if ($interactive) {
cli_separator();
cli_heading(get_string('dbprefix', 'install'));
//TODO: solve somehow the prefix trouble for oci
if ($options['prefix'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['prefix']);
} else {
$CFG->prefix = $options['prefix'];
$prompt = get_string('clitypevalue', 'admin');
}
$CFG->prefix = cli_input($prompt, $options['prefix']);
// Ask for db port.
if ($interactive) {
cli_separator();
cli_heading(get_string('databaseport', 'install'));
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbport']);
$CFG->dboptions['dbport'] = (int) cli_input($prompt, $options['dbport']);
} else {
$CFG->prefix = $options['prefix'];
}
// ask for db port
if ($interactive) {
cli_separator();
cli_heading(get_string('databaseport', 'install'));
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbport']);
$CFG->dboptions['dbport'] = (int)cli_input($prompt, $options['dbport']);
} else {
$CFG->dboptions['dbport'] = (int)$options['dbport'];
}
if ($CFG->dboptions['dbport'] <= 0) {
$CFG->dboptions['dbport'] = '';
}
// ask for db socket
if ($CFG->ostype === 'WINDOWS') {
$CFG->dboptions['dbsocket'] = '';
} else if ($interactive and empty($CFG->dboptions['dbport'])) {
cli_separator();
cli_heading(get_string('databasesocket', 'install'));
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbsocket']);
$CFG->dboptions['dbsocket'] = cli_input($prompt, $options['dbsocket']);
} else {
$CFG->dboptions['dbsocket'] = $options['dbsocket'];
}
// ask for db user
if ($interactive) {
cli_separator();
cli_heading(get_string('databaseuser', 'install'));
if ($options['dbuser'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbuser']);
} else {
$CFG->dboptions['dbport'] = (int) $options['dbport'];
}
if ($CFG->dboptions['dbport'] <= 0) {
$CFG->dboptions['dbport'] = '';
$prompt = get_string('clitypevalue', 'admin');
}
$CFG->dbuser = cli_input($prompt, $options['dbuser']);
// Ask for db socket.
if ($CFG->ostype === 'WINDOWS') {
$CFG->dboptions['dbsocket'] = '';
} else if ($interactive and empty($CFG->dboptions['dbport'])) {
cli_separator();
cli_heading(get_string('databasesocket', 'install'));
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbsocket']);
$CFG->dboptions['dbsocket'] = cli_input($prompt, $options['dbsocket']);
} else {
$CFG->dboptions['dbsocket'] = $options['dbsocket'];
}
// Ask for db user.
if ($interactive) {
cli_separator();
cli_heading(get_string('databaseuser', 'install'));
if ($options['dbuser'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbuser']);
} else {
$prompt = get_string('clitypevalue', 'admin');
}
$CFG->dbuser = cli_input($prompt, $options['dbuser']);
} else {
$CFG->dbuser = $options['dbuser'];
}
// Ask for db password.
if ($interactive) {
cli_separator();
cli_heading(get_string('databasepass', 'install'));
} else {
$CFG->dbuser = $options['dbuser'];
}
// ask for db password
if ($interactive) {
cli_separator();
cli_heading(get_string('databasepass', 'install'));
do {
if ($options['dbpass'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbpass']);
} else {
@@ -631,132 +620,110 @@ do {
}
$CFG->dbpass = cli_input($prompt, $options['dbpass']);
if (function_exists('distro_pre_create_db')) { // Hook for distros needing to do something before DB creation.
$distro = distro_pre_create_db($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix,
array('dbpersist' => 0, 'dbport' => $CFG->dboptions['dbport'], 'dbsocket' => $CFG->dboptions['dbsocket']),
$distro);
if (function_exists('distro_pre_create_db')) { // Hook for distros needing to do something before DB creation
$distro = distro_pre_create_db($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix, array('dbpersist'=>0, 'dbport'=>$CFG->dboptions['dbport'], 'dbsocket'=>$CFG->dboptions['dbsocket']), $distro);
}
$hintdatabase = install_db_validate($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix,
array('dbpersist' => 0, 'dbport' => $CFG->dboptions['dbport'], 'dbsocket' => $CFG->dboptions['dbsocket']));
$hint_database = install_db_validate($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix, array('dbpersist'=>0, 'dbport'=>$CFG->dboptions['dbport'], 'dbsocket'=>$CFG->dboptions['dbsocket']));
} while ($hint_database !== '');
} else {
$CFG->dbpass = $options['dbpass'];
$hintdatabase = install_db_validate($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix,
array('dbpersist' => 0, 'dbport' => $CFG->dboptions['dbport'], 'dbsocket' => $CFG->dboptions['dbsocket']));
if ($hintdatabase !== '') {
cli_error(get_string('dbconnectionerror', 'install'));
}
} else {
$CFG->dbpass = $options['dbpass'];
$hint_database = install_db_validate($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix, array('dbpersist'=>0, 'dbport'=>$CFG->dboptions['dbport'], 'dbsocket'=>$CFG->dboptions['dbsocket']));
if ($hint_database !== '') {
cli_error(get_string('dbconnectionerror', 'install'));
}
} while ($hintdatabase !== '');
}
// 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'));
// ask for fullname
if ($interactive) {
cli_separator();
cli_heading(get_string('fullsitename', 'moodle'));
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']));
if ($options['fullname'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['fullname']);
} else {
if (empty($options['fullname'])) {
$a = (object)['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'));
if ($options['shortname'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['shortname']);
} else {
$prompt = get_string('clitypevalue', 'admin');
}
do {
$options['shortname'] = cli_input($prompt, $options['shortname']);
} while (empty($options['shortname']));
} else {
if (empty($options['shortname'])) {
$a = (object)['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']);
} 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');
}
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'));
if ($options['shortname'] !== '') {
$prompt = get_string('clitypevaluedefault', 'admin', $options['shortname']);
} else {
if ((empty($options['adminpass']) or $options['adminpass'] === 'admin')) {
$a = (object)['option' => 'adminpass', 'value' => $options['adminpass']];
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
}
$prompt = get_string('clitypevalue', 'admin');
}
// 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']];
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 the support email address.
if ($interactive) {
cli_separator();
cli_heading(get_string('clisupportemail', 'install'));
$prompt = get_string('clitypevaluedefault', 'admin', $options['supportemail']);
$options['supportemail'] = cli_input($prompt, $options['supportemail']);
// 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');
}
// Validate that the support email address provided is valid.
if (!empty($options['supportemail']) && !validate_email($options['supportemail'])) {
$a = (object)['option' => 'supportemail', 'value' => $options['supportemail']];
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']);
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);
}
// 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();
@@ -775,27 +742,23 @@ if ($options['upgradekey'] !== '') {
$CFG->upgradekey = $options['upgradekey'];
}
// 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'));
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']) {
cli_error(get_string('climustagreelicense', 'install'));
}
}
// Finally we have all info needed for config.php
@@ -843,14 +806,8 @@ if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) {
cli_error(get_string('pluginschecktodo', 'admin'));
}
if (!$skipdatabase) {
if (!$options['skip-database']) {
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.
// This will build a cached version of the current theme for the user
// to immediately start browsing the site.
require_once($CFG->libdir.'/upgradelib.php');
upgrade_themes();
} else {
echo get_string('cliskipdatabase', 'install')."\n";
}
+13 -33
View File
@@ -56,17 +56,20 @@ Options:
--agree-license Indicates agreement with software license.
--fullname=STRING Name of the site
--shortname=STRING Name of the site
--summary=STRING The summary to be displayed on the front page
--supportemail=STRING Email address for support and help.
-h, --help Print out this help
Example:
\$sudo -u www-data /usr/bin/php admin/cli/install_database.php --lang=cs --adminpass=soMePass123 --agree-license
";
// Check that PHP is of a sufficient version as soon as possible.
require_once(__DIR__.'/../../lib/phpminimumversionlib.php');
moodle_require_minimum_php_version();
// Check that PHP is of a sufficient version
if (version_compare(phpversion(), "5.6.5") < 0) {
$phpversion = phpversion();
// do NOT localise - lang strings would not work here and we CAN NOT move it after installib
fwrite(STDERR, "Moodle 3.2 or later requires at least PHP 5.6.5 (currently using version $phpversion).\n");
fwrite(STDERR, "Please upgrade your server software or install older Moodle version.\n");
exit(1);
}
// Nothing to do if config.php does not exist
$configfile = __DIR__.'/../../config.php';
@@ -84,6 +87,11 @@ require_once($CFG->libdir.'/installlib.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->libdir.'/componentlib.class.php');
// make sure no tables are installed yet
if ($DB->get_tables() ) {
cli_error(get_string('clitablesexist', 'install'));
}
$CFG->early_install_lang = true;
get_string_manager(true);
@@ -98,8 +106,6 @@ list($options, $unrecognized) = cli_get_params(
'adminemail' => '',
'fullname' => '',
'shortname' => '',
'summary' => '',
'supportemail' => '',
'agree-license' => false,
'help' => false
),
@@ -108,22 +114,12 @@ list($options, $unrecognized) = cli_get_params(
)
);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
// We show help text even if tables are installed.
if ($options['help']) {
echo $help;
die;
}
// Make sure no tables are installed yet.
if ($DB->get_tables() ) {
cli_error(get_string('clitablesexist', 'install'));
}
if (!$options['agree-license']) {
cli_error('You have to agree to the license. --help prints out the help'); // TODO: localize
}
@@ -138,15 +134,6 @@ if (!empty($options['adminemail']) && !validate_email($options['adminemail'])) {
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
}
// Validate that the supportemail provided was an e-mail address.
if (!empty($options['supportemail']) && !validate_email($options['supportemail'])) {
$a = (object) [
'option' => 'supportemail',
'value' => $options['supportemail']
];
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
}
$options['lang'] = clean_param($options['lang'], PARAM_SAFEDIR);
if (!file_exists($CFG->dirroot.'/install/lang/'.$options['lang'])) {
$options['lang'] = 'en';
@@ -196,12 +183,5 @@ if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) {
install_cli_database($options, true);
// This needs to happen at the end to ensure it occurs after all caches
// have been purged for the last time.
// This will build a cached version of the current theme for the user
// to immediately start browsing the site.
require_once($CFG->libdir.'/upgradelib.php');
upgrade_themes();
echo get_string('cliinstallfinished', 'install')."\n";
exit(0); // 0 means success
-55
View File
@@ -1,55 +0,0 @@
<?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 script to kill all user sessions without asking for confirmation.
*
* @package core
* @subpackage cli
* @copyright 2017 Alexander Bias <alexander.bias@uni-ulm.de>
* @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');
list($options, $unrecognized) = cli_get_params(array('help' => false), array('h' => 'help'));
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized), 2);
}
if ($options['help']) {
$help =
"Kill all Moodle sessions
Options:
-h, --help Print out this help
Example:
\$sudo -u www-data /usr/bin/php admin/cli/kill_all_sessions.php
";
echo $help;
exit(0);
}
\core\session\manager::kill_all_sessions();
exit(0);
+8 -8
View File
@@ -119,7 +119,7 @@ if (!empty($options['collation'])) {
if ($dbcollation->value !== $collation || $dbcharset->value !== $charset) {
// Try to convert the DB.
echo "Converting database to '$collation' for $CFG->wwwroot:\n";
$sql = "ALTER DATABASE `$CFG->dbname` DEFAULT CHARACTER SET $charset DEFAULT COLLATE = $collation";
$sql = "ALTER DATABASE $CFG->dbname DEFAULT CHARACTER SET $charset DEFAULT COLLATE = $collation";
try {
$DB->change_database_structure($sql);
} catch (exception $e) {
@@ -146,7 +146,7 @@ if (!empty($options['collation'])) {
} else {
try {
$DB->change_database_structure("ALTER TABLE `$table->name` CONVERT TO CHARACTER SET $charset COLLATE $collation");
$DB->change_database_structure("ALTER TABLE $table->name CONVERT TO CHARACTER SET $charset COLLATE $collation");
echo "CONVERTED\n";
$converted++;
} catch (ddl_exception $e) {
@@ -163,7 +163,7 @@ if (!empty($options['collation'])) {
}
}
$sql = "SHOW FULL COLUMNS FROM `$table->name` WHERE collation IS NOT NULL";
$sql = "SHOW FULL COLUMNS FROM $table->name WHERE collation IS NOT NULL";
$rs2 = $DB->get_recordset_sql($sql);
foreach ($rs2 as $column) {
$column = (object)array_change_key_case((array)$column, CASE_LOWER);
@@ -181,7 +181,7 @@ if (!empty($options['collation'])) {
$notnull = ($column->null === 'NO') ? 'NOT NULL' : 'NULL';
$default = (!is_null($column->default) and $column->default !== '') ? "DEFAULT '$column->default'" : '';
// primary, unique and inc are not supported for texts
$sql = "ALTER TABLE `$table->name`
$sql = "ALTER TABLE $table->name
MODIFY COLUMN $column->field $column->type
CHARACTER SET $charset
COLLATE $collation $notnull $default";
@@ -192,11 +192,11 @@ if (!empty($options['collation'])) {
$default = !is_null($column->default) ? "DEFAULT '$column->default'" : '';
if ($rowformat != '') {
$sql = "ALTER TABLE `$table->name` $rowformat";
$sql = "ALTER TABLE $table->name $rowformat";
$DB->change_database_structure($sql);
}
$sql = "ALTER TABLE `$table->name`
$sql = "ALTER TABLE $table->name
MODIFY COLUMN $column->field $column->type
CHARACTER SET $charset
COLLATE $collation $notnull $default";
@@ -315,8 +315,8 @@ function mysql_set_row_format($tablename, $charset, $collation, $engine) {
if ($rs->row_format == 'Compact' || $rs->row_format == 'Redundant') {
$rowformat = $DB->get_row_format_sql($engine, $collation);
// Try to convert to compressed format and then try updating the collation again.
$DB->change_database_structure("ALTER TABLE `$tablename` $rowformat");
$DB->change_database_structure("ALTER TABLE `$tablename` CONVERT TO CHARACTER SET $charset COLLATE $collation");
$DB->change_database_structure("ALTER TABLE $tablename $rowformat");
$DB->change_database_structure("ALTER TABLE $tablename CONVERT TO CHARACTER SET $charset COLLATE $collation");
} else {
// Row format may not be the problem. Can not diagnose problem. Send fail reply.
return false;
+2 -2
View File
@@ -158,7 +158,7 @@ if (!empty($options['info'])) {
}
foreach ($fixtables as $table) {
$DB->change_database_structure("ALTER TABLE `{$prefix}$table` ROW_FORMAT=Compressed");
$DB->change_database_structure("ALTER TABLE {$prefix}$table ROW_FORMAT=Compressed");
echo str_pad($prefix . $table, 32, ' ', STR_PAD_RIGHT) . " ... Compressed\n";
}
@@ -189,7 +189,7 @@ if (!empty($options['info'])) {
echo "SET GLOBAL innodb_file_per_table=1;\n";
echo "SET GLOBAL innodb_file_format=Barracuda;\n";
foreach ($fixtables as $table) {
echo "ALTER TABLE `{$prefix}$table` ROW_FORMAT=Compressed;\n";
echo "ALTER TABLE {$prefix}$table ROW_FORMAT=Compressed;\n";
}
echo "\n";
exit(0);
+180
View File
@@ -0,0 +1,180 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* MySQL engine conversion tool.
*
* @package core
* @subpackage cli
* @copyright 2009 Petr Skoda (http://skodak.org)
* @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'); // cli only functions
if ($DB->get_dbfamily() !== 'mysql') {
cli_error('This function is designed for MySQL databases only!');
}
// now get cli options
list($options, $unrecognized) = cli_get_params(array('help'=>false, 'list'=>false, 'engine'=>false, 'available'=>false),
array('h'=>'help', 'l'=>'list', 'a'=>'available'));
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
$help =
"MySQL engine conversions script.
It is recommended to stop the web server before the conversion.
Do not use MyISAM if possible, because it is not ACID compliant
and does not support transactions.
Options:
--engine=ENGINE Convert MySQL tables to different engine
-l, --list Show table information
-a, --available Show list of available engines
-h, --help Print out this help
Example:
\$sudo -u www-data /usr/bin/php admin/cli/mysql_engine.php --engine=InnoDB
";
if (!empty($options['engine'])) {
$engines = mysql_get_engines();
$engine = clean_param($options['engine'], PARAM_ALPHA);
if (!isset($engines[strtoupper($engine)])) {
cli_error("Error: engine '$engine' is not available on this server!");
}
echo "Converting tables to '$engine' for $CFG->wwwroot:\n";
$prefix = $DB->get_prefix();
$prefix = str_replace('_', '\\_', $prefix);
$sql = "SHOW TABLE STATUS WHERE Name LIKE BINARY '$prefix%'";
$rs = $DB->get_recordset_sql($sql);
$converted = 0;
$skipped = 0;
$errors = 0;
foreach ($rs as $table) {
if (strtoupper($table->engine) === strtoupper($engine)) {
$newengine = mysql_get_table_engine($table->name);
echo str_pad($table->name, 40). " - NO CONVERSION NEEDED ($newengine)\n";
$skipped++;
continue;
}
echo str_pad($table->name, 40). " - ";
try {
$DB->change_database_structure("ALTER TABLE {$table->name} ENGINE = $engine");
$newengine = mysql_get_table_engine($table->name);
if (strtoupper($newengine) !== strtoupper($engine)) {
echo "ERROR ($newengine)\n";
$errors++;
continue;
}
echo "DONE ($newengine)\n";
$converted++;
} catch (moodle_exception $e) {
echo $e->getMessage()."\n";
$errors++;
continue;
}
}
$rs->close();
echo "Converted: $converted, skipped: $skipped, errors: $errors\n";
exit(0); // success
} else if (!empty($options['list'])) {
echo "List of tables for $CFG->wwwroot:\n";
$prefix = $DB->get_prefix();
$prefix = str_replace('_', '\\_', $prefix);
$sql = "SHOW TABLE STATUS WHERE Name LIKE BINARY '$prefix%'";
$rs = $DB->get_recordset_sql($sql);
$counts = array();
foreach ($rs as $table) {
if (isset($counts[$table->engine])) {
$counts[$table->engine]++;
} else {
$counts[$table->engine] = 1;
}
echo str_pad($table->engine, 10);
echo $table->name . "\n";
}
$rs->close();
echo "\n";
echo "Table engines summary for $CFG->wwwroot:\n";
foreach ($counts as $engine => $count) {
echo "$engine: $count\n";
}
exit(0); // success
} else if (!empty($options['available'])) {
echo "List of available MySQL engines for $CFG->wwwroot:\n";
$engines = mysql_get_engines();
foreach ($engines as $engine) {
echo " $engine\n";
}
die;
} else {
echo $help;
die;
}
// ========== Some functions ==============
function mysql_get_engines() {
global $DB;
$sql = "SHOW Engines";
$rs = $DB->get_recordset_sql($sql);
$engines = array();
foreach ($rs as $engine) {
if (strtoupper($engine->support) !== 'YES' and strtoupper($engine->support) !== 'DEFAULT') {
continue;
}
$engines[strtoupper($engine->engine)] = $engine->engine;
if (strtoupper($engine->support) === 'DEFAULT') {
$engines[strtoupper($engine->engine)] .= ' (default)';
}
}
$rs->close();
return $engines;
}
function mysql_get_table_engine($tablename) {
global $DB;
$engine = null;
$sql = "SHOW TABLE STATUS WHERE Name = '$tablename'"; // no special chars expected here
$rs = $DB->get_recordset_sql($sql);
if ($rs->valid()) {
$record = $rs->current();
$engine = $record->engine;
}
$rs->close();
return $engine;
}
+7 -30
View File
@@ -15,8 +15,6 @@
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* CLI script to purge caches without asking for confirmation.
*
* @package core
* @subpackage cli
* @copyright 2011 David Mudrak <david@moodle.com>
@@ -28,16 +26,7 @@ define('CLI_SCRIPT', true);
require(__DIR__.'/../../config.php');
require_once($CFG->libdir.'/clilib.php');
$longoptions = [
'help' => false,
'muc' => false,
'theme' => false,
'lang' => false,
'js' => false,
'filter' => false,
'other' => false
];
list($options, $unrecognized) = cli_get_params($longoptions, ['h' => 'help']);
list($options, $unrecognized) = cli_get_params(array('help' => false), array('h' => 'help'));
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
@@ -45,32 +34,20 @@ if ($unrecognized) {
}
if ($options['help']) {
// The indentation of this string is "wrong" but this is to avoid a extra whitespace in console output.
$help = <<<EOF
Invalidates Moodle internal caches
Specific caches can be defined (alone or in combination) using arguments. If none are specified,
all caches will be purged.
$help =
"Invalidates all Moodle internal caches
Options:
-h, --help Print out this help
--muc Purge all MUC caches (includes lang cache)
--theme Purge theme cache
--lang Purge language string cache
--js Purge JavaScript cache
--filter Purge text filter cache
--other Purge all file caches and other miscellaneous caches (may include MUC
if using cachestore_file).
Example:
\$ sudo -u www-data /usr/bin/php admin/cli/purge_caches.php
EOF;
\$sudo -u www-data /usr/bin/php admin/cli/purge_caches.php
";
echo $help;
exit(0);
}
purge_caches(array_filter($options));
purge_all_caches();
exit(0);
exit(0);
+1 -1
View File
@@ -94,7 +94,7 @@ if ($options['password'] == '' ) {
$errmsg = '';//prevent eclipse warning
if (!$options['ignore-password-policy'] ) {
if (!check_password_policy($password, $errmsg, $user)) {
if (!check_password_policy($password, $errmsg)) {
cli_error(html_to_text($errmsg, 0));
}
}
-109
View File
@@ -1,109 +0,0 @@
<?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()) {
throw new \moodle_exception('noadmins');
}
if (!file_exists($options['file'])) {
throw new \moodle_exception('filenotfound');
}
if (!$category = $DB->get_record('course_categories', ['id' => $options['categoryid']], 'id')) {
throw new \moodle_exception('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);
throw new \moodle_exception('generalexceptionmessage', 'error', '', $e->getMessage());
}
cli_heading(get_string('restoredcourseid', 'backup', $courseid));
exit(0);
-167
View File
@@ -1,167 +0,0 @@
<?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 task execution.
*
* @package core
* @subpackage cli
* @copyright 2014 Petr Skoda
* @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");
list($options, $unrecognized) = cli_get_params(
[
'help' => false,
'list' => false,
'execute' => false,
'showsql' => false,
'showdebugging' => false,
'force' => false,
], [
'h' => 'help',
'f' => 'force',
]
);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
if ($options['help'] or (!$options['list'] and !$options['execute'])) {
$help =
"Scheduled cron tasks.
Options:
--execute=\\some\\task Execute scheduled task manually
--list List all scheduled tasks
--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
";
echo $help;
die;
}
if ($options['showdebugging'] || !empty($CFG->showcrondebugging)) {
set_debugging(DEBUG_DEVELOPER, true);
}
if ($options['showsql'] || !empty($CFG->showcronsql)) {
$DB->set_debug(true);
}
if ($options['list']) {
cli_heading("List of scheduled tasks ($CFG->wwwroot)");
$shorttime = get_string('strftimedatetimeshort');
$tasks = \core\task\manager::get_all_scheduled_tasks();
echo str_pad(get_string('scheduledtasks', 'tool_task'), 50, ' ') . ' ' . str_pad(get_string('runpattern', 'tool_task'), 17, ' ')
. ' ' . str_pad(get_string('lastruntime', 'tool_task'), 40, ' ') . get_string('nextruntime', 'tool_task') . "\n";
foreach ($tasks as $task) {
$class = '\\' . get_class($task);
$schedule = $task->get_minute() . ' '
. $task->get_hour() . ' '
. $task->get_day() . ' '
. $task->get_day_of_week() . ' '
. $task->get_month() . ' '
. $task->get_day_of_week();
$nextrun = $task->get_next_run_time();
$lastrun = $task->get_last_run_time();
$plugininfo = core_plugin_manager::instance()->get_plugin_info($task->get_component());
$plugindisabled = $plugininfo && $plugininfo->is_enabled() === false && !$task->get_run_if_component_disabled();
if ($plugindisabled) {
$nextrun = get_string('plugindisabled', 'tool_task');
} else if ($task->get_disabled()) {
$nextrun = get_string('taskdisabled', 'tool_task');
} else if ($nextrun > time()) {
$nextrun = userdate($nextrun);
} else {
$nextrun = get_string('asap', 'tool_task');
}
if ($lastrun) {
$lastrun = userdate($lastrun);
} else {
$lastrun = get_string('never');
}
echo str_pad($class, 50, ' ') . ' ' . str_pad($schedule, 17, ' ') .
' ' . str_pad($lastrun, 40, ' ') . ' ' . $nextrun . "\n";
}
exit(0);
}
if ($execute = $options['execute']) {
if (!$task = \core\task\manager::get_scheduled_task($execute)) {
mtrace("Task '$execute' not found");
exit(1);
}
if (moodle_needs_upgrading()) {
mtrace("Moodle upgrade pending, cannot execute tasks.");
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);
// Emulate normal session - we use admin account by default.
\core\cron::setup_user();
// Execute the task.
\core\local\cli\shutdown::script_supports_graceful_exit();
$cronlockfactory = \core\lock\lock_config::get_lock_factory('cron');
if (!$cronlock = $cronlockfactory->get_lock('core_cron', 10)) {
mtrace('Cannot obtain cron lock');
exit(129);
}
if (!$lock = $cronlockfactory->get_lock('\\' . get_class($task), 10)) {
$cronlock->release();
mtrace('Cannot obtain task lock');
exit(130);
}
$task->set_lock($lock);
if (!$task->is_blocking()) {
$cronlock->release();
} else {
$task->set_cron_lock($cronlock);
}
\core\cron::run_inner_scheduled_task($task);
}
+7 -7
View File
@@ -38,17 +38,17 @@ if ($unrecognized) {
}
// If necessary add files that should be ignored - such as in 3rd party plugins.
$ignorelist = array();
$blacklist = 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', $ignorelist);
core_admin_recurse_svgs($path, '', 'core_admin_svgtool_ie9fix', $blacklist);
} else if ($options['noaspectratio']) {
core_admin_recurse_svgs($path, '', 'core_admin_svgtool_noaspectratio', $ignorelist);
core_admin_recurse_svgs($path, '', 'core_admin_svgtool_noaspectratio', $blacklist);
} else {
$help =
@@ -153,9 +153,9 @@ function core_admin_svgtool_noaspectratio($file) {
* @param string $base
* @param string $sub
* @param string $filecallback
* @param array $ignorelist List of files to be ignored and skipped.
* @param array $blacklist
*/
function core_admin_recurse_svgs($base, $sub, $filecallback, $ignorelist) {
function core_admin_recurse_svgs($base, $sub, $filecallback, $blacklist) {
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, $ignorelist) {
continue;
}
$file = $item->getFilename();
core_admin_recurse_svgs("$base/$sub", $file, $filecallback, $ignorelist);
core_admin_recurse_svgs("$base/$sub", $file, $filecallback, $blacklist);
}
unset($item);
unset($items);
@@ -174,7 +174,7 @@ function core_admin_recurse_svgs($base, $sub, $filecallback, $ignorelist) {
return;
}
$file = realpath("$base/$sub");
if (in_array($file, $ignorelist)) {
if (in_array($file, $blacklist)) {
return;
}
$filecallback($file);
-183
View File
@@ -1,183 +0,0 @@
<?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 script to uninstall plugins.
*
* @package core
* @subpackage cli
* @copyright 2018 Dmitrii Metelkin <dmitriim@catalyst-au.net>
* @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->libdir . '/adminlib.php');
$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
--run Execute uninstall. If this option is not set, then the script will be run in a dry mode.
--showsql Show sql queries before they are executed.
--showdebugging Show developer level debugging information.
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.
# php uninstall_plugins.php --purge-missing
A dry run of uninstalling all missing plugins.
# php uninstall_plugins.php --purge-missing --run
Run uninstall of all missing plugins.
# php uninstall_plugins.php --plugins=mod_assign,mod_forum
A dry run of uninstalling mod_assign and mod_forum plugins.
# php uninstall_plugins.php --plugins=mod_assign,mod_forum --run
Run uninstall for mod_assign and mod_forum plugins.
";
list($options, $unrecognised) = cli_get_params([
'help' => false,
'show-all' => false,
'show-contrib' => false,
'show-missing' => false,
'purge-missing' => false,
'plugins' => false,
'run' => false,
'showsql' => false,
'showdebugging' => false,
], [
'h' => 'help'
]);
if ($unrecognised) {
$unrecognised = implode(PHP_EOL.' ', $unrecognised);
cli_error(get_string('cliunknowoption', 'core_admin', $unrecognised));
}
if ($options['help']) {
cli_writeln($help);
exit(0);
}
if ($options['showdebugging']) {
set_debugging(DEBUG_DEVELOPER, true);
}
if ($options['showsql']) {
$DB->set_debug(true);
}
$pluginman = core_plugin_manager::instance();
$plugininfo = $pluginman->get_plugins();
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'] || $options['show-contrib']) {
cli_writeln($pluginstring);
} else {
if ($plugin->get_status() === core_plugin_manager::PLUGIN_STATUS_MISSING) {
cli_writeln($pluginstring);
}
}
}
}
exit(0);
}
if ($options['purge-missing']) {
foreach ($plugininfo as $type => $plugins) {
foreach ($plugins as $name => $plugin) {
if ($plugin->get_status() === core_plugin_manager::PLUGIN_STATUS_MISSING) {
$pluginstring = $plugin->component . "\t" . $plugin->displayname;
if ($pluginman->can_uninstall_plugin($plugin->component)) {
if ($options['run']) {
cli_writeln('Uninstalling: ' . $pluginstring);
$progress = new progress_trace_buffer(new text_progress_trace(), true);
$pluginman->uninstall_plugin($plugin->component, $progress);
$progress->finished();
cli_write($progress->get_buffer());
} else {
cli_writeln('Will be uninstalled: ' . $pluginstring);
}
} else {
cli_writeln('Can not be uninstalled: ' . $pluginstring);
}
}
}
}
exit(0);
}
if ($options['plugins']) {
$components = explode(',', $options['plugins']);
foreach ($components as $component) {
$plugin = $pluginman->get_plugin_info($component);
if (is_null($plugin)) {
cli_writeln('Unknown plugin: ' . $component);
} else {
$pluginstring = $plugin->component . "\t" . $plugin->displayname;
if ($pluginman->can_uninstall_plugin($plugin->component)) {
if ($options['run']) {
cli_writeln('Uninstalling: ' . $pluginstring);
$progress = new progress_trace_buffer(new text_progress_trace(), true);
$pluginman->uninstall_plugin($plugin->component, $progress);
$progress->finished();
cli_write($progress->get_buffer());
} else {
cli_writeln('Will be uninstalled: ' . $pluginstring);
}
} else {
cli_writeln('Can not be uninstalled: ' . $pluginstring);
}
}
}
exit(0);
}
cli_writeln($help);
exit(0);
+27 -155
View File
@@ -48,16 +48,10 @@ require_once($CFG->libdir.'/environmentlib.php');
$lang = isset($SESSION->lang) ? $SESSION->lang : $CFG->lang;
list($options, $unrecognized) = cli_get_params(
array(
'allow-unstable' => false,
'help' => false,
'is-maintenance-required' => false,
'is-pending' => false,
'lang' => $lang,
'maintenance' => true,
'non-interactive' => false,
'set-ui-upgrade-lock' => false,
'unset-ui-upgrade-lock' => false,
'verbose-settings' => false,
'non-interactive' => false,
'allow-unstable' => false,
'help' => false,
'lang' => $lang
),
array(
'h' => 'help'
@@ -83,35 +77,14 @@ Please note you must execute this script with the same uid as apache!
Site defaults may be changed via local/defaults.php.
Options:
--allow-unstable Upgrade even if the version is not marked as stable yet,
required in non-interactive mode.
-h, --help Print out this help.
--is-maintenance-required Returns exit code 2 if the upgrade requires maintenance mode.
Returns exit code 3 if no maintenance is required for the upgrade.
--is-pending Exit with error code 2 if an upgrade is required.
--lang=CODE Set preferred language for CLI output. Defaults to the
site language if not set. Defaults to 'en' if the lang
parameter is invalid or if the language pack is not
installed.
--maintenance Sets whether this upgrade will use maintenance mode.
If not possible, the upgrade will not happen and the script will exit.
WARNING: Caches (except theme) will be STALE and MUST be purged after upgrading.
DO NOT USE if the upgrade contains known breaking changes to the way data
and the database interact.
RECOMMENDED for lightweight deployments, to allow for a graceful purge and
rebuild of the cache.
--non-interactive No interactive questions or confirmations.
--set-ui-upgrade-lock Sets the upgrade to CLI only and unable to be triggered from the frontend.
If called with --maintenance=false, the lock WILL NOT be released when the
upgrade finishes, and MUST be manually removed.
If called with --is-maintenance-required before an upgrade,
The lock WILL be released when the upgrade finishes.
--unset-ui-upgrade-lock Removes the frontend upgrade lock, if the lock exists.
Useful when an error during the upgrade leaves the upgrade locked,
or there is need to control the time where the unlock happens.
--verbose-settings Show new settings values. By default only the name of
new core or plugin settings are displayed. This option
outputs the new values as well as the setting name.
--non-interactive No interactive questions or confirmations
--allow-unstable Upgrade even if the version is not marked as stable yet,
required in non-interactive mode.
--lang=CODE Set preferred language for CLI output. Defaults to the
site language if not set. Defaults to 'en' if the lang
parameter is invalid or if the language pack is not
installed.
-h, --help Print out this help
Example:
\$sudo -u www-data /usr/bin/php admin/cli/upgrade.php
@@ -135,60 +108,10 @@ if ($version < $CFG->version) {
$oldversion = "$CFG->release ($CFG->version)";
$newversion = "$release ($version)";
if ($options['unset-ui-upgrade-lock']) {
// Unconditionally unset this config if requested.
set_config('outagelessupgrade', false);
cli_writeln(get_string('cliupgradeunsetlock', 'admin'));
}
$allhash = core_component::get_all_component_hash();
// Initialise allcomponent hash if not set. It will be correctly set after upgrade.
$CFG->allcomponenthash = $CFG->allcomponenthash ?? '';
if (!$options['maintenance']) {
if ($allhash !== $CFG->allcomponenthash) {
// Throw an error here, we can't proceed, this needs to set maintenance.
cli_error(get_string('cliupgrademaintenancerequired', 'core_admin'), 2);
}
// Set a constant to stop any upgrade var from being set during processing.
// This protects against the upgrade setting timeouts and maintenance during the upgrade.
define('CLI_UPGRADE_RUNNING', true);
// This database control is the control to block the GUI from doing upgrade related actions.
set_config('outagelessupgrade', true);
}
// We should ignore all upgrade locks here.
if (!moodle_needs_upgrading(false)) {
if (!moodle_needs_upgrading()) {
cli_error(get_string('cliupgradenoneed', 'core_admin', $newversion), 0);
}
// Handle exit based options for outputting upgrade state.
if ($options['is-pending'] || $options['is-maintenance-required']) {
// If we aren't doing a maintenance check, plain pending check.
if (!$options['is-maintenance-required']) {
cli_error(get_string('cliupgradepending', 'core_admin'), 2);
}
// Can we do this safely with no maintenance/outage? Detect if there is a schema or other application state change.
if ($allhash !== $CFG->allcomponenthash) {
// State change here, we need to do this in maintenance.
cli_writeln(get_string('cliupgradepending', 'core_admin'));
cli_error(get_string('cliupgrademaintenancerequired', 'core_admin'), 2);
}
// If requested, we should always set the upgrade lock here, so this cannot be run from frontend.
if ($options['set-ui-upgrade-lock']) {
set_config('outagelessupgrade', true);
cli_writeln(get_string('cliupgradesetlock', 'admin'));
}
// We can do an upgrade without maintenance!
cli_writeln(get_string('cliupgradepending', 'core_admin'));
cli_error(get_string('cliupgrademaintenancenotrequired', 'core_admin'), 3);
}
// Test environment first.
list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE);
if (!$envstatus) {
@@ -201,27 +124,17 @@ if (!$envstatus) {
exit(1);
}
// Make sure there are no files left over from previous versions.
if (upgrade_stale_php_files_present()) {
cli_problem(get_string('upgradestalefiles', 'admin'));
// Stale file info contains HTML elements which aren't suitable for CLI.
$upgradestalefilesinfo = get_string('upgradestalefilesinfo', 'admin', get_docs_url('Upgrading'));
cli_error(strip_tags($upgradestalefilesinfo));
}
// Test plugin dependencies.
$failed = array();
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed, $CFG->branch)) {
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) {
cli_problem(get_string('pluginscheckfailed', 'admin', array('pluginslist' => implode(', ', array_unique($failed)))));
cli_error(get_string('pluginschecktodo', 'admin'));
}
$a = new stdClass();
$a->oldversion = $oldversion;
$a->newversion = $newversion;
if ($interactive) {
$a = new stdClass();
$a->oldversion = $oldversion;
$a->newversion = $newversion;
echo cli_heading(get_string('databasechecking', '', $a)) . PHP_EOL;
}
@@ -253,18 +166,12 @@ if ($interactive) {
}
if ($version > $CFG->version) {
// Only purge caches if this is a plain upgrade.
// In the case of a no-outage upgrade, we will gracefully roll caches after upgrade.
if ($options['maintenance']) {
// We purge all of MUC's caches here.
// Caches are disabled for upgrade by CACHE_DISABLE_ALL so we must set the first arg to true.
// This ensures a real config object is loaded and the stores will be purged.
// This is the only way we can purge custom caches such as memcache or APC.
// Note: all other calls to caches will still used the disabled API.
cache_helper::purge_all(true);
}
// We purge all of MUC's caches here.
// Caches are disabled for upgrade by CACHE_DISABLE_ALL so we must set the first arg to true.
// This ensures a real config object is loaded and the stores will be purged.
// This is the only way we can purge custom caches such as memcache or APC.
// Note: all other calls to caches will still used the disabled API.
cache_helper::purge_all(true);
upgrade_core($version, true);
}
set_config('release', $release);
@@ -276,44 +183,9 @@ upgrade_noncore(true);
// log in as admin - we need doanything permission when applying defaults
\core\session\manager::set_user(get_admin());
// Apply default settings and output those that have changed.
cli_heading(get_string('cliupgradedefaultheading', 'admin'));
$settingsoutput = admin_apply_default_settings(null, false);
foreach ($settingsoutput as $setting => $value) {
if ($options['verbose-settings']) {
$stringvlaues = array(
'name' => $setting,
'defaultsetting' => var_export($value, true) // Expand objects.
);
echo get_string('cliupgradedefaultverbose', 'admin', $stringvlaues) . PHP_EOL;
} else {
echo get_string('cliupgradedefault', 'admin', $setting) . PHP_EOL;
}
}
// This needs to happen at the end to ensure it occurs after all caches
// have been purged for the last time.
// This will build a cached version of the current theme for the user
// to immediately start browsing the site.
upgrade_themes();
echo get_string('cliupgradefinished', 'admin', $a)."\n";
if (!$options['maintenance']) {
cli_writeln(get_string('cliupgradecompletenomaintenanceupgrade', 'admin'));
// Here we check if upgrade lock has not been specifically set during this upgrade run.
// This supports wider server orchestration actions happening, which should call with no-maintenance AND set-ui-upgrade-lock,
// such as a new docker container deployment, of which the moodle upgrade is only a component.
if (!$options['set-ui-upgrade-lock']) {
// In this case we should release the lock now, as the upgrade is finished.
// We weren't told to keep the lock with set-ui-upgrade-lock, so release.
set_config('outagelessupgrade', false);
}
}
// apply all default settings, just in case do it twice to fill all defaults
admin_apply_default_settings(NULL, false);
admin_apply_default_settings(NULL, false);
echo get_string('cliupgradefinished', 'admin')."\n";
exit(0); // 0 means success
-87
View File
@@ -1,87 +0,0 @@
<?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/>.
/**
* Content bank and its plugins settings.
*
* @package core
* @subpackage contentbank
* @copyright 2020 Amaia Anabitarte <amaia@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once('../config.php');
require_once($CFG->libdir.'/adminlib.php');
$action = required_param('action', PARAM_ALPHANUMEXT);
$name = required_param('name', PARAM_PLUGIN);
$syscontext = context_system::instance();
$PAGE->set_url('/admin/contentbank.php');
$PAGE->set_context($syscontext);
require_admin();
require_sesskey();
$return = new moodle_url('/admin/settings.php', array('section' => 'managecontentbanktypes'));
$plugins = core_plugin_manager::instance()->get_plugins_of_type('contenttype');
$sortorder = array_flip(array_keys($plugins));
if (!isset($plugins[$name])) {
throw new \moodle_exception('contenttypenotfound', 'error', $return, $name);
}
switch ($action) {
case 'disable':
if ($plugins[$name]->is_enabled()) {
$class = \core_plugin_manager::resolve_plugininfo_class('contenttype');
$class::enable_plugin($name, false);
}
break;
case 'enable':
if (!$plugins[$name]->is_enabled()) {
$class = \core_plugin_manager::resolve_plugininfo_class('contenttype');
$class::enable_plugin($name, true);
}
break;
case 'up':
if ($sortorder[$name]) {
$currentindex = $sortorder[$name];
$seq = array_keys($plugins);
$seq[$currentindex] = $seq[$currentindex - 1];
$seq[$currentindex - 1] = $name;
set_config('contentbank_plugins_sortorder', implode(',', $seq));
core_plugin_manager::reset_caches();
}
break;
case 'down':
if ($sortorder[$name] < count($sortorder) - 1) {
$currentindex = $sortorder[$name];
$seq = array_keys($plugins);
$seq[$currentindex] = $seq[$currentindex + 1];
$seq[$currentindex + 1] = $name;
set_config('contentbank_plugins_sortorder', implode(',', $seq));
core_plugin_manager::reset_caches();
}
break;
}
$cache = cache::make('core', 'contentbank_enabled_extensions');
$cache->purge();
$cache = cache::make('core', 'contentbank_context_extensions');
$cache->purge();
redirect($return);
-79
View File
@@ -1,79 +0,0 @@
<?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/>.
/**
* Reset course indentation
*
* @copyright 2023 Amaia Anabitarte <amaia@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once('../../config.php');
require_admin();
$format = required_param('format', PARAM_PLUGIN);
$confirm = optional_param('confirm', false, PARAM_BOOL);
$backurl = new moodle_url('/admin/settings.php', ['section' => 'formatsetting'.$format]);
$PAGE->set_url('/admin/course/resetindentation.php', ['format' => $format]);
$PAGE->set_context(context_system::instance());
if ($confirm) {
require_sesskey();
$courses = $DB->get_records('course', ['format' => $format], 'id', 'id');
if (!empty($courses)) {
$courseids = array_keys($courses);
list($courseinsql, $courseparams) = $DB->get_in_or_equal($courseids, SQL_PARAMS_NAMED, 'course');
$DB->set_field_select('course_modules', 'indent', '0', "course $courseinsql AND indent <> 0", $courseparams);
rebuild_course_cache(0, true);
}
redirect(
$backurl,
get_string('resetindentationsuccess', 'admin'),
null,
\core\output\notification::NOTIFY_SUCCESS
);
}
$strtitle = get_string('resetindentation', 'admin');
$PAGE->set_title($strtitle);
$PAGE->set_heading($strtitle);
navigation_node::override_active_url(new moodle_url(
'/admin/course/resetindentation.php',
['action' => 'confirm', 'format' => $format]
));
echo $OUTPUT->header();
$displayoptions = ['confirmtitle' => get_string('resetindentation_title', 'admin')];
$confirmbutton = new single_button(
new moodle_url('/admin/course/resetindentation.php', ['confirm' => 1, 'format' => $format, 'sesskey' => sesskey()]),
get_string('resetindentation', 'admin'),
'post',
single_button::BUTTON_DANGER
);
$cancelbutton = new single_button($backurl, get_string('cancel'));
echo $OUTPUT->confirm(
get_string('resetindentation_help', 'admin', ['format' => get_string('pluginname', 'format_'.$format)]),
$confirmbutton,
$cancelbutton,
$displayoptions
);
echo $OUTPUT->footer();
+10 -6
View File
@@ -32,7 +32,8 @@ $syscontext = context_system::instance();
$PAGE->set_url('/admin/courseformats.php');
$PAGE->set_context($syscontext);
require_admin();
require_login();
require_capability('moodle/site:config', $syscontext);
require_sesskey();
$return = new moodle_url('/admin/settings.php', array('section' => 'manageformats'));
@@ -41,20 +42,23 @@ $formatplugins = core_plugin_manager::instance()->get_plugins_of_type('format');
$sortorder = array_flip(array_keys($formatplugins));
if (!isset($formatplugins[$formatname])) {
throw new \moodle_exception('courseformatnotfound', 'error', $return, $formatname);
print_error('courseformatnotfound', 'error', $return, $formatname);
}
switch ($action) {
case 'disable':
if ($formatplugins[$formatname]->is_enabled()) {
$class = \core_plugin_manager::resolve_plugininfo_class('format');
$class::enable_plugin($formatname, false);
if (get_config('moodlecourse', 'format') === $formatname) {
print_error('cannotdisableformat', 'error', $return);
}
set_config('disabled', 1, 'format_'. $formatname);
core_plugin_manager::reset_caches();
}
break;
case 'enable':
if (!$formatplugins[$formatname]->is_enabled()) {
$class = \core_plugin_manager::resolve_plugininfo_class('format');
$class::enable_plugin($formatname, true);
unset_config('disabled', 'format_'. $formatname);
core_plugin_manager::reset_caches();
}
break;
case 'up':
+9 -8
View File
@@ -1,4 +1,5 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
@@ -35,7 +36,6 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
// phpcs:ignoreFile moodle.Files.MoodleInternal.MoodleInternalGlobalState
if (defined('STDIN')) {
fwrite(STDERR, "ERROR: This script no longer supports CLI, please use admin/cli/cron.php instead\n");
@@ -49,7 +49,8 @@ define('WEB_CRON_EMULATED_CLI', 'defined'); // ugly ugly hack, do not use elsewh
define('NO_OUTPUT_BUFFERING', true);
require('../config.php');
require_once($CFG->libdir . '/clilib.php');
require_once($CFG->libdir.'/clilib.php');
require_once($CFG->libdir.'/cronlib.php');
// extra safety
\core\session\manager::write_close();
@@ -57,7 +58,7 @@ require_once($CFG->libdir . '/clilib.php');
// check if execution allowed
if (!empty($CFG->cronclionly)) {
// This script can only be run via the cli.
throw new \moodle_exception('cronerrorclionly', 'admin');
print_error('cronerrorclionly', 'admin');
exit;
}
// This script is being called via the web, so check the password if there is one.
@@ -65,16 +66,16 @@ if (!empty($CFG->cronremotepassword)) {
$pass = optional_param('password', '', PARAM_RAW);
if ($pass != $CFG->cronremotepassword) {
// wrong password.
throw new \moodle_exception('cronerrorpassword', 'admin');
print_error('cronerrorpassword', 'admin');
exit;
}
}
// Send mime type and encoding.
// send mime type and encoding
@header('Content-Type: text/plain; charset=utf-8');
// We do not want html markup in emulated CLI.
// we do not want html markup in emulated CLI
@ini_set('html_errors', 'off');
// Execute the cron, disabling keepalive.
\core\cron::run_main_process(0);
// execute the cron
cron_run();
-61
View File
@@ -1,61 +0,0 @@
<?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/>.
/**
* Allows the admin to enable, disable and uninstall custom fields
*
* @package core_admin
* @copyright 2018 Daniel Neis Araujo
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once('../config.php');
require_once($CFG->libdir.'/adminlib.php');
$action = required_param('action', PARAM_ALPHANUMEXT);
$customfieldname = required_param('field', PARAM_PLUGIN);
$syscontext = context_system::instance();
$PAGE->set_url('/admin/customfields.php');
$PAGE->set_context($syscontext);
require_admin();
require_sesskey();
$return = new moodle_url('/admin/settings.php', array('section' => 'managecustomfields'));
$customfieldplugins = core_plugin_manager::instance()->get_plugins_of_type('customfield');
$sortorder = array_flip(array_keys($customfieldplugins));
if (!isset($customfieldplugins[$customfieldname])) {
throw new \moodle_exception('customfieldnotfound', 'error', $return, $customfieldname);
}
switch ($action) {
case 'disable':
if ($customfieldplugins[$customfieldname]->is_enabled()) {
$class = \core_plugin_manager::resolve_plugininfo_class('customfield');
$class::enable_plugin($customfieldname, false);
}
break;
case 'enable':
if (!$customfieldplugins[$customfieldname]->is_enabled()) {
$class = \core_plugin_manager::resolve_plugininfo_class('customfield');
$class::enable_plugin($customfieldname, true);
}
break;
}
redirect($return);
+8 -6
View File
@@ -33,7 +33,8 @@ $syscontext = context_system::instance();
$PAGE->set_url('/admin/dataformats.php');
$PAGE->set_context($syscontext);
require_admin();
require_login();
require_capability('moodle/site:config', $syscontext);
require_sesskey();
$return = new moodle_url('/admin/settings.php', array('section' => 'managedataformats'));
@@ -42,20 +43,20 @@ $plugins = core_plugin_manager::instance()->get_plugins_of_type('dataformat');
$sortorder = array_flip(array_keys($plugins));
if (!isset($plugins[$name])) {
throw new \moodle_exception('courseformatnotfound', 'error', $return, $name);
print_error('courseformatnotfound', 'error', $return, $name);
}
switch ($action) {
case 'disable':
if ($plugins[$name]->is_enabled()) {
$class = \core_plugin_manager::resolve_plugininfo_class('dataformat');
$class::enable_plugin($name, false);
set_config('disabled', 1, 'dataformat_'. $name);
core_plugin_manager::reset_caches();
}
break;
case 'enable':
if (!$plugins[$name]->is_enabled()) {
$class = \core_plugin_manager::resolve_plugininfo_class('dataformat');
$class::enable_plugin($name, true);
unset_config('disabled', 'dataformat_'. $name);
core_plugin_manager::reset_caches();
}
break;
case 'up':
@@ -78,3 +79,4 @@ switch ($action) {
break;
}
redirect($return);

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