Compare commits

..

1295 Commits

Author SHA1 Message Date
Eloy Lafuente (stronk7) edab0782a3 Moodle release 3.1.4 2017-01-08 11:04:30 +01:00
AMOS bot ea40017100 Automatically generated installer lang files 2017-01-08 00:05:17 +08:00
Dan Poltawski cef7920cd1 weekly release 3.1.3+ 2017-01-06 01:30:54 +00:00
Dan Poltawski ea69f5f78f Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2017-01-06 01:30:53 +00:00
David Mudrák 29c56ec89e 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:40:13 +01:00
Dan Poltawski cb84158ba7 Merge branch 'MDL-57563-31-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2017-01-05 10:11:42 +00:00
Helen Foster 530656cedb MDL-57563 lang: Merge English strings from the en_fix language pack 2017-01-05 10:46:12 +01:00
Rajesh Taneja d33d5f302e 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:11 +00:00
AMOS bot 6302ddbece Automatically generated installer lang files 2017-01-05 00:05:35 +08:00
Dan Poltawski 3ad6c077d9 Merge branch 'MDL-57531-31-phpmailer' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2017-01-04 13:33:46 +00:00
David Mudrák f3d6e11ca0 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 13:05:03 +01:00
David Mudrák 7d1d26c48d MDL-57531 mail: Do not let admins set invalid email addresses
The noreply and support emails should always be valid.
2017-01-04 12:43:12 +01:00
Eloy Lafuente (stronk7) 14cc2f7d83 Merge branch 'MDL-57192-31' of git://github.com/ankitagarwal/moodle into MOODLE_31_STABLE 2017-01-04 11:59:02 +01:00
David Mudrák a910f710fc 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 10:36:29 +00:00
David Monllao df676dea41 Merge branch 'm31_MDL-49557' of git://github.com/danmarsden/moodle into MOODLE_31_STABLE 2017-01-04 06:14:31 +01:00
Ankit Agarwal a331b1d791 MDL-57192 dml: Temporarily disable query logging during setup 2017-01-04 08:17:52 +05:30
Dan Marsden d0c5c6e60c MDL-49557 mod_scorm: optionally strip quotes. 2017-01-04 15:45:38 +13:00
Ankit Agarwal 8684514333 MDL-57192 dml: Support temporarily disabling query logs during setup 2017-01-04 08:06:22 +05:30
Andrew Nicols e6a855e81d MDL-56225 mod_forum: Remove unnecessary attributes from update 2017-01-03 16:58:47 +00:00
Eloy Lafuente (stronk7) 274c7ad7da Merge branch 'wip-mdl-57494-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2017-01-03 02:35:21 +01:00
Davo Smith 00b860d0d1 MDL-47198 filelib: fix curl handling headers with no value 2017-01-02 16:44:01 +01:00
Dan Poltawski 65e7dd7798 Merge branch 'm31_MDL-49557' of git://github.com/danmarsden/moodle into MOODLE_31_STABLE 2017-01-02 12:35:11 +00:00
Dan Poltawski 8dea0f4533 Merge branch 'MDL-57080-m31' of https://github.com/micaherne/moodle into MOODLE_31_STABLE 2017-01-02 12:15:04 +00:00
Dan Poltawski 28bb924937 Merge branch 'wip-MDL-57464-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2017-01-02 11:16:22 +00:00
AMOS bot f556e14028 Automatically generated installer lang files 2016-12-30 00:05:34 +08:00
Dan Poltawski 3b95075ddd Merge branch 'MDL-57512-31' of git://github.com/crazyserver/moodle into MOODLE_31_STABLE 2016-12-29 11:50:59 +00:00
Dan Poltawski eb9aa63303 Merge branch 'm31_MDL-50643' of git://github.com/danmarsden/moodle into MOODLE_31_STABLE 2016-12-29 11:46:50 +00:00
Pau Ferrer Ocaña 0ebebc2552 MDL-57512 categories: Use maxcategorydepth only when getting all cats 2016-12-29 12:09:57 +01:00
David Monllao 104a76930d Merge branch 'MDL-57338-31' of git://github.com/danpoltawski/moodle into MOODLE_31_STABLE 2016-12-29 10:52:47 +01:00
Dan Poltawski 977b92dd0b Merge branch 'MDL-55955_31' of git://github.com/markn86/moodle into MOODLE_31_STABLE 2016-12-28 15:11:58 +00:00
Dan Poltawski 9ff6b6d5fa Merge branch 'wip-MDL-57366-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-12-28 15:05:59 +00:00
David Monllao c5be0c6b22 Merge branch 'MDL-52366-31-mustachethemedir' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-12-28 12:24:14 +01:00
Dan Marsden 751e80769c MDL-49557 mod_scorm: fix AICC pre-requisite handling. 2016-12-28 10:09:44 +13:00
AMOS bot 845cf5b198 Automatically generated installer lang files 2016-12-27 00:09:29 +08:00
AMOS bot 0dff58bb16 Automatically generated installer lang files 2016-12-26 00:06:07 +08:00
AMOS bot 1f859dd6d7 Automatically generated installer lang files 2016-12-25 00:04:46 +08:00
Adrian Greeve c27a165ccf MDL-57464 mod_lesson: fix notice with sub-clusters. 2016-12-23 11:13:13 +08:00
Jake Dallimore 39fc6c210e MDL-57357 auth: add behat coverage for remember username login feature 2016-12-23 11:11:37 +08:00
Adrian Greeve 4f2c239ea4 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:37:40 +08:00
Mark Nelson 84f6435a14 MDL-55955 mod_quiz: ensure duplicated override events are removed 2016-12-23 10:02:55 +08:00
Dan Marsden 850e56c5c6 MDL-50643 mod_scorm: redirect using current window instead of parent. 2016-12-23 10:18:15 +13:00
Dan Poltawski 5f0e1523f7 MDL-57338 templates: add missing example context 2016-12-22 13:02:57 +00:00
Michael Aherne 9a177e48f3 MDL-57080 completion: Update completion expected date on reset 2016-12-22 11:50:06 +00:00
Dan Poltawski 6b5bff8870 weekly release 3.1.3+ 2016-12-22 08:15:11 +00:00
Dan Poltawski 0d5aa55fb6 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-12-22 08:15:10 +00:00
Rajesh Taneja 8d9d32653b 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:46:05 +08:00
David Monllao af63b87738 Merge branch 'MDL-55575_B_31' of https://github.com/bostelm/moodle into MOODLE_31_STABLE 2016-12-21 05:50:32 +01:00
AMOS bot 9ca2bb46f4 Automatically generated installer lang files 2016-12-21 00:04:14 +08:00
Dan Poltawski a902c76035 Merge branch 'MDL-54996_m31v1' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-12-20 09:19:28 +00:00
John Okely 149c4fc1fa MDL-57268 auth_db: Unit tests for deletion from a large user set 2016-12-20 02:27:15 +01:00
Rafal Domagalski ec3260126f MDL-52366 themes: check for templates in themedir 2016-12-19 18:13:14 +01:00
Dan Poltawski 04f2ca8403 Merge branch 'MDL-55568_m31v2' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-12-19 14:33:08 +00:00
Dan Poltawski 52c8ba9fb5 Merge branch 'wip-MDL-56912-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-12-19 12:21:24 +00:00
Dan Poltawski e23b813fba Merge branch 'MDL-52098_31_STABLE' of git://github.com/Chocolate-lightning/moodle into MOODLE_31_STABLE 2016-12-19 11:25:50 +00:00
David Monllao a8f1c2d081 Merge branch 'MDL-57402_31' of git://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-12-19 12:21:06 +01:00
Dan Poltawski c828f9f1a9 Merge branch 'MDL-53044-m31' of https://github.com/ak4t0sh/moodle into MOODLE_31_STABLE 2016-12-19 08:47:24 +00:00
Dan Poltawski 9ca69b62a7 Merge branch 'MDL-55715_m31v1' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-12-19 08:35:44 +00:00
Stephen Bourget ae427d9bde MDL-54996 Calendar: Fix dates for future multi-day events
Thanks to Martin Cunliffe for providing the fix
2016-12-17 10:54:32 -05:00
Mathew May 344afe028c MDL-52098 enrol: cohort now looks at instance status 2016-12-16 11:23:42 +13:00
Arnaud Trouve ca8ccd3960 MDL-53044 auth : force change on expired password 2016-12-15 15:07:06 +01:00
Andrew Nicols 84ad325c69 weekly release 3.1.3+ 2016-12-15 11:34:14 +08:00
Andrew Nicols 03023520d8 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-12-15 11:34:10 +08:00
Tim Hunt 8aa1fb5a2c MDL-57402 quiz editing: fix add heading after remove page break 2016-12-14 16:29:13 +00:00
AMOS bot 40279bf2ea Automatically generated installer lang files 2016-12-15 00:04:23 +08:00
Stephen Bourget 44990fffb0 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:07:26 -05:00
Andrew Nicols 3543f44073 Merge branch 'wip-mdl-57380-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-12-14 10:03:06 +08:00
Rajesh Taneja 548b707034 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:59:46 +08:00
Andrew Nicols 1fc45fb305 Merge branch 'MDL-55062_31' of git://github.com/markn86/moodle into MOODLE_31_STABLE 2016-12-14 09:49:46 +08:00
Stephen Bourget c879145e42 MDL-55568 chat: chat_refresh_events should only create published events 2016-12-13 18:54:48 -05:00
Eloy Lafuente (stronk7) 02aa2c5257 Merge branch 'MDL-55809-31' of https://github.com/xow/moodle into MOODLE_31_STABLE 2016-12-13 20:05:34 +01:00
Dan Poltawski ed41e34699 Merge branch 'MDL-57125-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-12-13 16:34:59 +00:00
Dan Poltawski 8656edd2e5 Merge branch 'MDL-56810' of https://github.com/Syxton/moodle into MOODLE_31_STABLE 2016-12-13 14:55:53 +00:00
Eloy Lafuente (stronk7) e1fbc8e4da Merge branch 'MOODLE_31_STABLE' of https://github.com/fwsl/moodle into MOODLE_31_STABLE 2016-12-13 12:01:05 +01:00
Eloy Lafuente (stronk7) b3d43b015d Merge branch 'MDL-55720_m31' of https://github.com/ak4t0sh/moodle into MOODLE_31_STABLE 2016-12-13 11:49:57 +01:00
Henning Bostelmann 5e7abb9900 MDL-55575 mod_glossary: Allow viewing all entries on one page 2016-12-13 11:44:56 +01:00
Dan Poltawski 419bec2fd3 Merge branch 'MDL-57250_m31' of git://github.com/markn86/moodle into MOODLE_31_STABLE 2016-12-13 10:25:11 +00:00
Dan Poltawski 727759006c Merge branch 'MDL-56859-31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-12-13 09:45:20 +00:00
Dan Poltawski 5e4744bb90 Merge branch 'MDL-57074-31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-12-13 09:26:20 +00:00
Dan Poltawski 92d3e80482 Merge branch 'MDL-57182-31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-12-13 08:47:38 +00:00
Dan Poltawski 00d9bc4a34 Merge branch 'wip-MDL-57257-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-12-13 08:46:10 +00:00
Marina Glancy e02a11ad0a MDL-56912 feedback: empty multichoice questions do not submit 2016-12-13 15:01:11 +08:00
Mark Nelson e4f1771a60 MDL-55062 tool_uploaduser: prevent defaults when not selected 2016-12-13 12:43:45 +08:00
Simey Lameze 17ffb3eca7 MDL-57125 comment: prevent js execution if there are no comments 2016-12-13 12:11:09 +08:00
Jan Dageförde f77e3ebb30 MDL-57257 lesson: Validate type of numerical answer 2016-12-13 10:35:51 +08:00
Andrew Nicols f2a59f5cf0 Merge branch 'MDL-57222_m31' of git://github.com/markn86/moodle into MOODLE_31_STABLE 2016-12-13 10:31:56 +08:00
Rajesh Taneja d8f02a7489 MDL-57328 core: Remove xdebug extension, so test run faster 2016-12-13 02:30:52 +01:00
Eloy Lafuente (stronk7) c2834ccb6e Merge branch 'mdl31_MDL-57324' of git://github.com/danmarsden/moodle into MOODLE_31_STABLE 2016-12-13 02:02:16 +01:00
Jake Dallimore f6d2455657 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:21:47 +08:00
Dan Poltawski fae39b86c3 Merge branch 'MDL-56525-m31' of https://github.com/ak4t0sh/moodle into MOODLE_31_STABLE 2016-12-12 14:09:39 +00:00
Dan Poltawski 67dc08ecf4 Merge branch 'MDL-55782-31-test' of git://github.com/ryanwyllie/moodle into MOODLE_31_STABLE 2016-12-12 13:18:21 +00:00
Matt Davidson 31a9b403ca 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-12 08:18:17 -05:00
Dan Poltawski 6df5f57257 Merge branch 'wip-mdl-52796-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-12-12 13:00:58 +00:00
Dan Poltawski c780854bb9 Merge branch 'wip-MDL-54846-31-2' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-12-12 09:34:05 +00:00
Dan Poltawski 4d700925ef Merge branch 'MDL-56566_31' of https://github.com/bostelm/moodle into MOODLE_31_STABLE 2016-12-12 09:20:17 +00:00
Dan Poltawski 4f91062cf3 Merge branch 'MDL-55906-grading-table-filters-not-reset' of https://github.com/ilya-catalyst/moodle into MOODLE_31_STABLE 2016-12-12 09:04:28 +00:00
Andrew Nicols 92b777eb87 Merge branch 'MDL-46714-31-nadav' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-12-12 13:27:26 +08:00
Nadav Kavalerchik acc13191d9 MDL-46714 Calendar: Properly order Date & Time fields in RTL mode 2016-12-12 12:40:52 +08:00
Marina Glancy 99fce6b523 MDL-54846 media: cleanup of supported formats
.wav is supported in all browsers except IE
.aac, .mp3, .mp4 are supported in Opera
.aac is supported in Firefox
also remove check for firefox version above 27 - it's really ancient
2016-12-12 12:39:39 +08:00
Mark Nelson 9bf610d343 MDL-57222 mod_assign: show validation message on visible element 2016-12-12 11:57:37 +08:00
Mark Nelson 4c26d1af76 MDL-57250 core: show admin settings when only one category exists 2016-12-12 11:57:18 +08:00
Ramindu Deshapriya 4b7140242f MDL-52796 behat: Behat feature to test reset wiki page, tags & comments 2016-12-12 10:28:15 +08:00
Jake Dallimore 1405a62f1c MDL-57074 Filepicker: Fix alias and link icons in RTL mode 2016-12-12 09:18:26 +08:00
Bram Tassyns 36b70df814 MDL-56859 SCORM: player shouldn't display TOC while loading 2016-12-12 09:13:29 +08:00
AMOS bot 0221b1f366 Automatically generated installer lang files 2016-12-10 00:04:17 +08:00
Arnaud Trouve 8e17ff2876 MDL-56525 forum: remove targeted user enrolment
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-09 10:25:22 +01:00
Dan Marsden 84fc36beee MDL-57324 scorm: exclude objective raw.score from grade update 2016-12-09 10:13:46 +13:00
Henning Bostelmann 3e4036a44b 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 19:54:56 +00:00
Dan Poltawski 45fe30fc2d weekly release 3.1.3+ 2016-12-08 08:43:01 +00:00
Dan Poltawski df35af5c64 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-12-08 08:43:00 +00:00
Franziska Hübler 0d31a7a8ac MDL-55809 glossary: Keep file author and license across import/export 2016-12-08 12:28:01 +08:00
Ilya Tregubov d6f74c4937 MDL-55906 table: Update user preferences table when reset preferences 2016-12-08 15:04:25 +11:00
Andrew Nicols 73852e5538 Merge branch 'wip-mdl-56614-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-12-08 09:19:41 +08:00
Rajesh Taneja 6f5c29d565 MDL-56642 dataformat: Fixed method_exits parameters 2016-12-08 00:37:16 +01:00
AMOS bot a5380d3a30 Automatically generated installer lang files 2016-12-08 00:05:14 +08:00
Dan Poltawski 7371bec501 Merge branch 'MDL-56674-MOODLE_31_STABLE' of https://github.com/kenneth-hendricks/moodle into MOODLE_31_STABLE 2016-12-07 08:46:19 +00:00
= c278cfab69 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-07 09:41:56 +01:00
Marina Glancy 89c3ec5772 MDL-56614 behat: backport new steps to Moodle 3.1 2016-12-07 14:41:49 +08:00
Andrew Nicols 6e8ca5c281 Merge branch 'wip-mdl-56353-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-12-07 12:05:44 +08:00
Andrew Nicols 172848e96a Merge branch 'wip-MDL-56642-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-12-07 10:04:46 +08:00
Marina Glancy 90d346bbdc MDL-56642 dataformat: set temp dir
Thanks to Chien Wen-Chang for proposing a patch
2016-12-07 10:03:32 +08:00
Rajesh Taneja f2de91ec41 MDL-57137 behat: Subcategory has black space before name 2016-12-07 09:14:11 +08:00
Dan Poltawski 519a5a57db Merge branch 'MDL-45873_31' of https://github.com/bostelm/moodle into MOODLE_31_STABLE 2016-12-06 15:56:30 +00:00
Dan Poltawski 2011db7312 Merge branch 'MDL-53677-31' of git://github.com/ankitagarwal/moodle into MOODLE_31_STABLE 2016-12-06 12:48:39 +00:00
Dan Poltawski 35f03242b0 Merge branch 'MDL-56836-31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-12-06 12:46:20 +00:00
Dan Poltawski 9504cb7ced Merge branch 'MDL-56233-31-mocksubmit' of https://github.com/roperto/moodle into MOODLE_31_STABLE 2016-12-06 12:42:05 +00:00
Dan Poltawski c0a448e3aa Merge branch 'MDL-57199_31' of git://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-12-06 12:25:38 +00:00
Dan Poltawski 8ab44d9222 Merge branch 'MDL-56971-m31' of https://github.com/micaherne/moodle into MOODLE_31_STABLE 2016-12-06 11:08:09 +00:00
Grzegorz Ziółek 5400ad13dd MDL-56830 config_log: Add block plugin visibility changes to config_log. 2016-12-06 11:42:30 +01:00
Andrew Nicols 4826567e87 Merge branch 'MOODLE_31_STABLE_MDL_57137_question_category_with_parent' of https://github.com/melihovv/moodle into MOODLE_31_STABLE 2016-12-06 15:34:48 +08:00
SSRF e716d6e8f7 MDL-53677 tool_spamcleaner: CSRF Fix
Resolves minor CSRF within Moodle spamcleaner.
2016-12-06 12:25:48 +05:30
Andrew Nicols 738652678f Merge branch 'MDL-56346-31' of https://github.com/lucisgit/moodle into MOODLE_31_STABLE 2016-12-06 14:35:38 +08:00
Andrew Nicols 1d3f57daed Merge branch 'MDL-56301-31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-12-06 14:27:30 +08:00
Andrew Nicols f1b3e2ef1f Merge branch 'MDL-57161-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-12-06 13:11:13 +08:00
Donald Barrett 3724d12ab4 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:42:03 +08:00
David Monllao b8f4c0561a MDL-57161 search: Set the correct HTTP header
All credit goes to Test Valley School
2016-12-06 10:01:29 +08:00
Andrew Nicols 89040af78e Merge branch 'MDL-56759-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-12-06 09:24:54 +08:00
Dan Poltawski f8c8f9aeb1 Merge branch 'MDL-56459-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-12-05 15:48:34 +00:00
Henning Bostelmann c7afcfa623 MDL-45873 mode_data: Allow "0" entries in menu field 2016-12-05 09:17:40 +00:00
Andrew Nicols 561825915b Merge branch 'MDL-54921-31' of https://github.com/xow/moodle into MOODLE_31_STABLE 2016-12-05 15:36:03 +08:00
Simey Lameze 8aa669c314 MDL-56759 themes: fix alignment issues on badges list 2016-12-05 15:25:37 +08:00
Andrew Nicols f6c5ef8c38 Merge branch 'MDL-52840_31' of https://github.com/rezaies/moodle into MOODLE_31_STABLE 2016-12-05 13:02:41 +08:00
Andrew Nicols 65728e136e Merge branch 'MDL-56893-MOODLE_31-edit-grade-item-bug' of https://github.com/mspall/moodle into MOODLE_31_STABLE 2016-12-05 12:22:55 +08:00
Bram Tassyns 20aff96aec MDL-56836 SCORM: player doesn't remember display mode when not logged in 2016-12-05 09:30:32 +08:00
Daniel Thee Roperto 5af5ee7687 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-05 11:23:50 +11:00
Dan Poltawski f945d178cc weekly release 3.1.3+ 2016-12-02 15:18:01 +00:00
Dan Poltawski 180f6c85e4 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-12-02 15:18:00 +00:00
Eloy Lafuente (stronk7) 7c303ca2ba Merge branch 'wip-mdl-57245-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-12-02 14:15:37 +01:00
Eloy Lafuente (stronk7) cfef5a80d5 Merge branch 'MDL-57193-31-notest' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-12-02 11:41:13 +01:00
Frederic Massart 8432dbef4b MDL-57193 auth_db: Flip the array outside the loop for better perf
Also as the recent changes where affecting the whitespaces quite
a lot, I took the liberty of aligning a few lines which weren't.
2016-12-02 16:30:30 +08:00
John Okely a43c2ab9cb MDL-57193 auth_db: Use a recordset and array_key_exists 2016-12-02 16:30:29 +08:00
Josh Willcock 1c2f811212 MDL-57193 auth_db: Fixed bug suspends all users if external DB has > 10k 2016-12-02 16:30:29 +08:00
David Monllao 29d9983114 Merge branch 'MDL-57209-m31' of git://github.com/crmpicco/moodle into MOODLE_31_STABLE 2016-12-02 13:28:11 +08:00
Rajesh Taneja 09b502827f MDL-57245 behat: Use correct @_file_upload tag 2016-12-02 12:39:06 +08:00
Craig R Morton 4b0de02648 MDL-57209 forms: Notice: Undefined index: options in profile edit page
Skipping a loop iteration if the option group has no options.
2016-12-01 16:34:49 +08:00
Michael Spall 13cba568ff 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-11-30 12:07:14 -07:00
AMOS bot d9ae5e8320 Automatically generated installer lang files 2016-12-01 00:05:53 +08:00
AMOS bot 5a9fcb1e7e Merge branch 'MOODLE_31_STABLE' into install_31_STABLE 2016-12-01 00:05:52 +08:00
Dan Poltawski 12661fa0d1 Merge branch 'MDL-57169_m31' of git://github.com/markn86/moodle into MOODLE_31_STABLE 2016-11-30 11:04:41 +00:00
Dan Poltawski cf9332a2b6 Merge branch 'MDL-52199-incoming-nice-fail-MOODLE_31_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_31_STABLE 2016-11-30 09:52:45 +00:00
David Monllao 8b522b74d6 Merge branch 'MDL-56682_m31' of git://github.com/markn86/moodle into MOODLE_31_STABLE 2016-11-30 13:56:19 +08:00
Eloy Lafuente (stronk7) 7e09179adb Merge branch 'MDL-57133-31-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-11-29 22:36:40 +01:00
Tim Hunt 5102a3f6d2 MDL-57199 question preview: make HTML ids unique 2016-11-29 18:32:20 +00:00
AMOS bot 67564b1899 Automatically generated installer lang files 2016-11-30 00:04:51 +08:00
Dan Poltawski ba6633aedc weekly release 3.1.3+ 2016-11-29 13:32:20 +00:00
Dan Poltawski a02daa446b Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-11-29 13:32:19 +00:00
David Herney cd6ba4eff2 MDL-57169 backup: ensure images in category descriptions are shown 2016-11-29 11:44:01 +08:00
David Monllao 274e089eaa Merge branch 'MDL-57163-31' of https://github.com/vvzh/moodle into MOODLE_31_STABLE 2016-11-29 11:41:59 +08:00
Helen Foster bb8916ed88 MDL-57133 lang: Merge English strings from the en_fix language pack 2016-11-29 02:03:12 +01:00
Mark Nelson b5d811f85c MDL-56682 mod_assign: ensure the variable is not null 2016-11-28 16:48:44 +08:00
David Monllao 08d5732bf3 Merge branch 'MDL-57170-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-11-28 15:43:40 +08:00
John Okely 8b1f793c47 MDL-54921 signup: Only clear wanturl when necessary
Thanks to Juho Jaakkola for original patch idea.
2016-11-28 13:55:42 +08:00
Tim Lock 42d6fc0b83 MDL-57170 repository_dropbox: Ensure Dropbox Legacy continues to work 2016-11-28 10:30:37 +08:00
Rajesh Taneja adc22bb264 MDL-57147 phpunit: Check if time is greater than or equal to
Some windows only have 1/100 microtime resolution
so a lot of times it does not advance enough.
2016-11-28 09:41:13 +08:00
Vladimir Zhirov ac47ed92fb MDL-57163 installation: fixed "Call to undefined function curl_version" 2016-11-27 12:14:08 +04:00
AMOS bot 267cc3a385 Automatically generated installer lang files 2016-11-27 00:05:54 +08:00
Tony Butler 68e1e99dff MDL-56346 assignfeedback_editpdf: Correct typo in property name 2016-11-25 11:09:55 +00:00
David Monllao aaa2f52b97 weekly release 3.1.3+ 2016-11-25 15:56:17 +08:00
David Monllao 682b43f63e Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-11-25 15:56:16 +08:00
Alexander Melihov fa5fdc0231 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-11-25 09:27:45 +03:00
David Monllao b854302dba Merge branch 'MDL-57126-31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-11-25 09:18:36 +08:00
Jake Dallimore 72b9069024 MDL-57126 core: add 'scss' to list of core filetypes.
This allows filetype restrictions to work when uploading additional
preset files on the Boost admin settings page.
2016-11-25 07:57:09 +08:00
Dan Poltawski 164225f770 Merge branch 'MDL-56948-31' of https://github.com/lucisgit/moodle into MOODLE_31_STABLE 2016-11-24 15:58:03 +00:00
Andrew Nicols c8f16d104f Merge branch 'wip-mdl-56898-fix31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-11-24 11:09:33 +08:00
Rajesh Taneja d7b20b8023 MDL-56898 behat: No need to trigger error, as it sometimes hangs behat 2016-11-24 07:34:22 +08:00
Damyon Wiese ab464e1382 MDL-57100 JS: Exceptions give exceptions
Exceptions returned from ajax are not in the format expected by the JS, so
an error occurs and the exception popups are not appearing.

Conflicts:
	lib/amd/build/notification.min.js
	lib/amd/src/notification.js
2016-11-23 18:08:20 +00:00
Dan Poltawski 3caf199992 Merge branch 'MDL-53964_31' of https://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-11-23 16:07:26 +00:00
AMOS bot af23df9c80 Merge branch 'MOODLE_31_STABLE' into install_31_STABLE 2016-11-24 00:06:29 +08:00
Dan Poltawski 94d47cf18e Merge branch 'MDL-35949_31' of https://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-11-23 12:31:24 +00:00
Dan Poltawski 38ea1a51e4 Merge branch 'MDL-56182-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-11-23 08:26:23 +00:00
Frederic Massart 7350a42d0f MDL-56182 mod_lti: Include the query string when comparing type URLs 2016-11-23 10:19:07 +08:00
AMOS bot 8c48e53238 Automatically generated installer lang files 2016-11-23 00:05:10 +08:00
Eloy Lafuente (stronk7) 41bb9ff743 weekly release 3.1.3+ 2016-11-22 16:21:02 +01:00
Andrew Nicols fc56dcb9c7 Merge branch 'MDL-57035-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-11-22 12:03:48 +08:00
Frederic Massart 244ad80521 MDL-57035 repository_skydrive: Compability with converged type apps
http://go.microsoft.com/fwlink/p/?LinkID=615760
2016-11-22 11:50:23 +08:00
Brendan Heywood a900b899b5 MDL-52199 core_message: IMAP errors passed to task api 2016-11-22 12:50:27 +11:00
Dan Poltawski 003171089d Merge branch 'wip-mdl-56898-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-11-21 15:07:49 +00:00
David Monllao 1fda873603 Merge branch 'MDL-57063-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-11-21 16:54:11 +08:00
Frederic Massart 3a03fa68c5 MDL-57063 backup: Do not try to set default value on locked setting
We cannot set a default value on settings which are 'config' or
'permission' locked or an exception will be thrown from
base_setting::set_value.
2016-11-21 11:10:58 +08:00
Andrew Nicols a18bf664a8 Merge branch 'MDL-56877-31' of https://github.com/eSrem/moodle into MOODLE_31_STABLE 2016-11-21 11:10:19 +08:00
Andrew Nicols aaa9be33b2 Merge branch 'MDL-55275_MOODLE_31_STABLE' of https://github.com/tobiasreischmann/moodle into MOODLE_31_STABLE 2016-11-21 11:01:58 +08:00
Rajesh Taneja 9136cf7ce9 MDL-56898 behat: Go to a non html page to avoid any unwanted ajax calls
After scenario is finished, go to README.txt, so
there is no JS/AJAX calls pending and site is ready
for reset before next scenario
2016-11-21 09:41:59 +08:00
Rajesh Taneja 2db00c9537 MDL-56898 behat: Increase autosavefrequency for behat tests
We don't need editor to autosave, as this cause
unwanted ajax request
2016-11-21 09:41:59 +08:00
Rajesh Taneja afe2fcea3e MDL-56898 behat: Try data reset if it fails because of pending process 2016-11-21 09:41:59 +08:00
David Monllao 3f5584c55c Merge branch 'MDL-56972-31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-11-21 09:06:11 +08:00
Andrew Nicols 496e1f307c Merge branch 'MDL-42977-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-11-21 08:53:58 +08:00
Andrew Nicols c102cde4f5 Merge branch 'MDL-57002-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-11-21 08:21:55 +08:00
Tim Hunt 1d34a7bf9d MDL-53964 qtype_ddmarker: marker label 0 should be allowed 2016-11-20 21:33:13 +00:00
Shamim Rezaie a1e7685b36 MDL-52840 assignsubmission_file: Change default setting file size
The default value of the assignsubmission_file/maxbytes setting is changed to $CFG->maxbytes.
2016-11-21 04:52:16 +11:00
Tim Hunt ce1b0ee4f1 MDL-35949 quiz accessibility: move input outside label 2016-11-20 17:03:29 +00:00
Tony Butler 499fbf48e3 MDL-56948 mod_assign: Don't call get_grade_item() unless we have one 2016-11-18 15:38:45 +00:00
Dan Poltawski 71d8200285 weekly release 3.1.3+ 2016-11-18 09:57:38 +00:00
Dan Poltawski eb11d15cb8 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-11-18 09:57:36 +00:00
Frederic Massart 8dbfe13362 MDL-57002 repository_webdav: Use default temporary file name
The WebDAV library does not like when there are UTF-8 characters
in the temporary file name. It changes the path but does not return
it, so the file ends up being saved somewhere unknown. As we do not
need the file name at all, we let repository::prepare_file()
generate one.
2016-11-18 12:48:16 +08:00
Jake Dallimore 57371336ad MDL-56972 backup: fix question category stamp duplicates during restore
To kerb future stamp duplication, MDL-54864 added a unique index to the
question_categories table (stamp, contextid) and added an upgrade step
to fix existing duplicate stamps. It missed the case where a course with
duplicate stamps in the same context is directly restored into moodle
3.1, causing index clashes. This issue provides a fix for that.
2016-11-18 11:12:58 +08:00
David Monllao ae045565dd Merge branch 'MDL-55869_m31v1' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-11-18 09:16:15 +08:00
David Monllao 2585fa374e Merge branch 'MDL-55566_m31v1' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-11-18 09:05:26 +08:00
AMOS bot cb5d7ff050 Automatically generated installer lang files 2016-11-18 00:06:51 +08:00
David Monllao 5af0e614bb Merge branch 'MDL-57015_31' of git://github.com/stronk7/moodle into MOODLE_31_STABLE 2016-11-17 20:23:31 +08:00
Virgil Ashruf 1337e2b0ef MDL-56877 autogroup form: no limit on cohorts 2016-11-17 10:49:11 +01:00
Andrew Nicols 6872515e7f Merge branch 'wip-MDL-57007-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-11-17 14:36:30 +08:00
Andrew Nicols a7aad09ce4 Merge branch 'MDL-56221_31' of https://github.com/bostelm/moodle into MOODLE_31_STABLE 2016-11-17 13:32:07 +08:00
Marina Glancy 6912bad471 MDL-57007 behat: assume all capabilities during installation 2016-11-17 13:07:27 +08:00
Andrew Nicols c6be25957b Merge branch 'MDL-56978_iconv-31' of https://github.com/mrmark/moodle into MOODLE_31_STABLE 2016-11-17 11:20:57 +08:00
David Monllao 09a6cc6e4a Merge branch 'MDL-52186-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-11-17 10:41:55 +08:00
Jun Pataleta 39d602e4b9 MDL-52186 enrol_meta: Sync only active enrol_meta instances
Thanks to Peter Klinka for the solution!
2016-11-17 10:41:17 +08:00
David Monllao dba7d01504 Merge branch 'wip-mdl-56865-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-11-17 10:35:49 +08:00
David Monllao fbd5f35012 Merge branch 'MDL-56915-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-11-17 10:33:58 +08:00
Eloy Lafuente (stronk7) 76075b3415 MDL-57015 tests: Use preventResetByRollback() if test uses transactions 2016-11-17 02:42:04 +01:00
Rajesh Taneja b9f40d95db MDL-56865 behat: Don't set error handler for behat install 2016-11-17 08:58:19 +08:00
Henning Bostelmann 78e9adb9f2 MDL-56221 mod_assign: Suppress unwanted grade notifications
* Quick grading: Properly recognize unchanged grades
* Individual grading: Amend JS that transfers checkbox state
2016-11-16 22:05:22 +00:00
Mark Nielsen edfc913460 MDL-56978 core: fix error handling in min_fix_utf8
Must completely suppress notice from iconv as Behat's
shutdown function uses error_get_last() which is
unable to detect if the error was suppressed or not.
2016-11-16 09:04:16 -08:00
AMOS bot f7e9adbecb Automatically generated installer lang files 2016-11-17 00:04:46 +08:00
Tobias Reischmann 25bb8b64f9 MDL-55275 assign: Prevent exception under admin role assignment.
In group mode the submission status was displayed to admins.
This caused an exception when the admins were enrolled as teachers
in a course while being the only member of a group.
2016-11-16 16:49:16 +01:00
gabrielrosset 1a9d089f6e MDL-33960 mod_lti: fix page scroll 2016-11-16 13:04:03 +00:00
Eloy Lafuente (stronk7) d9e0132c18 Merge branch 'MDL-55362_31_STABLE' of git://github.com/Chocolate-lightning/moodle into MOODLE_31_STABLE 2016-11-16 11:29:30 +01:00
Frederic Massart d44c0f5ab8 MDL-56915 webdav: Increase maximum expected header size 2016-11-16 17:20:12 +08:00
Frederic Massart 647e2bd9b0 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-11-16 14:06:39 +08:00
Andrew Nicols b0b6675407 Merge branch 'MDL-56958-31' of git://github.com/damyon/moodle into MOODLE_31_STABLE 2016-11-16 11:07:51 +08:00
Andrew Nicols 8bd4b31a85 Merge branch 'wip_MDL-48055_31_quiz_activity_report_grade_visibility' of https://github.com/POETGroup/moodle into MOODLE_31_STABLE 2016-11-16 10:10:16 +08:00
Mathew May ef6cdec4e5 MDL-55362 core: Fixed topic section default name empty h2 tag 2016-11-16 14:15:31 +13:00
David Monllao 2a79c833e3 Merge branch 'mdl31_MDL-56358' of git://github.com/danmarsden/moodle into MOODLE_31_STABLE 2016-11-16 08:33:58 +08:00
Andrew Nicols 2f973be713 Merge branch 'MDL-55209-m31' of https://github.com/NeillM/moodle into MOODLE_31_STABLE 2016-11-16 08:28:38 +08:00
David Monllao 586ec7ace3 Merge branch 'MDL-56942-31' of git://github.com/jleyva/moodle into MOODLE_31_STABLE 2016-11-16 08:10:05 +08:00
Mike Churchward 4e3c08c004 MDL-48055 q_u_outline, q_u_complete: added checks for grade visibility. 2016-11-15 12:43:34 -05:00
Dan Poltawski 789678b0d6 Merge branch 'wip-mdl-56860-m31' of git://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-11-15 16:29:42 +00:00
Michael Aherne d5cff77f4d MDL-56971 enrol: Use autoloading in enrol_get_plugin() 2016-11-15 12:25:30 +00:00
Dan Poltawski 55fb326d70 weekly release 3.1.3+ 2016-11-15 11:02:08 +00:00
Dan Poltawski de7781f68b Merge branch 'MDL-56903-31-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-11-15 10:43:32 +00:00
Helen Foster af70659cce MDL-56903 lang: Merge English strings from the en_fix language pack 2016-11-15 11:06:49 +01:00
David Monllao 8cc149d22d Merge branch 'wip-MDL-56899-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-11-15 09:07:02 +00:00
Andrew Nicols b1ac630276 Merge branch 'MDL-56823_31' of git://github.com/aolley/moodle into MOODLE_31_STABLE 2016-11-15 09:07:01 +00:00
Dan Poltawski c90864ca48 Merge branch 'MDL-54871_31' of https://github.com/bostelm/moodle into MOODLE_31_STABLE 2016-11-15 09:07:01 +00:00
Dan Poltawski 726e86074b Merge branch 'MDL-56913_31' of git://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-11-15 09:07:00 +00:00
Damyon Wiese 3389d9a5cc MDL-56958 ajax: Prefer the general renderer 2016-11-15 12:45:45 +08:00
EizEddin AlKatrib 231edf2c51 MDL-42977 course: Fixed the default behaviour of the Collapse/Expand all link 2016-11-15 10:25:07 +08:00
Rajesh Taneja a6552b684f MDL-56860 behat: Fixed moodle_list format and printer description 2016-11-15 08:49:13 +08:00
Dan Poltawski ad0f00c75a Merge branch 'mdl-56831-31_STABLE' of https://github.com/Dagefoerde/moodle into MOODLE_31_STABLE 2016-11-14 13:21:33 +00:00
Dan Poltawski 49a50541d1 Merge branch 'MDL-56916-31-normalizedoc' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-11-14 13:10:58 +00:00
Juan Leyva a96e384124 MDL-56942 login: Add missing required lib in complete_user_login 2016-11-14 12:28:13 +00:00
Eloy Lafuente (stronk7) 89b7d746fa Merge branch 'MDL-56880-m31' of https://github.com/micaherne/moodle into MOODLE_31_STABLE 2016-11-14 12:04:45 +01:00
Eloy Lafuente (stronk7) 268ac082fb Merge branch 'MDL-56882-31' of git://github.com/crazyserver/moodle into MOODLE_31_STABLE 2016-11-14 11:14:56 +01:00
Pau Ferrer Ocaña 32b3dd2fd8 MDL-56882 assign: Enable revert outcomes to No outcome 2016-11-14 09:56:21 +01:00
Marina Glancy db7e6deca4 MDL-56899 filter: suppress dom parsing errors
Domdocument does not know about <video> and <audio> tags, also it's too strict for html style
solution from http://stackoverflow.com/questions/6090667/php-domdocument-errors-warnings-on-html5-tags
2016-11-14 15:17:21 +08:00
Jan Dageförde d2297fdc35 MDL-56831 quiz: Declare YUI dependencies explicitly where needed 2016-11-13 23:53:13 +01:00
Eloy Lafuente (stronk7) de572fbf03 Moodle release 3.1.3 2016-11-12 20:21:36 +01:00
David Mudrák 95a36b52f3 MDL-56916 docs: Fix documentation of the normalize_component return 2016-11-12 10:48:01 +01:00
Tim Hunt 00081c06fa MDL-56913 quiz: teachers should see a review link for a preview
So what they see is like what students see.
2016-11-11 16:52:19 +00:00
AMOS bot 40a96de9cd Automatically generated installer lang files 2016-11-12 00:29:04 +08:00
Dan Poltawski 0c65936086 weekly release 3.1.2+ 2016-11-11 12:05:53 +00:00
Andrew Nicols a05308d366 Merge branch 'MDL-55121-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-11-11 15:13:25 +08:00
Andrew Nicols 8303ecdf44 Merge branch 'MDL-55994_31' of https://github.com/bostelm/moodle into MOODLE_31_STABLE 2016-11-11 13:59:46 +08:00
Andrew Nicols c467b6b705 Merge branch 'MDL-56417_31' of https://github.com/dmonllao/moodle into MOODLE_31_STABLE 2016-11-11 12:00:03 +08:00
Andrew Nicols 60daca3928 Merge branch 'MDL-52216_31_STABLE' of https://github.com/eugeneventer/moodle-fixes into MOODLE_31_STABLE 2016-11-11 11:21:42 +08:00
Simey Lameze 5ed79a453a MDL-55121 environment: check for unsuported php version 7.1 2016-11-11 10:04:20 +08:00
Eloy Lafuente (stronk7) 5c93ce2433 MDL-56363 mod_assign: rebuild js 2016-11-11 00:44:21 +01:00
Adrian Greeve a18b518496 MDL-56363 mod_assign: Restrictions added for tutors.
If the grader does not have the accessallgroups capability
or is not a member of the group then no participants are
shown.
2016-11-11 00:31:04 +01:00
Eugene Venter 2395ad0dbc MDL-52216 mod_lesson: prevent invalid view modes 2016-11-11 09:29:14 +13:00
Michael Aherne 3a9f23b595 MDL-56880 webservices: Fix documentation of get_enabled_plugins() 2016-11-10 16:19:47 +00:00
Dan Poltawski 96f92a0279 Merge branch 'MDL-56623_31-messages-to-adressed-to-until' of git://github.com/lucaboesch/moodle into MOODLE_31_STABLE 2016-11-10 15:04:35 +00:00
Dan Poltawski 20bae1ef3b Merge branch 'MDL-55249_m31v1' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-11-10 15:01:41 +00:00
Dan Poltawski dde3017dfd Merge branch 'MDL-56720-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-11-10 15:00:24 +00:00
Dan Poltawski a287200f18 MDL-55777 version: bump 2016-11-10 13:47:53 +00:00
Dan Poltawski 201a89c4b7 Merge branch 'MDL-55777-31' of git://github.com/ankitagarwal/moodle into MOODLE_31_STABLE 2016-11-10 13:46:45 +00:00
Eloy Lafuente (stronk7) d7631af5d8 Merge branch 'MDL-53481-31-uniqsqlparam' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-11-10 13:15:46 +01:00
David Mudrák 598a02dade MDL-53481 availability: Fix unit test to not execute the huge query
Some DBs have troubles to execute such a huge query as generated in this
test. We do not actually need to execute it. All we need is to make sure
that the parameter placeholders are enumerated correctly. So it is what
this new test does.
2016-11-10 09:55:19 +01:00
Nicholas Hoobin 044f6d7f46 MDL-56417 session: Respect the return value of ignore_timeout_hook. 2016-11-10 14:25:44 +08:00
Ankit Agarwal 26f3554922 MDL-55777 installation: Check libcurl version on install 2016-11-10 10:20:18 +05:30
Juan Leyva f5c6a29803 MDL-56268 webservice: Format backtrace to avoid display private data 2016-11-10 11:54:25 +08:00
Simey Lameze a5ecc22147 MDL-51347 core_notes: check view notes capability by course context 2016-11-10 11:54:25 +08:00
Tim Hunt 2a229e74a3 MDL-53744 question file access: fix access checks 2016-11-10 11:54:25 +08:00
Juan Leyva c3bb491c25 MDL-56065 user: Fix update_users Web Service
Users won’t be updated if:
- They are admins and the user updating is not
- They are the guest user
- They are mnet users
- They are deleted users
2016-11-10 11:54:24 +08:00
Andrew Nicols 179a26ff76 Merge branch 'MDL-54646-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-11-10 11:49:59 +08:00
David Monllao b6a4f42d9c Merge branch 'MDL-56753-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-11-10 11:39:04 +08:00
Andrew Nicols 751132ba58 Merge branch 'MDL-55883_m31v1' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-11-10 11:13:08 +08:00
Simey Lameze 07949dafdd MDL-56753 mod_assign: behat tests for groups and grouping counting 2016-11-10 11:11:20 +08:00
Simey Lameze 6c29f655d2 MDL-56753 mod_assign: fix groups and submitted counting on grading summary
This also fixes a coding error that was displayed when a group was not part of
assignment grouping.
2016-11-10 11:11:19 +08:00
Tomasz Muras c429d0abec MDL-54646 tags: Hide manage tags in menu if tags disabled. 2016-11-10 11:09:21 +08:00
Andrew Nicols 1717bd7cd4 Merge branch 'wip-mdl-56840-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-11-10 09:45:49 +08:00
Adam Olley c483076ad9 MDL-56823 session: redis sessions don't honour $CFG->sessiontimeout
The redis session handler doesn't use the sessiontimeout config setting
to determine session lifetime.

It has a lock expiry, which is set to 7200 (or a config setting) that is
used to determine how long a lock is held onto, but that should be
distinct from the session timeout.
2016-11-10 10:28:50 +10:30
Andrew Nicols b81f565740 Merge branch 'MDL-56755-m31' of https://github.com/micaherne/moodle into MOODLE_31_STABLE 2016-11-09 15:43:02 +08:00
Andrew Nicols 5ff3938e19 Merge branch 'MDL-56726-31-cfgadmin' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-11-09 14:52:10 +08:00
Rajesh Taneja 60a67bd6ee MDL-56840 behat: Wait till pdf conversion progress is finished 2016-11-09 14:50:53 +08:00
David Monllao a6af6fb6ef Merge branch 'MDL-56133-m31' of https://github.com/NeillM/moodle into MOODLE_31_STABLE 2016-11-09 14:24:13 +08:00
David Monllao bf937a647f Merge branch 'mdl-54852-31_STABLE' of https://github.com/Dagefoerde/moodle into MOODLE_31_STABLE 2016-11-09 13:07:44 +08:00
David Monllao 7cc5b700c8 Merge branch 'MDL-53481-31-uniqsqlparam' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-11-09 12:50:07 +08:00
Stephen Bourget 5223adf258 MDL-55566 chat: Improve next scheduled chat message 2016-11-08 16:02:29 -05:00
Stephen Bourget e97b51a94a MDL-55869 mod_chat: Only create calendar events when chat is published 2016-11-08 15:06:18 -05:00
David Mudrák e22a93a603 MDL-53481 availability: Fix uniqueness of SQL named param placeholders
Static variables do not behave the way you might expect when accessing
them through the classes inheritance. When accessing a method via self::
or static:: operators, even though the method is inherited, its variable
scope is not. So the method unique_sql_parameter() was using the scope
of the child class and each child class had its own sequence of usp1,
usp2, usp3, ... placeholders. This led to "Incorrect number of query
parameters" error when multiuple condition classes were contributing to
a single SQL query.

All credit should go to Adam Olley who debugged and described the
essence of the problem in the tracker.
2016-11-08 14:24:02 +01:00
Neill Magill e2b4b56eee MDL-56133 tool_langimport: Changes should be visible after import
Before this change if a language pack was updated by the
\tool_langimport\task\update_langpacks_task scheduled task, changes
would not be available to users until an admin manually cleared the
strings cache.

This change causes the cache to purged when a language pack it update,
this will cause it to rebuild so users will start seeing updates
automatically.
2016-11-08 10:54:52 +00:00
Dan Poltawski 67b81de806 weekly release 3.1.2+ 2016-11-08 10:16:41 +00:00
Dan Poltawski 6e0495afef Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-11-08 10:16:40 +00:00
Michael Aherne 4eab05dfc5 MDL-56755 assign: Improve documentation of assign::get_grade_item() 2016-11-08 09:00:24 +00:00
Andrew Nicols 70d32d0516 Merge branch 'wip-MDL-56120-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-11-08 10:34:40 +08:00
David Monllao 334b25e0c6 Merge branch 'MDL-53718_31' of git://github.com/aolley/moodle into MOODLE_31_STABLE 2016-11-08 09:59:51 +08:00
Adrian Greeve 197554d49a MDL-56120 calendar: Unit tests for getting events.
Added a unit test for checking that calendar_get_events
will only return events for activated activities.
2016-11-08 08:32:09 +08:00
Adrian Greeve 0582765407 MDL-56120 calendar: Fix disabled modules showing events.
calendar_get_events now check s for disabled activities
and only shows events for active modules.
2016-11-08 08:30:57 +08:00
Eloy Lafuente (stronk7) 4e7dde97fc Merge branch 'MDL-56765-31' of git://github.com/jleyva/moodle into MOODLE_31_STABLE 2016-11-08 01:27:49 +01:00
Henning Bostelmann 6d5167d88b MDL-54871 mod_data: Remove text field when forced name present 2016-11-07 22:01:00 +00:00
Eloy Lafuente (stronk7) 49e291c7a6 Merge branch 'MDL-54916-31' of https://github.com/mr-russ/moodle into MOODLE_31_STABLE 2016-11-07 16:20:09 +01:00
Jan Dageförde 131ec75f8a MDL-54852 assignment: Suppress "leave page" warning after save
If the user navigates away from the grading page immediately
after saving the grading form, the browser warning can be
safely omitted, as there are no unsaved changes. This is achieved
by calling `reset_form_dirty_state()` of the core_formchangechecker
YUI module, which is responsible for the warning.
2016-11-07 10:29:47 +01:00
David Monllao ff6af70f81 Merge branch 'mdl31_MDL-54575' of git://github.com/danmarsden/moodle into MOODLE_31_STABLE 2016-11-07 13:58:26 +08:00
Adam Olley 9e4b6232d4 MDL-53718 badges: Dont display course badges when disabled 2016-11-07 15:58:08 +10:30
David Monllao 498163486c Merge branch 'MDL-56129-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-11-07 11:16:13 +08:00
David Monllao fc8be7dfab Merge branch 'MDL-56731_31_STABLE' of https://github.com/tonynlin/moodle into MOODLE_31_STABLE 2016-11-07 10:44:45 +08:00
Jonathon Fowler 00f53031f6 MDL-56129 core: Change HTTP error code for iOS 10 video playback
This patch changes the effective response code from a 407 to a 403 when
erroring on iOS 10 and when a HTTP_X_PLAYBACK_SESSION_ID HTTP header is
found.

This causes the iOS Media framework to send the cookie with the request
which subsequently succeeds.
2016-11-07 10:01:26 +08:00
David Monllao 23853266d7 Merge branch 'MDL-55203-31' of https://github.com/mr-russ/moodle into MOODLE_31_STABLE 2016-11-07 09:49:44 +08:00
Russell Smith 12b5512f2d MDL-55203 forms: Use correct admin folder name.
When the admin folder if renamed, the system must replace that when
adding the competencies form elements to the QuickForm Library.
2016-11-07 11:44:05 +11:00
Jan Dageförde ce50f55c1f MDL-54852 assignment: Suppress "leave page" warning after save
If the user navigates away from the grading page immediately
after saving the grading form, the browser warning can be
safely omitted, as there are no unsaved changes. This is achieved
by calling `reset_form_dirty_state()` of the core_formchangechecker
YUI module, which is responsible for the warning.
2016-11-06 21:58:18 +01:00
Henning Bostelmann d558b6629b MDL-55994 blog: Resolve warning messages in RSS feed generation 2016-11-06 17:40:13 +00:00
AMOS bot 1968cc587c Automatically generated installer lang files 2016-11-07 00:04:50 +08:00
Juan Leyva 001bd88aee MDL-56765 webservice: After a new session is started unset old preferences 2016-11-04 19:16:06 +00:00
Dan Poltawski 10d1ea1ae2 Merge branch 'wip-MDL-54986-31' of https://github.com/Beedell/moodle into MOODLE_31_STABLE 2016-11-04 14:31:00 +00:00
Dan Poltawski 59469bcc0b Merge branch 'MDL-56668-m31' of https://github.com/micaherne/moodle into MOODLE_31_STABLE 2016-11-04 14:23:10 +00:00
Dan Poltawski 1f15bdfeb4 Merge branch 'MDL-53945_31' of git://github.com/aolley/moodle into MOODLE_31_STABLE 2016-11-04 14:07:25 +00:00
Tony Lin 6faa78c935 MDL-56731 groups: Fixes breadcrumb when returning to groups/index.php 2016-11-04 13:26:23 +00:00
Dan Poltawski c1971a2fdf weekly release 3.1.2+ 2016-11-04 11:17:59 +00:00
Dan Poltawski fcf6e01377 MDL-56673 tool_templatelibrary: fix externallib backwards compat
The function now matches the VALUE_DEFAULT option of the service.
2016-11-04 11:45:21 +01:00
Jun Pataleta e31e111cdf MDL-46903 mod_scorm: Apply alias to compare text column 2016-11-04 14:24:02 +08:00
Andrew Nicols 71482ec7e2 Merge branch 'MDL-56673-31-fix1' of http://github.com/damyon/moodle into MOODLE_31_STABLE 2016-11-04 14:08:59 +08:00
Damyon Wiese 53ee4f0635 MDL-56673 tool_templatelibrary: Don't show templates from other themes 2016-11-04 14:04:37 +08:00
David Monllao 1ffe600b32 Merge branch 'MDL-56748-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-11-04 13:45:40 +08:00
Andrew Nicols 67747af0d3 MDL-56748 cache: Removes cache definition instances in purge_store
Previously a purge_store was only purging caches but it was leaving a
reference to the store instance for the cache definition.

As a result, the cache was never cleared away correctly and, in cases
where the cache store makes a TCP connection to a backend system, the
number of open sockets was increasing for each store instance.

After a complete purge, as found in the unit test reset, the cache
definitions should be both purged and removed.

This change should also lead to a drop in memory consumption for unit
tests as there will no longer be references to unused definition stores.
2016-11-04 13:44:39 +08:00
David Monllao 8bc7de537c Merge branch 'mdl31_MDL-46903' of https://github.com/danmarsden/moodle into MOODLE_31_STABLE 2016-11-04 08:24:53 +08:00
Adam Olley d6e1f28ef4 MDL-53945 mnet: Use moodle_url to provide string with url
Using moodle_url where possible is preferable to hardcoding uri's as
moodle_url is able to take care of alot of the formatting for us.

In this instance, it handles the $CFG->admin url path for us.
2016-11-04 09:12:00 +10:30
Michael Aherne 9263132f8d MDL-56668 competencies: Correct namespacing of coding_exception 2016-11-03 14:06:21 +00:00
David Mudrák 9257b81e26 MDL-56726 admin: Fix hard-coded path to the admin directory 2016-11-03 10:17:23 +01:00
David Monllao f87e7aa6ee Merge branch 'MDL-56481-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-11-03 14:52:25 +08:00
Tim Lock fedb3cf539 MDL-56481 tool_lpmigrate: Fix notice when cancelling framework migration 2016-11-03 14:17:22 +08:00
Jun Pataleta 91809b1fef MDL-56720 tool_lp: Do not push empty values to IDs array 2016-11-03 14:10:21 +08:00
Adam Olley c8b70b6ec2 MDL-53945 mnet: replace hardcoded admin dir with cfg
Several places in admin/mnet pull in required files using a hardcoded
admin dir string, as this is configurable it needs to use $CFG->admin
instead.

Places where the url is passed through moodle_url don't need to be
updated as that already automatically translates the urls for us.
2016-11-03 11:12:11 +10:30
ak4t0sh 03718099d6 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-11-03 00:01:18 +01:00
John Beedell e251d9fe45 MDL-54986 Quiz: Disable add button for quiz with attempts 2016-11-02 17:25:54 +00:00
Neill Magill 4ab8a932c7 MDL-55209 coursecat: Should be able to remove category idnumber
Users should be able to remove an idnumber from a category, before this
change when trying to delete an idnumber users would be told it already
existed.

This change also stops 0 from being allowed multiple times as an idnumber.
2016-11-02 09:52:34 +00:00
Neill Magill dbd9082621 MDL-55209 coursecat: Should be able to remove category idnumber test
A user should be able to remove an idnumber from a category, also 0
should not be allowed multiple times.
2016-11-02 09:52:10 +00:00
Andrew Nicols 5f7d070080 Merge branch 'MDL-56634-31' of git://github.com/ankitagarwal/moodle into MOODLE_31_STABLE 2016-11-02 14:05:11 +08:00
David Monllao 72aca897d4 Merge branch 'MDL-56323-31' of git://github.com/l-campbell/moodle into MOODLE_31_STABLE 2016-11-02 13:12:18 +08:00
David Monllao cdacdf7f41 Merge branch 'wip-MDL-55930-31' of https://github.com/Beedell/moodle into MOODLE_31_STABLE 2016-11-02 12:50:04 +08:00
Ankit Agarwal c97015c0c6 MDL-56634 webservices: clean api desc 2016-11-02 10:05:16 +05:30
David Monllao a35dea73e7 Merge branch 'MDL-43796_31_blindmarking' of https://github.com/SWiT/moodle into MOODLE_31_STABLE 2016-11-02 12:29:04 +08:00
Andrew Nicols b46e384dd3 Merge branch 'MDL-56673-31' of git://github.com/danpoltawski/moodle into MOODLE_31_STABLE 2016-11-02 12:15:53 +08:00
Kenneth Hendricks c4d310361f MDL-56674 core: Fix test_get_all_observers 2016-11-02 13:22:38 +11:00
Stephen Bourget 93c2d2c971 MDL-55883 mod_lesson: Missing include in lesson_update_events 2016-11-01 21:21:03 -04:00
Stephen Bourget 149a5b1e05 MDL-55249 mod_feedback: Associate status with current activity
The status screen in mod_feedback simply checks to see if there are any
attempts in progress to return the user status.  This check should be
limited to only include instances of the current feedback activity not
any feedback activity on the site.
2016-11-01 21:15:41 -04:00
Dan Poltawski 7fa03088be Merge branch 'MDL-54112-31' of https://github.com/hcpss-banderson/moodle into MOODLE_31_STABLE 2016-11-01 21:31:04 +00:00
Dan Poltawski e343b2438b Merge branch 'mdl31_MDL-47500' of git://github.com/danmarsden/moodle into MOODLE_31_STABLE 2016-11-01 21:29:32 +00:00
Dan Poltawski d62bde657b Merge branch 'mdl55456-moodle31' of https://github.com/tlock/moodle into MOODLE_31_STABLE 2016-11-01 21:27:50 +00:00
Eloy Lafuente (stronk7) a8c64d6267 weekly release 3.1.2+ 2016-11-01 19:48:11 +01:00
John Beedell 26d38b03cd MDL-55930 Quiz: "Next page button" showing in sequential mode 2016-11-01 11:25:05 +00:00
Dan Poltawski 82974222af MDL-56673 templatelibrary: return false when core template doesn't exist 2016-11-01 10:19:17 +00:00
Dan Marsden 40c10bebe7 MDL-54575 scorm: fix typo in data_preprocessing function
thanks to Mike Finch for the patch/report.
2016-11-01 12:14:05 +13:00
Dan Marsden 086bc8870a MDL-46903 scorm: Fix db error in objectives report for oracle.
also improve 2004 report handling to help with testing.
2016-11-01 12:06:08 +13:00
Eloy Lafuente (stronk7) 421a78a564 Merge branch 'wip-MDL-56615-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-10-31 20:26:12 +01:00
Dan Poltawski a20a0a48f0 Merge branch 'MDL-56542-31-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-10-31 15:14:02 +00:00
Andrew Nicols e5dc9a44ba Merge branch 'MDL-56282-31' of git://github.com/damyon/moodle into MOODLE_31_STABLE 2016-10-31 12:27:20 +08:00
Frédéric Massart 51256b8ab5 MDL-56282 enrol_meta: Fix error when editing existing instances
We had a few problems here.

1/ The auto complete element was displaying the picker though the
   field was frozen.
2/ Checking for existing enrolment including the courses chosen was
   not checking if the courses found were in the instance we edit.
3/ Upon creation we support multiple courses but when editing we
   should not expect more than the course in the instance being edited.
2016-10-31 12:16:15 +08:00
Marina Glancy 04872de103 MDL-56615 portfolio_googledocs: add basic unittests 2016-10-31 10:58:26 +08:00
Marina Glancy f0fab142a7 MDL-56615 portfolio: fix php 7.0.9 warning 2016-10-31 10:58:25 +08:00
Luca Bösch d0ebb9f35f MDL-56623 messages: To (addressed) and to (until) different
In some languages "to" having the meaning of "until" and "to" having the meaning of "addressed to" are different.
This should be taken care of by having two different translation terms.

AMOS BEGIN
  CPY [to,core],[addressedto,core]
AMOS END
2016-10-28 07:20:32 +02:00
Brian Barnes 9b16dd4632 MDL-47500 scorm: improved height calculation 2016-10-28 13:42:10 +13:00
Dan Marsden 1452bab3ab MDL-56358 tool_lp tool_cohortroles: allow null idnumber 2016-10-28 12:04:50 +13:00
Brendan Anderson e50b26fa7c MDL-54112 mod_assign: Add scale null grade filter 2016-10-27 10:33:47 -04:00
Dan Poltawski f4f89d4728 weekly release 3.1.2+ 2016-10-27 12:19:37 +01:00
Dan Poltawski b659e9d05c Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-10-27 12:19:36 +01:00
Dan Poltawski 17f1295e23 Revert "Merge branch 'MDL-56129-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE"
This reverts commit 1483afc59b, reversing
changes made to 9edd48f894.
2016-10-27 10:00:05 +01:00
Eloy Lafuente (stronk7) bf639be2ef Merge branch 'MDL-56448-31' of git://github.com/danpoltawski/moodle into MOODLE_31_STABLE 2016-10-26 17:06:21 +02:00
Dan Poltawski f093a38342 MDL-56448 mustache: fix json errors in example context 2016-10-26 12:37:40 +01:00
Eloy Lafuente (stronk7) c341f6ddaf Merge branch 'MDL-56354-31' of https://github.com/mr-russ/moodle into MOODLE_31_STABLE 2016-10-26 02:15:43 +02:00
Russell Smith 9eb3fb41c3 MDL-56354 unittests: Put debug messages in the failure notice. 2016-10-26 09:24:37 +11:00
Dan Poltawski 73a3ebcecf Merge branch 'MDL-56288_31-messages-time-extra-space' of https://github.com/lucaboesch/moodle into MOODLE_31_STABLE 2016-10-25 20:57:36 +01:00
Dan Poltawski 2c08b71880 Merge branch 'MDL-56136_31' of git://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-10-25 20:44:37 +01:00
Eloy Lafuente (stronk7) aba9531852 Merge branch 'MDL-56250-31-formvalidation' of https://github.com/roperto/moodle into MOODLE_31_STABLE 2016-10-25 20:30:16 +02:00
Helen Foster 9f809b1818 MDL-56542 lang: Merge English strings from the en_fix language pack 2016-10-25 20:26:36 +02:00
Eloy Lafuente (stronk7) 4b108d2ccb Merge branch 'MOODLE_31_STABLE' of https://github.com/yuriy-os/moodle into MOODLE_31_STABLE 2016-10-25 20:00:16 +02:00
Dan Poltawski bd519a6e80 Merge branch 'MDL-55143-31' of https://github.com/mr-russ/moodle into MOODLE_31_STABLE 2016-10-25 18:38:41 +01:00
AMOS bot cb3e164f68 Automatically generated installer lang files 2016-10-26 00:04:40 +08:00
David Monllao ff370663c6 Merge branch 'wip-mdl-56347-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-10-25 15:20:18 +08:00
Dan Poltawski 540cdcaca1 Merge branch 'MDL-55902-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-10-25 06:38:13 +01:00
Russell Smith 533addff9c MDL-54916 filestorage: Only write empty zip on change.
In some cases we may inspect an empty zip file. If we do open
an empty zip file, check that it changed before we attempt to write
it to disk.  It may be the case that we were reading the file from
a location that we don't have write access to.
2016-10-25 14:12:51 +11:00
Russell Smith a14e796549 MDL-56347 caching: Better class variables for notices. 2016-10-25 09:52:04 +08:00
Rajesh Taneja ca08b73300 MDL-56347 phpunit: Set class for alternative cache store
If alternative cache store is sued, then set the class
and warn user about this.
2016-10-25 09:51:27 +08:00
lazydaisy ad070273a5 MDL-48350 theme_bootstrapbase: restyle action icons in docked blocks 2016-10-24 21:38:07 +02:00
Dan Poltawski 05292ca201 Merge branch 'wip-MDL-56439-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-10-24 14:33:55 +01:00
Lee Campbell 3508f1b8e2 MDL-56323 core_user: User profile field default value not on signup page
The default value of a configured text input user profile field is not rendering on signup page
2016-10-24 09:33:42 +01:00
David Monllao 6c91de2362 Merge branch 'mdl56466-moodle31' of https://github.com/tlock/moodle into MOODLE_31_STABLE 2016-10-24 15:24:08 +08:00
David Monllao 1483afc59b Merge branch 'MDL-56129-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-10-24 12:01:00 +08:00
Andrew Nicols 9c74040c3b MDL-56129 core: Set a timeout on the session cookie
This is primarily because iOS has changed something under the hood which
means that only session cookies which have an expiry are passed around the
OS.

In order to make media playable outside of the browser (e.g. a video), we
must set a session cookie timeout.

Since the session timeout is configurable, this patch sets the cookie
timeout to the session timeout plus a period of one week.

This ensures that videos continue to work, and that the expired session
message is shown on the login page, but without requiring excessively long
session times.
2016-10-24 11:47:51 +08:00
Luke Carrier 7e3e81c330 MDL-55902 my: Add additional information to dashboard reset events
* Add $private and $pagetype information to the 'other' parameter of
the dashboard(s) reset events.
2016-10-24 11:04:12 +08:00
Frédéric Massart 9edd48f894 MDL-56341 mustache: JS engines handles strings wrapped in quote
Prior to the patch the strings wrapped as the following one
where not found and replaced when rendering the template via Javascript

{{#quote}}{{#str}}string,component{{/str}}{{/quote}}
2016-10-24 10:10:07 +08:00
Yuriy Osychenko 24ec5de709 MDL-53098 lib: Mark form as submitted in confirmation dialog.
If the quiz attempt use popup window with Javascript security it will
show to the user misleading message that he is going to lose entered
data.
To avoid this we should mark form as submitted to turn off browser`s
pop-up window when user confirms finishing attempt.
Also we need to check if core_formchangechecker is present on a page.
2016-10-24 00:44:00 +03:00
AMOS bot 22e7edad43 Merge branch 'MOODLE_31_STABLE' into install_31_STABLE 2016-10-22 00:04:59 +08:00
Daniel Thee Roperto 9bac677826 MDL-56250 forms library: Changed form to validate once per object.
If two instances of moodleforms are validated in the same run, most
likely a phpunit test run, it would store the first validation result.
Now it stores the validation result per instance, not for all instances.
2016-10-21 10:41:23 +11:00
AMOS bot cfae450c61 Automatically generated installer lang files 2016-10-21 00:04:54 +08:00
Eloy Lafuente (stronk7) 2afadc066b weekly release 3.1.2+ 2016-10-20 17:52:48 +02:00
Eloy Lafuente (stronk7) 870fcca1e0 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-10-20 17:52:45 +02:00
Andrew Nicols fbe2c4f979 Merge branch 'MDL-56328_31-fix-rtl' of git://github.com/dmonllao/moodle into MOODLE_31_STABLE 2016-10-19 13:30:04 +08:00
David Monllao 70e4268d66 MDL-56328 theme: Remove RTL styles
They should only be applied while editing mode is on
2016-10-19 12:34:25 +08:00
Eloy Lafuente (stronk7) acacf89d1a Merge branch 'MDL-29774-31-by-sam-wilson' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-10-18 17:34:46 +02:00
Andrew Nicols a518a7bc8c MDL-55858 mod_forum: Remove subscription links when not relevant
When a forum is force-subscribed or subscription is disabled, do not
include the subscription link in forum posts.
2016-10-18 17:01:03 +02:00
Dan Poltawski 7008ee479d Merge branch 'MDL-56131-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-10-18 13:44:38 +01:00
Dan Poltawski a0f41c8b2d Merge branch 'MDL-56062-31' of https://github.com/lucisgit/moodle into MOODLE_31_STABLE 2016-10-18 12:06:58 +01:00
Eloy Lafuente (stronk7) a8d92101dc Merge branch 'MDL-56275-31' of git://github.com/danpoltawski/moodle into MOODLE_31_STABLE 2016-10-18 12:13:07 +02:00
Dan Poltawski fa40bd7e08 MDL-56275 blog: do not display the 'choose a link' button
When registereing an external blog the choose a link button is
misleading, we don't have any repos which restrict to RSS feeds, so the
majority of results you get from the repo picker will be wrong.
2016-10-18 11:09:00 +01:00
David Monllao 7071e0949c Merge branch 'MDL-56328-M31' of git://github.com/lazydaisy/moodle into MOODLE_31_STABLE 2016-10-18 16:06:54 +08:00
Eloy Lafuente (stronk7) 096ea34f43 Merge branch 'MDL-56345-31' of https://github.com/lucisgit/moodle into MOODLE_31_STABLE 2016-10-18 09:38:41 +02:00
Tim Lock 5e80e0bce9 MDL-55456 course: set context for category ajax requests 2016-10-18 12:49:47 +10:30
Tim Lock fe9831dd7d MDL-56466 assign: fix database error with team submissions
This fixes the error when viewing the Grading summary with Blind Marking and Team submission is enabled:

ERROR: Incorrect number of query parameters. Expected 32, got 31.
2016-10-18 12:09:16 +10:30
Sam Wilson 3aff88f24c MDL-29774 core_user: Update group-membership summaries on AJAX calls 2016-10-18 09:37:32 +08:00
Eloy Lafuente (stronk7) eb8323829c Merge branch 'wip-mdl-56369-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-10-18 01:33:11 +02:00
Eloy Lafuente (stronk7) b2a3cd6f90 Merge branch 'wip-mdl-56348-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-10-18 01:10:32 +02:00
Russell Smith 0a97a2e574 MDL-55143 unittests: Check the db rather than cache for version hash. 2016-10-18 09:53:24 +11:00
Eloy Lafuente (stronk7) e1b22d2ee0 Merge branch 'MDL-56368-M31' of git://github.com/lazydaisy/moodle into MOODLE_31_STABLE 2016-10-18 00:38:53 +02:00
Eloy Lafuente (stronk7) 2e22fc8a24 Merge branch 'MDL-56022_m31v3' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-10-18 00:07:30 +02:00
Stephen Bourget 8fbdc47ab8 MDL-56022 Assign: Make folders structure in the downloaded zip optional
Special thanks to Matt McDermott for the contributing the Javascript
code to fix this issue.
2016-10-17 16:26:12 -04:00
Eloy Lafuente (stronk7) 66add1538d Merge branch 'MDL-56300_31' of git://github.com/reskit/moodle into MOODLE_31_STABLE 2016-10-17 18:51:17 +02:00
Dan Poltawski b5179a16d4 Merge branch 'MDL-56208-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-10-17 12:52:28 +01:00
Dan Poltawski 94410cf875 Merge branch 'MDL-55630-31' of https://github.com/StudiUM/moodle into MOODLE_31_STABLE 2016-10-17 10:25:01 +01:00
Michael Aherne 6e4ad85606 MDL-56131 choice: Set maximum lifetime for lock 2016-10-17 13:51:08 +08:00
Andrew Nicols 403cc20e1e MDL-56208 mod_forum: Move Display period below Group 2016-10-17 11:47:13 +08:00
= 20afbd1e0d MDL-56288 messages: Extra space in front of message time
If the line break in the HTML code is at a different location
the extra space doesn't appear any more.
2016-10-16 22:51:14 +02:00
AMOS bot e210b6be12 Automatically generated installer lang files 2016-10-17 00:06:49 +08:00
Matthew Switlik 33b8704892 MDL-43796 assign: Reset revealidentities on restore
Set revealidentities to 0 when restoring with blindmarking and no user data
2016-10-14 14:11:05 -04:00
AMOS bot 476d9208d4 Automatically generated installer lang files 2016-10-15 00:04:48 +08:00
lazydaisy 12dba02ab0 MDL-56368 theme_bootstrapbase: Settings for Restrict Access not inline. 2016-10-14 15:51:25 +01:00
lazydaisy 657f59bb7d MDL-56328 theme_bootstrapbase: reduce activity indent when not editing 2016-10-14 15:30:34 +01:00
Jean-Philippe Gaudreau 70363d7394 MDL-55630 mod_assign: Exclude users courses from user details
Exclude users' enrolled courses for performance reason.
A new 'includeenrolments' parameter was added
to mod_assign::list_particpants.
2016-10-14 09:28:29 -04:00
Marc Català 4bb8469038 MDL-56300 mod_assign: Filtering students throws a javascript error 2016-10-14 09:27:30 +02:00
acorbier 6bed8d49b6 MDL-56369 behat: Updated comment for i_look_for_exceptions
After upgrade to Behat 3.x, i_look_for_exception is called from
Moodle\BehatExtension\EventDispatcher\Tester\ChainedStepTester
2016-10-14 13:25:16 +08:00
Marina Glancy 3b08a859f8 MDL-56439 course: added missing require 2016-10-14 08:21:21 +08:00
Eloy Lafuente (stronk7) 0b70ff8a16 weekly release 3.1.2+ 2016-10-13 20:02:38 +02:00
Eloy Lafuente (stronk7) d709527dc4 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-10-13 20:02:34 +02:00
Eloy Lafuente (stronk7) 2f3978dac5 Merge branch 'MDL-56319-m31' of https://github.com/micaherne/moodle into MOODLE_31_STABLE 2016-10-13 19:41:37 +02:00
Tony Butler 73792e3ff2 MDL-56345 assignfeedback_editpdf: Use correct strings for tool alt text 2016-10-13 10:07:57 +01:00
Rajesh Taneja 7099db9f68 MDL-56353 behat: Added test for multi select dependency 2016-10-13 14:34:21 +08:00
Tony Butler 76e4c52a2f MDL-56062 mod_assign: Use $gradeitem->get_decimals() for grade display 2016-10-12 20:47:01 +01:00
AMOS bot c867851817 Automatically generated installer lang files 2016-10-12 00:04:59 +08:00
Paul Holden df0a2112d2 MDL-55345 user: correct userid when linking to iplookup from profile 2016-10-11 17:06:45 +02:00
Eloy Lafuente (stronk7) e798553ab0 Merge branch 'MDL-55954_31' of git://github.com/dmonllao/moodle into MOODLE_31_STABLE 2016-10-11 12:46:47 +02:00
David Monllao dbc83491f7 Merge branch 'MOODLE_31_MDL-51401' of https://github.com/janeklb/moodle into MOODLE_31_STABLE 2016-10-11 17:59:19 +08:00
David Monllao d2eb91d7df Merge branch 'MDL-52051-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-10-11 17:11:41 +08:00
Dan Poltawski 323e12f7a6 Merge branch 'MDL-36611-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-10-11 08:53:30 +01:00
Rajesh Taneja 39ffd19e25 MDL-56348 cache: Removed second parameter
There is no second parameter in the api
and identifier should be set by set_identifiers
2016-10-11 12:51:23 +08:00
Andrew Nicols 7609261d84 MDL-52051 repository_dropbox: Add the V2 API 2016-10-11 11:45:55 +08:00
Kirill Astashov e9c915c050 MDL-36611 outcome: Set page context when editing outcome 2016-10-11 10:02:12 +08:00
Eloy Lafuente (stronk7) f029c8fd93 Merge branch 'MDL-56220-m31' of https://github.com/micaherne/moodle into MOODLE_31_STABLE 2016-10-11 01:18:35 +02:00
Eloy Lafuente (stronk7) 84f5f4706f Merge branch 'MDL-56261-31-taglist' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-10-11 00:32:58 +02:00
Eloy Lafuente (stronk7) b81712cd5d Merge branch 'MDL-56316-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-10-10 18:14:06 +02:00
Eloy Lafuente (stronk7) 1a6ba31a95 Merge branch 'MDL-51633_M31' of git://github.com/lazydaisy/moodle into MOODLE_31_STABLE 2016-10-10 17:37:57 +02:00
Simey Lameze 52306fe019 MDL-56050 core: set missing context to maintenance mode 2016-10-10 23:15:21 +08:00
Dan Poltawski 7d1b63df6e Merge branch 'MDL-56052-31' of git://github.com/damyon/moodle into MOODLE_31_STABLE 2016-10-10 14:19:06 +01:00
Andrew Nicols 8069695b30 MDL-52051 repository_dropbox: Move v1 API aside 2016-10-10 20:32:03 +08:00
Andrew Nicols 19098c49d9 MDL-52051 oauth: expires_in is optional 2016-10-10 20:32:03 +08:00
Dan Poltawski bffe12cd9f Merge branch 'MDL-51584-31' of https://github.com/mr-russ/moodle into MOODLE_31_STABLE 2016-10-10 13:27:08 +01:00
Dan Poltawski 2b05e813d6 Merge branch 'MDL-55597-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-10-10 11:33:14 +01:00
Dan Poltawski 2f3ffd55c5 Merge branch 'MDL-56285-31' of git://github.com/StudiUM/moodle into MOODLE_31_STABLE 2016-10-10 11:14:24 +01:00
Michael Aherne 7e47b00c34 MDL-56319 blocks: Observe empty default blocks setting 2016-10-10 09:52:47 +01:00
Janek Lasocki-Biczysko 616effd0d4 MDL-51401 enrol: ensures correct order of roles in UI components
Role sort order was not available in the UI (in JavaScript) due to
the use of PHP assoc arrays and JSON encoding/decoding. This patch
addresses this by sending the roles in a json array, rather than
json object.
2016-10-10 07:52:08 +01:00
Russell Smith bf907918c9 MDL-51584 gradebook: use direct $CFG access for freeze.
get_config() is called a lot of times on freeze and is expensive,
using $CFG is much lower overhead.
2016-10-10 15:42:55 +11:00
AMOS bot 6794c1f117 Automatically generated installer lang files 2016-10-09 00:06:23 +08:00
lazydaisy 5a36fc8bd2 MDL-51633 theme_bootstrapbase: Restyled ADD BLOCK to remove max-width. 2016-10-07 18:56:19 +01:00
AMOS bot 26a8cc00a8 Automatically generated installer lang files 2016-10-08 00:04:50 +08:00
Frédéric Massart 490afb5182 MDL-55597 tool_templatelibrary: Re-inforce logic to skip theme templates 2016-10-07 10:45:44 +02:00
Andrew Nicols 88e3401109 MDL-56316 tests: Ensure consistent assertion count 2016-10-07 14:46:16 +08:00
Eloy Lafuente (stronk7) 0c332af374 weekly release 3.1.2+ 2016-10-06 22:31:41 +02:00
Dan Poltawski 7d984d3e6d MDL-56303 quiz: lack of quiz filtering
Also, correctly feed completiongradeitemnumber with grade item numbers
and not with grade item ids.
2016-10-06 22:22:38 +02:00
Issam Taboubi fd135d1611 MDL-56285 competency: fix move competencies capabilities
In learning plan templates, cannot move competencies
around even if capability templatemanage is given
to the role because of bad context check
2016-10-06 11:30:14 -04:00
Eloy Lafuente (stronk7) 3e75aab436 weekly release 3.1.2+ 2016-10-06 11:51:45 +02:00
Eloy Lafuente (stronk7) 18019dd5a5 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-10-06 11:51:41 +02:00
Cameron Ball e1b37e8638 MDL-54802 mod_quiz: Improve validation when editing a quiz uusing require passing grade
When editing a quiz that is using the require passing grade completion method,
the grade to pass cannot be zero. Since the completion method is locked we
cannot recommend that the completion method is changed (as we do when the quiz
is being created). Instead we have to inform the user that the grade to pass
must not be zero.
2016-10-05 19:30:06 +08:00
Dan Poltawski 0f871cff57 Merge branch 'MDL-54802-31-fix' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-10-05 10:33:45 +01:00
Cameron Ball 5749d00b25 MDL-54802 mod_quiz: Move grade to pass error to require passing grade element
When using a passing grade of zero, with the required passing grade
option, an error was displayed on the "grade to pass" element.
This was confusing as the error message is referring to the
"Require passing grade" element. This patch moves the message to
the "Require passing grade" element.

Additionaly this patch fixes a small typo in a comment.
2016-10-05 17:17:49 +08:00
Rajesh Taneja e4f5b42015 MDL-56210 behat: Pending and complete js is added by js_init_code 2016-10-05 15:46:10 +08:00
David Monllao 139dda66cc Merge branch 'MDL-45969-31' of git://github.com/damyon/moodle into MOODLE_31_STABLE 2016-10-05 09:43:05 +08:00
Eloy Lafuente (stronk7) 35e1ae4464 Merge branch 'MDL-56231-31-flexible_table-construct-phpdoc' of https://github.com/roperto/moodle into MOODLE_31_STABLE 2016-10-05 01:49:05 +02:00
AMOS bot fbdc6adbdd Automatically generated installer lang files 2016-10-05 00:05:59 +08:00
Dan Poltawski a129767a8a Merge branch 'MDL-55861_31_STABLE' of https://github.com/dj4452/moodle into MOODLE_31_STABLE 2016-10-04 15:44:22 +01:00
Eloy Lafuente (stronk7) cc82a7e864 Merge branch 'MDL-56069_31' of git://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-10-04 16:42:09 +02:00
Michael Aherne d0f145c0d5 MDL-56220 cache: Call static method correctly 2016-10-04 15:00:09 +01:00
David Mudrák 714ddc74c3 MDL-56261 tags: Do not follow the empty anchor link on more/less toggle
Some browsers tend to follow the empty <a href="#"> link and scroll to
the top of the page.
2016-10-04 15:20:33 +02:00
Eloy Lafuente (stronk7) 8f26a5e064 MDL-55910 my: various fixes
- bump version
- point to correct 3.1.3 version in @since
- add missing phpunit-dist.xml suite
- fix context in tests
2016-10-04 12:58:10 +02:00
Eloy Lafuente (stronk7) 2f008b75a7 Merge branch 'MDL-55910-31' of https://github.com/LukeCarrier/moodle into MOODLE_31_STABLE 2016-10-04 12:36:54 +02:00
Andrew Nicols 5bb831e317 Merge branch 'MDL-55886-31' of git://github.com/danpoltawski/moodle into MOODLE_31_STABLE 2016-10-04 11:21:39 +08:00
Andrew Nicols 8796156112 Merge branch 'MDL-56198_31' of git://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-10-04 09:05:26 +08:00
David Monllao 2027e7a8ea MDL-55954 search_solr: Check connection before anything else
- Silents the system call when no correct data provided
- Converts long exception messages to standard server
  error + debugging message with the exception
2016-10-04 09:01:15 +08:00
AMOS bot 593ac7fa80 Automatically generated installer lang files 2016-10-04 00:04:31 +08:00
Dan Poltawski 4a8bc70154 Merge branch 'MDL-56181-31-czechia' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-10-03 16:43:54 +01:00
Dan Poltawski db68a1e688 Merge branch 'MDL-52317-m31' of https://github.com/NeillM/moodle into MOODLE_31_STABLE 2016-10-03 16:09:33 +01:00
Dan Poltawski c213250ca7 MDL-54802 quiz: fix bad whitespace 2016-10-03 14:47:04 +01:00
Dan Poltawski 75e4ff3874 Merge branch 'MDL-54802-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-10-03 14:47:00 +01:00
Andrew Nicols 75092504a1 Merge branch 'MDL-55421-31' of git://github.com/danpoltawski/moodle into MOODLE_31_STABLE 2016-10-03 19:48:28 +08:00
Dan Poltawski 573979aa1e Merge branch 'wip-MDL-55911-31' of https://github.com/Beedell/moodle into MOODLE_31_STABLE 2016-10-03 10:25:18 +01:00
David Monllao 13caba9006 Merge branch 'wip-mdl-56210-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-10-03 13:53:44 +08:00
Daniel Thee Roperto 3ac97c70d7 MDL-56231 library: Fixed PhpDoc for flexible_table constructor.
The flexible_table::__construct($uniqueid) accepts a string, not an int
as previously noted in the PhpDoc.
2016-10-03 16:06:32 +11:00
David Monllao 72a08226d6 Merge branch 'MDL-55222-31' of git://github.com/jleyva/moodle into MOODLE_31_STABLE 2016-10-03 13:02:28 +08:00
David Monllao d65b8227c9 Merge branch 'wip-MDL-55990-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-10-03 13:00:20 +08:00
David Monllao 62164d315f Merge branch 'MDL-55964_31' of https://github.com/StudiUM/moodle into MOODLE_31_STABLE 2016-10-03 12:40:46 +08:00
Tim Hunt d7a5bef2d6 MDL-56069 quiz: nav buttons don't scroll to the right question
When there is more than one question on a page, say questions 2, 3 & 4.
Then when you click the navigation button for Q4, then it should load
the next page scrolled down so that Q4 is visible. That was not working.
2016-09-30 15:05:31 +01:00
Tim Hunt e7d8a6079b MDL-56198 assignment: improve grading info responsiveness 2016-09-30 15:02:13 +01:00
John Beedell 04c6fd9498 MDL-55911 Quiz: Accessibility, Label blanks in DD questions 2016-09-30 09:49:25 +01:00
Neill Magill b9143c7883 MDL-52317 Atto: Large resized images may display scroll bars
When an image was added via Atto and it was set to resize automatically
if the alignment was set to Top, Middle or Bottom when it was made
smaller then a vertical scroll bar would be displayed.

This was caused by the interaction of the margin settings on the image
and the 100% width set via the img-responsive css class. The width of
an element only includes the content area and not any borders, padding
or margins.

This change stops atto hardcoding the styles for image alignment into
the images style tag, it instead adds a class that defines the alignment
the image should have.

This change has the benefit that themers will now be able to adjust
how atto image alignments work if they wish.

Images added before this patch will continue to have the issue
until they are edited by the plugin, at which time their legacy style
will be removed and the new alignment method will be added.

Thanks to Andrew Nicols who provided a refactor for the Alignment
and style detection code.
2016-09-30 08:50:38 +01:00
Damyon Wiese 0d5d8ee56a MDL-45969 editpdf: The logic for showing a previous attempt is wrong
It originally was only ever going to show static pdfs for older versions,
but this doesn't make sense in the UI for 3.1.
2016-09-30 13:15:59 +08:00
Rajesh Taneja c72e9871f1 MDL-56210 behat: Ensure behat waits for dependancy manager 2016-09-30 10:33:00 +08:00
Dan Poltawski 1695f89400 MDL-55886 block_rss_client: fix oracle compatibility 2016-09-29 16:59:35 +01:00
Deepa Jayaprakash 7e90c19710 MDL-55861 course: Click drag&drop icon, incorrect activities shown 2016-09-29 16:48:54 +01:00
Dan Poltawski 33d6ef3266 MDL-55421 travis: check npm/grunt on multiple npm versions
This is a backport of the patch from MDL-55048

Check npm install and grunt execution on the higest and lowest node
versions. Included some minor tweaks along the way:

* Move the grunt execution into scripts part of the configuration (that way
  the grunt output is not collapsed and is easily visible in build output).

* Restructure the install section to be task based (thanks to Eloy for
  the suggestion) and as such, don't run composer install on the grunt
  task (speed up the build slightly).

* Switch around the grunt job to a matrix include so that every
  variation of grunt job doesn't need to be excluded.
  ( https://docs.travis-ci.com/user/customizing-the-build/#Explicity-Including-Jobs )
2016-09-29 16:42:54 +01:00
Dan Poltawski 1c4e222256 MDL-55421 js: add some global ignores to js files
This is to prevent linting to be extremely noisy about rollup related
problems.

Should not affect built files.
2016-09-29 16:42:54 +01:00
Dan Poltawski 4b70cdd356 MDL-55421 eslint: add config/package defintion
Partial backport of MDL-52127 to allow people to use eslint linting
in earlier branches than master.

This is an earlier version of eslint than in master beacuse of
node requirements being higer.
2016-09-29 16:42:54 +01:00
Eloy Lafuente (stronk7) cf2376cf00 MDL-56127 forms: multiple select dependencies fixed
This is a fix for a regressions introduced by MDL-54778. It
seems that escaped all our tests because there isn't any case
of such a dependency in core, but Daniele Cordella was facing
it within his surveypro module.
2016-09-29 16:52:59 +02:00
Dan Poltawski 049d20856c weekly release 3.1.2+ 2016-09-29 12:43:04 +01:00
Dan Poltawski 6e70e57a48 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-09-29 12:43:02 +01:00
David Mudrák f0ffb7824d MDL-56181 lang: Fix CI and CZ country short names to match ISO 3166 2016-09-29 11:52:40 +02:00
Eloy Lafuente (stronk7) dca5737751 Merge branch 'MDL-55804_31' of git://github.com/dmonllao/moodle into MOODLE_31_STABLE 2016-09-29 01:14:41 +02:00
Eloy Lafuente (stronk7) 8eda39addc Merge branch 'MDL-56019-31' of git://github.com/dpalou/moodle into MOODLE_31_STABLE 2016-09-28 20:08:41 +02:00
Serge Gauthier bcf82800d1 MDL-55964 report_competency: Missing blocks in Competency breakdown
Fix also the breadcrumb
2016-09-28 13:27:50 -04:00
Dan Poltawski 1bfe4ed7a3 Merge branch 'MDL-56038-m31' of https://github.com/sammarshallou/moodle into MOODLE_31_STABLE 2016-09-28 14:36:49 +01:00
Eloy Lafuente (stronk7) 8c63e039d1 MDL-46946 user: Document user_not_fully_set_up() changes 2016-09-28 02:21:32 +02:00
Eloy Lafuente (stronk7) b9078cfe84 Merge branch 'MDL-46946-31-reqcusfield' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-09-28 02:19:46 +02:00
Rajesh Taneja 4b14b223c2 MDL-55957 behat: Set some text before selecting in Atto 2016-09-28 01:42:17 +02:00
Pau Ferrer Ocaña 15e9f2138f MDL-55951 output: Add errorcode to fatal_error when available 2016-09-28 00:10:04 +02:00
Tim Hunt 493f5d4851 MDL-56136 restore: better error handling copying file at start 2016-09-27 18:10:07 +01:00
AMOS bot d88b9544ff Automatically generated installer lang files 2016-09-28 00:04:44 +08:00
Dan Poltawski f808dbbafb Merge branch 'MDL-56040-31' of https://github.com/StudiUM/moodle into MOODLE_31_STABLE 2016-09-27 14:57:31 +01:00
Dan Poltawski 18b723fac1 Merge branch 'MDL-55987-31-grademem' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-09-27 11:23:49 +01:00
Dan Poltawski 965b398dd7 Merge branch 'MDL-54793-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-09-27 11:13:36 +01:00
Dan Poltawski 1557906329 Merge branch 'MDL-55957-31-workshopfiles' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-09-27 10:37:27 +01:00
Dan Poltawski caf5410257 Merge branch 'MDL-55760-31' of https://github.com/StudiUM/moodle into MOODLE_31_STABLE 2016-09-27 10:18:50 +01:00
David Monllao f7707b7196 MDL-55804 tool_uploadcourse: strftime only to user input
Default value already comes as a timestamp.
2016-09-27 08:12:08 +08:00
David Monllao 8b27687b5f MDL-55804 forms: Return exported data through _prepareValue 2016-09-27 08:12:08 +08:00
Dan Poltawski e5b39bdac5 Merge branch 'MDL-55472-assign-extend-ignored-validation-MOODLE_31_STABLE' of https://github.com/ilya-catalyst/moodle into MOODLE_31_STABLE 2016-09-26 15:32:26 +01:00
Dan Poltawski e1ce291e1a Merge branch 'wip-MDL-55519-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-09-26 15:23:15 +01:00
Juan Leyva 23460f7fdb MDL-55222 webservice: Apply external_format_string in course names 2016-09-26 12:42:20 +01:00
Ilya Tregubov ff45fa7435 MDL-55472 assign: Show userlist on extension form error page 2016-09-25 11:32:13 +10:00
AMOS bot ecff89d617 Automatically generated installer lang files 2016-09-24 00:04:36 +08:00
Issam Taboubi 7ace09de5f MDL-55760 tool_lp: Wrong rating display when more than one scale set 2016-09-23 11:03:58 -04:00
Jean-Philippe Gaudreau 1706cd5f1b MDL-56040 behat: Fixing missing "|" in tables 2016-09-23 09:19:33 -04:00
Eloy Lafuente (stronk7) 6aec209125 weekly release 3.1.2+ 2016-09-23 10:01:48 +02:00
Eloy Lafuente (stronk7) 8262bff81f Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-09-23 10:01:44 +02:00
AMOS bot 9f351dce88 Automatically generated installer lang files 2016-09-23 00:04:45 +08:00
Simey Lameze 10d480aefc MDL-54802 mod_quiz: Add validation to require passing grade greater than 0
This commit adds a form validation to prevent the creation of quizzes
using zero or null grade to pass when using require passing grade.
2016-09-22 08:54:51 +08:00
David Mudrák d82859b2c1 MDL-46946 user: Make missing required custom fields trigger profile edit
If there is a required custom field that the user can fill by editing
their profile, and that field is missing, the user should be considered
as not fully set up. Instead, we want to redirect them to edit their
profile first.

There are some exceptions when we want to fall back to the previous
behaviour and check just the name and email fields. These exceptional
cases include checking remote user data in incoming MNet request (no
user id, no custom fields supported) and calls to require_login() with
redirecting disabled (typically ajax filepicker requests on profile
editing page itself).

Additional plugins that call the function user_not_fully_set_up()
themselves, should perform the strict check in most/typical cases. So
the strict mode is enabled by default even if it changes the behaviour
slightly. In improbable case of additional plugins relying on the
previous behaviour of the function, they can use the $strict parameter
and keep performing the lax check. However, I am sure the correct fix in
that case will likely be to stop abusing this function.

Note that custom fields are not currently transferred during the MNet
roaming. So having custom fields configured as required on MNet service
provider site (where users can't edit their profiles) is expected to
display an error (as the site is considered as misconfigured).
2016-09-21 18:02:51 +02:00
Damyon Wiese 30c5f7d5e2 MDL-56052 block_settings: race condition
YUI events module must be loaded before global events can be used.
2016-09-21 12:22:16 +08:00
sam marshall 6b1e6b6beb MDL-56038 Web services: json_last_error_msg not in PHP 5.4 2016-09-20 14:55:02 +01:00
Marina Glancy d99f038262 MDL-55990 tags: remove unnecessary index creation 2016-09-20 09:31:03 +08:00
Adrian Greeve ca985c82b2 MDL-55519 activities: mform element shows correct maxgrade.
In certain circumstances the max grade value would revert
back to the default max grade value.
2016-09-20 09:29:58 +08:00
Andrew Nicols 6d26c2f7f6 Merge branch 'MDL-55876-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-09-20 09:11:10 +08:00
Simey Lameze 5ecce533f5 MDL-55876 core_course: prevent changes on front page course 2016-09-20 08:49:27 +08:00
Andrew Nicols be686d6c54 Merge branch 'MDL-55586-31' of https://github.com/StudiUM/moodle into MOODLE_31_STABLE 2016-09-20 08:19:30 +08:00
Ruslan Kabalin ac8ad1ae81 MDL-55776 enrol: Optimise enrolled users listing.
Here we optimise SQL queries for enrolled users list. Expensive subquery is
replaced with faster LEFT JOIN and the whole groups filtering component is
aded on demand.
2016-09-19 23:47:37 +02:00
Ruslan Kabalin 40e34b842b MDL-55776 enrol: Add unit tests for enrolment manager. 2016-09-19 23:47:27 +02:00
Issam Taboubi d82add23e6 MDL-55586 report_competency: Translation strings in competencies 2016-09-19 12:05:08 -04:00
Issam Taboubi 31ddf0fc3e MDL-55586 blocks_lp: Translation strings in competencies 2016-09-19 12:04:45 -04:00
AMOS bot 893391150b Automatically generated installer lang files 2016-09-20 00:04:39 +08:00
Dan Poltawski 0bfcf570e1 Merge branch 'wip-mdl-55117-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-09-19 11:39:42 +01:00
Dan Poltawski 613c9aa5c8 Merge branch 'm31_MDL-55820' of git://github.com/danmarsden/moodle into MOODLE_31_STABLE 2016-09-19 11:32:21 +01:00
Dan Poltawski f1cfb0d949 Merge branch 'MDL-55944_31' of https://github.com/mr-russ/moodle into MOODLE_31_STABLE 2016-09-19 11:28:40 +01:00
Eloy Lafuente (stronk7) 9095c382ff MDL-29332 versions: Force bump because patch ones were matching upstream 2016-09-19 12:01:20 +02:00
Eloy Lafuente (stronk7) 7e278251ee Merge branch 'wip-MDL-29332-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-09-19 11:59:01 +02:00
Dani Palou 95356cd73c MDL-56019 ws: Use itemid null when getting modules intro 2016-09-19 11:45:15 +02:00
David Monllao 23f9e0c40b Merge branch 'MDL-42041-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-09-19 15:09:29 +08:00
David Monllao e81330e2d4 Merge branch 'MDL-55602-m31' of https://github.com/mrmark/moodle into MOODLE_31_STABLE 2016-09-19 12:50:38 +08:00
Andrew Nicols 6f53b717ab Merge branch 'MDL-55932-31' of https://github.com/eberhardt/moodle into MOODLE_31_STABLE 2016-09-19 08:33:37 +08:00
AMOS bot 7c55c645c5 Automatically generated installer lang files 2016-09-17 00:04:48 +08:00
Russell Smith 6f38fa71a6 MDL-55602 session: Add redis handler with locking.
Backport of MDL-54606
2016-09-16 08:13:35 -07:00
David Mudrák d67c4d7856 MDL-55987 gradebook: Claim extra memory when updating final grades
As we experienced in a bigger moodle.org course (7500 users, 70 grade
items), the standard memory limit 256M may not be enough here. We were
not able to find any obvious memory leak in the processing. Requiring
extra memory helped in this particular case and it seems reasonable to
have it in the core.
2016-09-16 12:45:15 +02:00
AMOS bot 24e64853b0 Automatically generated installer lang files 2016-09-16 00:04:58 +08:00
Jan Eberhardt dac212419d MDL-55932 block_rss_client: Namespace fixes 2016-09-15 13:23:32 +00:00
Dan Poltawski c648d44c9b weekly release 3.1.2+ 2016-09-15 11:15:06 +01:00
Dan Poltawski 304588c980 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-09-15 11:15:05 +01:00
David Monllao efba8389e9 Merge branch 'MDL-55945-31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-09-15 12:38:53 +08:00
Jake Dallimore 9c3cd30d97 MDL-55945 login: fix https support for forgot_password.php 2016-09-15 09:21:22 +08:00
AMOS bot 1809cb1adb Automatically generated installer lang files 2016-09-15 00:12:14 +08:00
David Mudrák 516350b791 MDL-55957 workshop: Add behat tests for embedded images
This tests basic functionality of the images embedded into the
instructions and conclusion fields.
2016-09-14 14:32:52 +02:00
David Mudrák d5aa0d54ae MDL-55957 workshop: Fix the embedded files serving
There was a bug with serving the files from the areas instructauthors,
instructreviewers and conclusion. These three areas should not use the
itemid in the plugininfo URLs. But they did use 0 as the itemid which
broke the file previews when browsing via server files repository.

The first part of the patch fixes all relevant calls to
file_rewrite_pluginfile_urls() so that null is now properly used instead
of zero.

The second part of the fix is that we no longer delete the first $args
element in the workshop_pluginfile() function - the itemid is not
supposed to appear there now.

The last part of the patch is that instead of repeating the same code
block copy&pasted for each file area in workshop_pluginfile(), we now
have a single block covering them all.
2016-09-14 12:40:26 +02:00
Rajesh Taneja 32935e9bf6 MDL-55117 behat: Re-initialise to ensure modified config is not used
As behat cli process is 1 run for features
Any modification in  will be reflected
in later runs on cli. In this case
- disabling enablebadges in block_badges.feature
- reflected while running cron in award_badges.feature
2016-09-14 10:46:55 +08:00
Russell Smith e4439947ac MDL-55944 testing: Reduce sleep usage.
Remove sleep() and replace with waiting for a second to roll over,
this results in a simpler call the guarantee time() has moved forward
2016-09-14 09:50:32 +10:00
Marina Glancy 9135f6347e MDL-55864 general: fix PHP7.1 strict warnings 2016-09-13 15:24:34 +01:00
Marina Glancy c9ce7bfb20 MDL-29332 question: calculated variables may differ in case only 2016-09-13 10:18:34 +08:00
Eloy Lafuente (stronk7) 0a7c6b8a57 Merge branch 'wip-MDL-55505-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-09-12 19:26:30 +02:00
Eloy Lafuente (stronk7) 5a44db7646 Merge branch 'wip-MDL-55654-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-09-12 19:15:55 +02:00
Eloy Lafuente (stronk7) bbe5329a3b Merge branch 'MDL-55632-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-09-12 19:12:19 +02:00
Eloy Lafuente (stronk7) 1a3c879c0d Merge branch 'MDL-55874-31' of git://github.com/danpoltawski/moodle into MOODLE_31_STABLE 2016-09-12 18:32:31 +02:00
AMOS bot dbb2268e46 Automatically generated installer lang files 2016-09-13 00:04:45 +08:00
Eloy Lafuente (stronk7) 2b4d17de5b Merge branch 'MDL-55725-31' of git://github.com/merrill-oakland/moodle into MOODLE_31_STABLE 2016-09-12 17:55:11 +02:00
Eloy Lafuente (stronk7) a75d91bee3 Merge branch 'MDL-55755_31' of git://github.com/dmonllao/moodle into MOODLE_31_STABLE 2016-09-12 17:35:08 +02:00
Dan Poltawski 0baf402c71 Merge branch 'wip-mdl-55353-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-09-12 11:49:37 +01:00
Dan Poltawski 0a7742edef Merge branch 'wip-MDL-55862-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-09-12 11:11:27 +01:00
Dan Poltawski d274298126 Merge branch 'wip-mdl-55610-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-09-12 10:18:18 +01:00
David Monllao cf80222fb1 Merge branch 'MDL-55626-M31' of git://github.com/lazydaisy/moodle into MOODLE_31_STABLE 2016-09-12 12:38:27 +08:00
David Monllao 36d5449df9 Merge branch 'MDL-55873-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-09-12 12:00:15 +08:00
Simey Lameze 58a0535a04 MDL-55873 login: change back username fields to use PARAM_RAW 2016-09-12 11:50:15 +08:00
David Monllao e2c8d6b17f Merge branch 'MDL-53893-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-09-12 10:29:33 +08:00
Eloy Lafuente (stronk7) f851201f58 Moodle release 3.1.2 2016-09-10 22:50:25 +02:00
lazydaisy fd029f3aae MDL-55626 theme_clean: Fixed clean theme missing desktop-first-column 2016-09-10 01:22:49 +01:00
Stephen Bourget e8924af84a MDL-55910 events: backport MDL-45753 dashboard events 2016-09-09 10:35:22 +01:00
Marina Glancy 30399fadb0 MDL-55654 user: apply format_string to field names 2016-09-09 14:32:32 +08:00
Rajesh Taneja a22a2b148d MDL-55353 behat: Ensure teacher edit activity at different time
Recent activity is showing activities which were
updated since user last logged in and first modification
done on the activity. So ensure update happens at different
time than activity created.
2016-09-09 10:16:34 +08:00
Simey Lameze 8adf00753c MDL-53893 core_badges: Behat for all selected roles award badges 2016-09-09 08:43:45 +08:00
Simey Lameze f7d2474907 MDL-53893 core_badges: Add strictness to manual badge criteria 2016-09-09 08:43:45 +08:00
David Monllao ab2a2d629f MDL-55755 search: Correct event link 2016-09-09 07:57:54 +08:00
Adrian Greeve 0489c3c878 MDL-55505 mod_assign: Editing previous attempt works correctly.
Editing a previous attempt keeps the current feedback and grades
as it should and does not override them.
2016-09-08 20:32:25 +08:00
Adrian Greeve ab95f66c2e MDL-55862 mod_data: Use proper name function for display.
The old method for displaying the name of a field was being
used. This meant that it was not possible to show a plugin's
name in view.php

Thanks to David Herney Bernal for providing a solution.
2016-09-08 20:28:52 +08:00
Dan Poltawski 8857a38fcf MDL-55874 report_particiption: fix invalid html
When messaging disabled.
2016-09-08 08:04:48 +01:00
David Monllao 2ab80152e2 weekly release 3.1.1+ 2016-09-08 13:56:42 +08:00
David Monllao 9bb75e570d Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-09-08 13:56:40 +08:00
Eric Merrill 937ddb9e5a MDL-55725 search: Index proper time modified with indexed files 2016-09-07 17:34:23 -04:00
Adrian Greeve e7e9d06bf3 MDL-41174 mod_workshop: Added workshop_refresh_events
This function was missing from this activity.
2016-09-07 15:20:11 +08:00
Jake Dallimore 8c42211e3f MDL-50803 login: Remove token from URL in forgot password process
Store the token value in the session and redirect to self, thus
removing the token from the URL and eliminating the problem where
the token is exposed via the http referer header.
2016-09-07 09:07:28 +08:00
Juan Leyva 468de02565 MDL-49026 webservice: Remove tokens on password change 2016-09-07 09:07:28 +08:00
Eloy Lafuente (stronk7) 5ef133e913 Merge branch 'wip-mdl-55764-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-09-07 03:06:34 +02:00
Eloy Lafuente (stronk7) 2a681ccd06 Merge branch 'MDL-55618-m31' of https://github.com/NeillM/moodle into MOODLE_31_STABLE 2016-09-06 16:20:41 +02:00
Eloy Lafuente (stronk7) 2a098c992a Merge branch 'wip-MDL-55844-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-09-06 16:08:23 +02:00
Eloy Lafuente (stronk7) 9f16f3bdcd Merge branch 'wip-MDL-55832-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-09-06 15:56:15 +02:00
Dan Poltawski 929a775579 MDL-42125 quiz stats: removal trivial additional phpdocs newline 2016-09-06 11:49:11 +01:00
Dan Poltawski 2516b865f2 Merge branch 'MDL-42125_31' of git://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-09-06 11:48:52 +01:00
Dan Poltawski 1ec726e2a4 Merge branch 'wip-mdl-55749-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-09-06 08:45:44 +01:00
Andrew Nicols 0a6f9cf6d2 MDL-42041 mod_book: Add Turn Editing On to page body 2016-09-06 15:39:30 +08:00
Rajesh Taneja 9ce415860b MDL-55749 badges: define global before using it 2016-09-06 10:28:36 +08:00
David Monllao 009dcc16ae Merge branch 'MDL-55617-m31' of https://github.com/NeillM/moodle into MOODLE_31_STABLE 2016-09-06 10:18:16 +08:00
David Monllao bf80c7b9c1 Merge branch 'MDL-55587-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-09-06 10:07:11 +08:00
Rajesh Taneja b7fc4a06f1 MDL-55610 behat: Clear static file cache
php file cache might be out-of-sync
to ensure full directory is deleted
clear php file cache
2016-09-06 09:43:54 +08:00
Eloy Lafuente (stronk7) 36142e4ed6 Merge branch 'MDL-55663-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-09-05 18:07:16 +02:00
AMOS bot 3cb9eba870 Automatically generated installer lang files 2016-09-06 00:04:47 +08:00
Eloy Lafuente (stronk7) f3aeccb270 Merge branch 'MDL-55717_m31' of git://github.com/markn86/moodle into MOODLE_31_STABLE 2016-09-05 18:02:44 +02:00
Eloy Lafuente (stronk7) 28020ce31e Merge branch 'MDL-55724-m31' of https://github.com/sammarshallou/moodle into MOODLE_31_STABLE 2016-09-05 17:33:46 +02:00
Dan Poltawski 88e0275e29 Merge branch 'MDL-55627_31' of https://github.com/bostelm/moodle into MOODLE_31_STABLE 2016-09-05 14:09:16 +01:00
Dan Poltawski dd5a5b75e6 Merge branch 'MDL-55742-31' of https://github.com/xow/moodle into MOODLE_31_STABLE 2016-09-05 10:50:47 +01:00
Henning Bostelmann 9a6f6ee022 MDL-55627 filter_mathjaxloader: use correct string concatenation op 2016-09-05 11:48:33 +02:00
Dan Poltawski f641bde359 Merge branch 'MDL-55771_m31' of git://github.com/markn86/moodle into MOODLE_31_STABLE 2016-09-05 10:18:56 +01:00
Dan Poltawski 5a7ce1b2a2 Merge branch 'MDL-55815_31' of git://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-09-05 08:57:36 +01:00
Dan Poltawski 51dd539322 Merge branch 'MDL-54113-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-09-05 07:53:07 +01:00
David Monllao d966b1b18d Merge branch 'wip-MDL-41174-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-09-05 13:45:46 +08:00
David Monllao 28181985df Merge branch 'MDL-55457-31' of https://github.com/xow/moodle into MOODLE_31_STABLE 2016-09-05 11:48:43 +08:00
David Monllao c527b281d7 Merge branch 'wip-MDL-55707-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-09-05 10:48:01 +08:00
Adrian Greeve 464890f58a MDL-41174 course: Module name change updates calendar. 2016-09-05 08:55:06 +08:00
Marina Glancy 8461e34f4d MDL-55844 profile: display formatted course name 2016-09-02 17:59:58 +08:00
John Okely 60df6ae90d MDL-55457 mod_lti: Support object icon_info in tool proxy 2016-09-02 09:45:42 +08:00
Marina Glancy 4ed5fc5efa MDL-55832 mod_feedback: apply filters to multichoice quesitons 2016-09-01 21:09:21 +08:00
Tim Hunt 603ee3605b MDL-42125 quiz stats: fix regression caused by MDL-51603 2016-09-01 12:39:01 +01:00
Tim Hunt ac32161ca6 MDL-42125 quiz stats: clearer message when manual grading required 2016-09-01 12:39:00 +01:00
Cameron Ball 9823b5c677 MDL-54793 webservice_xmlrpc: Don't treat GET and POST as arguments 2016-09-01 16:06:45 +08:00
Neill Magill 6130c2493f MDL-55617 backup: Possible fatal errors in backup and restore
The unserialize() function will not always return an object
especially when as can happen the controller field of a
record in the backup_controllers table is empty.

This change ensures that in this case the script will
not cause a fatal error, but instead throw an error.
2016-09-01 08:47:51 +01:00
Neill Magill 68cbd916a6 MDL-55618 backup: Header should not be output twice
Before this patch if the pre-check failed during
the final stage of an import a request for the
page header to be output was made for a second
time, this caused a coding_error to occur.

This change removes the second request to
output the page header, which will allow the user
to see the reasons the pre-check failed.
2016-09-01 08:46:32 +01:00
John Okely 7b55399004 MDL-55742 mod_lti: Remove support for get_magic_quotes_gpc
Thanks to Bishop Bettini for the original patch.
2016-09-01 14:59:50 +08:00
David Monllao c265709cab weekly release 3.1.1+ 2016-09-01 11:14:13 +08:00
David Monllao dae85c4658 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-09-01 11:14:11 +08:00
Adrian Greeve 396d0d5e1d MDL-55707 grades: Stop infinite loop when regrading. 2016-09-01 10:26:12 +08:00
Dan Marsden c39f5f8806 MDL-55820 scorm: use correct displayattempt default options 2016-09-01 13:28:17 +12:00
Tim Hunt 246677d537 MDL-55815 quiz review: after close should beat immediately after
This only arises in specific situations: student submitted less than 2
mintues before time close, or when a teacher previews after the close
date. However, in those cases, the old behaviour was confusing. Now,
'After the quiz is closed' takes priority.
2016-08-31 13:00:22 +01:00
Tim Hunt 1e53257bce MDL-55815 quiz: convert attempt state tests to a data provider 2016-08-31 13:00:20 +01:00
Eloy Lafuente (stronk7) b60bd5b7d0 Merge branch 'MDL-55237_31' of git://github.com/dmonllao/moodle into MOODLE_31_STABLE 2016-08-30 12:54:53 +02:00
sam marshall 297486d1b7 MDL-55724 Glossary: Prevent infinite loop in trusttext_strip 2016-08-30 10:27:02 +01:00
Mark Nelson 18af7c0536 MDL-55771 core: added title attribute when using JS to render {{pix}} 2016-08-30 14:57:54 +08:00
Marina Glancy 0e611051a9 MDL-55581 htmlpurifier: test for attributes in video tag 2016-08-30 13:49:51 +08:00
David Monllao b514df00e1 Merge branch 'MDL-54873-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-08-30 12:52:48 +08:00
Andrew Nicols ebd8ffb4e1 MDL-54873 assign: Seed recordid to print_recent_activity 2016-08-30 11:57:42 +08:00
Andrew Nicols cb55cd8574 MDL-54873 assign: Add recordid fetching participants
get_submission_info_for_participants is primarily used by externallib.php
2016-08-30 11:49:29 +08:00
Andrew Nicols 4693e0ca86 MDL-54873 assign: Fetch mapping id for blind marking in cron 2016-08-30 11:49:29 +08:00
Andrew Nicols 91840654b1 MDL-54873 assign: Fetch mapping id for blind marking grading
This change modifies the grading table to pre-seed record ids where they
already exist.

Where they do not exist, they are still fetched.
2016-08-30 11:49:29 +08:00
Frederic Massart e4cbcf716b MDL-55663 filter: Filters could be incorrectly reported as inactive 2016-08-30 11:23:26 +08:00
David Monllao 0783a94d3e MDL-55237 core_component: Fix last namespace level matching
Thanks to Andreas Grabs for proposing a fix.
2016-08-30 11:16:20 +08:00
Rajesh Taneja 643b907d2f MDL-55764 behat: Reset static update db list
While running multiple suites we should
ensure static cli cache is also reset.
2016-08-30 08:01:24 +08:00
David Mudrák 0c3f40bd61 MDL-55660 tablelib: Fetch only a single row when auto defining columns
In a very rare cases where the columns are not declared explicitly, we
want to fetch single row only without a warning raised. This seems like
a valid use case for IGNORE_MULTIPLE flag.
2016-08-29 19:14:10 +02:00
AMOS bot 64e6f4e471 Automatically generated installer lang files 2016-08-30 00:04:56 +08:00
Eloy Lafuente (stronk7) 50eb83b357 Merge branch 'MDL-55667-31-participantslink' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-08-29 16:53:54 +02:00
Eloy Lafuente (stronk7) 5c6b292d93 Merge branch 'MDL-55741_31' of git://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-08-29 14:08:47 +02:00
Cameron Ball 4d4df5a1b3 MDL-55587 core_media: Properly escape ampersand 2016-08-29 19:16:29 +08:00
David Mudrák afb949e087 MDL-55667 navigation: Do not display site participants link to students
The problem here was that user/index.php checks the system level
capability moodle/site:viewparticipants when the user is on the front
page, and the moodle/course:viewparticipants on non-front pages.

But the navigation displayed the link by mistake even in situations,
when the user has the capability moodle/course:viewparticipants on the
front page (typically when the default role for the front page is set to
student).

Added behat tests for reproducing the bug and also for checking the
basic functionality of the feature.
2016-08-29 12:11:59 +02:00
David Monllao e0434911f3 Merge branch 'wip-MDL-55581-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-08-29 16:53:56 +08:00
David Monllao 7e24044902 Merge branch 'MDL-55661-31-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-08-29 14:40:37 +08:00
David Monllao db78183e45 Merge branch 'MDL-55312_load_timeout_for_amd_modules_31' of https://github.com/gthomas2/moodle into MOODLE_31_STABLE 2016-08-29 14:31:50 +08:00
Marina Glancy 28108d5e08 MDL-55581 htmlpurifier: allow track tag in videos and audios 2016-08-29 13:26:14 +08:00
David Monllao 4472485ebf Merge branch 'wip-MDL-55708-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-08-29 11:19:08 +08:00
David Monllao 93611f5e2c Merge branch 'MDL-55477_31' of git://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-08-29 11:14:28 +08:00
David Monllao 6f3590457e Merge branch 'MDL-55668-31' of git://github.com/danpoltawski/moodle into MOODLE_31_STABLE 2016-08-29 10:26:58 +08:00
Tim Hunt b2a5bd853b MDL-55741 phpunit: does not reset get_log_manager cache 2016-08-26 17:15:26 +01:00
AMOS bot 0cd3d67eac Automatically generated installer lang files 2016-08-27 00:04:51 +08:00
Helen Foster 59dacea6a6 MDL-55661 lang: Merge English strings from the en_fix language pack 2016-08-25 14:40:28 +02:00
Dan Poltawski 95839d65c7 weekly release 3.1.1+ 2016-08-25 12:09:45 +01:00
Dan Poltawski 846523c75b Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-08-25 12:09:44 +01:00
Mark Nelson 97e886c576 MDL-55717 core: add 'ignoredirty' class to inplace editable 2016-08-25 16:08:09 +08:00
Rajesh Taneja 01f32afad4 MDL-46514 behat: Get config value from db, to avoid cache 2016-08-25 10:37:24 +08:00
Marina Glancy c59eddd327 MDL-55708 mod_assign: display formatted acitvity names 2016-08-25 09:53:51 +08:00
AMOS bot d4f6d857bf Automatically generated installer lang files 2016-08-25 00:05:19 +08:00
Damyon Wiese 1fc7e6b184 MDL-55668 assign: Don't link to user profile if blind marking is enabled 2016-08-24 11:39:48 +01:00
Andrew Nicols b6e3abd875 MDL-54113 assign: Open files in new window
Open files in a new window when viewing to ensure that the form change
checker does not warn about the page reloading.
2016-08-24 11:34:21 +08:00
David Monllao 08f5c15f6e MDL-55604 cache: Updating comment according to code changes 2016-08-24 09:39:01 +08:00
David Monllao 6fa8232f32 Merge branch 'MDL-55604-31' of https://github.com/mr-russ/moodle into MOODLE_31_STABLE 2016-08-24 09:36:36 +08:00
Russell Smith 6311ae6d29 MDL-55604 cache: Fix identifier and cacheable_object
When a cachable object is store in the static cache from
the backing store, it was incorrect serialised rather than
using the wake function.  This has been resolved and tests added.

During the investigation into cacheable_object, it was discovered
that set_identifiers never removes identifiers when you call it,
so set_identifiers(array('a')) and set_identifiers(array('b')) really
resulted in array('a','b') as the identifiers rather than 'b'.

The fix for this issue depends on the set_identifiers fix and
they have been coupled together as a result.
2016-08-24 11:25:53 +10:00
David Monllao 954881c187 Merge branch 'MDL-55385_31_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_31_STABLE 2016-08-24 08:24:42 +08:00
gthomas2 1df4dfe560 MDL-55312 requirejs: Fix timeouts with infinite waitSeconds 2016-08-23 17:40:03 +01:00
Dan Poltawski 868acab35c Merge branch 'MDL-55628-m31' of https://github.com/sammarshallou/moodle into MOODLE_31_STABLE 2016-08-23 15:48:11 +01:00
Dan Poltawski 1e5edb62a0 MDL-55423 tests: remove non-cross-db testcase
This isn't used in moodle core and is problematic on oracle, don't test
it.
2016-08-23 12:37:24 +01:00
Mark Johnson 9f95b657e2 MDL-55385 output: Support non-integer output_buffering values 2016-08-23 11:22:57 +01:00
Dan Poltawski db10a07def Merge branch 'wip-mdl-46514-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-08-23 08:59:41 +01:00
David Monllao 008dede307 Merge branch 'MDL-46654-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-08-23 15:31:12 +08:00
Rajesh Taneja 1278115963 MDL-46514 behat: section should be set before switch-case 2016-08-23 15:19:29 +08:00
Rajesh Taneja bb13f05a0e MDL-46514 behat: Catch php errors in shutdown hook
If error is not displayed in web browser then
it will be caught in shutdown hook, so we can
show it to user
2016-08-23 15:19:29 +08:00
Rajesh Taneja f7a8bc6378 MDL-46514 behat: Delete tablesupdatedbyscenario before suite
Delete tablesupdatedbyscenario before db reset to ensure
db is fully reset. In case user exits or process terminated
then the file will be left and can lead to wrong results
2016-08-23 15:19:29 +08:00
Rajesh Taneja 47f8aa9400 MDL-46514 behat: Catch errors shown by JS 2016-08-23 15:19:29 +08:00
David Monllao 8ea8024e35 Merge branch 'MDL-55391-31' of git://github.com/danpoltawski/moodle into MOODLE_31_STABLE 2016-08-23 13:00:42 +08:00
David Monllao 3a250bbae9 Merge branch 'MDL-54838-31' of https://github.com/nashtechdev01/moodle into MOODLE_31_STABLE 2016-08-23 12:44:08 +08:00
sam marshall 3226f39671 MDL-55628 Completion: Use simpledata for completion cache
The completion cache is currently not marked as simpledata. On the
course page it is frequently retrieved hundreds of times which results
in many calls to the slow unserialize function. By making a slight
change to the data format (using arrays instead of objects) we can
mark it as simpledata, which will avoid using unserialize.
2016-08-22 17:15:09 +01:00
Dan Poltawski 2f46fadb78 Merge branch 'MDL-55273-cookie-secure-default-MOODLE_31_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_31_STABLE 2016-08-22 15:25:38 +01:00
Jake Dallimore 4f424b7b0c MDL-55565 core_backup: Fix warning when restoring question categories
Fixed a call to get_records_sql, which was being used incorrectly in
restore_find_best_target_context to determine a unique contextid.
2016-08-22 14:23:18 +01:00
Dan Poltawski 5d27e53631 Merge branch 'MDL-55605-lesson-restore-bug-MOODLE_31_STABLE' of https://github.com/kenneth-hendricks/moodle into MOODLE_31_STABLE 2016-08-22 14:13:27 +01:00
Dan Poltawski d62cb5dd84 Merge branch 'MDL-55551_m31v1' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-08-22 12:53:32 +01:00
Dan Poltawski bbc4dd5810 Merge branch 'MDL-55557_m31v1' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-08-22 12:45:54 +01:00
Andrew Nicols b8ff0cd6e5 MDL-46654 mod_forum: Hide digestoptions when no subscription
Daily digest options should not be generated if the user cannot subscribe
to anything in the first place.
2016-08-22 19:12:52 +08:00
Dan Poltawski 64227b4233 Merge branch 'MDL_55423_31' of https://github.com/alexandru-elisei/moodle into MOODLE_31_STABLE 2016-08-22 09:57:21 +01:00
Tim Hunt 033edd6cf7 MDL-55477 quiz reports: all user fields should have repeats suppressed 2016-08-19 18:05:14 +01:00
Dan Poltawski 19660f1f0f MDL-55391 block_rss: fix typo preventing feed title display 2016-08-19 09:44:40 +01:00
Andrew Nicols fcc0c4c8c8 MDL-55632 mod_forum: Tidy up forum post messages 2016-08-19 09:57:28 +08:00
Kenneth Hendricks d56d575df9 MDL-55605 mod_lesson: Fix activitylinks restore bug 2016-08-18 16:38:20 +10:00
Adrian Greeve 2a6404aa68 MDL-22183 lib: More unit tests for next day start. 2016-08-18 10:21:06 +08:00
Adrian Greeve f65ff89e69 MDL-22183 lib: Cleanup of get_next functions. 2016-08-18 10:20:51 +08:00
Adrian Greeve 42490916b4 MDL-22183 lib: Time settings removed for stats cron.
Old settings that should be ignored have been removed from the
statistics cron code.
2016-08-18 10:20:31 +08:00
Alexandru Elisei e8d84901ca MDL-55423 accesslib: Prevent get_role_users() false debugging messages 2016-08-17 20:39:40 +03:00
Dan Poltawski e90dfb32ae weekly release 3.1.1+ 2016-08-17 14:47:20 +01:00
Andrew Nicols 1ea227df0c Merge branch 'wip-MDL-50586-31-fix' of https://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-08-17 13:33:12 +08:00
Marina Glancy 69ec2b9e95 MDL-50586 gradingform_rubric: 0-level warning during redirection 2016-08-17 13:00:04 +08:00
Dan Poltawski 5ec43185b2 Merge branch 'MDL-36713_m31v2' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-08-16 12:05:13 +01:00
Andrew Nicols b4b46d838d Merge branch 'MDL-55272-31' of https://github.com/mr-russ/moodle into MOODLE_31_STABLE 2016-08-16 15:10:06 +08:00
Brendan Heywood 5c2e284ac5 MDL-55273 admin: Change $CFG->cookiesecure default to on 2016-08-16 13:35:47 +10:00
Damyon Wiese 6abdc807a9 MDL-55520 forms: Properly format the grademax for the database 2016-08-16 11:21:43 +08:00
Russell Smith ffd1a26a0b MDL-55272 lib: Allow random_bytes() to return large values.
PHP has a recursion limit and random_bytes on PHP5.6 without openssl
will error if sent a large value.  Using a loop has lower overhead than
recursion as well.
2016-08-16 12:15:04 +10:00
Stephen Bourget e70c8017ee MDL-36713 Blog: Display accurate error when a guest views a user blog 2016-08-15 21:49:25 -04:00
Andrew Nicols 7d7db30389 Merge branch 'wip-MDL-50586-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-08-16 08:52:37 +08:00
Andrew Nicols aab047089d MDL-54647 tests: Clarify unoconv tests 2016-08-16 08:18:39 +08:00
Andrew Nicols 31b0497988 Merge branch 'MDL-54647-31' of git://github.com/damyon/moodle into MOODLE_31_STABLE 2016-08-16 08:18:30 +08:00
Dan Poltawski 0ba31f0fd0 Merge branch 'wip-MDL-55494-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-08-15 13:14:41 +01:00
Dan Poltawski 22d7758077 MDL-52105 enrol_self: fix upgrade savepoint 2016-08-15 12:11:46 +01:00
Dan Poltawski 74d9779561 Merge branch 'wip-MDL-55366-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-08-15 11:43:46 +01:00
Dan Poltawski 57d60766f5 Merge branch 'wip-mdl-55380-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-08-15 11:38:34 +01:00
Dan Poltawski dbb90a1242 Merge branch 'wip-MDL-55397-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-08-15 11:35:37 +01:00
Dan Poltawski cc94a621e0 Merge branch 'MDL-52105-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-08-15 11:15:46 +01:00
Damyon Wiese 6659c61d2c MDL-54647 tests: Reverse order of expected and actual 2016-08-15 16:34:59 +08:00
Damyon Wiese e9365f3e44 MDL-54647 file_storage: Redo the test pdf every time it's viewed 2016-08-15 16:34:58 +08:00
Andrew Nicols a5ea66c91a Merge branch 'MDL-55513-31' of https://github.com/lucisgit/moodle into MOODLE_31_STABLE 2016-08-15 14:09:23 +08:00
Simey Lameze 63bf2d4d50 MDL-52105 enrol_self: Behat test for key holder feature 2016-08-15 12:50:22 +08:00
Simey Lameze 331488f381 MDL-52105 enrol_self: Fix wrong holdkey cap restriction for manager
This commit add an upgrade step to remove wrong CAP_PROHIBIT on enrol/self:holdkey for manager role.
Also remove the restriction from the self enrolment access file.
2016-08-15 12:50:21 +08:00
Andrew Nicols 432ed966ae Merge branch 'MDL-55229-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-08-15 12:40:43 +08:00
Andrew Nicols 30fdcea14c Merge branch 'MDL-55520-31' of git://github.com/damyon/moodle into MOODLE_31_STABLE 2016-08-15 11:02:35 +08:00
Adrian Greeve c013c28561 MDL-55366 mod_lesson: Fix warning with TF page.
Having an image in the answer text would create a warning.
2016-08-15 10:19:32 +08:00
Stephen Bourget f9bdb59be6 MDL-55557 mod_wiki: Add missing MOODLE_INTERNAL checks 2016-08-13 21:44:01 -04:00
Stephen Bourget 4bbb0f5f9d MDL-55551 Blog: Add missing MOODLE_INTERNAL check. 2016-08-12 20:22:30 -04:00
Marina Glancy 7407be758e MDL-55494 report_eventlist: ignore only logstore_legacy 2016-08-12 13:56:23 +08:00
Marina Glancy c8e4ff2aa5 MDL-55494 tool_monitor: ignore only tool_monitor and logstore_legacy
previously any plugin type ending with _monitor or _legacy would be ignored
2016-08-12 13:56:22 +08:00
Marina Glancy c9958ef015 MDL-50586 gradingform_rubric: warn about missing 0-points levels 2016-08-12 13:26:40 +08:00
Rajesh Taneja af24b9d15f MDL-55380 behat: Fixed shared stats definition
Stats definition was being shared between
progress and moodle_progress format which
was causing double counting. Now they both
have there own stats counter definitions
2016-08-12 10:28:04 +08:00
Marina Glancy 2f38964de1 MDL-55397 block_site_main_menu: eliminate CSS conflict
CSS for '.path-admin .buttons' defines padding, border and background that affected how main menu looks on admin pages
2016-08-11 15:42:11 +08:00
Damyon Wiese e5775ef5b2 MDL-55520 assign: Behat test for rescaling max grades bug
Verify the max grade is not silently changed back to 100 when you visit
and save the assignment settings form.
2016-08-11 15:14:38 +08:00
Damyon Wiese 6037304fc1 MDL-55520 forms: Mod grade is changing values back to default
When a field is disabled in the page - no value is sent and modgrade is reverting
to the default. This change prevents the max grade from changing accidentally.
2016-08-11 14:44:13 +08:00
Tony Butler 0ae591c0bd MDL-55513 core_filestorage: Touch and test size instead of file_exists()
file_exists() can return false when file exists (in certain scenarios)
2016-08-11 07:16:51 +01:00
Tony Butler 1dd284107c MDL-55513 core_filestorage: Pass full path of temp dir to remove_dir() 2016-08-11 07:16:51 +01:00
Andrew Nicols bba74ca5ce weekly release 3.1.1+ 2016-08-11 13:17:21 +08:00
Andrew Nicols c4f61a09f1 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-08-11 13:17:18 +08:00
Andrew Nicols 6025c96e81 MDL-55333 mod_feedback: Correct constant name 2016-08-10 10:13:29 +08:00
Andrew Nicols 616638a3d8 Merge branch 'wip-MDL-55333-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-08-10 10:13:19 +08:00
Simey Lameze 369856e371 MDL-55229 course: Handle invisible course categories 2016-08-10 09:55:15 +08:00
AMOS bot 66de733a08 Automatically generated installer lang files 2016-08-10 00:04:51 +08:00
Dan Poltawski 6c906b7472 Merge branch 'wip-MDL-55425-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-08-09 10:58:41 +01:00
Dan Poltawski c349d5875f Merge branch 'MDL-55246_unoconv_31' of https://github.com/Syxton/moodle into MOODLE_31_STABLE 2016-08-09 10:11:14 +01:00
Dan Poltawski dde46ce38f Merge branch 'MDL-55390_31-fix' of git://github.com/dmonllao/moodle into MOODLE_31_STABLE 2016-08-09 09:29:44 +01:00
Dan Poltawski 77d2baacb1 Merge branch 'MDL-55225-31' of git://github.com/dpalou/moodle into MOODLE_31_STABLE 2016-08-09 09:21:23 +01:00
Dan Poltawski 1556a6461a MDL-51078 report_log: use simpler/faster str_split over preg_split 2016-08-09 09:08:05 +01:00
Stephen Bourget 78d55507e7 MDL-51078 report_log: Allow filtering by all changes 2016-08-09 09:08:01 +01:00
David Monllao faafae96e9 MDL-55390 search: base class was in core_search\area 2016-08-09 15:35:15 +08:00
Andrew Nicols 39bb6831fc Merge branch 'wip-mdl-55329-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-08-09 14:27:49 +08:00
Andrew Nicols 362c7aa6bd Merge branch 'MDL-55480-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-08-09 13:54:29 +08:00
Andrew Nicols 350918e58d MDL-55390 core_search: Correct variable name 2016-08-09 13:44:36 +08:00
Devang Gaur 0474ba379e MDL-55390 core_search: check if a search area is real 2016-08-09 13:44:32 +08:00
Andrew Nicols 657fc14951 MDL-55274 mod_chat: Add unit tests for special commands 2016-08-09 10:49:34 +08:00
Andrew Nicols 466c31ba43 Merge branch 'MDL-55274-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-08-09 10:49:23 +08:00
Dan Poltawski a943c4cd4d Merge branch 'MDL-55398_m31v1' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-08-08 10:40:47 +01:00
Dan Poltawski 50b5467ba1 Merge branch 'wip-MDL-55418-m31' of https://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-08-08 10:33:45 +01:00
Mark Nielsen 741d8abe84 MDL-55453 core_lib: Fix usage of js_send_uncached 2016-08-08 09:54:13 +01:00
Russell Smith cdb3a0e501 MDL-55292 performance: Allow Tideways profiler extension.
PHP7 doesn't have any default XHProf support and all other
investigated forks don't have stable PHP7.  Tideways is under
active development and is easy to install.  The data format
is compatible with XHProf so it is a drop-in replacement in that way.
2016-08-08 15:26:11 +08:00
Marina Glancy 837fb636d4 MDL-55333 mod_feedback: work around MySQL tables in join limit 2016-08-08 14:40:51 +08:00
Nick Phillips a27fe6be90 MDL-55274 mod_chat: regain beep and / command in mod_chat.
format_text cannot be called on the whole input text, but must be
called on user-supplied text that will be output into chats. This
means it cannot simply be called in one place, but must instead be
called on the relevant parts of text once commands have been matched.
2016-08-08 12:30:18 +08:00
fhuebler f14161532e MDL-55480 competency: Added missing closing tag 2016-08-08 11:01:04 +08:00
Andrew Nicols 30257f7959 Merge branch 'MDL-55454_31' of git://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-08-08 10:03:53 +08:00
AMOS bot 80f687788d Automatically generated installer lang files 2016-08-06 00:04:58 +08:00
Matt Davidson c79398ea60 MDL-55246 assign: convert files with spaces
If a file is sent to unoconv with a filename that contains spaces,
unoconv will fail to produce the intended results.
2016-08-05 08:16:01 -04:00
Marina Glancy 9d98f9e1f4 MDL-55425 user: allow to update another user editor pref 2016-08-05 09:39:28 +08:00
Andrew Nicols 56394c8bd6 weekly release 3.1.1+ 2016-08-04 09:59:02 +08:00
Andrew Nicols 785ae8a346 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-08-04 09:58:59 +08:00
Rajesh Taneja ab70395d0b MDL-54656 behat: Skip test if db family is not mysql or postgres 2016-08-04 08:47:04 +08:00
Tim Hunt df546e9e3a MDL-55454 quiz: loses shufflequestion setting restoring old backups 2016-08-03 18:46:20 +01:00
Marina Glancy 174b641661 MDL-55418 behat: correct exception class name 2016-08-03 09:17:52 +08:00
Eloy Lafuente (stronk7) 6e4672f5ce Merge branch 'MDL-54656_m31v3' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-08-03 00:51:37 +02:00
Eloy Lafuente (stronk7) 418c1835a2 Merge branch 'MDL-55166-31-blocksettings' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-08-03 00:34:04 +02:00
Eloy Lafuente (stronk7) 8ac6adeaf8 Merge branch 'MDL-55322-31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-08-03 00:14:41 +02:00
Dan Poltawski ad4fbd423f MDL-54847 tests: fix unused var 2016-08-02 20:13:56 +01:00
Cameron Ball 2c18b1321e MDL-54847 weblib: Test media attributes individually 2016-08-02 20:13:49 +01:00
Mark Nielsen 528a9d1a02 MDL-55314 mod_lti: Several fixes to lti_load_cartridge
* Fixed XML loading when there is an error
* Fixed exception thrown by lti_load_cartridge
* By default, don't allow LTI mod generator to
  use a toolurl as that results in a cURL call.
2016-08-02 17:40:46 +02:00
Eloy Lafuente (stronk7) 790b9eab79 Merge branch 'MDL-55315-M31' of https://github.com/mrmark/moodle into MOODLE_31_STABLE 2016-08-02 17:08:39 +02:00
Eloy Lafuente (stronk7) 67d51a5eff Merge branch 'MDL-55316-M31' of https://github.com/mrmark/moodle into MOODLE_31_STABLE 2016-08-02 17:02:43 +02:00
Eloy Lafuente (stronk7) 91071cffce Merge branch 'MDL-55348-31' of git://github.com/dpalou/moodle into MOODLE_31_STABLE 2016-08-02 16:48:57 +02:00
Dan Poltawski 311eae0213 Merge branch 'wip-MDL-33741-m31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-08-02 12:20:32 +01:00
Dan Poltawski 82e580d698 Merge branch 'MDL-55357_31' of git://github.com/dmonllao/moodle into MOODLE_31_STABLE 2016-08-02 11:01:17 +01:00
Dan Poltawski 8cf6371521 Merge branch 'MDL-54847-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-08-02 11:00:34 +01:00
Cameron Ball 469aa911c1 MDL-54847 weblib: Support basic HTML media tags 2016-08-02 15:54:56 +08:00
Andrew Nicols 20eb9b3998 Merge branch 'MDL-54879-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-08-02 09:13:35 +08:00
Stephen Bourget 93375cb2f9 MDL-55398 mod_feedback: prevent direct script access to lib files. 2016-08-01 20:55:12 -04:00
Dan Poltawski 8025e88b87 Merge branch 'MDL-55360-31-workshopgradepass' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-08-01 18:55:08 +01:00
AMOS bot f1ef8b34df Automatically generated installer lang files 2016-08-02 00:04:26 +08:00
Dan Poltawski 3b753dc7ca MDL-55376 assign: trailing whitespace 2016-08-01 16:07:58 +01:00
Dan Poltawski 79315c0306 Merge branch 'MDL-55376-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-08-01 16:06:58 +01:00
Dan Poltawski 266e48893a Merge branch 'MDL-55323-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-08-01 13:58:21 +01:00
Dan Poltawski 32bc32736b Merge branch 'MDL-55374-31' of git://github.com/damyon/moodle into MOODLE_31_STABLE 2016-08-01 13:50:40 +01:00
Andrew Nicols 55d3501159 Merge branch 'MDL-53152-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-08-01 15:07:23 +08:00
Jun Pataleta 2a07ee5c2a MDL-53152 theme: Add parentheses to variable calculations 2016-08-01 13:41:08 +08:00
Jake Dallimore 9e6ed38418 MDL-55322 assignfeedback_editpdf: Prevent scroll when moving comments
Prevent the default scroll behaviour when using gestures to move
comments on the mobile site.
2016-08-01 09:48:20 +08:00
Andrew Nicols 1335a27a0b Merge branch 'MDL-55289-31-exsubmission' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-08-01 09:29:12 +08:00
Marina Glancy 562593e9db MDL-33741 file_info: show courses in hidden categories
This also has a couple of bugfixes:
- file_info_context_system::get_children() was looking for courses with parent=0, it is impossible, block removed;
- file_info_context_coursecat::get_area_coursecat_description() was checking the wrong capability to view files in description
2016-08-01 09:17:03 +08:00
Marina Glancy d6a24b5794 MDL-33741 file_info: check capability when serving file in coursecat description 2016-08-01 09:16:59 +08:00
Cameron Ball 04ad26aa2a MDL-55376 mod_assign: Fix bug stopping admin from editing submissions 2016-07-29 19:08:58 +08:00
David Monllao b5b1eedaac MDL-55357 search: Contents include UTF8 characters, adding u modifier 2016-07-29 14:36:49 +08:00
Damyon Wiese 50cb7da5f9 MDL-55374 mod_assign: Force utf-8 for DOMDocument
This prevents charset issues on some sites.
2016-07-29 10:45:54 +08:00
AMOS bot 023bf2ed39 Automatically generated installer lang files 2016-07-29 00:05:49 +08:00
Dani Palou a44bee5f2d MDL-55348 wiki: Convert 'section' WS params to PARAM_RAW 2016-07-28 10:39:46 +02:00
David Mudrák 2b09881896 MDL-55360 workshop: Add tests for setting grades to pass via mod form
These scenarios should cover common cases of defining the grades to pass
pass via the workshop settings form. Note that behaviour of the fields
in terms of locale-specific decimals input (MDL-51806) is not covered
with these tests as I want to avoid installation of additional language
pack. Instead, I assume that functionality of unformat_float() is tested
separately in the core.
2016-07-28 09:54:45 +02:00
David Mudrák d3a636163f MDL-55360 workshop: Emptying grades to pass should set them to zero
When editing existing workshop with a grade to pass defined, when the
field is emptied, it should be interpreted as setting it to zero. This
was not happening because unformat_float replaces the field with null,
therefore effectively unsetting it.

By casting to float, we interpret all empty values (including null) as
zeros. This behaviour is consistent with how gradebook setup UI works.
2016-07-28 09:54:45 +02:00
David Mudrák 6b8511e8c5 MDL-55360 workshop: Allow creating workshops with empty grades to pass
As a regression of MDL-55360, it was not possible to create new
workshops if the field "Submission grade to pass" or "Assessment grade
to pass" was left empty. The validation failed with "You must enter a
number here".

The fields submissiongradepass and gradinggradepass are always present
as we explicitly define them in the mod form. So the isset() condition
in the validation was useless and it did not allow to submit the form
with these fields empty.

Additionally, the unformat_float() returns null only if it receives
empty value on the input. Which can't happen in our case so I am
removing this condition to improve the readability of the code.
2016-07-28 09:54:45 +02:00
David Mudrák a2e7fd18ee MDL-55289 workshop: Fix files processing in example submissions
While testing the issue MDL-55289 I realized that attaching files to
workshop example submissions does not work at all and throws an error.

The reason was that in MDL-50794 (996f7e82), the variables $contentopts
and $attachmentopts were replaced with the result of the methods
submission_content_options() and submission_attachment_options().
But I forgot to perform the full refactoring in exsubmission.php too.

Attached behat test should cover both issues on this branch.
2016-07-28 09:51:18 +02:00
David Mudrák badf4c1eef MDL-55289 workshop: Include repository/lib.php to use its constants
As a result of MDL-41556 (146893d6), the repository/lib.php was included
in submission.php so that its constant FILE_INTERNAL could be used in
field options. Recent development in MDL-50794 (996f7e8) moved the
options declaration to standalone methods but we forgot to check they
work in exsubmission.php too.

This patch moves the repository/lib.php inclusion to where the
library is actually needed.

Additionally it unifies how options are set for overall feedback content
and overall feedback attachment fields.
2016-07-28 09:51:18 +02:00
Jun Pataleta 1d991dcf32 MDL-55323 enrol_lti: Remove unused required parameter 2016-07-28 14:45:08 +08:00
Jun Pataleta fee48e90ad MDL-54879 mod_lti: Add fallback options for error message upon failure 2016-07-28 14:39:25 +08:00
David Monllao 2a9c12ce0b weekly release 3.1.1+ 2016-07-28 12:07:27 +08:00
David Mudrák f5a1aafa89 MDL-55166 admin: Fix display of misleading debug warning on manage block
Blocks can declare has_config() as true without actually using the
default node in the admin tree. Typical use case is when the block
injects its settings to other parts of the admin tree and it assigns
null to its $setting node in its settings.php file.

As Janek L.B. correctly spotted, this led to false debugging message
on admin/blocks.php as the code interpreted it as missing settings.php
file.

The patch adds explicit file existence test for this rare case.
2016-07-27 23:09:51 +02:00
Dani Palou f147248f5c MDL-55225 assign: Format assignment submission text in WS 2016-07-27 13:31:09 +02:00
Rajesh Taneja 85f20080a0 MDL-55329 behat: PyStrings should end with : (colon) 2016-07-27 07:02:09 +08:00
Tony Butler ab3894208a MDL-55245 assignfeedback_editpdf: Enable text in comments to be selected
Only move comment boxes if 'select' tool is selected, enabling users to
drag-select text within comments using the 'comment' tool.
2016-07-26 23:47:16 +02:00
Eloy Lafuente (stronk7) 34930b4115 Merge branch 'wip-MDL-51735-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-07-26 20:16:59 +02:00
Eloy Lafuente (stronk7) 5839f95f3a Merge branch 'MDL-54657_m31v1' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-07-26 19:57:06 +02:00
Eloy Lafuente (stronk7) b5fc1b1f13 Merge branch 'wip-mdl-55337-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-07-26 13:27:03 +02:00
Rajesh Taneja 3eacb31527 MDL-55337 behat: Added 1 sec delay between post
Ensure post is created at different timestamp, else
returned posts will be different and test fails.
This will happen on a fast machine.
2016-07-26 19:01:15 +08:00
David Monllao ea634405d6 MDL-55183 atto: Fix whitespaces 2016-07-26 10:05:44 +08:00
David Monllao 2f905b06d7 Merge branch 'wip-MDL-55183-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE
Conflicts:
	lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-min.js
2016-07-26 09:56:52 +08:00
Adrian Greeve bc29b3920b MDL-55183 editor_atto: Fix requires error.
When using a different theme and removing an editor
plugin such as the equation plugin, atto will display
an error about a missing dependency.

A thank you to Anthony Forth for providing this patch.
2016-07-26 09:42:37 +08:00
David Monllao cf620188a7 Merge branch 'MDL-55283-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-07-26 05:04:21 +08:00
David Monllao e764c1bf72 Merge branch 'MDL-51242-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-07-26 02:41:06 +08:00
Mark Nielsen 73c218f4c5 MDL-55315 mod_lti: Fix Nginx 405 error
It appears that Nginx doesn't allow POST
to static files.  So rename the fixture from
a HTML file to a PHP file.
2016-07-25 09:23:14 -07:00
Mark Nielsen df93cb661b MDL-55316 core_completion: Expand fields for Behat
This only happens if you create the course with
one user and then try to enable completion
with another user.
2016-07-25 09:19:35 -07:00
Dan Poltawski f8b4522d35 Merge branch 'MDL-55284-31' of git://github.com/damyon/moodle into MOODLE_31_STABLE 2016-07-25 15:53:39 +01:00
Dan Poltawski 929329f58c Merge branch 'wip-MDL-54796-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-07-25 10:28:29 +01:00
Stephen Bourget f6d310f0f7 MDL-55252 mod_chat: prevent direct script access to lib files. 2016-07-25 09:42:37 +01:00
Stephen Bourget 7e8203ec65 MDL-55253 mod_choice: prevent direct script access to lib files. 2016-07-25 09:40:43 +01:00
Stephen Bourget 180c475961 MDL-55255 mod_data: prevent direct script access to lib files. 2016-07-25 09:40:16 +01:00
An Pham Van 6358e71651 MDL-54838 workshop: Differentiate labels for each comment field.
In a Workshop activity, comment fields on Assessment forms do not properly link to the corresponding Aspect.
So screen reader users may find it difficult to complete the Assessment forms.
There should be a hidden label text for each comment field.
2016-07-25 14:16:27 +07:00
Adrian Greeve 8861612c52 MDL-51735 mod_lesson: A lesson with no content shows a message.
Before it would show an error.
2016-07-25 10:54:53 +08:00
Adrian Greeve 2f7b29a366 MDL-54796 forms: Editor restore event created.
The editor restore event is currently being subscribed
to by the change checkers to refresh their savedstate.
2016-07-25 10:45:30 +08:00
Eloy Lafuente (stronk7) 4eeb5e469b weekly release 3.1.1+ 2016-07-21 11:45:14 +02:00
Eloy Lafuente (stronk7) 9744164d37 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-07-21 11:45:10 +02:00
Damyon Wiese 2d2aaf36f3 MDL-55284 assign: Add missing webservice param 'onlyids'
Mod assign list_participants webservice is supposed to accept a param to limit the
returned data to only show user ids and not the full user details. It is missing
and so the full user records are fetched every time. This has a major impact on the
performance of the new assignment grading interface.
2016-07-20 15:18:18 +08:00
Andrew Nicols 15f8415fef MDL-55283 javascript: Check dir is readable before traversing them 2016-07-20 12:16:56 +08:00
AMOS bot 6837281309 Automatically generated installer lang files 2016-07-20 00:05:27 +08:00
Eloy Lafuente (stronk7) f97b4d2198 Merge branch 'MDL-55220-31' of git://github.com/jleyva/moodle into MOODLE_31_STABLE 2016-07-19 13:22:16 +02:00
Eloy Lafuente (stronk7) 3ca9d711e1 Merge branch 'wip-mdl-55258-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-07-19 12:13:10 +02:00
Dan Poltawski e731e849f7 Merge branch 'MDL-55206-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-07-19 10:52:35 +01:00
Dan Poltawski f6824dd82f Merge branch 'MDL-54915-31' of http://github.com/damyon/moodle into MOODLE_31_STABLE 2016-07-19 09:38:58 +01:00
Dan Poltawski f8e748dd4d Revert "Merge branch 'MDL-54915-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE"
This reverts commit f1ec07fe11, reversing
changes made to 1972614e16.
2016-07-19 09:37:18 +01:00
David Monllao ca8cef50d3 Merge branch 'MDL-55157_m31v6' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-07-19 08:42:07 +02:00
Damyon Wiese e2bae72003 MDL-54915 templates: Fix async rendering of js blocks
Mustache JS helper can overwrite JS blocks when using nested templates.

Each call to render should have it's own scope.
2016-07-19 13:00:59 +08:00
Rajesh Taneja 695df07228 MDL-55258 behat: Set focus on button before clicking it
Set the focus on button to ensure it is in
viewport before clicking on it.
2016-07-19 10:40:55 +08:00
Stephen Bourget 887eb290ba MDL-55157 mod_feedback: Course reset should update dates 2016-07-18 22:10:15 -04:00
Eloy Lafuente (stronk7) 539b53d611 MDL-52544 oracle: small tweaks
This commit just:

- Moves the null => '' to better place, restricting it to PHP >= 7.0
  (bug https://bugs.php.net/bug.php?id=72524)
- Adds a couple of notes here and there.
- Changes some small details to keep the file using the same coding.
2016-07-19 04:04:44 +02:00
Eloy Lafuente (stronk7) 70d4cfb9f7 Merge branch 'MDL-52544-31' of git://github.com/damyon/moodle into MOODLE_31_STABLE 2016-07-19 04:04:40 +02:00
Eloy Lafuente (stronk7) d93247a237 Merge branch 'MDL-51410_m31v2' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-07-19 02:31:31 +02:00
David Monllao 923053d5a1 Merge branch 'MDL-55161-m31' of https://github.com/micaherne/moodle into MOODLE_31_STABLE 2016-07-18 20:02:22 +02:00
David Monllao 15f367ba1d Merge branch 'MDL-55163-31' of git://github.com/jleyva/moodle into MOODLE_31_STABLE 2016-07-18 19:45:08 +02:00
Dan Poltawski f825156be9 Merge branch 'wip-mdl-55174-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-07-18 14:49:52 +01:00
Dan Poltawski bcbc0b9f03 Merge branch 'MDL-55190-31' of git://github.com/merrill-oakland/moodle into MOODLE_31_STABLE 2016-07-18 14:21:04 +01:00
Dan Poltawski 4dc180b05d Merge branch 'MDL-55012-31' of git://github.com/damyon/moodle into MOODLE_31_STABLE 2016-07-18 13:57:41 +01:00
Dan Poltawski bff5af27de Merge branch 'MDL-54963_31' of git://github.com/dmonllao/moodle into MOODLE_31_STABLE 2016-07-18 13:38:39 +01:00
Dan Poltawski 19722fbf92 Merge branch 'wip-mdl-54977-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-07-18 13:27:53 +01:00
Dan Poltawski 259c070a9d Merge branch 'MDL-55240-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-07-18 10:51:08 +01:00
Dan Poltawski f1ec07fe11 Merge branch 'MDL-54915-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-07-18 09:17:53 +01:00
Rajesh Taneja 5adea0017f MDL-55174 core_tests: Use proper itemid while creating file 2016-07-18 10:30:05 +08:00
AMOS bot b9aee5ae58 Automatically generated installer lang files 2016-07-16 00:05:39 +08:00
Jun Pataleta f4e03e2aa1 MDL-55206 admin: Some code cleanup
* Removed unnecessary TODOs.
* Changed message prompt case to sentence case.
2016-07-15 14:52:25 +08:00
Jun Pataleta 5e1291cf90 MDL-55206 admin: Remove div tags in password policy error message 2016-07-15 14:47:15 +08:00
Rajesh Taneja b62061f44a MDL-55174 core_testing: Use proper directory separator
While searching for existing files if directory
separator is not correct then original files
and directories will be deleted. So use DIRECTORY_SEPARATOR.
2016-07-15 13:53:10 +08:00
Damyon Wiese 7166d2ab48 MDL-55012 Atto: no style attrs on paste
Specifically on paste - we don't need all the random style attributes
from content on the clipboard. When you copy from a webpage - the browser
inlines all the styles from the page so that the pasted content will look
like the place it was copied from. But this is never what you want - you
want the content on paste, but with no special styling.
2016-07-15 13:36:50 +08:00
Jun Pataleta 7b1c27076b MDL-55240 editpdf: Revert changes in MDL-54772
* Revert rendering of annotations and comments back to the
  drawing region.
* Bind events to stamp annotation when editing only.
2016-07-15 10:37:48 +08:00
David Monllao 1972614e16 weekly release 3.1.1+ 2016-07-14 11:28:52 +02:00
David Monllao 379b194e3e Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-07-14 11:28:50 +02:00
Juan Leyva ab793a088d MDL-55220 forum: Add string filtering in WS
The following external functions now filter the discussion and post
name and subject.
- get_forum_discussions_paginated
- get_forum_discussion_posts
2016-07-14 09:14:48 +01:00
Stephen Bourget 237f52a9fb MDL-54657 Behat: Add tests for section_links block 2016-07-13 21:39:37 -04:00
Eric Merrill 5010e7aebd MDL-55190 search: Limit search to non-files if disabled 2016-07-13 06:06:05 -04:00
Michael Aherne e2c0f3ee50 MDL-55161 assign: Check for existence of gradebook feedback plugin 2016-07-13 09:02:42 +01:00
JD 9b81a977e1 MDL-54977 blocks_navigation: Use html_writer::random_id for id
uniqid() may returns the same id for faster machines (seen on iis)
so use html_writer::random_id(), to ensure id is different and
navigation don't break
2016-07-13 14:01:20 +08:00
Andrew Nicols 2f6241d030 Merge branch 'MDL-47371-31-fix' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-07-13 12:11:19 +08:00
Cameron Ball b5af9da5d3 MDL-47371 mod_book: Fix out of scope $unescapedtitle 2016-07-13 10:27:58 +08:00
Damyon Wiese fc9a1820e5 MDL-52544 oracle: Apply upstream pull request to AdoDB oracle driver
Upstream: https://github.com/ADOdb/ADOdb/pull/259

Prevent segfault with ocipo driver on php7.

The OCIFetchinto function is causing segfaults on php7 - probably because the fields array
is not initialised or it is optimised out. This fixes just changes to use the safer function
oci_fetch_array instead.
2016-07-13 08:46:01 +08:00
Stephen Bourget 3e02472261 MDL-51410 mod_survey: fix notifications when saving analysis 2016-07-12 20:08:51 -04:00
tunele 705b215b63 MDL-55083 admin: provide friendly error in case phpxml is missing 2016-07-13 00:09:42 +02:00
Eloy Lafuente (stronk7) 20474552ac MDL-53803 mod_choice: fix trailing whitespace 2016-07-12 18:06:21 +02:00
AMOS bot ad48cf4e28 Automatically generated installer lang files 2016-07-13 00:04:45 +08:00
Eloy Lafuente (stronk7) d5b38dfea1 Merge branch 'MDL-53803_m31v1' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-07-12 18:02:59 +02:00
Eloy Lafuente (stronk7) 19b118ad42 Merge branch 'MDL-54892-MOODLE_31_STABLE' of https://github.com/tobiasreischmann/moodle into MOODLE_31_STABLE 2016-07-12 17:51:46 +02:00
Eloy Lafuente (stronk7) 8d1623b7ed Merge branch 'MDL-55136_dataobject_31' of git://github.com/davosmith/moodle into MOODLE_31_STABLE 2016-07-12 15:48:22 +02:00
David Monllao 0bf06fbee5 Merge branch 'MDL-54771-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-07-12 14:53:40 +02:00
Eloy Lafuente (stronk7) 3b9f7d90d0 MDL-37250 mod_lesson: Move conditions to queries for better performance
While this ony seems to affect MySQL, better put the filter/conditions
on every query so the temporary view/table does not need to handle
thousands of potentially unrelated records.
2016-07-12 13:32:46 +02:00
Eloy Lafuente (stronk7) 4de30cdce3 Merge branch 'wip-MDL-37250-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-07-12 13:32:36 +02:00
David Monllao a59d8bfdcb Merge branch 'MDL-55133-31' of git://github.com/damyon/moodle into MOODLE_31_STABLE 2016-07-12 13:16:40 +02:00
David Monllao c4312f0ac7 Merge branch 'wip-MDL-55107-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-07-12 13:03:30 +02:00
Dan Poltawski 9770f74eda Merge branch 'MDL-47371-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-07-12 10:14:29 +01:00
David Monllao f7c1b3d776 Merge branch 'MDL-55170_M31' of https://github.com/nadavkav/moodle into MOODLE_31_STABLE 2016-07-12 10:30:42 +02:00
David Monllao cc145bf17b MDL-54963 search: Show no results 2016-07-12 10:23:52 +02:00
Dan Poltawski 3e159646ad Merge branch 'MDL-55007-m31' of https://github.com/dthies/moodle into MOODLE_31_STABLE 2016-07-12 09:21:06 +01:00
Adrian Greeve 0173297438 MDL-55107 gradebook: Unit tests for the new setting check. 2016-07-12 13:33:04 +08:00
Adrian Greeve d6f4093376 MDL-55107 gradebook: Improve the 57 letter boundary upgrade.
This fixes a setting not being checked before and also
reduces the number of false positives.
2016-07-12 13:32:53 +08:00
Cameron Ball a74908ae4c MDL-47371 mod_book: Don't double escape book titles 2016-07-12 10:34:01 +08:00
Cameron Ball 85f1d94f0b MDL-47371 block_navigation: Don't double escape course titles 2016-07-12 10:34:00 +08:00
Cameron Ball cbc6b9f475 MDL-47371 weblib: Add option to disable escaping 2016-07-12 10:33:58 +08:00
Andrew Nicols 36a9aba565 MDL-54915 core: JS Blocks must not used shared variables
The JS blocks in a template must _not_ use a shared variable as they can be
executed asynchronously and complete in any order.

Instead it is stored in the only local variable available - the current
context.

Since the context can be passed in from elsewhere, we namespace it to
reduce the chance of collission.
2016-07-12 09:54:42 +08:00
Daniel Thies 09b3ec720f MDL-5507 filter_mathjaxloader: Add commeents for regexes 2016-07-11 13:22:13 -05:00
Dan Poltawski 27f66455dc Merge branch 'MDL-54926-31' of git://github.com/merrill-oakland/moodle into MOODLE_31_STABLE 2016-07-11 16:54:42 +01:00
Dan Poltawski cca0fe3e3a Merge branch 'MDL-55082-31' of git://github.com/merrill-oakland/moodle into MOODLE_31_STABLE 2016-07-11 15:20:55 +01:00
David Monllao 200c2745e9 Merge branch 'wip-MDL-54962-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-07-11 16:15:56 +02:00
Dan Poltawski 2c089c2f72 Merge branch 'MDL-55112-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-07-11 14:42:14 +01:00
Dan Poltawski 46844a6b6e Merge branch 'MDL-55137-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-07-11 14:37:57 +01:00
Dan Poltawski 02848ae89f Merge branch 'MDL-55128-31' of git://github.com/jleyva/moodle into MOODLE_31_STABLE 2016-07-11 13:33:23 +01:00
Dan Poltawski c9ddcaff47 Merge branch 'wip-MDL-55154-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-07-11 13:31:25 +01:00
Juan Leyva 9eb1e017e1 MDL-55163 mod_assign: Fix mod_assign_copy_previous_attempts
- Not exposed via WS
- Have a bug when calling the api function
2016-07-11 10:33:23 +01:00
David Monllao 9fda3f17d0 Merge branch 'MDL-54832-31' of https://github.com/nashtechdev01/moodle into MOODLE_31_STABLE 2016-07-11 06:47:34 +02:00
Adrian Greeve f0c57645e5 MDL-37250 mod_lesson: All actual attempts on the lesson are displayed.
The lesson overview report now shows all attempts made including hitting
the page and immediately navigating away.
2016-07-11 08:19:23 +08:00
AMOS bot 820b5b2a46 Automatically generated installer lang files 2016-07-11 00:06:00 +08:00
Eloy Lafuente (stronk7) 47806ea17e Moodle release 3.1.1 2016-07-10 00:29:25 +02:00
Nadav Kavalerchik c4891ac771 MDL-55170 theme_bootstrapbase: Fix user enrollment dialog, RTL 2016-07-09 14:53:33 +03:00
Davo Smith 2a59561f7e MDL-55136 data_object: fix param handling in fetch_all_helper 2016-07-09 09:21:09 +01:00
Adrian Greeve 0e40fc6e85 MDL-54962 mod_data: Approval status is now translated.
It was using hardcoded English. Now it uses get_string.
2016-07-08 10:56:29 +08:00
Adrian Greeve 0f1ae159df MDL-55154 mod_lesson: Lesson numerical response shows images. 2016-07-08 09:52:10 +08:00
Daniel Thies 0b2b9e21dc MDL-55007 filter_mathjaxloader: Change unit test 2016-07-07 20:23:26 -05:00
Daniel Thies 6857304753 MDL-55007 filter_mathjaxloader: Wrap nolink around each expresssion 2016-07-07 20:22:56 -05:00
Eloy Lafuente (stronk7) a0473f798d weekly release 3.1+ 2016-07-07 10:20:09 +02:00
Eloy Lafuente (stronk7) b4e5db392e NOBUG: Fixed SVG browser compatibility 2016-07-07 10:20:05 +02:00
Eloy Lafuente (stronk7) b775dad6e6 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-07-07 10:20:04 +02:00
Damyon Wiese 75ff893a27 MDL-52544 oracle: php7 fixes for oci driver
These are our bugs actually - the oci docs are very clear that bound
params should be in-scope when oci_execute is called - and due to pass by value etc,
this was not true for our driver.

There is another bug that needed fixing - OCI barfs if null values are bound - this
can be avoided by setting them to '' which oci treats as null.

And finally - all our lob/clob/blob hacks were also binding to local "out-of-scope" vars.
2016-07-07 13:09:59 +08:00
Andrew Nicols 56d67f1a9d Merge branch 'wip-mdl-55043-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-07-07 11:29:14 +08:00
Rajesh Taneja e9f2e5bea7 MDL-55043 core_competency: Sort by id to ensure we get expected result. 2016-07-10 11:25:43 +08:00
Andrew Nicols 6416b84bd6 Merge branch 'MDL-54869-31' of git://github.com/jleyva/moodle into MOODLE_31_STABLE 2016-07-07 10:48:48 +08:00
Stephen Bourget 10120241ae MDL-53803 mod_choice: remove orphaned answers when removing options 2016-07-06 17:15:33 -04:00
Eloy Lafuente (stronk7) 4e4e8e1da9 Merge branch 'wip-MDL-46682-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-07-06 18:13:58 +02:00
Cameron Ball c7010e82ae MDL-54771 tool_recyclebin: Don't add temp course to recycle bin 2016-07-06 23:19:00 +08:00
Cameron Ball bd7cc14d6a MDL-54771 restore: Add deletesource to course object
Since deleting a course now triggers the pre_course_delete hook
it may be useful for hook implementations to know whether it was
a "true" course deletion, or one originating from a temporary
course created during a restore.
2016-07-06 23:19:00 +08:00
Cameron Ball 8bc112e645 MDL-55137: Update PHPDoc for external_format_text 2016-07-06 17:48:33 +08:00
Eloy Lafuente (stronk7) 2a55226144 MDL-54934 workshop: ensure "Current phase" is always separated
Apparently some readers can join 2 adjacent spans completely, simply
adding a whitespace between them prevents that, ensuring separation.,
2016-07-06 11:36:11 +02:00
Adrian Greeve 46672f08d6 MDL-46682 auth/db: Increase of chunk size and update change.
The update query was not checking the mnet auth id and could
have been updating the wrong entry.
2016-07-06 16:43:47 +08:00
Andrew Nicols 9563554a1a Merge branch 'MDL-54734-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-07-06 15:02:16 +08:00
Simey Lameze 73ad749ca0 MDL-54734 core_user: do not cache dummy user records 2016-07-06 13:44:27 +08:00
Andrew Nicols e1f29cf6e2 MDL-54734 user: Add tests to demonstrate multi-user issues 2016-07-06 13:44:27 +08:00
Andrew Nicols 40867c234a Merge branch 'MDL-54165-31' of git://github.com/ryanwyllie/moodle into MOODLE_31_STABLE 2016-07-06 12:02:31 +08:00
Ryan Wyllie 22861d00c7 MDL-54165 mod_assign: Fix doc in grading_events.js 2016-07-06 03:47:35 +00:00
Rajesh Taneja 5c280e9e1e MDL-54844 mod_glossary: Don't append AND as it's done later 2016-07-06 11:35:23 +08:00
Andrew Nicols 61453e1a79 Merge branch 'MDL-54165-31' of git://github.com/ryanwyllie/moodle into MOODLE_31_STABLE 2016-07-06 11:08:05 +08:00
Ryan Wyllie 30a9fe133a MDL-54165 mod_assign: Collapsible review and grade panel 2016-07-06 02:54:18 +00:00
Barbara Ramiro 879b5bb6fc MDL-54165 mod_assign: Layout icons for the new grading interface 2016-07-06 02:53:13 +00:00
Damyon Wiese 2c72d1b8b5 MDL-55133 javascript: Correctly use component names in requirejs
Core subsystems must use the 'core_' prefix always.
2016-07-06 10:26:58 +08:00
Jerome Mouneyrac b406f53662 MDL-46682 auth/db: IN clause crashes when too many users to sync 2016-07-06 10:06:03 +08:00
Adrian Greeve ec0edd25ac MDL-54844 mod_glossary: Limiting of glossary searching.
Searching of the glossary was returning results from all
glossaries on the site. It has now been returned to just
the glossary that you are currently viewing.
2016-07-06 09:20:31 +08:00
Eloy Lafuente (stronk7) 8d30e8370d Merge branch 'wip-mdl-55043-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-07-06 03:19:17 +02:00
Rajesh Taneja d49170cb14 MDL-55043 core_competency: Set proper sort order for each field 2016-07-06 08:18:33 +08:00
Eloy Lafuente (stronk7) c3001c7457 Merge branch 'wip-mdl-54860-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-07-06 01:42:50 +02:00
Rajesh Taneja 4f5a6e28ec MDL-54860 behat: Stop execution if setup problem found 2016-07-06 07:28:31 +08:00
Eloy Lafuente (stronk7) 395a315e9f Merge branch 'MDL-54934-31' of https://github.com/nashtechdev01/moodle into MOODLE_31_STABLE 2016-07-05 20:44:21 +02:00
Eloy Lafuente (stronk7) 501f7d53c6 Merge branch 'MDL-54867-31' of git://github.com/jleyva/moodle into MOODLE_31_STABLE 2016-07-05 20:27:28 +02:00
Eloy Lafuente (stronk7) a7a037ecde Merge branch 'MDL-49244-31' of git://github.com/jleyva/moodle into MOODLE_31_STABLE 2016-07-05 20:19:47 +02:00
Eloy Lafuente (stronk7) 967a7bc2ac Merge branch 'MDL-54795_31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-07-05 20:10:42 +02:00
Eloy Lafuente (stronk7) defc74db0d Merge branch 'MDL-29738-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-07-05 17:06:06 +02:00
Loc Nguyen d54b4cdfa1 MDL-54832 workshop: adding landmark for userplantable
Accessibility enhance: add an aria-label on the userplan table so
that it's accessible to me through my screen reader
2016-07-05 20:15:30 +07:00
Andrew Nicols 222e854a9e MDL-29738 file: Remove unused stylesheet functionality
This functionality was commented out in
78946b9bdb for MDL-20204 back in 2009.
Since then it has been wasting cycles performing utterly pointless
preg_match and preg_replace calls.
2016-07-05 19:03:39 +08:00
Andrew Nicols ccb97f2eef MDL-55114 chat: Remove commented-out variables 2016-07-05 12:46:46 +02:00
Eloy Lafuente (stronk7) cf3ac3f218 Merge branch 'MDL-55113-31' of git://github.com/dpalou/moodle into MOODLE_31_STABLE 2016-07-05 12:21:53 +02:00
Dan Poltawski c25d8efc47 Merge branch 'MDL-54928-31' of git://github.com/dpalou/moodle into MOODLE_31_STABLE 2016-07-05 11:20:08 +01:00
Dan Poltawski abc0cac40a Merge branch 'MDL-54841-31' of https://github.com/nashtechdev01/moodle into MOODLE_31_STABLE 2016-07-05 11:06:39 +01:00
Juan Leyva 9b7d5cd41b MDL-55128 course: Fix param type for shortname 2016-07-05 09:51:21 +01:00
Dani Palou eef85ddc40 MDL-54928 notifications: Add username to emailto users 2016-07-05 10:36:13 +02:00
Dani Palou b65a928372 MDL-54928 notifications: Retrieve username from DB if empty 2016-07-05 10:36:13 +02:00
Juan Leyva 47560d0eb0 MDL-54869 webservice: Fix core_user_add_user_private_files 2016-07-05 09:00:43 +01:00
Juan Leyva 068904f73b MDL-54869 files: Create new required functions
This was a complex change requiring three new functions:
file_merge_files_from_draft_area_into_filearea - To just add files from a draft area into a real one (just adding or updating, not deleting)
file_merge_draft_area_into_draft_area - To merge files from two draft areas, used by the latest for creating a draft area with all the original files plus the new ones.
file_overwrite_existing_draftfile - Required to update existing files not losing metadata or references.

The whole process is the following:

    User uploads a file (upload.php)
    Client gets a new draftid A containing the file only (return of upload.php)
    Client requests to merge that draftid in the user's private files (core_user_add_user_private_files)
    Server prepares a new UNUSED draftid B from existing area
    Server merges A into B
    Server saves the draft B into the final area
2016-07-05 09:00:43 +01:00
Andrew Nicols 767eaec731 MDL-51242 messageinbound: Guess the port from hostspec
Existing language strings for the host component suggest that the host can
be provided in the format hostname:port, but we previously did not support
this.

This patch explodes the string based on the colon character and assumes
that if there are two parts, that they are in the format hostname:port.

Note: This does not attempt to deal with full host specifications (e.g.
protocol://hostname:port), as this is beyond the scope of this change.
2016-07-05 14:54:08 +08:00
An Pham Van 65432b1b7b MDL-54841 workshop: Combine links for attachment icon and text.
In a workshop activity, on the view submission page where having attachment(s), there's an accessibility issue.
There're 2 separate links for the icon and text which causes an issue for keyboard and screen reader users.
So the text and icon should be combined in one link.
2016-07-05 13:26:55 +07:00
Jake Dallimore 8fba57e950 MDL-53431 tool_monitor: Access control for tool monitor subscriptions 2016-07-05 10:45:17 +08:00
Dan Poltawski a933f85a73 Merge branch 'MDL-55019-31' of git://github.com/jleyva/moodle into MOODLE_31_STABLE 2016-07-04 15:29:45 +01:00
Dan Poltawski 8cba7fda3a Merge branch 'MDL-54976-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-07-04 14:52:01 +01:00
Dan Poltawski f852010c6c Merge branch 'MDL-54994_31' of git://github.com/stronk7/moodle into MOODLE_31_STABLE 2016-07-04 14:18:20 +01:00
Dan Poltawski 2a5bb77321 Merge branch 'MDL-55032-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-07-04 13:28:49 +01:00
Dan Poltawski 2212fbf028 Merge branch 'MDL-55041_31_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_31_STABLE 2016-07-04 12:45:56 +01:00
Dan Poltawski 1a4184a396 Merge branch 'MDL-41945-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-07-04 12:39:37 +01:00
Marina Glancy d722da1bb4 MDL-55069 core: escape special characters in email headers 2016-07-04 12:28:02 +01:00
Dani Palou c58312fe82 MDL-55113 assign: Use PARAM_RAW in onlinetext text 2016-07-04 09:59:14 +02:00
Jun Pataleta bc795079f7 MDL-55112 mod_forum: Query all forum fields to avoid debug messages 2016-07-04 15:23:47 +08:00
Andrew Nicols cdea4ac6b9 Merge branch 'MDL-54953-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-07-04 15:18:59 +08:00
Andrew Nicols 6db40f889f Merge branch 'MDL-55049-31' of git://github.com/jleyva/moodle into MOODLE_31_STABLE 2016-07-04 14:22:19 +08:00
Andrew Nicols e0db9ee82f Merge branch 'MDL-55053-31' of git://github.com/merrill-oakland/moodle into MOODLE_31_STABLE 2016-07-04 14:14:52 +08:00
Davo Smith b3a751da05 MDL-55057 mod_scorm: fix handling of SCO identifiers with apostrophes 2016-07-04 13:14:27 +08:00
Andrew Nicols 388367917d Merge branch 'MDL-54877-31-clean-on-output' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-07-04 12:14:09 +08:00
Cameron Ball 3141d42c63 MDL-41945 mod_assign: Check if submission has been modified
This patch adds a check that stops a user submitting an assignment
if someone else has modified it in the meantime.
2016-07-04 12:11:08 +08:00
Andrew Nicols 0c725854e5 Merge branch 'MDL-55020-31-pluginzip' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-07-04 11:26:18 +08:00
Andrew Nicols 965b65b7fc Merge branch 'MDL-54968-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-07-04 10:32:50 +08:00
Andrew Nicols 759f83aa63 Merge branch 'MDL-53019_31' of git://github.com/stronk7/moodle into MOODLE_31_STABLE 2016-07-04 09:10:19 +08:00
AMOS bot d046221fba Automatically generated installer lang files 2016-07-02 00:05:12 +08:00
Mark Johnson ad1e11c2e4 MDL-55041 roles: Fix JSON parsing in permission manager 2016-07-01 15:02:02 +01:00
Loc Nguyen e1f14856da MDL-54934 workshop: indicate current phase
Indicate phase in page titles, current phase in userplan table
so that it's accessible to me through my screen reader
2016-07-01 18:51:31 +07:00
Eloy Lafuente (stronk7) 7d0add9d19 MDL-53019 environment: 3.2 requirements added
Changes:
 - PHP 5.6.5 required
2016-07-01 13:49:32 +02:00
Eloy Lafuente (stronk7) 7ef6433c2f MDL-54994 badges: Count correctly the number of external badges shown 2016-07-01 13:40:59 +02:00
Juan Leyva f80645cc48 MDL-54869 files: Fix file_save_draft_area_files documentation 2016-07-01 10:16:28 +01:00
Jun Pataleta 184a6e1647 MDL-54976 mod_scorm: Add validation for availability dates 2016-07-01 14:51:04 +08:00
Jake Dallimore 89ea16e44e MDL-54795 mod_assign: Fix Atto notify js error in grading interface 2016-07-01 13:52:38 +08:00
Marina Glancy 938a970d1f MDL-55032 tool_lp: check access when showing link to competencies
Also if course competencies page is accessed without capabilities do
redirect before starting output.
2016-07-01 13:45:46 +08:00
Andrew Nicols 6513308ba7 weekly release 3.1+ 2016-07-01 10:20:36 +08:00
Andrew Nicols 9c6b1e40e5 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-07-01 10:20:32 +08:00
David Mudrák 9ba44fa3fd MDL-55020 admin: Fix renaming of the plugin package root folder
There was a problem with core\update\code_manager::unzip_plugin_file()
if it was used to extract a plugin package into a non-empty target
directory and the plugin package root folder was being renamed at the
same time.

The problem was caused by the underlying helper method
rename_extracted_rootdir() that worked only for ZIPs extracted to an
empty temporary location. When the plugin was extracted to the actual
dirroot with other existing plugin folders present, the method failed
badly.

The solution in the patch is to always extract the ZIP into a temporary
empty location, perform the eventual root renaming there, and only then
move the extracted contents to the final destination. Additionally we
are changing the behaviour of the rename_extracted_rootdir() method so
that now it throws exception if the plugin package contains multiple
root folders (it should not happen in normal situations as such a plugin
would not pass the pre-install validation).

Unit tests did not catch this bug before because in the tests, the
target directory had been empty. Now we are adding a new directory
"aaa_another" to the target location to test in more realistic
environment. Tests for the new behaviour of the renaming method are
added, too.

p.s. I noticed that moodle_exception class was not imported into the
namespace and this is fixed now too (and covered with unit tests).
2016-07-01 01:11:36 +02:00
Eric Merrill c9e63147b9 MDL-55082 search: Update core areas to return results in time ASC order 2016-06-30 11:12:03 -04:00
Juan Leyva ddbd25d941 MDL-49244 course: Clean parameters in core_course_get_categories 2016-06-30 13:27:51 +01:00
Dan Poltawski 9c3b409079 MDL-32135 mod_choice: fix behat tests 2016-06-30 09:25:23 +01:00
Stephen Bourget 161cb17822 MDL-32135 mod_choice: update behat tests 2016-06-30 09:25:23 +01:00
Andrew Nicols c944c35cff Merge branch 'MDL-54610_31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-06-30 09:25:22 +01:00
Dan Poltawski 31ba691136 Merge branch 'MDL-55022-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-06-30 09:25:22 +01:00
Dan Poltawski 6f8f5068f2 Merge branch 'MDL-55027_m31' of git://github.com/markn86/moodle into MOODLE_31_STABLE 2016-06-30 09:25:21 +01:00
Dan Poltawski 2a1401d20f Merge branch 'MDL-54993-31' of https://github.com/sk-unikent/moodle into MOODLE_31_STABLE 2016-06-30 09:25:21 +01:00
Dan Poltawski a1b8fc6ab7 Merge branch 'MDL-32135_m31v2' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-06-30 09:25:20 +01:00
Jun Pataleta 3d152bc38e MDL-54877 mod_lti: Clean LTI tool type name and description on output
* Use clean_param() for name and description when displaying the tool type.
    Basically in the following functions:
    - serialise_tool_type()
    - lti_get_configured_types()
* Changed name and description's type from PARAM_TEXT to PARAM_RAW
    in tool update parameters.
* Changed name and description's type from PARAM_TEXT to PARAM_RAW
   in mod_lti_external::tool_type_return_structure()
2016-06-30 15:59:37 +08:00
AMOS bot 640c427b68 Automatically generated installer lang files 2016-06-30 00:04:50 +08:00
Eric Merrill 9a4c8f1c1a MDL-55053 search: Display search areas in alphabetical order 2016-06-28 17:19:35 -04:00
Eric Merrill 124baf197a MDL-54926 search: Reduce over-escaping in results 2016-06-28 16:34:02 -04:00
Juan Leyva 19a7ed9484 MDL-55049 webservice: Scan for viruses in webservice/upload.php 2016-06-28 16:15:09 +01:00
Dan Poltawski 27733ee4d0 Merge branch 'MDL-54868-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-06-28 09:19:50 +01:00
Dan Poltawski 5a1ead041a Merge branch 'MDL-55002-31-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_31_STABLE 2016-06-28 09:06:10 +01:00
Andrew Nicols 04bb5da9de Merge branch 'MDL-54991-31' of git://github.com/crazyserver/moodle into MOODLE_31_STABLE 2016-06-28 15:32:24 +08:00
Andrew Nicols 25a4f6c2d6 Merge branch 'MDL-54909-31' of git://github.com/crazyserver/moodle into MOODLE_31_STABLE 2016-06-28 15:21:42 +08:00
Cameron Ball 3078a3b7a1 MDL-54868 webservice_xmlrpc: Don't escape non-ascii characters 2016-06-28 14:49:29 +08:00
Andrew Nicols 82f52c19fa Merge branch 'MDL-54910_m31v2' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-06-28 12:57:23 +08:00
Andrew Nicols 143e3dc11c Merge branch 'MDL-54911_m31v3' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-06-28 12:40:10 +08:00
Andrew Nicols 7403d5ea59 MDL-54755 core: Correct behat language 2016-06-28 10:01:26 +08:00
Andrew Nicols a1a562fbbe Merge branch 'MDL-54755_moodle31' of https://github.com/StudiUM/moodle into MOODLE_31_STABLE 2016-06-28 09:55:08 +08:00
Andrew Nicols e31f0fdf7e Merge branch 'MDL-54935-31' of git://github.com/ryanwyllie/moodle into MOODLE_31_STABLE 2016-06-28 09:40:19 +08:00
Andrew Nicols b228a7cf40 Merge branch 'MDL-54964-31' of git://github.com/jleyva/moodle into MOODLE_31_STABLE 2016-06-28 08:47:42 +08:00
Andrew Nicols e9ae977cb8 Merge branch 'wip-mdl-54974-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-06-28 08:33:10 +08:00
David Mudrák 31a5f2a08c MDL-55002 lang: Fix behat scenarios using modified strings 2016-06-27 23:04:40 +02:00
Helen Foster f9bca6404e MDL-55002 lang: Merge English strings from the en_fix language pack 2016-06-27 23:02:41 +02:00
Eloy Lafuente (stronk7) 78c703bc12 Merge branch 'MDL-55028-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-06-27 22:13:55 +02:00
Eloy Lafuente (stronk7) f1198d7998 Merge branch 'MDL-54997-31' of git://github.com/damyon/moodle into MOODLE_31_STABLE 2016-06-27 20:22:20 +02:00
Eloy Lafuente (stronk7) 29cc92c86f Merge branch 'MDL-54707_31' of git://github.com/dmonllao/moodle into MOODLE_31_STABLE 2016-06-27 20:00:56 +02:00
Eloy Lafuente (stronk7) 2ac06ec994 Merge branch 'MDL-54900-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-06-27 19:03:25 +02:00
AMOS bot 4c19da2a1e Automatically generated installer lang files 2016-06-28 00:05:48 +08:00
Eloy Lafuente (stronk7) ac081697da Merge branch 'MDL-52887-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-06-27 16:13:37 +02:00
Gilles-Philippe Leblanc 97b0761cdf MDL-54755 core: Incorrect redirection after password change 2016-06-27 08:21:31 -04:00
Eloy Lafuente (stronk7) 54b80ab68d Merge branch 'MDL-54663-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-06-27 13:26:42 +02:00
Juan Leyva 4ec683ac2f MDL-54964 tool_mobile: Fix tests to make it work with non-core plugins 2016-06-27 09:46:33 +01:00
Pau Ferrer Ocaña 41931b749d MDL-54991 assign: Invalid submissiongroup when not using groups 2016-06-27 09:28:14 +02:00
Marina Glancy 79796a1590 MDL-54968 user: change query for resetting dashboard
In case of inconsistent data the fatal error could have happen.
Also improve performance by joining several queries into one.
2016-06-27 15:09:12 +08:00
Rajesh Taneja 793d92aa86 MDL-54974 behat: Handle interupts on PHP7
As https://bugs.php.net/bug.php?id=71448 is
not going to get fixed, we need to declare tick
2016-06-27 14:32:22 +08:00
Andrew Nicols e0b8d7864f Merge branch 'MDL-53111_m31v1' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-06-27 14:18:36 +08:00
Jun Pataleta a8bab41277 MDL-55028 webservice_soap: Use strlen for setting Content-Length header 2016-06-27 14:02:04 +08:00
Mark Nelson 20ede33d61 MDL-55027 enrol_lti: avoid invalid image URL causing an exception 2016-06-27 13:29:17 +08:00
Andrew Nicols cd7cc95637 Merge branch 'MDL-54924-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-06-27 13:15:37 +08:00
Marina Glancy 1348e21d66 MDL-54900 mod_choice: correctly count number of answered users 2016-06-27 12:48:30 +08:00
Jun Pataleta 99e7d66fba MDL-55022 mod_lti: Fix undefined variable 2016-06-27 11:41:50 +08:00
Andrew Nicols d53a433b6f Merge branch 'MDL-54785-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-06-27 09:20:55 +08:00
David Monllao 3a71830435 MDL-54707 search: Add user context to get_areas_user_accesses 2016-06-26 21:22:28 +02:00
Damyon Wiese 862792e1a1 MDL-54997 competencies: Fix random unit test fail
Sorting on timecreated is not unique enough to
guarantee a predictable ordering.
2016-06-25 08:05:26 -07:00
Damyon Wiese 80d2c7cfb0 MDL-54997 competencies: Listing evidence contexts
When listing the evidence for a user competency in a course,
the query is missing evidences for sub-contexts in the course.
2016-06-25 07:19:20 -07:00
Juan Leyva b36b4f05c7 MDL-55019 webservice: Course summary text should not be cleaned 2016-06-24 13:34:22 +01:00
Jake Dallimore 063bf930f9 MDL-54610 mod_lti: Fix cartridge support for admin tool add/edit forms 2016-06-24 14:28:12 +08:00
Stephen Bourget fdc9faed62 MDL-54911 mod_feedback: start date should be before the end date 2016-06-23 17:41:48 -04:00
Stephen Bourget 2d0bbd3b6e MDL-54910 mod_data: Open dates should be before close dates 2016-06-23 17:33:32 -04:00
Stephen Bourget dd171628ea MDL-32135 mod_choice: Open time should be before close time 2016-06-23 17:22:02 -04:00
Pau Ferrer Ocaña a11180570f MDL-54909 assign: Style editpdf background to differ from page bg 2016-06-23 15:07:09 +02:00
Andrew Nicols eb36cfcbb6 weekly release 3.1+ 2016-06-23 14:49:48 +08:00
Andrew Nicols 7f2fd69024 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-06-23 14:49:45 +08:00
Frederic Massart 97bf703346 MDL-54785 files: Deprecate the support for $usepost and related 2016-06-23 12:40:51 +08:00
Frederic Massart 89bacb163f Revert "MDL-44626 files: Show the PHP max upload size instead of 'unlimited'"
This reverts commit 6f0768618a.
2016-06-23 12:33:04 +08:00
Frederic Massart f31567294d Revert "Merge branch 'MDL-54110_master' of https://github.com/marxjohnson/moodle"
This reverts commit 016e0abfbc, reversing
changes made to 58a2f0ac40.
2016-06-23 12:33:04 +08:00
Frederic Massart 055bf3ca61 Revert "MDL-54110 repositories: Whitespace, Typo + unit test fixes"
This reverts commit 7e4d43e1a2.
2016-06-23 12:33:04 +08:00
Andrew Nicols e9019af21d Merge branch 'MDL-54948-31-fix2' of https://github.com/lameze/moodle into MOODLE_31_STABLE 2016-06-23 11:01:49 +08:00
Stephen Bourget df221cbf8d MDL-54935 Survey: Remove duplicate event trigger 2016-06-23 03:01:28 +00:00
Simey Lameze e4f4a7c353 MDL-54948 core_files: return false if theres no output from unoconv 2016-06-23 08:37:56 +08:00
AMOS bot 1036d079c1 Automatically generated installer lang files 2016-06-23 00:06:41 +08:00
Skylar Kelty f000a6635b MDL-54993 search: Provide areaid parts to template 2016-06-22 14:53:59 +01:00
Juan Leyva 479b269fe9 MDL-54867 webservice: Document webservice/upload.php deprecation
The 'private' file area is not supported anymore, only 'draft' is
supported right now.
2016-06-22 09:27:05 +01:00
Cameron Ball 6ba23735ab MDL-35104 auth: Always allow editing username for new users 2016-06-22 14:59:55 +08:00
Andrew Nicols 988b11c4da Merge branch 'MDL-54948-31-fix' of https://github.com/lameze/moodle into MOODLE_31_STABLE 2016-06-22 14:49:05 +08:00
Simey Lameze 1b43a5372c MDL-54948 core_upgrade: fix check_unoconv_version logic 2016-06-22 13:54:29 +08:00
Marina Glancy cbe10ace43 MDL-52887 mod_choice: backup allowmultiple option 2016-06-22 13:52:12 +08:00
Andrew Nicols de854b05c3 MDL-54663 forum: Correct digest link to forum preferences 2016-06-22 13:12:20 +08:00
Marina Glancy 465db5bd7c MDL-54953 mod_chat: remove Safari hack
This hack was introduced in MDL-16878 and is not needed in modern Safari versions
but it was reported that it can breaks chat in IE
2016-06-22 12:22:23 +08:00
Eloy Lafuente (stronk7) 2579f5f1fa Merge branch 'wip-mdl-54589-m31' of https://github.com/rajeshtaneja/moodle into MOODLE_31_STABLE 2016-06-22 01:42:05 +02:00
Eloy Lafuente (stronk7) 50804bc956 MDL-54778 form: Make it all js style (eslint) compliant
The changes in this commit should not be problematic, just:

- different whitespace.
- some docs.
- 1 variable to camelCase.

And then, less trivial, but safe enough IMO:

- a change to camelCase some identifiers and their calculation.
2016-06-22 01:30:06 +02:00
Eloy Lafuente (stronk7) 6b90efd076 Merge branch 'MDL-54778-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-06-22 01:30:01 +02:00
AMOS bot 64995b83fc Automatically generated installer lang files 2016-06-22 00:06:21 +08:00
Rajesh Taneja 041e40cf1b MDL-54940 behat: No need to press save
Previous step press save button, so no need to press again
2016-06-21 19:01:22 +08:00
Eloy Lafuente (stronk7) e2dee6f3cd Merge branch 'MDL-54948-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-06-21 11:47:11 +02:00
Tobias Reischmann e23d29dc91 MDL-54892 core: Pass proper parameter for plugin uninstall queries 2016-06-21 09:14:48 +02:00
Andrew Nicols afee01ac2f Merge branch 'MDL-54920-m31' of https://github.com/sammarshallou/moodle into MOODLE_31_STABLE 2016-06-21 14:19:09 +08:00
Andrew Nicols f4d1b3ec40 Merge branch 'MDL-54894-31' of git://github.com/crazyserver/moodle into MOODLE_31_STABLE 2016-06-21 12:10:20 +08:00
Andrew Nicols d5088c4ef5 Merge branch 'MDL-54940-31' of https://github.com/LukeCarrier/moodle into MOODLE_31_STABLE 2016-06-21 11:54:00 +08:00
Andrew Nicols cbcbf005fb Merge branch 'MDL-54881_31' of https://github.com/mr-russ/moodle into MOODLE_31_STABLE 2016-06-21 11:32:19 +08:00
Andrew Nicols 4e1af2ead5 Merge branch 'MDL-35104-31-2' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-06-21 11:22:52 +08:00
Cameron Ball 34d728d3e9 MDL-35104 auth: Don't allow modification of username
Presently it is either unreliable, or not possible to change
the username of a user created with an authentication plugin.
In some cases it is even hard coded to fail. Ideally we would
sync the username, and the issue MDL-21928 exists to address
that. However, in the mean time we should not allow the
username of an external user to be modified.
2016-06-21 11:16:06 +08:00
Andrew Nicols cb2844dc40 Merge branch 'MDL-51505-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-06-21 10:30:46 +08:00
Simey Lameze ccddc71ecb MDL-54948 core_upgrade: fix unoconv check on the environment page 2016-06-21 09:40:08 +08:00
Simey Lameze 9759072f4f MDL-54948 core_files: make the check consistent on unoconv test page 2016-06-21 09:40:07 +08:00
Andrew Nicols 56fb03794c MDL-54778 form: Fix lots of issues with form dependencies
The original issue here was that each loop of the named values did not
check for prototypal properties. As a result, if there were input fields
with names such as 'sort', 'valueOf', 'constructor', etc. these would
return their prototypal functions instead of a falsy value, and be treated
as though they are array - hence the 'Cannot push to Function' type error.

Following on from this I discovered that the data stores were being created
as arrays, but used as objects. This can also cause issues with some form
input names -- e.g. if they are numeric.

These two issues were resolved together by correctly storing them in
objects, and checking that those objects had real properties
(hasOwnProperty). This itself has to use the prototypal function to cater
for the potential of a field name called 'hasOwnProperty'.

I also found that the instance value stores were being initialised in the
prototype (and therefore shared), which meant that there were numerous
issues if two forms were present on the same page, or one form replaced an
existing one (e.g. forms initialised in JS).

In addition, it also became apparant that several values were being used
outside of scope, or in the wrong scope. This caused further issues when
creating multiple forms on a page.
2016-06-21 08:08:03 +08:00
Russell Smith 9b1232cb59 MDL-54881 quiz: Ensure user attempts are deterministic for testing. 2016-06-21 08:32:42 +10:00
AMOS bot 1e0b57f90d Automatically generated installer lang files 2016-06-21 00:05:30 +08:00
AMOS bot b1ab556419 Automatically generated installer lang files 2016-06-21 00:05:30 +08:00
Rajesh Taneja 6bf8caa573 MDL-54589 behat: Update composer to point to new tag 2016-06-20 16:03:12 +08:00
Rajesh Taneja 9d2e2a80be MDL-54589 behat: Fixed failures for phantomjs standalone 2016-06-20 16:03:12 +08:00
Rajesh Taneja 315c9ba2d4 MDL-54589 behat: Don't allow floating headers for behat 2016-06-20 16:03:12 +08:00
Rajesh Taneja 86e079521b MDL-54589 behat: Added hack for some OS/browsers 2016-06-20 16:03:11 +08:00
Jun Pataleta b25610f206 MDL-54924 tool_lp: Make the url property optional 2016-06-20 15:05:34 +08:00
Pau Ferrer Ocaña 0e31c8f92b MDL-54894 comments: Get course from context if not informed 2016-06-20 09:02:15 +02:00
Rajesh Taneja 8e6783526e MDL-54589 group: ensure loader is available before remobing 2016-06-20 10:00:00 +08:00
Rajesh Taneja 5f738b0be5 MDL-54589 behat: Trigger change event after selecting option
After selecting option, some browsers need
explicit change event
2016-06-20 09:59:59 +08:00
Luke Carrier 0bca566c04 MDL-54940 behat: use the fixed step 2016-06-19 17:24:59 +01:00
Luke Carrier 2cfe2ecee6 MDL-54940 behat: rectify section edit regression in MDL-53381 2016-06-19 17:24:59 +01:00
AMOS bot 0ab99aa340 Automatically generated installer lang files 2016-06-20 00:04:58 +08:00
AMOS bot e12f32dcda Automatically generated installer lang files 2016-06-19 00:06:21 +08:00
Eloy Lafuente (stronk7) a7221c5f19 weekly release 3.1+ 2016-06-16 17:01:46 +02:00
Eloy Lafuente (stronk7) 940fe6f99c NOBUG: Fixed SVG browser compatibility 2016-06-16 17:01:42 +02:00
sam marshall 143f3624cf MDL-54920 Behat: Allow viewport size to be set consistently
Provides a new Behat step

And I set viewport size to "800x600"
2016-06-15 15:26:42 +01:00
Nicholas Hoobin bdcc0dd59f MDL-53788 multilangupgrade: fix aggressive course cache rebuilding 2016-06-15 09:12:20 +08:00
Nicholas Hoobin b77709ca67 MDL-53788 user: fix aggressive course cache rebuilding 2016-06-15 09:12:20 +08:00
Nicholas Hoobin 557ca0146d MDL-53788 mod_lti: fix aggressive course cache rebuilding 2016-06-15 09:12:19 +08:00
Andrew Nicols 261eb32955 Merge branch 'MDL-54559-int-31' of https://github.com/merrill-oakland/moodle into MOODLE_31_STABLE 2016-06-15 08:24:42 +08:00
Eric Merrill 28ac27c0c2 MDL-54559 theme: Recenter search box 2016-06-14 11:01:02 -04:00
Andrew Nicols 894ed0c657 Merge branch 'MDL-54712-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-06-14 16:06:09 +08:00
Andrew Nicols 07c8765f2b Merge branch 'MDL-54559-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-06-14 14:30:20 +08:00
Andrew Nicols c4c826305d Merge branch 'MDL-54797_31' of git://github.com/aolley/moodle into MOODLE_31_STABLE 2016-06-14 13:27:10 +08:00
Andrew Nicols cff883d5a1 Merge branch 'MDL-54787-31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-06-14 11:54:19 +08:00
jogarcia b5882aa15c MDL-54576 theme: Redirect to show confirmation
After selecting a new theme, save the new configs
then redirect to show the confirmation and the new
theme's read me.  This prevents any odd behavior
from the old theme bleeding into the display of
the confirmation.
2016-06-14 11:44:23 +08:00
Andrew Nicols e744a082e1 Merge branch 'MDL-54859_31' of git://github.com/dmonllao/moodle into MOODLE_31_STABLE 2016-06-14 11:01:31 +08:00
Eloy Lafuente (stronk7) 23bba6e190 Merge branch 'MDL-54890-31' of git://github.com/danpoltawski/moodle into MOODLE_31_STABLE 2016-06-13 20:07:24 +02:00
Joby Harding f9a6276f42 MDL-51505 tool_templatelibrary: Prevent jumping when selecting template 2016-06-13 17:07:57 +08:00
Dan Poltawski 5f9e0cd58b Merge branch 'MDL-51683-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-06-13 09:48:52 +01:00
Dan Poltawski 082a4b6b6c Merge branch 'MDL-54772-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-06-13 09:35:52 +01:00
David Monllao 50b19dc897 MDL-54562 mod_data: Add activities info to search 2016-06-13 09:18:11 +01:00
Dan Poltawski beb50de63d Merge branch 'MDL-54837-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-06-13 08:51:58 +01:00
Jun Pataleta 3863f17ffe MDL-54712 mod_lti: Remove markup from LTI admin notification messages 2016-06-13 10:08:59 +08:00
Jun Pataleta 233231def7 MDL-54772 mod_assign: Fixes for PDF editor
* Render the annotations and comments within the drawing canvas, not in
the drawing region.
* Remove edit-related event bindings for stamp annotations.
2016-06-13 09:59:33 +08:00
Stephen Bourget f20a35754f MDL-54656 Behat: Additional tests for advanced search 2016-06-12 21:07:06 -04:00
Stephen Bourget b43d3fbdcb MDL-54656 Behat: Add tests for search_forums block 2016-06-12 21:06:59 -04:00
Jake Dallimore 9685d369ad MDL-54787 mod_quiz: Fix notification error on regrade 2016-06-10 18:32:49 +08:00
Dan Poltawski d991bbefe9 MDL-54890 course: remove erranous duplicated switch label
Detected by eslint rule 'no-duplicate-case'
2016-06-10 10:08:23 +01:00
Dan Poltawski ba7a9b6b9c MDL-54890 assignfeedback_editpdf: Fix missing semicolon
Detected by eslint rule 'semi'
2016-06-10 10:08:23 +01:00
Jun Pataleta edc4a0af61 MDL-54842 core_renderer: Hide additional body HTML in embedded layout 2016-06-10 14:47:54 +08:00
Stephen Bourget a3bc32d4e9 MDL-53111 Lesson: Allow "end reached" criteria to be disabled 2016-06-09 12:21:33 -04:00
Dan Poltawski 0563e83290 weekly release 3.1+ 2016-06-09 11:25:27 +01:00
Dan Poltawski ec82991b97 Merge branch 'install_31_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_31_STABLE 2016-06-09 11:25:25 +01:00
Andrew Nicols bf98b7fe3b MDL-54853 weblib: Specify version and fixed encoding 2016-06-09 09:54:41 +08:00
Andrew Nicols 2331a70c89 Merge branch 'MDL-54853-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-06-09 09:54:37 +08:00
Cameron Ball 63ba15c7db MDL-54853 weblib: Properly specify encoding for blanktarget 2016-06-08 18:29:42 +08:00
David Monllao 2398d9160a MDL-54859 mod_wiki: Client rules only when fields are visible 2016-06-08 16:46:54 +08:00
Andrew Nicols a72a8de00c Merge branch 'MDL-53947-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-06-08 08:46:51 +08:00
Dan Poltawski 490b6ff9ea MDL-46721 assign: clarify ternerary statement 2016-06-07 12:15:50 +01:00
Dan Poltawski 7512e4d33c Merge branch 'MDL-46721-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-06-07 12:12:37 +01:00
Frederic Massart adaf294a75 MDL-48756 editor_atto: Bulk atto autosave queries 2016-06-07 11:49:49 +01:00
Dan Poltawski 906c52ee96 MDL-54729 mod_forum: clarify static variable usage
After some time discussing with integrators, we decided that this
slightly yukky solution probably fits safely, so just making its usage
better explained and speciifc.
2016-06-07 10:48:07 +01:00
Adrian Greeve 8dc6bb8591 MDL-54729 mod_forum: Deep link highlighting works in IE. 2016-06-07 10:47:51 +01:00
Dan Poltawski 5043e4c31c Merge branch 'MDL-54765-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-06-07 09:41:34 +01:00
David Monllao dbc6c12766 Merge branch 'MDL-54180_31_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_31_STABLE 2016-06-07 16:17:19 +08:00
Eric Merrill 8abe0e83ee MDL-54559 theme: Fix padding that pushes navbar down 2016-06-07 14:58:40 +08:00
Skylar Kelty 318ff4acd7 MDL-53947 memcached: Fix memcached session warning on PHP7 2016-06-07 10:27:18 +08:00
Marina Glancy e9ada19fbb MDL-54837 tags: allow to specify static function as callback 2016-06-07 09:06:44 +08:00
Marina Glancy af8fc4c11d MDL-54837 tags: fixed bug when collection is locked
also fixed fatal error for upgraded plugins that did not pass tag
component to the tag form element
2016-06-07 09:06:44 +08:00
AMOS bot a2ae2c665f Automatically generated installer lang files 2016-06-07 06:28:19 +08:00
Eloy Lafuente (stronk7) e7bb6f945c Merge branch 'MDL-54739-31' of git://github.com/lameze/moodle into MOODLE_31_STABLE 2016-06-07 00:16:39 +02:00
Eloy Lafuente (stronk7) aa6fa3a56e Merge branch 'MDL-54769-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-06-06 23:56:51 +02:00
Eloy Lafuente (stronk7) 94f5d8a803 Merge branch 'MDL-54805-31-test' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-06-06 18:08:41 +02:00
Dan Poltawski 162dbe8d8c Merge branch 'wip-MDL-50824-MOODLE_31_STABLE' of https://github.com/cdsmith-umn/moodle into MOODLE_31_STABLE 2016-06-06 15:07:02 +01:00
Dan Poltawski 5761f5831b Merge branch 'MDL-54820-31' of git://github.com/jleyva/moodle into MOODLE_31_STABLE 2016-06-06 14:12:24 +01:00
Dan Poltawski d4e14393b4 Merge branch 'MDL-54702_31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-06-06 13:41:47 +01:00
Dan Poltawski 76c2a5dfbd Merge branch 'MDL-53392_31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-06-06 13:21:10 +01:00
Dan Poltawski 5bb6def595 Merge branch 'MDL-54557-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-06-06 13:17:11 +01:00
Dan Poltawski 1b6d059624 Merge branch 'wip-MDL-49852-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-06-06 11:59:44 +01:00
Eloy Lafuente (stronk7) f0043725b5 Merge branch 'MDL-41922-31-c' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-06-06 11:51:40 +02:00
Juan Leyva c8f3dfd3af MDL-54820 webservice: Fix regression in core_course_search_courses
Regression caused by MDL-51324
2016-06-03 13:04:00 +02:00
Mike Churchward bbe5d6c827 MDL-54805 portfolio_download: Adding a 'require' of necessary library file 2016-06-03 16:53:10 +08:00
Jun Pataleta 34d3e68c0d MDL-54765 mod_assign: Use selectedIndex for setting page selection
Set the 'selectedIndex' attribute of the page selection element instead of
the 'value' attribute since YUI is having trouble with this in IE.
2016-06-03 14:55:27 +08:00
Frederic Massart fa46696e27 MDL-41922 mod_quiz: Don't report quiz due when an attempt was finished 2016-06-03 14:53:08 +08:00
Andrew Nicols 30062d5a8e weekly release 3.1+ 2016-06-03 12:01:53 +08:00
Simey Lameze cbf3b1db5e MDL-54739 blocks: fix activity chooser link alignment 2016-06-03 10:44:18 +08:00
Clement Smith 599293befd MDL-50824 message/externallib.php: Fix get_string call
This fixes the get_string call by adding the intended recipient's
fullname as the third argument when a user tries to message the
recipient, the recipient is blocking non-contacts from messaging
them, and the user is not in the recipient's contact list.
2016-06-02 07:22:04 -05:00
Adam Olley 7141480e85 MDL-54797 course: Add indexed field to condition of delete query
Deleting records from the course_completion_criteria table goes much
faster when we include the indexed course field in the delete query.
2016-06-02 15:52:07 +09:30
Marina Glancy 32e79050f8 MDL-54557 course: treat section summary as contents 2016-06-02 12:57:10 +08:00
Andrew Nicols b0f7923ff0 MDL-54722 javascript: Add YUI depend wrapper to global event 2016-06-02 10:09:31 +08:00
Frederic Massart b30e4fd68d MDL-48248 enrol_manual: Handle durations more precise than int days 2016-06-01 15:57:45 +08:00
Andrew Nicols eb17d699ab Merge branch 'MDL-54722-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-06-01 12:24:32 +08:00
Cameron Ball 4f66e19b09 MDL-54722 navigation: Properly overflow expanded nav trees 2016-06-01 10:16:46 +08:00
Jake Dallimore 1b27eacc4a MDL-54702 mod_lti: Support standard cartridge icons in LTI import 2016-06-01 09:48:13 +08:00
Marina Glancy 88ed1fab62 MDL-54769 backup: add missing error language string 2016-06-01 09:45:42 +08:00
Andrew Nicols 328bc43039 Merge branch 'MDL-53598-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-06-01 08:25:26 +08:00
Mark Johnson 6862093122 MDL-54180 Behat: Handle exceptions from driver when saving screenshot 2016-05-31 12:34:58 +01:00
Marina Glancy 9fb7f10fc5 MDL-53598 block_glossary_random: do not fail if glossary was deleted
This commit refactors how associated glossary is searched for and removes
unnecessary DB queries. Also prevents from situations when the global glossary or course have
been deleted
2016-05-31 15:31:40 +08:00
David Monllao 50e4de2385 Merge branch 'MDL-54065-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-05-31 15:27:53 +08:00
Andrew Nicols 347cab92be Merge branch 'MDL-54655_m31v1' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-05-31 13:50:17 +08:00
David Monllao 86d0cd25c4 Merge branch 'MDL-54667-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-05-31 13:09:46 +08:00
David Monllao b1d6b851c0 Merge branch 'MDL-54763_m31' of git://github.com/markn86/moodle into MOODLE_31_STABLE 2016-05-31 12:31:47 +08:00
David Monllao 9ec8754e68 Merge branch 'MDL-53851-31' of https://github.com/blckct/moodle into MOODLE_31_STABLE 2016-05-31 11:46:25 +08:00
David Monllao 117b5cb9a3 Merge branch 'MDL-53938_31' of git://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-05-31 11:42:53 +08:00
David Monllao 035cc9e043 Merge branch 'MDL-54605_31' of git://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-05-31 11:32:49 +08:00
Stephen Bourget b42e0d4465 MDL-54579 Behat: tests for the private_files block 2016-05-31 11:18:59 +08:00
Barbara Ramiro 6294da8660 MDL-51683 design: New icon for competencies 2016-05-31 10:47:13 +08:00
Jakub Kania 88e39d3fdd MDL-54667 core_lib: Fix the param name in edit profile link 2016-05-30 16:35:42 +08:00
Cameron Ball 8a101cc06d MDL-37138 weblib: Document blanktarget in upgrade.txt 2016-05-30 16:12:51 +08:00
David Monllao eb61d44fec Merge branch 'MDL_54002_m31v3' of https://github.com/sbourget/moodle into MOODLE_31_STABLE 2016-05-30 16:09:14 +08:00
David Monllao 44ed5d73f2 Merge branch 'MDL-54010-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-05-30 16:04:37 +08:00
David Monllao 5f14cedd3a Merge branch 'MDL-54577-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-05-30 15:45:58 +08:00
David Monllao c32dd85426 Merge branch 'MDL-29905-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-05-30 15:40:56 +08:00
David Monllao 502a3013ce Merge branch 'MDL-54116-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-05-30 15:36:14 +08:00
David Monllao fdf8bf0793 Merge branch 'MDL-49943-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-05-30 15:29:33 +08:00
Andrew Nicols 78792b028f Merge branch 'MDL-54756_31' of git://github.com/timhunt/moodle into MOODLE_31_STABLE 2016-05-30 15:19:35 +08:00
David Monllao c183e31da0 Merge branch 'MDL-37138-31-2' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-05-30 15:02:30 +08:00
Andrew Nicols 6381f3bfe0 Merge branch 'MDL-54567-31-build' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-05-30 14:41:48 +08:00
Marina Glancy 73cf33aad4 MDL-49943 mod_choice: display multiple answers in complete report 2016-05-30 14:18:06 +08:00
Jun Pataleta 49634dadc9 MDL-53425 blocklib: Raise execution time for dashboard reset process 2016-05-30 14:12:38 +08:00
Andrew Nicols f14ddb2a8c Merge branch 'MDL-35987-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-05-30 13:40:56 +08:00
David Monllao 245aed199b Merge branch 'MDL-53425-31-delete-by-chunks' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-05-30 13:35:37 +08:00
Andrew Nicols 87e2b6154c MDL-54567 backup: Fixtures for legacy grade value rewrite 2016-05-30 13:34:04 +08:00
Frederic Massart c2235a04bf MDL-54567 backup: Process the calculations_freeze item upon restore 2016-05-30 13:34:04 +08:00
Mark Nelson 3574cae7ff MDL-54763 tool_lp: fixed typo in HTML tag 2016-05-30 13:32:04 +08:00
Cameron Ball 11c59cb6b4 MDL-37138 chat: Use blanktarget option for chat text 2016-05-30 13:18:17 +08:00
Cameron Ball 89b2e4fb30 MDL-37138 message: Use blanktarget option for message text 2016-05-30 13:18:17 +08:00
Cameron Ball 5a2228cf82 MDL-37138 weblib: Add blanktarget option to format_text 2016-05-30 13:18:17 +08:00
David Monllao 6898e4da78 Merge branch 'MDL-48248-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-05-30 13:02:56 +08:00
Frederic Massart 83350ad075 MDL-29905 question: Auto remove stale questions upon category deletion 2016-05-30 12:26:41 +08:00
Eric Merrill cfb0491dad MDL-29905 question: Try to delete unused hidden/random questions
Before going to display the warning about moving in use questions,
try to delete unused Random qtype questions, as well as 'hidden'
questions (these are questions that were deleted from the category),
but were in use at the time.
2016-05-30 12:26:40 +08:00
Jun Pataleta 54720d454f MDL-53425 blocklib: Perform deletion of block instances by chunk 2016-05-30 11:24:36 +08:00
David Monllao 4c5ab56a33 Merge branch 'MDL-54721-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-05-30 11:15:45 +08:00
David Monllao fd52a9fbe2 Merge branch 'MDL-43887-31' of git://github.com/cameron1729/moodle into MOODLE_31_STABLE 2016-05-30 11:09:05 +08:00
David Monllao 849b9e71b0 Merge branch 'MDL-51806_31' of https://github.com/snake/moodle into MOODLE_31_STABLE 2016-05-30 10:51:53 +08:00
Jake Dallimore 1b383c0177 MDL-51806 mod_workshop: Add locale support for grade values. 2016-05-30 10:49:39 +08:00
David Monllao 3077735595 Merge branch 'wip-MDL-45427-31' of git://github.com/abgreeve/moodle into MOODLE_31_STABLE 2016-05-30 10:19:41 +08:00
Marina Glancy 8b374f593c MDL-54065 gradebook: correctly display module icon 2016-05-30 10:08:33 +08:00
Stephen Bourget 0995a547d9 MDL-54655 Behat: Tests for the online_users block 2016-05-27 18:24:18 -04:00
Tim Hunt 330216eb8a MDL-54756 moodle_url: remove dangerous trim from make_file_url
This was a regression caused by MDL-50268. It broke qtype_stack.
2016-05-27 21:30:34 +01:00
Tim Hunt fb91edbe50 MDL-54605 quiz regrading: incorrect DB query
There were two issues. With groups, the $params array was wrong
due to PHP + vs array_merge sillyness.

Also, the first column in the SQL was not necessarily unique,
so we need to use a recordset rather than get_records.
2016-05-27 21:28:59 +01:00
Tim Hunt 6760e6db34 MDL-53938 qformat_gift: handle multi-choice MR with one 100% choice 2016-05-27 21:28:46 +01:00
Adrian Greeve 66da5c76b3 MDL-49852 mod_assign: Unit tests for activity completion. 2016-05-27 14:16:04 +08:00
Steve Bader 782aa36c34 MDL-49852 mod_assign: Fix group assignment completion tracking
Fixes completion tracking for group assignments where either only
one student is required to click Submit when submitting the
assignment for grading, all students are required to submit,
or no students are required to click submit (meaning that simply
uploading submits for grading).
2016-05-27 13:06:58 +08:00
Cameron Ball 1ad3ddcd24 MDL-43887 formslib: Allow not set date field
Previously if the date field was not enabled it would
be treated as having value 0. A bug would allow this 0
to pass through and save the date as 1 January 1970
2016-05-27 01:53:24 +08:00
Frederic Massart d30f466a17 MDL-54721 report_competency: Do not ignore the first user selection 2016-05-26 17:55:29 +08:00
Jake Dallimore f7a5f1c835 MDL-53392 mod_assign: Remove old Grade Max warning string references 2016-05-26 17:13:51 +08:00
Cameron Ball 93f06a35dd MDL-54010 roles: Specify encoding for escaped export data 2016-05-26 10:32:01 +08:00
Nigel Cunningham 9efa43c6a9 MDL-54010 roles: Fix missing HTMLspecialchars in role export code.
Role name and description fields are currently not escaped when
exporting a role. This results in an unusable file when characters
such as ampersands are used in a name or description. Fix this by
using htmlspecialchars on both fields.

Signed-off-by: Nigel Cunningham <nigelc@catalyst-au.net>
2016-05-26 10:32:00 +08:00
Stephen Bourget 80d33cde74 MDL-54577 Behat: Add tests for messages block 2016-05-26 10:22:05 +08:00
Marina Glancy 89fba73a45 MDL-54116 block_comments: warnings when commenting outside of a course 2016-05-26 10:20:13 +08:00
Stephen Bourget 95b82c9dcf MDL-54116 block_comments: behat test 2016-05-26 10:20:12 +08:00
Eloy Lafuente (stronk7) b1b097e2b6 weekly release 3.1+ 2016-05-26 02:14:18 +02:00
Adrian Greeve d7f63b7499 MDL-45427 mod_data: Inserting tags into templates.
Allows tags to be inserted into the editor without
having to touch Atto at all.
2016-05-25 15:28:40 +08:00
Frederic Massart 9cfc039669 MDL-35987 qtype_multianswer: Prevent restore failure due to bad sequence 2016-05-25 12:24:23 +08:00
Andrew Nicols f60b424d82 MDL-54059 testing: Add grunt test 2016-05-25 10:53:19 +08:00
Andrew Nicols f5cd3cb44d MDL-54059 testing: Simplify travis output 2016-05-25 10:53:19 +08:00
Frederic Massart 14b4959d75 MDL-48248 enrol_manual: Ensure that the default value is always selected 2016-05-25 10:17:31 +08:00
Eloy Lafuente (stronk7) 5d2f086eea Merge branch 'MDL-54714-31' of git://github.com/andrewnicols/moodle into MOODLE_31_STABLE 2016-05-24 22:23:41 +02:00
Stephen Bourget 5cd7c8e84f MDL-54002 Behat: tests for recent blogs block 2016-05-24 12:49:06 -04:00
Cameron Ball 2e458712c8 MDL-46721 assign: Make blind marking participant numbers match
Previously emails were setting the "From" header to the incorrect
participant number.
2016-05-24 18:25:25 +08:00
Andrew Nicols 87ae1417bf Merge branch 'MDL-54715-31' of git://github.com/marinaglancy/moodle into MOODLE_31_STABLE 2016-05-24 14:53:56 +08:00
Marina Glancy 01fbf70982 MDL-54715 core_question: fixed bug when importing questions with tags
Thanks to WangYang for original patch
2016-05-24 14:38:38 +08:00
David Monllao fad41516de Merge branch 'MDL-54675-forum-highlight-MOODLE_31_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_31_STABLE 2016-05-24 14:20:26 +08:00
Brendan Heywood 1987b771ad MDL-54675 forum: Fixed bug with multiple adjacent hash anchors 2016-05-24 16:07:46 +10:00
Andrew Nicols 0761279e9e MDL-54714 testing: Correct fetch branch for .travis.yml 2016-05-24 13:34:23 +08:00
Tim Hunt f073424c08 MDL-54582 accesslib: improve performance of load_course_context
The new query is logically equivalen, but much, much faster, at
least on Postgred. (15ms, instead of 700ms, in one example I tried
on the database for the OU's main Moodle site.)
2016-05-24 11:18:01 +08:00
Andrew Nicols 7b6cb91d6c MDL-53687 core_media: Comment fix 2016-05-24 09:06:40 +08:00
Andrew Nicols 98e4407615 Merge branch 'MDL-53687-31' of git://github.com/FMCorz/moodle into MOODLE_31_STABLE 2016-05-24 09:06:35 +08:00
Jakub Kania 4f92858527 MDL-53851 news block: Display news from all the accessible groups 2016-05-23 17:23:43 +02:00
Frederic Massart 025e98434d MDL-53687 core_media: Edge does not yet support WebM and OGG 2016-05-23 16:25:47 +08:00
Ryan Wyllie 48e08145e2 MDL-54642 tool_lp: Fix learning plan button layout in FF
The learning plan buttons are floating left but the table below it wasn't
clearning floating elements so it was appearing on the same line.
2016-05-23 14:53:18 +08:00
Frederic Massart 0f365eb0b2 MDL-46934 webservice_rest: Fixed undefined index on XML output 2016-05-23 14:39:00 +08:00
David Monllao d0adf43eec Merge branch 'MDL-54661-31' of git://github.com/junpataleta/moodle into MOODLE_31_STABLE 2016-05-23 14:24:18 +08:00
Jun Pataleta 4ac0e2d5e1 MDL-54661 mod_assign: Unescape course name in grading nav template 2016-05-23 12:12:42 +08:00
Jun Pataleta dabfdc2c6c MDL-54664 blocks_lp: Set the layout of to review pages to standard 2016-05-23 09:51:29 +08:00
Eloy Lafuente (stronk7) 1f010acdd0 MDL-54677 upgrade: add 3.1.0 separation line to all upgrade scripts 2016-05-23 01:32:56 +02:00
13392 changed files with 433238 additions and 1359006 deletions
+3
View File
@@ -0,0 +1,3 @@
--errors=errors,duplicate-properties
--warnings=known-properties,display-property-grouping,empty-rules,important
--exclude-list=vendor/,lib/editor/tinymce/,lib/yuilib/,theme/bootstrapbase/style/
+8 -81
View File
@@ -1,90 +1,17 @@
# Generated by "grunt ignorefiles"
*/**/yui/src/*/meta/
*/**/build/
node_modules/
vendor/
admin/tool/policy/amd/src/jquery-eu-cookie-law-popup.js
auth/cas/CAS/
cache/stores/mongodb/MongoDB/
enrol/lti/ims-blti/
filter/algebra/AlgParser.pm
filter/tex/mimetex.*
lib/editor/atto/plugins/html/yui/src/codemirror/
lib/editor/atto/plugins/html/yui/src/beautify/
lib/editor/atto/yui/src/rangy/js/*.*
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/mlbackend/php/phpml/
lib/adodb/
lib/bennu/
lib/evalmath/
lib/phpspreadsheet/
lib/google/
lib/htmlpurifier/
lib/jabber/
lib/minify/matthiasmullie-minify/
lib/minify/matthiasmullie-pathconverter/
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/xhprof/
lib/horde/
lib/requirejs/
lib/yuilib/
lib/jquery/
lib/htmlpurifier/
lib/flowplayer/
lib/xhprof/
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/
lib/amd/src/truncate.js
lib/fonts/
lib/amd/src/adapter.js
lib/validateurlsyntax.php
lib/amd/src/popper.js
lib/geopattern-php/
lib/php-jwt/
lib/babel-polyfill/
lib/mdn-polyfills/
lib/emoji-data/
lib/h5p/
media/player/videojs/amd/src/video-lazy.js
media/player/videojs/amd/src/Youtube-lazy.js
media/player/videojs/videojs/
media/player/videojs/amd/src/videojs-flash-lazy.js
media/player/videojs/videojs/video-js.swf
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/index.js
theme/boost/amd/src/modal.js
theme/boost/amd/src/popover.js
theme/boost/amd/src/sanitizer.js
theme/boost/amd/src/scrollspy.js
theme/boost/amd/src/tab.js
theme/boost/amd/src/toast.js
theme/boost/amd/src/tooltip.js
theme/boost/amd/src/util.js
theme/boost/amd/src/tether.js
theme/boost/scss/fontawesome/
theme/bootstrapbase/javascript/html5shiv.js
theme/bootstrapbase/amd/src/bootstrap.js
+5 -82
View File
@@ -1,8 +1,4 @@
{
'plugins': [
'babel',
'promise',
],
'env': {
'browser': true,
'amd': true
@@ -17,7 +13,6 @@
// === Possible Errors ===
'comma-dangle': 'off',
'no-compare-neg-zero': 'error',
'no-cond-assign': 'error',
'no-console': 'error',
'no-constant-condition': 'error',
@@ -36,6 +31,7 @@
'no-inner-declarations': 'error',
'no-invalid-regexp': 'error',
'no-irregular-whitespace': 'error',
'no-negated-in-lhs': 'error',
'no-obj-calls': 'error',
'no-prototype-builtins': 'off',
'no-regex-spaces': 'error',
@@ -43,7 +39,6 @@
'no-unexpected-multiline': 'error',
'no-unreachable': 'warn',
'no-unsafe-finally': 'error',
'no-unsafe-negation': 'error',
'use-isnan': 'error',
'valid-jsdoc': ['warn', { 'requireReturn': false, 'requireParamDescription': false, 'requireReturnDescription': false }],
'valid-typeof': 'error',
@@ -68,7 +63,7 @@
'no-extra-bind': 'warn',
'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',
@@ -76,6 +71,7 @@
'no-loop-func': 'error',
'no-multi-spaces': 'warn',
'no-multi-str': 'error',
'no-native-reassign': 'warn',
'no-new-func': 'error',
'no-new-wrappers': 'error',
'no-octal': 'error',
@@ -107,13 +103,11 @@
'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',
'consistent-this': 'off',
'eol-last': 'off',
'func-call-spacing': ['warn', 'never'],
'func-names': 'off',
'func-style': 'off',
// indent currently not doing well with our wrapping style, so disabled.
@@ -146,7 +140,7 @@
'no-nested-ternary': 'warn',
'no-new-object': 'off',
'no-plusplus': 'off',
'no-tabs': 'error',
'no-spaced-func': 'warn',
'no-ternary': 'off',
'no-trailing-spaces': 'error',
'no-underscore-dangle': 'off',
@@ -174,76 +168,5 @@
'spaced-comment': 'warn',
'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"],
// Disable some rules which we can't safely define for YUI rollups.
rules: {
'no-undef': 'off',
'no-unused-vars': 'off',
'no-unused-expressions': 'off'
}
},
{
files: ["**/amd/src/*.js", "**/amd/src/**/*.js", "Gruntfile*.js", "babel-plugin-add-module-to-define.js"],
// We support es6 now. Woot!
env: {
es6: true
},
// We're using babel transpiling so use their parser
// for linting.
parser: 'babel-eslint',
// 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'
},
parserOptions: {
'ecmaVersion': 9,
'sourceType': 'module'
}
}
]
}
}
-20
View File
@@ -1,20 +0,0 @@
{
"indentation": ["on",{
"Feature": 0,
"Background": 2,
"Scenario": 2,
"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-unamed-features": "on",
"no-unamed-scenarios": "on",
"no-scenario-outlines-without-examples": "on"
}
+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
-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');
-103
View File
@@ -1,103 +0,0 @@
name: Core
on: [push]
env:
php: 7.4
jobs:
Grunt:
runs-on: ubuntu-18.04
steps:
- name: Checking out code
uses: actions/checkout@v2
- name: Configuring node & npm
shell: bash -l {0}
run: nvm install
- name: Installing node stuff
run: npm install
- name: Running grunt
run: npx grunt
- name: Looking for uncommitted changes
# Add all files to the git index and then run diff --cached to see all changes.
# This ensures that we get the status of all files, including new files.
# We ignore npm-shrinkwrap.json to make the tasks immune to npm changes.
run: |
git add .
git reset -- npm-shrinkwrap.json
git diff --cached --exit-code
PHPUnit:
runs-on: ${{ matrix.os }}
services:
exttests:
image: moodlehq/moodle-exttests
ports:
- 8080:80
redis:
image: redis
ports:
- 6379:6379
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-18.04
php: 7.1
db: mysqli
- os: ubuntu-18.04
php: 7.4
db: pgsql
steps:
- name: Setting up DB mysql
if: ${{ matrix.db == 'mysqli' }}
uses: johanmeiring/mysql-action@tmpfs-patch
with:
collation server: utf8mb4_bin
mysql version: 5.7
mysql database: test
mysql user: test
mysql password: test
use tmpfs: true
- name: Setting up DB pgsql
if: ${{ matrix.db == 'pgsql' }}
uses: m4nu56/postgresql-action@v1
with:
postgresql version: 9.6
postgresql db: test
postgresql user: test
postgresql password: test
- name: Configuring git vars
uses: rlespinasse/github-slug-action@v3.x
- name: Setting up PHP ${{ matrix.php }}
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none
- name: Checking out code from ${{ env.GITHUB_REF_SLUG }}
uses: actions/checkout@v2
- name: Setting up PHPUnit
env:
dbtype: ${{ matrix.db }}
run: |
echo "pathtophp=$(which php)" >> $GITHUB_ENV # Inject installed pathtophp to env. The template config needs it.
cp .github/workflows/config-template.php config.php
mkdir ../moodledata
sudo locale-gen en_AU.UTF-8
php admin/tool/phpunit/cli/init.php --no-composer-self-update
- name: Running PHPUnit tests
env:
dbtype: ${{ matrix.db }}
run: vendor/bin/phpunit -v
+2 -10
View File
@@ -9,18 +9,10 @@
#
# 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.*
-2
View File
@@ -1,2 +0,0 @@
**/amd/**
/*.js
-3
View File
@@ -1,6 +1,3 @@
// NOTE: We use eslint now. This file is used only by shifter. We keep the configuration
// here because shifter uses jshint after modules have been concating. Eslint can't
// currently do this.
{
"asi": false,
"bitwise": true,
-1
View File
@@ -1 +0,0 @@
v14.15.0
-91
View File
@@ -1,91 +0,0 @@
# Generated by "grunt ignorefiles"
**/yui/build/*
theme/boost/style/moodle.css
theme/classic/style/moodle.css
node_modules/
vendor/
admin/tool/policy/amd/src/jquery-eu-cookie-law-popup.js
auth/cas/CAS/
cache/stores/mongodb/MongoDB/
enrol/lti/ims-blti/
filter/algebra/AlgParser.pm
filter/tex/mimetex.*
lib/editor/atto/plugins/html/yui/src/codemirror/
lib/editor/atto/plugins/html/yui/src/beautify/
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/mlbackend/php/phpml/
lib/adodb/
lib/bennu/
lib/evalmath/
lib/phpspreadsheet/
lib/google/
lib/htmlpurifier/
lib/jabber/
lib/minify/matthiasmullie-minify/
lib/minify/matthiasmullie-pathconverter/
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/xhprof/
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/
lib/amd/src/truncate.js
lib/fonts/
lib/amd/src/adapter.js
lib/validateurlsyntax.php
lib/amd/src/popper.js
lib/geopattern-php/
lib/php-jwt/
lib/babel-polyfill/
lib/mdn-polyfills/
lib/emoji-data/
lib/h5p/
media/player/videojs/amd/src/video-lazy.js
media/player/videojs/amd/src/Youtube-lazy.js
media/player/videojs/videojs/
media/player/videojs/amd/src/videojs-flash-lazy.js
media/player/videojs/videojs/video-js.swf
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/index.js
theme/boost/amd/src/modal.js
theme/boost/amd/src/popover.js
theme/boost/amd/src/sanitizer.js
theme/boost/amd/src/scrollspy.js
theme/boost/amd/src/tab.js
theme/boost/amd/src/toast.js
theme/boost/amd/src/tooltip.js
theme/boost/amd/src/util.js
theme/boost/amd/src/tether.js
theme/boost/scss/fontawesome/
-95
View File
@@ -1,95 +0,0 @@
{
"plugins": [
"stylelint-csstree-validator"
],
"rules": {
"csstree/validator": true,
"at-rule-empty-line-before": [ "always",
{"except": [ "blockless-after-blockless"], ignore: ["after-comment", "inside-block"]}
],
"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-space-before": "always-single-line",
"block-no-empty": true,
"block-opening-brace-newline-after": "always",
"block-opening-brace-space-after": "always-single-line",
"block-opening-brace-space-before": "always",
"color-hex-case": ["lower", { "severity": "warning" }],
"color-hex-length": ["short", { "severity": "warning" }],
"color-no-invalid-hex": true,
"declaration-bang-space-after": "never",
"declaration-bang-space-before": "always",
"declaration-block-no-duplicate-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",
"declaration-block-semicolon-space-before": "never",
"declaration-block-single-line-max-declarations": 1,
"declaration-block-trailing-semicolon": "always",
"declaration-colon-newline-after": "always-multi-line",
"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",
"function-comma-space-before": "never",
"function-linear-gradient-no-nonstandard-direction": true,
"function-max-empty-lines": 0,
"function-name-case": "lower",
"function-parentheses-newline-inside": "always-multi-line",
"function-parentheses-space-inside": "never-single-line",
"function-url-scheme-blacklist": ["data"],
"function-whitespace-after": "always",
"indentation": 4,
"keyframe-declaration-no-important": true,
"length-zero-no-unit": [true, { "severity": "warning" }],
"max-empty-lines": 2,
"max-line-length": [132, { "severity": "warning" }],
"media-feature-colon-space-after": "always",
"media-feature-colon-space-before": "never",
"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-empty-source": true,
"no-eol-whitespace": true,
"no-extra-semicolons": [true, { "severity": "warning" }],
"no-invalid-double-slash-comments": true,
"no-unknown-animations": true,
"property-case": "lower",
"property-no-unknown": true,
"selector-attribute-brackets-space-inside": "never",
"selector-attribute-operator-space-after": "never",
"selector-attribute-operator-space-before": "never",
"selector-combinator-space-after": "always",
"selector-combinator-space-before": "always",
"selector-list-comma-newline-after": "always",
"selector-list-comma-space-before": "never",
"selector-max-empty-lines": 0,
"selector-pseudo-class-case": "lower",
"selector-pseudo-class-no-unknown": true,
"selector-pseudo-class-parentheses-space-inside": "never",
"selector-pseudo-element-case": "lower",
"selector-pseudo-element-no-unknown": true,
"selector-type-case": "lower",
"selector-type-no-unknown": true,
"string-no-newline": true,
"time-min-milliseconds": 100,
"unit-blacklist": ["pt"],
"unit-case": "lower",
"unit-no-unknown": true,
"value-keyword-case": ["lower", {"ignoreKeywords": ["/(@|$)/"]}],
"value-list-comma-newline-after": "always-multi-line",
"value-list-comma-space-after": "always-single-line",
"value-list-comma-space-before": "never",
}
}
+94 -92
View File
@@ -2,92 +2,81 @@
# process (which uses our internal CI system) this file is here for the benefit
# of community developers git clones - see MDL-51458.
sudo: false
# We currently disable Travis notifications entirely until https://github.com/travis-ci/travis-ci/issues/4976
# is fixed.
notifications:
email:
if: env(MOODLE_EMAIL) != no
email: false
language: php
os: linux
php:
# We only run the highest and lowest supported versions to reduce the load on travis-ci.org.
- 7.0
# - 5.6
# - 5.5
- 5.4
dist: xenial
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 5.6, 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.
services:
- mysql
- docker
# Run unit tests on MySQL
- DB=mysqli TASK=PHPUNIT
addons:
postgresql: "9.6"
# Run CI Tests without running PHPUnit.
- DB=none TASK=CITEST
jobs:
# 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:
# First all the lowest php ones (7.1.30)
# Make this sticky because current default version (7.1.11) has a bug with redis-extension output (MDL-66062)
- php: 7.1.30
env: DB=none TASK=CITEST
- php: 7.1.30
env: DB=none TASK=GRUNT NVM_VERSION='lts/carbon'
# Run grunt/npm install on lowest supported npm version
- php: 7
env: DB=none TASK=GRUNT NVM_VERSION='0.10'
# Run grunt/npm install on highest version ('node' is an alias for the latest node.js version.)
- php: 7
env: DB=none TASK=GRUNT NVM_VERSION='node'
- if: env(MOODLE_DATABASE) = "pgsql" OR env(MOODLE_DATABASE) = "all" OR env(MOODLE_DATABASE) IS NOT present
php: 7.1.30
env: DB=pgsql TASK=PHPUNIT
exclude:
# MySQL - it's just too slow.
# Exclude it on all versions except for 7.0
# - env: DB=mysqli TASK=PHPUNIT
# php: 5.6
#
# - env: DB=mysqli TASK=PHPUNIT
# php: 5.5
- if: env(MOODLE_DATABASE) = "mysqli" OR env(MOODLE_DATABASE) = "all"
php: 7.1.30
env: DB=mysqli TASK=PHPUNIT
- env: DB=mysqli TASK=PHPUNIT
php: 5.4
# Then, conditionally, all the highest php ones (7.4)
- if: env(MOODLE_PHP) = "all"
php: 7.4
env: DB=none TASK=CITEST
- if: env(MOODLE_PHP) = "all"
php: 7.4
env: DB=none TASK=GRUNT NVM_VERSION='lts/carbon'
- env: DB=none TASK=GRUNT
php: 5.4
- if: env(MOODLE_PHP) = "all" AND (env(MOODLE_DATABASE) = "pgsql" OR env(MOODLE_DATABASE) = "all" OR env(MOODLE_DATABASE) IS NOT present)
php: 7.4
env: DB=pgsql TASK=PHPUNIT
- if: env(MOODLE_PHP) = "all" AND (env(MOODLE_DATABASE) = "mysqli" OR env(MOODLE_DATABASE) = "all")
php: 7.4
env: DB=mysqli TASK=PHPUNIT
# Moodle 2.7 is not compatible with PHP 7 for the upgrade test.
- env: DB=pgsql TASK=UPGRADE
php: 7.0
cache:
directories:
- $HOME/.composer/cache
- $HOME/.npm
before_install:
- docker run -d -p 127.0.0.1:8080:80 --name exttests moodlehq/moodle-exttests
# Avoid IPv6 default binding as service (causes redis not to start).
- sudo service redis-server start --bind 127.0.0.1
install:
- >
if [ "$DB" = 'mysqli' ];
then
sudo mkdir /mnt/ramdisk
sudo mount -t tmpfs -o size=1024m tmpfs /mnt/ramdisk
sudo service mysql stop
sudo mv /var/lib/mysql /mnt/ramdisk
sudo ln -s /mnt/ramdisk/mysql /var/lib/mysql
sudo service mysql restart
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
@@ -96,9 +85,6 @@ install:
echo 'auth.json' >> .git/info/exclude
fi
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.
@@ -115,7 +101,7 @@ install:
before_script:
- phpenv config-rm xdebug.ini
- >
if [ "$TASK" = 'PHPUNIT' ];
if [ "$TASK" = 'PHPUNIT' -o "$TASK" = 'UPGRADE' ];
then
# Copy generic configuration in place.
cp config-dist.php config.php ;
@@ -131,7 +117,7 @@ before_script:
# The wwwroot and dataroot.
sed -i \
-e "s%http://example.com/moodle%https://localhost%" \
-e "s%http://example.com/moodle%http://localhost%" \
-e "s%/home/example/moodledata%/home/travis/roots/base%" \
config.php ;
@@ -151,13 +137,11 @@ before_script:
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;' ;
mysql -e 'CREATE DATABASE travis_ci_test DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_bin;' ;
fi
fi
@@ -172,21 +156,6 @@ before_script:
-e "/require_once/i \\\$CFG->phpunit_dataroot = '\/home\/travis\/roots\/phpunit';" \
-e "/require_once/i \\\$CFG->phpunit_prefix = 'p_';" \
config.php ;
# Enable test external resources
sed -i \
-e "/require_once/i \\define('TEST_EXTERNAL_FILES_HTTP_URL', 'http://127.0.0.1:8080');" \
-e "/require_once/i \\define('TEST_EXTERNAL_FILES_HTTPS_URL', 'http://127.0.0.1:8080');" \
config.php ;
# Redis cache store tests
sed -i \
-e "/require_once/i \\define('TEST_CACHESTORE_REDIS_TESTSERVERS', '127.0.0.1');" \
config.php ;
# Redis session tests, but not for PHP 7.2 and up. See MDL-60978 for more info.
redissession="define('TEST_SESSION_REDIS_HOST', '127.0.0.1');"
sed -i \
-e "/require_once/i \\${redissession}" \
config.php ;
# Initialise PHPUnit for Moodle.
php admin/tool/phpunit/cli/init.php
@@ -215,7 +184,7 @@ before_script:
# We need the official upstream for comparison
git remote add upstream https://github.com/moodle/moodle.git;
git fetch upstream MOODLE_38_STABLE;
git fetch upstream MOODLE_31_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`
@@ -226,11 +195,37 @@ before_script:
export phpcmd=`which php`;
fi
########################################################################
# Upgrade test
########################################################################
- >
if [ "$TASK" = 'UPGRADE' ];
then
# We need the official upstream.
git remote add upstream https://github.com/moodle/moodle.git;
# Checkout 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 --fail-on-risky --disallow-test-output --verbose;
vendor/bin/phpunit;
fi
- >
@@ -245,16 +240,23 @@ script:
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.
# We ignore npm-shrinkwrap.json to make the tasks immune to npm changes.
git add . ;
git reset -- npm-shrinkwrap.json ;
git diff --cached --exit-code ;
fi
after_script:
########################################################################
# Upgrade test
########################################################################
- >
if [ "$TASK" = 'PHPUNIT' ];
if [ "$TASK" = 'UPGRADE' ];
then
EXTTESTS_HITS=$(docker logs exttests 2>&1 | grep -Fv -e 'AH00558' -e '[pid 1]' | wc -l)
echo -e "\nTest local resources number of hits: ${EXTTESTS_HITS}.\n"
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
+44 -450
View File
@@ -13,7 +13,6 @@
// 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 2014 Andrew Nicols
@@ -24,25 +23,10 @@
* Grunt configuration
*/
/* eslint-env node */
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'),
watchman = require('fb-watchman'),
watchmanClient = new watchman.Client(),
gruntFilePath = process.cwd();
// 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);
}
cwd = 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.
@@ -50,29 +34,16 @@ module.exports = function(grunt) {
var root = grunt.option('root');
if (grunt.file.exists(__dirname, root)) {
cwd = path.join(__dirname, root);
grunt.log.ok('Setting root to ' + cwd);
grunt.log.ok('Setting root to '+cwd);
} else {
grunt.fail.fatal('Setting root to ' + root + ' failed - path does not exist');
grunt.fail.fatal('Setting root to '+root+' failed - path does not exist');
}
}
var files = null;
if (grunt.option('files')) {
// Accept a comma separated list of files to process.
files = grunt.option('files').split(',');
}
var inAMD = path.basename(cwd) == 'amd';
// Globbing pattern for matching all AMD JS source files.
var amdSrc = [];
if (inAMD) {
amdSrc.push(cwd + "/src/*.js");
amdSrc.push(cwd + "/src/**/*.js");
} else {
amdSrc.push("**/amd/src/*.js");
amdSrc.push("**/amd/src/**/*.js");
}
var amdSrc = [inAMD ? cwd + '/src/*.js' : '**/amd/src/*.js'];
/**
* Function to generate the destination for the uglify task
@@ -84,120 +55,38 @@ module.exports = function(grunt) {
* @param {String} srcPath the matched src path
* @return {String} The rewritten destination path.
*/
var babelRename = function(destPath, srcPath) {
var uglify_rename = function (destPath, srcPath) {
destPath = srcPath.replace('src', 'build');
destPath = destPath.replace('.js', '.min.js');
destPath = path.resolve(cwd, destPath);
return destPath;
};
/**
* 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/'];
thirdpartyfiles.forEach(function(file) {
var dirname = path.dirname(file);
var doc = new DOMParser().parseFromString(grunt.file.read(file));
var nodes = xpath.select("/libraries/library/location/text()", doc);
nodes.forEach(function(node) {
var lib = path.join(dirname, node.toString());
if (grunt.file.isDir(lib)) {
// Ensure trailing slash on dirs.
lib = lib.replace(/\/?$/, '/');
}
// 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.
// 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)
},
amd: {src: files ? files : amdSrc},
// Check YUI module source files.
yui: {src: files ? files : ['**/yui/src/**/*.js', '!*/**/yui/src/*/meta/*.js']}
jshint: {
options: {jshintrc: '.jshintrc'},
amd: { src: amdSrc }
},
babel: {
options: {
sourceMaps: true,
comments: 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('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: [
['minify', {
// This minification plugin needs to be disabled because it breaks the
// source map generation and causes invalid source maps to be output.
simplify: false,
builtIns: false
}],
['@babel/preset-env', {
targets: {
browsers: [
">0.25%",
"last 2 versions",
"not ie <= 10",
"not op_mini all",
"not Opera > 0",
"not dead"
]
},
modules: false,
useBuiltIns: false
}]
]
},
dist: {
uglify: {
amd: {
files: [{
expand: true,
src: files ? files : amdSrc,
rename: babelRename
src: amdSrc,
rename: uglify_rename
}]
}
},
sass: {
dist: {
less: {
bootstrapbase: {
files: {
"theme/boost/style/moodle.css": "theme/boost/scss/preset/default.scss",
"theme/classic/style/moodle.css": "theme/classic/scss/classicgrunt.scss"
"theme/bootstrapbase/style/moodle.css": "theme/bootstrapbase/less/moodle.less",
"theme/bootstrapbase/style/editor.css": "theme/bootstrapbase/less/editor.less",
},
options: {
compress: true
}
},
options: {
includePaths: ["theme/boost/scss/", "theme/classic/scss/"]
}
}
},
watch: {
options: {
@@ -207,72 +96,23 @@ module.exports = function(grunt) {
files: ['**/amd/src/**/*.js'],
tasks: ['amd']
},
boost: {
files: ['**/theme/boost/scss/**/*.scss'],
tasks: ['scss']
},
rawcss: {
files: ['**/*.css', '**/theme/**/!(moodle.css|editor.css)'],
tasks: ['rawcss']
bootstrapbase: {
files: ["theme/bootstrapbase/less/**/*.less"],
tasks: ["less:bootstrapbase"]
},
yui: {
files: ['**/yui/src/**/*.js'],
tasks: ['yui']
tasks: ['shifter']
},
gherkinlint: {
files: ['**/tests/behat/*.feature'],
tasks: ['gherkinlint']
}
},
shifter: {
options: {
recursive: true,
paths: files ? files : [cwd]
}
},
gherkinlint: {
options: {
files: files ? files : ['**/tests/behat/*.feature'],
}
},
stylelint: {
scss: {
options: {syntax: 'scss'},
src: files ? files : ['*/**/*.scss']
},
css: {
src: files ? files : ['*/**/*.css'],
options: {
configOverrides: {
rules: {
// These rules have to be disabled in .stylelintrc for scss compat.
"at-rule-no-unknown": true,
}
}
}
paths: [cwd]
}
}
});
/**
* 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"',
'**/yui/build/*',
'theme/boost/style/moodle.css',
'theme/classic/style/moodle.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.
@@ -281,13 +121,14 @@ module.exports = function(grunt) {
* so be careful to to call done().
*/
tasks.shifter = function() {
var done = this.async(),
var async = require('async'),
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) {
async.eachSeries(options.paths, function (src, filedone) {
var args = [];
args.push(path.normalize(__dirname + '/node_modules/shifter/bin/shifter'));
args.push( path.normalize(__dirname + '/node_modules/shifter/bin/shifter'));
// Always ignore the node_modules directory.
args.push('--excludes', 'node_modules');
@@ -335,7 +176,7 @@ module.exports = function(grunt) {
cmd: "node",
args: args,
opts: {cwd: src, stdio: 'inherit', env: process.env}
}, function(error, result, code) {
}, function (error, result, code) {
if (code) {
grunt.fail.fatal('Shifter failed with code: ' + code);
} else {
@@ -361,34 +202,10 @@ module.exports = function(grunt) {
}, done);
};
tasks.gherkinlint = function() {
const done = this.async();
const options = grunt.config('gherkinlint.options');
// Grab the gherkin-lint linter and required scaffolding.
const linter = require('gherkin-lint/src/linter.js');
const featureFinder = require('gherkin-lint/src/feature-finder.js');
const configParser = require('gherkin-lint/src/config-parser.js');
const formatter = require('gherkin-lint/src/formatters/stylish.js');
// Run the linter.
const results = linter.lint(
featureFinder.getFeatureFiles(grunt.file.expand(options.files)),
configParser.getConfiguration(configParser.defaultConfigFileName)
);
// Print the results out uncondtionally.
formatter.printResults(results);
// Report on the results.
// The done function takes a bool whereby a falsey statement causes the task to fail.
done(results.every(result => result.errors.length === 0));
};
tasks.startup = function() {
// Are we in a YUI directory?
if (path.basename(path.resolve(cwd, '../../')) == 'yui') {
grunt.task.run('yui');
grunt.task.run('shifter');
// Are we in an AMD directory?
} else if (inAMD) {
grunt.task.run('amd');
@@ -396,262 +213,39 @@ module.exports = function(grunt) {
// Run them all!.
grunt.task.run('css');
grunt.task.run('js');
grunt.task.run('gherkinlint');
}
};
/**
* 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.
*/
tasks.watch = function() {
var watchTaskDone = this.async();
var watchInitialised = false;
var watchTaskQueue = {};
var processingQueue = false;
// 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: cwd,
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();
}
);
};
var watchConfig = grunt.config.get(['watch']);
watchConfig = Object.keys(watchConfig).reduce(function(carry, key) {
if (key == 'options') {
return carry;
}
var value = watchConfig[key];
var fileGlobs = value.files;
var taskNames = value.tasks;
taskNames.forEach(function(taskName) {
carry[taskName] = fileGlobs;
});
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 = cwd + '/' + file.name;
Object.keys(watchConfig).forEach(function(task) {
var fileGlobs = watchConfig[task];
var match = fileGlobs.every(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(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', cwd], 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;
}
// Use the matching patterns specified in the watch config.
var matches = Object.keys(watchConfig).map(function(task) {
var fileGlobs = watchConfig[task];
var fileGlobMatches = fileGlobs.map(function(fileGlob) {
return ['match', fileGlob, 'wholename'];
});
return ['allof'].concat(fileGlobMatches);
});
var sub = {
expression: ["anyof"].concat(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 ' + cwd);
});
});
});
};
// 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('shifter.options.paths', files);
grunt.config('gherkinlint.options.files', files);
grunt.config('babel.dist.files', [{expand: true, src: files, rename: babelRename}]);
changedFiles = Object.create(null);
var files = Object.keys(changedFiles);
grunt.config('jshint.amd.src', files);
grunt.config('uglify.amd.files', [{ expand: true, src: files, rename: uglify_rename }]);
grunt.config('shifter.options.paths', files);
changedFiles = Object.create(null);
}, 200);
grunt.event.on('watch', function(action, filepath) {
changedFiles[filepath] = action;
onChange();
changedFiles[filepath] = action;
onChange();
});
// Register NPM tasks.
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-sass');
grunt.loadNpmTasks('grunt-eslint');
grunt.loadNpmTasks('grunt-stylelint');
grunt.loadNpmTasks('grunt-babel');
// Rename the grunt-contrib-watch "watch" task because we're going to wrap it.
grunt.renameTask('watch', 'watch-grunt');
// Register JS tasks.
grunt.registerTask('shifter', 'Run Shifter against the current directory', tasks.shifter);
grunt.registerTask('gherkinlint', 'Run gherkinlint against the current directory', tasks.gherkinlint);
grunt.registerTask('ignorefiles', 'Generate ignore files for linters', tasks.ignorefiles);
grunt.registerTask('watch', 'Run tasks on file changes', tasks.watch);
grunt.registerTask('yui', ['eslint:yui', 'shifter']);
grunt.registerTask('amd', ['eslint:amd', 'babel']);
grunt.registerTask('js', ['amd', 'yui']);
grunt.registerTask('amd', ['jshint', 'uglify']);
grunt.registerTask('js', ['amd', 'shifter']);
// Register CSS taks.
grunt.registerTask('css', ['stylelint:scss', 'sass', 'stylelint:css']);
grunt.registerTask('scss', ['stylelint:scss', 'sass']);
grunt.registerTask('rawcss', ['stylelint:css']);
grunt.registerTask('css', ['less:bootstrapbase']);
// Register the startup task.
grunt.registerTask('startup', 'Run the correct tasks for the current directory', tasks.startup);
-48
View File
@@ -1,48 +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 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));
}
}
+2 -1
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";
+2 -1
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'));
+6 -29
View File
@@ -16,9 +16,6 @@ $err = array();
$returnurl = "$CFG->wwwroot/$CFG->admin/settings.php?section=manageauths";
debugging("Use of config.html files in authentication plugins have been deprecated. " .
" Please migrate your plugin to use the admin settings API", DEBUG_DEVELOPER);
// save configuration changes
if ($frm = data_submitted() and confirm_sesskey()) {
@@ -67,6 +64,8 @@ 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";
// HACK to prevent browsers from automatically inserting the user's password into the wrong fields.
echo prevent_form_autofill_password();
// auth plugin description
echo $OUTPUT->box_start();
@@ -89,28 +88,12 @@ exit;
/// Functions /////////////////////////////////////////////////////////////////
/**
* auth field locking
* 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.
*
* @param string $auth authentication plugin shortname
* @param array $user_fields user profile fields
* @param string $helptext help text to be displayed at top of form
* @param boolean $retrieveopts Map fields or lock only.
* @param boolean $updateopts Allow remote updates
* @param array $customfields list of custom profile fields
* @deprecated since Moodle 3.3
*/
// 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;
debugging("The function 'print_auth_lock_options' has been deprecated, " .
"Please migrate your code to use the admin settings API and use the function 'display_auth_lock_options' instead. ",
DEBUG_DEVELOPER);
echo '<tr><td colspan="3">';
if ($retrieveopts) {
echo $OUTPUT->heading(get_string('auth_data_mapping', 'auth'));
@@ -165,12 +148,6 @@ function print_auth_lock_options($auth, $user_fields, $helptext, $retrieveopts,
// If custom field then pick name from database.
$fieldshortname = str_replace('profile_field_', '', $fieldname);
$fieldname = $customfieldname[$fieldshortname]->name;
if (core_text::strlen($fieldshortname) > 67) {
// If custom profile field name is longer than 67 characters we will not be able to store the setting
// such as 'field_updateremote_profile_field_NOTSOSHORTSHORTNAME' in the database because the character
// limit for the setting name is 100.
continue;
}
} elseif ($fieldname == 'url') {
$fieldname = get_string('webpage');
} else {
+28 -9
View File
@@ -4,7 +4,6 @@
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');
@@ -52,18 +51,38 @@
admin_get_root(true, false); // settings not required - only pages
}
if (!isset($CFG->undeletableblocktypes) || (!is_array($CFG->undeletableblocktypes) && !is_string($CFG->undeletableblocktypes))) {
$undeletableblocktypes = array('navigation', 'settings');
} else if (is_string($CFG->undeletableblocktypes)) {
$undeletableblocktypes = explode(',', $CFG->undeletableblocktypes);
} else {
$undeletableblocktypes = $CFG->undeletableblocktypes;
}
if (!empty($protect) && confirm_sesskey()) {
block_manager::protect_block((int)$protect);
if (!$block = $DB->get_record('block', array('id'=>$protect))) {
print_error('blockdoesnotexist', 'error');
}
if (!in_array($block->name, $undeletableblocktypes)) {
$undeletableblocktypes[] = $block->name;
set_config('undeletableblocktypes', implode(',', $undeletableblocktypes));
add_to_config_log('block_protect', $unprotect, $protect, $block->name);
}
admin_get_root(true, false); // settings not required - only pages
}
if (!empty($unprotect) && confirm_sesskey()) {
block_manager::unprotect_block((int)$unprotect);
if (!$block = $DB->get_record('block', array('id'=>$unprotect))) {
print_error('blockdoesnotexist', 'error');
}
if (in_array($block->name, $undeletableblocktypes)) {
$undeletableblocktypes = array_diff($undeletableblocktypes, array($block->name));
set_config('undeletableblocktypes', implode(',', $undeletableblocktypes));
add_to_config_log('block_protect', $unprotect, $protect, $block->name);
}
admin_get_root(true, false); // settings not required - only pages
}
$undeletableblocktypes = block_manager::get_undeletable_block_types();
echo $OUTPUT->header();
echo $OUTPUT->heading($strmanageblocks);
@@ -168,10 +187,10 @@
$visible = '';
} else if ($blocks[$blockid]->visible) {
$visible = '<a href="blocks.php?hide='.$blockid.'&amp;sesskey='.sesskey().'" title="'.$strhide.'">'.
$OUTPUT->pix_icon('t/hide', $strhide) . '</a>';
'<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.'">'.
$OUTPUT->pix_icon('t/show', $strshow) . '</a>';
'<img src="'.$OUTPUT->pix_url('t/show') . '" class="iconsmall" alt="'.$strshow.'" /></a>';
$class = 'dimmed_text';
}
@@ -186,10 +205,10 @@
$undeletable = '';
} else if (in_array($blockname, $undeletableblocktypes)) {
$undeletable = '<a href="blocks.php?unprotect='.$blockid.'&amp;sesskey='.sesskey().'" title="'.$strunprotect.'">'.
$OUTPUT->pix_icon('t/unlock', $strunprotect) . '</a>';
'<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.'">'.
$OUTPUT->pix_icon('t/lock', $strprotect) . '</a>';
'<img src="'.$OUTPUT->pix_url('t/lock') . '" class="iconsmall" alt="'.$strprotect.'" /></a>';
}
$row = array(
+12 -15
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));
@@ -53,16 +54,14 @@ $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');
@@ -74,7 +73,7 @@ if ($data = data_submitted() and confirm_sesskey()) {
if ($PAGE->user_allowed_editing() && $adminediting != -1) {
$USER->editing = $adminediting;
}
$buttons = null;
if ($PAGE->user_allowed_editing()) {
$url = clone($PAGE->url);
if ($PAGE->user_is_editing()) {
@@ -90,7 +89,7 @@ if ($PAGE->user_allowed_editing()) {
$savebutton = false;
$outputhtml = '';
foreach ($settingspage->children as $childpage) {
if ($childpage->is_hidden() || !$childpage->check_access()) {
if ($childpage->is_hidden()) {
continue;
}
if ($childpage instanceof admin_externalpage) {
@@ -121,16 +120,14 @@ foreach ($settingspage->children as $childpage) {
}
if ($savebutton) {
$outputhtml .= html_writer::start_tag('div', array('class' => 'form-buttons'));
$outputhtml .= html_writer::empty_tag('input', array('class' => 'btn btn-primary form-submit', 'type' => 'submit', 'value' => get_string('savechanges','admin')));
$outputhtml .= html_writer::empty_tag('input', array('class' => 'form-submit', 'type' => 'submit', 'value' => get_string('savechanges','admin')));
$outputhtml .= html_writer::end_tag('div');
}
$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();
-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,59 +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'];
$mform->addElement('text', 'recipient', get_string('testoutgoingmailconf_toemail', 'admin'), $options);
$mform->setType('recipient', PARAM_EMAIL);
$mform->addRule('recipient', get_string('required'), 'required');
$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');
}
}
-195
View File
@@ -1,195 +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);
}
/**
* 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;
}
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');
}
$bytes = $data['v'] * $data['u'];
$result = $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);
}
}
-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';
}
}
-289
View File
@@ -1,289 +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 log table.
*
* @package core_admin
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_admin;
defined('MOODLE_INTERNAL') || die();
require_once($CFG->libdir . '/tablelib.php');
/**
* Table to display list of task logs.
*
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class task_log_table extends \table_sql {
/**
* Constructor for the task_log table.
*
* @param string $filter
* @param int $resultfilter
*/
public function __construct(string $filter = '', int $resultfilter = null) {
global $DB;
if (-1 === $resultfilter) {
$resultfilter = null;
}
parent::__construct('tasklogs');
$columnheaders = [
'classname' => get_string('name'),
'type' => get_string('tasktype', 'admin'),
'userid' => get_string('user', 'admin'),
'timestart' => get_string('task_starttime', 'admin'),
'duration' => get_string('task_duration', 'admin'),
'db' => get_string('task_dbstats', 'admin'),
'result' => get_string('task_result', 'admin'),
'actions' => '',
];
$this->define_columns(array_keys($columnheaders));
$this->define_headers(array_values($columnheaders));
// The name column is a header.
$this->define_header_column('classname');
// This table is not collapsible.
$this->collapsible(false);
// The actions class should not wrap. Use the BS text utility class.
$this->column_class('actions', 'text-nowrap');
// Allow pagination.
$this->pageable(true);
// Allow sorting. Default to sort by timestarted DESC.
$this->sortable(true, 'timestart', SORT_DESC);
// Add filtering.
$where = [];
$params = [];
if (!empty($filter)) {
$orwhere = [];
$filter = str_replace('\\', '\\\\', $filter);
// Check the class name.
$orwhere[] = $DB->sql_like('classname', ':classfilter', false, false);
$params['classfilter'] = '%' . $DB->sql_like_escape($filter) . '%';
$orwhere[] = $DB->sql_like('output', ':outputfilter', false, false);
$params['outputfilter'] = '%' . $DB->sql_like_escape($filter) . '%';
$where[] = "(" . implode(' OR ', $orwhere) . ")";
}
if (null !== $resultfilter) {
$where[] = 'tl.result = :result';
$params['result'] = $resultfilter;
}
$where = implode(' AND ', $where);
$this->set_sql('', '', $where, $params);
}
/**
* Query the db. Store results in the table object for use by build_table.
*
* @param int $pagesize size of page for paginated displayed table.
* @param bool $useinitialsbar do you want to use the initials bar. Bar
* will only be used if there is a fullname column defined for the table.
*/
public function query_db($pagesize, $useinitialsbar = true) {
global $DB;
// Fetch the attempts.
$sort = $this->get_sql_sort();
if ($sort) {
$sort = "ORDER BY $sort";
}
$extrafields = get_extra_user_fields(\context_system::instance());
$userfields = \user_picture::fields('u', $extrafields, 'userid2', 'user');
$where = '';
if (!empty($this->sql->where)) {
$where = "WHERE {$this->sql->where}";
}
$sql = "SELECT
tl.id, tl.type, tl.component, tl.classname, tl.userid, tl.timestart, tl.timeend,
tl.dbreads, tl.dbwrites, tl.result,
tl.dbreads + tl.dbwrites AS db,
tl.timeend - tl.timestart AS duration,
{$userfields}
FROM {task_log} tl
LEFT JOIN {user} u ON u.id = tl.userid
{$where}
{$sort}";
$this->pagesize($pagesize, $DB->count_records_sql("SELECT COUNT('x') FROM {task_log} tl {$where}", $this->sql->params));
if (!$this->is_downloading()) {
$this->rawdata = $DB->get_records_sql($sql, $this->sql->params, $this->get_page_start(), $this->get_page_size());
} else {
$this->rawdata = $DB->get_records_sql($sql, $this->sql->params);
}
}
/**
* Format the name cell.
*
* @param \stdClass $row
* @return string
*/
public function col_classname($row) : string {
$output = '';
if (class_exists($row->classname)) {
$task = new $row->classname;
if ($task instanceof \core\task\scheduled_task) {
$output = $task->get_name();
}
}
$output .= \html_writer::tag('div', "\\{$row->classname}", [
'class' => 'task-class',
]);
return $output;
}
/**
* Format the type cell.
*
* @param \stdClass $row
* @return string
*/
public function col_type($row) : string {
if (\core\task\database_logger::TYPE_SCHEDULED == $row->type) {
return get_string('task_type:scheduled', 'admin');
} else {
return get_string('task_type:adhoc', 'admin');
}
}
/**
* Format the timestart cell.
*
* @param \stdClass $row
* @return string
*/
public function col_result($row) : string {
if ($row->result) {
return get_string('task_result:failed', 'admin');
} else {
return get_string('success');
}
}
/**
* Format the timestart cell.
*
* @param \stdClass $row
* @return string
*/
public function col_timestart($row) : string {
return userdate($row->timestart, get_string('strftimedatetimeshort', 'langconfig'));
}
/**
* Format the duration cell.
*
* @param \stdClass $row
* @return string
*/
public function col_duration($row) : string {
$duration = round($row->timeend - $row->timestart, 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);
}
/**
* Format the DB details cell.
*
* @param \stdClass $row
* @return string
*/
public function col_db($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;
}
/**
* Format the actions cell.
*
* @param \stdClass $row
* @return string
*/
public function col_actions($row) : string {
global $OUTPUT;
$actions = [];
$url = new \moodle_url('/admin/tasklogs.php', ['logid' => $row->id]);
// Quick view.
$actions[] = $OUTPUT->action_icon(
$url,
new \pix_icon('e/search', get_string('view')),
new \popup_action('click', $url)
);
// Download.
$actions[] = $OUTPUT->action_icon(
new \moodle_url($url, ['download' => true]),
new \pix_icon('t/download', get_string('download'))
);
return implode('&nbsp;', $actions);
}
/**
* Format the user cell.
*
* @param \stdClass $row
* @return string
*/
public function col_userid($row) : string {
if (empty($row->userid)) {
return '';
}
$user = (object) [];
username_load_fields_from_object($user, $row, 'user');
return fullname($user);
}
}
+1 -1
View File
@@ -28,7 +28,7 @@
define('CLI_SCRIPT', true);
require(__DIR__.'/../../config.php');
require(dirname(dirname(dirname(__FILE__))).'/config.php');
require_once($CFG->libdir.'/clilib.php'); // cli only functions
require_once($CFG->libdir.'/cronlib.php');
+1 -1
View File
@@ -25,7 +25,7 @@
define('CLI_SCRIPT', 1);
require(__DIR__.'/../../config.php');
require(dirname(dirname(dirname(__FILE__))).'/config.php');
require_once($CFG->libdir.'/clilib.php');
require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php');
-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);
-173
View File
@@ -1,173 +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.
if (array_key_exists($options['name'], $CFG->config_php_settings)) {
cli_error('The configuration variable is hard-set in the config.php, unable to change.', 4);
}
set_config($options['name'], $options['set'], $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);
}
+1 -1
View File
@@ -30,7 +30,7 @@
define('CLI_SCRIPT', true);
require(__DIR__.'/../../config.php');
require(dirname(dirname(dirname(__FILE__))).'/config.php');
require_once($CFG->libdir.'/clilib.php'); // cli only functions
require_once($CFG->libdir.'/cronlib.php');
-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');
+200 -218
View File
@@ -90,7 +90,7 @@ Example:
// distro specific customisation
$distrolibfile = __DIR__.'/../../install/distrolib.php';
$distrolibfile = dirname(dirname(dirname(__FILE__))).'/install/distrolib.php';
$distro = null;
if (file_exists($distrolibfile)) {
require_once($distrolibfile);
@@ -100,7 +100,7 @@ if (file_exists($distrolibfile)) {
}
// Nothing to do if config.php exists
$configfile = __DIR__.'/../../config.php';
$configfile = dirname(dirname(dirname(__FILE__))).'/config.php';
if (file_exists($configfile)) {
require($configfile);
require_once($CFG->libdir.'/clilib.php');
@@ -146,15 +146,20 @@ 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.4.4") < 0) {
$phpversion = phpversion();
// do NOT localise - lang strings would not work here and we CAN NOT move it after installib
fwrite(STDERR, "Moodle 2.7 or later requires at least PHP 5.4.4 (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;
$CFG = new stdClass();
$CFG->lang = 'en';
$CFG->dirroot = dirname(dirname(__DIR__));
$CFG->dirroot = dirname(dirname(dirname(__FILE__)));
$CFG->libdir = "$CFG->dirroot/lib";
$CFG->wwwroot = "http://localhost";
$CFG->httpswwwroot = $CFG->wwwroot;
@@ -167,7 +172,7 @@ $CFG->debug = (E_ALL | E_STRICT);
$CFG->debugdisplay = true;
$CFG->debugdeveloper = true;
$parts = explode('/', str_replace('\\', '/', dirname(__DIR__)));
$parts = explode('/', str_replace('\\', '/', dirname(dirname(__FILE__))));
$CFG->admin = array_pop($parts);
//point pear include path to moodles lib/pear so that includes and requires will search there for files before anywhere else
@@ -219,6 +224,7 @@ $databases = array('mysqli' => moodle_database::get_driver_instance('mysqli', 'n
'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) {
@@ -238,7 +244,7 @@ list($options, $unrecognized) = cli_get_params(
'chmod' => isset($distro->directorypermissions) ? sprintf('%04o',$distro->directorypermissions) : '2777', // let distros set dir permissions
'lang' => $CFG->lang,
'wwwroot' => '',
'dataroot' => empty($distro->dataroot) ? str_replace('\\', '/', dirname(dirname(dirname(__DIR__))).'/moodledata'): $distro->dataroot, // initialised later after including libs or by distro
'dataroot' => empty($distro->dataroot) ? str_replace('\\', '/', dirname(dirname(dirname(dirname(__FILE__)))).'/moodledata'): $distro->dataroot, // initialised later after including libs or by distro
'dbtype' => empty($distro->dbtype) ? $defaultdb : $distro->dbtype, // let distro skip dbtype selection
'dbhost' => empty($distro->dbhost) ? 'localhost' : $distro->dbhost, // let distros set dbhost
'dbname' => 'moodle',
@@ -266,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);
@@ -392,6 +397,7 @@ if ($interactive) {
$CFG->wwwroot = $wwwroot;
$CFG->httpswwwroot = $CFG->wwwroot;
//We need dataroot before lang download
$CFG->dataroot = $options['dataroot'];
if ($interactive) {
@@ -442,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';
@@ -514,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 {
@@ -620,118 +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');
} else {
if ((empty($options['adminpass']) or $options['adminpass'] === 'admin')) {
$a = (object)['option' => 'adminpass', 'value' => $options['adminpass']];
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
}
}
// Ask for the admin email address.
if ($interactive) {
cli_separator();
cli_heading(get_string('cliadminemail', 'install'));
$prompt = get_string('clitypevaluedefault', 'admin', $options['adminemail']);
$options['adminemail'] = cli_input($prompt, $options['adminemail']);
}
// Validate that the address provided was an e-mail address.
if (!empty($options['adminemail']) && !validate_email($options['adminemail'])) {
$a = (object)['option' => 'adminemail', 'value' => $options['adminemail']];
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 {
$prompt = get_string('clitypevalue', 'admin');
}
do {
$options['shortname'] = cli_input($prompt, $options['shortname']);
} while (empty($options['shortname']));
} else {
if (empty($options['shortname'])) {
$a = (object)array('option'=>'shortname', 'value'=>$options['shortname']);
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
}
}
// ask for admin user name
if ($interactive) {
cli_separator();
cli_heading(get_string('cliadminusername', 'install'));
if (!empty($options['adminuser'])) {
$prompt = get_string('clitypevaluedefault', 'admin', $options['adminuser']);
} 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']) 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();
@@ -750,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
@@ -818,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";
}
+15 -17
View File
@@ -62,12 +62,17 @@ 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.4.4") < 0) {
$phpversion = phpversion();
// do NOT localise - lang strings would not work here and we CAN NOT move it after installib
fwrite(STDERR, "Moodle 2.7 or later requires at least PHP 5.4.4 (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';
$configfile = dirname(dirname(dirname(__FILE__))).'/config.php';
if (!file_exists($configfile)) {
fwrite(STDERR, 'config.php does not exist, can not continue'); // do not localize
fwrite(STDERR, "\n");
@@ -82,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);
@@ -104,17 +114,12 @@ list($options, $unrecognized) = cli_get_params(
)
);
// 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
}
@@ -178,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);
+10 -127
View File
@@ -24,7 +24,7 @@
define('CLI_SCRIPT', true);
require(__DIR__.'/../../config.php');
require(dirname(dirname(dirname(__FILE__))).'/config.php');
require_once($CFG->libdir.'/clilib.php'); // cli only functions
if ($DB->get_dbfamily() !== 'mysql') {
@@ -53,7 +53,7 @@ Options:
-h, --help Print out this help
Example:
\$ sudo -u www-data /usr/bin/php admin/cli/mysql_collation.php --collation=utf8mb4_unicode_ci
\$ sudo -u www-data /usr/bin/php admin/cli/mysql_collation.php --collation=utf8_general_ci
";
if (!empty($options['collation'])) {
@@ -64,71 +64,6 @@ if (!empty($options['collation'])) {
cli_error("Error: collation '$collation' is not available on this server!");
}
$collationinfo = explode('_', $collation);
$charset = reset($collationinfo);
$engine = strtolower($DB->get_dbengine());
// Do checks for utf8mb4.
if (strpos($collation, 'utf8mb4') === 0) {
// Do we have the right engine?
if ($engine !== 'innodb' && $engine !== 'xtradb') {
cli_error("Error: '$collation' requires InnoDB or XtraDB set as the engine.");
}
// Are we using Barracuda?
if ($DB->get_row_format() != 'Barracuda') {
// Try setting it here.
try {
$DB->execute("SET GLOBAL innodb_file_format=Barracuda");
} catch (dml_exception $e) {
cli_error("Error: '$collation' requires the file format to be set to Barracuda.
An attempt was made to change the format, but it failed. Please try doing this manually.");
}
echo "GLOBAL SETTING: innodb_file_format changed to Barracuda\n";
}
// Is one file per table being used?
if (!$DB->is_file_per_table_enabled()) {
try {
$DB->execute("SET GLOBAL innodb_file_per_table=1");
} catch (dml_exception $e) {
cli_error("Error: '$collation' requires the setting 'innodb_file_per_table' be set to 'ON'.
An attempt was made to change the format, but it failed. Please try doing this manually.");
}
echo "GLOBAL SETTING: innodb_file_per_table changed to 1\n";
}
// Is large prefix set?
if (!$DB->is_large_prefix_enabled()) {
try {
$DB->execute("SET GLOBAL innodb_large_prefix=1");
} catch (dml_exception $e) {
cli_error("Error: '$collation' requires the setting 'innodb_large_prefix' be set to 'ON'.
An attempt was made to change the format, but it failed. Please try doing this manually.");
}
echo "GLOBAL SETTING: innodb_large_prefix changed to 1\n";
}
}
$sql = "SHOW VARIABLES LIKE 'collation_database'";
if (!$dbcollation = $DB->get_record_sql($sql)) {
cli_error("Error: Could not access collation information on the database.");
}
$sql = "SHOW VARIABLES LIKE 'character_set_database'";
if (!$dbcharset = $DB->get_record_sql($sql)) {
cli_error("Error: Could not access character set information on the database.");
}
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";
try {
$DB->change_database_structure($sql);
} catch (exception $e) {
cli_error("Error: Tried to alter the database with no success. Please try manually changing the database
to the new collation and character set and then run this script again.");
}
echo "DATABASE CONVERTED\n";
}
echo "Converting tables and columns to '$collation' for $CFG->wwwroot:\n";
$prefix = $DB->get_prefix();
$prefix = str_replace('_', '\\_', $prefix);
@@ -145,22 +80,9 @@ if (!empty($options['collation'])) {
$skipped++;
} else {
try {
$DB->change_database_structure("ALTER TABLE $table->name CONVERT TO CHARACTER SET $charset COLLATE $collation");
echo "CONVERTED\n";
$converted++;
} catch (ddl_exception $e) {
$result = mysql_set_row_format($table->name, $charset, $collation, $engine);
if ($result) {
echo "CONVERTED\n";
$converted++;
} else {
// We don't know what the problem is. Stop the conversion.
cli_error("Error: Tried to convert $table->name, but there was a problem. Please check the details of this
table and try again.");
die();
}
}
$DB->change_database_structure("ALTER TABLE $table->name DEFAULT COLLATE = $collation");
echo "CONVERTED\n";
$converted++;
}
$sql = "SHOW FULL COLUMNS FROM $table->name WHERE collation IS NOT NULL";
@@ -174,36 +96,22 @@ if (!empty($options['collation'])) {
continue;
}
// Check for utf8mb4 collation.
$rowformat = $DB->get_row_format_sql($engine, $collation);
if ($column->type === 'tinytext' or $column->type === 'mediumtext' or $column->type === 'text' or $column->type === 'longtext') {
$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
MODIFY COLUMN $column->field $column->type
CHARACTER SET $charset
COLLATE $collation $notnull $default";
$sql = "ALTER TABLE $table->name MODIFY COLUMN $column->field $column->type COLLATE $collation $notnull $default";
$DB->change_database_structure($sql);
} else if (strpos($column->type, 'varchar') === 0) {
$notnull = ($column->null === 'NO') ? 'NOT NULL' : 'NULL';
$default = !is_null($column->default) ? "DEFAULT '$column->default'" : '';
if ($rowformat != '') {
$sql = "ALTER TABLE $table->name $rowformat";
$DB->change_database_structure($sql);
}
$sql = "ALTER TABLE $table->name
MODIFY COLUMN $column->field $column->type
CHARACTER SET $charset
COLLATE $collation $notnull $default";
// primary, unique and inc are not supported for texts
$sql = "ALTER TABLE $table->name MODIFY COLUMN $column->field $column->type COLLATE $collation $notnull $default";
$DB->change_database_structure($sql);
} else {
echo "ERROR (unknown column type: $column->type)\n";
$errors++;
$error++;
continue;
}
echo "CONVERTED\n";
@@ -272,9 +180,7 @@ function mysql_get_collations() {
global $DB;
$collations = array();
$sql = "SHOW COLLATION
WHERE Collation LIKE 'utf8\_%' AND Charset = 'utf8'
OR Collation LIKE 'utf8mb4\_%' AND Charset = 'utf8mb4'";
$sql = "SHOW COLLATION WHERE Collation LIKE 'utf8\_%' AND Charset = 'utf8'";
$rs = $DB->get_recordset_sql($sql);
foreach ($rs as $collation) {
$collations[$collation->collation] = $collation->collation;
@@ -303,26 +209,3 @@ function mysql_get_column_collations($tablename) {
$rs->close();
return $collations;
}
function mysql_set_row_format($tablename, $charset, $collation, $engine) {
global $DB;
$sql = "SELECT row_format
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = DATABASE() AND table_name = ?";
$rs = $DB->get_record_sql($sql, array($tablename));
if ($rs) {
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");
} else {
// Row format may not be the problem. Can not diagnose problem. Send fail reply.
return false;
}
} else {
return false;
}
return true;
}
+1 -1
View File
@@ -25,7 +25,7 @@
define('CLI_SCRIPT', true);
require(__DIR__.'/../../config.php');
require(dirname(__FILE__).'/../../config.php');
require_once($CFG->libdir . '/clilib.php');
if ($DB->get_dbfamily() !== 'mysql') {
+1 -1
View File
@@ -26,7 +26,7 @@
define('CLI_SCRIPT', true);
require(__DIR__.'/../../config.php');
require(dirname(dirname(dirname(__FILE__))).'/config.php');
require_once($CFG->libdir.'/clilib.php'); // cli only functions
if ($DB->get_dbfamily() !== 'mysql') {
+8 -31
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>
@@ -25,19 +23,10 @@
define('CLI_SCRIPT', true);
require(__DIR__.'/../../config.php');
require(dirname(dirname(dirname(__FILE__))).'/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);
+11 -38
View File
@@ -26,26 +26,13 @@
define('CLI_SCRIPT', true);
require(__DIR__.'/../../config.php');
require(dirname(dirname(dirname(__FILE__))).'/config.php');
require_once($CFG->libdir.'/clilib.php'); // cli only functions
// Define the input options.
$longparams = array(
'help' => false,
'username' => '',
'password' => '',
'ignore-password-policy' => false
);
$shortparams = array(
'h' => 'help',
'u' => 'username',
'p' => 'password',
'i' => 'ignore-password-policy'
);
// now get cli options
list($options, $unrecognized) = cli_get_params($longparams, $shortparams);
list($options, $unrecognized) = cli_get_params(array('help'=>false),
array('h'=>'help'));
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
@@ -60,43 +47,29 @@ 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
-u, --username=username Specify username to change
-p, --password=newpassword Specify new password
--ignore-password-policy Ignore password policy when setting password
-h, --help Print out this help
Example:
\$sudo -u www-data /usr/bin/php admin/cli/reset_password.php
\$sudo -u www-data /usr/bin/php admin/cli/reset_password.php --username=rosaura --password=jiu3jiu --ignore-password-policy
";
echo $help;
die;
}
if ($options['username'] == '' ) {
cli_heading('Password reset');
$prompt = "Enter username (manual authentication only)";
$username = cli_input($prompt);
} else {
$username = $options['username'];
}
cli_heading('Password reset');
$prompt = "Enter username (manual authentication only)";
$username = cli_input($prompt);
if (!$user = $DB->get_record('user', array('auth'=>'manual', 'username'=>$username, 'mnethostid'=>$CFG->mnet_localhost_id))) {
cli_error("Can not find user '$username'");
}
if ($options['password'] == '' ) {
$prompt = "Enter new password";
$password = cli_input($prompt);
} else {
$password = $options['password'];
}
$prompt = "Enter new password";
$password = cli_input($prompt);
$errmsg = '';//prevent eclipse warning
if (!$options['ignore-password-policy'] ) {
if (!check_password_policy($password, $errmsg, $user)) {
cli_error(html_to_text($errmsg, 0));
}
if (!check_password_policy($password, $errmsg)) {
cli_error(html_to_text($errmsg, 0));
}
$hashedpassword = hash_internal_user_password($password);
-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 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.
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,
], [
'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);
}
$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);
+9 -42
View File
@@ -38,7 +38,7 @@ if (function_exists('opcache_reset') and !isset($_SERVER['REMOTE_ADDR'])) {
define('CLI_SCRIPT', true);
define('CACHE_DISABLE_ALL', true);
require(__DIR__.'/../../config.php');
require(dirname(dirname(dirname(__FILE__))).'/config.php');
require_once($CFG->libdir.'/adminlib.php'); // various admin-only functions
require_once($CFG->libdir.'/upgradelib.php'); // general upgrade/install related functions
require_once($CFG->libdir.'/clilib.php'); // cli only functions
@@ -51,9 +51,7 @@ list($options, $unrecognized) = cli_get_params(
'non-interactive' => false,
'allow-unstable' => false,
'help' => false,
'lang' => $lang,
'verbose-settings' => false,
'is-pending' => false,
'lang' => $lang
),
array(
'h' => 'help'
@@ -86,11 +84,6 @@ Options:
site language if not set. Defaults to 'en' if the lang
parameter is invalid or if the language pack is not
installed.
--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.
--is-pending If an upgrade is needed it exits with an error code of
2 so it distinct from other types of errors.
-h, --help Print out this help
Example:
@@ -119,10 +112,6 @@ if (!moodle_needs_upgrading()) {
cli_error(get_string('cliupgradenoneed', 'core_admin', $newversion), 0);
}
if ($options['is-pending']) {
cli_error(get_string('cliupgradepending', 'core_admin'), 2);
}
// Test environment first.
list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE);
if (!$envstatus) {
@@ -142,11 +131,10 @@ if (!core_plugin_manager::instance()->all_plugins_ok($version, $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;
}
@@ -195,30 +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);
// 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);
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";
echo get_string('cliupgradefinished', 'admin')."\n";
exit(0); // 0 means success
+2 -1
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'));
-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])) {
print_error('customfieldnotfound', 'error', $return, $customfieldname);
}
switch ($action) {
case 'disable':
if ($customfieldplugins[$customfieldname]->is_enabled()) {
set_config('disabled', 1, 'customfield_'. $customfieldname);
core_plugin_manager::reset_caches();
}
break;
case 'enable':
if (!$customfieldplugins[$customfieldname]->is_enabled()) {
unset_config('disabled', 'customfield_'. $customfieldname);
core_plugin_manager::reset_caches();
}
break;
}
redirect($return);
+2 -1
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'));
+2 -5
View File
@@ -15,7 +15,8 @@ $confirm = optional_param('confirm', 0, PARAM_BOOL);
$PAGE->set_url('/admin/editors.php', array('action'=>$action, 'editor'=>$editor));
$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=manageeditors";
@@ -46,7 +47,6 @@ switch ($action) {
// remove from enabled list
$key = array_search($editor, $active_editors);
unset($active_editors[$key]);
add_to_config_log('editor_visibility', '1', '0', $editor);
break;
case 'enable':
@@ -54,7 +54,6 @@ switch ($action) {
if (!in_array($editor, $active_editors)) {
$active_editors[] = $editor;
$active_editors = array_unique($active_editors);
add_to_config_log('editor_visibility', '0', '1', $editor);
}
break;
@@ -67,7 +66,6 @@ switch ($action) {
$fsave = $active_editors[$key];
$active_editors[$key] = $active_editors[$key + 1];
$active_editors[$key + 1] = $fsave;
add_to_config_log('editor_position', $key, $key + 1, $editor);
}
}
break;
@@ -81,7 +79,6 @@ switch ($action) {
$fsave = $active_editors[$key];
$active_editors[$key] = $active_editors[$key - 1];
$active_editors[$key - 1] = $fsave;
add_to_config_log('editor_position', $key, $key - 1, $editor);
}
}
break;
+2 -1
View File
@@ -35,7 +35,8 @@ $confirm = optional_param('confirm', 0, PARAM_BOOL);
$PAGE->set_url('/admin/enrol.php');
$PAGE->set_context(context_system::instance());
require_admin();
require_login();
require_capability('moodle/site:config', context_system::instance());
require_sesskey();
$enabled = enrol_get_plugins(true);
File diff suppressed because it is too large Load Diff
+6 -2
View File
@@ -22,12 +22,16 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(__DIR__ . '/../config.php');
require_once(dirname(__FILE__) . '/../config.php');
require_once($CFG->libdir . '/adminlib.php');
$action = optional_param('action', '', PARAM_ALPHA);
$filterpath = optional_param('filterpath', '', PARAM_PLUGIN);
require_login();
$systemcontext = context_system::instance();
require_capability('moodle/site:config', $systemcontext);
admin_externalpage_setup('managefilters');
// Clean up bogus filter states first.
@@ -214,7 +218,7 @@ function get_table_row(\core\plugininfo\filter $plugininfo, $state, $isfirstrow,
// Re-order.
$updown = '';
$spacer = $OUTPUT->spacer();
$spacer = '<img src="' . $OUTPUT->pix_url('spacer') . '" class="iconsmall" alt="" />';
if ($state->active != TEXTFILTER_DISABLED) {
if (!$isfirstrow) {
$updown .= $OUTPUT->action_icon(filters_action_url($filter, 'up'), new pix_icon('t/up', get_string('up'), '', array('class' => 'iconsmall')));
+22 -71
View File
@@ -29,9 +29,14 @@ if (!file_exists('../config.php')) {
die();
}
// 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 as soon as possible
if (version_compare(phpversion(), '5.4.4') < 0) {
$phpversion = phpversion();
// do NOT localise - lang strings would not work here and we CAN NOT move it to later place
echo "Moodle 2.7 or later requires at least PHP 5.4.4 (currently using version $phpversion).<br />";
echo "Please upgrade your server software or install older Moodle version.";
die();
}
// make sure iconv is available and actually works
if (!function_exists('iconv')) {
@@ -96,12 +101,6 @@ if (function_exists('opcache_invalidate')) {
// indirectly calls the protected init() method is good here.
core_component::get_core_subsystems();
if (is_major_upgrade_required() && isloggedin()) {
// A major upgrade is required.
// Terminate the session and redirect back here before anything DB-related happens.
redirect_if_major_upgrade_required();
}
require_once($CFG->libdir.'/adminlib.php'); // various admin-only functions
require_once($CFG->libdir.'/upgradelib.php'); // general upgrade/install related functions
@@ -226,7 +225,7 @@ if (!core_tables_exist()) {
}
if (empty($confirmrelease)) {
require_once($CFG->libdir.'/environmentlib.php');
list($envstatus, $environmentresults) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE);
list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE);
$strcurrentrelease = get_string('currentrelease');
$PAGE->navbar->add($strcurrentrelease);
@@ -235,7 +234,7 @@ if (!core_tables_exist()) {
$PAGE->set_cacheable(false);
$output = $PAGE->get_renderer('core', 'admin');
echo $output->install_environment_page($maturity, $envstatus, $environmentresults, $release);
echo $output->install_environment_page($maturity, $envstatus, $environment_results, $release);
die();
}
@@ -316,11 +315,6 @@ if (!$cache and $version > $CFG->version) { // upgrade
$testsite = 'behat';
}
if (isset($CFG->themerev)) {
// Store the themerev to restore after purging caches.
$themerev = $CFG->themerev;
}
// 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.
@@ -330,11 +324,6 @@ if (!$cache and $version > $CFG->version) { // upgrade
// We then purge the regular caches.
purge_all_caches();
if (isset($themerev)) {
// Restore the themerev
set_config('themerev', $themerev);
}
$output = $PAGE->get_renderer('core', 'admin');
if (upgrade_stale_php_files_present()) {
@@ -358,9 +347,9 @@ if (!$cache and $version > $CFG->version) { // upgrade
echo $output->upgrade_confirm_page($a->newversion, $maturity, $testsite);
die();
} else if (empty($confirmrelease)) {
} else if (empty($confirmrelease)){
require_once($CFG->libdir.'/environmentlib.php');
list($envstatus, $environmentresults) = check_moodle_environment($release, ENV_SELECT_RELEASE);
list($envstatus, $environment_results) = check_moodle_environment($release, ENV_SELECT_RELEASE);
$strcurrentrelease = get_string('currentrelease');
$PAGE->navbar->add($strcurrentrelease);
@@ -368,7 +357,7 @@ if (!$cache and $version > $CFG->version) { // upgrade
$PAGE->set_heading($strcurrentrelease);
$PAGE->set_cacheable(false);
echo $output->upgrade_environment_page($release, $envstatus, $environmentresults);
echo $output->upgrade_environment_page($release, $envstatus, $environment_results);
die();
} else if (empty($confirmplugins)) {
@@ -509,8 +498,7 @@ if (!$cache and $version > $CFG->version) { // upgrade
// Always verify plugin dependencies!
$failed = array();
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) {
echo $output->unsatisfied_dependencies_page($version, $failed, new moodle_url($PAGE->url,
array('confirmplugincheck' => 0)));
echo $output->unsatisfied_dependencies_page($version, $failed, $PAGE->url);
die();
}
unset($failed);
@@ -534,10 +522,7 @@ if (!$cache and $branch <> $CFG->branch) { // Update the branch
if (!$cache and moodle_needs_upgrading()) {
$PAGE->set_url(new moodle_url($PAGE->url, array(
'confirmrelease' => $confirmrelease,
'confirmplugincheck' => $confirmplugins,
)));
$PAGE->set_url(new moodle_url($PAGE->url, array('confirmplugincheck' => $confirmplugins)));
check_upgrade_key($upgradekeyhash);
@@ -547,21 +532,7 @@ if (!$cache and moodle_needs_upgrading()) {
$pluginman = core_plugin_manager::instance();
$output = $PAGE->get_renderer('core', 'admin');
if (empty($confirmrelease)) {
require_once($CFG->libdir . '/environmentlib.php');
list($envstatus, $environmentresults) = check_moodle_environment($release, ENV_SELECT_RELEASE);
$strcurrentrelease = get_string('currentrelease');
$PAGE->navbar->add($strcurrentrelease);
$PAGE->set_title($strcurrentrelease);
$PAGE->set_heading($strcurrentrelease);
$PAGE->set_cacheable(false);
echo $output->upgrade_environment_page($release, $envstatus, $environmentresults);
die();
} else if (!$confirmplugins) {
if (!$confirmplugins) {
$strplugincheck = get_string('plugincheck');
$PAGE->navbar->add($strplugincheck);
@@ -702,8 +673,7 @@ if (!$cache and moodle_needs_upgrading()) {
$failed = array();
if (!$pluginman->all_plugins_ok($version, $failed)) {
$output = $PAGE->get_renderer('core', 'admin');
echo $output->unsatisfied_dependencies_page($version, $failed, new moodle_url($PAGE->url,
array('confirmplugincheck' => 0)));
echo $output->unsatisfied_dependencies_page($version, $failed, $PAGE->url);
die();
}
unset($failed);
@@ -718,7 +688,6 @@ if (!$cache and moodle_needs_upgrading()) {
if (during_initial_install()) {
set_config('rolesactive', 1); // after this, during_initial_install will return false.
set_config('adminsetuppending', 1);
set_config('registrationpending', 1); // Remind to register site after all other setup is finished.
// we need this redirect to setup proper session
upgrade_finished("index.php?sessionstarted=1&amp;lang=$CFG->lang");
}
@@ -821,7 +790,7 @@ $SESSION->admin_critical_warning = ($insecuredataroot==INSECURE_DATAROOT_ERROR);
$adminroot = admin_get_root();
// Check if there are any new admin settings which have still yet to be set
if (any_new_admin_settings($adminroot)) {
if (any_new_admin_settings($adminroot)){
redirect('upgradesettings.php');
}
@@ -834,19 +803,14 @@ if (isset($SESSION->pluginuninstallreturn)) {
}
}
// If site registration needs updating, redirect.
\core\hub\registration::registration_reminder('/admin/index.php');
// Everything should now be set up, and the user is an admin
// Print default admin page with notifications.
$errorsdisplayed = defined('WARN_DISPLAY_ERRORS_ENABLED');
$lastcron = get_config('tool_task', 'lastcronstart');
// We make the assumption that at least one schedule task should run once per day.
$lastcron = $DB->get_field_sql('SELECT MAX(lastruntime) FROM {task_scheduled}');
$cronoverdue = ($lastcron < time() - 3600 * 24);
$lastcroninterval = get_config('tool_task', 'lastcroninterval');
$expectedfrequency = $CFG->expectedcronfrequency ?? 200;
$croninfrequent = !$cronoverdue && ($lastcroninterval > $expectedfrequency || $lastcron < time() - $expectedfrequency);
$dbproblems = $DB->diagnose();
$maintenancemode = !empty($CFG->maintenance_enabled);
@@ -882,23 +846,11 @@ if ($updateschecker->enabled()) {
$buggyiconvnomb = (!function_exists('mb_convert_encoding') and @iconv('UTF-8', 'UTF-8//IGNORE', '100'.chr(130).'€') !== '100€');
//check if the site is registered on Moodle.org
$registered = \core\hub\registration::is_registered();
$registered = $DB->count_records('registration_hubs', array('huburl' => HUB_MOODLEORGHUBURL, 'confirmed' => 1));
// Check if there are any cache warnings.
$cachewarnings = cache_helper::warnings();
// Check if there are events 1 API handlers.
$eventshandlers = $DB->get_records_sql('SELECT DISTINCT component FROM {events_handlers}');
$themedesignermode = !empty($CFG->themedesignermode);
$mobileconfigured = !empty($CFG->enablemobilewebservice);
$invalidforgottenpasswordurl = !empty($CFG->forgottenpasswordurl) && empty(clean_param($CFG->forgottenpasswordurl, PARAM_URL));
// Check if a directory with development libraries exists.
if (empty($CFG->disabledevlibdirscheck) && (is_dir($CFG->dirroot.'/vendor') || is_dir($CFG->dirroot.'/node_modules'))) {
$devlibdir = true;
} else {
$devlibdir = false;
}
// Check if the site is being foced onto ssl.
$overridetossl = !empty($CFG->overridetossl);
admin_externalpage_setup('adminnotifications');
@@ -906,5 +858,4 @@ $output = $PAGE->get_renderer('core', 'admin');
echo $output->admin_notifications_page($maturity, $insecuredataroot, $errorsdisplayed, $cronoverdue, $dbproblems,
$maintenancemode, $availableupdates, $availableupdatesfetch, $buggyiconvnomb,
$registered, $cachewarnings, $eventshandlers, $themedesignermode, $devlibdir,
$mobileconfigured, $overridetossl, $invalidforgottenpasswordurl, $croninfrequent);
$registered, $cachewarnings, $eventshandlers);
-85
View File
@@ -24,8 +24,6 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Return a list of page types
* @param string $pagetype current page type
@@ -39,86 +37,3 @@ function admin_page_type_list($pagetype, $parentcontext, $currentcontext) {
);
return $array;
}
/**
* File serving.
*
* @param stdClass $course The course object.
* @param stdClass $cm The cm object.
* @param context $context The context object.
* @param string $filearea The file area.
* @param array $args List of arguments.
* @param bool $forcedownload Whether or not to force the download of the file.
* @param array $options Array of options.
* @return void|false
*/
function core_admin_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload, array $options = array()) {
global $CFG;
if (in_array($filearea, ['logo', 'logocompact'])) {
$size = array_shift($args); // The path hides the size.
$itemid = clean_param(array_shift($args), PARAM_INT);
$filename = clean_param(array_shift($args), PARAM_FILE);
$themerev = theme_get_revision();
if ($themerev <= 0) {
// Normalise to 0 as -1 doesn't place well with paths.
$themerev = 0;
}
// Extract the requested width and height.
$maxwidth = 0;
$maxheight = 0;
if (preg_match('/^\d+x\d+$/', $size)) {
list($maxwidth, $maxheight) = explode('x', $size);
$maxwidth = clean_param($maxwidth, PARAM_INT);
$maxheight = clean_param($maxheight, PARAM_INT);
}
$lifetime = 0;
if ($itemid > 0 && $themerev == $itemid) {
// The itemid is $CFG->themerev, when 0 or less no caching. Also no caching when they don't match.
$lifetime = DAYSECS * 60;
}
// Anyone, including guests and non-logged in users, can view the logos.
$options = ['cacheability' => 'public'];
// Check if we've got a cached file to return. When lifetime is 0 then we don't want to cached one.
$candidate = $CFG->localcachedir . "/core_admin/$themerev/$filearea/{$maxwidth}x{$maxheight}/$filename";
if (file_exists($candidate) && $lifetime > 0) {
send_file($candidate, $filename, $lifetime, 0, false, false, '', false, $options);
}
// Find the original file.
$fs = get_file_storage();
$filepath = "/{$context->id}/core_admin/{$filearea}/0/{$filename}";
if (!$file = $fs->get_file_by_hash(sha1($filepath))) {
send_file_not_found();
}
// No need for resizing, but if the file should be cached we save it so we can serve it fast next time.
if (empty($maxwidth) && empty($maxheight)) {
if ($lifetime) {
file_safe_save_content($file->get_content(), $candidate);
}
send_stored_file($file, $lifetime, 0, false, $options);
}
// Proceed with the resizing.
$filedata = $file->resize_image($maxwidth, $maxheight);
if (!$filedata) {
send_file_not_found();
}
// If we don't want to cached the file, serve now and quit.
if (!$lifetime) {
send_content_uncached($filedata, $filename);
}
// Save, serve and quit.
file_safe_save_content($filedata, $candidate);
send_file($candidate, $filename, $lifetime, 0, false, false, '', false, $options);
}
send_file_not_found();
}
+2 -1
View File
@@ -23,7 +23,8 @@ require_once('../config.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->libdir.'/licenselib.php');
require_admin();
require_login();
require_capability('moodle/site:config', context_system::instance());
$returnurl = "$CFG->wwwroot/$CFG->admin/settings.php?section=managelicenses";
+1 -1
View File
@@ -27,7 +27,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(__DIR__ . '/../config.php');
require_once(dirname(dirname(__FILE__)) . '/config.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->libdir.'/tablelib.php');
-96
View File
@@ -1,96 +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 file is used to display a categories sub categories, external pages, and settings.
*
* @package admin
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once('../config.php');
require_once("{$CFG->libdir}/adminlib.php");
$contextid = required_param('id', PARAM_INT);
$confirm = optional_param('confirm', null, PARAM_INT);
$returnurl = optional_param('returnurl', null, PARAM_LOCALURL);
$PAGE->set_url('/admin/lock.php', ['id' => $contextid]);
list($context, $course, $cm) = get_context_info_array($contextid);
$parentcontext = $context->get_parent_context();
if ($parentcontext && !empty($parentcontext->locked)) {
// Can't make changes to a context whose parent is locked.
throw new \coding_exception('Not sure how you got here');
}
if ($course) {
$isfrontpage = ($course->id == SITEID);
} else {
$isfrontpage = false;
$course = $SITE;
}
require_login($course, false, $cm);
require_capability('moodle/site:managecontextlocks', $context);
$PAGE->set_pagelayout('admin');
$PAGE->navigation->clear_cache();
$a = (object) [
'contextname' => $context->get_context_name(),
];
if (null !== $confirm && confirm_sesskey()) {
$context->set_locked(!empty($confirm));
if ($context->locked) {
$lockmessage = get_string('managecontextlocklocked', 'admin', $a);
} else {
$lockmessage = get_string('managecontextlockunlocked', 'admin', $a);
}
if (empty($returnurl)) {
$returnurl = $context->get_url();
} else {
$returnurl = new moodle_url($returnurl);
}
redirect($returnurl, $lockmessage);
}
$heading = get_string('managecontextlock', 'admin');
$PAGE->set_title($heading);
$PAGE->set_heading($heading);
echo $OUTPUT->header();
if ($context->locked) {
$confirmstring = get_string('confirmcontextunlock', 'admin', $a);
$target = 0;
} else {
$confirmstring = get_string('confirmcontextlock', 'admin', $a);
$target = 1;
}
$confirmurl = new \moodle_url($PAGE->url, ['confirm' => $target]);
if (!empty($returnurl)) {
$confirmurl->param('returnurl', $returnurl);
}
echo $OUTPUT->confirm($confirmstring, $confirmurl, $context->get_url());
echo $OUTPUT->footer();
+1 -1
View File
@@ -29,7 +29,7 @@
*/
// Security check.
if (!file_exists(__DIR__.'/mailout-debugger.enable')) {
if (!file_exists(dirname(__FILE__).'/mailout-debugger.enable')) {
mdie("Disabled.");
}
$tmpdir=sys_get_temp_dir(); // default
-78
View File
@@ -1,78 +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/>.
/**
* Enrol config manipulation script.
*
* @package core
* @subpackage media
* @copyright 2016 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define('NO_OUTPUT_BUFFERING', true);
require_once('../config.php');
require_once($CFG->libdir.'/adminlib.php');
$action = required_param('action', PARAM_ALPHANUMEXT);
$media = required_param('media', PARAM_PLUGIN);
$confirm = optional_param('confirm', 0, PARAM_BOOL);
$PAGE->set_url('/admin/media.php');
$PAGE->set_context(context_system::instance());
require_admin();
require_sesskey();
$plugins = core_plugin_manager::instance()->get_plugins_of_type('media');
$sortorder = array_values(\core\plugininfo\media::get_enabled_plugins());
$return = new moodle_url('/admin/settings.php', array('section' => 'managemediaplayers'));
if (!array_key_exists($media, $plugins)) {
redirect($return);
}
switch ($action) {
case 'disable':
$plugins[$media]->set_enabled(false);
break;
case 'enable':
$plugins[$media]->set_enabled(true);
break;
case 'up':
if (($pos = array_search($media, $sortorder)) > 0) {
$tmp = $sortorder[$pos - 1];
$sortorder[$pos - 1] = $sortorder[$pos];
$sortorder[$pos] = $tmp;
\core\plugininfo\media::set_enabled_plugins($sortorder);
}
break;
case 'down':
if ((($pos = array_search($media, $sortorder)) !== false) && ($pos < count($sortorder) - 1)) {
$tmp = $sortorder[$pos + 1];
$sortorder[$pos + 1] = $sortorder[$pos];
$sortorder[$pos] = $tmp;
\core\plugininfo\media::set_enabled_plugins($sortorder);
}
break;
}
redirect($return);
+30 -101
View File
@@ -21,125 +21,54 @@
* @copyright 2011 Lancaster University Network Services Limited
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(__DIR__ . '/../config.php');
require_once(dirname(__FILE__) . '/../config.php');
require_once($CFG->dirroot . '/message/lib.php');
require_once($CFG->libdir.'/adminlib.php');
// This is an admin page.
// This is an admin page
admin_externalpage_setup('managemessageoutputs');
// Fetch processors.
$allprocessors = get_message_processors();
$processors = array_filter($allprocessors, function($processor) {
return $processor->enabled;
});
$disabledprocessors = array_filter($allprocessors, function($processor) {
return !$processor->enabled;
});
// Require site configuration capability
require_capability('moodle/site:config', context_system::instance());
// Fetch message providers.
$providers = get_message_providers();
// Fetch the manage message outputs interface.
$preferences = get_message_output_default_preferences();
// Get the submitted params
$disable = optional_param('disable', 0, PARAM_INT);
$enable = optional_param('enable', 0, PARAM_INT);
if (($form = data_submitted()) && confirm_sesskey()) {
$newpreferences = array();
// Prepare default message outputs settings.
foreach ($providers as $provider) {
$componentproviderbase = $provider->component.'_'.$provider->name;
$disableprovidersetting = $componentproviderbase.'_disable';
$providerdisabled = false;
if (!isset($form->$disableprovidersetting)) {
$providerdisabled = true;
$newpreferences[$disableprovidersetting] = 1;
} else {
$newpreferences[$disableprovidersetting] = 0;
}
$headingtitle = get_string('managemessageoutputs', 'message');
foreach (array('permitted', 'loggedin', 'loggedoff') as $setting) {
$value = null;
$componentprovidersetting = $componentproviderbase.'_'.$setting;
if ($setting == 'permitted') {
// If we deal with permitted select element, we need to create individual
// setting for each possible processor. Note that this block will
// always be processed first after entring parental foreach iteration
// so we can change form values on this stage.
foreach ($processors as $processor) {
$value = '';
if (isset($form->{$componentprovidersetting}[$processor->name])) {
$value = $form->{$componentprovidersetting}[$processor->name];
}
// Ensure that loggedin loggedoff options are set correctly for this permission.
if (($value == 'disallowed') || $providerdisabled) {
// It might be better to unset them, but I can't figure out why that cause error.
$form->{$componentproviderbase.'_loggedin'}[$processor->name] = 0;
$form->{$componentproviderbase.'_loggedoff'}[$processor->name] = 0;
} else if ($value == 'forced') {
$form->{$componentproviderbase.'_loggedin'}[$processor->name] = 1;
$form->{$componentproviderbase.'_loggedoff'}[$processor->name] = 1;
}
// Record the site preference.
$newpreferences[$processor->name.'_provider_'.$componentprovidersetting] = $value;
}
} else {
$newsettings = array();
if (property_exists($form, $componentprovidersetting)) {
// We must be processing loggedin or loggedoff checkboxes.
// Store defained comma-separated processors as setting value.
// Using array_filter eliminates elements set to 0 above.
$newsettings = array_keys(array_filter($form->{$componentprovidersetting}));
}
// Let's join existing setting values for disabled processors.
$property = 'message_provider_'.$componentprovidersetting;
if (property_exists($preferences, $property)) {
$existingsetting = $preferences->$property;
foreach ($disabledprocessors as $disable) {
if (strpos($existingsetting, $disable->name) > -1) {
$newsettings[] = $disable->name;
}
}
}
$value = join(',', $newsettings);
if (empty($value)) {
$value = null;
}
}
if ($setting != 'permitted') {
// We have already recoded site preferences for 'permitted' type.
$newpreferences['message_provider_'.$componentprovidersetting] = $value;
}
}
if (!empty($disable) && confirm_sesskey()) {
if (!$processor = $DB->get_record('message_processors', array('id'=>$disable))) {
print_error('outputdoesnotexist', 'message');
}
// Update database.
$transaction = $DB->start_delegated_transaction();
// Save processors enabled/disabled status.
foreach ($allprocessors as $processor) {
$enabled = isset($form->{$processor->name});
\core_message\api::update_processor_status($processor, $enabled);
}
foreach ($newpreferences as $name => $value) {
set_config($name, $value, 'message');
}
$transaction->allow_commit();
$DB->set_field('message_processors', 'enabled', '0', array('id'=>$processor->id)); // Disable output
core_plugin_manager::reset_caches();
}
if (!empty($enable) && confirm_sesskey()) {
if (!$processor = $DB->get_record('message_processors', array('id'=>$enable))) {
print_error('outputdoesnotexist', 'message');
}
$DB->set_field('message_processors', 'enabled', '1', array('id'=>$processor->id)); // Enable output
core_plugin_manager::reset_caches();
}
if ($disable || $enable) {
$url = new moodle_url('message.php');
redirect($url);
}
// Page settings
$PAGE->set_context(context_system::instance());
$PAGE->requires->js_init_call('M.core_message.init_defaultoutputs');
// Grab the renderer
$renderer = $PAGE->get_renderer('core', 'message');
// Display the page.
// Display the manage message outputs interface
$processors = get_message_processors();
$messageoutputs = $renderer->manage_messageoutputs($processors);
// Display the page
echo $OUTPUT->header();
echo $renderer->manage_messageoutput_settings($allprocessors, $processors, $providers, $preferences);
echo $OUTPUT->heading($headingtitle);
echo $messageoutputs;
echo $OUTPUT->footer();
+4 -2
View File
@@ -2,7 +2,7 @@
// Allows the admin to control user logins from remote moodles.
require_once(__DIR__ . '/../../config.php');
require_once dirname(dirname(dirname(__FILE__))) . '/config.php';
require_once($CFG->libdir.'/adminlib.php');
include_once($CFG->dirroot.'/mnet/lib.php');
@@ -12,6 +12,8 @@ $page = optional_param('page', 0, PARAM_INT);
$perpage = optional_param('perpage', 30, PARAM_INT);
$action = trim(strtolower(optional_param('action', '', PARAM_ALPHA)));
require_login();
admin_externalpage_setup('ssoaccesscontrol');
if (!extension_loaded('openssl')) {
@@ -148,7 +150,7 @@ foreach ($columns as $column) {
} else {
$columndir = $dir == "ASC" ? "DESC" : "ASC";
$columnicon = $dir == "ASC" ? "down" : "up";
$columnicon = " " . $OUTPUT->pix_icon('t/' . $columnicon, get_string('sort'));
$columnicon = " <img src=\"" . $OUTPUT->pix_url('t/' . $columnicon) . "\" alt=\"\" />";
}
$headings[$column] = "<a href=\"?sort=$column&amp;dir=$columndir&amp;\">".$string[$column]."</a>$columnicon";
}
+6 -1
View File
@@ -27,13 +27,18 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require(__DIR__.'/../../config.php');
require_once(dirname(dirname(dirname(__FILE__))) . '/config.php');
require_once($CFG->libdir . '/adminlib.php');
$step = optional_param('step', 'verify', PARAM_ALPHA);
$hostid = required_param('hostid', PARAM_INT);
require_login();
$context = context_system::instance();
require_capability('moodle/site:config', $context, $USER->id, true, "nopermissions");
$mnet = get_mnet_environment();
$PAGE->set_url('/admin/mnet/delete.php');
+3 -1
View File
@@ -2,14 +2,16 @@
// Allows the admin to configure mnet stuff
require(__DIR__.'/../../config.php');
require_once(dirname(dirname(dirname(__FILE__))) . '/config.php');
require_once($CFG->libdir.'/adminlib.php');
include_once($CFG->dirroot.'/mnet/lib.php');
require_login();
admin_externalpage_setup('net');
$context = context_system::instance();
require_capability('moodle/site:config', $context, $USER->id, true, "nopermissions");
$site = get_site();
$mnet = get_mnet_environment();
+5 -1
View File
@@ -27,11 +27,15 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require(__DIR__.'/../../config.php');
require_once(dirname(dirname(dirname(__FILE__))) . '/config.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->dirroot.'/mnet/lib.php');
require_once($CFG->dirroot.'/'.$CFG->admin.'/mnet/peer_forms.php');
require_login();
$context = context_system::instance();
require_capability('moodle/site:config', $context, $USER->id, true, 'nopermissions');
/// Initialize variables.
$hostid = optional_param('hostid', 0, PARAM_INT);
+5 -1
View File
@@ -24,15 +24,19 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require(__DIR__.'/../../config.php');
require(dirname(dirname(dirname(__FILE__))).'/config.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->dirroot . '/' . $CFG->admin .'/mnet/profilefields_form.php');
$mnet = get_mnet_environment();
require_login();
$hostid = required_param('hostid', PARAM_INT);
$mnet_peer = new mnet_peer();
$mnet_peer->set_id($hostid);
$context = context_system::instance();
require_capability('moodle/site:config', $context, $USER->id, true, 'nopermissions');
admin_externalpage_setup('mnetpeers');
$form = new mnet_profile_form(null, array('hostid' => $hostid));
+4 -1
View File
@@ -25,13 +25,16 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require(__DIR__.'/../../config.php');
require_once(dirname(dirname(dirname(__FILE__))) . '/config.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->dirroot . '/' . $CFG->admin . '/mnet/services_form.php');
$mnet = get_mnet_environment();
require_login();
admin_externalpage_setup('mnetpeers');
$context = context_system::instance();
require_capability('moodle/site:config', $context, $USER->id, true, "nopermissions");
$hostid = required_param('hostid', PARAM_INT);
+5 -1
View File
@@ -12,7 +12,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
* @package mnet
*/
require(__DIR__.'/../../config.php');
require_once(dirname(dirname(dirname(__FILE__))) . '/config.php');
require_once $CFG->dirroot.'/mnet/xmlrpc/client.php';
require_once($CFG->libdir.'/adminlib.php');
include_once($CFG->dirroot.'/mnet/lib.php');
@@ -21,8 +21,12 @@ if ($CFG->mnet_dispatcher_mode === 'off') {
print_error('mnetdisabled', 'mnet');
}
require_login();
admin_externalpage_setup('mnettestclient');
$context = context_system::instance();
require_capability('moodle/site:config', $context);
error_reporting(DEBUG_ALL);
echo $OUTPUT->header();
+5 -1
View File
@@ -1,12 +1,16 @@
<?php
// Allows the admin to configure services for remote hosts
require(__DIR__.'/../../config.php');
require_once(dirname(dirname(dirname(__FILE__))) . '/config.php');
require_once($CFG->libdir.'/adminlib.php');
include_once($CFG->dirroot.'/mnet/lib.php');
require_login();
admin_externalpage_setup('trustedhosts');
$context = context_system::instance();
require_capability('moodle/site:config', $context, $USER->id, true, "nopermissions");
if (!extension_loaded('openssl')) {
echo $OUTPUT->header();
+6 -12
View File
@@ -49,7 +49,6 @@
array($module->id));
core_plugin_manager::reset_caches();
admin_get_root(true, false); // settings not required - only pages
redirect(new moodle_url('/admin/modules.php'));
}
if (!empty($show) and confirm_sesskey()) {
@@ -67,7 +66,6 @@
array($module->id));
core_plugin_manager::reset_caches();
admin_get_root(true, false); // settings not required - only pages
redirect(new moodle_url('/admin/modules.php'));
}
echo $OUTPUT->header();
@@ -89,18 +87,14 @@
$table->set_attribute('class', 'admintable generaltable');
$table->setup();
$pluginmanager = core_plugin_manager::instance();
foreach ($modules as $module) {
$plugininfo = $pluginmanager->get_plugin_info('mod_'.$module->name);
$status = $plugininfo->get_status();
if ($status === core_plugin_manager::PLUGIN_STATUS_MISSING) {
if (!file_exists("$CFG->dirroot/mod/$module->name/lib.php")) {
$strmodulename = '<span class="notifyproblem">'.$module->name.' ('.get_string('missingfromdisk').')</span>';
$missing = true;
} else {
// took out hspace="\10\", because it does not validate. don't know what to replace with.
$icon = "<img src=\"" . $OUTPUT->image_url('icon', $module->name) . "\" class=\"icon\" alt=\"\" />";
$icon = "<img src=\"" . $OUTPUT->pix_url('icon', $module->name) . "\" class=\"icon\" alt=\"\" />";
$strmodulename = $icon.' '.get_string('modulename', $module->name);
$missing = false;
}
@@ -123,8 +117,8 @@
$count = -1;
}
if ($count>0) {
$countlink = $OUTPUT->action_link(new moodle_url('/course/search.php', ['modulelist' => $module->name]),
$count, null, ['title' => $strshowmodulecourse]);
$countlink = "<a href=\"{$CFG->wwwroot}/course/search.php?modulelist=$module->name" .
"&amp;sesskey=".sesskey()."\" title=\"$strshowmodulecourse\">$count</a>";
} else if ($count < 0) {
$countlink = get_string('error');
} else {
@@ -136,11 +130,11 @@
$class = '';
} else if ($module->visible) {
$visible = "<a href=\"modules.php?hide=$module->name&amp;sesskey=".sesskey()."\" title=\"$strhide\">".
$OUTPUT->pix_icon('t/hide', $strhide) . '</a>';
"<img src=\"" . $OUTPUT->pix_url('t/hide') . "\" class=\"iconsmall\" alt=\"$strhide\" /></a>";
$class = '';
} else {
$visible = "<a href=\"modules.php?show=$module->name&amp;sesskey=".sesskey()."\" title=\"$strshow\">".
$OUTPUT->pix_icon('t/show', $strshow) . '</a>';
"<img src=\"" . $OUTPUT->pix_url('t/show') . "\" class=\"iconsmall\" alt=\"$strshow\" /></a>";
$class = 'dimmed_text';
}
if ($module->name == "forum") {
+1 -12
View File
@@ -28,18 +28,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(__DIR__ . '/../config.php');
$error = optional_param('error', '', PARAM_RAW);
if ($error) {
$message = optional_param('error_description', '', PARAM_RAW);
if ($message) {
print_error($message);
} else {
print_error($error);
}
die();
}
require_once(dirname(dirname(__FILE__)).'/config.php');
// The authorization code generated by the authorization server.
$code = required_param('code', PARAM_RAW);
+1 -1
View File
@@ -8,7 +8,7 @@
echo $OUTPUT->header();
echo '<div class="phpinfo text-ltr">';
echo '<div class="phpinfo">';
ob_start();
phpinfo(INFO_GENERAL + INFO_CONFIGURATION + INFO_MODULES + INFO_VARIABLES);
+1 -1
View File
@@ -26,7 +26,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(__DIR__ . '/../config.php');
require_once(dirname(dirname(__FILE__)) . '/config.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->libdir.'/tablelib.php');
+4 -3
View File
@@ -24,7 +24,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(__DIR__ . '/../config.php');
require_once(dirname(dirname(__FILE__)) . '/config.php');
require_once($CFG->libdir . '/adminlib.php');
require_once($CFG->libdir . '/filelib.php');
@@ -43,8 +43,9 @@ $confirminstallupdate = optional_param('confirminstallupdate', false, PARAM_BOOL
// NOTE: do not use admin_externalpage_setup() here because it loads
// full admin tree which is not possible during uninstallation.
require_admin();
require_login();
$syscontext = context_system::instance();
require_capability('moodle/site:config', $syscontext);
// URL params we want to maintain on redirects.
$pageparams = array('updatesonly' => $updatesonly, 'contribonly' => $contribonly);
@@ -53,6 +54,7 @@ $pageurl = new moodle_url('/admin/plugins.php', $pageparams);
$pluginman = core_plugin_manager::instance();
if ($uninstall) {
require_sesskey();
if (!$confirmed) {
admin_externalpage_setup('pluginsoverview', '', $pageparams);
@@ -91,7 +93,6 @@ if ($uninstall) {
exit();
} else {
require_sesskey();
$SESSION->pluginuninstallreturn = $pluginfo->get_return_url_after_uninstall($return);
$progress = new progress_trace_buffer(new text_progress_trace(), false);
$pluginman->uninstall_plugin($pluginfo->component, $progress);
+3 -1
View File
@@ -1,6 +1,6 @@
<?php
require_once(__DIR__ . '/../config.php');
require_once(dirname(dirname(__FILE__)) . '/config.php');
require_once($CFG->libdir . '/portfoliolib.php');
require_once($CFG->libdir . '/portfolio/forms.php');
require_once($CFG->libdir . '/adminlib.php');
@@ -35,6 +35,8 @@ if ($action == 'newon') {
admin_externalpage_setup($pagename);
require_capability('moodle/site:config', context_system::instance());
$baseurl = "$CFG->wwwroot/$CFG->admin/portfolio.php";
$sesskeyurl = "$CFG->wwwroot/$CFG->admin/portfolio.php?sesskey=" . sesskey();
$configstr = get_string('manageportfolios', 'portfolio');
+1 -1
View File
@@ -3,7 +3,7 @@
//error_reporting(0);
//ini_set('display_errors',0);
require_once(__DIR__ . '/../config.php');
require_once(dirname(dirname(__FILE__)).'/config.php');
$tmp = explode('@',$_ENV['RECIPIENT']);
$address = $tmp[0];
+16 -22
View File
@@ -27,43 +27,37 @@ require_once('../config.php');
require_once($CFG->libdir.'/adminlib.php');
$confirm = optional_param('confirm', 0, PARAM_BOOL);
$returnurl = optional_param('returnurl', '/admin/purgecaches.php', PARAM_LOCALURL);
$returnurl = new moodle_url($returnurl);
admin_externalpage_setup('purgecaches');
$form = new core_admin\form\purge_caches(null, ['returnurl' => $returnurl]);
$returnurl = optional_param('returnurl', null, PARAM_LOCALURL);
// If we have got here as a confirmed aciton, do it.
if ($data = $form->get_data()) {
if ($confirm && isloggedin() && confirm_sesskey()) {
require_capability('moodle/site:config', context_system::instance());
// Valid request. Purge, and redirect the user back to where they came from.
$selected = $data->purgeselectedoptions;
purge_caches($selected);
purge_all_caches();
if (isset($data->all)) {
$message = get_string('purgecachesfinished', 'admin');
if ($returnurl) {
$returnurl = $CFG->wwwroot . $returnurl;
} else {
$message = get_string('purgeselectedcachesfinished', 'admin');
$returnurl = new moodle_url('/admin/purgecaches.php');
}
} else if ($confirm && confirm_sesskey()) {
purge_caches();
$message = get_string('purgecachesfinished', 'admin');
redirect($returnurl, get_string('purgecachesfinished', 'admin'));
}
if (isset($message)) {
redirect($returnurl, $message);
}
// Otherwise, show a button to actually purge the caches.
admin_externalpage_setup('purgecaches');
// Otherwise, show a form to actually purge the caches.
$actionurl = new moodle_url('/admin/purgecaches.php', array('sesskey'=>sesskey(), 'confirm'=>1));
if ($returnurl) {
$actionurl->param('returnurl', $returnurl);
}
echo $OUTPUT->header();
echo $OUTPUT->heading(get_string('purgecachespage', 'admin'));
echo $OUTPUT->heading(get_string('purgecaches', 'admin'));
echo $OUTPUT->box_start('generalbox', 'notice');
echo html_writer::tag('p', get_string('purgecachesconfirm', 'admin'));
echo $form->render();
echo $OUTPUT->single_button($actionurl, get_string('purgecaches', 'admin'), 'post');
echo $OUTPUT->box_end();
echo $OUTPUT->footer();
+2 -2
View File
@@ -25,13 +25,13 @@
*/
require_once(__DIR__ . '/../config.php');
require_once(dirname(__FILE__) . '/../config.php');
require_once($CFG->libdir . '/questionlib.php');
require_once($CFG->libdir . '/adminlib.php');
require_once($CFG->libdir . '/tablelib.php');
// Check permissions.
require_login(null, false);
require_login();
$systemcontext = context_system::instance();
require_capability('moodle/question:config', $systemcontext);
+4 -3
View File
@@ -25,17 +25,18 @@
*/
require_once(__DIR__ . '/../config.php');
require_once(dirname(__FILE__) . '/../config.php');
require_once($CFG->libdir . '/questionlib.php');
require_once($CFG->libdir . '/adminlib.php');
require_once($CFG->libdir . '/tablelib.php');
admin_externalpage_setup('manageqtypes');
// Check permissions.
require_login();
$systemcontext = context_system::instance();
require_capability('moodle/question:config', $systemcontext);
$canviewreports = has_capability('report/questioninstances:view', $systemcontext);
admin_externalpage_setup('manageqtypes');
$thispageurl = new moodle_url('/admin/qtypes.php');
$qtypes = question_bank::get_all_qtypes();
+32 -27
View File
@@ -20,7 +20,7 @@
// //
///////////////////////////////////////////////////////////////////////////
/**
/*
* @package moodle
* @subpackage registration
* @author Jerome Mouneyrac <jerome@mouneyrac.com>
@@ -36,6 +36,7 @@
require('../../config.php');
require_once($CFG->libdir . '/adminlib.php');
require_once($CFG->dirroot . '/' . $CFG->admin . '/registration/lib.php');
$newtoken = optional_param('newtoken', '', PARAM_ALPHANUM);
$url = optional_param('url', '', PARAM_URL);
@@ -43,19 +44,7 @@ $hubname = optional_param('hubname', '', PARAM_TEXT);
$token = optional_param('token', '', PARAM_TEXT);
$error = optional_param('error', '', PARAM_ALPHANUM);
admin_externalpage_setup('registrationmoodleorg');
if (parse_url($url, PHP_URL_HOST) !== parse_url(HUB_MOODLEORGHUBURL, PHP_URL_HOST)) {
// Allow other plugins to confirm registration on custom hubs. Plugins implementing this
// callback need to redirect or exit. See https://docs.moodle.org/en/Hub_registration .
$callbacks = get_plugins_with_function('hub_registration');
foreach ($callbacks as $plugintype => $plugins) {
foreach ($plugins as $plugin => $callback) {
$callback('confirm');
}
}
throw new moodle_exception('errorotherhubsnotsupported', 'hub');
}
admin_externalpage_setup('registrationhubs');
if (!empty($error) and $error == 'urlalreadyexist') {
throw new moodle_exception('urlalreadyregistered', 'hub',
@@ -63,22 +52,38 @@ if (!empty($error) and $error == 'urlalreadyexist') {
}
//check that we are waiting a confirmation from this hub, and check that the token is correct
core\hub\registration::confirm_registration($token, $newtoken, $hubname);
$registrationmanager = new registration_manager();
$registeredhub = $registrationmanager->get_unconfirmedhub($url);
if (!empty($registeredhub) and $registeredhub->token == $token) {
echo $OUTPUT->header();
echo $OUTPUT->heading(get_string('registrationconfirmed', 'hub'), 3, 'main');
echo $OUTPUT->header();
echo $OUTPUT->heading(get_string('registrationconfirmed', 'hub'), 3, 'main');
// Display notification message.
echo $OUTPUT->notification(get_string('registrationconfirmedon', 'hub'), 'notifysuccess');
$registeredhub->token = $newtoken;
$registeredhub->confirmed = 1;
$registeredhub->hubname = $hubname;
$registrationmanager->update_registeredhub($registeredhub);
// Display continue button.
$returnurl = !empty($SESSION->registrationredirect) ? clean_param($SESSION->registrationredirect, PARAM_LOCALURL) : null;
unset($SESSION->registrationredirect);
$continueurl = new moodle_url($returnurl ?: '/admin/registration/index.php');
$continuebutton = $OUTPUT->render(new single_button($continueurl, get_string('continue')));
$continuebutton = html_writer::tag('div', $continuebutton, array('class' => 'mdl-align'));
echo $continuebutton;
// Display notification message.
echo $OUTPUT->notification(get_string('registrationconfirmedon', 'hub'), 'notifysuccess');
echo $OUTPUT->footer();
//display continue button
$registrationpage = new moodle_url('/admin/registration/index.php');
$continuebutton = $OUTPUT->render(new single_button($registrationpage, get_string('continue', 'hub')));
$continuebutton = html_writer::tag('div', $continuebutton, array('class' => 'mdl-align'));
echo $continuebutton;
if (!extension_loaded('xmlrpc')) {
//display notice about xmlrpc
$xmlrpcnotification = $OUTPUT->doc_link('admin/environment/php_extension/xmlrpc', '');
$xmlrpcnotification .= get_string('xmlrpcdisabledregistration', 'hub');
echo $OUTPUT->notification($xmlrpcnotification);
}
echo $OUTPUT->footer();
} else {
throw new moodle_exception('wrongtoken', 'hub',
$CFG->wwwroot . '/' . $CFG->admin . '/registration/index.php');
}
+478 -3
View File
@@ -20,7 +20,7 @@
// //
///////////////////////////////////////////////////////////////////////////
/**
/*
* @package moodle
* @subpackage registration
* @author Jerome Mouneyrac <jerome@mouneyrac.com>
@@ -30,6 +30,481 @@
* The forms needed by registration pages.
*/
defined('MOODLE_INTERNAL') || die();
debugging('Support for alternative hubs has been removed from Moodle in 3.4.', DEBUG_DEVELOPER);
require_once($CFG->libdir . '/formslib.php');
require_once($CFG->dirroot . '/' . $CFG->admin . '/registration/lib.php');
/**
* This form display a unregistration form.
*/
class site_unregistration_form extends moodleform {
public function definition() {
$mform = & $this->_form;
$mform->addElement('header', 'site', get_string('unregister', 'hub'));
$huburl = $this->_customdata['huburl'];
$hubname = $this->_customdata['hubname'];
$unregisterlabel = get_string('unregister', 'hub');
$mform->addElement('checkbox', 'unpublishalladvertisedcourses', '',
' ' . get_string('unpublishalladvertisedcourses', 'hub'));
$mform->setType('unpublishalladvertisedcourses', PARAM_INT);
$mform->addElement('checkbox', 'unpublishalluploadedcourses', '',
' ' . get_string('unpublishalluploadedcourses', 'hub'));
$mform->setType('unpublishalluploadedcourses', PARAM_INT);
$mform->addElement('hidden', 'confirm', 1);
$mform->setType('confirm', PARAM_INT);
$mform->addElement('hidden', 'unregistration', 1);
$mform->setType('unregistration', PARAM_INT);
$mform->addElement('hidden', 'huburl', $huburl);
$mform->setType('huburl', PARAM_URL);
$mform->addElement('hidden', 'hubname', $hubname);
$mform->setType('hubname', PARAM_TEXT);
$this->add_action_buttons(true, $unregisterlabel);
}
}
/**
* This form display a clean registration data form.
*/
class site_clean_registration_data_form extends moodleform {
public function definition() {
$mform = & $this->_form;
$mform->addElement('header', 'site', get_string('unregister', 'hub'));
$huburl = $this->_customdata['huburl'];
$hubname = $this->_customdata['hubname'];
$unregisterlabel = get_string('forceunregister', 'hub');
$mform->addElement('static', '', get_string('warning', 'hub'), get_string('forceunregisterconfirmation', 'hub', $hubname));
$mform->addElement('hidden', 'confirm', 1);
$mform->setType('confirm', PARAM_INT);
$mform->addElement('hidden', 'unregistration', 1);
$mform->setType('unregistration', PARAM_INT);
$mform->addElement('hidden', 'cleanregdata', 1);
$mform->setType('cleanregdata', PARAM_INT);
$mform->addElement('hidden', 'huburl', $huburl);
$mform->setType('huburl', PARAM_URL);
$mform->addElement('hidden', 'hubname', $hubname);
$mform->setType('hubname', PARAM_TEXT);
$this->add_action_buttons(true, $unregisterlabel);
}
}
/**
* This form display a hub selector.
* The hub list is retrieved from Moodle.org hub directory.
* Also displayed, a text field to enter private hub url + its password
*/
class hub_selector_form extends moodleform {
public function definition() {
global $CFG, $OUTPUT;
$mform = & $this->_form;
$mform->addElement('header', 'site', get_string('selecthub', 'hub'));
//retrieve the hub list on the hub directory by web service
$function = 'hubdirectory_get_hubs';
$params = array();
$serverurl = HUB_HUBDIRECTORYURL . "/local/hubdirectory/webservice/webservices.php";
require_once($CFG->dirroot . "/webservice/xmlrpc/lib.php");
$xmlrpcclient = new webservice_xmlrpc_client($serverurl, 'publichubdirectory');
try {
$hubs = $xmlrpcclient->call($function, $params);
} catch (Exception $e) {
$error = $OUTPUT->notification(get_string('errorhublisting', 'hub', $e->getMessage()));
$mform->addElement('static', 'errorhub', '', $error);
$hubs = array();
}
//remove moodle.org from the hub list
foreach ($hubs as $key => $hub) {
if ($hub['url'] == HUB_MOODLEORGHUBURL) {
unset($hubs[$key]);
}
}
//Public hub list
$options = array();
foreach ($hubs as $hub) {
//to not display a name longer than 100 character (too big)
if (core_text::strlen($hub['name']) > 100) {
$hubname = core_text::substr($hub['name'], 0, 100);
$hubname = $hubname . "...";
} else {
$hubname = $hub['name'];
}
$options[$hub['url']] = $hubname;
$mform->addElement('hidden', clean_param($hub['url'], PARAM_ALPHANUMEXT), $hubname);
$mform->setType(clean_param($hub['url'], PARAM_ALPHANUMEXT), PARAM_ALPHANUMEXT);
}
if (!empty($hubs)) {
$mform->addElement('select', 'publichub', get_string('publichub', 'hub'),
$options, array("size" => 15));
$mform->setType('publichub', PARAM_URL);
}
$mform->addElement('static', 'or', '', get_string('orenterprivatehub', 'hub'));
//Private hub
$mform->addElement('text', 'unlistedurl', get_string('privatehuburl', 'hub'),
array('class' => 'registration_textfield'));
$mform->setType('unlistedurl', PARAM_URL);
$mform->addElement('text', 'password', get_string('password'),
array('class' => 'registration_textfield'));
$mform->setType('password', PARAM_RAW);
$this->add_action_buttons(false, get_string('selecthub', 'hub'));
}
/**
* Check the unlisted URL is a URL
*/
function validation($data, $files) {
global $CFG;
$errors = parent::validation($data, $files);
$unlistedurl = $this->_form->_submitValues['unlistedurl'];
if (empty($unlistedurl)) {
$errors['unlistedurl'] = get_string('badurlformat', 'hub');
}
return $errors;
}
}
/**
* The site registration form. Information will be sent to a given hub.
*/
class site_registration_form extends moodleform {
public function definition() {
global $CFG, $DB;
$strrequired = get_string('required');
$mform = & $this->_form;
$huburl = $this->_customdata['huburl'];
$hubname = $this->_customdata['hubname'];
$password = $this->_customdata['password'];
$admin = get_admin();
$site = get_site();
//retrieve config for this hub and set default if they don't exist
$cleanhuburl = clean_param($huburl, PARAM_ALPHANUMEXT);
$sitename = get_config('hub', 'site_name_' . $cleanhuburl);
if ($sitename === false) {
$sitename = format_string($site->fullname, true, array('context' => context_course::instance(SITEID)));
}
$sitedescription = get_config('hub', 'site_description_' . $cleanhuburl);
if ($sitedescription === false) {
$sitedescription = $site->summary;
}
$contactname = get_config('hub', 'site_contactname_' . $cleanhuburl);
if ($contactname === false) {
$contactname = fullname($admin, true);
}
$contactemail = get_config('hub', 'site_contactemail_' . $cleanhuburl);
if ($contactemail === false) {
$contactemail = $admin->email;
}
$contactphone = get_config('hub', 'site_contactphone_' . $cleanhuburl);
if ($contactphone === false) {
$contactphone = $admin->phone1;
}
$imageurl = get_config('hub', 'site_imageurl_' . $cleanhuburl);
$privacy = get_config('hub', 'site_privacy_' . $cleanhuburl);
$address = get_config('hub', 'site_address_' . $cleanhuburl);
$region = get_config('hub', 'site_region_' . $cleanhuburl);
$country = get_config('hub', 'site_country_' . $cleanhuburl);
if ($country === false) {
$country = $admin->country;
}
$language = get_config('hub', 'site_language_' . $cleanhuburl);
if ($language === false) {
$language = current_language();
}
$geolocation = get_config('hub', 'site_geolocation_' . $cleanhuburl);
$contactable = get_config('hub', 'site_contactable_' . $cleanhuburl);
$emailalert = get_config('hub', 'site_emailalert_' . $cleanhuburl);
$emailalert = ($emailalert === 0) ? 0 : 1;
$coursesnumber = get_config('hub', 'site_coursesnumber_' . $cleanhuburl);
$usersnumber = get_config('hub', 'site_usersnumber_' . $cleanhuburl);
$roleassignmentsnumber = get_config('hub', 'site_roleassignmentsnumber_' . $cleanhuburl);
$postsnumber = get_config('hub', 'site_postsnumber_' . $cleanhuburl);
$questionsnumber = get_config('hub', 'site_questionsnumber_' . $cleanhuburl);
$resourcesnumber = get_config('hub', 'site_resourcesnumber_' . $cleanhuburl);
$badgesnumber = get_config('hub', 'site_badges_' . $cleanhuburl);
$issuedbadgesnumber = get_config('hub', 'site_issuedbadges_' . $cleanhuburl);
$mediancoursesize = get_config('hub', 'site_mediancoursesize_' . $cleanhuburl);
$participantnumberaveragecfg = get_config('hub', 'site_participantnumberaverage_' . $cleanhuburl);
$modulenumberaveragecfg = get_config('hub', 'site_modulenumberaverage_' . $cleanhuburl);
//hidden parameters
$mform->addElement('hidden', 'huburl', $huburl);
$mform->setType('huburl', PARAM_URL);
$mform->addElement('hidden', 'hubname', $hubname);
$mform->setType('hubname', PARAM_TEXT);
$mform->addElement('hidden', 'password', $password);
$mform->setType('password', PARAM_RAW);
//the input parameters
$mform->addElement('header', 'moodle', get_string('registrationinfo', 'hub'));
$mform->addElement('text', 'name', get_string('sitename', 'hub'),
array('class' => 'registration_textfield'));
$mform->addRule('name', $strrequired, 'required', null, 'client');
$mform->setType('name', PARAM_TEXT);
$mform->setDefault('name', $sitename);
$mform->addHelpButton('name', 'sitename', 'hub');
$options = array();
$registrationmanager = new registration_manager();
$options[HUB_SITENOTPUBLISHED] = $registrationmanager->get_site_privacy_string(HUB_SITENOTPUBLISHED);
$options[HUB_SITENAMEPUBLISHED] = $registrationmanager->get_site_privacy_string(HUB_SITENAMEPUBLISHED);
$options[HUB_SITELINKPUBLISHED] = $registrationmanager->get_site_privacy_string(HUB_SITELINKPUBLISHED);
$mform->addElement('select', 'privacy', get_string('siteprivacy', 'hub'), $options);
$mform->setDefault('privacy', $privacy);
$mform->setType('privacy', PARAM_ALPHA);
$mform->addHelpButton('privacy', 'privacy', 'hub');
unset($options);
$mform->addElement('textarea', 'description', get_string('sitedesc', 'hub'),
array('rows' => 8, 'cols' => 41));
$mform->addRule('description', $strrequired, 'required', null, 'client');
$mform->setDefault('description', $sitedescription);
$mform->setType('description', PARAM_TEXT);
$mform->addHelpButton('description', 'sitedesc', 'hub');
$languages = get_string_manager()->get_list_of_languages();
core_collator::asort($languages);
$mform->addElement('select', 'language', get_string('sitelang', 'hub'),
$languages);
$mform->setType('language', PARAM_ALPHANUMEXT);
$mform->addHelpButton('language', 'sitelang', 'hub');
$mform->setDefault('language', $language);
$mform->addElement('textarea', 'address', get_string('postaladdress', 'hub'),
array('rows' => 4, 'cols' => 41));
$mform->setType('address', PARAM_TEXT);
$mform->setDefault('address', $address);
$mform->addHelpButton('address', 'postaladdress', 'hub');
//TODO: use the region array I generated
// $mform->addElement('select', 'region', get_string('selectaregion'), array('-' => '-'));
// $mform->setDefault('region', $region);
$mform->addElement('hidden', 'regioncode', '-');
$mform->setType('regioncode', PARAM_ALPHANUMEXT);
$countries = get_string_manager()->get_list_of_countries();
$mform->addElement('select', 'countrycode', get_string('sitecountry', 'hub'), $countries);
$mform->setDefault('countrycode', $country);
$mform->setType('countrycode', PARAM_ALPHANUMEXT);
$mform->addHelpButton('countrycode', 'sitecountry', 'hub');
$mform->addElement('text', 'geolocation', get_string('sitegeolocation', 'hub'),
array('class' => 'registration_textfield'));
$mform->setDefault('geolocation', $geolocation);
$mform->setType('geolocation', PARAM_RAW);
$mform->addHelpButton('geolocation', 'sitegeolocation', 'hub');
$mform->addElement('text', 'contactname', get_string('siteadmin', 'hub'),
array('class' => 'registration_textfield'));
$mform->addRule('contactname', $strrequired, 'required', null, 'client');
$mform->setType('contactname', PARAM_TEXT);
$mform->setDefault('contactname', $contactname);
$mform->addHelpButton('contactname', 'siteadmin', 'hub');
$mform->addElement('text', 'contactphone', get_string('sitephone', 'hub'),
array('class' => 'registration_textfield'));
$mform->setType('contactphone', PARAM_TEXT);
$mform->addHelpButton('contactphone', 'sitephone', 'hub');
$mform->addElement('text', 'contactemail', get_string('siteemail', 'hub'),
array('class' => 'registration_textfield'));
$mform->addRule('contactemail', $strrequired, 'required', null, 'client');
$mform->setType('contactemail', PARAM_EMAIL);
$mform->setDefault('contactemail', $contactemail);
$mform->addHelpButton('contactemail', 'siteemail', 'hub');
$options = array();
$options[0] = get_string("registrationcontactno");
$options[1] = get_string("registrationcontactyes");
$mform->addElement('select', 'contactable', get_string('siteregistrationcontact', 'hub'), $options);
$mform->setDefault('contactable', $contactable);
$mform->setType('contactable', PARAM_INT);
$mform->addHelpButton('contactable', 'siteregistrationcontact', 'hub');
unset($options);
$options = array();
$options[0] = get_string("registrationno");
$options[1] = get_string("registrationyes");
$mform->addElement('select', 'emailalert', get_string('siteregistrationemail', 'hub'), $options);
$mform->setDefault('emailalert', $emailalert);
$mform->setType('emailalert', PARAM_INT);
$mform->addHelpButton('emailalert', 'siteregistrationemail', 'hub');
unset($options);
//TODO site logo
$mform->addElement('hidden', 'imageurl', ''); //TODO: temporary
$mform->setType('imageurl', PARAM_URL);
$mform->addElement('static', 'urlstring', get_string('siteurl', 'hub'), $CFG->wwwroot);
$mform->addHelpButton('urlstring', 'siteurl', 'hub');
$mform->addElement('static', 'versionstring', get_string('siteversion', 'hub'), $CFG->version);
$mform->addElement('hidden', 'moodleversion', $CFG->version);
$mform->setType('moodleversion', PARAM_INT);
$mform->addHelpButton('versionstring', 'siteversion', 'hub');
$mform->addElement('static', 'releasestring', get_string('siterelease', 'hub'), $CFG->release);
$mform->addElement('hidden', 'moodlerelease', $CFG->release);
$mform->setType('moodlerelease', PARAM_TEXT);
$mform->addHelpButton('releasestring', 'siterelease', 'hub');
/// Display statistic that are going to be retrieve by the hub
$coursecount = $DB->count_records('course') - 1;
$usercount = $DB->count_records('user', array('deleted' => 0));
$roleassigncount = $DB->count_records('role_assignments');
$postcount = $DB->count_records('forum_posts');
$questioncount = $DB->count_records('question');
$resourcecount = $DB->count_records('resource');
require_once($CFG->dirroot . "/course/lib.php");
$participantnumberaverage = number_format(average_number_of_participants(), 2);
$modulenumberaverage = number_format(average_number_of_courses_modules(), 2);
require_once($CFG->libdir . '/badgeslib.php');
$badges = $DB->count_records_select('badge', 'status <> ' . BADGE_STATUS_ARCHIVED);
$issuedbadges = $DB->count_records('badge_issued');
if (HUB_MOODLEORGHUBURL != $huburl) {
$mform->addElement('checkbox', 'courses', get_string('sendfollowinginfo', 'hub'),
" " . get_string('coursesnumber', 'hub', $coursecount));
$mform->setDefault('courses', $coursesnumber != -1);
$mform->setType('courses', PARAM_INT);
$mform->addHelpButton('courses', 'sendfollowinginfo', 'hub');
$mform->addElement('checkbox', 'users', '',
" " . get_string('usersnumber', 'hub', $usercount));
$mform->setDefault('users', $usersnumber != -1);
$mform->setType('users', PARAM_INT);
$mform->addElement('checkbox', 'roleassignments', '',
" " . get_string('roleassignmentsnumber', 'hub', $roleassigncount));
$mform->setDefault('roleassignments', $roleassignmentsnumber != -1);
$mform->setType('roleassignments', PARAM_INT);
$mform->addElement('checkbox', 'posts', '',
" " . get_string('postsnumber', 'hub', $postcount));
$mform->setDefault('posts', $postsnumber != -1);
$mform->setType('posts', PARAM_INT);
$mform->addElement('checkbox', 'questions', '',
" " . get_string('questionsnumber', 'hub', $questioncount));
$mform->setDefault('questions', $questionsnumber != -1);
$mform->setType('questions', PARAM_INT);
$mform->addElement('checkbox', 'resources', '',
" " . get_string('resourcesnumber', 'hub', $resourcecount));
$mform->setDefault('resources', $resourcesnumber != -1);
$mform->setType('resources', PARAM_INT);
$mform->addElement('checkbox', 'badges', '',
" " . get_string('badgesnumber', 'hub', $badges));
$mform->setDefault('badges', $badgesnumber != -1);
$mform->setType('resources', PARAM_INT);
$mform->addElement('checkbox', 'issuedbadges', '',
" " . get_string('issuedbadgesnumber', 'hub', $issuedbadges));
$mform->setDefault('issuedbadges', $issuedbadgesnumber != -1);
$mform->setType('resources', PARAM_INT);
$mform->addElement('checkbox', 'participantnumberaverage', '',
" " . get_string('participantnumberaverage', 'hub', $participantnumberaverage));
$mform->setDefault('participantnumberaverage', $participantnumberaveragecfg != -1);
$mform->setType('participantnumberaverage', PARAM_FLOAT);
$mform->addElement('checkbox', 'modulenumberaverage', '',
" " . get_string('modulenumberaverage', 'hub', $modulenumberaverage));
$mform->setDefault('modulenumberaverage', $modulenumberaveragecfg != -1);
$mform->setType('modulenumberaverage', PARAM_FLOAT);
} else {
$mform->addElement('static', 'courseslabel', get_string('sendfollowinginfo', 'hub'),
" " . get_string('coursesnumber', 'hub', $coursecount));
$mform->addElement('hidden', 'courses', 1);
$mform->setType('courses', PARAM_INT);
$mform->addHelpButton('courseslabel', 'sendfollowinginfo', 'hub');
$mform->addElement('static', 'userslabel', '',
" " . get_string('usersnumber', 'hub', $usercount));
$mform->addElement('hidden', 'users', 1);
$mform->setType('users', PARAM_INT);
$mform->addElement('static', 'roleassignmentslabel', '',
" " . get_string('roleassignmentsnumber', 'hub', $roleassigncount));
$mform->addElement('hidden', 'roleassignments', 1);
$mform->setType('roleassignments', PARAM_INT);
$mform->addElement('static', 'postslabel', '',
" " . get_string('postsnumber', 'hub', $postcount));
$mform->addElement('hidden', 'posts', 1);
$mform->setType('posts', PARAM_INT);
$mform->addElement('static', 'questionslabel', '',
" " . get_string('questionsnumber', 'hub', $questioncount));
$mform->addElement('hidden', 'questions', 1);
$mform->setType('questions', PARAM_INT);
$mform->addElement('static', 'resourceslabel', '',
" " . get_string('resourcesnumber', 'hub', $resourcecount));
$mform->addElement('hidden', 'resources', 1);
$mform->setType('resources', PARAM_INT);
$mform->addElement('static', 'badgeslabel', '',
" " . get_string('badgesnumber', 'hub', $badges));
$mform->addElement('hidden', 'badges', 1);
$mform->setType('badges', PARAM_INT);
$mform->addElement('static', 'issuedbadgeslabel', '',
" " . get_string('issuedbadgesnumber', 'hub', $issuedbadges));
$mform->addElement('hidden', 'issuedbadges', true);
$mform->setType('issuedbadges', PARAM_INT);
$mform->addElement('static', 'participantnumberaveragelabel', '',
" " . get_string('participantnumberaverage', 'hub', $participantnumberaverage));
$mform->addElement('hidden', 'participantnumberaverage', 1);
$mform->setType('participantnumberaverage', PARAM_FLOAT);
$mform->addElement('static', 'modulenumberaveragelabel', '',
" " . get_string('modulenumberaverage', 'hub', $modulenumberaverage));
$mform->addElement('hidden', 'modulenumberaverage', 1);
$mform->setType('modulenumberaverage', PARAM_FLOAT);
}
//check if it's a first registration or update
$hubregistered = $registrationmanager->get_registeredhub($huburl);
if (!empty($hubregistered)) {
$buttonlabel = get_string('updatesite', 'hub',
!empty($hubname) ? $hubname : $huburl);
$mform->addElement('hidden', 'update', true);
$mform->setType('update', PARAM_BOOL);
} else {
$buttonlabel = get_string('registersite', 'hub',
!empty($hubname) ? $hubname : $huburl);
}
$this->add_action_buttons(false, $buttonlabel);
}
}
+171 -86
View File
@@ -15,114 +15,199 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
/*
* @package moodle
* @subpackage registration
* @author Jerome Mouneyrac <jerome@mouneyrac.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This page displays the site registration form.
* It handles redirection to the hub to continue the registration workflow process.
* It also handles update operation by web service.
* On this page the administrator selects which hub he wants to register (except for moodle.net)
* Admins can register with moodle.net via the site admin menu "Registration" link.
* On this page the administrator can also unregister from any hubs including moodle.net.
*/
require_once('../../config.php');
require('../../config.php');
require_once($CFG->libdir . '/adminlib.php');
require_once($CFG->dirroot . '/' . $CFG->admin . '/registration/lib.php');
require_once($CFG->dirroot . '/' . $CFG->admin . '/registration/forms.php');
require_once($CFG->dirroot . '/course/publish/lib.php');
require_once($CFG->dirroot . "/webservice/xmlrpc/lib.php");
admin_externalpage_setup('registrationmoodleorg');
admin_externalpage_setup('registrationhubs');
$unregistration = optional_param('unregistration', false, PARAM_BOOL);
$confirm = optional_param('confirm', false, PARAM_BOOL);
$renderer = $PAGE->get_renderer('core', 'register');
if ($unregistration && \core\hub\registration::is_registered()) {
if ($confirm) {
require_sesskey();
\core\hub\registration::unregister(false, false);
$unregistration = optional_param('unregistration', 0, PARAM_INT);
$cleanregdata = optional_param('cleanregdata', 0, PARAM_BOOL);
$confirm = optional_param('confirm', 0, PARAM_INT);
$huburl = optional_param('huburl', '', PARAM_URL);
$cancel = optional_param('cancel', null, PARAM_ALPHA);
if (!\core\hub\registration::is_registered()) {
redirect(new moodle_url('/admin/registration/index.php'));
$registrationmanager = new registration_manager();
$publicationmanager = new course_publish_manager();
$errormessage = '';
if (empty($cancel) and $unregistration and $confirm and confirm_sesskey()) {
$hub = $registrationmanager->get_registeredhub($huburl);
//unpublish course and unregister the site by web service
if (!$cleanregdata) {
//check if we need to unpublish courses
//enrollable courses
$unpublishalladvertisedcourses = optional_param('unpublishalladvertisedcourses', 0, PARAM_INT);
$hubcourseids = array();
if ($unpublishalladvertisedcourses) {
$enrollablecourses = $publicationmanager->get_publications($huburl, null, 1);
if (!empty($enrollablecourses)) {
foreach ($enrollablecourses as $enrollablecourse) {
$hubcourseids[] = $enrollablecourse->hubcourseid;
}
}
}
//downloadable courses
$unpublishalluploadedcourses = optional_param('unpublishalluploadedcourses', 0, PARAM_INT);
if ($unpublishalluploadedcourses) {
$downloadablecourses = $publicationmanager->get_publications($huburl, null, 0);
if (!empty($downloadablecourses)) {
foreach ($downloadablecourses as $downloadablecourse) {
$hubcourseids[] = $downloadablecourse->hubcourseid;
}
}
}
//unpublish the courses by web service
if (!empty($hubcourseids)) {
$function = 'hub_unregister_courses';
$params = array('courseids' => $hubcourseids);
$serverurl = $huburl . "/local/hub/webservice/webservices.php";
$xmlrpcclient = new webservice_xmlrpc_client($serverurl, $hub->token);
try {
$result = $xmlrpcclient->call($function, $params);
//delete the published courses
if (!empty($enrollablecourses)) {
$publicationmanager->delete_hub_publications($huburl, 1);
}
if (!empty($downloadablecourses)) {
$publicationmanager->delete_hub_publications($huburl, 0);
}
} catch (Exception $e) {
$errormessage = $e->getMessage();
$errormessage .= html_writer::empty_tag('br') .
get_string('errorunpublishcourses', 'hub');
$confirm = false;
$cleanregdata = 1;
}
}
}
//course unpublish went ok, unregister the site now
if ($confirm) {
$function = 'hub_unregister_site';
$params = array();
$serverurl = $huburl . "/local/hub/webservice/webservices.php";
$xmlrpcclient = new webservice_xmlrpc_client($serverurl, $hub->token);
try {
$result = $xmlrpcclient->call($function, $params);
} catch (Exception $e) {
if (!$cleanregdata) {
$errormessage = $e->getMessage();
$confirm = false;
$cleanregdata = 1;
}
}
}
//check that we are still processing the unregistration,
//it could have been unset if an exception were previsouly catched
if ($confirm) {
$registrationmanager->delete_registeredhub($huburl);
}
}
if (empty($cancel) and $unregistration and !$confirm) {
echo $OUTPUT->header();
//do not check sesskey if confirm = false because this script is linked into email message
if (!empty($errormessage)) {
echo $OUTPUT->notification(get_string('unregistrationerror', 'hub', $errormessage));
}
$hub = $registrationmanager->get_registeredhub($huburl);
echo $OUTPUT->heading(get_string('unregisterfrom', 'hub', $hub->hubname), 3, 'main');
if ($cleanregdata) {
$siteunregistrationform = new site_clean_registration_data_form('',
array('huburl' => $huburl, 'hubname' => $hub->hubname));
} else {
$siteunregistrationform = new site_unregistration_form('',
array('huburl' => $huburl, 'hubname' => $hub->hubname));
}
$siteunregistrationform->display();
} else {
$registeredonmoodleorg = false;
$moodleorghub = $registrationmanager->get_registeredhub(HUB_MOODLEORGHUBURL);
if (!empty($moodleorghub)) {
$registeredonmoodleorg = true;
}
// load the hub selector form
$hubselectorform = new hub_selector_form();
$fromform = $hubselectorform->get_data();
$selectedhuburl = optional_param('publichub', false, PARAM_URL);
$unlistedhuburl = optional_param('unlistedurl', false, PARAM_TEXT);
$password = optional_param('password', '', PARAM_RAW);
$registeringhuburl = null;
if (!empty($unlistedhuburl)) {
if (clean_param($unlistedhuburl, PARAM_URL) !== '') {
$registeringhuburl = $unlistedhuburl;
}
} else if (!empty($selectedhuburl)) {
$registeringhuburl = $selectedhuburl;
}
// a hub has been selected, redirect to the hub registration page
if (empty($cancel) and !empty($registeringhuburl) and confirm_sesskey()) {
$hubname = optional_param(clean_param($registeringhuburl, PARAM_ALPHANUMEXT), '', PARAM_TEXT);
$params = array('sesskey' => sesskey(), 'huburl' => $registeringhuburl,
'password' => $password, 'hubname' => $hubname);
redirect(new moodle_url($CFG->wwwroot . "/" . $CFG->admin . "/registration/register.php",
$params));
}
echo $OUTPUT->header();
echo $OUTPUT->confirm(
get_string('registerwithmoodleorgremove', 'core_hub'),
new moodle_url(new moodle_url('/admin/registration/index.php', ['unregistration' => 1, 'confirm' => 1])),
new moodle_url(new moodle_url('/admin/registration/index.php'))
);
echo $OUTPUT->footer();
exit;
}
$isinitialregistration = \core\hub\registration::show_after_install(true);
if (!$returnurl = optional_param('returnurl', null, PARAM_LOCALURL)) {
$returnurl = $isinitialregistration ? '/admin/index.php' : '/admin/registration/index.php';
}
//check if the site is registered on Moodle.org and display a message about registering on MOOCH
$registered = $DB->count_records('registration_hubs', array('huburl' => HUB_MOODLEORGHUBURL, 'confirmed' => 1));
if (empty($registered)) {
$warningmsg = get_string('registermoochtips', 'hub');
$warningmsg .= $renderer->single_button(new moodle_url('register.php', array('huburl' => HUB_MOODLEORGHUBURL
, 'hubname' => 'Moodle.org')), get_string('register', 'admin'));
echo $renderer->box($warningmsg, 'buttons mdl-align generalbox adminwarning');
}
$siteregistrationform = new \core\hub\site_registration_form();
$siteregistrationform->set_data(['returnurl' => $returnurl]);
if ($fromform = $siteregistrationform->get_data()) {
//do not check sesskey if confirm = false because this script is linked into email message
if (!empty($errormessage)) {
echo $OUTPUT->notification(get_string('unregistrationerror', 'hub', $errormessage));
}
// Save the settings.
\core\hub\registration::save_site_info($fromform);
echo $OUTPUT->heading(get_string('registerwith', 'hub'));
if (\core\hub\registration::is_registered()) {
if (\core\hub\registration::update_manual()) {
redirect(new moodle_url($returnurl));
$hubselectorform->display();
if (extension_loaded('xmlrpc')) {
$hubs = $registrationmanager->get_registered_on_hubs();
if (!empty($hubs)) {
echo $OUTPUT->heading(get_string('registeredon', 'hub'), 3, 'main');
echo $renderer->registeredonhublisting($hubs);
}
redirect(new moodle_url('/admin/registration/index.php', ['returnurl' => $returnurl]));
} else {
\core\hub\registration::register($returnurl);
// This method will redirect away.
} else { //display notice about xmlrpc
$xmlrpcnotification = $OUTPUT->doc_link('admin/environment/php_extension/xmlrpc', '');
$xmlrpcnotification .= get_string('xmlrpcdisabledregistration', 'hub');
echo $OUTPUT->notification($xmlrpcnotification);
}
}
// OUTPUT SECTION.
echo $OUTPUT->header();
// Current status of registration.
$notificationtype = \core\output\notification::NOTIFY_ERROR;
if (\core\hub\registration::is_registered()) {
$lastupdated = \core\hub\registration::get_last_updated();
if ($lastupdated == 0) {
$registrationmessage = get_string('pleaserefreshregistrationunknown', 'admin');
} else if (\core\hub\registration::get_new_registration_fields()) {
$registrationmessage = get_string('pleaserefreshregistrationnewdata', 'admin');
} else {
$lastupdated = userdate($lastupdated, get_string('strftimedate', 'langconfig'));
$registrationmessage = get_string('pleaserefreshregistration', 'admin', $lastupdated);
$notificationtype = \core\output\notification::NOTIFY_INFO;
}
echo $OUTPUT->notification($registrationmessage, $notificationtype);
} else if (!$isinitialregistration) {
$registrationmessage = get_string('registrationwarning', 'admin');
echo $OUTPUT->notification($registrationmessage, $notificationtype);
}
// Heading.
if (\core\hub\registration::is_registered()) {
echo $OUTPUT->heading(get_string('registerwithmoodleorgupdate', 'core_hub'));
} else if ($isinitialregistration) {
echo $OUTPUT->heading(get_string('registerwithmoodleorgcomplete', 'core_hub'));
} else {
echo $OUTPUT->heading(get_string('registerwithmoodleorg', 'core_hub'));
}
$renderer = $PAGE->get_renderer('core', 'admin');
echo $renderer->moodleorg_registration_message();
$siteregistrationform->display();
if (\core\hub\registration::is_registered()) {
// Unregister link.
$unregisterhuburl = new moodle_url("/admin/registration/index.php", ['unregistration' => 1]);
echo html_writer::div(html_writer::link($unregisterhuburl, get_string('unregister', 'hub')), 'unregister mt-2');
} else if ($isinitialregistration) {
echo html_writer::div(html_writer::link(new moodle_url($returnurl), get_string('skipregistration', 'hub')),
'skipregistration mt-2');
}
echo $OUTPUT->footer();
+295 -1
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
@@ -14,4 +15,297 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
defined('MOODLE_INTERNAL') || die();
//// SITE PRIVACY /////
/**
* Site privacy: private
*/
define('HUB_SITENOTPUBLISHED', 'notdisplayed');
/**
* Site privacy: public
*/
define('HUB_SITENAMEPUBLISHED', 'named');
/**
* Site privacy: public and global
*/
define('HUB_SITELINKPUBLISHED', 'linked');
/**
*
* Site registration library
*
* @package course
* @copyright 2010 Moodle Pty Ltd (http://moodle.com)
* @author Jerome Mouneyrac
* @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class registration_manager {
/**
* Automatically update the registration on all hubs
*/
public function cron() {
global $CFG;
if (extension_loaded('xmlrpc')) {
$function = 'hub_update_site_info';
require_once($CFG->dirroot . "/webservice/xmlrpc/lib.php");
// Update all hubs where the site is registered.
$hubs = $this->get_registered_on_hubs();
if (empty($hubs)) {
mtrace(get_string('registrationwarning', 'admin'));
}
foreach ($hubs as $hub) {
// Update the registration.
$siteinfo = $this->get_site_info($hub->huburl);
$params = array('siteinfo' => $siteinfo);
$serverurl = $hub->huburl . "/local/hub/webservice/webservices.php";
$xmlrpcclient = new webservice_xmlrpc_client($serverurl, $hub->token);
try {
$result = $xmlrpcclient->call($function, $params);
$this->update_registeredhub($hub); // To update timemodified.
mtrace(get_string('siteupdatedcron', 'hub', $hub->hubname));
} catch (Exception $e) {
$errorparam = new stdClass();
$errorparam->errormessage = $e->getMessage();
$errorparam->hubname = $hub->hubname;
mtrace(get_string('errorcron', 'hub', $errorparam));
}
}
} else {
mtrace(get_string('errorcronnoxmlrpc', 'hub'));
}
}
/**
* Return the site secret for a given hub
* site identifier is assigned to Mooch
* each hub has a unique and personal site secret.
* @param string $huburl
* @return string site secret
*/
public function get_site_secret_for_hub($huburl) {
global $DB;
$existingregistration = $DB->get_record('registration_hubs',
array('huburl' => $huburl));
if (!empty($existingregistration)) {
return $existingregistration->secret;
}
if ($huburl == HUB_MOODLEORGHUBURL) {
$siteidentifier = get_site_identifier();
} else {
$siteidentifier = random_string(32) . $_SERVER['HTTP_HOST'];
}
return $siteidentifier;
}
/**
* When the site register on a hub, he must call this function
* @param object $hub where the site is registered on
* @return integer id of the record
*/
public function add_registeredhub($hub) {
global $DB;
$hub->timemodified = time();
$id = $DB->insert_record('registration_hubs', $hub);
return $id;
}
/**
* When a site unregister from a hub, he must call this function
* @param string $huburl the huburl to delete
*/
public function delete_registeredhub($huburl) {
global $DB;
$DB->delete_records('registration_hubs', array('huburl' => $huburl));
}
/**
* Get a hub on which the site is registered for a given url or token
* Mostly use to check if the site is registered on a specific hub
* @param string $huburl
* @param string $token
* @return object the hub
*/
public function get_registeredhub($huburl = null, $token = null) {
global $DB;
$params = array();
if (!empty($huburl)) {
$params['huburl'] = $huburl;
}
if (!empty($token)) {
$params['token'] = $token;
}
$params['confirmed'] = 1;
$token = $DB->get_record('registration_hubs', $params);
return $token;
}
/**
* Get the hub which has not confirmed that the site is registered on,
* but for which a request has been sent
* @param string $huburl
* @return object the hub
*/
public function get_unconfirmedhub($huburl) {
global $DB;
$params = array();
$params['huburl'] = $huburl;
$params['confirmed'] = 0;
$token = $DB->get_record('registration_hubs', $params);
return $token;
}
/**
* Update a registered hub (mostly use to update the confirmation status)
* @param object $hub the hub
*/
public function update_registeredhub($hub) {
global $DB;
$hub->timemodified = time();
$DB->update_record('registration_hubs', $hub);
}
/**
* Return all hubs where the site is registered
*/
public function get_registered_on_hubs() {
global $DB;
$hubs = $DB->get_records('registration_hubs', array('confirmed' => 1));
return $hubs;
}
/**
* Return site information for a specific hub
* @param string $huburl
* @return array site info
*/
public function get_site_info($huburl) {
global $CFG, $DB;
$siteinfo = array();
$cleanhuburl = clean_param($huburl, PARAM_ALPHANUMEXT);
$siteinfo['name'] = get_config('hub', 'site_name_' . $cleanhuburl);
$siteinfo['description'] = get_config('hub', 'site_description_' . $cleanhuburl);
$siteinfo['contactname'] = get_config('hub', 'site_contactname_' . $cleanhuburl);
$siteinfo['contactemail'] = get_config('hub', 'site_contactemail_' . $cleanhuburl);
$siteinfo['contactphone'] = get_config('hub', 'site_contactphone_' . $cleanhuburl);
$siteinfo['imageurl'] = get_config('hub', 'site_imageurl_' . $cleanhuburl);
$siteinfo['privacy'] = get_config('hub', 'site_privacy_' . $cleanhuburl);
$siteinfo['street'] = get_config('hub', 'site_address_' . $cleanhuburl);
$siteinfo['regioncode'] = get_config('hub', 'site_region_' . $cleanhuburl);
$siteinfo['countrycode'] = get_config('hub', 'site_country_' . $cleanhuburl);
$siteinfo['geolocation'] = get_config('hub', 'site_geolocation_' . $cleanhuburl);
$siteinfo['contactable'] = get_config('hub', 'site_contactable_' . $cleanhuburl);
$siteinfo['emailalert'] = get_config('hub', 'site_emailalert_' . $cleanhuburl);
if (get_config('hub', 'site_coursesnumber_' . $cleanhuburl) == -1) {
$coursecount = -1;
} else {
$coursecount = $DB->count_records('course') - 1;
}
$siteinfo['courses'] = $coursecount;
if (get_config('hub', 'site_usersnumber_' . $cleanhuburl) == -1) {
$usercount = -1;
} else {
$usercount = $DB->count_records('user', array('deleted' => 0));
}
$siteinfo['users'] = $usercount;
if (get_config('hub', 'site_roleassignmentsnumber_' . $cleanhuburl) == -1) {
$roleassigncount = -1;
} else {
$roleassigncount = $DB->count_records('role_assignments');
}
$siteinfo['enrolments'] = $roleassigncount;
if (get_config('hub', 'site_postsnumber_' . $cleanhuburl) == -1) {
$postcount = -1;
} else {
$postcount = $DB->count_records('forum_posts');
}
$siteinfo['posts'] = $postcount;
if (get_config('hub', 'site_questionsnumber_' . $cleanhuburl) == -1) {
$questioncount = -1;
} else {
$questioncount = $DB->count_records('question');
}
$siteinfo['questions'] = $questioncount;
if (get_config('hub', 'site_resourcesnumber_' . $cleanhuburl) == -1) {
$resourcecount = -1;
} else {
$resourcecount = $DB->count_records('resource');
}
$siteinfo['resources'] = $resourcecount;
// Badge statistics.
require_once($CFG->libdir . '/badgeslib.php');
if (get_config('hub', 'site_badges_' . $cleanhuburl) == -1) {
$badges = -1;
} else {
$badges = $DB->count_records_select('badge', 'status <> ' . BADGE_STATUS_ARCHIVED);
}
$siteinfo['badges'] = $badges;
if (get_config('hub', 'site_issuedbadges_' . $cleanhuburl) == -1) {
$issuedbadges = -1;
} else {
$issuedbadges = $DB->count_records('badge_issued');
}
$siteinfo['issuedbadges'] = $issuedbadges;
//TODO
require_once($CFG->dirroot . "/course/lib.php");
if (get_config('hub', 'site_participantnumberaverage_' . $cleanhuburl) == -1) {
$participantnumberaverage = -1;
} else {
$participantnumberaverage = average_number_of_participants();
}
$siteinfo['participantnumberaverage'] = $participantnumberaverage;
if (get_config('hub', 'site_modulenumberaverage_' . $cleanhuburl) == -1) {
$modulenumberaverage = -1;
} else {
$modulenumberaverage = average_number_of_courses_modules();
}
$siteinfo['modulenumberaverage'] = $modulenumberaverage;
$siteinfo['language'] = get_config('hub', 'site_language_' . $cleanhuburl);
$siteinfo['moodleversion'] = $CFG->version;
$siteinfo['moodlerelease'] = $CFG->release;
$siteinfo['url'] = $CFG->wwwroot;
return $siteinfo;
}
/**
* Retrieve the site privacy string matching the define value
* @param string $privacy must match the define into moodlelib.php
* @return string
*/
public function get_site_privacy_string($privacy) {
switch ($privacy) {
case HUB_SITENOTPUBLISHED:
$privacystring = get_string('siteprivacynotpublished', 'hub');
break;
case HUB_SITENAMEPUBLISHED:
$privacystring = get_string('siteprivacypublished', 'hub');
break;
case HUB_SITELINKPUBLISHED:
$privacystring = get_string('siteprivacylinked', 'hub');
break;
}
if (empty($privacystring)) {
throw new moodle_exception('unknownprivacy');
}
return $privacystring;
}
}
?>
+165 -2
View File
@@ -20,7 +20,7 @@
// //
///////////////////////////////////////////////////////////////////////////
/**
/*
* @package moodle
* @subpackage registration
* @author Jerome Mouneyrac <jerome@mouneyrac.com>
@@ -34,5 +34,168 @@
require_once('../../config.php');
require_once($CFG->libdir . '/adminlib.php');
require_once($CFG->dirroot . '/' . $CFG->admin . '/registration/forms.php');
require_once($CFG->dirroot . '/webservice/lib.php');
require_once($CFG->dirroot . '/' . $CFG->admin . '/registration/lib.php');
redirect(new moodle_url('/admin/registration/index.php'));
require_sesskey();
$huburl = required_param('huburl', PARAM_URL);
$huburl = rtrim($huburl, "/");
if ($huburl == HUB_MOODLEORGHUBURL) { // register to Moodle.org
admin_externalpage_setup('registrationmoodleorg');
} else { //register to a hub
admin_externalpage_setup('registrationhub');
}
$password = optional_param('password', '', PARAM_TEXT);
$hubname = optional_param('hubname', '', PARAM_TEXT);
$registrationmanager = new registration_manager();
$registeredhub = $registrationmanager->get_registeredhub($huburl);
$siteregistrationform = new site_registration_form('',
array('alreadyregistered' => !empty($registeredhub->token),
'huburl' => $huburl, 'hubname' => $hubname,
'password' => $password));
$fromform = $siteregistrationform->get_data();
if (!empty($fromform) and confirm_sesskey()) {
// Set to -1 all optional data marked as "don't send" by the admin.
// The function get_site_info() will not calculate the optional data if config is set to -1.
$inputnames = array('courses', 'users', 'roleassignments', 'posts', 'questions', 'resources',
'badges', 'issuedbadges', 'modulenumberaverage', 'participantnumberaverage');
foreach ($inputnames as $inputname) {
if (empty($fromform->{$inputname})) {
$fromform->{$inputname} = -1;
}
}
// Save the settings.
$cleanhuburl = clean_param($huburl, PARAM_ALPHANUMEXT);
set_config('site_name_' . $cleanhuburl, $fromform->name, 'hub');
set_config('site_description_' . $cleanhuburl, $fromform->description, 'hub');
set_config('site_contactname_' . $cleanhuburl, $fromform->contactname, 'hub');
set_config('site_contactemail_' . $cleanhuburl, $fromform->contactemail, 'hub');
set_config('site_contactphone_' . $cleanhuburl, $fromform->contactphone, 'hub');
set_config('site_imageurl_' . $cleanhuburl, $fromform->imageurl, 'hub');
set_config('site_privacy_' . $cleanhuburl, $fromform->privacy, 'hub');
set_config('site_address_' . $cleanhuburl, $fromform->address, 'hub');
set_config('site_region_' . $cleanhuburl, $fromform->regioncode, 'hub');
set_config('site_country_' . $cleanhuburl, $fromform->countrycode, 'hub');
set_config('site_language_' . $cleanhuburl, $fromform->language, 'hub');
set_config('site_geolocation_' . $cleanhuburl, $fromform->geolocation, 'hub');
set_config('site_contactable_' . $cleanhuburl, $fromform->contactable, 'hub');
set_config('site_emailalert_' . $cleanhuburl, $fromform->emailalert, 'hub');
set_config('site_coursesnumber_' . $cleanhuburl, $fromform->courses, 'hub');
set_config('site_usersnumber_' . $cleanhuburl, $fromform->users, 'hub');
set_config('site_roleassignmentsnumber_' . $cleanhuburl, $fromform->roleassignments, 'hub');
set_config('site_postsnumber_' . $cleanhuburl, $fromform->posts, 'hub');
set_config('site_questionsnumber_' . $cleanhuburl, $fromform->questions, 'hub');
set_config('site_resourcesnumber_' . $cleanhuburl, $fromform->resources, 'hub');
set_config('site_badges_' . $cleanhuburl, $fromform->badges, 'hub');
set_config('site_issuedbadges_' . $cleanhuburl, $fromform->issuedbadges, 'hub');
set_config('site_modulenumberaverage_' . $cleanhuburl, $fromform->modulenumberaverage, 'hub');
set_config('site_participantnumberaverage_' . $cleanhuburl, $fromform->participantnumberaverage, 'hub');
}
/////// UPDATE ACTION ////////
// update the hub registration
$update = optional_param('update', 0, PARAM_INT);
if ($update and confirm_sesskey()) {
//update the registration
$function = 'hub_update_site_info';
$siteinfo = $registrationmanager->get_site_info($huburl);
$params = array('siteinfo' => $siteinfo);
$serverurl = $huburl . "/local/hub/webservice/webservices.php";
require_once($CFG->dirroot . "/webservice/xmlrpc/lib.php");
$xmlrpcclient = new webservice_xmlrpc_client($serverurl, $registeredhub->token);
try {
$result = $xmlrpcclient->call($function, $params);
$registrationmanager->update_registeredhub($registeredhub); // To update timemodified.
} catch (Exception $e) {
$error = $OUTPUT->notification(get_string('errorregistration', 'hub', $e->getMessage()));
}
}
/////// FORM REGISTRATION ACTION //////
if (!empty($fromform) and empty($update) and confirm_sesskey()) {
if (!empty($fromform) and confirm_sesskey()) { // if the register button has been clicked
// Retrieve the optional info (specially course number, user number, module number average...).
$siteinfo = $registrationmanager->get_site_info($huburl);
$fromform->courses = $siteinfo['courses'];
$fromform->users = $siteinfo['users'];
$fromform->enrolments = $siteinfo['enrolments'];
$fromform->posts = $siteinfo['posts'];
$fromform->questions = $siteinfo['questions'];
$fromform->resources = $siteinfo['resources'];
$fromform->badges = $siteinfo['badges'];
$fromform->issuedbadges = $siteinfo['issuedbadges'];
$fromform->modulenumberaverage = $siteinfo['modulenumberaverage'];
$fromform->participantnumberaverage = $siteinfo['participantnumberaverage'];
$fromform->street = $siteinfo['street'];
$params = (array) $fromform; //we are using the form input as the redirection parameters (token, url and name)
$unconfirmedhub = $registrationmanager->get_unconfirmedhub($huburl);
if (empty($unconfirmedhub)) {
//we save the token into the communication table in order to have a reference
$unconfirmedhub = new stdClass();
$unconfirmedhub->token = $registrationmanager->get_site_secret_for_hub($huburl);
$unconfirmedhub->secret = $unconfirmedhub->token;
$unconfirmedhub->huburl = $huburl;
$unconfirmedhub->hubname = $hubname;
$unconfirmedhub->confirmed = 0;
$unconfirmedhub->id = $registrationmanager->add_registeredhub($unconfirmedhub);
}
$params['token'] = $unconfirmedhub->token;
$params['url'] = $CFG->wwwroot;
redirect(new moodle_url($huburl . '/local/hub/siteregistration.php', $params));
}
}
/////// OUTPUT SECTION /////////////
echo $OUTPUT->header();
//Display update notification result
if (!empty($registeredhub->confirmed)) {
if (!empty($result)) {
echo $OUTPUT->notification(get_string('siteregistrationupdated', 'hub'), 'notifysuccess');
}
}
if (!empty($error)) {
echo $error;
}
// Some Moodle.org registration explanation.
if ($huburl == HUB_MOODLEORGHUBURL) {
if (!empty($registeredhub->token)) {
if ($registeredhub->timemodified == 0) {
$registrationmessage = get_string('pleaserefreshregistrationunknown', 'admin');
} else {
$lastupdated = userdate($registeredhub->timemodified, get_string('strftimedate', 'langconfig'));
$registrationmessage = get_string('pleaserefreshregistration', 'admin', $lastupdated);
}
} else {
$registrationmessage = get_string('registrationwarning', 'admin');
}
echo $OUTPUT->notification($registrationmessage);
echo $OUTPUT->heading(get_string('registerwithmoodleorg', 'admin'));
$renderer = $PAGE->get_renderer('core', 'register');
echo $renderer->moodleorg_registration_message();
}
$siteregistrationform->display();
echo $OUTPUT->footer();
+95
View File
@@ -0,0 +1,95 @@
<?php
///////////////////////////////////////////////////////////////////////////
// //
// This file is part of Moodle - http://moodle.org/ //
// Moodle - Modular Object-Oriented Dynamic Learning Environment //
// //
// 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/>. //
// //
///////////////////////////////////////////////////////////////////////////
/**
* Registration renderer.
* @package moodle
* @subpackage registration
* @copyright 2010 Moodle Pty Ltd (http://moodle.com)
* @author Jerome Mouneyrac
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class core_register_renderer extends plugin_renderer_base {
/**
* Display message about the benefits of registering on Moodle.org
*
* @return string
*/
public function moodleorg_registration_message() {
$moodleorgstatslink = html_writer::link('http://moodle.net/stats',
get_string('statsmoodleorg', 'admin'),
array('target' => '_blank'));
$moodleorgregmsg = get_string('registermoodleorg', 'admin');
$items = array(get_string('registermoodleorgli1', 'admin'),
get_string('registermoodleorgli2', 'admin', $moodleorgstatslink));
$moodleorgregmsg .= html_writer::alist($items);
return $moodleorgregmsg;
}
/**
* Display a box message confirming a site registration (add or update)
* @param string $confirmationmessage
* @return string
*/
public function registration_confirmation($confirmationmessage) {
$linktositelist = html_writer::tag('a', get_string('sitelist', 'hub'),
array('href' => new moodle_url('/local/hub/index.php')));
$message = $confirmationmessage . html_writer::empty_tag('br') . $linktositelist;
return $this->output->box($message);
}
/**
* Display the listing of registered on hub
*/
public function registeredonhublisting($hubs) {
global $CFG;
$table = new html_table();
$table->head = array(get_string('hub', 'hub'), get_string('operation', 'hub'));
$table->size = array('80%', '20%');
foreach ($hubs as $hub) {
if ($hub->huburl == HUB_MOODLEORGHUBURL) {
$hub->hubname = get_string('registeredmoodleorg', 'hub', $hub->hubname);
}
$hublink = html_writer::tag('a', $hub->hubname, array('href' => $hub->huburl));
$hublinkcell = html_writer::tag('div', $hublink, array('class' => 'registeredhubrow'));
$unregisterhuburl = new moodle_url("/" . $CFG->admin . "/registration/index.php",
array('sesskey' => sesskey(), 'huburl' => $hub->huburl,
'unregistration' => 1));
$unregisterbutton = new single_button($unregisterhuburl,
get_string('unregister', 'hub'));
$unregisterbutton->class = 'centeredbutton';
$unregisterbuttonhtml = $this->output->render($unregisterbutton);
//add button cells
$cells = array($hublinkcell, $unregisterbuttonhtml);
$row = new html_table_row($cells);
$table->data[] = $row;
}
return html_writer::table($table);
}
}
+33 -29
View File
@@ -20,7 +20,7 @@
// //
///////////////////////////////////////////////////////////////////////////
/**
/*
* @package moodle
* @subpackage registration
* @author Jerome Mouneyrac <jerome@mouneyrac.com>
@@ -33,40 +33,44 @@
require('../../config.php');
require_once($CFG->libdir . '/adminlib.php');
require_once($CFG->dirroot . '/' . $CFG->admin . '/registration/lib.php');
$url = optional_param('url', '', PARAM_URL);
$hubname = optional_param('hubname', '', PARAM_TEXT);
$token = optional_param('token', '', PARAM_TEXT);
admin_externalpage_setup('registrationmoodleorg');
admin_externalpage_setup('registrationhubs');
if (parse_url($url, PHP_URL_HOST) !== parse_url(HUB_MOODLEORGHUBURL, PHP_URL_HOST)) {
// Allow other plugins to renew registration on custom hubs. Plugins implementing this
// callback need to redirect or exit. See https://docs.moodle.org/en/Hub_registration .
$callbacks = get_plugins_with_function('hub_registration');
foreach ($callbacks as $plugintype => $plugins) {
foreach ($plugins as $plugin => $callback) {
$callback('renew');
}
//check that we are waiting a confirmation from this hub, and check that the token is correct
$registrationmanager = new registration_manager();
$registeredhub = $registrationmanager->get_unconfirmedhub($url);
if (!empty($registeredhub) and $registeredhub->token == $token) {
echo $OUTPUT->header();
echo $OUTPUT->heading(get_string('renewregistration', 'hub'), 3, 'main');
$hublink = html_writer::tag('a', $hubname, array('href' => $url));
$registrationmanager->delete_registeredhub($url);
//Mooch case, need to recreate the siteidentifier
if ($url == HUB_MOODLEORGHUBURL) {
$CFG->siteidentifier = null;
get_site_identifier();
}
throw new moodle_exception('errorotherhubsnotsupported', 'hub');
$deletedregmsg = get_string('previousregistrationdeleted', 'hub', $hublink);
$button = new single_button(new moodle_url('/admin/registration/index.php'),
get_string('restartregistration', 'hub'));
$button->class = 'restartregbutton';
echo html_writer::tag('div', $deletedregmsg . $OUTPUT->render($button),
array('class' => 'mdl-align'));
echo $OUTPUT->footer();
} else {
throw new moodle_exception('wrongtoken', 'hub',
$CFG->wwwroot . '/' . $CFG->admin . '/registration/index.php');
}
// Check that we are waiting a confirmation from this hub, and check that the token is correct.
\core\hub\registration::reset_site_identifier($token);
echo $OUTPUT->header();
echo $OUTPUT->heading(get_string('renewregistration', 'hub'), 3, 'main');
$hublink = html_writer::tag('a', HUB_MOODLEORGHUBURL, array('href' => HUB_MOODLEORGHUBURL));
$deletedregmsg = get_string('previousregistrationdeleted', 'hub', $hublink);
$button = new single_button(new moodle_url('/admin/registration/index.php'),
get_string('restartregistration', 'hub'));
$button->class = 'restartregbutton';
echo html_writer::tag('div', $deletedregmsg . $OUTPUT->render($button),
array('class' => 'mdl-align'));
echo $OUTPUT->footer();
+79 -253
View File
@@ -276,20 +276,12 @@ class core_admin_renderer extends plugin_renderer_base {
* @param int|null $availableupdatesfetch timestamp of the most recent updates fetch or null (unknown)
* @param string[] $cachewarnings An array containing warnings from the Cache API.
* @param array $eventshandlers Events 1 API handlers.
* @param bool $themedesignermode Warn about the theme designer mode.
* @param bool $devlibdir Warn about development libs directory presence.
* @param bool $mobileconfigured Whether the mobile web services have been enabled
* @param bool $overridetossl Whether or not ssl is being forced.
* @param bool $invalidforgottenpasswordurl Whether the forgotten password URL does not link to a valid URL.
* @param bool $croninfrequent If true, warn that cron hasn't run in the past few minutes
*
* @return string HTML to output.
*/
public function admin_notifications_page($maturity, $insecuredataroot, $errorsdisplayed,
$cronoverdue, $dbproblems, $maintenancemode, $availableupdates, $availableupdatesfetch,
$buggyiconvnomb, $registered, array $cachewarnings = array(), $eventshandlers = 0,
$themedesignermode = false, $devlibdir = false, $mobileconfigured = false,
$overridetossl = false, $invalidforgottenpasswordurl = false, $croninfrequent = false) {
$buggyiconvnomb, $registered, array $cachewarnings = array(), $eventshandlers = 0) {
global $CFG;
$output = '';
@@ -298,20 +290,14 @@ class core_admin_renderer extends plugin_renderer_base {
$output .= $this->legacy_log_store_writing_error();
$output .= empty($CFG->disableupdatenotifications) ? $this->available_updates($availableupdates, $availableupdatesfetch) : '';
$output .= $this->insecure_dataroot_warning($insecuredataroot);
$output .= $this->development_libs_directories_warning($devlibdir);
$output .= $this->themedesignermode_warning($themedesignermode);
$output .= $this->display_errors_warning($errorsdisplayed);
$output .= $this->buggy_iconv_warning($buggyiconvnomb);
$output .= $this->cron_overdue_warning($cronoverdue);
$output .= $this->cron_infrequent_warning($croninfrequent);
$output .= $this->db_problems($dbproblems);
$output .= $this->maintenance_mode_warning($maintenancemode);
$output .= $this->overridetossl_warning($overridetossl);
$output .= $this->cache_warnings($cachewarnings);
$output .= $this->events_handlers($eventshandlers);
$output .= $this->registration_warning($registered);
$output .= $this->mobile_configuration_warning($mobileconfigured);
$output .= $this->forgotten_password_url_warning($invalidforgottenpasswordurl);
//////////////////////////////////////////////////////////////////////////////////////////////////
//// IT IS ILLEGAL AND A VIOLATION OF THE GPL TO HIDE, REMOVE OR MODIFY THIS COPYRIGHT NOTICE ///
@@ -361,15 +347,14 @@ class core_admin_renderer extends plugin_renderer_base {
$output = '';
if ($checker->enabled()) {
$output .= $this->container_start('checkforupdates mb-4');
$output .= $this->container_start('checkforupdates');
$output .= $this->single_button(
new moodle_url($reloadurl, array('fetchupdates' => 1)),
get_string('checkforupdates', 'core_plugin')
);
if ($timefetched = $checker->get_last_timefetched()) {
$timefetched = userdate($timefetched, get_string('strftimedatetime', 'core_langconfig'));
$output .= $this->container(get_string('checkforupdateslast', 'core_plugin', $timefetched),
'lasttimefetched small text-muted mt-1');
$output .= $this->container(get_string('checkforupdateslast', 'core_plugin', $timefetched), 'lasttimefetched');
}
$output .= $this->container_end();
}
@@ -534,24 +519,6 @@ class core_admin_renderer extends plugin_renderer_base {
}
}
/**
* Render a warning that a directory with development libs is present.
*
* @param bool $devlibdir True if the warning should be displayed.
* @return string
*/
protected function development_libs_directories_warning($devlibdir) {
if ($devlibdir) {
$moreinfo = new moodle_url('/report/security/index.php');
$warning = get_string('devlibdirpresent', 'core_admin', ['moreinfourl' => $moreinfo->out()]);
return $this->warning($warning, 'error');
} else {
return '';
}
}
/**
* Render an appropriate message if dataroot is insecure.
* @param bool $errorsdisplayed
@@ -565,19 +532,6 @@ class core_admin_renderer extends plugin_renderer_base {
return $this->warning(get_string('displayerrorswarning', 'admin'));
}
/**
* Render an appropriate message if themdesignermode is enabled.
* @param bool $themedesignermode true if enabled
* @return string HTML to output.
*/
protected function themedesignermode_warning($themedesignermode) {
if (!$themedesignermode) {
return '';
}
return $this->warning(get_string('themedesignermodewarning', 'admin'));
}
/**
* Render an appropriate message if iconv is buggy and mbstring missing.
* @param bool $buggyiconvnomb
@@ -617,24 +571,6 @@ class core_admin_renderer extends plugin_renderer_base {
$this->help_icon('cron', 'admin'));
}
/**
* Render an appropriate message if cron is not being run frequently (recommended every minute).
*
* @param bool $croninfrequent
* @return string HTML to output.
*/
public function cron_infrequent_warning(bool $croninfrequent) : string {
global $CFG;
if (!$croninfrequent) {
return '';
}
$expectedfrequency = $CFG->expectedcronfrequency ?? 200;
return $this->warning(get_string('croninfrequent', 'admin', $expectedfrequency) . '&nbsp;' .
$this->help_icon('cron', 'admin'));
}
/**
* Render an appropriate message if there are any problems with the DB set-up.
* @param bool $dbproblems
@@ -694,20 +630,6 @@ class core_admin_renderer extends plugin_renderer_base {
return $this->warning(get_string('sitemaintenancewarning2', 'admin', $url));
}
/**
* Render a warning that ssl is forced because the site was on loginhttps.
*
* @param bool $overridetossl Whether or not ssl is being forced.
* @return string
*/
protected function overridetossl_warning($overridetossl) {
if (!$overridetossl) {
return '';
}
$warning = get_string('overridetossl', 'core_admin');
return $this->warning($warning, 'warning');
}
/**
* Display a warning about installing development code if necesary.
* @param int $maturity
@@ -824,7 +746,7 @@ class core_admin_renderer extends plugin_renderer_base {
}
}
$updateinfo .= $this->container_start('checkforupdates mt-1');
$updateinfo .= $this->container_start('checkforupdates');
$fetchurl = new moodle_url('/admin/index.php', array('fetchupdates' => 1, 'sesskey' => sesskey(), 'cache' => 0));
$updateinfo .= $this->single_button($fetchurl, get_string('checkforupdates', 'core_plugin'));
if ($fetch) {
@@ -844,68 +766,19 @@ class core_admin_renderer extends plugin_renderer_base {
*/
protected function registration_warning($registered) {
if (!$registered && site_is_public()) {
if (has_capability('moodle/site:config', context_system::instance())) {
$registerbutton = $this->single_button(new moodle_url('/admin/registration/index.php'),
get_string('register', 'admin'));
$str = 'registrationwarning';
} else {
$registerbutton = '';
$str = 'registrationwarningcontactadmin';
}
if (!$registered) {
return $this->warning( get_string($str, 'admin')
. '&nbsp;' . $this->help_icon('registration', 'admin') . $registerbutton ,
'error alert alert-danger');
$registerbutton = $this->single_button(new moodle_url('/admin/registration/register.php',
array('huburl' => HUB_MOODLEORGHUBURL, 'hubname' => 'Moodle.org')),
get_string('register', 'admin'));
return $this->warning( get_string('registrationwarning', 'admin')
. '&nbsp;' . $this->help_icon('registration', 'admin') . $registerbutton );
}
return '';
}
/**
* Return an admin page warning if site is not registered with moodle.org
*
* @return string
*/
public function warn_if_not_registered() {
return $this->registration_warning(\core\hub\registration::is_registered());
}
/**
* Display a warning about the Mobile Web Services being disabled.
*
* @param boolean $mobileconfigured true if mobile web services are enabled
* @return string HTML to output.
*/
protected function mobile_configuration_warning($mobileconfigured) {
$output = '';
if (!$mobileconfigured) {
$settingslink = new moodle_url('/admin/settings.php', ['section' => 'mobilesettings']);
$configurebutton = $this->single_button($settingslink, get_string('enablemobilewebservice', 'admin'));
$output .= $this->warning(get_string('mobilenotconfiguredwarning', 'admin') . '&nbsp;' . $configurebutton);
}
return $output;
}
/**
* Display a warning about the forgotten password URL not linking to a valid URL.
*
* @param boolean $invalidforgottenpasswordurl true if the forgotten password URL is not valid
* @return string HTML to output.
*/
protected function forgotten_password_url_warning($invalidforgottenpasswordurl) {
$output = '';
if ($invalidforgottenpasswordurl) {
$settingslink = new moodle_url('/admin/settings.php', ['section' => 'manageauths']);
$configurebutton = $this->single_button($settingslink, get_string('check', 'moodle'));
$output .= $this->warning(get_string('invalidforgottenpasswordurl', 'admin') . '&nbsp;' . $configurebutton,
'error alert alert-danger');
}
return $output;
}
/**
* Helper method to render the information about the available Moodle update
*
@@ -913,7 +786,7 @@ class core_admin_renderer extends plugin_renderer_base {
*/
protected function moodle_available_update_info(\core\update\info $updateinfo) {
$boxclasses = 'moodleupdateinfo mb-2';
$boxclasses = 'moodleupdateinfo';
$info = array();
if (isset($updateinfo->release)) {
@@ -933,8 +806,7 @@ class core_admin_renderer extends plugin_renderer_base {
}
if (isset($updateinfo->download)) {
$info[] = html_writer::link($updateinfo->download, get_string('download'),
array('class' => 'info download btn btn-secondary'));
$info[] = html_writer::link($updateinfo->download, get_string('download'), array('class' => 'info download'));
}
if (isset($updateinfo->url)) {
@@ -942,9 +814,9 @@ class core_admin_renderer extends plugin_renderer_base {
array('class' => 'info more'));
}
$box = $this->output->container_start($boxclasses);
$box .= $this->output->container(implode(html_writer::tag('span', ' | ', array('class' => 'separator')), $info), '');
$box .= $this->output->container_end();
$box = $this->output->box_start($boxclasses);
$box .= $this->output->box(implode(html_writer::tag('span', ' ', array('class' => 'separator')), $info), '');
$box .= $this->output->box_end();
return $box;
}
@@ -1056,7 +928,7 @@ class core_admin_renderer extends plugin_renderer_base {
$displayname = new html_table_cell(
$icon.
html_writer::span($plugin->displayname, 'pluginname').
html_writer::div($plugin->get_dir(), 'plugindir text-muted small')
html_writer::div($plugin->get_dir(), 'plugindir')
);
$versiondb = new html_table_cell($plugin->versiondb);
@@ -1064,10 +936,10 @@ class core_admin_renderer extends plugin_renderer_base {
if ($isstandard = $plugin->is_standard()) {
$row->attributes['class'] .= ' standard';
$sourcelabel = html_writer::span(get_string('sourcestd', 'core_plugin'), 'sourcetext badge badge-secondary');
$sourcelabel = html_writer::span(get_string('sourcestd', 'core_plugin'), 'sourcetext label');
} else {
$row->attributes['class'] .= ' extension';
$sourcelabel = html_writer::span(get_string('sourceext', 'core_plugin'), 'sourcetext badge badge-info');
$sourcelabel = html_writer::span(get_string('sourceext', 'core_plugin'), 'sourcetext label label-info');
}
$coredependency = $plugin->is_core_dependency_satisfied($version);
@@ -1076,32 +948,32 @@ class core_admin_renderer extends plugin_renderer_base {
$statuscode = $plugin->get_status();
$row->attributes['class'] .= ' status-' . $statuscode;
$statusclass = 'statustext badge ';
$statusclass = 'statustext label ';
switch ($statuscode) {
case core_plugin_manager::PLUGIN_STATUS_NEW:
$statusclass .= $dependenciesok ? 'badge-success' : 'badge-warning';
$statusclass .= $dependenciesok ? 'label-success' : 'label-warning';
break;
case core_plugin_manager::PLUGIN_STATUS_UPGRADE:
$statusclass .= $dependenciesok ? 'badge-info' : 'badge-warning';
$statusclass .= $dependenciesok ? 'label-info' : 'label-warning';
break;
case core_plugin_manager::PLUGIN_STATUS_MISSING:
case core_plugin_manager::PLUGIN_STATUS_DOWNGRADE:
case core_plugin_manager::PLUGIN_STATUS_DELETE:
$statusclass .= 'badge-danger';
$statusclass .= 'label-important';
break;
case core_plugin_manager::PLUGIN_STATUS_NODB:
case core_plugin_manager::PLUGIN_STATUS_UPTODATE:
$statusclass .= $dependenciesok ? 'badge-light' : 'badge-warning';
$statusclass .= $dependenciesok ? '' : 'label-warning';
break;
}
$status = html_writer::span(get_string('status_' . $statuscode, 'core_plugin'), $statusclass);
if (!empty($installabortable[$plugin->component])) {
$status .= $this->output->single_button(
new moodle_url($this->page->url, array('abortinstall' => $plugin->component, 'confirmplugincheck' => 0)),
new moodle_url($this->page->url, array('abortinstall' => $plugin->component)),
get_string('cancelinstallone', 'core_plugin'),
'post',
array('class' => 'actionbutton cancelinstallone d-block mt-1')
array('class' => 'actionbutton cancelinstallone')
);
}
@@ -1110,7 +982,7 @@ class core_admin_renderer extends plugin_renderer_base {
new moodle_url($this->page->url, array('abortupgrade' => $plugin->component)),
get_string('cancelupgradeone', 'core_plugin'),
'post',
array('class' => 'actionbutton cancelupgradeone d-block mt-1')
array('class' => 'actionbutton cancelupgradeone')
);
}
@@ -1180,7 +1052,7 @@ class core_admin_renderer extends plugin_renderer_base {
}
}
$out .= $this->output->container_start('actions mb-2');
$out .= $this->output->container_start('actions');
$installableupdates = $pluginman->filter_installable($pluginman->available_updates());
if ($installableupdates) {
@@ -1188,16 +1060,16 @@ class core_admin_renderer extends plugin_renderer_base {
new moodle_url($this->page->url, array('installupdatex' => 1)),
get_string('updateavailableinstallall', 'core_admin', count($installableupdates)),
'post',
array('class' => 'singlebutton updateavailableinstallall mr-1')
array('class' => 'singlebutton updateavailableinstallall')
);
}
if ($installabortable) {
$out .= $this->output->single_button(
new moodle_url($this->page->url, array('abortinstallx' => 1, 'confirmplugincheck' => 0)),
new moodle_url($this->page->url, array('abortinstallx' => 1)),
get_string('cancelinstallall', 'core_plugin', count($installabortable)),
'post',
array('class' => 'singlebutton cancelinstallall mr-1')
array('class' => 'singlebutton cancelinstallall')
);
}
@@ -1206,17 +1078,15 @@ class core_admin_renderer extends plugin_renderer_base {
new moodle_url($this->page->url, array('abortupgradex' => 1)),
get_string('cancelupgradeall', 'core_plugin', count($upgradeabortable)),
'post',
array('class' => 'singlebutton cancelupgradeall mr-1')
array('class' => 'singlebutton cancelupgradeall')
);
}
$out .= html_writer::div(html_writer::link(new moodle_url($this->page->url, array('showallplugins' => 0)),
get_string('plugincheckattention', 'core_plugin')).' '.html_writer::span($sumattention, 'badge badge-light'),
'btn btn-link mr-1');
get_string('plugincheckattention', 'core_plugin')).' '.html_writer::span($sumattention, 'badge'));
$out .= html_writer::div(html_writer::link(new moodle_url($this->page->url, array('showallplugins' => 1)),
get_string('plugincheckall', 'core_plugin')).' '.html_writer::span($sumtotal, 'badge badge-light'),
'btn btn-link mr-1');
get_string('plugincheckall', 'core_plugin')).' '.html_writer::span($sumtotal, 'badge'));
$out .= $this->output->container_end(); // End of .actions container.
$out .= $this->output->container_end(); // End of #plugins-check-info container.
@@ -1284,13 +1154,12 @@ class core_admin_renderer extends plugin_renderer_base {
}
}
$out = $this->output->container_start('plugins-check-dependencies mb-4');
$out = $this->output->container_start('plugins-check-dependencies');
if ($unavailable or $unknown) {
$out .= $this->output->heading(get_string('misdepsunavail', 'core_plugin'));
if ($unknown) {
$out .= $this->output->render((new \core\output\notification(get_string('misdepsunknownlist', 'core_plugin',
implode(', ', $unknown))))->set_show_closebutton(false));
$out .= $this->output->notification(get_string('misdepsunknownlist', 'core_plugin', implode($unknown, ', ')));
}
if ($unavailable) {
$unavailablelist = array();
@@ -1304,18 +1173,18 @@ class core_admin_renderer extends plugin_renderer_base {
}
$unavailablelist[] = $unavailablelistitem;
}
$out .= $this->output->render((new \core\output\notification(get_string('misdepsunavaillist', 'core_plugin',
implode(', ', $unavailablelist))))->set_show_closebutton(false));
$out .= $this->output->notification(get_string('misdepsunavaillist', 'core_plugin',
implode($unavailablelist, ', ')));
}
$out .= $this->output->container_start('plugins-check-dependencies-actions mb-4');
$out .= $this->output->container_start('plugins-check-dependencies-actions');
$out .= ' '.html_writer::link(new moodle_url('/admin/tool/installaddon/'),
get_string('dependencyuploadmissing', 'core_plugin'), array('class' => 'btn btn-secondary'));
get_string('dependencyuploadmissing', 'core_plugin'));
$out .= $this->output->container_end(); // End of .plugins-check-dependencies-actions container.
}
if ($available) {
$out .= $this->output->heading(get_string('misdepsavail', 'core_plugin'));
$out .= $this->output->container_start('plugins-check-dependencies-actions mb-2');
$out .= $this->output->container_start('plugins-check-dependencies-actions');
$installable = $pluginman->filter_installable($available);
if ($installable) {
@@ -1323,13 +1192,12 @@ class core_admin_renderer extends plugin_renderer_base {
new moodle_url($this->page->url, array('installdepx' => 1)),
get_string('dependencyinstallmissing', 'core_plugin', count($installable)),
'post',
array('class' => 'singlebutton dependencyinstallmissing d-inline-block mr-1')
array('class' => 'singlebutton dependencyinstallmissing')
);
}
$out .= html_writer::div(html_writer::link(new moodle_url('/admin/tool/installaddon/'),
get_string('dependencyuploadmissing', 'core_plugin'), array('class' => 'btn btn-link')),
'dependencyuploadmissing d-inline-block mr-1');
get_string('dependencyuploadmissing', 'core_plugin')), 'dependencyuploadmissing');
$out .= $this->output->container_end(); // End of .plugins-check-dependencies-actions container.
@@ -1368,9 +1236,9 @@ class core_admin_renderer extends plugin_renderer_base {
$supportedmoodles = array();
foreach ($plugin->version->supportedmoodles as $moodle) {
if ($CFG->branch == str_replace('.', '', $moodle->release)) {
$supportedmoodles[] = html_writer::span($moodle->release, 'badge badge-success');
$supportedmoodles[] = html_writer::span($moodle->release, 'label label-success');
} else {
$supportedmoodles[] = html_writer::span($moodle->release, 'badge badge-light');
$supportedmoodles[] = html_writer::span($moodle->release, 'label');
}
}
@@ -1384,7 +1252,7 @@ class core_admin_renderer extends plugin_renderer_base {
}
$info = html_writer::div(
get_string('requiredby', 'core_plugin', implode(', ', $requriedby)),
'requiredby mb-1'
'requiredby'
);
} else {
$info = '';
@@ -1395,39 +1263,38 @@ class core_admin_renderer extends plugin_renderer_base {
$info .= html_writer::div(
html_writer::link('https://moodle.org/plugins/view.php?plugin='.$plugin->component,
get_string('misdepinfoplugin', 'core_plugin')),
'misdepinfoplugin d-inline-block mr-3 mb-1'
'misdepinfoplugin'
);
$info .= html_writer::div(
html_writer::link('https://moodle.org/plugins/pluginversion.php?id='.$plugin->version->id,
get_string('misdepinfoversion', 'core_plugin')),
'misdepinfoversion d-inline-block mr-3 mb-1'
'misdepinfoversion'
);
$info .= html_writer::div(html_writer::link($plugin->version->downloadurl, get_string('download')),
'misdepdownload d-inline-block mr-3 mb-1');
$info .= html_writer::div(html_writer::link($plugin->version->downloadurl, get_string('download')), 'misdepdownload');
if ($pluginman->is_remote_plugin_installable($plugin->component, $plugin->version->version, $reason)) {
$info .= $this->output->single_button(
new moodle_url($this->page->url, array('installdep' => $plugin->component)),
get_string('dependencyinstall', 'core_plugin'),
'post',
array('class' => 'singlebutton dependencyinstall mr-3 mb-1')
array('class' => 'singlebutton dependencyinstall')
);
} else {
$reasonhelp = $this->info_remote_plugin_not_installable($reason);
if ($reasonhelp) {
$info .= html_writer::div($reasonhelp, 'reasonhelp dependencyinstall d-inline-block mr-3 mb-1');
$info .= html_writer::div($reasonhelp, 'reasonhelp dependencyinstall');
}
}
$info .= $this->output->container_end(); // End of .actions container.
$table->data[] = array(
html_writer::div($plugin->name, 'name').' '.html_writer::div($plugin->component, 'component text-muted small'),
html_writer::div($plugin->name, 'name').' '.html_writer::div($plugin->component, 'component'),
$plugin->version->release,
$plugin->version->version,
implode(' ', $supportedmoodles),
implode($supportedmoodles, ' '),
$info
);
}
@@ -1470,29 +1337,27 @@ class core_admin_renderer extends plugin_renderer_base {
foreach ($pluginman->resolve_requirements($plugin, $version) as $reqname => $reqinfo) {
if ($reqname === 'core') {
if ($reqinfo->status == $pluginman::REQUIREMENT_STATUS_OK) {
$class = 'requires-ok text-muted';
$class = 'requires-ok';
$label = '';
} else {
$class = 'requires-failed';
$label = html_writer::span(get_string('dependencyfails', 'core_plugin'), 'badge badge-danger');
}
if ($reqinfo->reqver != ANY_VERSION) {
$requires[] = html_writer::tag('li',
html_writer::span(get_string('moodleversion', 'core_plugin', $plugin->versionrequires), 'dep dep-core').
' '.$label, array('class' => $class));
$label = html_writer::span(get_string('dependencyfails', 'core_plugin'), 'label label-important');
}
$requires[] = html_writer::tag('li',
html_writer::span(get_string('moodleversion', 'core_plugin', $plugin->versionrequires), 'dep dep-core').
' '.$label, array('class' => $class));
} else {
$actions = array();
if ($reqinfo->status == $pluginman::REQUIREMENT_STATUS_OK) {
$label = '';
$class = 'requires-ok text-muted';
$class = 'requires-ok';
} else if ($reqinfo->status == $pluginman::REQUIREMENT_STATUS_MISSING) {
if ($reqinfo->availability == $pluginman::REQUIREMENT_AVAILABLE) {
$label = html_writer::span(get_string('dependencymissing', 'core_plugin'), 'badge badge-warning');
$label .= ' '.html_writer::span(get_string('dependencyavailable', 'core_plugin'), 'badge badge-warning');
$label = html_writer::span(get_string('dependencymissing', 'core_plugin'), 'label label-warning');
$label .= ' '.html_writer::span(get_string('dependencyavailable', 'core_plugin'), 'label label-warning');
$class = 'requires-failed requires-missing requires-available';
$actions[] = html_writer::link(
new moodle_url('https://moodle.org/plugins/view.php', array('plugin' => $reqname)),
@@ -1500,24 +1365,24 @@ class core_admin_renderer extends plugin_renderer_base {
);
} else {
$label = html_writer::span(get_string('dependencymissing', 'core_plugin'), 'badge badge-danger');
$label = html_writer::span(get_string('dependencymissing', 'core_plugin'), 'label label-important');
$label .= ' '.html_writer::span(get_string('dependencyunavailable', 'core_plugin'),
'badge badge-danger');
'label label-important');
$class = 'requires-failed requires-missing requires-unavailable';
}
$displayuploadlink = true;
} else if ($reqinfo->status == $pluginman::REQUIREMENT_STATUS_OUTDATED) {
if ($reqinfo->availability == $pluginman::REQUIREMENT_AVAILABLE) {
$label = html_writer::span(get_string('dependencyfails', 'core_plugin'), 'badge badge-warning');
$label .= ' '.html_writer::span(get_string('dependencyavailable', 'core_plugin'), 'badge badge-warning');
$label = html_writer::span(get_string('dependencyfails', 'core_plugin'), 'label label-warning');
$label .= ' '.html_writer::span(get_string('dependencyavailable', 'core_plugin'), 'label label-warning');
$class = 'requires-failed requires-outdated requires-available';
$displayupdateslink = true;
} else {
$label = html_writer::span(get_string('dependencyfails', 'core_plugin'), 'badge badge-danger');
$label = html_writer::span(get_string('dependencyfails', 'core_plugin'), 'label label-important');
$label .= ' '.html_writer::span(get_string('dependencyunavailable', 'core_plugin'),
'badge badge-danger');
'label label-important');
$class = 'requires-failed requires-outdated requires-unavailable';
}
$displayuploadlink = true;
@@ -1541,14 +1406,13 @@ class core_admin_renderer extends plugin_renderer_base {
return '';
}
$out = html_writer::tag('ul', implode("\n", $requires), array('class' => 'm-0'));
$out = html_writer::tag('ul', implode("\n", $requires));
if ($displayuploadlink) {
$out .= html_writer::div(
html_writer::link(
new moodle_url('/admin/tool/installaddon/'),
get_string('dependencyuploadmissing', 'core_plugin'),
array('class' => 'btn btn-secondary btn-sm m-1')
get_string('dependencyuploadmissing', 'core_plugin')
),
'dependencyuploadmissing'
);
@@ -1558,8 +1422,7 @@ class core_admin_renderer extends plugin_renderer_base {
$out .= html_writer::div(
html_writer::link(
new moodle_url($this->page->url, array('sesskey' => sesskey(), 'fetchupdates' => 1)),
get_string('checkforupdates', 'core_plugin'),
array('class' => 'btn btn-secondary btn-sm m-1')
get_string('checkforupdates', 'core_plugin')
),
'checkforupdates'
);
@@ -1735,10 +1598,10 @@ class core_admin_renderer extends plugin_renderer_base {
$row = new html_table_row();
$row->attributes['class'] = 'type-' . $plugin->type . ' name-' . $plugin->type . '_' . $plugin->name;
if ($this->page->theme->resolve_image_location('icon', $plugin->type . '_' . $plugin->name, null)) {
if ($this->page->theme->resolve_image_location('icon', $plugin->type . '_' . $plugin->name)) {
$icon = $this->output->pix_icon('icon', '', $plugin->type . '_' . $plugin->name, array('class' => 'icon pluginicon'));
} else {
$icon = $this->output->spacer();
$icon = $this->output->pix_icon('spacer', '', 'moodle', array('class' => 'icon pluginicon noicon'));
}
$status = $plugin->get_status();
$row->attributes['class'] .= ' status-'.$status;
@@ -1783,13 +1646,13 @@ class core_admin_renderer extends plugin_renderer_base {
$source = '';
} else {
$row->attributes['class'] .= ' extension';
$source = html_writer::div(get_string('sourceext', 'core_plugin'), 'source badge badge-info');
$source = html_writer::div(get_string('sourceext', 'core_plugin'), 'source label label-info');
}
if ($status === core_plugin_manager::PLUGIN_STATUS_MISSING) {
$msg = html_writer::div(get_string('status_missing', 'core_plugin'), 'statusmsg badge badge-danger');
$msg = html_writer::div(get_string('status_missing', 'core_plugin'), 'statusmsg label label-important');
} else if ($status === core_plugin_manager::PLUGIN_STATUS_NEW) {
$msg = html_writer::div(get_string('status_new', 'core_plugin'), 'statusmsg badge badge-success');
$msg = html_writer::div(get_string('status_new', 'core_plugin'), 'statusmsg label label-success');
} else {
$msg = '';
}
@@ -2020,23 +1883,16 @@ class core_admin_renderer extends plugin_renderer_base {
if (empty($CFG->docroot) or $environment_result->plugin) {
$report = get_string($stringtouse, 'admin', $rec);
} else {
$report = $this->doc_link(join('/', $linkparts), get_string($stringtouse, 'admin', $rec), true);
$report = $this->doc_link(join($linkparts, '/'), get_string($stringtouse, 'admin', $rec));
}
// Enclose report text in div so feedback text will be displayed underneath it.
$report = html_writer::div($report);
// Format error or warning line
if ($errorline) {
$messagetype = 'error';
$statusclass = 'badge-danger';
} else if ($warningline) {
$messagetype = 'warn';
$statusclass = 'badge-warning';
if ($errorline || $warningline) {
$messagetype = $errorline? 'error':'warn';
} else {
$messagetype = 'ok';
$statusclass = 'badge-success';
}
$status = html_writer::span($status, 'badge ' . $statusclass);
$status = '<span class="'.$messagetype.'">'.$status.'</span>';
// Here we'll store all the feedback found
$feedbacktext = '';
// Append the feedback if there is some
@@ -2114,34 +1970,4 @@ class core_admin_renderer extends plugin_renderer_base {
return $this->warning(get_string('legacylogginginuse'));
}
}
/**
* Display message about the benefits of registering on Moodle.org
*
* @return string
*/
public function moodleorg_registration_message() {
$out = format_text(get_string('registerwithmoodleorginfo', 'core_hub'), FORMAT_MARKDOWN);
$out .= html_writer::link(
new moodle_url('/admin/settings.php', ['section' => 'moodleservices']),
$this->output->pix_icon('i/info', '').' '.get_string('registerwithmoodleorginfoapp', 'core_hub'),
['class' => 'btn btn-link', 'role' => 'opener', 'target' => '_href']
);
$out .= html_writer::link(
HUB_MOODLEORGHUBURL,
$this->output->pix_icon('i/stats', '').' '.get_string('registerwithmoodleorginfostats', 'core_hub'),
['class' => 'btn btn-link', 'role' => 'opener', 'target' => '_href']
);
$out .= html_writer::link(
HUB_MOODLEORGHUBURL.'/sites',
$this->output->pix_icon('i/location', '').' '.get_string('registerwithmoodleorginfosites', 'core_hub'),
['class' => 'btn btn-link', 'role' => 'opener', 'target' => '_href']
);
return $this->output->box($out);
}
}
+1 -1
View File
@@ -27,7 +27,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(__DIR__ . '/../config.php');
require_once(dirname(__FILE__) . '/../config.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->libdir.'/tablelib.php');
+6 -5
View File
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
require_once(__DIR__ . '/../config.php');
require_once(dirname(dirname(__FILE__)) . '/config.php');
require_once($CFG->dirroot . '/repository/lib.php');
require_once($CFG->libdir . '/adminlib.php');
@@ -47,6 +47,7 @@ if ($action == 'newon') {
$visible = false;
}
require_capability('moodle/site:config', context_system::instance());
admin_externalpage_setup($pagename);
$sesskeyurl = $CFG->wwwroot.'/'.$CFG->admin.'/repository.php?sesskey=' . sesskey();
@@ -123,13 +124,13 @@ if (($action == 'edit') || ($action == 'new')) {
}
$instanceoptionnames = repository::static_function($repository, 'get_instance_option_names');
if (!empty($instanceoptionnames)) {
if (property_exists($fromform, 'enablecourseinstances')) {
if (array_key_exists('enablecourseinstances', $fromform)) {
$settings['enablecourseinstances'] = $fromform->enablecourseinstances;
}
else {
$settings['enablecourseinstances'] = 0;
}
if (property_exists($fromform, 'enableuserinstances')) {
if (array_key_exists('enableuserinstances', $fromform)) {
$settings['enableuserinstances'] = $fromform->enableuserinstances;
}
else {
@@ -369,14 +370,14 @@ if (($action == 'edit') || ($action == 'new')) {
if ($updowncount > 1) {
$updown .= "<a href=\"$sesskeyurl&amp;action=moveup&amp;repos=".$typename."\">";
$updown .= $OUTPUT->pix_icon('t/up', get_string('moveup')) . "</a>&nbsp;";
$updown .= "<img src=\"" . $OUTPUT->pix_url('t/up') . "\" alt=\"up\" /></a>&nbsp;";
}
else {
$updown .= $spacer;
}
if ($updowncount < $totalrepositorytypes) {
$updown .= "<a href=\"$sesskeyurl&amp;action=movedown&amp;repos=".$typename."\">";
$updown .= $OUTPUT->pix_icon('t/down', get_string('movedown')) . "</a>&nbsp;";
$updown .= "<img src=\"" . $OUTPUT->pix_url('t/down') . "\" alt=\"down\" /></a>";
}
else {
$updown .= $spacer;
+2 -1
View File
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
require_once(__DIR__ . '/../config.php');
require_once(dirname(dirname(__FILE__)) . '/config.php');
require_once($CFG->dirroot . '/repository/lib.php');
require_once($CFG->libdir . '/adminlib.php');
@@ -42,6 +42,7 @@ if ($edit){
}
admin_externalpage_setup($pagename, '', null, new moodle_url('/admin/repositoryinstance.php'));
require_capability('moodle/site:config', $context);
$baseurl = new moodle_url("/$CFG->admin/repositoryinstance.php", array('sesskey'=>sesskey()));
+1 -1
View File
@@ -23,7 +23,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require(__DIR__ . '/../config.php');
require(dirname(dirname(__FILE__)) . '/config.php');
require_once($CFG->libdir.'/adminlib.php');
admin_externalpage_setup('resetemoticons');
+8 -31
View File
@@ -36,12 +36,15 @@ if (!is_siteadmin()) {
}
$admisselector = new core_role_admins_existing_selector();
$admisselector->set_extra_fields(array('username', 'email'));
$potentialadmisselector = new core_role_admins_potential_selector();
$potentialadmisselector->set_extra_fields(array('username', 'email'));
if (optional_param('add', false, PARAM_BOOL) and confirm_sesskey()) {
if ($userstoadd = $potentialadmisselector->get_selected_users()) {
$user = reset($userstoadd);
$username = $potentialadmisselector->output_user($user);
$username = fullname($user) . " ($user->username, $user->email)";
echo $OUTPUT->header();
$yesurl = new moodle_url('/admin/roles/admins.php', array('confirmadd'=>$user->id, 'sesskey'=>sesskey()));
echo $OUTPUT->confirm(get_string('confirmaddadmin', 'core_role', $username), $yesurl, $PAGE->url);
@@ -55,7 +58,7 @@ if (optional_param('add', false, PARAM_BOOL) and confirm_sesskey()) {
if ($USER->id == $user->id) {
// Can not remove self.
} else {
$username = $admisselector->output_user($user);
$username = fullname($user) . " ($user->username, $user->email)";
echo $OUTPUT->header();
$yesurl = new moodle_url('/admin/roles/admins.php', array('confirmdel'=>$user->id, 'sesskey'=>sesskey()));
echo $OUTPUT->confirm(get_string('confirmdeladmin', 'core_role', $username), $yesurl, $PAGE->url);
@@ -77,16 +80,9 @@ if (optional_param('add', false, PARAM_BOOL) and confirm_sesskey()) {
}
if (isset($admins[$newmain])) {
$logstringold = implode(', ', $admins);
unset($admins[$newmain]);
array_unshift($admins, $newmain);
$logstringnew = implode(', ', $admins);
set_config('siteadmins', implode(',', $admins));
add_to_config_log('siteadmins', $logstringold, $logstringnew, null);
redirect($PAGE->url);
}
}
@@ -99,16 +95,8 @@ if (optional_param('add', false, PARAM_BOOL) and confirm_sesskey()) {
$admins[$admin] = $admin;
}
}
$logstringold = implode(', ', $admins);
$admins[$confirmadd] = $confirmadd;
$logstringnew = implode(', ', $admins);
set_config('siteadmins', implode(',', $admins));
add_to_config_log('siteadmins', $logstringold, $logstringnew, 'core');
redirect($PAGE->url);
} else if ($confirmdel and confirm_sesskey() and $confirmdel != $USER->id) {
@@ -119,16 +107,8 @@ if (optional_param('add', false, PARAM_BOOL) and confirm_sesskey()) {
$admins[$admin] = $admin;
}
}
$logstringold = implode(', ', $admins);
unset($admins[$confirmdel]);
$logstringnew = implode(', ', $admins);
set_config('siteadmins', implode(',', $admins));
add_to_config_log('siteadmins', $logstringold, $logstringnew, 'core');
redirect($PAGE->url);
}
@@ -153,12 +133,9 @@ echo $OUTPUT->header();
</td>
<td id="buttonscell">
<p class="arrow_button">
<input name="add" id="add" type="submit" value="<?php echo $OUTPUT->larrow().'&nbsp;'.get_string('add'); ?>"
title="<?php print_string('add'); ?>" class="btn btn-secondary"/><br />
<input name="remove" id="remove" type="submit" value="<?php echo get_string('remove').'&nbsp;'.$OUTPUT->rarrow(); ?>"
title="<?php print_string('remove'); ?>" class="btn btn-secondary"/><br />
<input name="main" id="main" type="submit" value="<?php echo get_string('mainadminset', 'core_role'); ?>"
title="<?php print_string('mainadminset', 'core_role'); ?>" class="btn btn-secondary"/>
<input name="add" id="add" type="submit" value="<?php echo $OUTPUT->larrow().'&nbsp;'.get_string('add'); ?>" title="<?php print_string('add'); ?>" /><br />
<input name="remove" id="remove" type="submit" value="<?php echo get_string('remove').'&nbsp;'.$OUTPUT->rarrow(); ?>" title="<?php print_string('remove'); ?>" />
<input name="main" id="main" type="submit" value="<?php echo get_string('mainadminset', 'core_role'); ?>" title="<?php print_string('mainadminset', 'core_role'); ?>" />
</p>
</td>
<td id="potentialcell">
+20 -5
View File
@@ -22,15 +22,14 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(__DIR__ . '/../../config.php');
require_once(dirname(__FILE__) . '/../../config.php');
require_once($CFG->libdir . '/adminlib.php');
$mode = required_param('mode', PARAM_ALPHANUMEXT);
$classformode = array(
'assign' => 'core_role_allow_assign_page',
'override' => 'core_role_allow_override_page',
'switch' => 'core_role_allow_switch_page',
'view' => 'core_role_allow_view_page'
'switch' => 'core_role_allow_switch_page'
);
if (!isset($classformode[$mode])) {
print_error('invalidmode', '', '', $mode);
@@ -46,6 +45,23 @@ $controller = new $classformode[$mode]();
if (optional_param('submit', false, PARAM_BOOL) && data_submitted() && confirm_sesskey()) {
$controller->process_submission();
$syscontext->mark_dirty();
$event = null;
// Create event depending on mode.
switch ($mode) {
case 'assign':
$event = \core\event\role_allow_assign_updated::create(array('context' => $syscontext));
break;
case 'override':
$event = \core\event\role_allow_override_updated::create(array('context' => $syscontext));
break;
case 'switch':
$event = \core\event\role_allow_switch_updated::create(array('context' => $syscontext));
break;
}
if ($event) {
$event->trigger();
}
redirect($baseurl);
}
@@ -64,8 +80,7 @@ echo $OUTPUT->box($controller->get_intro_text());
echo '<form action="' . $baseurl . '" method="post">';
echo '<input type="hidden" name="sesskey" value="' . sesskey() . '" />';
echo html_writer::table($table);
echo '<div class="buttons">';
echo '<input type="submit" class="btn btn-primary" name="submit" value="' . get_string('savechanges') . '"/>';
echo '<div class="buttons"><input type="submit" name="submit" value="'.get_string('savechanges').'"/>';
echo '</div></form>';
echo $OUTPUT->footer();
+25 -20
View File
@@ -29,7 +29,7 @@ define("MAX_USERS_TO_LIST_PER_ROLE", 10);
$contextid = required_param('contextid', PARAM_INT);
$roleid = optional_param('roleid', 0, PARAM_INT);
$returnurl = optional_param('returnurl', null, PARAM_LOCALURL);
$returnto = optional_param('return', null, PARAM_ALPHANUMEXT);
list($context, $course, $cm) = get_context_info_array($contextid);
@@ -53,13 +53,7 @@ if ($course) {
// Security.
require_login($course, false, $cm);
require_capability('moodle/role:assign', $context);
navigation_node::override_active_url($url);
$pageurl = new moodle_url($url);
if ($returnurl) {
$pageurl->param('returnurl', $returnurl);
}
$PAGE->set_url($pageurl);
$PAGE->set_url($url);
$PAGE->set_context($context);
$contextname = $context->get_context_name();
@@ -147,10 +141,6 @@ if (!empty($user) && ($user->id != $USER->id)) {
}
$PAGE->set_pagelayout('admin');
if ($context->contextlevel == CONTEXT_BLOCK) {
// Do not show blocks when changing block's settings, it is confusing.
$PAGE->blocks->show_only_fake_blocks(true);
}
$PAGE->set_title($title);
switch ($context->contextlevel) {
@@ -196,6 +186,9 @@ if ($roleid) {
// Print the form.
$assignurl = new moodle_url($PAGE->url, array('roleid'=>$roleid));
if ($returnto !== null) {
$assignurl->param('return', $returnto);
}
?>
<form id="assignform" method="post" action="<?php echo $assignurl ?>"><div>
<input type="hidden" name="sesskey" value="<?php echo sesskey() ?>" />
@@ -208,13 +201,11 @@ if ($roleid) {
</td>
<td id="buttonscell">
<div id="addcontrols">
<input name="add" id="add" type="submit" value="<?php echo $OUTPUT->larrow().'&nbsp;'.get_string('add'); ?>"
title="<?php print_string('add'); ?>" class="btn btn-secondary"/><br />
<input name="add" id="add" type="submit" value="<?php echo $OUTPUT->larrow().'&nbsp;'.get_string('add'); ?>" title="<?php print_string('add'); ?>" /><br />
</div>
<div id="removecontrols">
<input name="remove" id="remove" type="submit" value="<?php echo get_string('remove').'&nbsp;'.$OUTPUT->rarrow(); ?>"
title="<?php print_string('remove'); ?>" class="btn btn-secondary"/>
<input name="remove" id="remove" type="submit" value="<?php echo get_string('remove').'&nbsp;'.$OUTPUT->rarrow(); ?>" title="<?php print_string('remove'); ?>" />
</div>
</td>
<td id="potentialcell">
@@ -242,10 +233,18 @@ if ($roleid) {
// Print a form to swap roles, and a link back to the all roles list.
echo '<div class="backlink">';
$select = new single_select($PAGE->url, 'roleid', $nameswithcounts, $roleid, null);
$newroleurl = new moodle_url($PAGE->url);
if ($returnto !== null) {
$newroleurl->param('return', $returnto);
}
$select = new single_select($newroleurl, 'roleid', $nameswithcounts, $roleid, null);
$select->label = get_string('assignanotherrole', 'core_role');
echo $OUTPUT->render($select);
echo '<p><a href="' . $url . '">' . get_string('backtoallroles', 'core_role') . '</a></p>';
$backurl = new moodle_url('/admin/roles/assign.php', array('contextid' => $contextid));
if ($returnto !== null) {
$backurl->param('return', $returnto);
}
echo '<p><a href="' . $backurl->out() . '">' . get_string('backtoallroles', 'core_role') . '</a></p>';
echo '</div>';
} else if (empty($assignableroles)) {
@@ -283,6 +282,9 @@ if ($roleid) {
}
} else if ($assigncounts[$roleid] > MAX_USERS_TO_LIST_PER_ROLE) {
$assignurl = new moodle_url($PAGE->url, array('roleid'=>$roleid));
if ($returnto !== null) {
$assignurl->param('return', $returnto);
}
$roleholdernames[$roleid] = '<a href="'.$assignurl.'">'.$strmorethanmax.'</a>';
} else {
$roleholdernames[$roleid] = '';
@@ -303,6 +305,9 @@ if ($roleid) {
foreach ($assignableroles as $roleid => $rolename) {
$description = format_string($DB->get_field('role', 'description', array('id'=>$roleid)));
$assignurl = new moodle_url($PAGE->url, array('roleid'=>$roleid));
if ($returnto !== null) {
$assignurl->param('return', $returnto);
}
$row = array('<a href="'.$assignurl.'">'.$rolename.'</a>',
$description, $assigncounts[$roleid]);
if ($showroleholders) {
@@ -315,8 +320,8 @@ if ($roleid) {
if ($context->contextlevel > CONTEXT_USER) {
if ($returnurl) {
$url = new moodle_url($returnurl);
if ($context->contextlevel === CONTEXT_COURSECAT && $returnto === 'management') {
$url = new moodle_url('/course/management.php', array('categoryid' => $context->instanceid));
} else {
$url = $context->get_url();
}
+14 -22
View File
@@ -22,10 +22,9 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(__DIR__ . '/../../config.php');
require_once(dirname(__FILE__) . '/../../config.php');
$contextid = required_param('contextid', PARAM_INT);
$returnurl = optional_param('returnurl', null, PARAM_LOCALURL);
list($context, $course, $cm) = get_context_info_array($contextid);
@@ -50,13 +49,7 @@ require_login($course, false, $cm);
if (!has_any_capability(array('moodle/role:assign', 'moodle/role:safeoverride', 'moodle/role:override', 'moodle/role:manage'), $context)) {
print_error('nopermissions', 'error', '', get_string('checkpermissions', 'core_role'));
}
navigation_node::override_active_url($url);
$pageurl = new moodle_url($url);
if ($returnurl) {
$pageurl->param('returnurl', $returnurl);
}
$PAGE->set_url($pageurl);
$PAGE->set_url($url);
if ($context->contextlevel == CONTEXT_USER and $USER->id != $context->instanceid) {
$PAGE->navbar->includesettingsbase = true;
@@ -82,10 +75,6 @@ $userselector->set_rows(20);
$title = get_string('checkpermissionsin', 'core_role', $contextname);
$PAGE->set_pagelayout('admin');
if ($context->contextlevel == CONTEXT_BLOCK) {
// Do not show blocks when changing block's settings, it is confusing.
$PAGE->blocks->show_only_fake_blocks(true);
}
$PAGE->set_title($title);
switch ($context->contextlevel) {
@@ -167,27 +156,30 @@ if (!is_null($reportuser)) {
// Show UI for choosing a user to report on.
echo $OUTPUT->box_start('generalbox boxwidthnormal boxaligncenter', 'chooseuser');
echo '<form method="post" action="' . $PAGE->url . '" >';
echo '<form method="get" action="' . $CFG->wwwroot . '/' . $CFG->admin . '/roles/check.php" >';
// Hidden fields.
echo '<input type="hidden" name="contextid" value="' . $context->id . '" />';
if (!empty($user->id)) {
echo '<input type="hidden" name="userid" value="' . $user->id . '" />';
}
if ($isfrontpage) {
echo '<input type="hidden" name="courseid" value="' . $courseid . '" />';
}
// User selector.
echo $OUTPUT->heading('<label for="reportuser">' . $selectheading . '</label>', 3);
$userselector->display();
// Submit button and the end of the form.
echo '<p id="chooseusersubmit"><input type="submit" value="' . get_string('showthisuserspermissions', 'core_role') . '" ' .
'class="btn btn-primary"/></p>';
echo '<p id="chooseusersubmit"><input type="submit" value="' . get_string('showthisuserspermissions', 'core_role') . '" /></p>';
echo '</form>';
echo $OUTPUT->box_end();
// Appropriate back link.
if ($context->contextlevel > CONTEXT_USER) {
echo html_writer::start_tag('div', array('class'=>'backlink'));
if ($returnurl) {
$backurl = new moodle_url($returnurl);
} else {
$backurl = $context->get_url();
}
echo html_writer::link($backurl, get_string('backto', '', $contextname));
echo html_writer::tag('a', get_string('backto', '', $contextname), array('href'=>$context->get_url()));
echo html_writer::end_tag('div');
}
+1 -5
View File
@@ -33,7 +33,7 @@ class core_role_allow_assign_page extends core_role_allow_role_page {
}
protected function set_allow($fromroleid, $targetroleid) {
core_role_set_assign_allowed($fromroleid, $targetroleid);
allow_assign($fromroleid, $targetroleid);
}
protected function get_cell_tooltip($fromrole, $targetrole) {
@@ -46,8 +46,4 @@ class core_role_allow_assign_page extends core_role_allow_role_page {
public function get_intro_text() {
return get_string('configallowassign', 'core_admin');
}
protected function get_eventclass() {
return \core\event\role_allow_assign_updated::class;
}
}
+1 -5
View File
@@ -33,7 +33,7 @@ class core_role_allow_override_page extends core_role_allow_role_page {
}
protected function set_allow($fromroleid, $targetroleid) {
core_role_set_override_allowed($fromroleid, $targetroleid);
allow_override($fromroleid, $targetroleid);
}
protected function get_cell_tooltip($fromrole, $targetrole) {
@@ -46,8 +46,4 @@ class core_role_allow_override_page extends core_role_allow_role_page {
public function get_intro_text() {
return get_string('configallowoverride2', 'core_admin');
}
protected function get_eventclass() {
return \core\event\role_allow_override_updated::class;
}
}
-30
View File
@@ -59,36 +59,12 @@ abstract class core_role_allow_role_page {
*/
public function process_submission() {
global $DB;
$context = context_system::instance();
$this->load_current_settings();
// Delete all records, then add back the ones that should be allowed.
$DB->delete_records($this->tablename);
foreach ($this->roles as $fromroleid => $notused) {
foreach ($this->roles as $targetroleid => $alsonotused) {
$isallowed = $this->allowed[$fromroleid][$targetroleid];
if (optional_param('s_' . $fromroleid . '_' . $targetroleid, false, PARAM_BOOL)) {
$this->set_allow($fromroleid, $targetroleid);
// Only trigger events if this role allow relationship did not exist and the checkbox element
// has been submitted.
if (!$isallowed) {
$eventclass = $this->get_eventclass();
$eventclass::create([
'context' => $context,
'objectid' => $fromroleid,
'other' => ['targetroleid' => $targetroleid, 'allow' => true]
])->trigger();
}
} else if ($isallowed) {
// When the user has deselect an existing role allow checkbox but it is in the list of roles
// allowances.
$eventclass = $this->get_eventclass();
$eventclass::create([
'context' => $context,
'objectid' => $fromroleid,
'other' => ['targetroleid' => $targetroleid, 'allow' => false]
])->trigger();
}
}
}
@@ -185,10 +161,4 @@ abstract class core_role_allow_role_page {
* @return string
*/
public abstract function get_intro_text();
/**
* Returns the allow class respective event class name.
* @return string
*/
protected abstract function get_eventclass();
}
+1 -5
View File
@@ -41,7 +41,7 @@ class core_role_allow_switch_page extends core_role_allow_role_page {
}
protected function set_allow($fromroleid, $targetroleid) {
core_role_set_switch_allowed($fromroleid, $targetroleid);
allow_switch($fromroleid, $targetroleid);
}
protected function is_allowed_target($targetroleid) {
@@ -58,8 +58,4 @@ class core_role_allow_switch_page extends core_role_allow_role_page {
public function get_intro_text() {
return get_string('configallowswitch', 'core_admin');
}
protected function get_eventclass() {
return \core\event\role_allow_switch_updated::class;
}
}
-81
View File
@@ -1,81 +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/>.
/**
* Role view matrix.
*
* @package core_role
* @copyright 2016 onwards Andrew Hancox <andrewdchancox@googlemail.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Subclass of role_allow_role_page for the Allow views tab.
*
* @package core_role
* @copyright 2016 onwards Andrew Hancox <andrewdchancox@googlemail.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class core_role_allow_view_page extends core_role_allow_role_page {
/** @var array */
protected $allowedtargetroles;
/**
* core_role_allow_view_page constructor.
*/
public function __construct() {
parent::__construct('role_allow_view', 'allowview');
}
/**
* Allow from role to view target role.
* @param int $fromroleid
* @param int $targetroleid
*/
protected function set_allow($fromroleid, $targetroleid) {
core_role_set_view_allowed($fromroleid, $targetroleid);
}
/**
* Get tool tip for cell.
* @param string $fromrole
* @param string $targetrole
* @return string
* @throws \coding_exception
*/
protected function get_cell_tooltip($fromrole, $targetrole) {
$a = new stdClass;
$a->fromrole = $fromrole->localname;
$a->targetrole = $targetrole->localname;
return get_string('allowroletoview', 'core_role', $a);
}
/**
* Get intro text for role allow view page.
* @return string
* @throws \coding_exception
*/
public function get_intro_text() {
return get_string('configallowview', 'core_admin');
}
protected function get_eventclass() {
return \core\event\role_allow_view_updated::class;
}
}
@@ -123,6 +123,9 @@ abstract class core_role_capability_table_with_risks extends core_role_capabilit
assign_capability($changedcap, $this->permissions[$changedcap],
$this->roleid, $this->context->id, true);
}
// Force accessinfo refresh for users visiting this context.
$this->context->mark_dirty();
}
public function display() {
@@ -180,14 +183,10 @@ abstract class core_role_capability_table_with_risks extends core_role_capabilit
public function get_risk_icon($type) {
global $OUTPUT;
$alt = get_string("{$type}short", "admin");
$title = get_string($type, "admin");
$text = $OUTPUT->pix_icon('i/' . str_replace('risk', 'risk_', $type), $alt, 'moodle', [
'title' => $title,
]);
$iconurl = $OUTPUT->pix_url('i/' . str_replace('risk', 'risk_', $type));
$text = '<img src="' . $iconurl . '" alt="' . get_string($type . 'short', 'admin') . '" />';
$action = new popup_action('click', $this->risksurl, 'docspopup');
$riskicon = $OUTPUT->action_link($this->risksurl, $text, $action);
$riskicon = $OUTPUT->action_link($this->risksurl, $text, $action, array('title'=>get_string($type, 'admin')));
return $riskicon;
}
+2 -5
View File
@@ -69,11 +69,8 @@ class core_role_check_users_selector extends user_selector_base {
if ($coursecontext and $coursecontext != SITEID) {
$sql1 = " FROM {user} u
JOIN (SELECT DISTINCT subu.id
FROM {user} subu
JOIN {user_enrolments} ue ON (ue.userid = subu.id)
JOIN {enrol} e ON (e.id = ue.enrolid AND e.courseid = :courseid1)
) subq ON subq.id = u.id
JOIN {user_enrolments} ue ON (ue.userid = u.id)
JOIN {enrol} e ON (e.id = ue.enrolid AND e.courseid = :courseid1)
WHERE $wherecondition";
$params['courseid1'] = $coursecontext->instanceid;
@@ -42,7 +42,6 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
protected $allowassign;
protected $allowoverride;
protected $allowswitch;
protected $allowview;
public function __construct($context, $roleid) {
$this->roleid = $roleid;
@@ -73,7 +72,6 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
$this->allowassign = array_keys($this->get_allow_roles_list('assign'));
$this->allowoverride = array_keys($this->get_allow_roles_list('override'));
$this->allowswitch = array_keys($this->get_allow_roles_list('switch'));
$this->allowview = array_keys($this->get_allow_roles_list('view'));
} else {
$this->role = new stdClass;
@@ -85,7 +83,6 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
$this->allowassign = array();
$this->allowoverride = array();
$this->allowswitch = array();
$this->allowview = array();
}
parent::load_current_permissions();
}
@@ -103,8 +100,6 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
$this->role->shortname = core_text::strtolower(clean_param($this->role->shortname, PARAM_ALPHANUMEXT));
if (empty($this->role->shortname)) {
$this->errors['shortname'] = get_string('errorbadroleshortname', 'core_role');
} else if (core_text::strlen($this->role->shortname) > 100) { // Check if it exceeds the max of 100 characters.
$this->errors['shortname'] = get_string('errorroleshortnametoolong', 'core_role');
}
}
if ($DB->record_exists_select('role', 'shortname = ? and id <> ?', array($this->role->shortname, $this->roleid))) {
@@ -157,19 +152,15 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
// Allowed roles.
$allow = optional_param_array('allowassign', null, PARAM_INT);
if (!is_null($allow)) {
$this->allowassign = array_filter($allow);
$this->allowassign = $allow;
}
$allow = optional_param_array('allowoverride', null, PARAM_INT);
if (!is_null($allow)) {
$this->allowoverride = array_filter($allow);
$this->allowoverride = $allow;
}
$allow = optional_param_array('allowswitch', null, PARAM_INT);
if (!is_null($allow)) {
$this->allowswitch = array_filter($allow);
}
$allow = optional_param_array('allowview', null, PARAM_INT);
if (!is_null($allow)) {
$this->allowview = array_filter($allow);
$this->allowswitch = $allow;
}
// Now read the permissions for each capability.
@@ -187,8 +178,7 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
* @param int $roleid role id or 0 for no role
* @param array $options array with following keys:
* 'name', 'shortname', 'description', 'permissions', 'archetype',
* 'contextlevels', 'allowassign', 'allowoverride', 'allowswitch',
* 'allowview'
* 'contextlevels', 'allowassign', 'allowoverride', 'allowswitch'
*/
public function force_duplicate($roleid, array $options) {
global $DB;
@@ -225,9 +215,6 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
if ($options['allowswitch']) {
$this->allowswitch = array();
}
if ($options['allowview']) {
$this->allowview = array();
}
if ($options['permissions']) {
foreach ($this->capabilities as $capid => $cap) {
@@ -273,9 +260,6 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
if ($options['allowswitch']) {
$this->allowswitch = array_keys($this->get_allow_roles_list('switch', $roleid));
}
if ($options['allowview']) {
$this->allowview = array_keys($this->get_allow_roles_list('view', $roleid));
}
if ($options['permissions']) {
$this->permissions = $DB->get_records_menu('role_capabilities',
@@ -296,8 +280,7 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
* @param string $archetype
* @param array $options array with following keys:
* 'name', 'shortname', 'description', 'permissions', 'archetype',
* 'contextlevels', 'allowassign', 'allowoverride', 'allowswitch',
* 'allowview'
* 'contextlevels', 'allowassign', 'allowoverride', 'allowswitch'
*/
public function force_archetype($archetype, array $options) {
$archetypes = get_role_archetypes();
@@ -338,9 +321,6 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
if ($options['allowswitch']) {
$this->allowswitch = get_default_role_archetype_allows('switch', $archetype);
}
if ($options['allowview']) {
$this->allowview = get_default_role_archetype_allows('view', $archetype);
}
if ($options['permissions']) {
$defaultpermissions = get_default_capabilities($archetype);
@@ -360,8 +340,7 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
* @param string $xml
* @param array $options array with following keys:
* 'name', 'shortname', 'description', 'permissions', 'archetype',
* 'contextlevels', 'allowassign', 'allowoverride', 'allowswitch',
* 'allowview'
* 'contextlevels', 'allowassign', 'allowoverride', 'allowswitch'
*/
public function force_preset($xml, array $options) {
if (!$info = core_role_preset::parse_preset($xml)) {
@@ -398,7 +377,7 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
}
}
foreach (array('assign', 'override', 'switch', 'view') as $type) {
foreach (array('assign', 'override', 'switch') as $type) {
if ($options['allow'.$type]) {
if (isset($info['allow'.$type])) {
$this->{'allow'.$type} = $info['allow'.$type];
@@ -434,7 +413,7 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
}
public function save_changes() {
global $DB, $USER;
global $DB, $CFG;
if (!$this->roleid) {
// Creating role.
@@ -444,25 +423,12 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
// Updating role.
$DB->update_record('role', $this->role);
// Trigger role updated event.
\core\event\role_updated::create([
'userid' => $USER->id,
'objectid' => $this->role->id,
'context' => $this->context,
'other' => [
'name' => $this->role->name,
'shortname' => $this->role->shortname,
'description' => $this->role->description,
'archetype' => $this->role->archetype,
'contextlevels' => $this->contextlevels
]
])->trigger();
// This will ensure the course contacts cache is purged so name changes get updated in
// the UI. It would be better to do this only when we know that fields affected are
// updated. But thats getting into the weeds of the coursecat cache and role edits
// should not be that frequent, so here is the ugly brutal approach.
core_course_category::role_assignment_changed($this->role->id, context_system::instance());
require_once($CFG->libdir . '/coursecatlib.php');
coursecat::role_assignment_changed($this->role->id, context_system::instance());
}
// Assignable contexts.
@@ -472,7 +438,6 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
$this->save_allow('assign');
$this->save_allow('override');
$this->save_allow('switch');
$this->save_allow('view');
// Permissions.
parent::save_changes();
@@ -484,20 +449,13 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
$current = array_keys($this->get_allow_roles_list($type));
$wanted = $this->{'allow'.$type};
$addfunction = "core_role_set_{$type}_allowed";
$addfunction = 'allow_'.$type;
$deltable = 'role_allow_'.$type;
$field = 'allow'.$type;
$eventclass = "\\core\\event\\role_allow_" . $type . "_updated";
$context = context_system::instance();
foreach ($current as $roleid) {
if (!in_array($roleid, $wanted)) {
$DB->delete_records($deltable, array('roleid'=>$this->roleid, $field=>$roleid));
$eventclass::create([
'context' => $context,
'objectid' => $this->roleid,
'other' => ['targetroleid' => $roleid, 'allow' => false]
])->trigger();
continue;
}
$key = array_search($roleid, $wanted);
@@ -509,29 +467,19 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
$roleid = $this->roleid;
}
$addfunction($this->roleid, $roleid);
if (in_array($roleid, $wanted)) {
$eventclass::create([
'context' => $context,
'objectid' => $this->roleid,
'other' => ['targetroleid' => $roleid, 'allow' => true]
])->trigger();
}
}
}
protected function get_name_field($id) {
return '<input type="text" id="' . $id . '" name="' . $id . '" maxlength="254" value="' . s($this->role->name) . '"' .
' class="form-control"/>';
return '<input type="text" id="' . $id . '" name="' . $id . '" maxlength="254" value="' . s($this->role->name) . '" />';
}
protected function get_shortname_field($id) {
return '<input type="text" id="' . $id . '" name="' . $id . '" maxlength="100" value="' . s($this->role->shortname) . '"' .
' class="form-control"/>';
return '<input type="text" id="' . $id . '" name="' . $id . '" maxlength="254" value="' . s($this->role->shortname) . '" />';
}
protected function get_description_field($id) {
return '<textarea class="form-textarea form-control" id="'. s($id) .'" name="description" rows="10" cols="50">' .
return '<textarea class="form-textarea" id="'. s($id) .'" name="description" rows="10" cols="50">' .
htmlspecialchars($this->role->description) .
'</textarea>';
}
@@ -542,8 +490,7 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
foreach (get_role_archetypes() as $type) {
$options[$type] = get_string('archetype'.$type, 'role');
}
return html_writer::select($options, 'archetype', $this->role->archetype, false,
array('class' => 'custom-select'));
return html_writer::select($options, 'archetype', $this->role->archetype, false);
}
protected function get_assignable_levels_control() {
@@ -556,11 +503,9 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
if (!$this->disabled) {
$output .= '<input type="hidden" name="contextlevel' . $cl . '" value="0" />';
}
$output .= '<div class="form-check justify-content-start w-100">';
$output .= '<input class="form-check-input" type="checkbox" id="cl' . $cl . '" name="contextlevel' . $cl .
$output .= '<input type="checkbox" id="cl' . $cl . '" name="contextlevel' . $cl .
'" value="1" ' . $extraarguments . '/> ';
$output .= '<label class="form-check-label" for="cl' . $cl . '">' . $clname . "</label>\n";
$output .= '</div>';
$output .= '<label for="cl' . $cl . '">' . $clname . "</label><br />\n";
}
return $output;
}
@@ -575,7 +520,7 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
protected function get_allow_roles_list($type, $roleid = null) {
global $DB;
if ($type !== 'assign' and $type !== 'switch' and $type !== 'override' and $type !== 'view') {
if ($type !== 'assign' and $type !== 'switch' and $type !== 'override') {
debugging('Invalid role allowed type specified', DEBUG_DEVELOPER);
return array();
}
@@ -599,11 +544,11 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
/**
* Returns an array of roles with the allowed type.
*
* @param string $type Must be one of: assign, switch, override or view.
* @param string $type Must be one of: assign, switch, or override.
* @return array Am array of role names with the allowed type
*/
protected function get_allow_role_control($type) {
if ($type !== 'assign' and $type !== 'switch' and $type !== 'override' and $type !== 'view') {
if ($type !== 'assign' and $type !== 'switch' and $type !== 'override') {
debugging('Invalid role allowed type specified', DEBUG_DEVELOPER);
return '';
}
@@ -618,10 +563,7 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
if ($this->roleid == 0) {
$options[-1] = get_string('thisnewrole', 'core_role');
}
return
html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'allow'.$type.'[]', 'value' => "")) .
html_writer::select($options, 'allow'.$type.'[]', $selected, false, array('multiple' => 'multiple',
'size' => 10, 'class' => 'form-control'));
return html_writer::select($options, 'allow'.$type.'[]', $selected, false, array('multiple'=>'multiple', 'size'=>10));
}
/**
@@ -633,19 +575,11 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
return '';
}
/**
* Print labels, fields and help icon on role administration page.
*
* @param string $name The field name.
* @param string $caption The field caption.
* @param string $field The field type.
* @param null|string $helpicon The help icon content.
*/
protected function print_field($name, $caption, $field, $helpicon = null) {
protected function print_field($name, $caption, $field) {
global $OUTPUT;
// Attempt to generate HTML like formslib.
echo '<div class="fitem row form-group">';
echo '<div class="fitemtitle col-md-3">';
echo '<div class="fitem">';
echo '<div class="fitemtitle">';
if ($name) {
echo '<label for="' . $name . '">';
}
@@ -653,16 +587,13 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
if ($name) {
echo "</label>\n";
}
if ($helpicon) {
echo '<span class="float-sm-right text-nowrap">'.$helpicon.'</span>';
}
echo '</div>';
if (isset($this->errors[$name])) {
$extraclass = ' error';
} else {
$extraclass = '';
}
echo '<div class="felement col-md-9 form-inline' . $extraclass . '">';
echo '<div class="felement' . $extraclass . '">';
echo $field;
if (isset($this->errors[$name])) {
echo $OUTPUT->error_text($this->errors[$name]);
@@ -674,8 +605,7 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
protected function print_show_hide_advanced_button() {
echo '<p class="definenotice">' . get_string('highlightedcellsshowdefault', 'core_role') . ' </p>';
echo '<div class="advancedbutton">';
echo '<input type="submit" class="btn btn-secondary" name="toggleadvanced" value="' .
get_string('hideadvanced', 'form') . '" />';
echo '<input type="submit" name="toggleadvanced" value="' . get_string('hideadvanced', 'form') . '" />';
echo '</div>';
}
@@ -683,19 +613,15 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
global $OUTPUT;
// Extra fields at the top of the page.
echo '<div class="topfields clearfix">';
$this->print_field('shortname', get_string('roleshortname', 'core_role'),
$this->get_shortname_field('shortname'), $OUTPUT->help_icon('roleshortname', 'core_role'));
$this->print_field('name', get_string('customrolename', 'core_role'), $this->get_name_field('name'),
$OUTPUT->help_icon('customrolename', 'core_role'));
$this->print_field('edit-description', get_string('customroledescription', 'core_role'),
$this->get_description_field('description'), $OUTPUT->help_icon('customroledescription', 'core_role'));
$this->print_field('menuarchetype', get_string('archetype', 'core_role'), $this->get_archetype_field('archetype'),
$OUTPUT->help_icon('archetype', 'core_role'));
$this->print_field('shortname', get_string('roleshortname', 'core_role').'&nbsp;'.$OUTPUT->help_icon('roleshortname', 'core_role'), $this->get_shortname_field('shortname'));
$this->print_field('name', get_string('customrolename', 'core_role').'&nbsp;'.$OUTPUT->help_icon('customrolename', 'core_role'), $this->get_name_field('name'));
$this->print_field('edit-description', get_string('customroledescription', 'core_role').'&nbsp;'.$OUTPUT->help_icon('customroledescription', 'core_role'),
$this->get_description_field('description'));
$this->print_field('menuarchetype', get_string('archetype', 'core_role').'&nbsp;'.$OUTPUT->help_icon('archetype', 'core_role'), $this->get_archetype_field('archetype'));
$this->print_field('', get_string('maybeassignedin', 'core_role'), $this->get_assignable_levels_control());
$this->print_field('menuallowassign', get_string('allowassign', 'core_role'), $this->get_allow_role_control('assign'));
$this->print_field('menuallowoverride', get_string('allowoverride', 'core_role'), $this->get_allow_role_control('override'));
$this->print_field('menuallowswitch', get_string('allowswitch', 'core_role'), $this->get_allow_role_control('switch'));
$this->print_field('menuallowview', get_string('allowview', 'core_role'), $this->get_allow_role_control('view'));
if ($risks = $this->get_role_risks_info()) {
$this->print_field('', get_string('rolerisks', 'core_role'), $risks);
}
@@ -37,8 +37,7 @@ class core_role_define_role_table_basic extends core_role_define_role_table_adva
protected function print_show_hide_advanced_button() {
echo '<div class="advancedbutton">';
echo '<input type="submit" class="btn btn-secondary" name="toggleadvanced"
value="' . get_string('showadvanced', 'form') . '" />';
echo '<input type="submit" name="toggleadvanced" value="' . get_string('showadvanced', 'form') . '" />';
echo '</div>';
}

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