Merge branch 'MDL-61839-master' of git://github.com/mihailges/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 7 Aug 2018 21:52:08 +0000 (23:52 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 7 Aug 2018 21:52:08 +0000 (23:52 +0200)
42 files changed:
Gruntfile.js
admin/registration/index.php
admin/tool/dataprivacy/classes/data_registry.php
admin/tool/dataprivacy/db/upgrade.php [new file with mode: 0644]
admin/tool/dataprivacy/version.php
calendar/upgrade.txt
course/format/upgrade.txt
course/upgrade.txt
lang/en/hub.php
lib/accesslib.php
lib/classes/event/message_sent.php
lib/classes/hub/api.php
lib/classes/hub/registration.php
lib/classes/hub/site_unregistration_form.php
lib/classes/message/manager.php
lib/deprecatedlib.php
lib/filebrowser/file_info_context_course.php
lib/form/htmleditor.php
lib/messagelib.php
lib/moodlelib.php
lib/tests/csslib_test.php
lib/upgrade.txt
message/tests/events_test.php
message/upgrade.txt
mod/assign/backup/moodle2/backup_assign_stepslib.php
mod/assign/backup/moodle2/restore_assign_stepslib.php
mod/assign/lib.php
mod/assign/tests/lib_test.php
mod/lti/service/memberships/classes/local/resources/linkmemberships.php
mod/upgrade.txt
question/type/ddwtos/tests/edit_form_test.php [new file with mode: 0644]
question/type/gapselect/edit_form_base.php
question/type/gapselect/edit_gapselect_form.php
question/type/gapselect/tests/edit_form_test.php
report/upgrade.txt
repository/coursefiles/pix/icon.svg [new file with mode: 0644]
repository/local/pix/icon.svg [new file with mode: 0644]
repository/recent/pix/icon.svg [new file with mode: 0644]
repository/user/pix/icon.svg [new file with mode: 0644]
theme/boost/scss/moodle/undo.scss
theme/boost/style/moodle.css
theme/upgrade.txt

index 4501fc6..78583d0 100644 (file)
@@ -37,7 +37,7 @@ module.exports = function(grunt) {
     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 too old. Require ' + expected + ', version installed: ' + actual);
+        grunt.fail.fatal('Node version not satisfied. Require ' + expected + ', version installed: ' + actual);
     }
 
     // Windows users can't run grunt in a subdirectory, so allow them to set
index 57d65a3..62f251a 100644 (file)
@@ -40,8 +40,9 @@ if ($unregistration && \core\hub\registration::is_registered()) {
     if ($siteunregistrationform->is_cancelled()) {
         redirect(new moodle_url('/admin/registration/index.php'));
     } else if ($data = $siteunregistrationform->get_data()) {
-        if (\core\hub\registration::unregister($data->unpublishalladvertisedcourses,
-            $data->unpublishalluploadedcourses)) {
+        \core\hub\registration::unregister($data->unpublishalladvertisedcourses,
+            $data->unpublishalluploadedcourses);
+        if (!\core\hub\registration::is_registered()) {
             redirect(new moodle_url('/admin/registration/index.php'));
         }
     }
index 1435fcd..dbc8f32 100644 (file)
@@ -147,8 +147,8 @@ class data_registry {
 
         if ($contextcourse = $context->get_course_context(false)) {
             // Below course level we look at module or block level roles + course-assigned roles.
-            $courseroles = get_roles_with_assignment_on_context($contextcourse);
-            $roles = $courseroles + get_roles_with_assignment_on_context($context);
+            $courseroles = get_roles_used_in_context($contextcourse, false);
+            $roles = $courseroles + get_roles_used_in_context($context, false);
         } else {
             // We list category + system for others (we don't work with user instances so no need to work about them).
             $roles = get_roles_used_in_context($context);
diff --git a/admin/tool/dataprivacy/db/upgrade.php b/admin/tool/dataprivacy/db/upgrade.php
new file mode 100644 (file)
index 0000000..8c0b4fc
--- /dev/null
@@ -0,0 +1,149 @@
+<?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/>.
+
+/**
+ * tool_dataprivacy plugin upgrade code
+ *
+ * @package    tool_dataprivacy
+ * @copyright  2018 Jun Pataleta
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Function to upgrade tool_dataprivacy.
+ *
+ * @param int $oldversion the version we are upgrading from
+ * @return bool result
+ */
+function xmldb_tool_dataprivacy_upgrade($oldversion) {
+    global $CFG, $DB;
+
+    $dbman = $DB->get_manager();
+
+    if ($oldversion < 2018051405) {
+        // Define table tool_dataprivacy_ctxexpired to be created.
+        $table = new xmldb_table('tool_dataprivacy_ctxexpired');
+
+        // Adding fields to table tool_dataprivacy_ctxexpired.
+        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
+        $table->add_field('contextid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+        $table->add_field('status', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0');
+        $table->add_field('usermodified', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+        $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+        $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+
+        // Adding keys to table tool_dataprivacy_ctxexpired.
+        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
+        $table->add_key('contextid', XMLDB_KEY_FOREIGN_UNIQUE, array('contextid'), 'context', array('id'));
+
+        // Conditionally launch create table for tool_dataprivacy_ctxexpired.
+        if (!$dbman->table_exists($table)) {
+            $dbman->create_table($table);
+        }
+
+        // Define table tool_dataprivacy_contextlist to be created.
+        $table = new xmldb_table('tool_dataprivacy_contextlist');
+
+        // Adding fields to table tool_dataprivacy_contextlist.
+        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
+        $table->add_field('component', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
+        $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
+        $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
+
+        // Adding keys to table tool_dataprivacy_contextlist.
+        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
+
+        // Conditionally launch create table for tool_dataprivacy_contextlist.
+        if (!$dbman->table_exists($table)) {
+            $dbman->create_table($table);
+        }
+
+        // Define table tool_dataprivacy_ctxlst_ctx to be created.
+        $table = new xmldb_table('tool_dataprivacy_ctxlst_ctx');
+
+        // Adding fields to table tool_dataprivacy_ctxlst_ctx.
+        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
+        $table->add_field('contextid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+        $table->add_field('contextlistid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+        $table->add_field('status', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0');
+        $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
+        $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
+
+        // Adding keys to table tool_dataprivacy_ctxlst_ctx.
+        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
+        $table->add_key('contextlistid', XMLDB_KEY_FOREIGN, array('contextlistid'), 'tool_dataprivacy_contextlist', array('id'));
+
+        // Conditionally launch create table for tool_dataprivacy_ctxlst_ctx.
+        if (!$dbman->table_exists($table)) {
+            $dbman->create_table($table);
+        }
+
+        // Define table tool_dataprivacy_rqst_ctxlst to be created.
+        $table = new xmldb_table('tool_dataprivacy_rqst_ctxlst');
+
+        // Adding fields to table tool_dataprivacy_rqst_ctxlst.
+        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
+        $table->add_field('requestid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+        $table->add_field('contextlistid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+
+        // Adding keys to table tool_dataprivacy_rqst_ctxlst.
+        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
+        $table->add_key('requestid', XMLDB_KEY_FOREIGN, array('requestid'), 'tool_dataprivacy_request', array('id'));
+        $table->add_key('contextlistid', XMLDB_KEY_FOREIGN, array('contextlistid'), 'tool_dataprivacy_contextlist', array('id'));
+        $table->add_key('request_contextlist', XMLDB_KEY_UNIQUE, array('requestid', 'contextlistid'));
+
+        // Conditionally launch create table for tool_dataprivacy_rqst_ctxlst.
+        if (!$dbman->table_exists($table)) {
+            $dbman->create_table($table);
+        }
+
+        // Define field lawfulbases to be added to tool_dataprivacy_purpose.
+        $table = new xmldb_table('tool_dataprivacy_purpose');
+
+        // It is a required field. We initially define and add it as null and later update it to XMLDB_NOTNULL.
+        $field = new xmldb_field('lawfulbases', XMLDB_TYPE_TEXT, null, null, null, null, null, 'descriptionformat');
+
+        // Conditionally launch add field lawfulbases.
+        if (!$dbman->field_exists($table, $field)) {
+            $dbman->add_field($table, $field);
+
+            // Set a kind-of-random value to lawfulbasis field.
+            $DB->set_field('tool_dataprivacy_purpose', 'lawfulbases', 'gdpr_art_6_1_a');
+
+            // We redefine it now as not null.
+            $field = new xmldb_field('lawfulbases', XMLDB_TYPE_TEXT, null, null, XMLDB_NOTNULL, null, null, 'descriptionformat');
+
+            // Launch change of nullability for field lawfulbases.
+            $dbman->change_field_notnull($table, $field);
+        }
+
+        // Define field sensitivedatareasons to be added to tool_dataprivacy_purpose.
+        $table = new xmldb_table('tool_dataprivacy_purpose');
+        $field = new xmldb_field('sensitivedatareasons', XMLDB_TYPE_TEXT, null, null, null, null, null, 'lawfulbases');
+
+        // Conditionally launch add field sensitivedatareasons.
+        if (!$dbman->field_exists($table, $field)) {
+            $dbman->add_field($table, $field);
+        }
+
+        // Dataprivacy savepoint reached.
+        upgrade_plugin_savepoint(true, 2018051405, 'tool', 'dataprivacy');
+    }
+
+    return true;
+}
index f2cf6d1..f5c7977 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version   = 2018051403;
+$plugin->version   = 2018051405;
 $plugin->requires  = 2018050800;        // Moodle 3.5dev (Build 2018031600) and upwards.
 $plugin->component = 'tool_dataprivacy';
index 6d3489e..342ad35 100644 (file)
@@ -6,6 +6,8 @@ information provided here is intended especially for developers.
 * calendar_set_filters() function now has optional $user parameter.
 * The core_calendar\local\event\container class now provides two new helper methods for getting and setting the requesting user:
   set_requesting_user() and get_requesting_user().
+* The following functions have been finally deprecated and can not be used anymore:
+  * calendar_preferences_button()
 
 === 3.5 ===
 * core_calendar_external::get_calendar_events now returns the categoryid for category events.
index 16a2c66..68d7194 100644 (file)
@@ -8,6 +8,8 @@ Overview of this plugin type at http://docs.moodle.org/dev/Course_formats
   Note that validate_format_options() is now always called when somebody creates or edits course or section and also
   during restore and course upload. Default implementation validates against the definition of the form elements for
   format options.
+* The final deprecation of xxx_delete_course callback means that this function will no longer be called.
+  Please use the observer for event \core\event\course_content_deleted instead.
 
 === 3.5 ===
 * Course formats should overwrite get_config_for_external function to return the course format settings viewable by the
index a181c44..62a9d36 100644 (file)
@@ -2,9 +2,9 @@ This files describes API changes in /course/*,
 information provided here is intended especially for developers.
 
 === 3.5 ===
- * There is a new capability 'moodle/course:forcelanguage' to control which users can force the course
+ * There is a new capability 'moodle/course:setforcedlanguage' to control which users can force the course
    language; create_course and update_course functions delegate access control to the caller code; if you
-   are calling those functions you may be interested in checking if the logged in user has 'moodle/course:forcelanguage' capability.
+   are calling those functions you may be interested in checking if the logged in user has 'moodle/course:setforcedlanguage' capability.
 
 === 3.3 ===
 
index 4a9937d..2e2bcf7 100644 (file)
@@ -80,6 +80,7 @@ $string['errorotherhubsnotsupported'] = 'This page can no longer be used for reg
 $string['errorregistration'] = 'An error occurred during registration, please try again later. ({$a})';
 $string['errorunpublishcourses'] = 'Due to an unexpected error, the courses could not be deleted from Moodle.net. Try again later (recommended) or contact Moodle.net administrator.';
 $string['errorws'] = '{$a}';
+$string['errorwstokenreset'] = '{$a}. Registration token on this site has been reset. You can now register your site again.';
 $string['existingscreenshotnumber'] = '{$a} existing screenshots. You will be able to see these screenshots on this page, only once the Moodle.net administrator enables your course.';
 $string['errorregistrationupdate'] = 'An error occurred during registration update ({$a})';
 $string['existingscreenshots'] = 'Existing screenshots';
@@ -210,6 +211,7 @@ $string['update'] = 'Update';
 $string['updatesite'] = 'Update registration on {$a}';
 $string['updatestatus'] = 'Check it now.';
 $string['usedifferentemail'] = 'Use different email';
+$string['unregisterexplained'] = 'If the site with URL {$a} is registered on Moodle.net its registration will be removed.';
 $string['urlalreadyregistered'] = 'Your site seems to be already registered on Moodle.net, which means something has gone wrong. Please contact the Moodle.net administrator to reset your registration so you can try again.';
 $string['usersnumber'] = 'Number of users ({$a})';
 $string['wrongtoken'] = 'The registration failed for some unknown reason (network?). Please try again.';
index 536504c..5172ef4 100644 (file)
@@ -2548,12 +2548,17 @@ function get_profile_roles(context $context) {
  * Gets the list of roles assigned to this context and up (parents)
  *
  * @param context $context
+ * @param boolean $includeparents, false means without parents.
  * @return array
  */
-function get_roles_used_in_context(context $context) {
+function get_roles_used_in_context(context $context, $includeparents = true) {
     global $DB;
 
-    list($contextlist, $params) = $DB->get_in_or_equal($context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'cl');
+    if ($includeparents === true) {
+        list($contextlist, $params) = $DB->get_in_or_equal($context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'cl');
+    } else {
+        list($contextlist, $params) = $DB->get_in_or_equal($context->id, SQL_PARAMS_NAMED, 'cl');
+    }
 
     if ($coursecontext = $context->get_course_context(false)) {
         $params['coursecontext'] = $coursecontext->id;
@@ -3988,22 +3993,6 @@ function get_user_capability_course($capability, $userid = null, $doanything = t
     return empty($courses) ? false : $courses;
 }
 
-/**
- * This function finds the roles assigned directly to this context only
- * i.e. no roles in parent contexts
- *
- * @param context $context
- * @return array
- */
-function get_roles_on_exact_context(context $context) {
-    global $DB;
-
-    return $DB->get_records_sql("SELECT r.*
-                                   FROM {role_assignments} ra, {role} r
-                                  WHERE ra.roleid = r.id AND ra.contextid = ?",
-                                array($context->id));
-}
-
 /**
  * Switches the current user to another role for the current session and only
  * in the given context.
@@ -4091,22 +4080,6 @@ function get_capabilities_from_role_on_context($role, context $context) {
                                 array($context->id, $role->id));
 }
 
-/**
- * Find out which roles has assignment on this context
- *
- * @param context $context
- * @return array
- *
- */
-function get_roles_with_assignment_on_context(context $context) {
-    global $DB;
-
-    return $DB->get_records_sql("SELECT r.*
-                                   FROM {role_assignments} ra, {role} r
-                                  WHERE ra.roleid = r.id AND ra.contextid = ?",
-                                array($context->id));
-}
-
 /**
  * Find all user assignment of users for this role, on this context
  *
index 9b3a8c5..0bfe22c 100644 (file)
@@ -43,14 +43,13 @@ defined('MOODLE_INTERNAL') || die();
 class message_sent extends base {
     /**
      * Create event using ids.
-     * @todo MDL-55449 Make $courseid mandatory in Moodle 3.6
      * @param int $userfromid
      * @param int $usertoid
      * @param int $messageid
-     * @param int|null $courseid course id the event is related with. Use SITEID if no relation exists.
+     * @param int $courseid course id the event is related with.
      * @return message_sent
      */
-    public static function create_from_ids($userfromid, $usertoid, $messageid, $courseid = null) {
+    public static function create_from_ids(int $userfromid, int $usertoid, int $messageid, int $courseid) {
         // We may be sending a message from the 'noreply' address, which means we are not actually sending a
         // message from a valid user. In this case, we will set the userid to 0.
         // Check if the userid is valid.
@@ -58,15 +57,6 @@ class message_sent extends base {
             $userfromid = 0;
         }
 
-        // TODO: MDL-55449 Make $courseid mandatory in Moodle 3.6.
-        if (is_null($courseid)) {
-            // Arrived here with not defined $courseid to associate the event with.
-            // Let's default to SITEID and perform debugging so devs are aware. MDL-47162.
-            $courseid = SITEID;
-            debugging('message_sent::create_from_ids() needs a $courseid to be passed, nothing was detected. Please, change ' .
-                    'the call to include it, using SITEID if the message is unrelated to any real course.', DEBUG_DEVELOPER);
-        }
-
         $event = self::create(array(
             'objectid' => $messageid,
             'userid' => $userfromid,
index 2c66b58..75a0508 100644 (file)
@@ -91,10 +91,11 @@ class api {
         $curloutput = @json_decode($curl->get($serverurl, $params), true);
         $info = $curl->get_info();
         if ($curl->get_errno()) {
+            // Connection error.
             throw new moodle_exception('errorconnect', 'hub', '', $curl->error);
         } else if (isset($curloutput['exception'])) {
-            // Error message returned by web service.
-            throw new moodle_exception('errorws', 'hub', '', $curloutput['message']);
+            // Exception occurred on moodle.net .
+            self::process_curl_exception($token, $curloutput);
         } else if ($info['http_code'] != 200) {
             throw new moodle_exception('errorconnect', 'hub', '', $info['http_code']);
         } else {
@@ -102,6 +103,29 @@ class api {
         }
     }
 
+    /**
+     * Analyses exception received from moodle.net
+     *
+     * @param string $token token used for CURL request
+     * @param array $curloutput output from CURL request
+     * @throws moodle_exception
+     */
+    protected static function process_curl_exception($token, $curloutput) {
+        if (!isset($curloutput['exception'])) {
+            return;
+        }
+        if ($token === registration::get_token()) {
+            // Check if registration token was rejected or there are other problems with registration.
+            if (($curloutput['exception'] === 'moodle_exception' && $curloutput['errorcode'] === 'invalidtoken')
+                    || $curloutput['exception'] === 'registration_exception') {
+                // Force admin to repeat site registration process.
+                registration::reset_token();
+                throw new moodle_exception('errorwstokenreset', 'hub', '', $curloutput['message']);
+            }
+        }
+        throw new moodle_exception('errorws', 'hub', '', $curloutput['message']);
+    }
+
     /**
      * Update site registration on moodle.net
      *
@@ -109,7 +133,7 @@ class api {
      * @throws moodle_exception
      */
     public static function update_registration(array $siteinfo) {
-        $params = array('siteinfo' => $siteinfo);
+        $params = array('siteinfo' => $siteinfo, 'validateurl' => 1);
         self::call('hub_update_site_info', $params);
     }
 
@@ -276,7 +300,8 @@ class api {
      * @throws moodle_exception
      */
     public static function unregister_site() {
-        self::call('hub_unregister_site');
+        global $CFG;
+        self::call('hub_unregister_site', ['url' => [$CFG->wwwroot]]);
     }
 
     /**
index dc09ffb..823e47f 100644 (file)
@@ -275,6 +275,11 @@ class registration {
         try {
             api::update_registration($siteinfo);
         } catch (moodle_exception $e) {
+            if (!self::is_registered()) {
+                // Token was rejected during registration update and site and locally stored token was reset,
+                // proceed to site registration. This method will redirect away.
+                self::register('');
+            }
             \core\notification::add(get_string('errorregistrationupdate', 'hub', $e->getMessage()),
                 \core\output\notification::NOTIFY_ERROR);
             return false;
@@ -428,6 +433,20 @@ class registration {
         return true;
     }
 
+    /**
+     * Resets the registration token without changing site identifier so site can be re-registered
+     *
+     * @return bool
+     */
+    public static function reset_token() {
+        global $DB;
+        if (!$hub = self::get_registration()) {
+            return true;
+        }
+        $DB->delete_records('registration_hubs', array('id' => $hub->id));
+        self::$registration = null;
+    }
+
     /**
      * Generate a new token for the site that is not registered
      *
index ed4116a..70fc070 100644 (file)
@@ -42,6 +42,7 @@ class site_unregistration_form extends \moodleform {
      * Form definition
      */
     public function definition() {
+        global $CFG;
         $mform = & $this->_form;
         $mform->addElement('header', 'site', get_string('unregister', 'hub'));
 
@@ -56,6 +57,8 @@ class site_unregistration_form extends \moodleform {
         $mform->addElement('hidden', 'unregistration', 1);
         $mform->setType('unregistration', PARAM_INT);
 
+        $mform->addElement('static', 'explanation', '', get_string('unregisterexplained', 'hub', $CFG->wwwroot));
+
         $this->add_action_buttons(true, $unregisterlabel);
     }
 }
index c05e14d..17192f3 100644 (file)
@@ -50,30 +50,14 @@ class manager {
      *
      * NOTE: to be used from message_send() only.
      *
-     * @todo MDL-55449 Drop support for stdClass in Moodle 3.6
      * @param \core\message\message $eventdata fully prepared event data for processors
      * @param \stdClass $savemessage the message saved in 'message' table
      * @param array $processorlist list of processors for target user
      * @return int $messageid the id from 'messages' (false is not returned)
      */
-    public static function send_message($eventdata, \stdClass $savemessage, array $processorlist) {
+    public static function send_message(message $eventdata, \stdClass $savemessage, array $processorlist) {
         global $CFG;
 
-        // TODO MDL-55449 Drop support for stdClass in Moodle 3.6.
-        if (!($eventdata instanceof \stdClass) && !($eventdata instanceof message)) {
-            // Not a valid object.
-            throw new \coding_exception('Message should be of type stdClass or \core\message\message');
-        }
-
-        // TODO MDL-55449 Drop support for stdClass in Moodle 3.6.
-        if ($eventdata instanceof \stdClass) {
-            if (!isset($eventdata->courseid)) {
-                $eventdata->courseid = null;
-            }
-
-            debugging('eventdata as \stdClass is deprecated. Please use \core\message\message instead.', DEBUG_DEVELOPER);
-        }
-
         require_once($CFG->dirroot.'/message/lib.php'); // This is most probably already included from messagelib.php file.
 
         if (empty($processorlist)) {
index 38c5f08..4b13b9b 100644 (file)
@@ -904,30 +904,12 @@ function print_checkbox() {
 }
 
 /**
- * Prints the 'update this xxx' button that appears on module pages.
- *
  * @deprecated since Moodle 3.2
- *
- * @param string $cmid the course_module id.
- * @param string $ignored not used any more. (Used to be courseid.)
- * @param string $string the module name - get_string('modulename', 'xxx')
- * @return string the HTML for the button, if this user has permission to edit it, else an empty string.
  */
-function update_module_button($cmid, $ignored, $string) {
-    global $CFG, $OUTPUT;
-
-    debugging('update_module_button() has been deprecated and should not be used anymore. Activity modules should not add the ' .
-        'edit module button, the link is already available in the Administration block. Themes can choose to display the link ' .
-        'in the buttons row consistently for all module types.', DEBUG_DEVELOPER);
-
-    if (has_capability('moodle/course:manageactivities', context_module::instance($cmid))) {
-        $string = get_string('updatethis', '', $string);
-
-        $url = new moodle_url("$CFG->wwwroot/course/mod.php", array('update' => $cmid, 'return' => true, 'sesskey' => sesskey()));
-        return $OUTPUT->single_button($url, $string);
-    } else {
-        return '';
-    }
+function update_module_button() {
+    throw new coding_exception('update_module_button() can not be used anymore. Activity modules should ' .
+        'not add the edit module button, the link is already available in the Administration block. Themes ' .
+        'can choose to display the link in the buttons row consistently for all module types.');
 }
 
 /**
@@ -2276,1667 +2258,252 @@ function external_function_info() {
 }
 
 /**
- * Retrieves an array of records from a CSV file and places
- * them into a given table structure
- * This function is deprecated. Please use csv_import_reader() instead.
- *
- * @deprecated since Moodle 3.2 MDL-55126
- * @todo MDL-55195 for final deprecation in Moodle 3.6
+ * @deprecated since Moodle 3.2
  * @see csv_import_reader::load_csv_content()
- * @global stdClass $CFG
- * @global moodle_database $DB
- * @param string $file The path to a CSV file
- * @param string $table The table to retrieve columns from
- * @return bool|array Returns an array of CSV records or false
  */
-function get_records_csv($file, $table) {
-    global $CFG, $DB;
-
-    debugging('get_records_csv() is deprecated. Please use lib/csvlib.class.php csv_import_reader() instead.');
-
-    if (!$metacolumns = $DB->get_columns($table)) {
-        return false;
-    }
-
-    if(!($handle = @fopen($file, 'r'))) {
-        print_error('get_records_csv failed to open '.$file);
-    }
-
-    $fieldnames = fgetcsv($handle, 4096);
-    if(empty($fieldnames)) {
-        fclose($handle);
-        return false;
-    }
-
-    $columns = array();
-
-    foreach($metacolumns as $metacolumn) {
-        $ord = array_search($metacolumn->name, $fieldnames);
-        if(is_int($ord)) {
-            $columns[$metacolumn->name] = $ord;
-        }
-    }
-
-    $rows = array();
-
-    while (($data = fgetcsv($handle, 4096)) !== false) {
-        $item = new stdClass;
-        foreach($columns as $name => $ord) {
-            $item->$name = $data[$ord];
-        }
-        $rows[] = $item;
-    }
-
-    fclose($handle);
-    return $rows;
-}
-
-/**
- * Create a file with CSV contents
- * This function is deprecated. Please use download_as_dataformat() instead.
- *
- * @deprecated since Moodle 3.2 MDL-55126
- * @todo MDL-55195 for final deprecation in Moodle 3.6
- * @see download_as_dataformat (lib/dataformatlib.php)
- * @global stdClass $CFG
- * @global moodle_database $DB
- * @param string $file The file to put the CSV content into
- * @param array $records An array of records to write to a CSV file
- * @param string $table The table to get columns from
- * @return bool success
- */
-function put_records_csv($file, $records, $table = NULL) {
-    global $CFG, $DB;
-
-    debugging('put_records_csv() is deprecated. Please use lib/dataformatlib.php download_as_dataformat()');
-
-    if (empty($records)) {
-        return true;
-    }
-
-    $metacolumns = NULL;
-    if ($table !== NULL && !$metacolumns = $DB->get_columns($table)) {
-        return false;
-    }
-
-    echo "x";
-
-    if(!($fp = @fopen($CFG->tempdir.'/'.$file, 'w'))) {
-        print_error('put_records_csv failed to open '.$file);
-    }
-
-    $proto = reset($records);
-    if(is_object($proto)) {
-        $fields_records = array_keys(get_object_vars($proto));
-    }
-    else if(is_array($proto)) {
-        $fields_records = array_keys($proto);
-    }
-    else {
-        return false;
-    }
-    echo "x";
-
-    if(!empty($metacolumns)) {
-        $fields_table = array_map(create_function('$a', 'return $a->name;'), $metacolumns);
-        $fields = array_intersect($fields_records, $fields_table);
-    }
-    else {
-        $fields = $fields_records;
-    }
-
-    fwrite($fp, implode(',', $fields));
-    fwrite($fp, "\r\n");
-
-    foreach($records as $record) {
-        $array  = (array)$record;
-        $values = array();
-        foreach($fields as $field) {
-            if(strpos($array[$field], ',')) {
-                $values[] = '"'.str_replace('"', '\"', $array[$field]).'"';
-            }
-            else {
-                $values[] = $array[$field];
-            }
-        }
-        fwrite($fp, implode(',', $values)."\r\n");
-    }
-
-    fclose($fp);
-    @chmod($CFG->tempdir.'/'.$file, $CFG->filepermissions);
-    return true;
+function get_records_csv() {
+    throw new coding_exception('get_records_csv() can not be used anymore. Please use ' .
+        'lib/csvlib.class.php csv_import_reader() instead.');
 }
 
 /**
- * Determines if the given value is a valid CSS colour.
- *
- * A CSS colour can be one of the following:
- *    - Hex colour:  #AA66BB
- *    - RGB colour:  rgb(0-255, 0-255, 0-255)
- *    - RGBA colour: rgba(0-255, 0-255, 0-255, 0-1)
- *    - HSL colour:  hsl(0-360, 0-100%, 0-100%)
- *    - HSLA colour: hsla(0-360, 0-100%, 0-100%, 0-1)
- *
- * Or a recognised browser colour mapping {@link css_optimiser::$htmlcolours}
- *
  * @deprecated since Moodle 3.2
- * @todo MDL-56173 for final deprecation in Moodle 3.6
- * @param string $value The colour value to check
- * @return bool
+ * @see download_as_dataformat (lib/dataformatlib.php)
  */
-function css_is_colour($value) {
-    debugging('css_is_colour() is deprecated without a replacement. Please copy the implementation '.
-        'into your plugin if you need this functionality.', DEBUG_DEVELOPER);
-
-    $value = trim($value);
-
-    $hex  = '/^#([a-fA-F0-9]{1,3}|[a-fA-F0-9]{6})$/';
-    $rgb  = '#^rgb\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$#i';
-    $rgba = '#^rgba\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1}(\.\d+)?)\s*\)$#i';
-    $hsl  = '#^hsl\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\%\s*,\s*(\d{1,3})\%\s*\)$#i';
-    $hsla = '#^hsla\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\%\s*,\s*(\d{1,3})\%\s*,\s*(\d{1}(\.\d+)?)\s*\)$#i';
-
-    if (in_array(strtolower($value), array('inherit'))) {
-        return true;
-    } else if (preg_match($hex, $value)) {
-        return true;
-    } else if (in_array(strtolower($value), array_keys(css_optimiser::$htmlcolours))) {
-        return true;
-    } else if (preg_match($rgb, $value, $m) && $m[1] < 256 && $m[2] < 256 && $m[3] < 256) {
-        // It is an RGB colour.
-        return true;
-    } else if (preg_match($rgba, $value, $m) && $m[1] < 256 && $m[2] < 256 && $m[3] < 256) {
-        // It is an RGBA colour.
-        return true;
-    } else if (preg_match($hsl, $value, $m) && $m[1] <= 360 && $m[2] <= 100 && $m[3] <= 100) {
-        // It is an HSL colour.
-        return true;
-    } else if (preg_match($hsla, $value, $m) && $m[1] <= 360 && $m[2] <= 100 && $m[3] <= 100) {
-        // It is an HSLA colour.
-        return true;
-    }
-    // Doesn't look like a colour.
-    return false;
+function put_records_csv() {
+    throw new coding_exception('put_records_csv() can not be used anymore. Please use ' .
+        'lib/dataformatlib.php download_as_dataformat() instead.');
 }
 
 /**
- * Returns true is the passed value looks like a CSS width.
- * In order to pass this test the value must be purely numerical or end with a
- * valid CSS unit term.
- *
- * @param string|int $value
- * @return boolean
  * @deprecated since Moodle 3.2
- * @todo MDL-56173 for final deprecation in Moodle 3.6
  */
-function css_is_width($value) {
-    debugging('css_is_width() is deprecated without a replacement. Please copy the implementation '.
-        'into your plugin if you need this functionality.', DEBUG_DEVELOPER);
-
-    $value = trim($value);
-    if (in_array(strtolower($value), array('auto', 'inherit'))) {
-        return true;
-    }
-    if ((string)$value === '0' || preg_match('#^(\-\s*)?(\d*\.)?(\d+)\s*(em|px|pt|\%|in|cm|mm|ex|pc)$#i', $value)) {
-        return true;
-    }
-    return false;
+function css_is_colour() {
+    throw new coding_exception('css_is_colour() can not be used anymore.');
 }
 
 /**
- * A simple sorting function to sort two array values on the number of items they contain
- *
- * @param array $a
- * @param array $b
- * @return int
  * @deprecated since Moodle 3.2
- * @todo MDL-56173 for final deprecation in Moodle 3.6
  */
-function css_sort_by_count(array $a, array $b) {
-    debugging('css_sort_by_count() is deprecated without a replacement. Please copy the implementation '.
-        'into your plugin if you need this functionality.', DEBUG_DEVELOPER);
-
-    $a = count($a);
-    $b = count($b);
-    if ($a == $b) {
-        return 0;
-    }
-    return ($a > $b) ? -1 : 1;
+function css_is_width() {
+    throw new coding_exception('css_is_width() can not be used anymore.');
 }
 
 /**
- * A basic CSS optimiser that strips out unwanted things and then processes CSS organising and cleaning styles.
  * @deprecated since Moodle 3.2
- * @todo MDL-56173 for final deprecation in Moodle 3.6
- */
-class css_optimiser {
-    /**
-     * An array of the common HTML colours that are supported by most browsers.
-     *
-     * This reference table is used to allow us to unify colours, and will aid
-     * us in identifying buggy CSS using unsupported colours.
-     *
-     * @var string[]
-     * @deprecated since Moodle 3.2
-     * @todo MDL-56173 for final deprecation in Moodle 3.6
-     */
-    public static $htmlcolours = array(
-        'aliceblue' => '#F0F8FF',
-        'antiquewhite' => '#FAEBD7',
-        'aqua' => '#00FFFF',
-        'aquamarine' => '#7FFFD4',
-        'azure' => '#F0FFFF',
-        'beige' => '#F5F5DC',
-        'bisque' => '#FFE4C4',
-        'black' => '#000000',
-        'blanchedalmond' => '#FFEBCD',
-        'blue' => '#0000FF',
-        'blueviolet' => '#8A2BE2',
-        'brown' => '#A52A2A',
-        'burlywood' => '#DEB887',
-        'cadetblue' => '#5F9EA0',
-        'chartreuse' => '#7FFF00',
-        'chocolate' => '#D2691E',
-        'coral' => '#FF7F50',
-        'cornflowerblue' => '#6495ED',
-        'cornsilk' => '#FFF8DC',
-        'crimson' => '#DC143C',
-        'cyan' => '#00FFFF',
-        'darkblue' => '#00008B',
-        'darkcyan' => '#008B8B',
-        'darkgoldenrod' => '#B8860B',
-        'darkgray' => '#A9A9A9',
-        'darkgrey' => '#A9A9A9',
-        'darkgreen' => '#006400',
-        'darkKhaki' => '#BDB76B',
-        'darkmagenta' => '#8B008B',
-        'darkolivegreen' => '#556B2F',
-        'arkorange' => '#FF8C00',
-        'darkorchid' => '#9932CC',
-        'darkred' => '#8B0000',
-        'darksalmon' => '#E9967A',
-        'darkseagreen' => '#8FBC8F',
-        'darkslateblue' => '#483D8B',
-        'darkslategray' => '#2F4F4F',
-        'darkslategrey' => '#2F4F4F',
-        'darkturquoise' => '#00CED1',
-        'darkviolet' => '#9400D3',
-        'deeppink' => '#FF1493',
-        'deepskyblue' => '#00BFFF',
-        'dimgray' => '#696969',
-        'dimgrey' => '#696969',
-        'dodgerblue' => '#1E90FF',
-        'firebrick' => '#B22222',
-        'floralwhite' => '#FFFAF0',
-        'forestgreen' => '#228B22',
-        'fuchsia' => '#FF00FF',
-        'gainsboro' => '#DCDCDC',
-        'ghostwhite' => '#F8F8FF',
-        'gold' => '#FFD700',
-        'goldenrod' => '#DAA520',
-        'gray' => '#808080',
-        'grey' => '#808080',
-        'green' => '#008000',
-        'greenyellow' => '#ADFF2F',
-        'honeydew' => '#F0FFF0',
-        'hotpink' => '#FF69B4',
-        'indianred ' => '#CD5C5C',
-        'indigo ' => '#4B0082',
-        'ivory' => '#FFFFF0',
-        'khaki' => '#F0E68C',
-        'lavender' => '#E6E6FA',
-        'lavenderblush' => '#FFF0F5',
-        'lawngreen' => '#7CFC00',
-        'lemonchiffon' => '#FFFACD',
-        'lightblue' => '#ADD8E6',
-        'lightcoral' => '#F08080',
-        'lightcyan' => '#E0FFFF',
-        'lightgoldenrodyellow' => '#FAFAD2',
-        'lightgray' => '#D3D3D3',
-        'lightgrey' => '#D3D3D3',
-        'lightgreen' => '#90EE90',
-        'lightpink' => '#FFB6C1',
-        'lightsalmon' => '#FFA07A',
-        'lightseagreen' => '#20B2AA',
-        'lightskyblue' => '#87CEFA',
-        'lightslategray' => '#778899',
-        'lightslategrey' => '#778899',
-        'lightsteelblue' => '#B0C4DE',
-        'lightyellow' => '#FFFFE0',
-        'lime' => '#00FF00',
-        'limegreen' => '#32CD32',
-        'linen' => '#FAF0E6',
-        'magenta' => '#FF00FF',
-        'maroon' => '#800000',
-        'mediumaquamarine' => '#66CDAA',
-        'mediumblue' => '#0000CD',
-        'mediumorchid' => '#BA55D3',
-        'mediumpurple' => '#9370D8',
-        'mediumseagreen' => '#3CB371',
-        'mediumslateblue' => '#7B68EE',
-        'mediumspringgreen' => '#00FA9A',
-        'mediumturquoise' => '#48D1CC',
-        'mediumvioletred' => '#C71585',
-        'midnightblue' => '#191970',
-        'mintcream' => '#F5FFFA',
-        'mistyrose' => '#FFE4E1',
-        'moccasin' => '#FFE4B5',
-        'navajowhite' => '#FFDEAD',
-        'navy' => '#000080',
-        'oldlace' => '#FDF5E6',
-        'olive' => '#808000',
-        'olivedrab' => '#6B8E23',
-        'orange' => '#FFA500',
-        'orangered' => '#FF4500',
-        'orchid' => '#DA70D6',
-        'palegoldenrod' => '#EEE8AA',
-        'palegreen' => '#98FB98',
-        'paleturquoise' => '#AFEEEE',
-        'palevioletred' => '#D87093',
-        'papayawhip' => '#FFEFD5',
-        'peachpuff' => '#FFDAB9',
-        'peru' => '#CD853F',
-        'pink' => '#FFC0CB',
-        'plum' => '#DDA0DD',
-        'powderblue' => '#B0E0E6',
-        'purple' => '#800080',
-        'red' => '#FF0000',
-        'rosybrown' => '#BC8F8F',
-        'royalblue' => '#4169E1',
-        'saddlebrown' => '#8B4513',
-        'salmon' => '#FA8072',
-        'sandybrown' => '#F4A460',
-        'seagreen' => '#2E8B57',
-        'seashell' => '#FFF5EE',
-        'sienna' => '#A0522D',
-        'silver' => '#C0C0C0',
-        'skyblue' => '#87CEEB',
-        'slateblue' => '#6A5ACD',
-        'slategray' => '#708090',
-        'slategrey' => '#708090',
-        'snow' => '#FFFAFA',
-        'springgreen' => '#00FF7F',
-        'steelblue' => '#4682B4',
-        'tan' => '#D2B48C',
-        'teal' => '#008080',
-        'thistle' => '#D8BFD8',
-        'tomato' => '#FF6347',
-        'transparent' => 'transparent',
-        'turquoise' => '#40E0D0',
-        'violet' => '#EE82EE',
-        'wheat' => '#F5DEB3',
-        'white' => '#FFFFFF',
-        'whitesmoke' => '#F5F5F5',
-        'yellow' => '#FFFF00',
-        'yellowgreen' => '#9ACD32'
-    );
-
-    /**
-     * Used to orocesses incoming CSS optimising it and then returning it. Now just returns
-     * what is sent to it. Do not use.
-     *
-     * @param string $css The raw CSS to optimise
-     * @return string The optimised CSS
-     * @deprecated since Moodle 3.2
-     * @todo MDL-56173 for final deprecation in Moodle 3.6
-     */
-    public function process($css) {
-        debugging('class css_optimiser is deprecated and no longer does anything, '.
-            'please consider using stylelint to optimise your css.', DEBUG_DEVELOPER);
-
-        return $css;
-    }
+ */
+function css_sort_by_count() {
+    throw new coding_exception('css_sort_by_count() can not be used anymore.');
 }
 
 /**
- * Load the course contexts for all of the users courses
- *
  * @deprecated since Moodle 3.2
- * @param array $courses array of course objects. The courses the user is enrolled in.
- * @return array of course contexts
  */
-function message_get_course_contexts($courses) {
-    debugging('message_get_course_contexts() is deprecated and is no longer used.', DEBUG_DEVELOPER);
-
-    $coursecontexts = array();
-
-    foreach($courses as $course) {
-        $coursecontexts[$course->id] = context_course::instance($course->id);
-    }
-
-    return $coursecontexts;
+function message_get_course_contexts() {
+    throw new coding_exception('message_get_course_contexts() can not be used anymore.');
 }
 
 /**
- * strip off action parameters like 'removecontact'
- *
  * @deprecated since Moodle 3.2
- * @param moodle_url/string $moodleurl a URL. Typically the current page URL.
- * @return string the URL minus parameters that perform actions (like adding/removing/blocking a contact).
  */
-function message_remove_url_params($moodleurl) {
-    debugging('message_remove_url_params() is deprecated and is no longer used.', DEBUG_DEVELOPER);
-
-    $newurl = new moodle_url($moodleurl);
-    $newurl->remove_params('addcontact','removecontact','blockcontact','unblockcontact');
-    return $newurl->out();
+function message_remove_url_params() {
+    throw new coding_exception('message_remove_url_params() can not be used anymore.');
 }
 
 /**
- * Count the number of messages with a field having a specified value.
- * if $field is empty then return count of the whole array
- * if $field is non-existent then return 0
- *
  * @deprecated since Moodle 3.2
- * @param array $messagearray array of message objects
- * @param string $field the field to inspect on the message objects
- * @param string $value the value to test the field against
  */
-function message_count_messages($messagearray, $field='', $value='') {
-    debugging('message_count_messages() is deprecated and is no longer used.', DEBUG_DEVELOPER);
-
-    if (!is_array($messagearray)) return 0;
-    if ($field == '' or empty($messagearray)) return count($messagearray);
-
-    $count = 0;
-    foreach ($messagearray as $message) {
-        $count += ($message->$field == $value) ? 1 : 0;
-    }
-    return $count;
+function message_count_messages() {
+    throw new coding_exception('message_count_messages() can not be used anymore.');
 }
 
 /**
- * Count the number of users blocked by $user1
- *
  * @deprecated since Moodle 3.2
- * @param object $user1 user object
- * @return int the number of blocked users
  */
-function message_count_blocked_users($user1=null) {
-    debugging('message_count_blocked_users() is deprecated, please use \core_message\api::count_blocked_users() instead.',
-        DEBUG_DEVELOPER);
-
-    return \core_message\api::count_blocked_users($user1);
+function message_count_blocked_users() {
+    throw new coding_exception('message_count_blocked_users() can not be used anymore. Please use ' .
+        '\core_message\api::count_blocked_users() instead.');
 }
 
 /**
- * Print a message contact link
- *
  * @deprecated since Moodle 3.2
- * @param int $userid the ID of the user to apply to action to
- * @param string $linktype can be add, remove, block or unblock
- * @param bool $return if true return the link as a string. If false echo the link.
- * @param string $script the URL to send the user to when the link is clicked. If null, the current page.
- * @param bool $text include text next to the icons?
- * @param bool $icon include a graphical icon?
- * @return string  if $return is true otherwise bool
  */
-function message_contact_link($userid, $linktype='add', $return=false, $script=null, $text=false, $icon=true) {
-    debugging('message_contact_link() is deprecated and is no longer used.', DEBUG_DEVELOPER);
-
-    global $OUTPUT, $PAGE;
-
-    //hold onto the strings as we're probably creating a bunch of links
-    static $str;
-
-    if (empty($script)) {
-        //strip off previous action params like 'removecontact'
-        $script = message_remove_url_params($PAGE->url);
-    }
-
-    if (empty($str->blockcontact)) {
-        $str = new stdClass();
-        $str->blockcontact   =  get_string('blockcontact', 'message');
-        $str->unblockcontact =  get_string('unblockcontact', 'message');
-        $str->removecontact  =  get_string('removecontact', 'message');
-        $str->addcontact     =  get_string('addcontact', 'message');
-    }
-
-    $command = $linktype.'contact';
-    $string  = $str->{$command};
-
-    $safealttext = s($string);
-
-    $safestring = '';
-    if (!empty($text)) {
-        $safestring = $safealttext;
-    }
-
-    $img = '';
-    if ($icon) {
-        $iconpath = null;
-        switch ($linktype) {
-            case 'block':
-                $iconpath = 't/block';
-                break;
-            case 'unblock':
-                $iconpath = 't/unblock';
-                break;
-            case 'remove':
-                $iconpath = 't/removecontact';
-                break;
-            case 'add':
-            default:
-                $iconpath = 't/addcontact';
-        }
-
-        $img = $OUTPUT->pix_icon($iconpath, $safealttext);
-    }
-
-    $output = '<span class="'.$linktype.'contact">'.
-        '<a href="'.$script.'&amp;'.$command.'='.$userid.
-        '&amp;sesskey='.sesskey().'" title="'.$safealttext.'">'.
-        $img.
-        $safestring.'</a></span>';
-
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-        return true;
-    }
+function message_contact_link() {
+    throw new coding_exception('message_contact_link() can not be used anymore.');
 }
 
 /**
  * @deprecated since Moodle 3.2
  */
-function message_get_recent_notifications($user, $limitfrom=0, $limitto=100) {
-    throw new coding_exception('message_get_recent_notifications() can not be used any more.', DEBUG_DEVELOPER);
+function message_get_recent_notifications() {
+    throw new coding_exception('message_get_recent_notifications() can not be used anymore.');
 }
 
 /**
- * echo or return a link to take the user to the full message history between themselves and another user
- *
  * @deprecated since Moodle 3.2
- * @param int $userid1 the ID of the user displayed on the left (usually the current user)
- * @param int $userid2 the ID of the other user
- * @param bool $return true to return the link as a string. False to echo the link.
- * @param string $keywords any keywords to highlight in the message history
- * @param string $position anchor name to jump to within the message history
- * @param string $linktext optionally specify the link text
- * @return string|bool. Returns a string if $return is true. Otherwise returns a boolean.
- */
-function message_history_link($userid1, $userid2, $return=false, $keywords='', $position='', $linktext='') {
-    debugging('message_history_link() is deprecated and is no longer used.', DEBUG_DEVELOPER);
-
-    global $OUTPUT, $PAGE;
-    static $strmessagehistory;
-
-    if (empty($strmessagehistory)) {
-        $strmessagehistory = get_string('messagehistory', 'message');
-    }
-
-    if ($position) {
-        $position = "#$position";
-    }
-    if ($keywords) {
-        $keywords = "&search=".urlencode($keywords);
-    }
-
-    if ($linktext == 'icon') {  // Icon only
-        $fulllink = $OUTPUT->pix_icon('t/messages', $strmessagehistory);
-    } else if ($linktext == 'both') {  // Icon and standard name
-        $fulllink = $OUTPUT->pix_icon('t/messages', '');
-        $fulllink .= '&nbsp;'.$strmessagehistory;
-    } else if ($linktext) {    // Custom name
-        $fulllink = $linktext;
-    } else {                   // Standard name only
-        $fulllink = $strmessagehistory;
-    }
-
-    $popupoptions = array(
-        'height' => 500,
-        'width' => 500,
-        'menubar' => false,
-        'location' => false,
-        'status' => true,
-        'scrollbars' => true,
-        'resizable' => true);
-
-    $link = new moodle_url('/message/index.php?history='.MESSAGE_HISTORY_ALL."&user1=$userid1&user2=$userid2$keywords$position");
-    if ($PAGE->url && $PAGE->url->get_param('viewing')) {
-        $link->param('viewing', $PAGE->url->get_param('viewing'));
-    }
-    $action = null;
-    $str = $OUTPUT->action_link($link, $fulllink, $action, array('title' => $strmessagehistory));
-
-    $str = '<span class="history">'.$str.'</span>';
-
-    if ($return) {
-        return $str;
-    } else {
-        echo $str;
-        return true;
-    }
+ */
+function message_history_link() {
+    throw new coding_exception('message_history_link() can not be used anymore.');
 }
 
 /**
  * @deprecated since Moodle 3.2
  */
-function message_search($searchterms, $fromme=true, $tome=true, $courseid='none', $userid=0) {
-    throw new coding_exception('message_search() can not be used any more.', DEBUG_DEVELOPER);
+function message_search() {
+    throw new coding_exception('message_search() can not be used anymore.');
 }
 
 /**
- * Given a message object that we already know has a long message
- * this function truncates the message nicely to the first
- * sane place between $CFG->forum_longpost and $CFG->forum_shortpost
- *
  * @deprecated since Moodle 3.2
- * @param string $message the message
- * @param int $minlength the minimum length to trim the message to
- * @return string the shortened message
  */
-function message_shorten_message($message, $minlength = 0) {
-    debugging('message_shorten_message() is deprecated and is no longer used.', DEBUG_DEVELOPER);
-
-    $i = 0;
-    $tag = false;
-    $length = strlen($message);
-    $count = 0;
-    $stopzone = false;
-    $truncate = 0;
-    if ($minlength == 0) $minlength = MESSAGE_SHORTLENGTH;
-
-
-    for ($i=0; $i<$length; $i++) {
-        $char = $message[$i];
-
-        switch ($char) {
-            case "<":
-                $tag = true;
-                break;
-            case ">":
-                $tag = false;
-                break;
-            default:
-                if (!$tag) {
-                    if ($stopzone) {
-                        if ($char == '.' or $char == ' ') {
-                            $truncate = $i+1;
-                            break 2;
-                        }
-                    }
-                    $count++;
-                }
-                break;
-        }
-        if (!$stopzone) {
-            if ($count > $minlength) {
-                $stopzone = true;
-            }
-        }
-    }
-
-    if (!$truncate) {
-        $truncate = $i;
-    }
-
-    return substr($message, 0, $truncate);
+function message_shorten_message() {
+    throw new coding_exception('message_shorten_message() can not be used anymore.');
 }
 
 /**
- * Given a string and an array of keywords, this function looks
- * for the first keyword in the string, and then chops out a
- * small section from the text that shows that word in context.
- *
  * @deprecated since Moodle 3.2
- * @param string $message the text to search
- * @param array $keywords array of keywords to find
  */
-function message_get_fragment($message, $keywords) {
-    debugging('message_get_fragment() is deprecated and is no longer used.', DEBUG_DEVELOPER);
-
-    $fullsize = 160;
-    $halfsize = (int)($fullsize/2);
-
-    $message = strip_tags($message);
-
-    foreach ($keywords as $keyword) {  // Just get the first one
-        if ($keyword !== '') {
-            break;
-        }
-    }
-    if (empty($keyword)) {   // None found, so just return start of message
-        return message_shorten_message($message, 30);
-    }
-
-    $leadin = $leadout = '';
-
-/// Find the start of the fragment
-    $start = 0;
-    $length = strlen($message);
-
-    $pos = strpos($message, $keyword);
-    if ($pos > $halfsize) {
-        $start = $pos - $halfsize;
-        $leadin = '...';
-    }
-/// Find the end of the fragment
-    $end = $start + $fullsize;
-    if ($end > $length) {
-        $end = $length;
-    } else {
-        $leadout = '...';
-    }
-
-/// Pull out the fragment and format it
-
-    $fragment = substr($message, $start, $end - $start);
-    $fragment = $leadin.highlight(implode(' ',$keywords), $fragment).$leadout;
-    return $fragment;
+function message_get_fragment() {
+    throw new coding_exception('message_get_fragment() can not be used anymore.');
 }
 
 /**
  * @deprecated since Moodle 3.2
  */
-function message_get_history($user1, $user2, $limitnum=0, $viewingnewmessages=false) {
-    throw new coding_exception('message_get_history() can not be used any more.', DEBUG_DEVELOPER);
+function message_get_history() {
+    throw new coding_exception('message_get_history() can not be used anymore.');
 }
 
 /**
- * Constructs the add/remove contact link to display next to other users
- *
  * @deprecated since Moodle 3.2
- * @param bool $incontactlist is the user a contact
- * @param bool $isblocked is the user blocked
- * @param stdClass $contact contact object
- * @param string $script the URL to send the user to when the link is clicked. If null, the current page.
- * @param bool $text include text next to the icons?
- * @param bool $icon include a graphical icon?
- * @return string
- */
-function message_get_contact_add_remove_link($incontactlist, $isblocked, $contact, $script=null, $text=false, $icon=true) {
-    debugging('message_get_contact_add_remove_link() is deprecated and is no longer used.', DEBUG_DEVELOPER);
-
-    $strcontact = '';
-
-    if($incontactlist){
-        $strcontact = message_contact_link($contact->id, 'remove', true, $script, $text, $icon);
-    } else if ($isblocked) {
-        $strcontact = message_contact_link($contact->id, 'add', true, $script, $text, $icon);
-    } else{
-        $strcontact = message_contact_link($contact->id, 'add', true, $script, $text, $icon);
-    }
-
-    return $strcontact;
+ */
+function message_get_contact_add_remove_link() {
+    throw new coding_exception('message_get_contact_add_remove_link() can not be used anymore.');
 }
 
 /**
- * Constructs the block contact link to display next to other users
- *
  * @deprecated since Moodle 3.2
- * @param bool $incontactlist is the user a contact?
- * @param bool $isblocked is the user blocked?
- * @param stdClass $contact contact object
- * @param string $script the URL to send the user to when the link is clicked. If null, the current page.
- * @param bool $text include text next to the icons?
- * @param bool $icon include a graphical icon?
- * @return string
- */
-function message_get_contact_block_link($incontactlist, $isblocked, $contact, $script=null, $text=false, $icon=true) {
-    debugging('message_get_contact_block_link() is deprecated and is no longer used.', DEBUG_DEVELOPER);
-
-    $strblock   = '';
-
-    //commented out to allow the user to block a contact without having to remove them first
-    /*if ($incontactlist) {
-        //$strblock = '';
-    } else*/
-    if ($isblocked) {
-        $strblock   = message_contact_link($contact->id, 'unblock', true, $script, $text, $icon);
-    } else{
-        $strblock   = message_contact_link($contact->id, 'block', true, $script, $text, $icon);
-    }
-
-    return $strblock;
+ */
+function message_get_contact_block_link() {
+    throw new coding_exception('message_get_contact_block_link() can not be used anymore.');
 }
 
 /**
- * marks ALL messages being sent from $fromuserid to $touserid as read
- *
  * @deprecated since Moodle 3.2
- * @param int $touserid the id of the message recipient
- * @param int $fromuserid the id of the message sender
- * @return void
  */
-function message_mark_messages_read($touserid, $fromuserid) {
-    debugging('message_mark_messages_read() is deprecated and is no longer used, please use
-        \core_message\api::mark_all_messages_as_read() instead.', DEBUG_DEVELOPER);
-
-    \core_message\api::mark_all_messages_as_read($touserid, $fromuserid);
+function message_mark_messages_read() {
+    throw new coding_exception('message_mark_messages_read() can not be used anymore. Please use ' .
+        '\core_message\api::mark_all_messages_as_read() instead.');
 }
 
 /**
- * Return a list of page types
- *
  * @deprecated since Moodle 3.2
- * @param string $pagetype current page type
- * @param stdClass $parentcontext Block's parent context
- * @param stdClass $currentcontext Current context of block
  */
-function message_page_type_list($pagetype, $parentcontext, $currentcontext) {
-    debugging('message_page_type_list() is deprecated and is no longer used.', DEBUG_DEVELOPER);
-
-    return array('messages-*'=>get_string('page-message-x', 'message'));
+function message_page_type_list() {
+    throw new coding_exception('message_page_type_list() can not be used anymore.');
 }
 
 /**
- * Determines if a user is permitted to send another user a private message.
- * If no sender is provided then it defaults to the logged in user.
- *
  * @deprecated since Moodle 3.2
- * @param object $recipient User object.
- * @param object $sender User object.
- * @return bool true if user is permitted, false otherwise.
  */
-function message_can_post_message($recipient, $sender = null) {
-    debugging('message_can_post_message() is deprecated and is no longer used, please use
-        \core_message\api::can_post_message() instead.', DEBUG_DEVELOPER);
-
-    return \core_message\api::can_post_message($recipient, $sender);
+function message_can_post_message() {
+    throw new coding_exception('message_can_post_message() can not be used anymore. Please use ' .
+        '\core_message\api::can_post_message() instead.');
 }
 
 /**
- * Checks if the recipient is allowing messages from users that aren't a
- * contact. If not then it checks to make sure the sender is in the
- * recipient's contacts.
- *
  * @deprecated since Moodle 3.2
- * @param object $recipient User object.
- * @param object $sender User object.
- * @return bool true if $sender is blocked, false otherwise.
  */
-function message_is_user_non_contact_blocked($recipient, $sender = null) {
-    debugging('message_is_user_non_contact_blocked() is deprecated and is no longer used, please use
-        \core_message\api::is_user_non_contact_blocked() instead.', DEBUG_DEVELOPER);
-
-    return \core_message\api::is_user_non_contact_blocked($recipient, $sender);
+function message_is_user_non_contact_blocked() {
+    throw new coding_exception('message_is_user_non_contact_blocked() can not be used anymore. Please use ' .
+        '\core_message\api::is_user_non_contact_blocked() instead.');
 }
 
 /**
- * Checks if the recipient has specifically blocked the sending user.
- *
- * Note: This function will always return false if the sender has the
- * readallmessages capability at the system context level.
- *
  * @deprecated since Moodle 3.2
- * @param object $recipient User object.
- * @param object $sender User object.
- * @return bool true if $sender is blocked, false otherwise.
  */
-function message_is_user_blocked($recipient, $sender = null) {
-    debugging('message_is_user_blocked() is deprecated and is no longer used, please use
-        \core_message\api::is_user_blocked() instead.', DEBUG_DEVELOPER);
-
-    $senderid = null;
-    if ($sender !== null && isset($sender->id)) {
-        $senderid = $sender->id;
-    }
-    return \core_message\api::is_user_blocked($recipient->id, $senderid);
+function message_is_user_blocked() {
+    throw new coding_exception('message_is_user_blocked() can not be used anymore. Please use ' .
+        '\core_message\api::is_user_blocked() instead.');
 }
 
 /**
- * Display logs.
- *
- * @deprecated since 3.2
+ * @deprecated since Moodle 3.2
  */
-function print_log($course, $user=0, $date=0, $order="l.time ASC", $page=0, $perpage=100,
-                   $url="", $modname="", $modid=0, $modaction="", $groupid=0) {
-    debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
-
-    global $CFG, $DB, $OUTPUT;
-
-    if (!$logs = build_logs_array($course, $user, $date, $order, $page*$perpage, $perpage,
-                       $modname, $modid, $modaction, $groupid)) {
-        echo $OUTPUT->notification("No logs found!");
-        echo $OUTPUT->footer();
-        exit;
-    }
-
-    $courses = array();
-
-    if ($course->id == SITEID) {
-        $courses[0] = '';
-        if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) {
-            foreach ($ccc as $cc) {
-                $courses[$cc->id] = $cc->shortname;
-            }
-        }
-    } else {
-        $courses[$course->id] = $course->shortname;
-    }
-
-    $totalcount = $logs['totalcount'];
-    $ldcache = array();
-
-    $strftimedatetime = get_string("strftimedatetime");
-
-    echo "<div class=\"info\">\n";
-    print_string("displayingrecords", "", $totalcount);
-    echo "</div>\n";
-
-    echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage");
-
-    $table = new html_table();
-    $table->classes = array('logtable','generaltable');
-    $table->align = array('right', 'left', 'left');
-    $table->head = array(
-        get_string('time'),
-        get_string('ip_address'),
-        get_string('fullnameuser'),
-        get_string('action'),
-        get_string('info')
-    );
-    $table->data = array();
-
-    if ($course->id == SITEID) {
-        array_unshift($table->align, 'left');
-        array_unshift($table->head, get_string('course'));
-    }
-
-    // Make sure that the logs array is an array, even it is empty, to avoid warnings from the foreach.
-    if (empty($logs['logs'])) {
-        $logs['logs'] = array();
-    }
-
-    foreach ($logs['logs'] as $log) {
-
-        if (isset($ldcache[$log->module][$log->action])) {
-            $ld = $ldcache[$log->module][$log->action];
-        } else {
-            $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action));
-            $ldcache[$log->module][$log->action] = $ld;
-        }
-        if ($ld && is_numeric($log->info)) {
-            // ugly hack to make sure fullname is shown correctly
-            if ($ld->mtable == 'user' && $ld->field == $DB->sql_concat('firstname', "' '" , 'lastname')) {
-                $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true);
-            } else {
-                $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info));
-            }
-        }
-
-        //Filter log->info
-        $log->info = format_string($log->info);
-
-        // If $log->url has been trimmed short by the db size restriction
-        // code in add_to_log, keep a note so we don't add a link to a broken url
-        $brokenurl=(core_text::strlen($log->url)==100 && core_text::substr($log->url,97)=='...');
-
-        $row = array();
-        if ($course->id == SITEID) {
-            if (empty($log->course)) {
-                $row[] = get_string('site');
-            } else {
-                $row[] = "<a href=\"{$CFG->wwwroot}/course/view.php?id={$log->course}\">". format_string($courses[$log->course])."</a>";
-            }
-        }
-
-        $row[] = userdate($log->time, '%a').' '.userdate($log->time, $strftimedatetime);
-
-        $link = new moodle_url("/iplookup/index.php?ip=$log->ip&user=$log->userid");
-        $row[] = $OUTPUT->action_link($link, $log->ip, new popup_action('click', $link, 'iplookup', array('height' => 440, 'width' => 700)));
-
-        $row[] = html_writer::link(new moodle_url("/user/view.php?id={$log->userid}&course={$log->course}"), fullname($log, has_capability('moodle/site:viewfullnames', context_course::instance($course->id))));
-
-        $displayaction="$log->module $log->action";
-        if ($brokenurl) {
-            $row[] = $displayaction;
-        } else {
-            $link = make_log_url($log->module,$log->url);
-            $row[] = $OUTPUT->action_link($link, $displayaction, new popup_action('click', $link, 'fromloglive'), array('height' => 440, 'width' => 700));
-        }
-        $row[] = $log->info;
-        $table->data[] = $row;
-    }
-
-    echo html_writer::table($table);
-    echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage");
+function print_log() {
+    throw new coding_exception('print_log() can not be used anymore. Please use the ' .
+        'report_log framework instead.');
 }
 
 /**
- * Display MNET logs.
- *
- * @deprecated since 3.2
+ * @deprecated since Moodle 3.2
  */
-function print_mnet_log($hostid, $course, $user=0, $date=0, $order="l.time ASC", $page=0, $perpage=100,
-                   $url="", $modname="", $modid=0, $modaction="", $groupid=0) {
-    debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
-
-    global $CFG, $DB, $OUTPUT;
-
-    if (!$logs = build_mnet_logs_array($hostid, $course, $user, $date, $order, $page*$perpage, $perpage,
-                       $modname, $modid, $modaction, $groupid)) {
-        echo $OUTPUT->notification("No logs found!");
-        echo $OUTPUT->footer();
-        exit;
-    }
-
-    if ($course->id == SITEID) {
-        $courses[0] = '';
-        if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname,c.visible')) {
-            foreach ($ccc as $cc) {
-                $courses[$cc->id] = $cc->shortname;
-            }
-        }
-    }
-
-    $totalcount = $logs['totalcount'];
-    $ldcache = array();
-
-    $strftimedatetime = get_string("strftimedatetime");
-
-    echo "<div class=\"info\">\n";
-    print_string("displayingrecords", "", $totalcount);
-    echo "</div>\n";
-
-    echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage");
-
-    echo "<table class=\"logtable\" cellpadding=\"3\" cellspacing=\"0\">\n";
-    echo "<tr>";
-    if ($course->id == SITEID) {
-        echo "<th class=\"c0 header\">".get_string('course')."</th>\n";
-    }
-    echo "<th class=\"c1 header\">".get_string('time')."</th>\n";
-    echo "<th class=\"c2 header\">".get_string('ip_address')."</th>\n";
-    echo "<th class=\"c3 header\">".get_string('fullnameuser')."</th>\n";
-    echo "<th class=\"c4 header\">".get_string('action')."</th>\n";
-    echo "<th class=\"c5 header\">".get_string('info')."</th>\n";
-    echo "</tr>\n";
-
-    if (empty($logs['logs'])) {
-        echo "</table>\n";
-        return;
-    }
-
-    $row = 1;
-    foreach ($logs['logs'] as $log) {
-
-        $log->info = $log->coursename;
-        $row = ($row + 1) % 2;
-
-        if (isset($ldcache[$log->module][$log->action])) {
-            $ld = $ldcache[$log->module][$log->action];
-        } else {
-            $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action));
-            $ldcache[$log->module][$log->action] = $ld;
-        }
-        if (0 && $ld && !empty($log->info)) {
-            // ugly hack to make sure fullname is shown correctly
-            if (($ld->mtable == 'user') and ($ld->field == $DB->sql_concat('firstname', "' '" , 'lastname'))) {
-                $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true);
-            } else {
-                $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info));
-            }
-        }
-
-        //Filter log->info
-        $log->info = format_string($log->info);
-
-        echo '<tr class="r'.$row.'">';
-        if ($course->id == SITEID) {
-            $courseshortname = format_string($courses[$log->course], true, array('context' => context_course::instance(SITEID)));
-            echo "<td class=\"r$row c0\" >\n";
-            echo "    <a href=\"{$CFG->wwwroot}/course/view.php?id={$log->course}\">".$courseshortname."</a>\n";
-            echo "</td>\n";
-        }
-        echo "<td class=\"r$row c1\" align=\"right\">".userdate($log->time, '%a').
-             ' '.userdate($log->time, $strftimedatetime)."</td>\n";
-        echo "<td class=\"r$row c2\" >\n";
-        $link = new moodle_url("/iplookup/index.php?ip=$log->ip&user=$log->userid");
-        echo $OUTPUT->action_link($link, $log->ip, new popup_action('click', $link, 'iplookup', array('height' => 400, 'width' => 700)));
-        echo "</td>\n";
-        $fullname = fullname($log, has_capability('moodle/site:viewfullnames', context_course::instance($course->id)));
-        echo "<td class=\"r$row c3\" >\n";
-        echo "    <a href=\"$CFG->wwwroot/user/view.php?id={$log->userid}\">$fullname</a>\n";
-        echo "</td>\n";
-        echo "<td class=\"r$row c4\">\n";
-        echo $log->action .': '.$log->module;
-        echo "</td>\n";
-        echo "<td class=\"r$row c5\">{$log->info}</td>\n";
-        echo "</tr>\n";
-    }
-    echo "</table>\n";
-
-    echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage");
+function print_mnet_log() {
+    throw new coding_exception('print_mnet_log() can not be used anymore. Please use the ' .
+        'report_log framework instead.');
 }
 
 /**
- * Display logs in CSV format.
- *
- * @deprecated since 3.2
+ * @deprecated since Moodle 3.2
  */
-function print_log_csv($course, $user, $date, $order='l.time DESC', $modname,
-                        $modid, $modaction, $groupid) {
-    debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
-
-    global $DB, $CFG;
-
-    require_once($CFG->libdir . '/csvlib.class.php');
-
-    $csvexporter = new csv_export_writer('tab');
-
-    $header = array();
-    $header[] = get_string('course');
-    $header[] = get_string('time');
-    $header[] = get_string('ip_address');
-    $header[] = get_string('fullnameuser');
-    $header[] = get_string('action');
-    $header[] = get_string('info');
-
-    if (!$logs = build_logs_array($course, $user, $date, $order, '', '',
-                       $modname, $modid, $modaction, $groupid)) {
-        return false;
-    }
-
-    $courses = array();
-
-    if ($course->id == SITEID) {
-        $courses[0] = '';
-        if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) {
-            foreach ($ccc as $cc) {
-                $courses[$cc->id] = $cc->shortname;
-            }
-        }
-    } else {
-        $courses[$course->id] = $course->shortname;
-    }
-
-    $count=0;
-    $ldcache = array();
-    $tt = getdate(time());
-    $today = mktime (0, 0, 0, $tt["mon"], $tt["mday"], $tt["year"]);
-
-    $strftimedatetime = get_string("strftimedatetime");
-
-    $csvexporter->set_filename('logs', '.txt');
-    $title = array(get_string('savedat').userdate(time(), $strftimedatetime));
-    $csvexporter->add_data($title);
-    $csvexporter->add_data($header);
-
-    if (empty($logs['logs'])) {
-        return true;
-    }
-
-    foreach ($logs['logs'] as $log) {
-        if (isset($ldcache[$log->module][$log->action])) {
-            $ld = $ldcache[$log->module][$log->action];
-        } else {
-            $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action));
-            $ldcache[$log->module][$log->action] = $ld;
-        }
-        if ($ld && is_numeric($log->info)) {
-            // ugly hack to make sure fullname is shown correctly
-            if (($ld->mtable == 'user') and ($ld->field ==  $DB->sql_concat('firstname', "' '" , 'lastname'))) {
-                $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true);
-            } else {
-                $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info));
-            }
-        }
-
-        //Filter log->info
-        $log->info = format_string($log->info);
-        $log->info = strip_tags(urldecode($log->info));    // Some XSS protection
-
-        $coursecontext = context_course::instance($course->id);
-        $firstField = format_string($courses[$log->course], true, array('context' => $coursecontext));
-        $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext));
-        $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url);
-        $row = array($firstField, userdate($log->time, $strftimedatetime), $log->ip, $fullname, $log->module.' '.$log->action.' ('.$actionurl.')', $log->info);
-        $csvexporter->add_data($row);
-    }
-    $csvexporter->download_file();
-    return true;
+function print_log_csv() {
+    throw new coding_exception('print_log_csv() can not be used anymore. Please use the ' .
+        'report_log framework instead.');
 }
 
 /**
- * Display logs in XLS format.
- *
- * @deprecated since 3.2
+ * @deprecated since Moodle 3.2
  */
-function print_log_xls($course, $user, $date, $order='l.time DESC', $modname,
-                        $modid, $modaction, $groupid) {
-    debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
-
-    global $CFG, $DB;
-
-    require_once("$CFG->libdir/excellib.class.php");
-
-    if (!$logs = build_logs_array($course, $user, $date, $order, '', '',
-                       $modname, $modid, $modaction, $groupid)) {
-        return false;
-    }
-
-    $courses = array();
-
-    if ($course->id == SITEID) {
-        $courses[0] = '';
-        if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) {
-            foreach ($ccc as $cc) {
-                $courses[$cc->id] = $cc->shortname;
-            }
-        }
-    } else {
-        $courses[$course->id] = $course->shortname;
-    }
-
-    $count=0;
-    $ldcache = array();
-    $tt = getdate(time());
-    $today = mktime (0, 0, 0, $tt["mon"], $tt["mday"], $tt["year"]);
-
-    $strftimedatetime = get_string("strftimedatetime");
-
-    $nroPages = ceil(count($logs)/(EXCELROWS-FIRSTUSEDEXCELROW+1));
-    $filename = 'logs_'.userdate(time(),get_string('backupnameformat', 'langconfig'),99,false);
-    $filename .= '.xls';
-
-    $workbook = new MoodleExcelWorkbook('-');
-    $workbook->send($filename);
-
-    $worksheet = array();
-    $headers = array(get_string('course'), get_string('time'), get_string('ip_address'),
-                        get_string('fullnameuser'),    get_string('action'), get_string('info'));
-
-    // Creating worksheets
-    for ($wsnumber = 1; $wsnumber <= $nroPages; $wsnumber++) {
-        $sheettitle = get_string('logs').' '.$wsnumber.'-'.$nroPages;
-        $worksheet[$wsnumber] = $workbook->add_worksheet($sheettitle);
-        $worksheet[$wsnumber]->set_column(1, 1, 30);
-        $worksheet[$wsnumber]->write_string(0, 0, get_string('savedat').
-                                    userdate(time(), $strftimedatetime));
-        $col = 0;
-        foreach ($headers as $item) {
-            $worksheet[$wsnumber]->write(FIRSTUSEDEXCELROW-1,$col,$item,'');
-            $col++;
-        }
-    }
-
-    if (empty($logs['logs'])) {
-        $workbook->close();
-        return true;
-    }
-
-    $formatDate =& $workbook->add_format();
-    $formatDate->set_num_format(get_string('log_excel_date_format'));
-
-    $row = FIRSTUSEDEXCELROW;
-    $wsnumber = 1;
-    $myxls =& $worksheet[$wsnumber];
-    foreach ($logs['logs'] as $log) {
-        if (isset($ldcache[$log->module][$log->action])) {
-            $ld = $ldcache[$log->module][$log->action];
-        } else {
-            $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action));
-            $ldcache[$log->module][$log->action] = $ld;
-        }
-        if ($ld && is_numeric($log->info)) {
-            // ugly hack to make sure fullname is shown correctly
-            if (($ld->mtable == 'user') and ($ld->field == $DB->sql_concat('firstname', "' '" , 'lastname'))) {
-                $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true);
-            } else {
-                $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info));
-            }
-        }
-
-        // Filter log->info
-        $log->info = format_string($log->info);
-        $log->info = strip_tags(urldecode($log->info));  // Some XSS protection
-
-        if ($nroPages>1) {
-            if ($row > EXCELROWS) {
-                $wsnumber++;
-                $myxls =& $worksheet[$wsnumber];
-                $row = FIRSTUSEDEXCELROW;
-            }
-        }
-
-        $coursecontext = context_course::instance($course->id);
-
-        $myxls->write($row, 0, format_string($courses[$log->course], true, array('context' => $coursecontext)), '');
-        $myxls->write_date($row, 1, $log->time, $formatDate); // write_date() does conversion/timezone support. MDL-14934
-        $myxls->write($row, 2, $log->ip, '');
-        $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext));
-        $myxls->write($row, 3, $fullname, '');
-        $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url);
-        $myxls->write($row, 4, $log->module.' '.$log->action.' ('.$actionurl.')', '');
-        $myxls->write($row, 5, $log->info, '');
-
-        $row++;
-    }
-
-    $workbook->close();
-    return true;
+function print_log_xls() {
+    throw new coding_exception('print_log_xls() can not be used anymore. Please use the ' .
+        'report_log framework instead.');
 }
 
 /**
- * Display logs in ODS format.
- *
- * @deprecated since 3.2
+ * @deprecated since Moodle 3.2
  */
-function print_log_ods($course, $user, $date, $order='l.time DESC', $modname,
-                        $modid, $modaction, $groupid) {
-    debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
-
-    global $CFG, $DB;
-
-    require_once("$CFG->libdir/odslib.class.php");
-
-    if (!$logs = build_logs_array($course, $user, $date, $order, '', '',
-                       $modname, $modid, $modaction, $groupid)) {
-        return false;
-    }
-
-    $courses = array();
-
-    if ($course->id == SITEID) {
-        $courses[0] = '';
-        if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) {
-            foreach ($ccc as $cc) {
-                $courses[$cc->id] = $cc->shortname;
-            }
-        }
-    } else {
-        $courses[$course->id] = $course->shortname;
-    }
-
-    $ldcache = array();
-
-    $strftimedatetime = get_string("strftimedatetime");
-
-    $nroPages = ceil(count($logs)/(EXCELROWS-FIRSTUSEDEXCELROW+1));
-    $filename = 'logs_'.userdate(time(),get_string('backupnameformat', 'langconfig'),99,false);
-    $filename .= '.ods';
-
-    $workbook = new MoodleODSWorkbook('-');
-    $workbook->send($filename);
-
-    $worksheet = array();
-    $headers = array(get_string('course'), get_string('time'), get_string('ip_address'),
-                        get_string('fullnameuser'),    get_string('action'), get_string('info'));
-
-    // Creating worksheets
-    for ($wsnumber = 1; $wsnumber <= $nroPages; $wsnumber++) {
-        $sheettitle = get_string('logs').' '.$wsnumber.'-'.$nroPages;
-        $worksheet[$wsnumber] = $workbook->add_worksheet($sheettitle);
-        $worksheet[$wsnumber]->set_column(1, 1, 30);
-        $worksheet[$wsnumber]->write_string(0, 0, get_string('savedat').
-                                    userdate(time(), $strftimedatetime));
-        $col = 0;
-        foreach ($headers as $item) {
-            $worksheet[$wsnumber]->write(FIRSTUSEDEXCELROW-1,$col,$item,'');
-            $col++;
-        }
-    }
-
-    if (empty($logs['logs'])) {
-        $workbook->close();
-        return true;
-    }
-
-    $formatDate =& $workbook->add_format();
-    $formatDate->set_num_format(get_string('log_excel_date_format'));
-
-    $row = FIRSTUSEDEXCELROW;
-    $wsnumber = 1;
-    $myxls =& $worksheet[$wsnumber];
-    foreach ($logs['logs'] as $log) {
-        if (isset($ldcache[$log->module][$log->action])) {
-            $ld = $ldcache[$log->module][$log->action];
-        } else {
-            $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action));
-            $ldcache[$log->module][$log->action] = $ld;
-        }
-        if ($ld && is_numeric($log->info)) {
-            // ugly hack to make sure fullname is shown correctly
-            if (($ld->mtable == 'user') and ($ld->field == $DB->sql_concat('firstname', "' '" , 'lastname'))) {
-                $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true);
-            } else {
-                $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info));
-            }
-        }
-
-        // Filter log->info
-        $log->info = format_string($log->info);
-        $log->info = strip_tags(urldecode($log->info));  // Some XSS protection
-
-        if ($nroPages>1) {
-            if ($row > EXCELROWS) {
-                $wsnumber++;
-                $myxls =& $worksheet[$wsnumber];
-                $row = FIRSTUSEDEXCELROW;
-            }
-        }
-
-        $coursecontext = context_course::instance($course->id);
-
-        $myxls->write_string($row, 0, format_string($courses[$log->course], true, array('context' => $coursecontext)));
-        $myxls->write_date($row, 1, $log->time);
-        $myxls->write_string($row, 2, $log->ip);
-        $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext));
-        $myxls->write_string($row, 3, $fullname);
-        $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url);
-        $myxls->write_string($row, 4, $log->module.' '.$log->action.' ('.$actionurl.')');
-        $myxls->write_string($row, 5, $log->info);
-
-        $row++;
-    }
-
-    $workbook->close();
-    return true;
+function print_log_ods() {
+    throw new coding_exception('print_log_ods() can not be used anymore. Please use the ' .
+        'report_log framework instead.');
 }
 
 /**
- * Build an array of logs.
- *
- * @deprecated since 3.2
+ * @deprecated since Moodle 3.2
  */
-function build_logs_array($course, $user=0, $date=0, $order="l.time ASC", $limitfrom='', $limitnum='',
-                   $modname="", $modid=0, $modaction="", $groupid=0) {
-    global $DB, $SESSION, $USER;
-
-    debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
-    // It is assumed that $date is the GMT time of midnight for that day,
-    // and so the next 86400 seconds worth of logs are printed.
-
-    // Setup for group handling.
-
-    // If the group mode is separate, and this user does not have editing privileges,
-    // then only the user's group can be viewed.
-    if ($course->groupmode == SEPARATEGROUPS and !has_capability('moodle/course:managegroups', context_course::instance($course->id))) {
-        if (isset($SESSION->currentgroup[$course->id])) {
-            $groupid =  $SESSION->currentgroup[$course->id];
-        } else {
-            $groupid = groups_get_all_groups($course->id, $USER->id);
-            if (is_array($groupid)) {
-                $groupid = array_shift(array_keys($groupid));
-                $SESSION->currentgroup[$course->id] = $groupid;
-            } else {
-                $groupid = 0;
-            }
-        }
-    }
-    // If this course doesn't have groups, no groupid can be specified.
-    else if (!$course->groupmode) {
-        $groupid = 0;
-    }
-
-    $joins = array();
-    $params = array();
-
-    if ($course->id != SITEID || $modid != 0) {
-        $joins[] = "l.course = :courseid";
-        $params['courseid'] = $course->id;
-    }
-
-    if ($modname) {
-        $joins[] = "l.module = :modname";
-        $params['modname'] = $modname;
-    }
-
-    if ('site_errors' === $modid) {
-        $joins[] = "( l.action='error' OR l.action='infected' )";
-    } else if ($modid) {
-        $joins[] = "l.cmid = :modid";
-        $params['modid'] = $modid;
-    }
-
-    if ($modaction) {
-        $firstletter = substr($modaction, 0, 1);
-        if ($firstletter == '-') {
-            $joins[] = $DB->sql_like('l.action', ':modaction', false, true, true);
-            $params['modaction'] = '%'.substr($modaction, 1).'%';
-        } else {
-            $joins[] = $DB->sql_like('l.action', ':modaction', false);
-            $params['modaction'] = '%'.$modaction.'%';
-        }
-    }
-
-
-    /// Getting all members of a group.
-    if ($groupid and !$user) {
-        if ($gusers = groups_get_members($groupid)) {
-            $gusers = array_keys($gusers);
-            $joins[] = 'l.userid IN (' . implode(',', $gusers) . ')';
-        } else {
-            $joins[] = 'l.userid = 0'; // No users in groups, so we want something that will always be false.
-        }
-    }
-    else if ($user) {
-        $joins[] = "l.userid = :userid";
-        $params['userid'] = $user;
-    }
-
-    if ($date) {
-        $enddate = $date + 86400;
-        $joins[] = "l.time > :date AND l.time < :enddate";
-        $params['date'] = $date;
-        $params['enddate'] = $enddate;
-    }
-
-    $selector = implode(' AND ', $joins);
-
-    $totalcount = 0;  // Initialise
-    $result = array();
-    $result['logs'] = get_logs($selector, $params, $order, $limitfrom, $limitnum, $totalcount);
-    $result['totalcount'] = $totalcount;
-    return $result;
+function build_logs_array() {
+    throw new coding_exception('build_logs_array() can not be used anymore. Please use the ' .
+        'report_log framework instead.');
 }
 
 /**
- * Select all log records for a given course and user.
- *
- * @deprecated since 3.2
- * @param int $userid The id of the user as found in the 'user' table.
- * @param int $courseid The id of the course as found in the 'course' table.
- * @param string $coursestart unix timestamp representing course start date and time.
- * @return array
+ * @deprecated since Moodle 3.2
  */
-function get_logs_usercourse($userid, $courseid, $coursestart) {
-    global $DB;
-
-    debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
-
-    $params = array();
-
-    $courseselect = '';
-    if ($courseid) {
-        $courseselect = "AND course = :courseid";
-        $params['courseid'] = $courseid;
-    }
-    $params['userid'] = $userid;
-    // We have to sanitize this param ourselves here instead of relying on DB.
-    // Postgres complains if you use name parameter or column alias in GROUP BY.
-    // See MDL-27696 and 51c3e85 for details.
-    $coursestart = (int)$coursestart;
-
-    return $DB->get_records_sql("SELECT FLOOR((time - $coursestart)/". DAYSECS .") AS day, COUNT(*) AS num
-                                   FROM {log}
-                                  WHERE userid = :userid
-                                        AND time > $coursestart $courseselect
-                               GROUP BY FLOOR((time - $coursestart)/". DAYSECS .")", $params);
+function get_logs_usercourse() {
+    throw new coding_exception('get_logs_usercourse() can not be used anymore. Please use the ' .
+        'report_log framework instead.');
 }
 
 /**
- * Select all log records for a given course, user, and day.
- *
- * @deprecated since 3.2
- * @param int $userid The id of the user as found in the 'user' table.
- * @param int $courseid The id of the course as found in the 'course' table.
- * @param string $daystart unix timestamp of the start of the day for which the logs needs to be retrived
- * @return array
+ * @deprecated since Moodle 3.2
  */
-function get_logs_userday($userid, $courseid, $daystart) {
-    global $DB;
-
-    debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
-
-    $params = array('userid'=>$userid);
-
-    $courseselect = '';
-    if ($courseid) {
-        $courseselect = "AND course = :courseid";
-        $params['courseid'] = $courseid;
-    }
-    // Note: unfortunately pg complains if you use name parameter or column alias in GROUP BY.
-    $daystart = (int) $daystart;
-
-    return $DB->get_records_sql("SELECT FLOOR((time - $daystart)/". HOURSECS .") AS hour, COUNT(*) AS num
-                                   FROM {log}
-                                  WHERE userid = :userid
-                                        AND time > $daystart $courseselect
-                               GROUP BY FLOOR((time - $daystart)/". HOURSECS .") ", $params);
+function get_logs_userday() {
+    throw new coding_exception('get_logs_userday() can not be used anymore. Please use the ' .
+        'report_log framework instead.');
 }
 
 /**
- * Select all log records based on SQL criteria.
- *
- * @deprecated since 3.2
- * @param string $select SQL select criteria
- * @param array $params named sql type params
- * @param string $order SQL order by clause to sort the records returned
- * @param string $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set)
- * @param int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set)
- * @param int $totalcount Passed in by reference.
- * @return array
+ * @deprecated since Moodle 3.2
  */
-function get_logs($select, array $params=null, $order='l.time DESC', $limitfrom='', $limitnum='', &$totalcount) {
-    global $DB;
-
-    debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
-
-    if ($order) {
-        $order = "ORDER BY $order";
-    }
-
-    if ($select) {
-        $select = "WHERE $select";
-    }
-
-    $sql = "SELECT COUNT(*)
-              FROM {log} l
-           $select";
-
-    $totalcount = $DB->count_records_sql($sql, $params);
-    $allnames = get_all_user_name_fields(true, 'u');
-    $sql = "SELECT l.*, $allnames, u.picture
-              FROM {log} l
-              LEFT JOIN {user} u ON l.userid = u.id
-           $select
-            $order";
-
-    return $DB->get_records_sql($sql, $params, $limitfrom, $limitnum);
+function get_logs() {
+    throw new coding_exception('get_logs() can not be used anymore. Please use the ' .
+        'report_log framework instead.');
 }
 
 /**
- * Renders a hidden password field so that browsers won't incorrectly autofill password fields with the user's password.
- *
- * @deprecated since Moodle 3.2 MDL-53048
+ * @deprecated since Moodle 3.2
  */
 function prevent_form_autofill_password() {
-    debugging('prevent_form_autofill_password has been deprecated and is no longer in use.', DEBUG_DEVELOPER);
-    return '';
+    throw new coding_exception('prevent_form_autofill_password() can not be used anymore.');
 }
 
 /**
@@ -3948,23 +2515,11 @@ function message_get_recent_conversations($userorid, $limitfrom = 0, $limitto =
 }
 
 /**
- * Display calendar preference button.
- *
- * @param stdClass $course course object
  * @deprecated since Moodle 3.2
- * @return string return preference button in html
  */
-function calendar_preferences_button(stdClass $course) {
-    debugging('This should no longer be used, the calendar preferences are now linked to the user preferences page.');
-
-    global $OUTPUT;
-
-    // Guests have no preferences.
-    if (!isloggedin() || isguestuser()) {
-        return '';
-    }
-
-    return $OUTPUT->single_button(new moodle_url('/user/calendar.php'), get_string("preferences", "calendar"));
+function calendar_preferences_button() {
+    throw new coding_exception('calendar_preferences_button() can not be used anymore. The calendar ' .
+        'preferences are now linked to the user preferences page.');
 }
 
 /**
@@ -4865,3 +3420,34 @@ function events_get_handlers($eventname) {
 
     return $handlers[$eventname];
 }
+
+/**
+ * This function finds the roles assigned directly to this context only
+ * i.e. no roles in parent contexts
+ *
+ * @deprecated since Moodle 3.6. Please use the get_roles_used_in_context().
+ * @todo final deprecation. To be removed in Moodle 4.0
+ * @param context $context
+ * @return array
+ */
+function get_roles_on_exact_context(context $context) {
+    debugging('get_roles_on_exact_context() is deprecated, please use get_roles_used_in_context() instead.',
+        DEBUG_DEVELOPER);
+
+    return get_roles_used_in_context($context, false);
+}
+
+/**
+ * Find out which roles has assignment on this context
+ *
+ * @deprecated since Moodle 3.6. Please use the get_roles_used_in_context().
+ * @todo final deprecation. To be removed in Moodle 4.0
+ * @param context $context
+ * @return array
+ */
+function get_roles_with_assignment_on_context(context $context) {
+    debugging('get_roles_with_assignment_on_context() is deprecated, please use get_roles_used_in_context() instead.',
+        DEBUG_DEVELOPER);
+
+    return get_roles_used_in_context($context, false);
+}
index 7afca6c..4c8b797 100644 (file)
@@ -229,7 +229,9 @@ class file_info_context_course extends file_info {
             }
         }
         $urlbase = $CFG->wwwroot.'/pluginfile.php';
-        return new file_info_stored($this->browser, $this->context, $storedfile, $urlbase, $section->section, true, true, true, false);
+        require_once($CFG->dirroot.'/course/lib.php');
+        $sectionname = get_section_name($this->course, $section);
+        return new file_info_stored($this->browser, $this->context, $storedfile, $urlbase, $sectionname, true, true, true, false);
     }
 
     /**
index 32353d6..0216709 100644 (file)
@@ -20,6 +20,7 @@
  *
  * Contains HTML class for htmleditor type element
  *
+ * @deprecated since 3.6
  * @package   core_form
  * @copyright 2006 Jamie Pratt <me@jamiep.org>
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
@@ -55,6 +56,8 @@ class MoodleQuickForm_htmleditor extends MoodleQuickForm_textarea{
      *              or an associative array
      */
     public function __construct($elementName=null, $elementLabel=null, $options=array(), $attributes=null){
+        debugging("The form element 'htmleditor' has been deprecated. Please use the 'editor' element instead.", DEBUG_DEVELOPER);
+
         parent::__construct($elementName, $elementLabel, $attributes);
         // set the options, do not bother setting bogus ones
         if (is_array($options)) {
index 0b5d300..060e508 100644 (file)
@@ -50,23 +50,13 @@ require_once(__DIR__ . '/../message/lib.php');
  * Note: processor failure is is not reported as false return value,
  *       earlier versions did not do it consistently either.
  *
- * @todo MDL-55449 Drop support for stdClass in Moodle 3.6
  * @category message
  * @param \core\message\message $eventdata information about the message (component, userfrom, userto, ...)
  * @return mixed the integer ID of the new message or false if there was a problem with submitted data
  */
-function message_send($eventdata) {
+function message_send(\core\message\message $eventdata) {
     global $CFG, $DB;
 
-    // TODO MDL-55449 Drop support for stdClass in Moodle 3.6.
-    if ($eventdata instanceof \stdClass) {
-        if (!isset($eventdata->courseid)) {
-            $eventdata->courseid = null;
-        }
-
-        debugging('eventdata as \stdClass is deprecated. Please use core\message\message instead.', DEBUG_DEVELOPER);
-    }
-
     //new message ID to return
     $messageid = false;
 
index dc52ee5..e26ef63 100644 (file)
@@ -5009,7 +5009,6 @@ function remove_course_contents($courseid, $showfeedback = true, array $options
 
             include_once("$moddir/lib.php");                 // Shows php warning only if plugin defective.
             $moddelete = $modname .'_delete_instance';       // Delete everything connected to an instance.
-            $moddeletecourse = $modname .'_delete_course';   // Delete other stray stuff (uncommon).
 
             if ($instances) {
                 foreach ($instances as $cm) {
@@ -5035,12 +5034,6 @@ function remove_course_contents($courseid, $showfeedback = true, array $options
                     }
                 }
             }
-            if (function_exists($moddeletecourse)) {
-                // Execute optional course cleanup callback. Deprecated since Moodle 3.2. TODO MDL-53297 remove in 3.6.
-                debugging("Callback delete_course is deprecated. Function $moddeletecourse should be converted " .
-                    'to observer of event \core\event\course_content_deleted', DEBUG_DEVELOPER);
-                $moddeletecourse($course, $showfeedback);
-            }
             if ($instances and $showfeedback) {
                 echo $OUTPUT->notification($strdeleted.get_string('pluginname', $modname), 'notifysuccess');
             }
@@ -5080,22 +5073,6 @@ function remove_course_contents($courseid, $showfeedback = true, array $options
         echo $OUTPUT->notification($strdeleted.get_string('type_mod_plural', 'plugin'), 'notifysuccess');
     }
 
-    // Cleanup the rest of plugins. Deprecated since Moodle 3.2. TODO MDL-53297 remove in 3.6.
-    $cleanuplugintypes = array('report', 'coursereport', 'format');
-    $callbacks = get_plugins_with_function('delete_course', 'lib.php');
-    foreach ($cleanuplugintypes as $type) {
-        if (!empty($callbacks[$type])) {
-            foreach ($callbacks[$type] as $pluginfunction) {
-                debugging("Callback delete_course is deprecated. Function $pluginfunction should be converted " .
-                    'to observer of event \core\event\course_content_deleted', DEBUG_DEVELOPER);
-                $pluginfunction($course->id, $showfeedback);
-            }
-            if ($showfeedback) {
-                echo $OUTPUT->notification($strdeleted.get_string('type_'.$type.'_plural', 'plugin'), 'notifysuccess');
-            }
-        }
-    }
-
     // Delete questions and question categories.
     question_delete_course($course, $showfeedback);
     if ($showfeedback) {
@@ -6990,6 +6967,7 @@ function get_string_manager($forcereload=false) {
                  $translist = array();
             } else {
                 $translist = explode(',', $CFG->langlist);
+                $translist = array_map('trim', $translist);
             }
 
             if (!empty($CFG->config_php_settings['customstringmanager'])) {
index 5058bc8..b121e26 100644 (file)
@@ -39,165 +39,21 @@ require_once($CFG->libdir . '/csslib.php');
  */
 class core_csslib_testcase extends advanced_testcase {
 
-    public function test_background() {
-        $optimiser = new css_optimiser();
-
-        $cssin = '.test {background-color: #123456;}';
-        $this->assertSame($cssin, $optimiser->process($cssin));
-        $this->assertDebuggingCalled('class css_optimiser is deprecated and no longer does anything, '
-            . 'please consider using stylelint to optimise your css.');
-    }
-
-
     /**
-     * Test CSS colour matching.
+     * Test that css_is_colour function throws an exception.
      */
     public function test_css_is_colour() {
-        $debugstr = 'css_is_colour() is deprecated without a replacement. Please copy the implementation '
-            . 'into your plugin if you need this functionality.';
-        // First lets test hex colours.
-        $this->assertTrue(css_is_colour('#123456'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('#123'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('#ABCDEF'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('#ABC'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('#abcdef'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('#abc'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('#aBcDeF'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('#aBc'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('#1a2Bc3'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('#1Ac'));
-        $this->assertDebuggingCalled($debugstr);
-
-        // Note the following two colour's aren't really colours but browsers process
-        // them still.
-        $this->assertTrue(css_is_colour('#A'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('#12'));
-        $this->assertDebuggingCalled($debugstr);
-        // Having four or five characters however are not valid colours and
-        // browsers don't parse them. They need to fail so that broken CSS
-        // stays broken after optimisation.
-        $this->assertFalse(css_is_colour('#1234'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_colour('#12345'));
-        $this->assertDebuggingCalled($debugstr);
-
-        $this->assertFalse(css_is_colour('#BCDEFG'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_colour('#'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_colour('#0000000'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_colour('#132-245'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_colour('#13 23 43'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_colour('123456'));
-        $this->assertDebuggingCalled($debugstr);
-
-        // Next lets test real browser mapped colours.
-        $this->assertTrue(css_is_colour('black'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('blue'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('BLACK'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('Black'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('bLACK'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('mediumaquamarine'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('mediumAquamarine'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_colour('monkey'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_colour(''));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_colour('not a colour'));
-        $this->assertDebuggingCalled($debugstr);
-
-        // Next lets test rgb(a) colours.
-        $this->assertTrue(css_is_colour('rgb(255,255,255)'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('rgb(0, 0, 0)'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('RGB (255, 255   ,    255)'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('rgba(0,0,0,0)'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('RGBA(255,255,255,1)'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('rgbA(255,255,255,0.5)'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_colour('rgb(-255,-255,-255)'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_colour('rgb(256,-256,256)'));
-        $this->assertDebuggingCalled($debugstr);
-
-        // Now lets test HSL colours.
-        $this->assertTrue(css_is_colour('hsl(0,0%,100%)'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('hsl(180, 0%, 10%)'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_colour('hsl (360, 100%   ,    95%)'));
-        $this->assertDebuggingCalled($debugstr);
-
-        // Finally test the special values.
-        $this->assertTrue(css_is_colour('inherit'));
-        $this->assertDebuggingCalled($debugstr);
+        $this->expectException('coding_exception');
+        $this->expectExceptionMessage('css_is_colour() can not be used anymore.');
+        css_is_colour();
     }
 
     /**
-     * Test the css_is_width function.
+     * Test that css_is_width function throws an exception.
      */
     public function test_css_is_width() {
-        $debugstr = 'css_is_width() is deprecated without a replacement. Please copy the implementation '
-            . 'into your plugin if you need this functionality.';
-        $this->assertTrue(css_is_width('0'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_width('0px'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_width('0em'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_width('199px'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_width('199em'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_width('199%'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_width('-1px'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_width('auto'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertTrue(css_is_width('inherit'));
-        $this->assertDebuggingCalled($debugstr);
-
-        // Valid widths but missing their unit specifier.
-        $this->assertFalse(css_is_width('0.75'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_width('3'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_width('-1'));
-        $this->assertDebuggingCalled($debugstr);
-
-        // Totally invalid widths.
-        $this->assertFalse(css_is_width('-'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_width('bananas'));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_width(''));
-        $this->assertDebuggingCalled($debugstr);
-        $this->assertFalse(css_is_width('top'));
-        $this->assertDebuggingCalled($debugstr);
+        $this->expectException('coding_exception');
+        $this->expectExceptionMessage('css_is_width() can not be used anymore.');
+        css_is_width();
     }
 }
index fb3dee5..7130f01 100644 (file)
@@ -6,6 +6,7 @@ information provided here is intended especially for developers.
 * Custom AJAX handlers for the form autocomplete fields can now optionally return string in their processResults()
   callback. If a string is returned, it is displayed instead of the list of suggested items. This can be used, for
   example, to inform the user that there are too many items matching the current search criteria.
+* The form element 'htmleditor' has been deprecated. Please use the 'editor' element instead.
 * The following functions have been finally deprecated and can not be used any more:
     - external_function_info()
     - core_renderer::update_module_button()
@@ -25,6 +26,18 @@ information provided here is intended especially for developers.
     - site_scale_used()
     - clam_message_admins()
     - get_clam_error_code()
+    - get_records_csv()
+    - put_records_csv()
+    - print_log()
+    - print_mnet_log()
+    - print_log_csv()
+    - print_log_xls()
+    - print_log_ods()
+    - build_logs_array()
+    - get_logs_usercourse()
+    - get_logs_userday()
+    - get_logs()
+    - prevent_form_autofill_password()
 * The following classes have been finally deprecated and can not be used any more:
     - core_media_renderer
     - core_media
@@ -55,6 +68,13 @@ information provided here is intended especially for developers.
   policy and respect the privacy setting made by site administrators. The list of user identifiers should never be
   hard-coded. Instead, the setting $CFG->showuseridentity should be always respected, which has always been the default
   behaviour (MDL-59847).
+* The function message_send() in messagelib.php will now only take the object \core\message\message as a parameter.
+* The method message_sent::create_from_ids() parameter courseid is now required. A debugging
+  message was previously displayed, and the SITEID was used, when not provided.
+* The method \core\message\manager::send_message() now only takes the object \core\message\message as the first parameter.
+* Following functions have been deprecated, please use get_roles_used_in_context.
+    - get_roles_on_exact_context()
+    - get_roles_with_assignment_on_context()
 
 === 3.5 ===
 
index 9c9c415..3f63ed0 100644 (file)
@@ -272,22 +272,6 @@ class core_message_events_testcase extends core_message_messagelib_testcase {
         $this->assertEquals(4, $event->other['courseid']);
     }
 
-    public function test_mesage_sent_via_create_from_ids_without_other_courseid() {
-
-        // Creating a message_sent event without courseid leads to debugging + SITEID.
-        // TODO: MDL-55449 Ensure this leads to exception instead of debugging in Moodle 3.6.
-        $event = \core\event\message_sent::create_from_ids(1, 2, 3);
-
-        // Trigger and capturing the event.
-        $sink = $this->redirectEvents();
-        $event->trigger();
-        $events = $sink->get_events();
-        $event = reset($events);
-
-        $this->assertDebuggingCalled();
-        $this->assertEquals(SITEID, $event->other['courseid']);
-    }
-
     /**
      * Test the message viewed event.
      */
index dd1dd08..4f40560 100644 (file)
@@ -1,6 +1,25 @@
 This files describes API changes in /message/ messaging system,
 information provided here is intended especially for developers.
 
+=== 3.6 ===
+
+* The following functions have been finally deprecated and can not be used anymore:
+  * message_get_course_contexts()
+  * message_remove_url_params()
+  * message_count_messages()
+  * message_count_blocked_users()
+  * message_contact_link()
+  * message_history_link()
+  * message_shorten_message()
+  * message_get_fragment()
+  * message_get_contact_add_remove_link()
+  * message_get_contact_block_link()
+  * message_mark_messages_read()
+  * message_page_type_list()
+  * message_can_post_message()
+  * message_is_user_non_contact_blocked()
+  * message_is_user_blocked()
+
 === 3.5 ===
 
 * Changed the database structure so there are no longer two tables for messages, with the only
index 4facb4f..0f018ca 100644 (file)
@@ -61,6 +61,7 @@ class backup_assign_activity_structure_step extends backup_activity_structure_st
 
         // To know if we are including userinfo.
         $userinfo = $this->get_setting_value('userinfo');
+        $groupinfo = $this->get_setting_value('groups');
 
         // Define each element separated.
         $assign = new backup_nested_element('assign', array('id'),
@@ -159,8 +160,12 @@ class backup_assign_activity_structure_step extends backup_activity_structure_st
             $userflag->set_source_table('assign_user_flags',
                                      array('assignment' => backup::VAR_PARENTID));
 
-            $submission->set_source_table('assign_submission',
-                                     array('assignment' => backup::VAR_PARENTID));
+            $submissionparams = array('assignment' => backup::VAR_PARENTID);
+            if (!$groupinfo) {
+                // Without group info, skip group submissions.
+                $submissionparams['groupid'] = backup_helper::is_sqlparam(0);
+            }
+            $submission->set_source_table('assign_submission', $submissionparams);
 
             $grade->set_source_table('assign_grades',
                                      array('assignment' => backup::VAR_PARENTID));
@@ -172,6 +177,10 @@ class backup_assign_activity_structure_step extends backup_activity_structure_st
             $overrideparams['userid'] = backup_helper::is_sqlparam(null); // Without userinfo, skip user overrides.
         }
 
+        if (!$groupinfo) {
+            // Without group info, skip group overrides.
+            $overrideparams['groupid'] = backup_helper::is_sqlparam(0);
+        }
         $override->set_source_table('assign_overrides', $overrideparams);
 
         // Define id annotations.
index 0987c53..d4ba0a5 100644 (file)
@@ -387,6 +387,12 @@ class restore_assign_activity_structure_step extends restore_activity_structure_
             return;
         }
 
+        // Skip group overrides if we are not restoring groupinfo.
+        $groupinfo = $this->get_setting_value('groups');
+        if (!$groupinfo && !is_null($data->groupid)) {
+            return;
+        }
+
         $data->assignid = $this->get_new_parentid('assign');
 
         if (!is_null($data->userid)) {
index 002404d..ee78784 100644 (file)
@@ -258,8 +258,11 @@ function assign_update_events($assign, $override = null) {
         // Only load events for this override.
         if (isset($override->userid)) {
             $conds['userid'] = $override->userid;
-        } else {
+        } else if (isset($override->groupid)) {
             $conds['groupid'] = $override->groupid;
+        } else {
+            // This is not a valid override, it may have been left from a bad import or restore.
+            $conds['groupid'] = $conds['userid'] = 0;
         }
     }
     $oldevents = $DB->get_records('event', $conds, 'id ASC');
index 4d47f85..54054b3 100644 (file)
@@ -362,14 +362,23 @@ class mod_assign_lib_testcase extends advanced_testcase {
             ]);
 
         $instance = $assign->get_instance();
-        $eventparams = ['modulename' => 'assign', 'instance' => $instance->id];
+        $eventparams = [
+            'modulename' => 'assign',
+            'instance' => $instance->id,
+            'eventtype' => ASSIGN_EVENT_TYPE_DUE,
+            'groupid' => 0
+        ];
 
         // Make sure the calendar event for assignment 1 matches the initial due date.
         $eventtime = $DB->get_field('event', 'timestart', $eventparams, MUST_EXIST);
         $this->assertEquals($eventtime, $duedate);
 
         // Manually update assignment 1's due date.
-        $DB->update_record('assign', (object) ['id' => $instance->id, 'duedate' => $newduedate]);
+        $DB->update_record('assign', (object) [
+            'id' => $instance->id,
+            'duedate' => $newduedate,
+            'course' => $course->id
+        ]);
 
         // Then refresh the assignment events of assignment 1's course.
         $this->assertTrue(assign_refresh_events($course->id));
@@ -380,15 +389,25 @@ class mod_assign_lib_testcase extends advanced_testcase {
 
         // Create a second course and assignment.
         $othercourse = $this->getDataGenerator()->create_course();;
-        $otherassign = $this->create_instance($othercourse, ['duedate' => $duedate, 'course' => $othercourse->id]);
+        $otherassign = $this->create_instance($othercourse, [
+            'duedate' => $duedate,
+        ]);
         $otherinstance = $otherassign->get_instance();
 
         // Manually update assignment 1 and 2's due dates.
         $newduedate += DAYSECS;
-        $DB->update_record('assign', (object)['id' => $instance->id, 'duedate' => $newduedate]);
-        $DB->update_record('assign', (object)['id' => $otherinstance->id, 'duedate' => $newduedate]);
+        $DB->update_record('assign', (object)[
+            'id' => $instance->id,
+            'duedate' => $newduedate,
+            'course' => $course->id
+        ]);
+        $DB->update_record('assign', (object)[
+            'id' => $otherinstance->id,
+            'duedate' => $newduedate,
+            'course' => $othercourse->id
+        ]);
 
-        // Refresh events of all courses.
+        // Refresh events of all courses and check the calendar events matches the new date.
         $this->assertTrue(assign_refresh_events());
 
         // Check the due date calendar event for assignment 1.
index 621a3dd..bcbb01a 100644 (file)
@@ -146,7 +146,7 @@ class linkmemberships extends resource_base {
      */
     public function parse_value($value) {
 
-        if (strpos($value, '$ToolProxyBinding.memberships.url') !== false) {
+        if (strpos($value, '$LtiLink.memberships.url') !== false) {
             $id = optional_param('id', 0, PARAM_INT); // Course Module ID.
             if (!empty($id)) {
                 $cm = get_coursemodule_from_id('lti', $id, 0, false, MUST_EXIST);
index 7a0e029..b8dddb0 100644 (file)
@@ -8,6 +8,10 @@ information provided here is intended especially for developers.
 * lti_get_shortcuts has been deprecated. Please use get_shortcuts() instead to add items to the activity chooser.
 * Now, when mod_<modname>_core_calendar_is_event_visible or mod_<modname>_core_calendar_provide_event_action callback functions
   are called, the userid of the requesting user is also passed to them.
+* The following functions have been finally deprecated and can not be used anymore:
+    - update_module_button()
+* The final deprecation of xxx_delete_course callback means that this function will no longer be called.
+  Please use the observer for event \core\event\course_content_deleted instead.
 
 === 3.5 ===
 
diff --git a/question/type/ddwtos/tests/edit_form_test.php b/question/type/ddwtos/tests/edit_form_test.php
new file mode 100644 (file)
index 0000000..0e462aa
--- /dev/null
@@ -0,0 +1,81 @@
+<?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/>.
+
+/**
+ * Unit tests for the drag-and-drop words into sentences edit form.
+ *
+ * @package   qtype_ddwtos
+ * @copyright 2018 The Open University
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+global $CFG;
+
+require_once($CFG->dirroot . '/question/engine/tests/helpers.php');
+require_once($CFG->dirroot . '/question/type/edit_question_form.php');
+require_once($CFG->dirroot . '/question/type/ddwtos/edit_ddwtos_form.php');
+
+/**
+ * Unit tests for the drag-and-drop words into sentences edit form.
+ *
+ * @copyright  2012 The Open University
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class qtype_ddwtos_edit_form_test extends advanced_testcase {
+    /**
+     * Helper method.
+     *
+     * @param string $classname the question form class to instantiate.
+     *
+     * @return question_edit_form great a question form instance that can be tested.
+     */
+    protected function get_form($classname) {
+        $this->setAdminUser();
+        $this->resetAfterTest();
+
+        $syscontext = context_system::instance();
+        $category = question_make_default_categories(array($syscontext));
+        $fakequestion = new stdClass();
+        $fakequestion->qtype = 'stack';
+        $fakequestion->contextid = $syscontext->id;
+        $fakequestion->createdby = 2;
+        $fakequestion->category = $category->id;
+        $fakequestion->questiontext = 'Test [[1]] question [[2]]';
+        $fakequestion->options = new stdClass();
+        $fakequestion->options->answers = array();
+        $fakequestion->formoptions = new stdClass();
+        $fakequestion->formoptions->movecontext = null;
+        $fakequestion->formoptions->repeatelements = true;
+        $fakequestion->inputs = null;
+        return new $classname(new moodle_url('/'), $fakequestion, $category,
+                new question_edit_contexts($syscontext));
+    }
+
+    /**
+     * Test the form shows the right number of groups of choices.
+     */
+    public function test_number_of_choice_groups() {
+        $form = $this->get_form('qtype_ddwtos_edit_form');
+        // Use reflection to get the protected property we need.
+        $property = new ReflectionProperty('qtype_ddwtos_edit_form', '_form');
+        $property->setAccessible(true);
+        $mform = $property->getValue($form);
+        $choices = $mform->getElement('choices[0]');
+        $groupoptions = $choices->_elements[1];
+        $this->assertCount(8, $groupoptions->_options);
+    }
+}
index ed5e516..bd26c77 100644 (file)
@@ -32,10 +32,6 @@ defined('MOODLE_INTERNAL') || die();
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 class qtype_gapselect_edit_form_base extends question_edit_form {
-    /**
-     * Maximum number of different groups of drag items there can be in a question.
-     */
-    const MAX_GROUPS = 8;
 
     /** @var array of HTML tags allowed in choices / drag boxes. */
     protected $allowedhtmltags = array(
@@ -166,15 +162,25 @@ class qtype_gapselect_edit_form_base extends question_edit_form {
                 get_string('addmorechoiceblanks', 'qtype_gapselect'), true);
     }
 
+    /**
+     * Return how many different groups of choices there should be.
+     *
+     * @return int the maximum group number.
+     */
+    function get_maximum_choice_group_number() {
+        return 8;
+    }
+
     /**
      * Creates an array with elements for a choice group.
      *
      * @param object $mform The Moodle form we are working with
+     * @param int $maxgroup The number of max group generate element select.
      * @return array Array for form elements
      */
     protected function choice_group($mform) {
         $options = array();
-        for ($i = 1; $i <= self::MAX_GROUPS; $i += 1) {
+        for ($i = 1; $i <= $this->get_maximum_choice_group_number(); $i += 1) {
             $options[$i] = $i;
         }
         $grouparray = array();
index c159a3f..c39c8cc 100644 (file)
@@ -41,4 +41,8 @@ class qtype_gapselect_edit_form extends qtype_gapselect_edit_form_base {
     public function qtype() {
         return 'gapselect';
     }
+
+    function get_maximum_choice_group_number() {
+        return 20;
+    }
 }
index 7c6dc38..6c42735 100644 (file)
@@ -15,7 +15,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Unit tests for the select missing words question definition class.
+ * Unit tests for the select missing words question edit form.
  *
  * @package   qtype_gapselect
  * @copyright 2012 The Open University
@@ -28,7 +28,7 @@ global $CFG;
 
 require_once($CFG->dirroot . '/question/engine/tests/helpers.php');
 require_once($CFG->dirroot . '/question/type/edit_question_form.php');
-require_once($CFG->dirroot . '/question/type/gapselect/edit_form_base.php');
+require_once($CFG->dirroot . '/question/type/gapselect/edit_gapselect_form.php');
 
 
 /**
@@ -38,25 +38,6 @@ require_once($CFG->dirroot . '/question/type/gapselect/edit_form_base.php');
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 class qtype_gapselect_edit_form_base_testable extends qtype_gapselect_edit_form_base {
-    public function __construct() {
-        $syscontext = context_system::instance();
-        $category = question_make_default_categories(array($syscontext));
-        $fakequestion = new stdClass();
-        $fakequestion->qtype = 'stack';
-        $fakequestion->contextid = $syscontext->id;
-        $fakequestion->createdby = 2;
-        $fakequestion->category = $category->id;
-        $fakequestion->questiontext = 'Test [[1]] question [[2]]';
-        $fakequestion->options = new stdClass();
-        $fakequestion->options->answers = array();
-        $fakequestion->formoptions = new stdClass();
-        $fakequestion->formoptions->movecontext = null;
-        $fakequestion->formoptions->repeatelements = true;
-        $fakequestion->inputs = null;
-        parent::__construct(new moodle_url('/'), $fakequestion, $category,
-                new question_edit_contexts($syscontext));
-    }
-
     public function get_illegal_tag_error($text) {
         return parent::get_illegal_tag_error($text);
     }
@@ -72,7 +53,7 @@ class qtype_gapselect_edit_form_base_testable extends qtype_gapselect_edit_form_
 
 
 /**
- * Unit tests for Stack question editing form.
+ * Unit tests for select missing words question edit form.
  *
  * @copyright  2012 The Open University
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
@@ -81,17 +62,35 @@ class qtype_gapselect_edit_form_test extends advanced_testcase {
 
     /**
      * Helper method.
-     * @return qtype_gapselect_edit_form_base_testable a new form instance that can be tested.
+     *
+     * @param string $classname the question form class to instantiate.
+     *
+     * @return question_edit_form great a question form instance that can be tested.
      */
-    protected function get_form() {
+    protected function get_form($classname) {
         $this->setAdminUser();
         $this->resetAfterTest();
 
-        return new qtype_gapselect_edit_form_base_testable();
+        $syscontext = context_system::instance();
+        $category = question_make_default_categories(array($syscontext));
+        $fakequestion = new stdClass();
+        $fakequestion->qtype = 'stack';
+        $fakequestion->contextid = $syscontext->id;
+        $fakequestion->createdby = 2;
+        $fakequestion->category = $category->id;
+        $fakequestion->questiontext = 'Test [[1]] question [[2]]';
+        $fakequestion->options = new stdClass();
+        $fakequestion->options->answers = array();
+        $fakequestion->formoptions = new stdClass();
+        $fakequestion->formoptions->movecontext = null;
+        $fakequestion->formoptions->repeatelements = true;
+        $fakequestion->inputs = null;
+        return new $classname(new moodle_url('/'), $fakequestion, $category,
+                new question_edit_contexts($syscontext));
     }
 
     public function test_get_illegal_tag_error() {
-        $form = $this->get_form();
+        $form = $this->get_form('qtype_gapselect_edit_form_base_testable');
 
         $this->assertEquals('', $form->get_illegal_tag_error('frog'));
         $this->assertEquals('', $form->get_illegal_tag_error('<i>toad</i>'));
@@ -127,4 +126,18 @@ class qtype_gapselect_edit_form_test extends advanced_testcase {
         $this->assertEquals(get_string('tagsnotallowedatall', 'qtype_gapselect', $a),
                 $form->get_illegal_tag_error('<i><br /></i>'));
     }
+
+    /**
+     * Test the form shows the right number of groups of choices.
+     */
+    public function test_number_of_choice_groups() {
+        $form = $this->get_form('qtype_gapselect_edit_form');
+        // Use reflection to get the protected property we need.
+        $property = new ReflectionProperty('qtype_gapselect_edit_form', '_form');
+        $property->setAccessible(true);
+        $mform = $property->getValue($form);
+        $choices = $mform->getElement('choices[0]');
+        $groupoptions = $choices->_elements[1];
+        $this->assertCount(20, $groupoptions->_options);
+    }
 }
index f410e0b..9656574 100644 (file)
@@ -1,6 +1,11 @@
 This files describes API changes in /report/* - plugins,
 information provided here is intended especially for developers.
 
+=== 3.6 ===
+
+* The final deprecation of xxx_delete_course callback means that this function will no longer be called.
+  Please use the observer for event \core\event\course_content_deleted instead.
+
 === 3.2 ===
 * Callback delete_course is deprecated and should be replaced with observer for event \core\event\course_content_deleted
 * The report_log_print_graph signature and behaviour has changed to generate charts using
diff --git a/repository/coursefiles/pix/icon.svg b/repository/coursefiles/pix/icon.svg
new file mode 100644 (file)
index 0000000..3011b9f
--- /dev/null
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="74px" height="51px" viewBox="-0.535 -0.774 74 51"\r
+        style="overflow:visible;enable-background:new -0.535 -0.774 74 51;" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<radialGradient id="SVGID_1_" cx="137.084" cy="32.2324" r="123.3346" gradientUnits="userSpaceOnUse">\r
+       <stop  offset="0" style="stop-color:#FAAF40"/>\r
+       <stop  offset="0.0432" style="stop-color:#F9A538"/>\r
+       <stop  offset="0.1116" style="stop-color:#F89D31"/>\r
+       <stop  offset="0.2269" style="stop-color:#F89A2F"/>\r
+       <stop  offset="0.5276" style="stop-color:#F7922D"/>\r
+       <stop  offset="1" style="stop-color:#F37B28"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#FAAF40"/>\r
+       <a:midPointStop  offset="0.1982" style="stop-color:#FAAF40"/>\r
+       <a:midPointStop  offset="0.2269" style="stop-color:#F89A2F"/>\r
+       <a:midPointStop  offset="0.6064" style="stop-color:#F89A2F"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#F37B28"/>\r
+</radialGradient>\r
+<path style="fill:url(#SVGID_1_);" d="M61.192,49.375V26.558c0-4.771-1.972-7.156-5.911-7.156c-3.942,0-5.912,2.386-5.912,7.156\r
+       v22.817H37.754V26.558c0-4.771-1.938-7.156-5.811-7.156c-3.94,0-5.91,2.386-5.91,7.156v22.817H14.417V25.211\r
+       c0-4.979,1.728-8.747,5.185-11.304c3.043-2.282,7.158-3.425,12.343-3.425c5.255,0,9.127,1.349,11.617,4.045\r
+       c2.142-2.696,6.049-4.045,11.72-4.045c5.186,0,9.298,1.143,12.341,3.425c3.457,2.557,5.186,6.325,5.186,11.304v24.164H61.192z"/>\r
+<path style="fill:#58595B;" d="M15.499,16.321c-0.394,1.999-0.788,3.999-1.181,5.997c10.983,3.72,21.4,0.111,26.883-9.489\r
+       C33.184,7.282,25.601,12.914,15.499,16.321"/>\r
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="14.4287" y1="16.0166" x2="40.6895" y2="16.0166">\r
+       <stop  offset="0" style="stop-color:#929497"/>\r
+       <stop  offset="0.1245" style="stop-color:#757578"/>\r
+       <stop  offset="0.2792" style="stop-color:#575658"/>\r
+       <stop  offset="0.4403" style="stop-color:#403E3F"/>\r
+       <stop  offset="0.6085" style="stop-color:#302D2E"/>\r
+       <stop  offset="0.7884" style="stop-color:#262223"/>\r
+       <stop  offset="1" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="0.2606" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#231F20"/>\r
+</linearGradient>\r
+<path style="fill:url(#SVGID_2_);" d="M15.499,14.889c-0.356,2.259-0.714,4.518-1.07,6.776c10.527,3.567,20.84,0.503,26.261-8.944\r
+       C33.708,4.677,25.925,11.373,15.499,14.889"/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="19.457" y1="7.248" x2="30.3611" y2="22.8207">\r
+       <stop  offset="0" style="stop-color:#231F20"/>\r
+       <stop  offset="1" style="stop-color:#231F20;stop-opacity:0"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="0.5" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#231F20;stop-opacity:0"/>\r
+</linearGradient>\r
+<path style="fill:url(#SVGID_3_);" d="M27.993,17.575c-4.764-0.997-10.036,1.485-13.564,4.09\r
+       C12.103,4.879,22.536,5.222,36.098,9.415c-0.857,4.143-2.387,9.598-5.017,12.903C31.081,20.182,30.052,18.6,27.993,17.575"/>\r
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="0.0078" y1="7.7275" x2="48.0068" y2="7.7275">\r
+       <stop  offset="0" style="stop-color:#929497"/>\r
+       <stop  offset="0.1245" style="stop-color:#757578"/>\r
+       <stop  offset="0.2792" style="stop-color:#575658"/>\r
+       <stop  offset="0.4403" style="stop-color:#403E3F"/>\r
+       <stop  offset="0.6085" style="stop-color:#302D2E"/>\r
+       <stop  offset="0.7884" style="stop-color:#262223"/>\r
+       <stop  offset="1" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="0.2606" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#231F20"/>\r
+</linearGradient>\r
+<path style="fill:url(#SVGID_4_);" d="M0.008,14.889C17.625,4.318,27.468,2.282,48.007,0.202\r
+       C24.279,18.919,23.64,14.889,0.008,14.889"/>\r
+<line style="fill:#383738;stroke:#4A4A4C;stroke-width:0.5;" x1="48.007" y1="0.202" x2="29.186" y2="13.948"/>\r
+<path style="opacity:0.23;fill:#231F20;" d="M25.506,7.567C25.733,9.723,25.286,5.423,25.506,7.567"/>\r
+<line style="fill:#FFFFFF;stroke:#A8ABAD;stroke-width:0.5;" x1="0.008" y1="14.889" x2="29.186" y2="13.948"/>\r
+<path style="fill:none;stroke:#F16922;stroke-width:0.5;" d="M23.79,7.733c-4.996,1.381-21.387,5.041-21.64,7.086\r
+       c-0.483,3.917-0.123,10.143-0.123,10.143"/>\r
+<path style="fill:#F16922;" d="M3.532,39.84C1.697,35.389-0.443,30.363,2.1,24.184C3.794,29.957,3.544,34.362,3.532,39.84"/>\r
+<ellipse transform="matrix(0.942 -0.3356 0.3356 0.942 -1.1544 8.1596)" style="fill:#6D6E70;" cx="23.032" cy="7.42" rx="0.792" ry="0.411"/>\r
+</svg>\r
diff --git a/repository/local/pix/icon.svg b/repository/local/pix/icon.svg
new file mode 100644 (file)
index 0000000..3011b9f
--- /dev/null
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="74px" height="51px" viewBox="-0.535 -0.774 74 51"\r
+        style="overflow:visible;enable-background:new -0.535 -0.774 74 51;" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<radialGradient id="SVGID_1_" cx="137.084" cy="32.2324" r="123.3346" gradientUnits="userSpaceOnUse">\r
+       <stop  offset="0" style="stop-color:#FAAF40"/>\r
+       <stop  offset="0.0432" style="stop-color:#F9A538"/>\r
+       <stop  offset="0.1116" style="stop-color:#F89D31"/>\r
+       <stop  offset="0.2269" style="stop-color:#F89A2F"/>\r
+       <stop  offset="0.5276" style="stop-color:#F7922D"/>\r
+       <stop  offset="1" style="stop-color:#F37B28"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#FAAF40"/>\r
+       <a:midPointStop  offset="0.1982" style="stop-color:#FAAF40"/>\r
+       <a:midPointStop  offset="0.2269" style="stop-color:#F89A2F"/>\r
+       <a:midPointStop  offset="0.6064" style="stop-color:#F89A2F"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#F37B28"/>\r
+</radialGradient>\r
+<path style="fill:url(#SVGID_1_);" d="M61.192,49.375V26.558c0-4.771-1.972-7.156-5.911-7.156c-3.942,0-5.912,2.386-5.912,7.156\r
+       v22.817H37.754V26.558c0-4.771-1.938-7.156-5.811-7.156c-3.94,0-5.91,2.386-5.91,7.156v22.817H14.417V25.211\r
+       c0-4.979,1.728-8.747,5.185-11.304c3.043-2.282,7.158-3.425,12.343-3.425c5.255,0,9.127,1.349,11.617,4.045\r
+       c2.142-2.696,6.049-4.045,11.72-4.045c5.186,0,9.298,1.143,12.341,3.425c3.457,2.557,5.186,6.325,5.186,11.304v24.164H61.192z"/>\r
+<path style="fill:#58595B;" d="M15.499,16.321c-0.394,1.999-0.788,3.999-1.181,5.997c10.983,3.72,21.4,0.111,26.883-9.489\r
+       C33.184,7.282,25.601,12.914,15.499,16.321"/>\r
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="14.4287" y1="16.0166" x2="40.6895" y2="16.0166">\r
+       <stop  offset="0" style="stop-color:#929497"/>\r
+       <stop  offset="0.1245" style="stop-color:#757578"/>\r
+       <stop  offset="0.2792" style="stop-color:#575658"/>\r
+       <stop  offset="0.4403" style="stop-color:#403E3F"/>\r
+       <stop  offset="0.6085" style="stop-color:#302D2E"/>\r
+       <stop  offset="0.7884" style="stop-color:#262223"/>\r
+       <stop  offset="1" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="0.2606" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#231F20"/>\r
+</linearGradient>\r
+<path style="fill:url(#SVGID_2_);" d="M15.499,14.889c-0.356,2.259-0.714,4.518-1.07,6.776c10.527,3.567,20.84,0.503,26.261-8.944\r
+       C33.708,4.677,25.925,11.373,15.499,14.889"/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="19.457" y1="7.248" x2="30.3611" y2="22.8207">\r
+       <stop  offset="0" style="stop-color:#231F20"/>\r
+       <stop  offset="1" style="stop-color:#231F20;stop-opacity:0"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="0.5" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#231F20;stop-opacity:0"/>\r
+</linearGradient>\r
+<path style="fill:url(#SVGID_3_);" d="M27.993,17.575c-4.764-0.997-10.036,1.485-13.564,4.09\r
+       C12.103,4.879,22.536,5.222,36.098,9.415c-0.857,4.143-2.387,9.598-5.017,12.903C31.081,20.182,30.052,18.6,27.993,17.575"/>\r
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="0.0078" y1="7.7275" x2="48.0068" y2="7.7275">\r
+       <stop  offset="0" style="stop-color:#929497"/>\r
+       <stop  offset="0.1245" style="stop-color:#757578"/>\r
+       <stop  offset="0.2792" style="stop-color:#575658"/>\r
+       <stop  offset="0.4403" style="stop-color:#403E3F"/>\r
+       <stop  offset="0.6085" style="stop-color:#302D2E"/>\r
+       <stop  offset="0.7884" style="stop-color:#262223"/>\r
+       <stop  offset="1" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="0.2606" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#231F20"/>\r
+</linearGradient>\r
+<path style="fill:url(#SVGID_4_);" d="M0.008,14.889C17.625,4.318,27.468,2.282,48.007,0.202\r
+       C24.279,18.919,23.64,14.889,0.008,14.889"/>\r
+<line style="fill:#383738;stroke:#4A4A4C;stroke-width:0.5;" x1="48.007" y1="0.202" x2="29.186" y2="13.948"/>\r
+<path style="opacity:0.23;fill:#231F20;" d="M25.506,7.567C25.733,9.723,25.286,5.423,25.506,7.567"/>\r
+<line style="fill:#FFFFFF;stroke:#A8ABAD;stroke-width:0.5;" x1="0.008" y1="14.889" x2="29.186" y2="13.948"/>\r
+<path style="fill:none;stroke:#F16922;stroke-width:0.5;" d="M23.79,7.733c-4.996,1.381-21.387,5.041-21.64,7.086\r
+       c-0.483,3.917-0.123,10.143-0.123,10.143"/>\r
+<path style="fill:#F16922;" d="M3.532,39.84C1.697,35.389-0.443,30.363,2.1,24.184C3.794,29.957,3.544,34.362,3.532,39.84"/>\r
+<ellipse transform="matrix(0.942 -0.3356 0.3356 0.942 -1.1544 8.1596)" style="fill:#6D6E70;" cx="23.032" cy="7.42" rx="0.792" ry="0.411"/>\r
+</svg>\r
diff --git a/repository/recent/pix/icon.svg b/repository/recent/pix/icon.svg
new file mode 100644 (file)
index 0000000..3011b9f
--- /dev/null
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="74px" height="51px" viewBox="-0.535 -0.774 74 51"\r
+        style="overflow:visible;enable-background:new -0.535 -0.774 74 51;" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<radialGradient id="SVGID_1_" cx="137.084" cy="32.2324" r="123.3346" gradientUnits="userSpaceOnUse">\r
+       <stop  offset="0" style="stop-color:#FAAF40"/>\r
+       <stop  offset="0.0432" style="stop-color:#F9A538"/>\r
+       <stop  offset="0.1116" style="stop-color:#F89D31"/>\r
+       <stop  offset="0.2269" style="stop-color:#F89A2F"/>\r
+       <stop  offset="0.5276" style="stop-color:#F7922D"/>\r
+       <stop  offset="1" style="stop-color:#F37B28"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#FAAF40"/>\r
+       <a:midPointStop  offset="0.1982" style="stop-color:#FAAF40"/>\r
+       <a:midPointStop  offset="0.2269" style="stop-color:#F89A2F"/>\r
+       <a:midPointStop  offset="0.6064" style="stop-color:#F89A2F"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#F37B28"/>\r
+</radialGradient>\r
+<path style="fill:url(#SVGID_1_);" d="M61.192,49.375V26.558c0-4.771-1.972-7.156-5.911-7.156c-3.942,0-5.912,2.386-5.912,7.156\r
+       v22.817H37.754V26.558c0-4.771-1.938-7.156-5.811-7.156c-3.94,0-5.91,2.386-5.91,7.156v22.817H14.417V25.211\r
+       c0-4.979,1.728-8.747,5.185-11.304c3.043-2.282,7.158-3.425,12.343-3.425c5.255,0,9.127,1.349,11.617,4.045\r
+       c2.142-2.696,6.049-4.045,11.72-4.045c5.186,0,9.298,1.143,12.341,3.425c3.457,2.557,5.186,6.325,5.186,11.304v24.164H61.192z"/>\r
+<path style="fill:#58595B;" d="M15.499,16.321c-0.394,1.999-0.788,3.999-1.181,5.997c10.983,3.72,21.4,0.111,26.883-9.489\r
+       C33.184,7.282,25.601,12.914,15.499,16.321"/>\r
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="14.4287" y1="16.0166" x2="40.6895" y2="16.0166">\r
+       <stop  offset="0" style="stop-color:#929497"/>\r
+       <stop  offset="0.1245" style="stop-color:#757578"/>\r
+       <stop  offset="0.2792" style="stop-color:#575658"/>\r
+       <stop  offset="0.4403" style="stop-color:#403E3F"/>\r
+       <stop  offset="0.6085" style="stop-color:#302D2E"/>\r
+       <stop  offset="0.7884" style="stop-color:#262223"/>\r
+       <stop  offset="1" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="0.2606" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#231F20"/>\r
+</linearGradient>\r
+<path style="fill:url(#SVGID_2_);" d="M15.499,14.889c-0.356,2.259-0.714,4.518-1.07,6.776c10.527,3.567,20.84,0.503,26.261-8.944\r
+       C33.708,4.677,25.925,11.373,15.499,14.889"/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="19.457" y1="7.248" x2="30.3611" y2="22.8207">\r
+       <stop  offset="0" style="stop-color:#231F20"/>\r
+       <stop  offset="1" style="stop-color:#231F20;stop-opacity:0"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="0.5" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#231F20;stop-opacity:0"/>\r
+</linearGradient>\r
+<path style="fill:url(#SVGID_3_);" d="M27.993,17.575c-4.764-0.997-10.036,1.485-13.564,4.09\r
+       C12.103,4.879,22.536,5.222,36.098,9.415c-0.857,4.143-2.387,9.598-5.017,12.903C31.081,20.182,30.052,18.6,27.993,17.575"/>\r
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="0.0078" y1="7.7275" x2="48.0068" y2="7.7275">\r
+       <stop  offset="0" style="stop-color:#929497"/>\r
+       <stop  offset="0.1245" style="stop-color:#757578"/>\r
+       <stop  offset="0.2792" style="stop-color:#575658"/>\r
+       <stop  offset="0.4403" style="stop-color:#403E3F"/>\r
+       <stop  offset="0.6085" style="stop-color:#302D2E"/>\r
+       <stop  offset="0.7884" style="stop-color:#262223"/>\r
+       <stop  offset="1" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="0.2606" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#231F20"/>\r
+</linearGradient>\r
+<path style="fill:url(#SVGID_4_);" d="M0.008,14.889C17.625,4.318,27.468,2.282,48.007,0.202\r
+       C24.279,18.919,23.64,14.889,0.008,14.889"/>\r
+<line style="fill:#383738;stroke:#4A4A4C;stroke-width:0.5;" x1="48.007" y1="0.202" x2="29.186" y2="13.948"/>\r
+<path style="opacity:0.23;fill:#231F20;" d="M25.506,7.567C25.733,9.723,25.286,5.423,25.506,7.567"/>\r
+<line style="fill:#FFFFFF;stroke:#A8ABAD;stroke-width:0.5;" x1="0.008" y1="14.889" x2="29.186" y2="13.948"/>\r
+<path style="fill:none;stroke:#F16922;stroke-width:0.5;" d="M23.79,7.733c-4.996,1.381-21.387,5.041-21.64,7.086\r
+       c-0.483,3.917-0.123,10.143-0.123,10.143"/>\r
+<path style="fill:#F16922;" d="M3.532,39.84C1.697,35.389-0.443,30.363,2.1,24.184C3.794,29.957,3.544,34.362,3.532,39.84"/>\r
+<ellipse transform="matrix(0.942 -0.3356 0.3356 0.942 -1.1544 8.1596)" style="fill:#6D6E70;" cx="23.032" cy="7.42" rx="0.792" ry="0.411"/>\r
+</svg>\r
diff --git a/repository/user/pix/icon.svg b/repository/user/pix/icon.svg
new file mode 100644 (file)
index 0000000..3011b9f
--- /dev/null
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="74px" height="51px" viewBox="-0.535 -0.774 74 51"\r
+        style="overflow:visible;enable-background:new -0.535 -0.774 74 51;" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<radialGradient id="SVGID_1_" cx="137.084" cy="32.2324" r="123.3346" gradientUnits="userSpaceOnUse">\r
+       <stop  offset="0" style="stop-color:#FAAF40"/>\r
+       <stop  offset="0.0432" style="stop-color:#F9A538"/>\r
+       <stop  offset="0.1116" style="stop-color:#F89D31"/>\r
+       <stop  offset="0.2269" style="stop-color:#F89A2F"/>\r
+       <stop  offset="0.5276" style="stop-color:#F7922D"/>\r
+       <stop  offset="1" style="stop-color:#F37B28"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#FAAF40"/>\r
+       <a:midPointStop  offset="0.1982" style="stop-color:#FAAF40"/>\r
+       <a:midPointStop  offset="0.2269" style="stop-color:#F89A2F"/>\r
+       <a:midPointStop  offset="0.6064" style="stop-color:#F89A2F"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#F37B28"/>\r
+</radialGradient>\r
+<path style="fill:url(#SVGID_1_);" d="M61.192,49.375V26.558c0-4.771-1.972-7.156-5.911-7.156c-3.942,0-5.912,2.386-5.912,7.156\r
+       v22.817H37.754V26.558c0-4.771-1.938-7.156-5.811-7.156c-3.94,0-5.91,2.386-5.91,7.156v22.817H14.417V25.211\r
+       c0-4.979,1.728-8.747,5.185-11.304c3.043-2.282,7.158-3.425,12.343-3.425c5.255,0,9.127,1.349,11.617,4.045\r
+       c2.142-2.696,6.049-4.045,11.72-4.045c5.186,0,9.298,1.143,12.341,3.425c3.457,2.557,5.186,6.325,5.186,11.304v24.164H61.192z"/>\r
+<path style="fill:#58595B;" d="M15.499,16.321c-0.394,1.999-0.788,3.999-1.181,5.997c10.983,3.72,21.4,0.111,26.883-9.489\r
+       C33.184,7.282,25.601,12.914,15.499,16.321"/>\r
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="14.4287" y1="16.0166" x2="40.6895" y2="16.0166">\r
+       <stop  offset="0" style="stop-color:#929497"/>\r
+       <stop  offset="0.1245" style="stop-color:#757578"/>\r
+       <stop  offset="0.2792" style="stop-color:#575658"/>\r
+       <stop  offset="0.4403" style="stop-color:#403E3F"/>\r
+       <stop  offset="0.6085" style="stop-color:#302D2E"/>\r
+       <stop  offset="0.7884" style="stop-color:#262223"/>\r
+       <stop  offset="1" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="0.2606" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#231F20"/>\r
+</linearGradient>\r
+<path style="fill:url(#SVGID_2_);" d="M15.499,14.889c-0.356,2.259-0.714,4.518-1.07,6.776c10.527,3.567,20.84,0.503,26.261-8.944\r
+       C33.708,4.677,25.925,11.373,15.499,14.889"/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="19.457" y1="7.248" x2="30.3611" y2="22.8207">\r
+       <stop  offset="0" style="stop-color:#231F20"/>\r
+       <stop  offset="1" style="stop-color:#231F20;stop-opacity:0"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="0.5" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#231F20;stop-opacity:0"/>\r
+</linearGradient>\r
+<path style="fill:url(#SVGID_3_);" d="M27.993,17.575c-4.764-0.997-10.036,1.485-13.564,4.09\r
+       C12.103,4.879,22.536,5.222,36.098,9.415c-0.857,4.143-2.387,9.598-5.017,12.903C31.081,20.182,30.052,18.6,27.993,17.575"/>\r
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="0.0078" y1="7.7275" x2="48.0068" y2="7.7275">\r
+       <stop  offset="0" style="stop-color:#929497"/>\r
+       <stop  offset="0.1245" style="stop-color:#757578"/>\r
+       <stop  offset="0.2792" style="stop-color:#575658"/>\r
+       <stop  offset="0.4403" style="stop-color:#403E3F"/>\r
+       <stop  offset="0.6085" style="stop-color:#302D2E"/>\r
+       <stop  offset="0.7884" style="stop-color:#262223"/>\r
+       <stop  offset="1" style="stop-color:#231F20"/>\r
+       <a:midPointStop  offset="0" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="0.2606" style="stop-color:#929497"/>\r
+       <a:midPointStop  offset="1" style="stop-color:#231F20"/>\r
+</linearGradient>\r
+<path style="fill:url(#SVGID_4_);" d="M0.008,14.889C17.625,4.318,27.468,2.282,48.007,0.202\r
+       C24.279,18.919,23.64,14.889,0.008,14.889"/>\r
+<line style="fill:#383738;stroke:#4A4A4C;stroke-width:0.5;" x1="48.007" y1="0.202" x2="29.186" y2="13.948"/>\r
+<path style="opacity:0.23;fill:#231F20;" d="M25.506,7.567C25.733,9.723,25.286,5.423,25.506,7.567"/>\r
+<line style="fill:#FFFFFF;stroke:#A8ABAD;stroke-width:0.5;" x1="0.008" y1="14.889" x2="29.186" y2="13.948"/>\r
+<path style="fill:none;stroke:#F16922;stroke-width:0.5;" d="M23.79,7.733c-4.996,1.381-21.387,5.041-21.64,7.086\r
+       c-0.483,3.917-0.123,10.143-0.123,10.143"/>\r
+<path style="fill:#F16922;" d="M3.532,39.84C1.697,35.389-0.443,30.363,2.1,24.184C3.794,29.957,3.544,34.362,3.532,39.84"/>\r
+<ellipse transform="matrix(0.942 -0.3356 0.3356 0.942 -1.1544 8.1596)" style="fill:#6D6E70;" cx="23.032" cy="7.42" rx="0.792" ry="0.411"/>\r
+</svg>\r
index 26557f8..8fdb4e4 100644 (file)
@@ -168,3 +168,20 @@ body:not(.jsenabled) .langmenu:hover > .dropdown-menu,
 .custom-select {
     word-wrap: normal;
 }
+
+/* Add commented out carousel transistions back in.
+ *
+ * The Css prefixer used in Moodle breaks on @supports syntax, See MDL-61515.
+ */
+.carousel-item-next.carousel-item-left,
+.carousel-item-prev.carousel-item-right {
+    transform: translateX(0);
+}
+.carousel-item-next,
+.active.carousel-item-right {
+    transform: translateX(100%);
+}
+.carousel-item-prev,
+.active.carousel-item-left {
+    transform: translateX(-100%);
+}
index ae74bbc..be02405 100644 (file)
@@ -16411,6 +16411,22 @@ body:not(.jsenabled) .langmenu:hover > .dropdown-menu,
 .custom-select {
   word-wrap: normal; }
 
+/* Add commented out carousel transistions back in.
+ *
+ * The Css prefixer used in Moodle breaks on @supports syntax, See MDL-61515.
+ */
+.carousel-item-next.carousel-item-left,
+.carousel-item-prev.carousel-item-right {
+  transform: translateX(0); }
+
+.carousel-item-next,
+.active.carousel-item-right {
+  transform: translateX(100%); }
+
+.carousel-item-prev,
+.active.carousel-item-left {
+  transform: translateX(-100%); }
+
 body.behat-site .fixed-top {
   position: absolute; }
 
index 7d2692d..ed43009 100644 (file)
@@ -13,6 +13,11 @@ information provided here is intended especially for theme designer.
   - Microsoft Edge: The body class should change from safari to edge.
   - Mobile safari: The class ios should exist, safari class should be removed.
 * Remove class .safari styling from activity chooser dialog for theme boost and bootstrapbase.
+* The following functions and classes have been finally deprecated and can not be used anymore:
+  * css_is_colour()
+  * css_is_width()
+  * css_sort_by_count()
+  * class css_optimiser
 
 === 3.4 ===