Compare commits

..

1018 Commits

Author SHA1 Message Date
Eloy Lafuente (stronk7) de572fbf03 Moodle release 3.1.3 2016-11-12 20:21:36 +01: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
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
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
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
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
John Beedell e251d9fe45 MDL-54986 Quiz: Disable add button for quiz with attempts 2016-11-02 17:25:54 +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
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
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
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
15299 changed files with 451774 additions and 1578774 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/
+17
View File
@@ -0,0 +1,17 @@
*/**/yui/src/*/meta/
*/**/build/
node_modules/
vendor/
lib/editor/atto/yui/src/rangy/js/
lib/editor/tinymce/plugins/pdw/tinymce/
lib/editor/tinymce/tiny_mce/
lib/requirejs/
lib/yuilib/
lib/jquery/
lib/htmlpurifier/
lib/flowplayer/
lib/xhprof/
lib/amd/src/loglevel.js
lib/amd/src/mustache.js
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", "jsdoc.conf.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'
}
}
]
}
}
-24
View File
@@ -1,24 +0,0 @@
{
"indentation": ["on",{
"Feature": 0,
"Background": 2,
"Scenario": 2,
"Examples": 4,
"example": 6,
"Step": 4,
"given": 4,
"and": 4
}],
"no-dupe-feature-names": "on",
"no-dupe-scenario-names": "off",
"no-empty-file": "on",
"no-files-without-scenarios": "on",
"no-multiple-empty-lines": "on",
"no-partially-commented-tag-lines": "on",
"no-trailing-spaces": "on",
"no-unnamed-features": "on",
"no-unnamed-scenarios": "on",
"no-scenario-outlines-without-examples": "on",
"no-examples-in-scenarios": "on",
"new-line-at-eof": ["on", "yes"]
}
+2 -1
View File
@@ -1,3 +1,4 @@
**/yui/build/** -diff
**/amd/build/** -diff
lib/dml/oci_native_moodle_package.sql text eol=lf
theme/bootstrapbase/style/editor.css -diff
theme/bootstrapbase/style/moodle.css -diff
-2
View File
@@ -1,2 +0,0 @@
# Primary donations pages.
custom: ["https://moodle.com/donations/", moodle.org]
-71
View File
@@ -1,71 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Template configuraton file for github actions CI/CD.
*
* @package core
* @copyright 2020 onwards Eloy Lafuente (stronk7) {@link https://stronk7.com}
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
// This cannot be used out from a github actions workflow, so just exit.
getenv('GITHUB_WORKFLOW') || die; // phpcs:ignore moodle.Files.MoodleInternal.MoodleInternalGlobalState
unset($CFG);
global $CFG;
$CFG = new stdClass();
$CFG->dbtype = getenv('dbtype');
$CFG->dblibrary = 'native';
$CFG->dbhost = '127.0.0.1';
$CFG->dbname = 'test';
$CFG->dbuser = 'test';
$CFG->dbpass = 'test';
$CFG->prefix = 'm_';
$CFG->dboptions = ['dbcollation' => 'utf8mb4_bin'];
$host = 'localhost';
$CFG->wwwroot = "http://{$host}";
$CFG->dataroot = realpath(dirname(__DIR__)) . '/moodledata';
$CFG->admin = 'admin';
$CFG->directorypermissions = 0777;
// Debug options - possible to be controlled by flag in future.
$CFG->debug = (E_ALL | E_STRICT); // DEBUG_DEVELOPER.
$CFG->debugdisplay = 1;
$CFG->debugstringids = 1; // Add strings=1 to url to get string ids.
$CFG->perfdebug = 15;
$CFG->debugpageinfo = 1;
$CFG->allowthemechangeonurl = 1;
$CFG->passwordpolicy = 0;
$CFG->cronclionly = 0;
$CFG->pathtophp = getenv('pathtophp');
$CFG->phpunit_dataroot = realpath(dirname(__DIR__)) . '/phpunitdata';
$CFG->phpunit_prefix = 't_';
define('TEST_EXTERNAL_FILES_HTTP_URL', 'http://localhost:8080');
define('TEST_EXTERNAL_FILES_HTTPS_URL', 'http://localhost:8080');
define('TEST_SESSION_REDIS_HOST', 'localhost');
define('TEST_CACHESTORE_REDIS_TESTSERVERS', 'localhost');
// TODO: add others (solr, mongodb, memcached, ldap...).
// Too much for now: define('PHPUNIT_LONGTEST', true); // Only leaves a few tests out and they are run later by CI.
require_once(__DIR__ . '/lib/setup.php');
-117
View File
@@ -1,117 +0,0 @@
name: Core
on:
push:
branches-ignore:
- master
- MOODLE_[0-9]+_STABLE
tags-ignore:
- v[0-9]+.[0-9]+.[0-9]+*
env:
php: 7.4
jobs:
Grunt:
runs-on: ubuntu-18.04
steps:
- name: Checking out code
uses: actions/checkout@v2
- name: Configuring node & npm
shell: bash -l {0}
run: nvm install
- name: Installing node stuff
run: npm install
- name: Running grunt
run: npx grunt
- name: Looking for uncommitted changes
# Add all files to the git index and then run diff --cached to see all changes.
# This ensures that we get the status of all files, including new files.
# We ignore npm-shrinkwrap.json to make the tasks immune to npm changes.
run: |
git add .
git reset -- npm-shrinkwrap.json
git diff --cached --exit-code
PHPUnit:
runs-on: ${{ matrix.os }}
services:
exttests:
image: moodlehq/moodle-exttests
ports:
- 8080:80
redis:
image: redis
ports:
- 6379:6379
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-18.04
php: 7.2
# Need to disable both redis and memcached (both are optional) in order to keep igbinary installed.
# (there are dependencies that become broken if we just switch the igbinary version).
# Need to do this for php 7.2 because of a bug with current default igbinary
# versions used by GHA being >= 3.2.2 and <= 3.2.4 (buggy ones).
# TODO: MDL-72399 - Revert this patch once igbinary 3.2.5 or up is the default @ GHA.
extensions: :redis, :memcached, igbinary-3.2.6
db: mysqli
- os: ubuntu-18.04
php: 7.4
extensions:
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 }}
extensions: ${{ matrix.extensions }}
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 -17
View File
@@ -9,24 +9,15 @@
#
# See gitignore(5) man page for more details
#
# Swap files (vim)
[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-rt-v][a-z]
[._]ss[a-gi-z]
[._]sw[a-p]
# Temporary files including undo
*~
#
/config.php
/lib/editor/tinymce/extra/tools/temp/
*~
*.swp
/tags
/TAGS
/cscope.*
/.patches/
/.idea/
.phpstorm.*
/nbproject/
CVS
.DS_Store
@@ -34,7 +25,6 @@ CVS
/.project
/.buildpath
/.cache
.phpunit.result.cache
phpunit.xml
# Composer support. Do not ignore composer.json, or composer.lock. These should be shipped by us.
composer.phar
@@ -46,8 +36,3 @@ composer.phar
/lib/yuilib/*/*/*-coverage.js
atlassian-ide-plugin.xml
/node_modules/
/.vscode/
moodle-plugin-ci.phar
.eslintignore
.stylelintignore
/jsdoc
-19
View File
@@ -1,19 +0,0 @@
# Moodle JavaScript Documentation
```
.-..-.
_____ | || |
/____/-.---_ .---. .---. .-.| || | .---.
| | _ _ |/ _ \/ _ \/ _ || |/ __ \
* | | | | | || |_| || |_| || |_| || || |___/
|_| |_| |_|\_____/\_____/\_____||_|\_____)
Moodle - the world's open source learning platform
```
## About
This generated documentation includes API documentation for JavaScript written in the AMD and ES2015 module formats within Moodle.
## Related information
See [https://docs.moodle.org/dev](https://docs.moodle.org/dev) for other related Developer Documentation.
-131
View File
@@ -1,131 +0,0 @@
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Helper functions for working with Moodle component names, directories, and sources.
*
* @copyright 2019 Andrew Nicols <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
"use strict";
/* eslint-env node */
// Do not include any plugins as stanard.
const plugins = [];
plugins.push('plugins/markdown');
/**
* Get the source configuration.
*
* @return {Object}
*/
const getSource = () => {
const glob = require('glob');
const path = require('path');
const ComponentList = require(path.resolve('GruntfileComponents.js'));
const thirdPartyPaths = ComponentList.getThirdPartyPaths();
const source = {
include: [],
includePattern: ".+\\.js$",
};
let includeList = [];
ComponentList.getAmdSrcGlobList().forEach(async pattern => {
includeList.push(...glob.sync(pattern));
});
const cwdLength = process.cwd().length + 1;
includeList.forEach(path => {
if (source.include.indexOf(path) !== -1) {
// Ensure no duplicates.
return;
}
const relPath = path.substring(cwdLength);
if (thirdPartyPaths.indexOf(relPath) !== -1) {
return;
}
source.include.push(path);
});
source.include.push('.grunt/jsdoc/README.md');
return source;
};
const tags = {
// Allow the use of unknown tags.
// We have a lot of legacy uses of these.
allowUnknownTags: true,
// We make use of jsdoc and closure dictionaries as standard.
dictionaries: [
'jsdoc',
'closure',
],
};
// Template configuraiton.
const templates = {
cleverLinks: false,
monospaceLinks: false,
};
module.exports = {
opts: {
destination: "./jsdoc/",
template: "node_modules/docdash",
},
plugins,
recurseDepth: 10,
source: getSource(),
sourceType: 'module',
tags,
templates,
docdash: {
collapse: true,
search: true,
sort: true,
sectionOrder: [
"Namespaces",
"Modules",
"Events",
"Classes",
"Externals",
"Mixins",
"Tutorials",
"Interfaces"
],
"menu": {
"Developer Docs": {
href: "https://docs.moodle.org/dev",
target: "_blank",
"class": "menu-item",
id: "devdocs"
},
"MDN Docs": {
href: "https://developer.mozilla.org/en-US/docs/Web/JavaScript",
target: "_blank",
"class": "menu-item",
id: "mdndocs",
},
},
typedefs: true,
},
};
-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
-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",
}
}
+96 -97
View File
@@ -2,97 +2,84 @@
# 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: bionic
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
branches:
except:
- master
- /MOODLE_[0-9]+_STABLE/
- /^v[0-9]+\.[0-9]+\.[0-9]+.*/
# Run unit tests on Postgres
- DB=pgsql TASK=PHPUNIT
jobs:
# 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.2)
- php: 7.2
env: DB=none TASK=CITEST
- php: 7.2
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.2
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.2
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
# Disable xdebug. We aren't generating code coverage, and it has a huge impact upon test performance.
- rm /home/travis/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini
- >
if [ "$TASK" = 'PHPUNIT' ];
then
@@ -101,9 +88,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.
@@ -118,9 +102,8 @@ install:
fi
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 ;
@@ -136,7 +119,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 ;
@@ -156,13 +139,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
@@ -177,21 +158,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
@@ -220,7 +186,7 @@ before_script:
# We need the official upstream for comparison
git remote add upstream https://github.com/moodle/moodle.git;
git fetch upstream MOODLE_310_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`
@@ -231,11 +197,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
- >
@@ -250,16 +242,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
+55 -668
View File
@@ -13,211 +13,37 @@
// 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
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/* eslint-env node */
/**
* Calculate the cwd, taking into consideration the `root` option (for Windows).
*
* @param {Object} grunt
* @returns {String} The current directory as best we can determine
* Grunt configuration
*/
const getCwd = grunt => {
const fs = require('fs');
const path = require('path');
let cwd = fs.realpathSync(process.env.PWD || process.cwd());
module.exports = function(grunt) {
var path = require('path'),
tasks = {},
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.
if (grunt.option('root')) {
const root = grunt.option('root');
var root = grunt.option('root');
if (grunt.file.exists(__dirname, root)) {
cwd = fs.realpathSync(path.join(__dirname, root));
grunt.log.ok('Setting root to ' + cwd);
cwd = path.join(__dirname, root);
grunt.log.ok('Setting root to '+cwd);
} else {
grunt.fail.fatal('Setting root to ' + root + ' failed - path does not exist');
grunt.fail.fatal('Setting root to '+root+' failed - path does not exist');
}
}
return cwd;
};
/**
* Register any stylelint tasks.
*
* @param {Object} grunt
* @param {Array} files
* @param {String} fullRunDir
*/
const registerStyleLintTasks = (grunt, files, fullRunDir) => {
const getCssConfigForFiles = files => {
return {
stylelint: {
css: {
// Use a fully-qualified path.
src: files,
options: {
configOverrides: {
rules: {
// These rules have to be disabled in .stylelintrc for scss compat.
"at-rule-no-unknown": true,
}
}
}
},
},
};
};
const getScssConfigForFiles = files => {
return {
stylelint: {
scss: {
options: {syntax: 'scss'},
src: files,
},
},
};
};
let hasCss = true;
let hasScss = true;
if (files) {
// Specific files were passed. Just set them up.
grunt.config.merge(getCssConfigForFiles(files));
grunt.config.merge(getScssConfigForFiles(files));
} else {
// The stylelint system does not handle the case where there was no file to lint.
// Check whether there are any files to lint in the current directory.
const glob = require('glob');
const scssSrc = [];
glob.sync(`${fullRunDir}/**/*.scss`).forEach(path => scssSrc.push(path));
if (scssSrc.length) {
grunt.config.merge(getScssConfigForFiles(scssSrc));
} else {
hasScss = false;
}
const cssSrc = [];
glob.sync(`${fullRunDir}/**/*.css`).forEach(path => cssSrc.push(path));
if (cssSrc.length) {
grunt.config.merge(getCssConfigForFiles(cssSrc));
} else {
hasCss = false;
}
}
const scssTasks = ['sass'];
if (hasScss) {
scssTasks.unshift('stylelint:scss');
}
scssTasks.unshift('ignorefiles');
grunt.registerTask('scss', scssTasks);
const cssTasks = ['ignorefiles'];
if (hasCss) {
cssTasks.push('stylelint:css');
}
grunt.registerTask('rawcss', cssTasks);
grunt.registerTask('css', ['scss', 'rawcss']);
};
/**
* Grunt configuration.
*
* @param {Object} grunt
*/
module.exports = function(grunt) {
const path = require('path');
const tasks = {};
const async = require('async');
const DOMParser = require('xmldom').DOMParser;
const xpath = require('xpath');
const semver = require('semver');
const watchman = require('fb-watchman');
const watchmanClient = new watchman.Client();
const fs = require('fs');
const ComponentList = require(path.resolve('GruntfileComponents.js'));
const sass = require('node-sass');
// 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);
}
// Detect directories:
// * gruntFilePath The real path on disk to this Gruntfile.js
// * cwd The current working directory, which can be overridden by the `root` option
// * relativeCwd The cwd, relative to the Gruntfile.js
// * componentDirectory The root directory of the component if the cwd is in a valid component
// * inComponent Whether the cwd is in a valid component
// * runDir The componentDirectory or cwd if not in a component, relative to Gruntfile.js
// * fullRunDir The full path to the runDir
const gruntFilePath = fs.realpathSync(process.cwd());
const cwd = getCwd(grunt);
const relativeCwd = path.relative(gruntFilePath, cwd);
const componentDirectory = ComponentList.getOwningComponentDirectory(relativeCwd);
const inComponent = !!componentDirectory;
const runDir = inComponent ? componentDirectory : relativeCwd;
const fullRunDir = fs.realpathSync(gruntFilePath + path.sep + runDir);
grunt.log.debug('============================================================================');
grunt.log.debug(`= Node version: ${process.versions.node}`);
grunt.log.debug(`= grunt version: ${grunt.package.version}`);
grunt.log.debug(`= process.cwd: '` + process.cwd() + `'`);
grunt.log.debug(`= process.env.PWD: '${process.env.PWD}'`);
grunt.log.debug(`= path.sep '${path.sep}'`);
grunt.log.debug('============================================================================');
grunt.log.debug(`= gruntFilePath: '${gruntFilePath}'`);
grunt.log.debug(`= relativeCwd: '${relativeCwd}'`);
grunt.log.debug(`= componentDirectory: '${componentDirectory}'`);
grunt.log.debug(`= inComponent: '${inComponent}'`);
grunt.log.debug(`= runDir: '${runDir}'`);
grunt.log.debug(`= fullRunDir: '${fullRunDir}'`);
grunt.log.debug('============================================================================');
if (inComponent) {
grunt.log.ok(`Running tasks for component directory ${componentDirectory}`);
}
let files = null;
if (grunt.option('files')) {
// Accept a comma separated list of files to process.
files = grunt.option('files').split(',');
}
// If the cwd is the amd directory in the current component then it will be empty.
// If the cwd is a child of the component's AMD directory, the relative directory will not start with ..
const inAMD = !path.relative(`${componentDirectory}/amd`, cwd).startsWith('..');
var inAMD = path.basename(cwd) == 'amd';
// Globbing pattern for matching all AMD JS source files.
let amdSrc = [];
if (inComponent) {
amdSrc.push(componentDirectory + "/amd/src/*.js");
amdSrc.push(componentDirectory + "/amd/src/**/*.js");
} else {
amdSrc = ComponentList.getAmdSrcGlobList();
}
let yuiSrc = [];
if (inComponent) {
yuiSrc.push(componentDirectory + "/yui/src/**/*.js");
} else {
yuiSrc = ComponentList.getYuiSrcGlobList(gruntFilePath + '/');
}
var amdSrc = [inAMD ? cwd + '/src/*.js' : '**/amd/src/*.js'];
/**
* Function to generate the destination for the uglify task
@@ -229,221 +55,64 @@ 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() {
const thirdpartyfiles = ComponentList.getThirdPartyLibsList(gruntFilePath + '/');
const libs = ['node_modules/', 'vendor/'];
thirdpartyfiles.forEach(function(file) {
const dirname = path.dirname(file);
const doc = new DOMParser().parseFromString(grunt.file.read(file));
const nodes = xpath.select("/libraries/library/location/text()", doc);
nodes.forEach(function(node) {
let lib = path.posix.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;
};
/**
* Get the list of feature files to pass to the gherkin linter.
*
* @returns {Array}
*/
const getGherkinLintTargets = () => {
if (files) {
// Specific files were requested. Only check these.
return files;
}
if (inComponent) {
return [`${runDir}/tests/behat/*.feature`];
}
return ['**/tests/behat/*.feature'];
};
// 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 : yuiSrc},
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
}]
}
},
jsdoc: {
dist: {
options: {
configure: ".grunt/jsdoc/jsdoc.conf.js",
},
},
},
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: {
implementation: sass,
includePaths: ["theme/boost/scss/", "theme/classic/scss/"]
}
}
},
watch: {
options: {
nospawn: true // We need not to spawn so config can be changed dynamically.
},
amd: {
files: inComponent
? ['amd/src/*.js', 'amd/src/**/*.js']
: ['**/amd/src/**/*.js'],
files: ['**/amd/src/**/*.js'],
tasks: ['amd']
},
boost: {
files: [inComponent ? 'scss/**/*.scss' : 'theme/boost/scss/**/*.scss'],
tasks: ['scss']
},
rawcss: {
files: [
'**/*.css',
],
excludes: [
'**/moodle.css',
'**/editor.css',
],
tasks: ['rawcss']
bootstrapbase: {
files: ["theme/bootstrapbase/less/**/*.less"],
tasks: ["less:bootstrapbase"]
},
yui: {
files: inComponent
? ['yui/src/*.json', 'yui/src/**/*.js']
: ['**/yui/src/**/*.js'],
tasks: ['yui']
files: ['**/yui/src/**/*.js'],
tasks: ['shifter']
},
gherkinlint: {
files: [inComponent ? 'tests/behat/*.feature' : '**/tests/behat/*.feature'],
tasks: ['gherkinlint']
}
},
shifter: {
options: {
recursive: true,
// Shifter takes a relative path.
paths: files ? files : [runDir]
paths: [cwd]
}
},
gherkinlint: {
options: {
files: getGherkinLintTargets(),
}
},
}
});
/**
* Generate ignore files (utilising thirdpartylibs.xml data)
*/
tasks.ignorefiles = function() {
// An array of paths to third party directories.
const thirdPartyPaths = getThirdPartyPathsFromXML();
// Generate .eslintignore.
const eslintIgnores = [
'# Generated by "grunt ignorefiles"',
'*/**/yui/src/*/meta/',
'*/**/build/',
].concat(thirdPartyPaths);
grunt.file.write('.eslintignore', eslintIgnores.join('\n') + '\n');
// Generate .stylelintignore.
const stylelintIgnores = [
'# Generated by "grunt ignorefiles"',
'**/yui/build/*',
'theme/boost/style/moodle.css',
'theme/classic/style/moodle.css',
].concat(thirdPartyPaths);
grunt.file.write('.stylelintignore', stylelintIgnores.join('\n') + '\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.
@@ -452,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');
@@ -506,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 {
@@ -532,39 +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/dist/linter.js');
const featureFinder = require('gherkin-lint/dist/feature-finder.js');
const configParser = require('gherkin-lint/dist/config-parser.js');
const formatter = require('gherkin-lint/dist/formatters/stylish.js');
// Run the linter.
return linter.lint(
featureFinder.getFeatureFiles(grunt.file.expand(options.files)),
configParser.getConfiguration(configParser.defaultConfigFileName)
)
.then(results => {
// Print the results out uncondtionally.
formatter.printResults(results);
return results;
})
.then(results => {
// Report on the results.
// The done function takes a bool whereby a falsey statement causes the task to fail.
return results.every(result => result.errors.length === 0);
})
.then(done); // eslint-disable-line promise/no-callback-in-promise
};
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');
@@ -572,293 +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: fullRunDir,
stdio: 'inherit'
},
args: [task, filesOption]
},
function(err, res, code) {
if (code !== 0) {
// The grunt task failed.
grunt.log.error(err);
}
// Move on to the next task.
next();
}
);
},
function() {
// No longer processing.
processingQueue = false;
// Once all of the tasks are done then recurse just in case more tasks
// were queued while we were processing.
processWatchTaskQueue();
}
);
};
const originalWatchConfig = grunt.config.get(['watch']);
const watchConfig = Object.keys(originalWatchConfig).reduce(function(carry, key) {
if (key == 'options') {
return carry;
}
const value = originalWatchConfig[key];
const taskNames = value.tasks;
const files = value.files;
let excludes = [];
if (value.excludes) {
excludes = value.excludes;
}
taskNames.forEach(function(taskName) {
carry[taskName] = {
files,
excludes,
};
});
return carry;
}, {});
watchmanClient.on('error', function(error) {
// We have to add an error handler here and parse the error string because the
// example way from the docs to check if Watchman is installed doesn't actually work!!
// See: https://github.com/facebook/watchman/issues/509
if (error.message.match('Watchman was not found')) {
// If watchman isn't installed then we should fallback to the other watch task.
grunt.log.ok('It is recommended that you install Watchman for better performance using the "watch" command.');
// Fallback to the old grunt-contrib-watch task.
grunt.renameTask('watch-grunt', 'watch');
grunt.task.run(['watch']);
// This task is finished.
watchTaskDone(0);
} else {
grunt.log.error(error);
// Fatal error.
watchTaskDone(1);
}
});
watchmanClient.on('subscription', function(resp) {
if (resp.subscription !== 'grunt-watch') {
return;
}
resp.files.forEach(function(file) {
grunt.log.ok('File changed: ' + file.name);
var fullPath = fullRunDir + '/' + file.name;
Object.keys(watchConfig).forEach(function(task) {
const fileGlobs = watchConfig[task].files;
var match = fileGlobs.some(function(fileGlob) {
return grunt.file.isMatch(`**/${fileGlob}`, fullPath);
});
if (match) {
// If we are watching a subdirectory then the file.name will be relative
// to that directory. However the grunt tasks expect the file paths to be
// relative to the Gruntfile.js location so let's normalise them before
// adding them to the queue.
var relativePath = fullPath.replace(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', fullRunDir], function(watchError, watchResponse) {
if (watchError) {
grunt.log.error('Error initiating watch:', watchError);
watchTaskDone(1);
return;
}
if ('warning' in watchResponse) {
grunt.log.error('warning: ', watchResponse.warning);
}
var watch = watchResponse.watch;
var relativePath = watchResponse.relative_path;
watchInitialised = true;
watchmanClient.command(['clock', watch], function(clockError, clockResponse) {
if (clockError) {
grunt.log.error('Failed to query clock:', clockError);
watchTaskDone(1);
return;
}
// Generate the expression query used by watchman.
// Documentation is limited, but see https://facebook.github.io/watchman/docs/expr/allof.html for examples.
// We generate an expression to match any value in the files list of all of our tasks, but excluding
// all value in the excludes list of that task.
//
// [anyof, [
// [allof, [
// [anyof, [
// ['match', validPath, 'wholename'],
// ['match', validPath, 'wholename'],
// ],
// [not,
// [anyof, [
// ['match', invalidPath, 'wholename'],
// ['match', invalidPath, 'wholename'],
// ],
// ],
// ],
var matchWholeName = fileGlob => ['match', fileGlob, 'wholename'];
var matches = Object.keys(watchConfig).map(function(task) {
const matchAll = [];
matchAll.push(['anyof'].concat(watchConfig[task].files.map(matchWholeName)));
if (watchConfig[task].excludes.length) {
matchAll.push(['not', ['anyof'].concat(watchConfig[task].excludes.map(matchWholeName))]);
}
return ['allof'].concat(matchAll);
});
matches = ['anyof'].concat(matches);
var sub = {
expression: matches,
// Which fields we're interested in.
fields: ["name", "size", "type"],
// Add our time constraint.
since: clockResponse.clock
};
if (relativePath) {
/* eslint-disable camelcase */
sub.relative_root = relativePath;
}
watchmanClient.command(['subscribe', watch, 'grunt-watch', sub], function(subscribeError) {
if (subscribeError) {
// Probably an error in the subscription criteria.
grunt.log.error('failed to subscribe: ', subscribeError);
watchTaskDone(1);
return;
}
grunt.log.ok('Listening for changes to files in ' + fullRunDir);
});
});
});
};
// 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');
grunt.loadNpmTasks('grunt-jsdoc');
// 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', ['ignorefiles', 'eslint:amd', 'babel']);
grunt.registerTask('js', ['amd', 'yui']);
grunt.registerTask('amd', ['jshint', 'uglify']);
grunt.registerTask('js', ['amd', 'shifter']);
// Register CSS tasks.
registerStyleLintTasks(grunt, files, fullRunDir);
// Register CSS taks.
grunt.registerTask('css', ['less:bootstrapbase']);
// Register the startup task.
grunt.registerTask('startup', 'Run the correct tasks for the current directory', tasks.startup);
-233
View File
@@ -1,233 +0,0 @@
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Helper functions for working with Moodle component names, directories, and sources.
*
* @copyright 2019 Andrew Nicols <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
"use strict";
/* eslint-env node */
/** @var {Object} A list of subsystems in Moodle */
const componentData = {};
/**
* Load details of all moodle modules.
*
* @returns {object}
*/
const fetchComponentData = () => {
const fs = require('fs');
const path = require('path');
const glob = require('glob');
const gruntFilePath = process.cwd();
if (!Object.entries(componentData).length) {
componentData.subsystems = {};
componentData.pathList = [];
// Fetch the component definiitions from the distributed JSON file.
const components = JSON.parse(fs.readFileSync(`${gruntFilePath}/lib/components.json`));
// Build the list of moodle subsystems.
componentData.subsystems.lib = 'core';
componentData.pathList.push(process.cwd() + path.sep + 'lib');
for (const [component, thisPath] of Object.entries(components.subsystems)) {
if (thisPath) {
// Prefix "core_" to the front of the subsystems.
componentData.subsystems[thisPath] = `core_${component}`;
componentData.pathList.push(process.cwd() + path.sep + thisPath);
}
}
// The list of components incldues the list of subsystems.
componentData.components = componentData.subsystems;
// Go through each of the plugintypes.
Object.entries(components.plugintypes).forEach(([pluginType, pluginTypePath]) => {
// We don't allow any code in this place..?
glob.sync(`${pluginTypePath}/*/version.php`).forEach(versionPath => {
const componentPath = fs.realpathSync(path.dirname(versionPath));
const componentName = path.basename(componentPath);
const frankenstyleName = `${pluginType}_${componentName}`;
componentData.components[`${pluginTypePath}/${componentName}`] = frankenstyleName;
componentData.pathList.push(componentPath);
// Look for any subplugins.
const subPluginConfigurationFile = `${componentPath}/db/subplugins.json`;
if (fs.existsSync(subPluginConfigurationFile)) {
const subpluginList = JSON.parse(fs.readFileSync(fs.realpathSync(subPluginConfigurationFile)));
Object.entries(subpluginList.plugintypes).forEach(([subpluginType, subpluginTypePath]) => {
glob.sync(`${subpluginTypePath}/*/version.php`).forEach(versionPath => {
const componentPath = fs.realpathSync(path.dirname(versionPath));
const componentName = path.basename(componentPath);
const frankenstyleName = `${subpluginType}_${componentName}`;
componentData.components[`${subpluginTypePath}/${componentName}`] = frankenstyleName;
componentData.pathList.push(componentPath);
});
});
}
});
});
}
return componentData;
};
/**
* Get the list of paths to build AMD sources.
*
* @returns {Array}
*/
const getAmdSrcGlobList = () => {
const globList = [];
fetchComponentData().pathList.forEach(componentPath => {
globList.push(`${componentPath}/amd/src/*.js`);
globList.push(`${componentPath}/amd/src/**/*.js`);
});
return globList;
};
/**
* Get the list of paths to build YUI sources.
*
* @param {String} relativeTo
* @returns {Array}
*/
const getYuiSrcGlobList = relativeTo => {
const globList = [];
fetchComponentData().pathList.forEach(componentPath => {
const relativeComponentPath = componentPath.replace(relativeTo, '');
globList.push(`${relativeComponentPath}/yui/src/**/*.js`);
});
return globList;
};
/**
* Get the list of paths to thirdpartylibs.xml.
*
* @param {String} relativeTo
* @returns {Array}
*/
const getThirdPartyLibsList = relativeTo => {
const fs = require('fs');
const path = require('path');
return fetchComponentData().pathList
.map(componentPath => path.relative(relativeTo, componentPath) + '/thirdpartylibs.xml')
.map(componentPath => componentPath.replace(/\\/g, '/'))
.filter(path => fs.existsSync(path))
.sort();
};
/**
* Get the list of thirdparty library paths.
*
* @returns {array}
*/
const getThirdPartyPaths = () => {
const DOMParser = require('xmldom').DOMParser;
const fs = require('fs');
const path = require('path');
const xpath = require('xpath');
const thirdpartyfiles = getThirdPartyLibsList(fs.realpathSync('./'));
const libs = ['node_modules/', 'vendor/'];
const addLibToList = lib => {
if (!lib.match('\\*') && fs.statSync(lib).isDirectory()) {
// Ensure trailing slash on dirs.
lib = lib.replace(/\/?$/, '/');
}
// Look for duplicate paths before adding to array.
if (libs.indexOf(lib) === -1) {
libs.push(lib);
}
};
thirdpartyfiles.forEach(function(file) {
const dirname = path.dirname(file);
const xmlContent = fs.readFileSync(file, 'utf8');
const doc = new DOMParser().parseFromString(xmlContent);
const nodes = xpath.select("/libraries/library/location/text()", doc);
nodes.forEach(function(node) {
let lib = path.posix.join(dirname, node.toString());
addLibToList(lib);
});
});
return libs;
};
/**
* Find the name of the component matching the specified path.
*
* @param {String} path
* @returns {String|null} Name of matching component.
*/
const getComponentFromPath = path => {
const componentList = fetchComponentData().components;
if (componentList.hasOwnProperty(path)) {
return componentList[path];
}
return null;
};
/**
* Check whether the supplied path, relative to the Gruntfile.js, is in a known component.
*
* @param {String} checkPath The path to check. This can be with either Windows, or Linux directory separators.
* @returns {String|null}
*/
const getOwningComponentDirectory = checkPath => {
const path = require('path');
// Fetch all components into a reverse sorted array.
// This ensures that components which are within the directory of another component match first.
const pathList = Object.keys(fetchComponentData().components).sort().reverse();
for (const componentPath of pathList) {
// If the componentPath is the directory being checked, it will be empty.
// If the componentPath is a parent of the directory being checked, the relative directory will not start with ..
if (!path.relative(componentPath, checkPath).startsWith('..')) {
return componentPath;
}
}
return null;
};
module.exports = {
getAmdSrcGlobList,
getComponentFromPath,
getOwningComponentDirectory,
getYuiSrcGlobList,
getThirdPartyLibsList,
getThirdPartyPaths,
};
+1 -1
View File
@@ -2,7 +2,7 @@ MOODLE TRADEMARKS POLICY
========================
The word "Moodle" is trademarked in many countries around the world. The word
was originally coined as an acronym: Modular Object-Oriented Dynamic Learning
was originally an acronym: Modular Object-Oriented Dynamic Learning
Environment. The trademark is owned by Martin Dougiamas, Founder and Director
of Moodle.
+4 -5
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";
@@ -98,10 +99,8 @@ switch ($action) {
default:
break;
}
$new = implode(',', $activeantiviruses);
add_to_config_log('antiviruses', $CFG->antiviruses, $new, 'core');
set_config('antiviruses', $new);
set_config('antiviruses', implode(',', $activeantiviruses));
core_plugin_manager::reset_caches();
redirect ($returnurl);
redirect ($returnurl);
+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 {
+26 -11
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');
@@ -37,7 +36,6 @@
print_error('blockdoesnotexist', 'error');
}
$DB->set_field('block', 'visible', '0', array('id'=>$block->id)); // Hide block
add_to_config_log('block_visibility', $block->visible, '0', $block->name);
core_plugin_manager::reset_caches();
admin_get_root(true, false); // settings not required - only pages
}
@@ -47,23 +45,40 @@
print_error('blockdoesnotexist', 'error');
}
$DB->set_field('block', 'visible', '1', array('id'=>$block->id)); // Show block
add_to_config_log('block_visibility', $block->visible, '1', $block->name);
core_plugin_manager::reset_caches();
admin_get_root(true, false); // settings not required - only pages
}
if (!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));
}
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));
}
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 +183,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 +201,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 -20
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();
@@ -158,9 +155,4 @@ echo $outputhtml;
echo html_writer::end_tag('fieldset');
echo html_writer::end_tag('form');
$PAGE->requires->yui_module('moodle-core-formchangechecker', 'M.core_formchangechecker.init', [[
'formid' => 'adminsettings'
]]);
$PAGE->requires->string_for_js('changesmadereallygoaway', 'moodle');
echo $OUTPUT->footer();
-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', 'autocomplete' => 'email'];
$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');
}
}
@@ -1,71 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* External admin page class that allows a callback to be provided to determine whether page can be accessed
*
* @package core_admin
* @copyright 2019 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_admin\local\externalpage;
use admin_externalpage;
defined('MOODLE_INTERNAL') || die();
require_once("{$CFG->libdir}/adminlib.php");
/**
* Admin externalpage class
*
* @package core_admin
* @copyright 2019 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class accesscallback extends admin_externalpage {
/** @var callable $accesscheckcallback */
protected $accesscheckcallback;
/**
* Class constructor
*
* @param string $name
* @param string $visiblename
* @param string $url
* @param callable $accesscheckcallback The callback method that will be executed to check whether user has access to
* this page. The setting instance ($this) is passed as an argument to the callback. Should return boolean value
* @param bool $hidden
*/
public function __construct(string $name, string $visiblename, string $url, callable $accesscheckcallback,
bool $hidden = false) {
$this->accesscheckcallback = $accesscheckcallback;
parent::__construct($name, $visiblename, $url, [], $hidden);
}
/**
* Determines if the current user has access to this external page based on access callback
*
* @return bool
*/
public function check_access() {
return ($this->accesscheckcallback)($this);
}
}
@@ -1,206 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Auto complete admin setting.
*
* @package core_admin
* @copyright 2020 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_admin\local\settings;
defined('MOODLE_INTERNAL') || die();
require_once($CFG->libdir . '/adminlib.php');
/**
* Auto complete setting class.
*
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @copyright 2020 The Open University
*/
class autocomplete extends \admin_setting_configmultiselect {
/** @var boolean Should we allow typing new entries to the field? */
protected $tags = false;
/** @var string Name of an AMD module to send/process ajax requests. */
protected $ajax = '';
/** @var string Placeholder text for an empty list. */
protected $placeholder = '';
/** @var bool Whether the search has to be case-sensitive. */
protected $casesensitive = false;
/** @var bool Show suggestions by default - but this can be turned off. */
protected $showsuggestions = true;
/** @var string String that is shown when there are no selections. */
protected $noselectionstring = '';
/** @var string Delimiter to store values in database. */
protected $delimiter = ',';
/** @var string Should be multiple choices? */
protected $multiple = true;
/** @var string The link to manage choices. */
protected $manageurl = true;
/** @var string The text to display in manage link. */
protected $managetext = true;
/**
* Constructor
*
* @param string $name unique ascii name, either 'mysetting' for settings that in config, or 'myplugin/mysetting'
* for ones in config_plugins.
* @param string $visiblename localised
* @param string $description long localised info
* @param array $defaultsetting array of selected items
* @param array $choices options for autocomplete field
* @param array $attributes settings for autocomplete field
*/
public function __construct($name, $visiblename, $description, $defaultsetting, $choices, $attributes = null) {
if ($attributes === null) {
$attributes = [];
}
$this->placeholder = get_string('search');
$this->noselectionstring = get_string('noselection', 'form');
$defaultattributes = [
'tags',
'showsuggestions',
'placeholder',
'noselectionstring',
'ajax',
'casesensitive',
'delimiter',
'multiple',
'manageurl',
'managetext'
];
foreach ($defaultattributes as $attributename) {
if (isset($attributes[$attributename])) {
$this->$attributename = $attributes[$attributename];
}
}
parent::__construct($name, $visiblename, $description, $defaultsetting, $choices);
}
/**
* Returns the select setting(s)
*
* @return mixed null or array. Null if no settings else array of setting(s)
*/
public function get_setting() {
$result = $this->config_read($this->name);
if (is_null($result)) {
return null;
}
if ($result === '') {
return [];
}
return explode($this->delimiter, $result);
}
/**
* Saves setting(s) provided through $data
*
* @param array $data
*/
public function write_setting($data) {
if (!is_array($data)) {
return ''; // Ignore it.
}
if (!$this->load_choices() || empty($this->choices)) {
return '';
}
unset($data['xxxxx']);
$save = [];
foreach ($data as $value) {
if (!array_key_exists($value, $this->choices)) {
continue; // Ignore it.
}
$save[] = $value;
}
return ($this->config_write($this->name, implode($this->delimiter, $save)) ? '' : get_string('errorsetting', 'admin'));
}
/**
* Returns XHTML autocomplete field
*
* @param array $data Array of values to select by default
* @param string $query
* @return string XHTML autocomplete field
*/
public function output_html($data, $query = '') {
global $OUTPUT;
if (!$this->load_choices() or empty($this->choices)) {
return '';
}
$default = $this->get_defaultsetting();
if (empty($default)) {
$default = [];
}
if (is_null($data)) {
$data = [];
}
$context = [
'id' => $this->get_id(),
'name' => $this->get_full_name()
];
$defaults = [];
$options = [];
$template = 'core_admin/local/settings/autocomplete';
foreach ($this->choices as $value => $name) {
if (in_array($value, $default)) {
$defaults[] = $name;
}
$options[] = [
'value' => $value,
'text' => $name,
'selected' => in_array($value, $data),
'disabled' => false
];
}
$context['options'] = $options;
$context['tags'] = $this->tags;
$context['placeholder'] = $this->placeholder;
$context['casesensitive'] = $this->casesensitive;
$context['multiple'] = $this->multiple;
$context['showsuggestions'] = $this->showsuggestions;
$context['manageurl'] = $this->manageurl;
$context['managetext'] = $this->managetext;
if (is_null($default)) {
$defaultinfo = null;
} if (!empty($defaults)) {
$defaultinfo = implode(', ', $defaults);
} else {
$defaultinfo = get_string('none');
}
$element = $OUTPUT->render_from_template($template, $context);
return format_admin_setting($this, $this->visiblename, $element, $this->description, true, '', $defaultinfo, $query);
}
}
-197
View File
@@ -1,197 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* File size admin setting.
*
* @package core_admin
* @copyright 2019 Shamim Rezaie <shamim@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_admin\local\settings;
defined('MOODLE_INTERNAL') || die();
require_once($CFG->libdir . '/adminlib.php');
/**
* An admin setting to support entering and displaying of file sizes in Bytes, KB, MB or GB.
*
* @copyright 2019 Shamim Rezaie <shamim@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class filesize extends \admin_setting {
/** @var int The byte unit. Number of bytes in a byte */
const UNIT_B = 1;
/** @var int The kilobyte unit (number of bytes in a kilobyte) */
const UNIT_KB = 1024;
/** @var int The megabyte unit (number of bytes in a megabyte) */
const UNIT_MB = 1048576;
/** @var int The gigabyte unit (number of bytes in a gigabyte) */
const UNIT_GB = 1073741824;
/** @var int default size unit */
protected $defaultunit;
/**
* Constructor
*
* @param string $name unique ascii name, either 'mysetting' for settings that in config,
* or 'myplugin/mysetting' for ones in config_plugins.
* @param string $visiblename localised name
* @param string $description localised long description
* @param int|null $defaultvalue Value of the settings in bytes
* @param int|null $defaultunit GB, MB, etc. (in bytes)
*/
public function __construct(string $name, string $visiblename, string $description,
int $defaultvalue = null, int $defaultunit = null) {
$defaultsetting = self::parse_bytes($defaultvalue);
if ($defaultunit && array_key_exists($defaultunit, self::get_units())) {
$this->defaultunit = $defaultunit;
} else {
$this->defaultunit = self::UNIT_MB;
}
parent::__construct($name, $visiblename, $description, $defaultsetting);
}
/**
* Returns selectable units.
*
* @return array
*/
protected static function get_units(): array {
return [
self::UNIT_GB => get_string('sizegb'),
self::UNIT_MB => get_string('sizemb'),
self::UNIT_KB => get_string('sizekb'),
self::UNIT_B => get_string('sizeb'),
];
}
/**
* Converts bytes to some more user friendly string.
*
* @param int $bytes The number of bytes we want to convert from
* @return string
*/
protected static function get_size_text(int $bytes): string {
if (empty($bytes)) {
return get_string('none');
}
return display_size($bytes);
}
/**
* Finds suitable units for given file size.
*
* @param int $bytes The number of bytes
* @return array Parsed file size in the format of ['v' => value, 'u' => unit]
*/
protected static function parse_bytes(int $bytes): array {
foreach (self::get_units() as $unit => $unused) {
if ($bytes % $unit === 0) {
return ['v' => (int)($bytes / $unit), 'u' => $unit];
}
}
return ['v' => (int)$bytes, 'u' => self::UNIT_B];
}
/**
* Get the selected file size as array.
*
* @return array|null An array containing 'v' => xx, 'u' => xx, or null if not set
*/
public function get_setting(): ?array {
$bytes = $this->config_read($this->name);
if (is_null($bytes)) {
return null;
}
$bytes = intval($bytes);
return self::parse_bytes($bytes);
}
/**
* Store the file size as bytes.
*
* @param array $data Must be form 'h' => xx, 'm' => xx
* @return string The error string if any
*/
public function write_setting($data): string {
if (!is_array($data)) {
return '';
}
if (!is_numeric($data['v']) || $data['v'] < 0) {
return get_string('errorsetting', 'admin');
}
// Calculate size in bytes, ensuring we don't overflow PHP_INT_MAX.
$bytes = $data['v'] * $data['u'];
$result = (is_int($bytes) && $this->config_write($this->name, $bytes));
return ($result ? '' : get_string('errorsetting', 'admin'));
}
/**
* Returns file size text+select fields.
*
* @param array $data The current setting value. Must be form 'v' => xx, 'u' => xx.
* @param string $query Admin search query to be highlighted.
* @return string File size text+select fields and wrapping div(s).
*/
public function output_html($data, $query = ''): string {
global $OUTPUT;
$default = $this->get_defaultsetting();
if (is_number($default)) {
$defaultinfo = self::get_size_text($default);
} else if (is_array($default)) {
$defaultinfo = self::get_size_text($default['v'] * $default['u']);
} else {
$defaultinfo = null;
}
$inputid = $this->get_id() . 'v';
$units = self::get_units();
$defaultunit = $this->defaultunit;
$context = (object) [
'id' => $this->get_id(),
'name' => $this->get_full_name(),
'value' => $data['v'],
'readonly' => $this->is_readonly(),
'options' => array_map(function($unit, $title) use ($data, $defaultunit) {
return [
'value' => $unit,
'name' => $title,
'selected' => ($data['v'] == 0 && $unit == $defaultunit) || $unit == $data['u']
];
}, array_keys($units), $units)
];
$element = $OUTPUT->render_from_template('core_admin/setting_configfilesize', $context);
return format_admin_setting($this, $this->visiblename, $element, $this->description, $inputid, '', $defaultinfo, $query);
}
}
@@ -1,74 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Payment gateway admin setting.
*
* @package core_admin
* @copyright 2020 Shamim Rezaie <shamim@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_admin\local\settings;
/**
* Generic class for managing plugins in a table that allows re-ordering and enable/disable of each plugin.
*/
class manage_payment_gateway_plugins extends \admin_setting_manage_plugins {
/**
* Get the admin settings section title (use get_string).
*
* @return string
*/
public function get_section_title() {
return get_string('type_paygw_plural', 'plugin');
}
/**
* Get the type of plugin to manage.
*
* @return string
*/
public function get_plugin_type() {
return 'paygw';
}
/**
* Get the name of the second column.
*
* @return string
*/
public function get_info_column_name() {
return get_string('supportedcurrencies', 'core_payment');
}
/**
* Get the type of plugin to manage.
*
* @param plugininfo The plugin info class.
* @return string
*/
public function get_info_column($plugininfo) {
$codes = $plugininfo->get_supported_currencies();
$currencies = [];
foreach ($codes as $c) {
$currencies[$c] = new \lang_string($c, 'core_currencies');
}
return implode(get_string('listsep', 'langconfig') . ' ', $currencies);
}
}
-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';
}
}
-292
View File
@@ -1,292 +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'),
'hostname' => get_string('hostname', 'tool_task'),
'pid' => get_string('pid', 'tool_task'),
'db' => get_string('task_dbstats', 'admin'),
'result' => get_string('task_result', 'admin'),
'actions' => '',
];
$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.hostname, tl.pid,
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);
}
}
-131
View File
@@ -1,131 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Task executor for adhoc tasks.
*
* @package core
* @subpackage cli
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define('CLI_SCRIPT', true);
require(__DIR__ . '/../../config.php');
require_once("{$CFG->libdir}/clilib.php");
require_once("{$CFG->libdir}/cronlib.php");
list($options, $unrecognized) = cli_get_params(
[
'execute' => false,
'help' => false,
'keep-alive' => 0,
'showsql' => false,
'showdebugging' => false,
'ignorelimits' => false,
'force' => false,
], [
'h' => 'help',
'e' => 'execute',
'k' => 'keep-alive',
'i' => 'ignorelimits',
'f' => 'force',
]
);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
if ($options['help'] or empty($options['execute'])) {
$help = <<<EOT
Ad hoc cron tasks.
Options:
-h, --help Print out this help
--showsql Show sql queries before they are executed
--showdebugging Show developer level debugging information
-e, --execute Run all queued adhoc tasks
-k, --keep-alive=N Keep this script alive for N seconds and poll for new adhoc tasks
-i --ignorelimits Ignore task_adhoc_concurrency_limit and task_adhoc_max_runtime limits
-f, --force Run even if cron is disabled
Example:
\$sudo -u www-data /usr/bin/php admin/cli/adhoc_task.php --execute
EOT;
echo $help;
die;
}
if ($options['showdebugging']) {
set_debugging(DEBUG_DEVELOPER, true);
}
if ($options['showsql']) {
$DB->set_debug(true);
}
if (CLI_MAINTENANCE) {
echo "CLI maintenance mode active, cron execution suspended.\n";
exit(1);
}
if (moodle_needs_upgrading()) {
echo "Moodle upgrade pending, cron execution suspended.\n";
exit(1);
}
if (empty($options['execute'])) {
exit(0);
}
if (!get_config('core', 'cron_enabled') && !$options['force']) {
mtrace('Cron is disabled. Use --force to override.');
exit(1);
}
if (empty($options['keep-alive'])) {
$options['keep-alive'] = 0;
}
if (!empty($CFG->showcronsql)) {
$DB->set_debug(true);
}
if (!empty($CFG->showcrondebugging)) {
set_debugging(DEBUG_DEVELOPER, true);
}
$checklimits = empty($options['ignorelimits']);
core_php_time_limit::raise();
// Increase memory limit.
raise_memory_limit(MEMORY_EXTRA);
// Emulate normal session - we use admin account by default.
cron_setup_user();
$humantimenow = date('r', time());
$keepalive = (int)$options['keep-alive'];
\core\local\cli\shutdown::script_supports_graceful_exit();
mtrace("Server Time: {$humantimenow}\n");
cron_run_adhoc_tasks(time(), $keepalive, $checklimits);
+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);
-185
View File
@@ -1,185 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* CLI script allowing to get and set config values.
*
* This is technically just a thin wrapper for {@link get_config()} and
* {@link set_config()} functions.
*
* @package core
* @subpackage cli
* @copyright 2017 David Mudrák <david@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define('CLI_SCRIPT', true);
require(__DIR__.'/../../config.php');
require_once($CFG->libdir.'/clilib.php');
$usage = "Displays the current value of the given site setting. Allows to set it to the given value, too.
Usage:
# php cfg.php [--component=<componentname>] [--json] [--shell-arg]
# php cfg.php --name=<configname> [--component=<componentname>] [--shell-arg] [--no-eol]
# php cfg.php --name=<configname> [--component=<componentname>] --set=<value>
# php cfg.php --name=<configname> [--component=<componentname>] --unset
# php cfg.php [--help|-h]
Options:
-h --help Print this help.
--component=<frankenstyle> Name of the component the variable is part of. Defaults to core.
--name=<configname> Name of the configuration variable to get/set. If missing, print all
configuration variables of the given component.
--set=<value> Set the given variable to this value.
--unset Unset the given variable.
--shell-arg Escape output values so that they can be directly used as shell script arguments.
--json Encode output list of values using JSON notation.
--no-eol Do not include the trailing new line character when printing the value.
The list of all variables of the given component can be printed as
tab-separated list (default) or JSON object (--json). Particular values are
printed as raw text values, optionally escaped so that they can be directly
used as shell script arguments (--shell-arg). Single values are displayed with
trailing new line by default, unless explicitly disabled (--no-eol).
In the read mode, the script exits with success status 0 if the requested value
is found. If the requested variable is not set, the script exits with status 3.
When listing all variables of the component, the exit status is always 0 even
if no variables for the given component are found. When setting/unsetting a
value, the exit status is 0. When attempting to set/unset a value that has
already been hard-set in config.php, the script exits with error status 4. In
case of unexpected error, the script exits with error status 1.
Examples:
# php cfg.php
Prints tab-separated list of all core configuration variables and their values.
# php cfg.php --json
Prints list of all core configuration variables and their values as a JSON object.
# php cfg.php --name=release
Prints the given configuration variable - e.g. \$CFG->release in this case.
# php cfg.php --component=tool_recyclebin
# Prints tab-separated list of the plugin's configuration variables.
# export DATAROOT=\$(php cfg.php --name=dataroot --shell-arg --no-eol)
Stores the given configuration variable in the shell variable, escaped
so that it can be safely used as a shell argument.
# php cfg.php --name=theme --set=classic
Sets the given configuration variable to the given value.
# php cfg.php --name=noemailever --unset
Unsets the previously configured variable.
";
list($options, $unrecognised) = cli_get_params([
'help' => false,
'component' => null,
'name' => null,
'set' => null,
'unset' => false,
'shell-arg' => false,
'json' => false,
'no-eol' => false,
], [
'h' => 'help'
]);
if ($unrecognised) {
$unrecognised = implode(PHP_EOL.' ', $unrecognised);
cli_error(get_string('cliunknowoption', 'core_admin', $unrecognised));
}
if ($options['help']) {
cli_writeln($usage);
exit(2);
}
if ($options['unset'] || $options['set'] !== null) {
// Unset the variable or set it to the given value.
if (empty($options['name'])) {
cli_error('Missing configuration variable name', 2);
}
// Check that the variable is not hard-set in the main config.php already.
$component = $options['component'];
if (!empty($component)) {
$componentsettings = $CFG->forced_plugin_settings[$component] ?? [];
$settinginconfig = array_key_exists($options['name'], $componentsettings);
} else {
$settinginconfig = array_key_exists($options['name'], $CFG->config_php_settings);
}
if ($settinginconfig) {
cli_error('The configuration variable is hard-set in the config.php, unable to change.', 4);
}
$new = $options['set'];
$old = get_config($options['component'], $options['name']);
if ($new !== $old) {
set_config($options['name'], $options['set'], $options['component']);
add_to_config_log($options['name'], $old, $new, $options['component']);
}
exit(0);
}
if ($options['name'] === null) {
// List all variables provided by the component (defaults to core).
$got = get_config($options['component']);
if ($options['json']) {
cli_writeln(json_encode($got));
} else {
foreach ($got as $name => $value) {
if ($options['shell-arg']) {
$value = escapeshellarg($value);
}
cli_writeln($name."\t".$value);
}
}
exit(0);
} else {
// Display the value of a single variable.
$got = get_config($options['component'], $options['name']);
if ($got === false) {
cli_error('No such configuration variable found.', 3);
}
if ($options['shell-arg']) {
$got = escapeshellarg($got);
}
if ($options['json']) {
$got = json_encode($got);
}
if ($options['no-eol']) {
cli_write($got);
} else {
cli_writeln($got);
}
exit(0);
}
-171
View File
@@ -1,171 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* CLI tool for system checks
*
* @package core
* @category check
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define('CLI_SCRIPT', true);
require(__DIR__ . '/../../config.php');
require_once($CFG->libdir.'/clilib.php');
use core\check\result;
list($options, $unrecognized) = cli_get_params([
'help' => false,
'filter' => '',
'type' => 'status',
'verbose' => false,
], [
'h' => 'help',
'f' => 'filter',
'v' => 'verbose',
't' => 'type',
]);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
$checks = \core\check\manager::get_checks($options['type']);
$types = join(', ', \core\check\manager::TYPES);
$help = "Run Moodle system checks
Options:
-h, --help Print out this help
-f, --filter Filter to a subset of checks
-t, --type Which set of checks? Defaults to 'status'
One of $types
-v, --verbose Show details of all checks, not just failed checks
Example:
sudo -u www-data php admin/cli/checks.php
sudo -u www-data php admin/cli/checks.php -v
sudo -u www-data php admin/cli/checks.php -v --filter=environment
";
if ($options['help']) {
echo $help;
die();
}
$filter = $options['filter'];
if ($filter) {
$checks = array_filter($checks, function($check, $key) use ($filter) {
$ref = $check->get_ref();
return (strpos($ref, $filter) !== false);
}, 1);
}
// These shell exit codes and labels align with the NRPE standard.
$exitcodes = [
result::NA => 0,
result::OK => 0,
result::INFO => 0,
result::UNKNOWN => 3,
result::WARNING => 1,
result::ERROR => 2,
result::CRITICAL => 2,
];
$exitlabel = [
result::NA => 'OK',
result::OK => 'OK',
result::INFO => 'OK',
result::UNKNOWN => 'UNKNOWN',
result::WARNING => 'WARNING',
result::ERROR => 'CRITICAL',
result::CRITICAL => 'CRITICAL',
];
$format = "% 10s| % -60s\n";
$spacer = "----------+--------------------------------------------------------------------\n";
$prefix = ' |';
$output = '';
$header = $exitlabel[result::OK] . ': ' . get_string('checksok', '', $options['type']) . "\n";
$exitcode = $exitcodes[result::OK];
foreach ($checks as $check) {
$ref = $check->get_ref();
$result = $check->get_result();
$status = $result->get_status();
$checkexitcode = $exitcodes[$status];
// Summary is treated as html.
$summary = $result->get_summary();
$summary = html_to_text($summary, 60, false);
if ($checkexitcode > $exitcode) {
$exitcode = $checkexitcode;
$header = $exitlabel[$status] . ': ' . $check->get_name() . " (" . $check->get_ref() . ")\n";
}
if (empty($messages[$status])) {
$messages[$status] = $result;
}
$len = strlen(get_string('status' . $status));
if ($options['verbose'] ||
$status == result::WARNING ||
$status == result::CRITICAL ||
$status == result::ERROR) {
$output .= sprintf(
$format,
$OUTPUT->check_result($result),
sprintf('%s (%s)', $check->get_name(), $ref)
);
$summary = str_replace("\n", "\n" . $prefix . ' ', $summary);
$output .= sprintf( $format, '', ' ' . $summary);
if ($options['verbose']) {
$actionlink = $check->get_action_link();
if ($actionlink) {
$output .= sprintf( $format, '', ' ' . $actionlink->url);
}
$output .= sprintf( $format, '', '');
}
}
}
// Print NRPE header.
print $header;
// Only show the table header if there is anything to show.
if ($output) {
print sprintf($format,
get_string('status'). ' ',
get_string('check')
) . $spacer;
print $output;
}
// NRPE shell exit code.
exit($exitcode);
+4 -121
View File
@@ -30,30 +30,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
require_once($CFG->libdir.'/cronlib.php');
// now get cli options
list($options, $unrecognized) = cli_get_params(
[
'help' => false,
'stop' => false,
'list' => false,
'force' => false,
'enable' => false,
'disable' => false,
'disable-wait' => false,
], [
'h' => 'help',
's' => 'stop',
'l' => 'list',
'f' => 'force',
'e' => 'enable',
'd' => 'disable',
'w' => 'disable-wait',
]
);
list($options, $unrecognized) = cli_get_params(array('help'=>false),
array('h'=>'help'));
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
@@ -65,13 +48,7 @@ if ($options['help']) {
"Execute periodic cron actions.
Options:
-h, --help Print out this help
-s, --stop Notify all other running cron processes to stop after the current task
-l, --list Show the list of currently running tasks and how long they have been running
-f, --force Execute task even if cron is disabled
-e, --enable Enable cron
-d, --disable Disable cron
-w, --disable-wait=600 Disable cron and wait until all tasks finished or fail after N seconds (optional param)
-h, --help Print out this help
Example:
\$sudo -u www-data /usr/bin/php admin/cli/cron.php
@@ -81,98 +58,4 @@ Example:
die;
}
if ($options['stop']) {
// By clearing the caches this signals to other running processes
// to exit after finishing the current task.
\core\task\manager::clear_static_caches();
die;
}
if ($options['enable']) {
set_config('cron_enabled', 1);
mtrace('Cron has been enabled for the site.');
exit(0);
}
if ($options['disable']) {
set_config('cron_enabled', 0);
\core\task\manager::clear_static_caches();
mtrace('Cron has been disabled for the site.');
exit(0);
}
if ($options['list']) {
$tasks = \core\task\manager::get_running_tasks();
mtrace('The list of currently running tasks:');
$format = "%7s %-12s %-9s %-20s %-52s\n";
printf ($format,
'PID',
'HOST',
'TYPE',
'TIME',
'CLASSNAME'
);
foreach ($tasks as $task) {
printf ($format,
$task->pid,
substr($task->hostname, 0, 12),
$task->type,
format_time(time() - $task->timestarted),
substr($task->classname, 0, 52)
);
}
exit(0);
}
if ($wait = $options['disable-wait']) {
$started = time();
if (true === $wait) {
// Default waiting time.
$waitsec = 600;
} else {
$waitsec = $wait;
$wait = true;
}
set_config('cron_enabled', 0);
\core\task\manager::clear_static_caches();
mtrace('Cron has been disabled for the site.');
mtrace('Allocating '. format_time($waitsec) . ' for the tasks to finish.');
$lastcount = 0;
while ($wait) {
$tasks = \core\task\manager::get_running_tasks();
if (count($tasks) == 0) {
mtrace('');
mtrace('All scheduled and adhoc tasks finished.');
exit(0);
}
if (time() - $started >= $waitsec) {
mtrace('');
mtrace('Wait time ('. format_time($waitsec) . ') elapsed, but ' . count($tasks) . ' task(s) still running.');
mtrace('Exiting with code 1.');
exit(1);
}
if (count($tasks) !== $lastcount) {
mtrace('');
mtrace(count($tasks) . " tasks currently running.", '');
$lastcount = count($tasks);
} else {
mtrace('.', '');
}
sleep(1);
}
}
if (!get_config('core', 'cron_enabled') && !$options['force']) {
mtrace('Cron is disabled. Use --force to override.');
exit(1);
}
\core\local\cli\shutdown::script_supports_graceful_exit();
cron_run();
-1
View File
@@ -73,7 +73,6 @@ foreach ($rs as $user) {
echo "Redeleting user $user->id: $user->username ($user->email)\n";
delete_user($user);
}
$rs->close();
cli_heading('Deleting all leftovers');
-138
View File
@@ -1,138 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Fix orphaned calendar events that were broken by MDL-67494.
*
* This script will look for all the calendar events which userids
* where broken by a wrong upgrade step, affecting to Moodle 3.9.5
* and up.
*
* It performs checks to both:
* a) Detect if the site was affected (ran the wrong upgrade step).
* b) Look for orphaned calendar events, categorising them as:
* - standard: site / category / course / group / user events
* - subscription: events created via subscriptions.
* - action: normal action events, created to show common important dates.
* - override: user and group override events, particular, that some activities support.
* - custom: other events, not being any of the above, common or particular.
* By specifying it (--fix) try to recover as many broken events (missing userid) as
* possible. Standard, subscription, action, override events in core are fully supported but
* override or custom events should be fixed by each plugin as far as there isn't any standard
* API (plugin-wise) to launch a rebuild of the calendar events.
*
* @package core
* @copyright 2021 onwards Simey Lameze <simey@moodle.com>
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define('CLI_SCRIPT', true);
require_once(__DIR__ . '/../../config.php');
require_once($CFG->libdir . "/clilib.php");
require_once($CFG->libdir . '/db/upgradelib.php');
// Supported options.
$long = ['fix' => false, 'help' => false];
$short = ['f' => 'fix', 'h' => 'help'];
// CLI options.
[$options, $unrecognized] = cli_get_params($long, $short);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
if ($options['help']) {
$help = <<<EOT
Fix orphaned calendar events.
This script detects calendar events that have had their
userid lost. By default it will perform various checks
and report them, showing the site status in an easy way.
Also, optionally (--fix), it wil try to recover as many
lost userids as possible from different sources. Note that
this script aims to process well-know events in core,
leaving custom events in 3rd part plugins mostly unmodified
because there isn't any consistent way to regenerate them.
For more details: https://tracker.moodle.org/browse/MDL-71156
Options:
-h, --help Print out this help.
-f, --fix Fix the orphaned calendar events in the DB.
If not specified only check and report problems to STDERR.
Usage:
- Only report: \$ sudo -u www-data /usr/bin/php admin/cli/fix_orphaned_calendar_events.php
- Report and fix: \$ sudo -u www-data /usr/bin/php admin/cli/fix_orphaned_calendar_events.php -f
EOT;
cli_writeln($help);
die;
}
// Check various usual pre-requisites.
if (empty($CFG->version)) {
cli_error('Database is not yet installed.');
}
$admin = get_admin();
if (!$admin) {
cli_error('Error: No admin account was found.');
}
if (moodle_needs_upgrading()) {
cli_error('Moodle upgrade pending, script execution suspended.');
}
// Do everything as admin by default.
\core\session\manager::set_user($admin);
// Report current site status.
cli_heading('Checking the site status');
$needsfix = upgrade_calendar_site_status();
// Report current calendar events status.
cli_heading('Checking the calendar events status');
$info = upgrade_calendar_events_status();
$hasbadevents = $info['total']->bad > 0 || $info['total']->bad != $info['other']->bad;
$needsfix = $needsfix || $hasbadevents;
// If, selected, fix as many calendar events as possible.
if ($options['fix']) {
// If the report has told us that the fix was not needed... ask for confirmation!
if (!$needsfix) {
cli_writeln("This site DOES NOT NEED to run the calendar events fix.");
$input = cli_input('Are you completely sure that you want to run the fix? (y/N)', 'N', ['y', 'Y', 'n', 'N']);
if (strtolower($input) != 'y') {
exit(0);
}
cli_writeln("");
}
cli_heading('Fixing as many as possible calendar events');
upgrade_calendar_events_fix_remaining($info);
// Report current (after fix) calendar events status.
cli_heading('Checking the calendar events status (after fix)');
upgrade_calendar_events_status();
} else if ($needsfix) {
// Fix option was not provided but problem events have been found. Notify the user and provide info how to fix these events.
cli_writeln("This site NEEDS to run the calendar events fix!");
cli_writeln("To fix the calendar events, re-run this script with the --fix option.");
}
+200 -219
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
@@ -215,11 +220,11 @@ define('SITEID', 1);
//Database types
$databases = array('mysqli' => moodle_database::get_driver_instance('mysqli', 'native'),
'auroramysql' => moodle_database::get_driver_instance('auroramysql', 'native'),
'mariadb'=> moodle_database::get_driver_instance('mariadb', 'native'),
'pgsql' => moodle_database::get_driver_instance('pgsql', 'native'),
'oci' => moodle_database::get_driver_instance('oci', 'native'),
'sqlsrv' => moodle_database::get_driver_instance('sqlsrv', 'native'), // MS SQL*Server PHP driver
'mssql' => moodle_database::get_driver_instance('mssql', 'native'), // FreeTDS driver
);
foreach ($databases as $type=>$database) {
if ($database->driver_installed() !== true) {
@@ -239,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',
@@ -267,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);
@@ -393,6 +397,7 @@ if ($interactive) {
$CFG->wwwroot = $wwwroot;
$CFG->httpswwwroot = $CFG->wwwroot;
//We need dataroot before lang download
$CFG->dataroot = $options['dataroot'];
if ($interactive) {
@@ -443,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';
@@ -515,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 {
@@ -621,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();
@@ -751,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
@@ -819,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);
+11 -128
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,25 +80,12 @@ 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";
$sql = "SHOW FULL COLUMNS FROM $table->name WHERE collation IS NOT NULL";
$rs2 = $DB->get_recordset_sql($sql);
foreach ($rs2 as $column) {
$column = (object)array_change_key_case((array)$column, CASE_LOWER);
@@ -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;
}
+3 -3
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') {
@@ -158,7 +158,7 @@ if (!empty($options['info'])) {
}
foreach ($fixtables as $table) {
$DB->change_database_structure("ALTER TABLE `{$prefix}$table` ROW_FORMAT=Compressed");
$DB->change_database_structure("ALTER TABLE {$prefix}$table ROW_FORMAT=Compressed");
echo str_pad($prefix . $table, 32, ' ', STR_PAD_RIGHT) . " ... Compressed\n";
}
@@ -189,7 +189,7 @@ if (!empty($options['info'])) {
echo "SET GLOBAL innodb_file_per_table=1;\n";
echo "SET GLOBAL innodb_file_format=Barracuda;\n";
foreach ($fixtables as $table) {
echo "ALTER TABLE `{$prefix}$table` ROW_FORMAT=Compressed;\n";
echo "ALTER TABLE {$prefix}$table ROW_FORMAT=Compressed;\n";
}
echo "\n";
exit(0);
+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);
-109
View File
@@ -1,109 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* This script allows to restore a course from CLI.
*
* @package core
* @subpackage cli
* @copyright 2020 Catalyst IT
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define('CLI_SCRIPT', 1);
require(__DIR__ . '/../../config.php');
require_once($CFG->libdir . '/clilib.php');
require_once($CFG->dirroot . "/backup/util/includes/restore_includes.php");
list($options, $unrecognized) = cli_get_params([
'file' => '',
'categoryid' => '',
'showdebugging' => false,
'help' => false,
], [
'f' => 'file',
'c' => 'categoryid',
's' => 'showdebugging',
'h' => 'help',
]);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
if ($options['help'] || !($options['file']) || !($options['categoryid'])) {
$help = <<<EOL
Restore backup into provided category.
Options:
-f, --file=STRING Path to the backup file.
-c, --categoryid=INT ID of the category to restore too.
-s, --showdebugging Show developer level debugging information
-h, --help Print out this help.
Example:
\$sudo -u www-data /usr/bin/php admin/cli/restore_backup.php --file=/path/to/backup/file.mbz --categoryid=1\n
EOL;
echo $help;
exit(0);
}
if ($options['showdebugging']) {
set_debugging(DEBUG_DEVELOPER, true);
}
if (!$admin = get_admin()) {
print_error('noadmins');
}
if (!file_exists($options['file'])) {
print_error('filenotfound');
}
if (!$category = $DB->get_record('course_categories', ['id' => $options['categoryid']], 'id')) {
print_error('invalidcategoryid');
}
$backupdir = "restore_" . uniqid();
$path = $CFG->tempdir . DIRECTORY_SEPARATOR . "backup" . DIRECTORY_SEPARATOR . $backupdir;
cli_heading(get_string('extractingbackupfileto', 'backup', $path));
$fp = get_file_packer('application/vnd.moodle.backup');
$fp->extract_to_pathname($options['file'], $path);
cli_heading(get_string('preprocessingbackupfile'));
try {
list($fullname, $shortname) = restore_dbops::calculate_course_names(0, get_string('restoringcourse', 'backup'),
get_string('restoringcourseshortname', 'backup'));
$courseid = restore_dbops::create_new_course($fullname, $shortname, $category->id);
$rc = new restore_controller($backupdir, $courseid, backup::INTERACTIVE_NO,
backup::MODE_GENERAL, $admin->id, backup::TARGET_NEW_COURSE);
$rc->execute_precheck();
$rc->execute_plan();
$rc->destroy();
} catch (Exception $e) {
cli_heading(get_string('cleaningtempdata'));
fulldelete($path);
print_error('generalexceptionmessage', 'error', '', $e->getMessage());
}
cli_heading(get_string('restoredcourseid', 'backup', $courseid));
exit(0);
-168
View File
@@ -1,168 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* CLI task execution.
*
* @package core
* @subpackage cli
* @copyright 2014 Petr Skoda
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define('CLI_SCRIPT', true);
require(__DIR__ . '/../../config.php');
require_once("$CFG->libdir/clilib.php");
require_once("$CFG->libdir/cronlib.php");
list($options, $unrecognized) = cli_get_params(
[
'help' => false,
'list' => false,
'execute' => false,
'showsql' => false,
'showdebugging' => false,
'force' => false,
], [
'h' => 'help',
'f' => 'force',
]
);
if ($unrecognized) {
$unrecognized = implode("\n ", $unrecognized);
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
}
if ($options['help'] or (!$options['list'] and !$options['execute'])) {
$help =
"Scheduled cron tasks.
Options:
--execute=\\some\\task Execute scheduled task manually
--list List all scheduled tasks
--showsql Show sql queries before they are executed
--showdebugging Show developer level debugging information
-h, --help Print out this help
-f, --force Execute task even if cron is disabled
Example:
\$sudo -u www-data /usr/bin/php admin/cli/scheduled_task.php --execute=\\core\\task\\session_cleanup_task
";
echo $help;
die;
}
if ($options['showdebugging']) {
set_debugging(DEBUG_DEVELOPER, true);
}
if ($options['showsql']) {
$DB->set_debug(true);
}
if ($options['list']) {
cli_heading("List of scheduled tasks ($CFG->wwwroot)");
$shorttime = get_string('strftimedatetimeshort');
$tasks = \core\task\manager::get_all_scheduled_tasks();
echo str_pad(get_string('scheduledtasks', 'tool_task'), 50, ' ') . ' ' . str_pad(get_string('runpattern', 'tool_task'), 17, ' ')
. ' ' . str_pad(get_string('lastruntime', 'tool_task'), 40, ' ') . get_string('nextruntime', 'tool_task') . "\n";
foreach ($tasks as $task) {
$class = '\\' . get_class($task);
$schedule = $task->get_minute() . ' '
. $task->get_hour() . ' '
. $task->get_day() . ' '
. $task->get_day_of_week() . ' '
. $task->get_month() . ' '
. $task->get_day_of_week();
$nextrun = $task->get_next_run_time();
$lastrun = $task->get_last_run_time();
$plugininfo = core_plugin_manager::instance()->get_plugin_info($task->get_component());
$plugindisabled = $plugininfo && $plugininfo->is_enabled() === false && !$task->get_run_if_component_disabled();
if ($plugindisabled) {
$nextrun = get_string('plugindisabled', 'tool_task');
} else if ($task->get_disabled()) {
$nextrun = get_string('taskdisabled', 'tool_task');
} else if ($nextrun > time()) {
$nextrun = userdate($nextrun);
} else {
$nextrun = get_string('asap', 'tool_task');
}
if ($lastrun) {
$lastrun = userdate($lastrun);
} else {
$lastrun = get_string('never');
}
echo str_pad($class, 50, ' ') . ' ' . str_pad($schedule, 17, ' ') .
' ' . str_pad($lastrun, 40, ' ') . ' ' . $nextrun . "\n";
}
exit(0);
}
if ($execute = $options['execute']) {
if (!$task = \core\task\manager::get_scheduled_task($execute)) {
mtrace("Task '$execute' not found");
exit(1);
}
if (moodle_needs_upgrading()) {
mtrace("Moodle upgrade pending, cannot execute tasks.");
exit(1);
}
if (!get_config('core', 'cron_enabled') && !$options['force']) {
mtrace('Cron is disabled. Use --force to override.');
exit(1);
}
\core\task\manager::scheduled_task_starting($task);
// Increase memory limit.
raise_memory_limit(MEMORY_EXTRA);
// Emulate normal session - we use admin account by default.
cron_setup_user();
// Execute the task.
\core\local\cli\shutdown::script_supports_graceful_exit();
$cronlockfactory = \core\lock\lock_config::get_lock_factory('cron');
if (!$cronlock = $cronlockfactory->get_lock('core_cron', 10)) {
mtrace('Cannot obtain cron lock');
exit(129);
}
if (!$lock = $cronlockfactory->get_lock('\\' . get_class($task), 10)) {
$cronlock->release();
mtrace('Cannot obtain task lock');
exit(130);
}
$task->set_lock($lock);
if (!$task->is_blocking()) {
$cronlock->release();
} else {
$task->set_cron_lock($cronlock);
}
cron_run_inner_scheduled_task($task);
}
-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);
+10 -43
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) {
@@ -137,16 +126,15 @@ if (!$envstatus) {
// Test plugin dependencies.
$failed = array();
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed, $CFG->branch)) {
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) {
cli_problem(get_string('pluginscheckfailed', 'admin', array('pluginslist' => implode(', ', array_unique($failed)))));
cli_error(get_string('pluginschecktodo', 'admin'));
}
$a = new stdClass();
$a->oldversion = $oldversion;
$a->newversion = $newversion;
if ($interactive) {
$a = new stdClass();
$a->oldversion = $oldversion;
$a->newversion = $newversion;
echo cli_heading(get_string('databasechecking', '', $a)) . PHP_EOL;
}
@@ -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
-84
View File
@@ -1,84 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Content bank and its plugins settings.
*
* @package core
* @subpackage contentbank
* @copyright 2020 Amaia Anabitarte <amaia@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once('../config.php');
require_once($CFG->libdir.'/adminlib.php');
$action = required_param('action', PARAM_ALPHANUMEXT);
$name = required_param('name', PARAM_PLUGIN);
$syscontext = context_system::instance();
$PAGE->set_url('/admin/contentbank.php');
$PAGE->set_context($syscontext);
require_admin();
require_sesskey();
$return = new moodle_url('/admin/settings.php', array('section' => 'managecontentbanktypes'));
$plugins = core_plugin_manager::instance()->get_plugins_of_type('contenttype');
$sortorder = array_flip(array_keys($plugins));
if (!isset($plugins[$name])) {
print_error('contenttypenotfound', 'error', $return, $name);
}
switch ($action) {
case 'disable':
if ($plugins[$name]->is_enabled()) {
set_config('disabled', 1, 'contentbank_'. $name);
}
break;
case 'enable':
if (!$plugins[$name]->is_enabled()) {
unset_config('disabled', 'contentbank_'. $name);
}
break;
case 'up':
if ($sortorder[$name]) {
$currentindex = $sortorder[$name];
$seq = array_keys($plugins);
$seq[$currentindex] = $seq[$currentindex - 1];
$seq[$currentindex - 1] = $name;
set_config('contentbank_plugins_sortorder', implode(',', $seq));
}
break;
case 'down':
if ($sortorder[$name] < count($sortorder) - 1) {
$currentindex = $sortorder[$name];
$seq = array_keys($plugins);
$seq[$currentindex] = $seq[$currentindex + 1];
$seq[$currentindex + 1] = $name;
set_config('contentbank_plugins_sortorder', implode(',', $seq));
}
break;
}
core_plugin_manager::reset_caches();
$cache = cache::make('core', 'contentbank_enabled_extensions');
$cache->purge();
$cache = cache::make('core', 'contentbank_context_extensions');
$cache->purge();
redirect($return);
+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')));
+25 -82
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,13 +234,13 @@ 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();
}
// check plugin dependencies
$failed = array();
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed, $CFG->branch)) {
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) {
$PAGE->navbar->add(get_string('pluginscheck', 'admin'));
$PAGE->set_title($strinstallation);
$PAGE->set_heading($strinstallation . ' - Moodle ' . $CFG->target_release);
@@ -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)) {
@@ -508,9 +497,8 @@ if (!$cache and $version > $CFG->version) { // upgrade
} else {
// Always verify plugin dependencies!
$failed = array();
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed, $CFG->branch)) {
echo $output->unsatisfied_dependencies_page($version, $failed, new moodle_url($PAGE->url,
array('confirmplugincheck' => 0)));
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) {
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);
@@ -700,10 +671,9 @@ if (!$cache and moodle_needs_upgrading()) {
// Make sure plugin dependencies are always checked.
$failed = array();
if (!$pluginman->all_plugins_ok($version, $failed, $CFG->branch)) {
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,20 +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 ?? MINSECS;
$croninfrequent = !$cronoverdue && ($lastcroninterval > ($expectedfrequency + MINSECS) || $lastcron < time() - $expectedfrequency);
$dbproblems = $DB->diagnose();
$maintenancemode = !empty($CFG->maintenance_enabled);
@@ -883,29 +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);
// Check if moodle campaign content setting is enabled or not.
$showcampaigncontent = !isset($CFG->showcampaigncontent) || $CFG->showcampaigncontent;
// Encourage admins to enable the user feedback feature if it is not enabled already.
$showfeedbackencouragement = empty($CFG->enableuserfeedback);
admin_externalpage_setup('adminnotifications');
@@ -913,6 +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,
$showcampaigncontent, $showfeedbackencouragement);
$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();
}
+57
View File
@@ -0,0 +1,57 @@
<?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 admin to configure licenses.
*/
require_once('../config.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->libdir.'/licenselib.php');
require_login();
require_capability('moodle/site:config', context_system::instance());
$returnurl = "$CFG->wwwroot/$CFG->admin/settings.php?section=managelicenses";
$action = optional_param('action', '', PARAM_ALPHANUMEXT);
$license = optional_param('license', '', PARAM_SAFEDIR);
////////////////////////////////////////////////////////////////////////////////
// process actions
if (!confirm_sesskey()) {
redirect($returnurl);
}
$return = true;
switch ($action) {
case 'disable':
license_manager::disable($license);
break;
case 'enable':
license_manager::enable($license);
break;
default:
break;
}
if ($return) {
redirect ($returnurl);
}
+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();
+1 -1
View File
@@ -156,7 +156,7 @@ class mnet_review_host_form extends moodleform {
if ($mnet_peer && !empty($mnet_peer->deleted)) {
$radioarray = array();
$radioarray[] = $mform->createElement('static', 'deletedinfo', '',
$OUTPUT->container(get_string('deletedhostinfo', 'mnet'), 'alert alert-warning'));
$OUTPUT->container(get_string('deletedhostinfo', 'mnet'), 'deletedhostinfo'));
$radioarray[] = $mform->createElement('radio', 'deleted', '', get_string('yes'), 1);
$radioarray[] = $mform->createElement('radio', 'deleted', '', get_string('no'), 0);
$mform->addGroup($radioarray, 'radioar', get_string('deleted'), array(' ', ' '), false);
+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();
+3 -3
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);
@@ -170,7 +170,7 @@ foreach ($sortedbehaviours as $behaviour => $behaviourname) {
if ($version) {
$row[] = $version;
} else {
$row[] = html_writer::tag('span', get_string('nodatabase', 'admin'), array('class' => 'text-muted'));
$row[] = html_writer::tag('span', get_string('nodatabase', 'admin'), array('class' => 'disabled'));
}
// Other question types required by this one.
+5 -4
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();
@@ -172,7 +173,7 @@ foreach ($sortedqtypes as $qtypename => $localname) {
if ($version) {
$row[] = $version;
} else {
$row[] = html_writer::tag('span', get_string('nodatabase', 'admin'), array('class' => 'text-muted'));
$row[] = html_writer::tag('span', get_string('nodatabase', 'admin'), array('class' => 'disabled'));
}
// Other question types required by this one.
+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();
+106 -341
View File
@@ -253,7 +253,7 @@ class core_admin_renderer extends plugin_renderer_base {
$out .= $this->output->container(get_string('cancelinstallinfodir', 'core_plugin', $pluginfo->rootdir));
if ($repotype = $pluginman->plugin_external_source($pluginfo->component)) {
$out .= $this->output->container(get_string('uninstalldeleteconfirmexternal', 'core_plugin', $repotype),
'alert alert-warning mt-2');
'uninstalldeleteconfirmexternal');
}
}
@@ -276,24 +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
* @param bool $showcampaigncontent Whether the campaign content should be visible or not.
* @param bool $showfeedbackencouragement Whether the feedback encouragement content should be displayed or not.
*
* @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,
$showcampaigncontent = false, bool $showfeedbackencouragement = false) {
$buggyiconvnomb, $registered, array $cachewarnings = array(), $eventshandlers = 0) {
global $CFG;
$output = '';
@@ -302,22 +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);
$output .= $this->userfeedback_encouragement($showfeedbackencouragement);
$output .= $this->campaign_content($showcampaigncontent);
//////////////////////////////////////////////////////////////////////////////////////////////////
//// IT IS ILLEGAL AND A VIOLATION OF THE GPL TO HIDE, REMOVE OR MODIFY THIS COPYRIGHT NOTICE ///
@@ -367,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();
}
@@ -439,7 +418,7 @@ class core_admin_renderer extends plugin_renderer_base {
if ($repotype = $pluginman->plugin_external_source($pluginfo->component)) {
$confirm .= $this->output->container(get_string('uninstalldeleteconfirmexternal', 'core_plugin', $repotype),
'alert alert-warning mt-2');
'uninstalldeleteconfirmexternal');
}
// After any uninstall we must execute full upgrade to finish the cleanup!
@@ -518,7 +497,7 @@ class core_admin_renderer extends plugin_renderer_base {
* @return string HTML to output.
*/
protected function warning($message, $type = 'warning') {
return $this->box($message, 'generalbox alert alert-' . $type);
return $this->box($message, 'generalbox admin' . $type);
}
/**
@@ -533,25 +512,7 @@ class core_admin_renderer extends plugin_renderer_base {
return $this->warning(get_string('datarootsecuritywarning', 'admin', $CFG->dataroot));
} else if ($insecuredataroot == INSECURE_DATAROOT_ERROR) {
return $this->warning(get_string('datarootsecurityerror', 'admin', $CFG->dataroot), 'danger');
} else {
return '';
}
}
/**
* 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, 'danger');
return $this->warning(get_string('datarootsecurityerror', 'admin', $CFG->dataroot), 'error');
} else {
return '';
@@ -571,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
@@ -608,27 +556,19 @@ class core_admin_renderer extends plugin_renderer_base {
return '';
}
$check = new \tool_task\check\cronrunning();
$result = $check->get_result();
return $this->warning($result->get_summary() . '&nbsp;' . $this->help_icon('cron', 'admin'));
}
if (empty($CFG->cronclionly)) {
$url = new moodle_url('/admin/cron.php');
if (!empty($CFG->cronremotepassword)) {
$url = new moodle_url('/admin/cron.php', array('password' => $CFG->cronremotepassword));
}
/**
* 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 '';
return $this->warning(get_string('cronwarning', 'admin', $url->out()) . '&nbsp;' .
$this->help_icon('cron', 'admin'));
}
$check = new \tool_task\check\cronrunning();
$result = $check->get_result();
return $this->warning($result->get_summary() . '&nbsp;' . $this->help_icon('cron', 'admin'));
// $CFG->cronclionly is not empty: cron can run only from CLI.
return $this->warning(get_string('cronwarningcli', 'admin') . '&nbsp;' .
$this->help_icon('cron', 'admin'));
}
/**
@@ -690,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
@@ -718,7 +644,7 @@ class core_admin_renderer extends plugin_renderer_base {
return $this->warning(
$this->container(get_string('maturitycorewarning', 'admin', $maturitylevel)) .
$this->container($this->doc_link('admin/versions', get_string('morehelp'))),
'danger');
'error');
}
/*
@@ -734,7 +660,7 @@ class core_admin_renderer extends plugin_renderer_base {
}
$warning = (get_string('testsiteupgradewarning', 'admin', $testsite));
return $this->warning($warning, 'danger');
return $this->warning($warning, 'error');
}
/**
@@ -769,7 +695,7 @@ class core_admin_renderer extends plugin_renderer_base {
$level = 'warning';
if ($maturity == MATURITY_ALPHA) {
$level = 'danger';
$level = 'error';
}
$maturitylevel = get_string('maturity' . $maturity, 'admin');
@@ -820,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) {
@@ -840,82 +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 campaign content.
*
* @param bool $showcampaigncontent Whether the campaign content should be visible or not.
* @return string the campaign content raw html.
*/
protected function campaign_content(bool $showcampaigncontent): string {
if (!$showcampaigncontent) {
return '';
}
return $this->render_from_template('core/campaign_content', ['lang' => current_language()]);
}
/**
* 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
*
@@ -923,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)) {
@@ -943,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)) {
@@ -952,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;
}
@@ -966,7 +828,7 @@ class core_admin_renderer extends plugin_renderer_base {
protected function release_notes_link() {
$releasenoteslink = get_string('releasenoteslink', 'admin', 'http://docs.moodle.org/dev/Releases');
$releasenoteslink = str_replace('target="_blank"', 'onclick="this.target=\'_blank\'"', $releasenoteslink); // extremely ugly validation hack
return $this->box($releasenoteslink, 'generalbox alert alert-info');
return $this->box($releasenoteslink, 'generalbox releasenoteslink');
}
/**
@@ -995,7 +857,7 @@ class core_admin_renderer extends plugin_renderer_base {
* @return string HTML code
*/
public function plugins_check_table(core_plugin_manager $pluginman, $version, array $options = array()) {
global $CFG;
$plugininfo = $pluginman->get_plugins();
if (empty($plugininfo)) {
@@ -1066,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);
@@ -1074,46 +936,44 @@ 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);
$incompatibledependency = $plugin->is_core_compatible_satisfied($CFG->branch);
$otherpluginsdependencies = $pluginman->are_dependencies_satisfied($plugin->get_other_required_plugins());
$dependenciesok = $coredependency && $otherpluginsdependencies && $incompatibledependency;
$dependenciesok = $coredependency && $otherpluginsdependencies;
$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')
);
}
@@ -1122,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')
);
}
@@ -1134,11 +994,8 @@ class core_admin_renderer extends plugin_renderer_base {
}
$status = new html_table_cell($sourcelabel.' '.$status);
if ($plugin->pluginsupported != null) {
$requires = new html_table_cell($this->required_column($plugin, $pluginman, $version, $CFG->branch));
} else {
$requires = new html_table_cell($this->required_column($plugin, $pluginman, $version));
}
$requires = new html_table_cell($this->required_column($plugin, $pluginman, $version));
$statusisboring = in_array($statuscode, array(
core_plugin_manager::PLUGIN_STATUS_NODB, core_plugin_manager::PLUGIN_STATUS_UPTODATE));
@@ -1195,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) {
@@ -1203,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')
);
}
@@ -1221,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.
@@ -1299,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();
@@ -1319,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) {
@@ -1338,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.
@@ -1383,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');
}
}
@@ -1399,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 = '';
@@ -1410,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
);
}
@@ -1474,54 +1326,38 @@ class core_admin_renderer extends plugin_renderer_base {
* @param \core\plugininfo\base $plugin the plugin we are rendering the row for.
* @param core_plugin_manager $pluginman provides data on all the plugins.
* @param string $version
* @param int $branch the current Moodle branch
* @return string HTML code
*/
protected function required_column(\core\plugininfo\base $plugin, core_plugin_manager $pluginman, $version, $branch = null) {
protected function required_column(\core\plugininfo\base $plugin, core_plugin_manager $pluginman, $version) {
$requires = array();
$displayuploadlink = false;
$displayupdateslink = false;
$requirements = $pluginman->resolve_requirements($plugin, $version, $branch);
foreach ($requirements as $reqname => $reqinfo) {
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');
$label = html_writer::span(get_string('dependencyfails', 'core_plugin'), 'label label-important');
}
if ($branch != null && !$plugin->is_core_compatible_satisfied($branch)) {
$requires[] = html_writer::tag('li',
html_writer::span(get_string('incompatibleversion', 'core_plugin', $branch), 'dep dep-core').
$requires[] = html_writer::tag('li',
html_writer::span(get_string('moodleversion', 'core_plugin', $plugin->versionrequires), 'dep dep-core').
' '.$label, array('class' => $class));
} else if ($branch != null && $plugin->pluginsupported != null) {
$requires[] = html_writer::tag('li',
html_writer::span(get_string('moodlebranch', 'core_plugin',
array('min' => $plugin->pluginsupported[0], 'max' => $plugin->pluginsupported[1])), 'dep dep-core').
' '.$label, array('class' => $class));
} else 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));
}
} 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)),
@@ -1529,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;
@@ -1570,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'
);
@@ -1587,20 +1422,12 @@ 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'
);
}
// Check if supports is present, and $branch is not in, only if $incompatible check was ok.
if ($plugin->pluginsupported != null && $class == 'requires-ok' && $branch != null) {
if ($pluginman->check_explicitly_supported($plugin, $branch) == $pluginman::VERSION_NOT_SUPPORTED) {
$out .= html_writer::div(get_string('notsupported', 'core_plugin', $branch));
}
}
return $out;
}
@@ -1771,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;
@@ -1819,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 = '';
}
@@ -1947,7 +1774,7 @@ class core_admin_renderer extends plugin_renderer_base {
get_string('status'),
);
$servertable->colclasses = array('centeralign name', 'centeralign info', 'leftalign report', 'leftalign plugin', 'centeralign status');
$servertable->attributes['class'] = 'admintable environmenttable generaltable table-sm';
$servertable->attributes['class'] = 'admintable environmenttable generaltable';
$servertable->id = 'serverstatus';
$serverdata = array('ok'=>array(), 'warn'=>array(), 'error'=>array());
@@ -1960,7 +1787,7 @@ class core_admin_renderer extends plugin_renderer_base {
get_string('status'),
);
$othertable->colclasses = array('aligncenter info', 'alignleft report', 'alignleft plugin', 'aligncenter status');
$othertable->attributes['class'] = 'admintable environmenttable generaltable table-sm';
$othertable->attributes['class'] = 'admintable environmenttable generaltable';
$othertable->id = 'otherserverstatus';
$otherdata = array('ok'=>array(), 'warn'=>array(), 'error'=>array());
@@ -2056,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
@@ -2127,16 +1947,8 @@ class core_admin_renderer extends plugin_renderer_base {
$output .= $this->container_start('upgradekeyreq');
$output .= $this->heading(get_string('upgradekeyreq', 'core_admin'));
$output .= html_writer::start_tag('form', array('method' => 'POST', 'action' => $url));
$output .= html_writer::empty_tag('input', [
'name' => 'upgradekey',
'type' => 'password',
'class' => 'form-control w-auto',
]);
$output .= html_writer::empty_tag('input', [
'type' => 'submit',
'value' => get_string('submit'),
'class' => 'btn btn-primary mt-3',
]);
$output .= html_writer::empty_tag('input', array('name' => 'upgradekey', 'type' => 'password'));
$output .= html_writer::empty_tag('input', array('value' => get_string('submit'), 'type' => 'submit'));
$output .= html_writer::end_tag('form');
$output .= $this->container_end();
$output .= $this->footer();
@@ -2158,51 +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);
}
/**
* Display message about benefits of enabling the user feedback feature.
*
* @param bool $showfeedbackencouragement Whether the encouragement content should be displayed or not
* @return string
*/
protected function userfeedback_encouragement(bool $showfeedbackencouragement): string {
$output = '';
if ($showfeedbackencouragement) {
$settingslink = new moodle_url('/admin/settings.php', ['section' => 'userfeedback']);
$output .= $this->warning(get_string('userfeedbackencouragement', 'admin', $settingslink->out()), 'info');
}
return $output;
}
}
+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');

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