Merge branch 'MDL-34160-forum-subject' of https://github.com/brendanheywood/moodle
authorDan Poltawski <dan@moodle.com>
Tue, 16 Feb 2016 11:04:41 +0000 (11:04 +0000)
committerDan Poltawski <dan@moodle.com>
Tue, 16 Feb 2016 11:04:41 +0000 (11:04 +0000)
239 files changed:
admin/environment.xml
admin/tool/capability/styles.css
admin/tool/customlang/db/upgrade.php
admin/tool/log/db/upgrade.php
admin/tool/log/store/database/db/upgrade.php
admin/tool/log/store/standard/db/upgrade.php
auth/cas/db/upgrade.php
auth/ldap/auth.php
auth/ldap/db/upgrade.php
auth/manual/db/upgrade.php
auth/mnet/db/upgrade.php
badges/tests/behat/award_badge.feature
blocks/community/db/upgrade.php
blocks/completionstatus/db/upgrade.php
blocks/course_summary/db/upgrade.php
blocks/html/db/upgrade.php
blocks/navigation/db/upgrade.php
blocks/recent_activity/db/upgrade.php
blocks/section_links/db/upgrade.php
blocks/selfcompletion/db/upgrade.php
blocks/settings/db/upgrade.php
config-dist.php
course/dndupload.js
course/dnduploadlib.php
course/format/singleactivity/lib.php
course/modlib.php
course/moodleform_mod.php
enrol/database/db/upgrade.php
enrol/flatfile/db/upgrade.php
enrol/guest/db/upgrade.php
enrol/imsenterprise/db/upgrade.php
enrol/manual/db/upgrade.php
enrol/mnet/db/upgrade.php
enrol/paypal/db/upgrade.php
enrol/paypal/pix/icon.gif [deleted file]
enrol/self/db/upgrade.php
filter/mathjaxloader/db/upgrade.php
filter/mediaplugin/db/upgrade.php
filter/tex/db/upgrade.php
grade/edit/tree/item.php
grade/edit/tree/item_form.php
grade/grading/form/rubric/db/upgrade.php
grade/tests/behat/grade_aggregation.feature
grade/tests/behat/grade_calculated_grade_items.feature
grade/tests/behat/grade_calculated_grade_items_20150627.feature
grade/tests/behat/grade_grade_minmax_change.feature [new file with mode: 0644]
grade/tests/behat/grade_item_validation.feature [new file with mode: 0644]
grade/tests/behat/grade_minmax.feature
grade/tests/behat/grade_point_maximum.feature
grade/tests/behat/grade_scales_aggregation.feature
lang/en/deprecated.txt
lang/en/error.php
lang/en/grades.php
lang/en/moodle.php
lang/en/question.php
lang/en/repository.php
lib/classes/output/url_rewriter.php [new file with mode: 0644]
lib/db/install.xml
lib/db/upgrade.php
lib/db/upgradelib.php
lib/dml/pgsql_native_moodle_database.php
lib/editor/atto/db/upgrade.php
lib/editor/tinymce/db/upgrade.php
lib/editor/tinymce/plugins/spellchecker/db/upgrade.php
lib/form/dndupload.js
lib/form/modgrade.php
lib/form/tests/behat/modgrade_validation.feature [new file with mode: 0644]
lib/grade/grade_item.php
lib/grade/tests/grade_item_test.php
lib/moodlelib.php
lib/outputrenderers.php
lib/setup.php
lib/tests/behat/behat_general.php
lib/tests/upgradelib_test.php
lib/upgrade.txt
lib/upgradelib.php
lib/weblib.php
message/output/email/db/upgrade.php
message/output/jabber/db/upgrade.php
message/output/popup/db/upgrade.php
mod/assign/db/upgrade.php
mod/assign/feedback/comments/db/upgrade.php
mod/assign/feedback/editpdf/db/upgrade.php
mod/assign/feedback/file/db/upgrade.php
mod/assign/lib.php
mod/assign/locallib.php
mod/assign/pix/icon.gif [deleted file]
mod/assign/submission/comments/db/upgrade.php
mod/assign/submission/file/db/upgrade.php
mod/assign/submission/onlinetext/db/upgrade.php
mod/assign/tests/behat/rescale_grades.feature [new file with mode: 0644]
mod/assignment/db/upgrade.php
mod/assignment/db/upgradelib.php [deleted file]
mod/assignment/lang/en/assignment.php
mod/assignment/pix/icon.gif [deleted file]
mod/book/db/upgrade.php
mod/book/db/upgradelib.php [deleted file]
mod/book/locallib.php
mod/book/upgrade.txt
mod/chat/db/upgrade.php
mod/chat/pix/icon.gif [deleted file]
mod/choice/db/upgrade.php
mod/choice/pix/icon.gif [deleted file]
mod/data/classes/external.php
mod/data/db/upgrade.php
mod/data/pix/icon.gif [deleted file]
mod/feedback/db/upgrade.php
mod/feedback/pix/icon.gif [deleted file]
mod/folder/db/upgrade.php
mod/folder/pix/icon.gif [deleted file]
mod/forum/db/upgrade.php
mod/forum/externallib.php
mod/forum/lang/en/forum.php
mod/forum/lib.php
mod/forum/pix/icon.gif [deleted file]
mod/forum/templates/forum_post_email_textemail.mustache
mod/glossary/db/upgrade.php
mod/glossary/pix/icon.gif [deleted file]
mod/imscp/db/upgrade.php
mod/imscp/pix/icon.gif [deleted file]
mod/label/db/upgrade.php
mod/label/pix/icon.gif [deleted file]
mod/lesson/db/upgrade.php
mod/lesson/lang/en/deprecated.txt
mod/lesson/lang/en/lesson.php
mod/lesson/mod_form.php
mod/lesson/pix/icon.gif [deleted file]
mod/lesson/settings.php
mod/lesson/tests/generator/lib.php
mod/lesson/version.php
mod/lti/classes/external.php
mod/lti/db/upgrade.php
mod/lti/pix/icon.gif [deleted file]
mod/page/db/upgrade.php
mod/page/pix/icon.gif [deleted file]
mod/quiz/classes/output/edit_renderer.php
mod/quiz/classes/structure.php
mod/quiz/db/upgrade.php
mod/quiz/report/overview/db/upgrade.php
mod/quiz/report/statistics/db/upgrade.php
mod/quiz/styles.css
mod/quiz/tests/behat/editing_remove_question.feature
mod/quiz/tests/structure_test.php
mod/quiz/upgrade.txt
mod/resource/db/upgrade.php
mod/resource/pix/icon.gif [deleted file]
mod/scorm/backup/moodle1/lib.php
mod/scorm/backup/moodle2/backup_scorm_stepslib.php
mod/scorm/datamodels/scorm_12.js
mod/scorm/datamodels/scorm_12.php
mod/scorm/db/install.xml
mod/scorm/db/upgrade.php
mod/scorm/lang/en/scorm.php
mod/scorm/mod_form.php
mod/scorm/pix/icon.gif [deleted file]
mod/scorm/settings.php
mod/scorm/tests/generator/lib.php
mod/scorm/version.php
mod/survey/classes/external.php
mod/survey/db/upgrade.php
mod/survey/pix/icon.gif [deleted file]
mod/upgrade.txt
mod/url/db/upgrade.php
mod/url/pix/icon.gif [deleted file]
mod/wiki/db/upgrade.php
mod/wiki/parser/markups/html.php
mod/wiki/parser/markups/wikimarkup.php
mod/wiki/pix/icon.gif [deleted file]
mod/wiki/tests/fixtures/input/html/3 [new file with mode: 0644]
mod/wiki/tests/fixtures/output/creole/2
mod/wiki/tests/fixtures/output/creole/3
mod/wiki/tests/fixtures/output/creole/4
mod/wiki/tests/fixtures/output/creole/5
mod/wiki/tests/fixtures/output/creole/7
mod/wiki/tests/fixtures/output/creole/8
mod/wiki/tests/fixtures/output/creole/9
mod/wiki/tests/fixtures/output/html/1
mod/wiki/tests/fixtures/output/html/3 [new file with mode: 0644]
mod/wiki/tests/fixtures/output/nwiki/1
mod/wiki/tests/fixtures/output/nwiki/2
mod/wiki/tests/fixtures/output/nwiki/3
mod/wiki/tests/wikiparser_test.php
mod/workshop/db/upgrade.php
mod/workshop/form/accumulative/db/upgrade.php
mod/workshop/form/comments/db/upgrade.php
mod/workshop/form/numerrors/db/upgrade.php
mod/workshop/form/rubric/db/upgrade.php
mod/workshop/pix/icon.gif [deleted file]
portfolio/boxnet/db/upgrade.php
portfolio/boxnet/db/upgradelib.php [deleted file]
portfolio/boxnet/lang/en/portfolio_boxnet.php
portfolio/googledocs/db/upgrade.php
portfolio/googledocs/db/upgradelib.php [deleted file]
portfolio/googledocs/lang/en/portfolio_googledocs.php
portfolio/picasa/db/upgrade.php
portfolio/picasa/db/upgradelib.php [deleted file]
portfolio/picasa/lang/en/portfolio_picasa.php
portfolio/upgrade.txt
question/behaviour/manualgraded/db/upgrade.php
question/type/calculated/db/upgrade.php
question/type/essay/db/upgrade.php
question/type/match/db/upgrade.php
question/type/multianswer/db/upgrade.php
question/type/multichoice/db/upgrade.php
question/type/numerical/db/upgrade.php
question/type/random/db/upgrade.php
question/type/randomsamatch/db/upgrade.php
question/type/shortanswer/db/upgrade.php
question/type/upgrade.txt
repository/alfresco/db/upgrade.php
repository/alfresco/db/upgradelib.php [deleted file]
repository/alfresco/lang/en/repository_alfresco.php
repository/boxnet/db/upgrade.php
repository/boxnet/db/upgradelib.php [deleted file]
repository/boxnet/lang/en/repository_boxnet.php
repository/dropbox/db/upgrade.php
repository/googledocs/db/upgrade.php
repository/googledocs/db/upgradelib.php [deleted file]
repository/googledocs/lang/en/repository_googledocs.php
repository/lib.php
repository/picasa/db/upgrade.php
repository/picasa/db/upgradelib.php [deleted file]
repository/picasa/lang/en/repository_picasa.php
repository/upgrade.txt
rss/file.php
theme/bootstrapbase/less/moodle/bootstrapoverride.less
theme/bootstrapbase/less/moodle/course.less
theme/bootstrapbase/style/moodle.css
theme/more/db/upgrade.php
version.php
webservice/lib.php
webservice/soap/classes/wsdl.php [new file with mode: 0644]
webservice/soap/lib.php
webservice/soap/locallib.php
webservice/soap/tests/wsdl_test.php [new file with mode: 0644]
webservice/soap/version.php
webservice/tests/externallib_test.php
webservice/tests/lib_test.php [new file with mode: 0644]
webservice/upgrade.txt

index 4bf5798..43bc5e4 100644 (file)
       </CUSTOM_CHECK>
     </CUSTOM_CHECKS>
   </MOODLE>
+  <MOODLE version="3.1" requires="2.7">
+    <UNICODE level="required">
+      <FEEDBACK>
+        <ON_ERROR message="unicoderequired" />
+      </FEEDBACK>
+    </UNICODE>
+    <DATABASE level="required">
+      <VENDOR name="mariadb" version="5.5.31" />
+      <VENDOR name="mysql" version="5.5.31" />
+      <VENDOR name="postgres" version="9.1" />
+      <VENDOR name="mssql" version="10.0" />
+      <VENDOR name="oracle" version="10.2" />
+    </DATABASE>
+    <PHP version="5.4.4" level="required">
+    </PHP>
+    <PCREUNICODE level="optional">
+      <FEEDBACK>
+        <ON_CHECK message="pcreunicodewarning" />
+      </FEEDBACK>
+    </PCREUNICODE>
+    <PHP_EXTENSIONS>
+      <PHP_EXTENSION name="iconv" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="iconvrequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="mbstring" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="mbstringrecommended" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="curl" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="curlrequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="openssl" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="opensslrecommended" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="tokenizer" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="tokenizerrecommended" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="xmlrpc" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="xmlrpcrecommended" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="soap" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="soaprecommended" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="ctype" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="ctyperequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="zip" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="ziprequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="zlib" level="required">
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="gd" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="gdrequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="simplexml" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="simplexmlrequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="spl" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="splrequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="pcre" level="required">
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="dom" level="required">
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="xml" level="required">
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="intl" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="intlrecommended" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="json" level="required">
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="hash" level="required"/>
+    </PHP_EXTENSIONS>
+    <PHP_SETTINGS>
+      <PHP_SETTING name="memory_limit" value="96M" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="settingmemorylimit" />
+        </FEEDBACK>
+      </PHP_SETTING>
+      <PHP_SETTING name="file_uploads" value="1" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="settingfileuploads" />
+        </FEEDBACK>
+      </PHP_SETTING>
+      <PHP_SETTING name="opcache.enable" value="1" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="opcacherecommended" />
+        </FEEDBACK>
+      </PHP_SETTING>
+    </PHP_SETTINGS>
+    <CUSTOM_CHECKS>
+      <CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_storage_engine" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="unsupporteddbstorageengine" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+      <CUSTOM_CHECK file="question/engine/upgrade/upgradelib.php" function="quiz_attempts_upgraded" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="quizattemptsupgradedmessage" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+      <CUSTOM_CHECK file="lib/upgradelib.php" function="check_slasharguments" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="slashargumentswarning" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+      <CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_tables_row_format" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="unsupporteddbtablerowformat" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+    </CUSTOM_CHECKS>
+  </MOODLE>
 </COMPATIBILITY_MATRIX>
index 757066e..a3d1046 100644 (file)
@@ -26,7 +26,7 @@
 .path-admin-tool-capability .comparisontable tbody th span {display:block;color:#666;font-size:80%;}
 .path-admin-tool-capability .comparisontable tbody td {border:1px solid #DFDFDF;}
 
-.path-admin-tool-capability .comparisontable .inherit {color:#666;}
-.path-admin-tool-capability .comparisontable .allow {color:#006600;font-weight:bold;}
-.path-admin-tool-capability .comparisontable .prevent {color:#ad6704;font-weight:bold;}
-.path-admin-tool-capability .comparisontable .prohibit {color:#880000;font-weight:bold;}
\ No newline at end of file
+.path-admin-tool-capability .comparisontable .inherit {color:#666}
+.path-admin-tool-capability .comparisontable .allow {background-color:#006600;font-weight:bold;color:white;}
+.path-admin-tool-capability .comparisontable .prevent {background-color:#ad6704;font-weight:bold;color:white;}
+.path-admin-tool-capability .comparisontable .prohibit {background-color:#880000;font-weight:bold;color:white;}
\ No newline at end of file
index 01f87e9..b3c5c03 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
-function xmldb_tool_customlang_upgrade($oldversion) {
-    global $CFG, $DB, $OUTPUT;
-
-    $dbman = $DB->get_manager();
-
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
+defined('MOODLE_INTERNAL') || die();
 
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+function xmldb_tool_customlang_upgrade($oldversion) {
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index 2a4eab3..ef219e0 100644 (file)
@@ -31,20 +31,7 @@ defined('MOODLE_INTERNAL') || die();
  * @return bool always true
  */
 function xmldb_tool_log_upgrade($oldversion) {
-    global $CFG, $DB, $OUTPUT;
-
-    $dbman = $DB->get_manager();
-
-    if ($oldversion < 2014040600) {
-        // Reset logging defaults in dev branches,
-        // in production upgrade the install.php is executed instead.
-        require_once(__DIR__ . '/install.php');
-        xmldb_tool_log_install();
-        upgrade_plugin_savepoint(true, 2014040600, 'tool', 'log');
-    }
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index 565efed..dc92035 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
-function xmldb_logstore_database_upgrade($oldversion) {
-
-    if ($oldversion < 2014041700) {
-        // Clean up old config.
-        unset_config('excludelevels', 'logstore_database');
-        unset_config('excludeactions', 'logstore_database');
-
-        // Savepoint reached.
-        upgrade_plugin_savepoint(true, 2014041700, 'logstore', 'database');
-    }
+defined('MOODLE_INTERNAL') || die();
 
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+function xmldb_logstore_database_upgrade($oldversion) {
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index 9b4247b..b844b62 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
-function xmldb_logstore_standard_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    $dbman = $DB->get_manager();
-
-    if ($oldversion < 2014032000) {
-
-        // Define field anonymous to be added to logstore_standard_log.
-        $table = new xmldb_table('logstore_standard_log');
-        $field = new xmldb_field('anonymous', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'relateduserid');
-
-        // Conditionally launch add field anonymous.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Standard savepoint reached.
-        upgrade_plugin_savepoint(true, 2014032000, 'logstore', 'standard');
-    }
-
-    if ($oldversion < 2014041500) {
-
-        // Define index contextid-component (not unique) to be dropped form logstore_standard_log.
-        $table = new xmldb_table('logstore_standard_log');
-        $index = new xmldb_index('contextid-component', XMLDB_INDEX_NOTUNIQUE, array('contextid', 'component'));
-
-        // Conditionally launch drop index contextid-component.
-        if ($dbman->index_exists($table, $index)) {
-            $dbman->drop_index($table, $index);
-        }
-
-        // Define index courseid (not unique) to be dropped form logstore_standard_log.
-        $table = new xmldb_table('logstore_standard_log');
-        $index = new xmldb_index('courseid', XMLDB_INDEX_NOTUNIQUE, array('courseid'));
-
-        // Conditionally launch drop index courseid.
-        if ($dbman->index_exists($table, $index)) {
-            $dbman->drop_index($table, $index);
-        }
-
-        // Define index eventname (not unique) to be dropped form logstore_standard_log.
-        $table = new xmldb_table('logstore_standard_log');
-        $index = new xmldb_index('eventname', XMLDB_INDEX_NOTUNIQUE, array('eventname'));
+defined('MOODLE_INTERNAL') || die();
 
-        // Conditionally launch drop index eventname.
-        if ($dbman->index_exists($table, $index)) {
-            $dbman->drop_index($table, $index);
-        }
-
-        // Define index crud (not unique) to be dropped form logstore_standard_log.
-        $table = new xmldb_table('logstore_standard_log');
-        $index = new xmldb_index('crud', XMLDB_INDEX_NOTUNIQUE, array('crud'));
-
-        // Conditionally launch drop index crud.
-        if ($dbman->index_exists($table, $index)) {
-            $dbman->drop_index($table, $index);
-        }
-
-        // Define index edulevel (not unique) to be dropped form logstore_standard_log.
-        $table = new xmldb_table('logstore_standard_log');
-        $index = new xmldb_index('edulevel', XMLDB_INDEX_NOTUNIQUE, array('edulevel'));
-
-        // Conditionally launch drop index edulevel.
-        if ($dbman->index_exists($table, $index)) {
-            $dbman->drop_index($table, $index);
-        }
-
-        // Define index course-time (not unique) to be added to logstore_standard_log.
-        $table = new xmldb_table('logstore_standard_log');
-        $index = new xmldb_index('course-time', XMLDB_INDEX_NOTUNIQUE, array('courseid', 'anonymous', 'timecreated'));
-
-        // Conditionally launch add index course-time.
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        // Define index user-module (not unique) to be added to logstore_standard_log.
-        $table = new xmldb_table('logstore_standard_log');
-        $index = new xmldb_index('user-module', XMLDB_INDEX_NOTUNIQUE, array('userid', 'contextlevel', 'contextinstanceid', 'crud', 'edulevel', 'timecreated'));
-
-        // Conditionally launch add index user-module.
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        // Standard savepoint reached.
-        upgrade_plugin_savepoint(true, 2014041500, 'logstore', 'standard');
-    }
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+function xmldb_logstore_standard_upgrade($oldversion) {
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index bca88a4..d421185 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * @param int $oldversion the version we are upgrading from
  * @return bool result
  */
 function xmldb_auth_cas_upgrade($oldversion) {
-
-    // Moodle v2.5.0 release upgrade line
-    // Put any upgrade step following this
-
-    // MDL-39323 New setting in 2.5, make sure it's defined.
-    if ($oldversion < 2013052100) {
-        if (get_config('start_tls', 'auth/cas') === false) {
-            set_config('start_tls', 0, 'auth/cas');
-        }
-        upgrade_plugin_savepoint(true, 2013052100, 'auth', 'cas');
-    }
-
-    if ($oldversion < 2013091700) {
-        // The value of the phpCAS language constants has changed from
-        // 'langname' to 'CAS_Languages_Langname'.
-        if ($cas_language = get_config('auth/cas', 'language')) {
-            set_config('language', 'CAS_Languages_'.ucfirst($cas_language), 'auth/cas');
-        }
-
-        upgrade_plugin_savepoint(true, 2013091700, 'auth', 'cas');
-    }
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG, $DB;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
 
     if ($oldversion < 2014111001) {
-        global $DB;
         // From now on the default LDAP objectClass setting for AD has been changed, from 'user' to '(samaccounttype=805306368)'.
         if (is_enabled_auth('cas')
                 && ($DB->get_field('config_plugins', 'value', array('name' => 'user_type', 'plugin' => 'auth/cas')) === 'ad')
index 0739c59..000904c 100644 (file)
@@ -2057,7 +2057,21 @@ class auth_plugin_ldap extends auth_plugin_base {
         $entry = ldap_get_entries_moodle($ldapconn, $sr);
         $info = array_change_key_case($entry[0], CASE_LOWER);
         $maxpwdage = $info['maxpwdage'][0];
-
+        if ($sr = ldap_read($ldapconn, $user_dn, '(objectClass=*)', array('msDS-ResultantPSO', 'msDS-MaximumPasswordAge'))) {
+            if ($entry = ldap_get_entries_moodle($ldapconn, $sr)) {
+                $info = array_change_key_case($entry[0], CASE_LOWER);
+                $userpso = $info['msds-resultantpso'][0];
+
+                // If a PSO exists, FGPP is being utilized.
+                // Grab the new maxpwdage from the msDS-MaximumPasswordAge attribute of the PSO.
+                if (!empty($userpso)) {
+                    if ($entry = ldap_get_entries_moodle($ldapconn, $sr)) {
+                        $info = array_change_key_case($entry[0], CASE_LOWER);
+                        $maxpwdage = $info['msds-maximumpasswordage'][0];
+                    }
+                }
+            }
+        }
         // ----------------------------------------------------------------
         // MSDN says that "pwdLastSet contains the number of 100 nanosecond
         // intervals since January 1, 1601 (UTC), stored in a 64 bit integer".
index 3a320e3..762815c 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * @param int $oldversion the version we are upgrading from
  * @return bool result
  */
 function xmldb_auth_ldap_upgrade($oldversion) {
-
-    // Moodle v2.5.0 release upgrade line
-    // Put any upgrade step following this
-
-    // MDL-39323 New setting in 2.5, make sure it's defined.
-    if ($oldversion < 2013052100) {
-        if (get_config('start_tls', 'auth/ldap') === false) {
-            set_config('start_tls', 0, 'auth/ldap');
-        }
-        upgrade_plugin_savepoint(true, 2013052100, 'auth', 'ldap');
-    }
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG, $DB;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
 
     if ($oldversion < 2014111001) {
-        global $DB;
         // From now on the default LDAP objectClass setting for AD has been changed, from 'user' to '(samaccounttype=805306368)'.
         if (is_enabled_auth('ldap')
                 && ($DB->get_field('config_plugins', 'value', array('name' => 'user_type', 'plugin' => 'auth/ldap')) === 'ad')
index 3039953..3c0ae55 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * @param int $oldversion the version we are upgrading from
  * @return bool result
  */
 function xmldb_auth_manual_upgrade($oldversion) {
-    global $CFG, $DB, $OUTPUT;
-
-    $dbman = $DB->get_manager();
-
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index 0090939..bfdef15 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * @param int $oldversion the version we are upgrading from
  * @return bool result
  */
 function xmldb_auth_mnet_upgrade($oldversion) {
-    global $CFG, $DB, $OUTPUT;
-
-    $dbman = $DB->get_manager();
-
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index 0b68bd7..bbc28ae 100644 (file)
@@ -217,16 +217,13 @@ Feature: Award badges
     And I follow "Course 1"
     And I press "Mark as complete: Test assignment name"
     And I log out
-    And I log in as "admin"
-    # We can't wait for cron to happen, so the admin manually triggers it.
-    And I trigger cron
-    # The admin needs to trigger cron twice to see the completion status as completed.
-    # We wait more than 1 minute because of the next cron run scheduled time.
-    And I wait "61" seconds
-    And I trigger cron
-    # Finally the admin goes back to homepage to continue the user story.
-    And I am on site homepage
-    And I log out
+    # Completion cron won't mark the whole course completed unless the
+    # individual criteria was marked completed more than a second ago. So
+    # run it twice, first to mark the criteria and second for the course.
+    And I run the scheduled task "core\task\completion_regular_task"
+    And I wait "1" seconds
+    And I run the scheduled task "core\task\completion_regular_task"
+    # The student should now see their badge.
     And I log in as "student1"
     And I follow "Profile" in the user menu
     Then I should see "Course Badge"
index bcc82dc..3a3e7b1 100644 (file)
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  *
  * @param int $oldversion
- * @param object $block
  */
 function xmldb_block_community_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index 070ebcc..f44773a 100644 (file)
@@ -37,6 +37,8 @@
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * Handles upgrading instances of this block.
  *
  * @param object $block
  */
 function xmldb_block_completionstatus_upgrade($oldversion, $block) {
-    global $DB;
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this.
-
-    if ($oldversion < 2012112901) {
-        // Get the instances of this block.
-        if ($blocks = $DB->get_records('block_instances', array('blockname' => 'completionstatus', 'pagetypepattern' => 'my-index'))) {
-            // Loop through and remove them from the My Moodle page.
-            foreach ($blocks as $block) {
-                blocks_delete_instance($block);
-            }
-        }
-        // Savepoint reached.
-        upgrade_block_savepoint(true, 2012112901, 'completionstatus');
-    }
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
@@ -80,4 +58,4 @@ function xmldb_block_completionstatus_upgrade($oldversion, $block) {
     // Put any upgrade step following this.
 
     return true;
-}
\ No newline at end of file
+}
index 0c1549e..1678a1b 100644 (file)
@@ -37,6 +37,8 @@
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * Handles upgrading instances of this block.
  *
  * @param object $block
  */
 function xmldb_block_course_summary_upgrade($oldversion, $block) {
-    global $DB;
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this.
-
-    if ($oldversion < 2012112901) {
-        // Get the instances of this block.
-        if ($blocks = $DB->get_records('block_instances', array('blockname' => 'course_summary', 'pagetypepattern' => 'my-index'))) {
-            // Loop through and remove them from the My Moodle page.
-            foreach ($blocks as $block) {
-                blocks_delete_instance($block);
-            }
-
-        }
-
-        // Savepoint reached.
-        upgrade_block_savepoint(true, 2012112901, 'course_summary');
-    }
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
@@ -84,4 +58,4 @@ function xmldb_block_course_summary_upgrade($oldversion, $block) {
     // Put any upgrade step following this.
 
     return true;
-}
\ No newline at end of file
+}
index ff87abf..4b5a51a 100644 (file)
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * Upgrade code for the HTML block.
  *
  * @param int $oldversion
- * @param object $block
  */
 function xmldb_block_html_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index 6ea9268..430bb9e 100644 (file)
@@ -37,6 +37,8 @@
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * As of the implementation of this block and the general navigation code
  * in Moodle 2.0 the body of immediate upgrade work for this block and
  * was complex due to us wanting to remvoe the outmoded blocks that this
  * block was going to replace.
  *
- * @global moodle_database $DB
  * @param int $oldversion
  * @param object $block
  */
 function xmldb_block_navigation_upgrade($oldversion, $block) {
-    global $DB;
-
-    // Moodle v2.2.0 release upgrade line
-    // Put any upgrade step following this.
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
@@ -85,4 +65,4 @@ function xmldb_block_navigation_upgrade($oldversion, $block) {
     // Put any upgrade step following this.
 
     return true;
-}
\ No newline at end of file
+}
index 8d0f893..02e8be0 100644 (file)
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * Upgrade code for the recent activity block.
  *
- * @global moodle_database $DB
  * @param int $oldversion
  * @param object $block
  */
 function xmldb_block_recent_activity_upgrade($oldversion, $block) {
-    global $CFG, $DB;
-
-    $dbman = $DB->get_manager(); // loads ddl manager and xmldb classes
-
-    if ($oldversion < 2014012000) {
-
-        // Define table block_recent_activity to be created.
-        $table = new xmldb_table('block_recent_activity');
-
-        // Adding fields to table block_recent_activity.
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
-        $table->add_field('courseid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('cmid', 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('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('action', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('modname', XMLDB_TYPE_CHAR, '20', null, null, null, null);
-
-        // Adding keys to table block_recent_activity.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-
-        // Adding indexes to table block_recent_activity.
-        $table->add_index('coursetime', XMLDB_INDEX_NOTUNIQUE, array('courseid', 'timecreated'));
-
-        // Conditionally launch create table for block_recent_activity.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-            // Insert dummy log record for each existing course to notify that their logs need to be migrated.
-            $DB->execute('INSERT INTO {block_recent_activity} (timecreated, userid, courseid, cmid, action) '.
-                    'SELECT ?, 0, id, 0, 3 FROM {course}',
-                    array(time()));
-        }
-
-        // Recent_activity savepoint reached.
-        upgrade_block_savepoint(true, 2014012000, 'recent_activity');
-    }
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index 057f275..66f7957 100644 (file)
@@ -37,6 +37,8 @@
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * Upgrade code for the section links block.
  *
  * @param object $block
  */
 function xmldb_block_section_links_upgrade($oldversion, $block) {
-    global $DB;
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
-    if ($oldversion < 2013012200.00) {
-
-        // The section links block used to use its own crazy plugin name.
-        // Here we are converting it to the proper component name.
-        $oldplugin = 'blocks/section_links';
-        $newplugin = 'block_section_links';
-
-        // Use the proper API here... thats what we should be doing as it ensures any caches etc are cleared
-        // along the way!
-        // It may be quicker to just write an SQL statement but that would be reckless.
-        $config = get_config($oldplugin);
-        if (!empty($config)) {
-            foreach ($config as $name => $value) {
-                set_config($name, $value, $newplugin);
-                unset_config($name, $oldplugin);
-            }
-        }
-
-        // Main savepoint reached.
-        upgrade_block_savepoint(true, 2013012200.00, 'section_links');
-    }
-
-
-    // Moodle v2.5.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index e79331c..9dee1f5 100644 (file)
@@ -37,6 +37,8 @@
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * Handles upgrading instances of this block.
  *
  * @param object $block
  */
 function xmldb_block_selfcompletion_upgrade($oldversion, $block) {
-    global $DB;
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this.
-
-    if ($oldversion < 2012112901) {
-        // Get the instances of this block.
-        if ($blocks = $DB->get_records('block_instances', array('blockname' => 'selfcompletion', 'pagetypepattern' => 'my-index'))) {
-            // Loop through and remove them from the My Moodle page.
-            foreach ($blocks as $block) {
-                blocks_delete_instance($block);
-            }
-
-        }
-
-        // Savepoint reached.
-        upgrade_block_savepoint(true, 2012112901, 'selfcompletion');
-    }
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
@@ -84,4 +58,4 @@ function xmldb_block_selfcompletion_upgrade($oldversion, $block) {
     // Put any upgrade step following this.
 
     return true;
-}
\ No newline at end of file
+}
index b1cf6f8..bd96db6 100644 (file)
@@ -37,6 +37,8 @@
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * As of the implementation of this block and the general navigation code
  * in Moodle 2.0 the body of immediate upgrade work for this block and
  * was complex due to us wanting to remvoe the outmoded blocks that this
  * block was going to replace.
  *
- * @global moodle_database $DB
  * @param int $oldversion
  * @param object $block
  */
 function xmldb_block_settings_upgrade($oldversion, $block) {
-    global $DB;
-
-    // Moodle v2.2.0 release upgrade line
-    // Put any upgrade step following this
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
@@ -85,4 +65,4 @@ function xmldb_block_settings_upgrade($oldversion, $block) {
     // Put any upgrade step following this.
 
     return true;
-}
\ No newline at end of file
+}
index 04b51d7..469884d 100644 (file)
@@ -298,6 +298,11 @@ $CFG->admin = 'admin';
 // This setting will make some graphs (eg user logs) use lines instead of bars
 //      $CFG->preferlinegraphs = true;
 //
+// This setting allows you to specify a class to rewrite outgoing urls
+// enabling 'clean urls' in conjunction with an apache / nginx handler.
+// The handler must implement \core\output\url_rewriter.
+//      $CFG->urlrewriteclass = '\local_cleanurls\url_rewriter';
+//
 // Enabling this will allow custom scripts to replace existing moodle scripts.
 // For example: if $CFG->customscripts/course/view.php exists then
 // it will be used instead of $CFG->wwwroot/course/view.php
index 1a1d434..eb759d8 100644 (file)
@@ -743,7 +743,7 @@ M.course_dndupload = {
         var self = this;
 
         if (file.size > this.maxbytes) {
-            alert("'"+file.name+"' "+M.util.get_string('filetoolarge', 'moodle'));
+            new M.core.alert({message: M.util.get_string('namedfiletoolarge', 'moodle', {filename: file.name})});
             return;
         }
 
@@ -777,11 +777,11 @@ M.course_dndupload = {
                         } else {
                             // Error - remove the dummy element
                             resel.parent.removeChild(resel.li);
-                            alert(result.error);
+                            new M.core.alert({message: result.error});
                         }
                     }
                 } else {
-                    alert(M.util.get_string('servererror', 'moodle'));
+                    new M.core.alert({message: M.util.get_string('servererror', 'moodle')});
                 }
             }
         };
@@ -1002,11 +1002,11 @@ M.course_dndupload = {
                         } else {
                             // Error - remove the dummy element
                             resel.parent.removeChild(resel.li);
-                            alert(result.error);
+                            new M.core.alert({message: result.error});
                         }
                     }
                 } else {
-                    alert(M.util.get_string('servererror', 'moodle'));
+                    new M.core.alert({message: M.util.get_string('servererror', 'moodle')});
                 }
             }
         };
index e491718..843ea9a 100644 (file)
@@ -61,7 +61,7 @@ function dndupload_add_to_course($course, $modnames) {
             array('dndworkingtextlink', 'moodle'),
             array('dndworkingtext', 'moodle'),
             array('dndworkinglink', 'moodle'),
-            array('filetoolarge', 'moodle'),
+            array('namedfiletoolarge', 'moodle'),
             array('actionchoice', 'moodle'),
             array('servererror', 'moodle'),
             array('upload', 'moodle'),
index 65cd546..813e2c6 100644 (file)
@@ -230,8 +230,16 @@ class format_singleactivity extends format_base {
         }
 
         // Make sure the current activity is in the 0-section.
+        $changed = false;
         if ($activity && $activity->sectionnum != 0) {
             moveto_module($activity, $modinfo->get_section_info(0));
+            $changed = true;
+        }
+        if ($activity && !$activity->visible) {
+            set_coursemodule_visible($activity->id, 1);
+            $changed = true;
+        }
+        if ($changed) {
             // Cache was reset so get modinfo again.
             $modinfo = get_fast_modinfo($this->courseid);
         }
index 89588dc..b878ca1 100644 (file)
@@ -453,6 +453,11 @@ function can_update_moduleinfo($cm) {
 function update_moduleinfo($cm, $moduleinfo, $course, $mform = null) {
     global $DB, $CFG;
 
+    $data = new stdClass();
+    if ($mform) {
+        $data = $mform->get_data();
+    }
+
     // Attempt to include module library before we make any changes to DB.
     include_modulelib($moduleinfo->modulename);
 
@@ -523,9 +528,44 @@ function update_moduleinfo($cm, $moduleinfo, $course, $mform = null) {
         $moduleinfo->introformat = $moduleinfo->introeditor['format'];
         unset($moduleinfo->introeditor);
     }
+    // Get the a copy of the grade_item before it is modified incase we need to scale the grades.
+    $oldgradeitem = null;
+    $newgradeitem = null;
+    if (!empty($data->grade_rescalegrades) && $data->grade_rescalegrades == 'yes') {
+        // Fetch the grade item before it is updated.
+        $oldgradeitem = grade_item::fetch(array('itemtype' => 'mod',
+                                                'itemmodule' => $moduleinfo->modulename,
+                                                'iteminstance' => $moduleinfo->instance,
+                                                'itemnumber' => 0,
+                                                'courseid' => $moduleinfo->course));
+    }
+
     $updateinstancefunction = $moduleinfo->modulename."_update_instance";
     if (!$updateinstancefunction($moduleinfo, $mform)) {
-        print_error('cannotupdatemod', '', course_get_url($course, $cw->section), $moduleinfo->modulename);
+        print_error('cannotupdatemod', '', course_get_url($course, $cm->section), $moduleinfo->modulename);
+    }
+
+    // This needs to happen AFTER the grademin/grademax have already been updated.
+    if (!empty($data->grade_rescalegrades) && $data->grade_rescalegrades == 'yes') {
+        // Get the grade_item after the update call the activity to scale the grades.
+        $newgradeitem = grade_item::fetch(array('itemtype' => 'mod',
+                                                'itemmodule' => $moduleinfo->modulename,
+                                                'iteminstance' => $moduleinfo->instance,
+                                                'itemnumber' => 0,
+                                                'courseid' => $moduleinfo->course));
+        if ($newgradeitem && $oldgradeitem->gradetype == GRADE_TYPE_VALUE && $newgradeitem->gradetype == GRADE_TYPE_VALUE) {
+            $params = array(
+                $course,
+                $cm,
+                $oldgradeitem->grademin,
+                $oldgradeitem->grademax,
+                $newgradeitem->grademin,
+                $newgradeitem->grademax
+            );
+            if (!component_callback('mod_' . $moduleinfo->modulename, 'rescale_activity_grades', $params)) {
+                print_error('cannotreprocessgrades', '', course_get_url($course, $cm->section), $moduleinfo->modulename);
+            }
+        }
     }
 
     // Make sure visibility is set correctly (in particular in calendar).
index 690dda8..1f493d0 100644 (file)
@@ -109,9 +109,9 @@ abstract class moodleform_mod extends moodleform {
         $this->_features->defaultcompletion = plugin_supports('mod', $this->_modname, FEATURE_MODEDIT_DEFAULT_COMPLETION, true);
         $this->_features->rating            = plugin_supports('mod', $this->_modname, FEATURE_RATE, false);
         $this->_features->showdescription   = plugin_supports('mod', $this->_modname, FEATURE_SHOW_DESCRIPTION, false);
-
         $this->_features->gradecat          = ($this->_features->outcomes or $this->_features->hasgrades);
         $this->_features->advancedgrading   = plugin_supports('mod', $this->_modname, FEATURE_ADVANCED_GRADING, false);
+        $this->_features->canrescale = (component_callback_exists('mod_' . $this->_modname, 'rescale_activity_grades') !== false);
     }
 
     /**
@@ -405,7 +405,9 @@ abstract class moodleform_mod extends moodleform {
 
             $permission=CAP_ALLOW;
             $rolenamestring = null;
+            $isupdate = false;
             if (!empty($this->_cm)) {
+                $isupdate = true;
                 $context = context_module::instance($this->_cm->id);
 
                 $rolenames = get_role_names_with_caps_in_context($context, array('moodle/rating:rate', 'mod/'.$this->_cm->modname.':rate'));
@@ -420,7 +422,25 @@ abstract class moodleform_mod extends moodleform {
             $mform->setDefault('assessed', 0);
             $mform->addHelpButton('assessed', 'aggregatetype', 'rating');
 
-            $mform->addElement('modgrade', 'scale', get_string('scale'), false);
+            $gradeoptions = array('isupdate' => $isupdate,
+                                  'currentgrade' => false,
+                                  'hasgrades' => false,
+                                  'canrescale' => $this->_features->canrescale,
+                                  'useratings' => $this->_features->rating);
+            if ($isupdate) {
+                $gradeitem = grade_item::fetch(array('itemtype' => 'mod',
+                                                     'itemmodule' => $this->_cm->modname,
+                                                     'iteminstance' => $this->_cm->instance,
+                                                     'itemnumber' => 0,
+                                                     'courseid' => $COURSE->id));
+                if ($gradeitem) {
+                    $gradeoptions['currentgrade'] = $gradeitem->grademax;
+                    $gradeoptions['currentgradetype'] = $gradeitem->gradetype;
+                    $gradeoptions['currentscaleid'] = $gradeitem->scaleid;
+                    $gradeoptions['hasgrades'] = $gradeitem->has_grades();
+                }
+            }
+            $mform->addElement('modgrade', 'scale', get_string('scale'), $gradeoptions);
             $mform->disabledIf('scale', 'assessed', 'eq', 0);
             $mform->addHelpButton('scale', 'modgrade', 'grades');
             $mform->setDefault('scale', $CFG->gradepointdefault);
@@ -641,6 +661,12 @@ abstract class moodleform_mod extends moodleform {
     public function standard_grading_coursemodule_elements() {
         global $COURSE, $CFG;
         $mform =& $this->_form;
+        $isupdate = !empty($this->_cm);
+        $gradeoptions = array('isupdate' => $isupdate,
+                              'currentgrade' => false,
+                              'hasgrades' => false,
+                              'canrescale' => $this->_features->canrescale,
+                              'useratings' => $this->_features->rating);
 
         if ($this->_features->hasgrades) {
 
@@ -650,7 +676,21 @@ abstract class moodleform_mod extends moodleform {
 
             //if supports grades and grades arent being handled via ratings
             if (!$this->_features->rating) {
-                $mform->addElement('modgrade', 'grade', get_string('grade'));
+
+                if ($isupdate) {
+                    $gradeitem = grade_item::fetch(array('itemtype' => 'mod',
+                                                         'itemmodule' => $this->_cm->modname,
+                                                         'iteminstance' => $this->_cm->instance,
+                                                         'itemnumber' => 0,
+                                                         'courseid' => $COURSE->id));
+                    if ($gradeitem) {
+                        $gradeoptions['currentgrade'] = $gradeitem->grademax;
+                        $gradeoptions['currentgradetype'] = $gradeitem->gradetype;
+                        $gradeoptions['currentscaleid'] = $gradeitem->scaleid;
+                        $gradeoptions['hasgrades'] = $gradeitem->has_grades();
+                    }
+                }
+                $mform->addElement('modgrade', 'grade', get_string('grade'), $gradeoptions);
                 $mform->addHelpButton('grade', 'modgrade', 'grades');
                 $mform->setDefault('grade', $CFG->gradepointdefault);
             }
index d1eb164..a2d2c53 100644 (file)
  */
 
 defined('MOODLE_INTERNAL') || die();
-function xmldb_enrol_database_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    $dbman = $DB->get_manager();
-
-
-    // Moodle v2.3.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
 
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+function xmldb_enrol_database_upgrade($oldversion) {
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index ebe5dd7..f16aa4d 100644 (file)
 defined('MOODLE_INTERNAL') || die();
 
 function xmldb_enrol_flatfile_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    $dbman = $DB->get_manager();
-
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index 8ae2004..e1111f7 100644 (file)
  * This file keeps track of upgrades to the guest enrolment plugin.
  *
  * @package    enrol_guest
- * @copyright  2011 Petr Skoda {@link http://skodak.org
+ * @copyright  2011 Petr Skoda {@link http://skodak.org}
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 defined('MOODLE_INTERNAL') || die();
 
 function xmldb_enrol_guest_upgrade($oldversion) {
-    global $CFG, $DB, $OUTPUT;
-
-    $dbman = $DB->get_manager();
-
-    // Moodle v2.2.0 release upgrade line
-    // Put any upgrade step following this
-
-    if ($oldversion < 2011112901) {
-        // convert all null passwords to empty strings
-        $DB->set_field('enrol', 'password', '', array('enrol'=>'guest', 'password'=>null));
-
-        upgrade_plugin_savepoint(true, 2011112901, 'enrol', 'guest');
-    }
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
@@ -68,5 +38,3 @@ function xmldb_enrol_guest_upgrade($oldversion) {
 
     return true;
 }
-
-
index 7fb9ea3..0bc6134 100644 (file)
@@ -31,24 +31,7 @@ defined('MOODLE_INTERNAL') || die();
  * @return bool true
  */
 function xmldb_enrol_imsenterprise_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    $dbman = $DB->get_manager();
-
-    // Moodle v2.3.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.4.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index 7b98f19..5ec65e3 100644 (file)
  * This file keeps track of upgrades to the manual enrolment plugin
  *
  * @package    enrol_manual
- * @copyright  2012 Petr Skoda {@link http://skodak.org
+ * @copyright  2012 Petr Skoda {@link http://skodak.org}
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 defined('MOODLE_INTERNAL') || die();
 
 function xmldb_enrol_manual_upgrade($oldversion) {
-    global $CFG, $DB, $OUTPUT;
-
-    $dbman = $DB->get_manager();
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-    if ($oldversion < 2012100702) {
-        // Set default expiry threshold to 1 day.
-        $DB->execute("UPDATE {enrol} SET expirythreshold = 86400 WHERE enrol = 'manual' AND expirythreshold = 0");
-        upgrade_plugin_savepoint(true, 2012100702, 'enrol', 'manual');
-    }
-
-    if ($oldversion < 2012101400) {
-        // Delete obsoleted settings, now using expiry* prefix to make them more consistent.
-        unset_config('notifylast', 'enrol_manual');
-        unset_config('notifyhour', 'enrol_manual');
-        upgrade_plugin_savepoint(true, 2012101400, 'enrol', 'manual');
-    }
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
@@ -77,5 +44,3 @@ function xmldb_enrol_manual_upgrade($oldversion) {
 
     return true;
 }
-
-
index e66d6ec..2a59641 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 defined('MOODLE_INTERNAL') || die();
 
 function xmldb_enrol_mnet_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    $dbman = $DB->get_manager();
-
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index faf51dc..1497469 100644 (file)
 // Please do not forget to use upgrade_set_timeout()
 // before any action that may take longer time to finish.
 
-function xmldb_enrol_paypal_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    $dbman = $DB->get_manager();
-
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
+defined('MOODLE_INTERNAL') || die();
 
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+function xmldb_enrol_paypal_upgrade($oldversion) {
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
diff --git a/enrol/paypal/pix/icon.gif b/enrol/paypal/pix/icon.gif
deleted file mode 100644 (file)
index 86fc60a..0000000
Binary files a/enrol/paypal/pix/icon.gif and /dev/null differ
index 62cb0df..82bb97d 100644 (file)
  * This file keeps track of upgrades to the self enrolment plugin
  *
  * @package    enrol_self
- * @copyright  2012 Petr Skoda {@link http://skodak.org
+ * @copyright  2012 Petr Skoda {@link http://skodak.org}
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 defined('MOODLE_INTERNAL') || die();
 
 function xmldb_enrol_self_upgrade($oldversion) {
-    global $CFG, $DB, $OUTPUT;
-
-    $dbman = $DB->get_manager();
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-    if ($oldversion < 2012101400) {
-        // Set default expiry threshold to 1 day.
-        $DB->execute("UPDATE {enrol} SET expirythreshold = 86400 WHERE enrol = 'self' AND expirythreshold = 0");
-        upgrade_plugin_savepoint(true, 2012101400, 'enrol', 'self');
-    }
-
-    if ($oldversion < 2012120600) {
-        // Enable new self enrolments everywhere.
-        $DB->execute("UPDATE {enrol} SET customint6 = 1 WHERE enrol = 'self'");
-        upgrade_plugin_savepoint(true, 2012120600, 'enrol', 'self');
-    }
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    if ($oldversion < 2013112100) {
-        // Set customint1 (group enrolment key) to 0 if it was not set (null).
-        $DB->execute("UPDATE {enrol} SET customint1 = 0 WHERE enrol = 'self' AND customint1 IS NULL");
-        upgrade_plugin_savepoint(true, 2013112100, 'enrol', 'self');
-    }
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
@@ -76,5 +38,3 @@ function xmldb_enrol_self_upgrade($oldversion) {
 
     return true;
 }
-
-
index eb1e4cd..056cc18 100644 (file)
@@ -22,6 +22,8 @@
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * @param int $oldversion the version we are upgrading from
  * @return bool result
@@ -31,9 +33,6 @@ function xmldb_filter_mathjaxloader_upgrade($oldversion) {
 
     $dbman = $DB->get_manager();
 
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
-
     if ($oldversion < 2014081100) {
 
         $sslcdnurl = get_config('filter_mathjaxloader', 'httpsurl');
index 3e37445..2a70d61 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * @param int $oldversion the version we are upgrading from
  * @return bool result
  */
 function xmldb_filter_mediaplugin_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    $dbman = $DB->get_manager();
-
-
-    if ($oldversion < 2011121200) {
-        // Move all the media enable setttings that are now handled by core media renderer.
-        foreach (array('html5video', 'html5audio', 'mp3', 'flv', 'wmp', 'qt', 'rm',
-                'youtube', 'vimeo', 'swf') as $type) {
-            $existingkey = 'filter_mediaplugin_enable_' . $type;
-            if (array_key_exists($existingkey, $CFG)) {
-                set_config('core_media_enable_' . $type, $CFG->{$existingkey});
-                unset_config($existingkey);
-            }
-        }
-
-        // Override setting for html5 to turn it on (previous default was off; because
-        // of changes in the way fallbacks are handled, this is now unlikely to cause
-        // a problem, and is required for mobile a/v support on non-Flash devices, so
-        // this change is basically needed in order to maintain existing behaviour).
-        set_config('core_media_enable_html5video', 1);
-        set_config('core_media_enable_html5audio', 1);
-
-        upgrade_plugin_savepoint(true, 2011121200, 'filter', 'mediaplugin');
-    }
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index 703a7d4..14aa3d8 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * @param int $oldversion the version we are upgrading from
  * @return bool result
  */
 function xmldb_filter_tex_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    $dbman = $DB->get_manager();
-
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    if ($oldversion < 2013120300) {
-        $settings = array(
-                'density', 'latexbackground', 'convertformat', 'pathlatex',
-                'convertformat', 'pathconvert', 'pathdvips', 'latexpreamble');
-
-        // Move tex settings to config_pluins and delete entries from the config table.
-        foreach ($settings as $setting) {
-            $existingkey = 'filter_tex_'.$setting;
-            if (array_key_exists($existingkey, $CFG)) {
-                set_config($setting, $CFG->{$existingkey}, 'filter_tex');
-                unset_config($existingkey);
-            }
-        }
-
-        upgrade_plugin_savepoint(true, 2013120300, 'filter', 'tex');
-    }
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index 75d3901..7ee5cbe 100644 (file)
@@ -156,6 +156,8 @@ if ($mform->is_cancelled()) {
     }
 
     $grade_item = new grade_item(array('id'=>$id, 'courseid'=>$courseid));
+    $oldmin = $grade_item->grademin;
+    $oldmax = $grade_item->grademax;
     grade_item::set_properties($grade_item, $data);
     $grade_item->outcomeid = null;
 
@@ -175,6 +177,12 @@ if ($mform->is_cancelled()) {
 
     } else {
         $grade_item->update();
+
+        if (!empty($data->rescalegrades) && $data->rescalegrades == 'yes') {
+            $newmin = $grade_item->grademin;
+            $newmax = $grade_item->grademax;
+            $grade_item->rescale_grades_keep_percentage($oldmin, $oldmax, $newmin, $newmax, 'gradebook');
+        }
     }
 
     // update hiding flag
index f8a08c6..572faa3 100644 (file)
@@ -51,6 +51,23 @@ class edit_item_form extends moodleform {
         $mform->addHelpButton('idnumber', 'idnumbermod');
         $mform->setType('idnumber', PARAM_RAW);
 
+        if (!empty($item->id)) {
+            $gradeitem = new grade_item(array('id' => $item->id, 'courseid' => $item->courseid));
+            // If grades exist set a message so the user knows why they can not alter the grade type or scale.
+            // We could never change the grade type for external items, so only need to show this for manual grade items.
+            if ($gradeitem->has_grades() && !$gradeitem->is_external_item()) {
+                // Set a message so the user knows why they can not alter the grade type or scale.
+                if ($gradeitem->gradetype == GRADE_TYPE_SCALE) {
+                    $gradesexistmsg = get_string('modgradecantchangegradetyporscalemsg', 'grades');
+                } else {
+                    $gradesexistmsg = get_string('modgradecantchangegradetypemsg', 'grades');
+                }
+
+                $gradesexisthtml = '<div class=\'alert\'>' . $gradesexistmsg . '</div>';
+                $mform->addElement('static', 'gradesexistmsg', '', $gradesexisthtml);
+            }
+        }
+
         // Manual grade items cannot have grade type GRADE_TYPE_NONE.
         $options = array(GRADE_TYPE_VALUE => get_string('typevalue', 'grades'),
                          GRADE_TYPE_SCALE => get_string('typescale', 'grades'),
@@ -85,6 +102,14 @@ class edit_item_form extends moodleform {
         $mform->addHelpButton('scaleid', 'typescale', 'grades');
         $mform->disabledIf('scaleid', 'gradetype', 'noteq', GRADE_TYPE_SCALE);
 
+        $choices = array();
+        $choices[''] = get_string('choose');
+        $choices['no'] = get_string('no');
+        $choices['yes'] = get_string('yes');
+        $mform->addElement('select', 'rescalegrades', get_string('modgraderescalegrades', 'grades'), $choices);
+        $mform->addHelpButton('rescalegrades', 'modgraderescalegrades', 'grades');
+        $mform->disabledIf('rescalegrades', 'gradetype', 'noteq', GRADE_TYPE_VALUE);
+
         $mform->addElement('text', 'grademax', get_string('grademax', 'grades'));
         $mform->addHelpButton('grademax', 'grademax', 'grades');
         $mform->disabledIf('grademax', 'gradetype', 'noteq', GRADE_TYPE_VALUE);
@@ -269,7 +294,39 @@ class edit_item_form extends moodleform {
                         // the idnumber of grade itemnumber 0 is synced with course_modules
                         $mform->hardFreeze('idnumber');
                     }
-                    //$mform->removeElement('calculation');
+
+                    // For external items we can not change the grade type, even if no grades exist, so if it is set to
+                    // scale, then remove the grademax and grademin fields from the form - no point displaying them.
+                    if ($grade_item->gradetype == GRADE_TYPE_SCALE) {
+                        $mform->removeElement('grademax');
+                        if ($mform->elementExists('grademin')) {
+                            $mform->removeElement('grademin');
+                        }
+                    } else { // Not using scale, so remove it.
+                        $mform->removeElement('scaleid');
+                    }
+
+                    // Always remove the rescale grades element if it's an external item.
+                    $mform->removeElement('rescalegrades');
+                } else if ($grade_item->has_grades()) {
+                    // Can't change the grade type or the scale if there are grades.
+                    $mform->hardFreeze('gradetype, scaleid');
+
+                    // If we are using scales then remove the unnecessary rescale and grade fields.
+                    if ($grade_item->gradetype == GRADE_TYPE_SCALE) {
+                        $mform->removeElement('rescalegrades');
+                        $mform->removeElement('grademax');
+                        if ($mform->elementExists('grademin')) {
+                            $mform->removeElement('grademin');
+                        }
+                    } else { // Remove the scale field.
+                        $mform->removeElement('scaleid');
+                        // Set the maximum grade to disabled unless a grade is chosen.
+                        $mform->disabledIf('grademax', 'rescalegrades', 'eq', '');
+                    }
+                } else {
+                    // Remove the rescale element if there are no grades.
+                    $mform->removeElement('rescalegrades');
                 }
             }
 
@@ -342,6 +399,7 @@ class edit_item_form extends moodleform {
             // all new items are manual, children of course category
             $mform->removeElement('plusfactor');
             $mform->removeElement('multfactor');
+            $mform->removeElement('rescalegrades');
         }
 
         // no parent header for course category
@@ -353,12 +411,15 @@ class edit_item_form extends moodleform {
 /// perform extra validation before submission
     function validation($data, $files) {
         global $COURSE;
+        $grade_item = false;
+        if ($data['id']) {
+            $grade_item = new grade_item(array('id' => $data['id'], 'courseid' => $data['courseid']));
+        }
 
         $errors = parent::validation($data, $files);
 
         if (array_key_exists('idnumber', $data)) {
-            if ($data['id']) {
-                $grade_item = new grade_item(array('id'=>$data['id'], 'courseid'=>$data['courseid']));
+            if ($grade_item) {
                 if ($grade_item->itemtype == 'mod') {
                     $cm = get_coursemodule_from_instance($grade_item->itemmodule, $grade_item->iteminstance, $grade_item->courseid);
                 } else {
@@ -386,6 +447,31 @@ class edit_item_form extends moodleform {
             }
         }
 
+        // We do not want the user to be able to change the grade type or scale for this item if grades exist.
+        if ($grade_item && $grade_item->has_grades()) {
+            // Check that grade type is set - should never not be set unless form has been modified.
+            if (!isset($data['gradetype'])) {
+                $errors['gradetype'] = get_string('modgradecantchangegradetype', 'grades');
+            } else if ($data['gradetype'] !== $grade_item->gradetype) { // Check if we are changing the grade type.
+                $errors['gradetype'] = get_string('modgradecantchangegradetype', 'grades');
+            } else if ($data['gradetype'] == GRADE_TYPE_SCALE) {
+                // Check if we are changing the scale - can't do this when grades exist.
+                if (isset($data['scaleid']) && ($data['scaleid'] !== $grade_item->scaleid)) {
+                    $errors['scaleid'] = get_string('modgradecantchangescale', 'grades');
+                }
+            }
+        }
+        if ($grade_item) {
+            if ($grade_item->gradetype == GRADE_TYPE_VALUE) {
+                if (grade_floats_different($data['grademin'], $grade_item->grademin) ||
+                    grade_floats_different($data['grademax'], $grade_item->grademax)) {
+                    if ($grade_item->has_grades() && empty($data['rescalegrades'])) {
+                        $errors['rescalegrades'] = get_string('mustchooserescaleyesorno', 'grades');
+                    }
+                }
+            }
+        }
+
         return $errors;
     }
 
index a40da47..68a632f 100644 (file)
@@ -31,30 +31,7 @@ defined('MOODLE_INTERNAL') || die();
  * @return bool true
  */
 function xmldb_gradingform_rubric_upgrade($oldversion) {
-    global $CFG, $DB, $OUTPUT;
-
-    $dbman = $DB->get_manager();
-
-    // Moodle v2.2.0 release upgrade line
-    // Put any upgrade step following this
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.7.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v2.8.0 release upgrade line.
     // Put any upgrade step following this.
index 09f1b04..c51e281 100644 (file)
@@ -425,6 +425,7 @@ Feature: We can use calculated grade totals
     And I set the following settings for grade item "Manual item 2":
       | Extra credit  | 0   |
       | Maximum grade | 200 |
+      | Rescale existing grades | No |
     And I give the grade "21.00" to the user "Student 1" for the grade item "Manual item 2"
     And I press "Save changes"
     And I give the grade "20.00" to the user "Student 1" for the grade item "Manual item 2"
@@ -435,6 +436,7 @@ Feature: We can use calculated grade totals
     And I set the following settings for grade item "Manual item 2":
       | Extra credit  | 0   |
       | Maximum grade | 100 |
+      | Rescale existing grades | No |
     And I give the grade "21.00" to the user "Student 1" for the grade item "Manual item 2"
     And I press "Save changes"
     And I give the grade "20.00" to the user "Student 1" for the grade item "Manual item 2"
index 145a39e..aa07eab 100644 (file)
@@ -145,6 +145,7 @@ Feature: Calculated grade items can be used in the gradebook
       | Course total | -                 | 112.50 | 0–150 | 75.00 %    | -                            |
     And I navigate to "Gradebook setup" node in "Grade administration > Setup"
     And I set the following settings for grade item "calc item":
+      | Rescale existing grades | No |
       | Maximum grade | 40 |
     And I follow "Grader report"
     And I give the grade "65.00" to the user "Student 2" for the grade item "grade item 1"
index cd8d791..87eeb8f 100644 (file)
@@ -146,6 +146,7 @@ Feature: Gradebook calculations for calculated grade items before the fix 201506
       | Course total | -                 | 112.50 | 0–200 | 56.25 %    | -                            |
     And I navigate to "Gradebook setup" node in "Grade administration > Setup"
     And I set the following settings for grade item "calc item":
+      | Rescale existing grades | No |
       | Maximum grade | 40 |
     And I follow "Grader report"
     And I give the grade "65.00" to the user "Student 2" for the grade item "grade item 1"
diff --git a/grade/tests/behat/grade_grade_minmax_change.feature b/grade/tests/behat/grade_grade_minmax_change.feature
new file mode 100644 (file)
index 0000000..edcc64a
--- /dev/null
@@ -0,0 +1,76 @@
+@core @core_grades
+Feature: We can change the maximum and minimum number of points for manual items with existing grades
+  In order to verify existing grades are modified as expected
+  As an teacher
+  I need to modify a grade item with exiting grades
+  I need to ensure existing grades are modified in an expected manner
+
+  Background:
+    Given the following "courses" exist:
+      | fullname | shortname | category | groupmode |
+      | Course 1 | C1 | 0 | 1 |
+    And the following "users" exist:
+      | username | firstname | lastname | email | idnumber |
+      | teacher1 | Teacher | 1 | teacher1@example.com | t1 |
+      | student1 | Student | 1 | student1@example.com | s1 |
+      | student2 | Student | 2 | student2@example.com | s2 |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+      | student1 | C1 | student |
+      | student2 | C1 | student |
+    And I log in as "teacher1"
+    And I am on site homepage
+    And I follow "Course 1"
+    And I navigate to "Grades" node in "Course administration"
+    And I navigate to "Gradebook setup" node in "Grade administration > Setup"
+    And I press "Add grade item"
+    And I set the following fields to these values:
+      | Item name | Manual item 1 |
+      | Minimum grade | 0 |
+      | Maximum grade | 100 |
+    And I press "Save changes"
+    And I navigate to "Course grade settings" node in "Grade administration > Setup"
+    And I set the field "Show weightings" to "Show"
+    And I set the field "Show contribution to course total" to "Show"
+    And I press "Save changes"
+
+  Scenario: Change maximum number of points on a graded item.
+    And I follow "Course 1"
+    And I navigate to "Grades" node in "Course administration"
+    And I turn editing mode on
+    And I give the grade "10.00" to the user "Student 1" for the grade item "Manual item 1"
+    And I give the grade "8.00" to the user "Student 2" for the grade item "Manual item 1"
+    And I press "Save changes"
+    When I navigate to "Gradebook setup" node in "Grade administration > Setup"
+    And I click on "Edit" "link" in the "Manual item 1" "table_row"
+    And I click on "Edit settings" "link" in the "Manual item 1" "table_row"
+    And I set the following fields to these values:
+      | Maximum grade | 10 |
+      | Rescale existing grades | No |
+    And I press "Save changes"
+    And I follow "User report"
+    And I select "Student 1" from the "Select all or one user" singleselect
+    Then the following should exist in the "user-grade" table:
+      | Grade item    | Calculated weight | Grade  | Contribution to course total |
+      | Manual item 1 | 100.00 %          | 10.00  | 100.00 %                     |
+    And I select "Student 2" from the "Select all or one user" singleselect
+    And the following should exist in the "user-grade" table:
+      | Grade item    | Calculated weight | Grade  | Contribution to course total |
+      | Manual item 1 | 100.00 %          | 8.00   | 80.00 %                      |
+    And I navigate to "Gradebook setup" node in "Grade administration > Setup"
+    And I click on "Edit" "link" in the "Manual item 1" "table_row"
+    And I click on "Edit settings" "link" in the "Manual item 1" "table_row"
+    And I set the following fields to these values:
+      | Maximum grade | 20 |
+      | Rescale existing grades | Yes |
+    And I press "Save changes"
+    And I follow "User report"
+    And I select "Student 1" from the "Select all or one user" singleselect
+    And the following should exist in the "user-grade" table:
+      | Grade item    | Calculated weight | Grade  | Contribution to course total |
+      | Manual item 1 | 100.00 %          | 20.00  | 100.00 %                     |
+    And I select "Student 2" from the "Select all or one user" singleselect
+    And the following should exist in the "user-grade" table:
+      | Grade item    | Calculated weight | Grade  | Contribution to course total |
+      | Manual item 1 | 100.00 %          | 16.00   | 80.00 %                     |
diff --git a/grade/tests/behat/grade_item_validation.feature b/grade/tests/behat/grade_item_validation.feature
new file mode 100644 (file)
index 0000000..541922f
--- /dev/null
@@ -0,0 +1,93 @@
+@core_grades
+Feature: Editing a grade item
+  In order to ensure validation is provided to the teacher
+  As a teacher
+  I need to know why I can not add/edit values on the grade item form
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email |
+      | student1 | Student | 1 | student1@example.com |
+      | teacher1 | Teacher | 1 | teacher1@example.com |
+    And the following "courses" exist:
+      | fullname | shortname | category | groupmode |
+      | Course 1 | C1 | 0 | 1 |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+      | student1 | C1 | student |
+    And I log in as "admin"
+    And I navigate to "Scales" node in "Site administration > Grades"
+    And I press "Add a new scale"
+    And I set the following fields to these values:
+      | Name  | ABCDEF |
+      | Scale | F,E,D,C,B,A |
+    And I press "Save changes"
+    And I press "Add a new scale"
+    And I set the following fields to these values:
+      | Name  | Letter scale |
+      | Scale | Disappointing, Good, Very good, Excellent |
+    And I press "Save changes"
+    And I am on site homepage
+    And I follow "Course 1"
+    And I navigate to "Gradebook setup" node in "Course administration"
+    And I press "Add grade item"
+    And I set the following fields to these values:
+      | Item name | MI 1 |
+    And I press "Save changes"
+
+  Scenario: Being able to change the grade type, scale and maximum grade for a manual grade item when there are no grades
+    Given I click on "Edit" "link" in the "MI 1" "table_row"
+    When I click on "Edit settings" "link" in the "MI 1" "table_row"
+    Then I should not see "Some grades have already been awarded, so the grade type"
+    And I set the field "Grade type" to "Scale"
+    And I press "Save changes"
+    And I should see "Scale must be selected"
+    And I set the field "Scale" to "ABCDEF"
+    And I press "Save changes"
+    And I should not see "You cannot change the type, as grades already exist for this item"
+    And I click on "Edit" "link" in the "MI 1" "table_row"
+    And I click on "Edit settings" "link" in the "MI 1" "table_row"
+    And I should not see "Some grades have already been awarded, so the grade type"
+    And I set the field "Scale" to "Letter scale"
+    And I press "Save changes"
+    And I should not see "You cannot change the scale, as grades already exist for this item"
+
+  Scenario: Attempting to change a manual item's grade type when grades already exist
+    Given I navigate to "Grader report" node in "Grade administration"
+    And I turn editing mode on
+    And I give the grade "20.00" to the user "Student 1" for the grade item "MI 1"
+    And I press "Save changes"
+    And I navigate to "Gradebook setup" node in "Grade administration > Setup"
+    And I click on "Edit" "link" in the "MI 1" "table_row"
+    When I click on "Edit settings" "link" in the "MI 1" "table_row"
+    Then I should see "Some grades have already been awarded, so the grade type cannot be changed. If you wish to change the maximum grade, you must first choose whether or not to rescale existing grades."
+    And "//div[contains(concat(' ', normalize-space(@class), ' '), 'fstatic') and contains(text(), 'Value')]" "xpath_element" should exist
+
+  Scenario: Attempting to change a manual item's scale when grades already exist
+    Given I click on "Edit" "link" in the "MI 1" "table_row"
+    And I click on "Edit settings" "link" in the "MI 1" "table_row"
+    And I set the field "Grade type" to "Scale"
+    And I set the field "Scale" to "ABCDEF"
+    And I press "Save changes"
+    And I navigate to "Grader report" node in "Grade administration"
+    And I turn editing mode on
+    And I give the grade "C" to the user "Student 1" for the grade item "MI 1"
+    And I press "Save changes"
+    And I navigate to "Gradebook setup" node in "Grade administration > Setup"
+    And I click on "Edit" "link" in the "MI 1" "table_row"
+    When I click on "Edit settings" "link" in the "MI 1" "table_row"
+    Then I should see "Some grades have already been awarded, so the grade type and scale cannot be changed."
+    And "//div[contains(concat(' ', normalize-space(@class), ' '), 'fstatic') and contains(text(), 'ABCDEF')]" "xpath_element" should exist
+
+  Scenario: Attempting to change a manual item's maximum grade when no rescaling option has been chosen
+    Given I navigate to "Grader report" node in "Grade administration"
+    And I turn editing mode on
+    And I give the grade "20.00" to the user "Student 1" for the grade item "MI 1"
+    And I press "Save changes"
+    And I navigate to "Gradebook setup" node in "Grade administration > Setup"
+    And I click on "Edit" "link" in the "MI 1" "table_row"
+    And I click on "Edit settings" "link" in the "MI 1" "table_row"
+    And I set the field "Maximum grade" to "50"
+    When I press "Save changes"
+    Then I should see "You must choose whether to rescale existing grades or not."
index cb1aa15..971461a 100644 (file)
@@ -100,11 +100,13 @@ Feature: We can choose what min or max grade to use when aggregating grades.
       | Course total | -                 | 60.00  | 0–300 | 20.00 %    | -                            |
     And I navigate to "Gradebook setup" node in "Grade administration > Setup"
     And I set the following settings for grade item "MI 1":
-      | Maximum grade          | 50.00 |
-      | Minimum grade          | 5.00 |
+      | Maximum grade           | 50.00 |
+      | Minimum grade           | 5.00  |
+      | Rescale existing grades | No    |
     And I set the following settings for grade item "MI 3":
-      | Maximum grade          | 50.00 |
-      | Minimum grade          | 5.00 |
+      | Maximum grade           | 50.00 |
+      | Minimum grade           | 5.00  |
+      | Rescale existing grades | No    |
     And I follow "User report"
     And I select "Student 1" from the "Select all or one user" singleselect
     And the following should exist in the "user-grade" table:
@@ -129,6 +131,7 @@ Feature: We can choose what min or max grade to use when aggregating grades.
     And I navigate to "Gradebook setup" node in "Grade administration > Setup"
     And I set the following settings for grade item "MI 5":
       | Maximum grade          | 200.00 |
+      | Rescale existing grades | No    |
     And I follow "User report"
     And I select "Student 1" from the "Select all or one user" singleselect
     And the following should exist in the "user-grade" table:
index 5662264..1070302 100644 (file)
@@ -29,13 +29,13 @@ Feature: We can change the grading type and maximum grade point values
     And I expand all fieldsets
     And I set the field "grade[modgrade_type]" to "Point"
     Then the "Scale" "select" should be disabled
-    And the "Maximum points" "field" should be enabled
+    And the "Maximum grade" "field" should be enabled
     And I set the field "grade[modgrade_type]" to "Scale"
-    And the "Maximum points" "field" should be disabled
+    And the "Maximum grade" "field" should be disabled
     Then the "Scale" "select" should be enabled
     And I set the field "grade[modgrade_type]" to "None"
     Then the "Scale" "select" should be disabled
-    And the "Maximum points" "field" should be disabled
+    And the "Maximum grade" "field" should be disabled
     And I press "Save and return to course"
 
   @javascript
@@ -61,7 +61,7 @@ Feature: We can change the grading type and maximum grade point values
     And I press "Save and display"
     And I follow "Edit settings"
     Then the field "grade[modgrade_scale]" matches value "Separate and Connected ways of knowing"
-    And the "Maximum points" "field" should be disabled
+    And the "Maximum grade" "field" should be disabled
     And I press "Save and return to course"
 
   @javascript
@@ -73,7 +73,7 @@ Feature: We can change the grading type and maximum grade point values
     And I press "Save and display"
     And I follow "Edit settings"
     And the "Scale" "select" should be disabled
-    And the "Maximum points" "field" should be disabled
+    And the "Maximum grade" "field" should be disabled
     And I press "Save and return to course"
 
   @javascript
@@ -84,7 +84,7 @@ Feature: We can change the grading type and maximum grade point values
     And I set the field "grade[modgrade_type]" to "Point"
     And I set the field "grade[modgrade_point]" to "20000"
     And I press "Save and display"
-    Then I should see "Invalid Grade Value. This must be an integer between 1 and 900"
+    Then I should see "Invalid grade value. This must be an integer between 1 and 900"
     And I press "Cancel"
 
   @javascript
@@ -104,5 +104,5 @@ Feature: We can change the grading type and maximum grade point values
     And I follow "Test Assignment 1"
     And I follow "Edit settings"
     And I press "Save and display"
-    Then I should see "Invalid Grade Value. This must be an integer between 1 and 100"
+    Then I should see "Invalid grade value. This must be an integer between 1 and 100"
     And I press "Cancel"
index 2fec297..2c74e52 100644 (file)
@@ -37,7 +37,7 @@ Feature: Control the aggregation of the scales
     And I log out
 
   @javascript
-  Scenario Outline: Scales can be exluded from aggregation
+  Scenario Outline: Scales can be excluded from aggregation
     Given I log in as "teacher1"
     And I follow "Course 1"
     And I navigate to "Grades" node in "Course administration"
index 4cb19ce..ada31e6 100644 (file)
@@ -27,3 +27,4 @@ othertags,core_tag
 tagtype,core_tag
 manageofficialtags,core_tag
 settypeofficial,core_tag
+filetoolarge,core
index a5248d1..d34cda2 100644 (file)
@@ -123,6 +123,7 @@ $string['cannotreadfile'] = 'Cannot read file ({$a})';
 $string['cannotreadtmpfile'] = 'Error reading temporary file';
 $string['cannotreaduploadfile'] = 'Could not read uploaded file';
 $string['cannotremovefrommeta'] = 'Could not remove the selected course from this meta course!';
+$string['cannotreprocessgrades'] = 'Could not reprocess grades for this activity {$a}';
 $string['cannotresetguestpwd'] = 'You cannot reset the guest password';
 $string['cannotresetmail'] = 'Error resetting password and mailing you';
 $string['cannotresetthisrole'] = 'Cannot reset this role';
index 6bbb927..4089b5e 100644 (file)
@@ -472,11 +472,23 @@ $string['minimum_show_help'] = 'Minimum grade is used in calculating grades and
 $string['missingitemtypeoreid'] = 'Array key (itemtype or eid) missing from 2nd param of grade_edit_tree_column_select::get_item_cell($item, $params)';
 $string['missingscale'] = 'Scale must be selected';
 $string['mode'] = 'Mode';
-$string['modgradeerrorbadpoint'] = 'Invalid Grade Value. This must be an integer between 1 and {$a}';
-$string['modgradeerrorbadscale'] = 'Invalid scale selected. Please make sure you select a scale from the selections below.';
 $string['modgrade'] = 'Grade';
 $string['modgrade_help'] = 'Select the type of grading used for this activity. If "scale" is chosen, you can then choose the scale from the "scale" dropdown. If using "point" grading, you can then enter the maximum grade available for this activity.';
-$string['modgrademaxgrade'] = 'Maximum points';
+$string['modgradecantchangegradetype'] = 'You cannot change the type, as grades already exist for this item.';
+$string['modgradecantchangegradetypemsg'] = 'Some grades have already been awarded, so the grade type cannot be changed. If you wish to change the maximum grade, you must first choose whether or not to rescale existing grades.';
+$string['modgradecantchangegradetyporscalemsg'] = 'Some grades have already been awarded, so the grade type and scale cannot be changed.';
+$string['modgradecantchangescale'] = 'You cannot change the scale, as grades already exist for this item.';
+$string['modgradecantchangeratingmaxgrade'] = 'You cannot change the maximum grade when grades already exist for an activity with ratings.';
+$string['modgradedonotmodify'] = 'Do not modify existing grades';
+$string['modgradeerrorbadpoint'] = 'Invalid grade value. This must be an integer between 1 and {$a}';
+$string['modgradeerrorbadscale'] = 'Invalid scale selected. Please make sure you select a scale from the selections below.';
+$string['modgrademaxgrade'] = 'Maximum grade';
+$string['modgraderescalegrades'] = 'Rescale existing grades';
+$string['modgraderescalegrades_help'] = 'When changing the maximum grades on a gradebook item you need to specify whether or not this will cause existing percentage grades to change as well.
+
+If this is set to \'Yes\', any existing grades will be rescaled so that the percentage grade remains the same.
+
+For example, if this option is set to \'Yes\', changing the maximum grade on an item from 10 to 20 would cause a grade of 6/10 (60%) to be rescaled to 12/20 (60%). With this option set to \'No\', the grade would change from 6/10 (60%) to 6/20 (30%), requiring manual adjustment of the grade items to ensure correct scores.';
 $string['modgradetype'] = 'Type';
 $string['modgradetypenone'] = 'None';
 $string['modgradetypepoint'] = 'Point';
@@ -491,6 +503,7 @@ $string['mygrades'] = 'User menu grades link';
 $string['mygrades_desc'] = 'This setting allows for the option of linking to an external gradebook from the user menu.';
 $string['mypreferences'] = 'My preferences';
 $string['myreportpreferences'] = 'My report preferences';
+$string['mustchooserescaleyesorno'] = 'You must choose whether to rescale existing grades or not.';
 $string['navmethod'] = 'Navigation method';
 $string['neverdeletehistory'] = 'Never delete history';
 $string['newcategory'] = 'New category';
index b126d79..5eac596 100644 (file)
@@ -775,7 +775,6 @@ $string['feedback'] = 'Feedback';
 $string['file'] = 'File';
 $string['fileexists'] = 'There is already a file called {$a}';
 $string['filemissing'] = '{$a} is missing';
-$string['filetoolarge'] = 'is too large to upload';
 $string['files'] = 'Files';
 $string['filesanduploads'] = 'Files and uploads';
 $string['filesfolders'] = 'Files/folders';
@@ -1226,6 +1225,7 @@ $string['myhome'] = 'Dashboard';
 $string['mymoodledashboard'] = 'My Moodle dashboard';
 $string['myprofile'] = 'My profile';
 $string['name'] = 'Name';
+$string['namedfiletoolarge'] = 'The file \'{$a->filename}\' is too large and cannot be uploaded';
 $string['nameforlink'] = 'What do you want to call this link?';
 $string['nameforpage'] = 'Name';
 $string['navigation'] = 'Navigation';
@@ -2052,3 +2052,6 @@ $string['yourself'] = 'yourself';
 $string['yourteacher'] = 'your {$a}';
 $string['yourwordforx'] = 'Your word for \'{$a}\'';
 $string['zippingbackup'] = 'Zipping backup';
+
+// Deprecated since Moodle 3.1.
+$string['filetoolarge'] = 'is too large to upload';
index c4ea1b4..766167f 100644 (file)
@@ -236,8 +236,6 @@ $string['novirtualquestiontype'] = 'No virtual question type for question type {
 $string['numqas'] = 'No. question attempts';
 $string['numquestions'] = 'No. questions';
 $string['numquestionsandhidden'] = '{$a->numquestions} (+{$a->numhidden} hidden)';
-$string['orphanedquestionscategory'] = 'Questions saved from deleted categories';
-$string['orphanedquestionscategoryinfo'] = 'Occasionally, typically due to old software bugs, questions can remain in the database even though the corresponding question category has been deleted. Of course, this should not happen, it has happened in the past on this site. This category has been created automatically, and the orphaned questions moved here so that you can manage them. Note that any images or media files used by these questions have probably been lost.';
 $string['page-question-x'] = 'Any question page';
 $string['page-question-edit'] = 'Question editing page';
 $string['page-question-category'] = 'Question category page';
index 60e4628..a0e32a3 100644 (file)
@@ -111,7 +111,7 @@ $string['error'] = 'An unknown error occurred!';
 $string['errordoublereference'] = 'Unable to overwrite file with a shortcut/alias because shortcuts to this file already exist.';
 $string['errornotyourfile'] = 'You cannot pick file which is not added by your';
 $string['erroruniquename'] = 'Repository instance name should be unique';
-$string['errorpostmaxsize'] = 'The uploaded file may exceed the post_max_size directive in php.ini.';
+$string['errorpostmaxsize'] = 'The file you tried to upload is too large for the server to process.';
 $string['errorwhilecommunicatingwith'] = 'Error while communicating with the repository \'{$a}\'.';
 $string['errorwhiledownload'] = 'An error occurred while downloading the file: {$a}';
 $string['existingrepository'] = 'This repository already exists';
diff --git a/lib/classes/output/url_rewriter.php b/lib/classes/output/url_rewriter.php
new file mode 100644 (file)
index 0000000..435bd55
--- /dev/null
@@ -0,0 +1,58 @@
+<?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/>.
+
+/**
+ * URL rewriter base.
+ *
+ * @package    core
+ * @author     Brendan Heywood <brendan@catalyst-au.net>
+ * @copyright  Catalyst IT
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace core\output;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * URL rewriter interface
+ *
+ * @package    core
+ * @author     Brendan Heywood <brendan@catalyst-au.net>
+ * @copyright  Catalyst IT
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+interface url_rewriter {
+
+    /**
+     * Rewrite moodle_urls into another form.
+     *
+     * @param moodle_url $url a url to potentially rewrite
+     * @return moodle_url Returns a new, or the original, moodle_url;
+     */
+    public static function url_rewrite(\moodle_url $url);
+
+    /**
+     * Gives a url rewriting plugin a chance to rewrite the current page url
+     * avoiding redirects and improving performance.
+     *
+     * @return void
+     */
+    public static function html_head_setup();
+
+
+}
+
index c8cda52..b29a3f8 100644 (file)
       <INDEXES>
         <INDEX NAME="action" UNIQUE="false" FIELDS="action" COMMENT="insert/update/delete"/>
         <INDEX NAME="timemodified" UNIQUE="false" FIELDS="timemodified"/>
+        <INDEX NAME="userid-itemid-timemodified" UNIQUE="false" FIELDS="userid, itemid, timemodified" COMMENT="Improve history searching"/>
       </INDEXES>
     </TABLE>
     <TABLE NAME="grade_import_newitem" COMMENT="temporary table for storing new grade_item names from grade import">
index 7e6ca5c..7e04aed 100644 (file)
@@ -85,3557 +85,22 @@ defined('MOODLE_INTERNAL') || die();
  * @return bool always true
  */
 function xmldb_main_upgrade($oldversion) {
-    global $CFG, $USER, $DB, $OUTPUT, $SITE, $COURSE;
+    global $CFG, $DB;
 
-    require_once($CFG->libdir.'/db/upgradelib.php'); // Core Upgrade-related functions
+    require_once($CFG->libdir.'/db/upgradelib.php'); // Core Upgrade-related functions.
 
-    $dbman = $DB->get_manager(); // loads ddl manager and xmldb classes
+    $dbman = $DB->get_manager(); // Loads ddl manager and xmldb classes.
 
-    if ($oldversion < 2011120500) {
-        // just in case somebody hacks upgrade scripts or env, we really can not continue
-        echo("You need to upgrade to 2.2.x first!\n");
+    // Always keep this upgrade step with version being the minimum
+    // allowed version to upgrade from (v2.7.0 right now).
+    if ($oldversion < 2014051200) {
+        // Just in case somebody hacks upgrade scripts or env, we really can not continue.
+        echo("You need to upgrade to 2.7.x or higher first!\n");
         exit(1);
-        // Note this savepoint is 100% unreachable, but needed to pass the upgrade checks
-        upgrade_main_savepoint(true, 2011120500);
+        // Note this savepoint is 100% unreachable, but needed to pass the upgrade checks.
+        upgrade_main_savepoint(true, 2014051200);
     }
 
-    // Moodle v2.2.0 release upgrade line
-    // Put any upgrade step following this
-
-    if ($oldversion < 2011120500.02) {
-
-        upgrade_set_timeout(60*20); // This may take a while
-        // MDL-28180. Some missing restrictions in certain backup & restore operations
-        // were causing incorrect duplicates in the course_completion_aggr_methd table.
-        // This upgrade step takes rid of them.
-        $sql = 'SELECT course, criteriatype, MIN(id) AS minid
-                  FROM {course_completion_aggr_methd}
-              GROUP BY course, criteriatype
-                HAVING COUNT(*) > 1';
-        $duprs = $DB->get_recordset_sql($sql);
-        foreach ($duprs as $duprec) {
-            // We need to handle NULLs in criteriatype diferently
-            if (is_null($duprec->criteriatype)) {
-                $where = 'course = ? AND criteriatype IS NULL AND id > ?';
-                $params = array($duprec->course, $duprec->minid);
-            } else {
-                $where = 'course = ? AND criteriatype = ? AND id > ?';
-                $params = array($duprec->course, $duprec->criteriatype, $duprec->minid);
-            }
-            $DB->delete_records_select('course_completion_aggr_methd', $where, $params);
-        }
-        $duprs->close();
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2011120500.02);
-    }
-
-    if ($oldversion < 2011120500.03) {
-
-        // Changing precision of field value on table user_preferences to (1333)
-        $table = new xmldb_table('user_preferences');
-        $field = new xmldb_field('value', XMLDB_TYPE_CHAR, '1333', null, XMLDB_NOTNULL, null, null, 'name');
-
-        // Launch change of precision for field value
-        $dbman->change_field_precision($table, $field);
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2011120500.03);
-    }
-
-    if ($oldversion < 2012020200.03) {
-
-        // Define index rolecontext (not unique) to be added to role_assignments
-        $table = new xmldb_table('role_assignments');
-        $index = new xmldb_index('rolecontext', XMLDB_INDEX_NOTUNIQUE, array('roleid', 'contextid'));
-
-        // Conditionally launch add index rolecontext
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        // Define index usercontextrole (not unique) to be added to role_assignments
-        $index = new xmldb_index('usercontextrole', XMLDB_INDEX_NOTUNIQUE, array('userid', 'contextid', 'roleid'));
-
-        // Conditionally launch add index usercontextrole
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012020200.03);
-    }
-
-    if ($oldversion < 2012020200.06) {
-        // Previously we always allowed users to override their email address via the messaging system
-        // We have now added a setting to allow admins to turn this this ability on and off
-        // While this setting defaults to 0 (off) we're setting it to 1 (on) to maintain the behaviour for upgrading sites
-        set_config('messagingallowemailoverride', 1);
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012020200.06);
-    }
-
-    if ($oldversion < 2012021700.01) {
-        // Changing precision of field uniquehash on table post to 255
-        $table = new xmldb_table('post');
-        $field = new xmldb_field('uniquehash', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'content');
-
-        // Launch change of precision for field uniquehash
-        $dbman->change_field_precision($table, $field);
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012021700.01);
-    }
-
-    if ($oldversion < 2012021700.02) {
-        // Somewhere before 1.9 summary and content column in post table were not null. In 1.9+
-        // not null became false.
-        $columns = $DB->get_columns('post');
-
-        // Fix discrepancies in summary field after upgrade from 1.9
-        if (array_key_exists('summary', $columns) && $columns['summary']->not_null != false) {
-            $table = new xmldb_table('post');
-            $summaryfield = new xmldb_field('summary', XMLDB_TYPE_TEXT, 'big', null, null, null, null, 'subject');
-
-            if ($dbman->field_exists($table, $summaryfield)) {
-                $dbman->change_field_notnull($table, $summaryfield);
-            }
-
-        }
-
-        // Fix discrepancies in content field after upgrade from 1.9
-        if (array_key_exists('content', $columns) && $columns['content']->not_null != false) {
-            $table = new xmldb_table('post');
-            $contentfield = new xmldb_field('content', XMLDB_TYPE_TEXT, 'big', null, null, null, null, 'summary');
-
-            if ($dbman->field_exists($table, $contentfield)) {
-                $dbman->change_field_notnull($table, $contentfield);
-            }
-
-        }
-
-        upgrade_main_savepoint(true, 2012021700.02);
-    }
-
-    // The ability to backup user (private) files is out completely - MDL-29248
-    if ($oldversion < 2012030100.01) {
-        unset_config('backup_general_user_files', 'backup');
-        unset_config('backup_general_user_files_locked', 'backup');
-        unset_config('backup_auto_user_files', 'backup');
-
-        upgrade_main_savepoint(true, 2012030100.01);
-    }
-
-    if ($oldversion < 2012030900.01) {
-        // Migrate all numbers to signed & all texts and binaries to big size.
-        // It should be safe to interrupt this and continue later.
-        upgrade_mysql_fix_unsigned_and_lob_columns();
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012030900.01);
-    }
-
-    if ($oldversion < 2012031500.01) {
-        // Upgrade old course_allowed_modules data to be permission overrides.
-        if ($CFG->restrictmodulesfor === 'all') {
-            $courses = $DB->get_records_menu('course', array(), 'id', 'id, 1');
-        } else if ($CFG->restrictmodulesfor === 'requested') {
-            $courses = $DB->get_records_menu('course', array('restrictmodules' => 1), 'id', 'id, 1');
-        } else {
-            $courses = array();
-        }
-
-        if (!$dbman->table_exists('course_allowed_modules')) {
-            // Upgrade must already have been run on this server. This might happen,
-            // for example, during development of these changes.
-            $courses = array();
-        }
-
-        $modidtoname = $DB->get_records_menu('modules', array(), 'id', 'id, name');
-
-        $coursecount = count($courses);
-        if ($coursecount) {
-            $pbar = new progress_bar('allowedmods', 500, true);
-            $transaction = $DB->start_delegated_transaction();
-        }
-
-        $i = 0;
-        foreach ($courses as $courseid => $notused) {
-            $i += 1;
-            upgrade_set_timeout(60); // 1 minute per course should be fine.
-
-            $allowedmoduleids = $DB->get_records_menu('course_allowed_modules',
-            array('course' => $courseid), 'module', 'module, 1');
-            if (empty($allowedmoduleids)) {
-                // This seems to be the best match for backwards compatibility,
-                // not necessarily with the old code in course_allowed_module function,
-                // but with the code that used to be in the coures settings form.
-                $allowedmoduleids = explode(',', $CFG->defaultallowedmodules);
-                $allowedmoduleids = array_combine($allowedmoduleids, $allowedmoduleids);
-            }
-
-            $context = context_course::instance($courseid);
-
-            list($roleids) = get_roles_with_cap_in_context($context, 'moodle/course:manageactivities');
-            list($managerroleids) = get_roles_with_cap_in_context($context, 'moodle/site:config');
-            foreach ($managerroleids as $roleid) {
-                unset($roleids[$roleid]);
-            }
-
-            foreach ($modidtoname as $modid => $modname) {
-                if (isset($allowedmoduleids[$modid])) {
-                    // Module is allowed, no worries.
-                    continue;
-                }
-
-                $capability = 'mod/' . $modname . ':addinstance';
-                foreach ($roleids as $roleid) {
-                    assign_capability($capability, CAP_PREVENT, $roleid, $context);
-                }
-            }
-
-            $pbar->update($i, $coursecount, "Upgrading legacy course_allowed_modules data - $i/$coursecount.");
-        }
-
-        if ($coursecount) {
-            $transaction->allow_commit();
-        }
-
-        upgrade_main_savepoint(true, 2012031500.01);
-    }
-
-    if ($oldversion < 2012031500.02) {
-
-        // Define field restrictmodules to be dropped from course
-        $table = new xmldb_table('course');
-        $field = new xmldb_field('restrictmodules');
-
-        // Conditionally launch drop field requested
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        // Since structure of 'course' table has changed we need to re-read $SITE from DB.
-        $SITE = $DB->get_record('course', array('id' => $SITE->id));
-        $COURSE = clone($SITE);
-
-        upgrade_main_savepoint(true, 2012031500.02);
-    }
-
-    if ($oldversion < 2012031500.03) {
-
-        // Define table course_allowed_modules to be dropped
-        $table = new xmldb_table('course_allowed_modules');
-
-        // Conditionally launch drop table for course_allowed_modules
-        if ($dbman->table_exists($table)) {
-            $dbman->drop_table($table);
-        }
-
-        upgrade_main_savepoint(true, 2012031500.03);
-    }
-
-    if ($oldversion < 2012031500.04) {
-        // Clean up the old admin settings.
-        unset_config('restrictmodulesfor');
-        unset_config('restrictbydefault');
-        unset_config('defaultallowedmodules');
-
-        upgrade_main_savepoint(true, 2012031500.04);
-    }
-
-    if ($oldversion < 2012032300.02) {
-        // Migrate the old admin debug setting.
-        if ($CFG->debug == 38911) {
-            set_config('debug', DEBUG_DEVELOPER);
-        } else if ($CFG->debug == 6143) {
-            set_config('debug', DEBUG_ALL);
-        }
-        upgrade_main_savepoint(true, 2012032300.02);
-    }
-
-    if ($oldversion < 2012042300.00) {
-        // This change makes the course_section index unique.
-
-        // Look for any duplicate course_sections entries. There should not be
-        // any but on some busy systems we found a few, maybe due to previous
-        // bugs.
-        $transaction = $DB->start_delegated_transaction();
-        $rs = $DB->get_recordset_sql('
-                SELECT DISTINCT
-                    cs.id, cs.course
-                FROM
-                    {course_sections} cs
-                    INNER JOIN {course_sections} older
-                        ON cs.course = older.course AND cs.section = older.section
-                        AND older.id < cs.id');
-        foreach ($rs as $rec) {
-            $DB->delete_records('course_sections', array('id' => $rec->id));
-            // We can't use rebuild_course_cache() here because introducing sectioncache later
-            // so reset modinfo manually.
-            $DB->set_field('course', 'modinfo', null, array('id' => $rec->course));
-        }
-        $rs->close();
-        $transaction->allow_commit();
-
-        // XMLDB does not allow changing index uniqueness - instead we must drop
-        // index then add it again.
-        // MDL-46182: The query to make the index unique uses the index,
-        // so the removal of the non-unique version needs to happen after any
-        // data changes have been made.
-        $table = new xmldb_table('course_sections');
-        $index = new xmldb_index('course_section', XMLDB_INDEX_NOTUNIQUE, array('course', 'section'));
-
-        // Conditionally launch drop index course_section.
-        if ($dbman->index_exists($table, $index)) {
-            $dbman->drop_index($table, $index);
-        }
-
-        // Define index course_section (unique) to be added to course_sections
-        $index = new xmldb_index('course_section', XMLDB_INDEX_UNIQUE, array('course', 'section'));
-
-        // Conditionally launch add index course_section
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012042300.00);
-    }
-
-    if ($oldversion < 2012042300.02) {
-        require_once($CFG->dirroot.'/completion/criteria/completion_criteria.php');
-        // Delete orphaned criteria which were left when modules were removed
-        if ($DB->get_dbfamily() === 'mysql') {
-            $sql = "DELETE cc FROM {course_completion_criteria} cc
-                    LEFT JOIN {course_modules} cm ON cm.id = cc.moduleinstance
-                    WHERE cm.id IS NULL AND cc.criteriatype = ".COMPLETION_CRITERIA_TYPE_ACTIVITY;
-        } else {
-            $sql = "DELETE FROM {course_completion_criteria}
-                    WHERE NOT EXISTS (
-                        SELECT 'x' FROM {course_modules}
-                        WHERE {course_modules}.id = {course_completion_criteria}.moduleinstance)
-                    AND {course_completion_criteria}.criteriatype = ".COMPLETION_CRITERIA_TYPE_ACTIVITY;
-        }
-        $DB->execute($sql);
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012042300.02);
-    }
-
-    if ($oldversion < 2012050300.01) {
-        // Make sure deleted users do not have picture flag.
-        $DB->set_field('user', 'picture', 0, array('deleted'=>1, 'picture'=>1));
-        upgrade_main_savepoint(true, 2012050300.01);
-    }
-
-    if ($oldversion < 2012050300.02) {
-
-        // Changing precision of field picture on table user to (10)
-        $table = new xmldb_table('user');
-        $field = new xmldb_field('picture', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'secret');
-
-        // Launch change of precision for field picture
-        $dbman->change_field_precision($table, $field);
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012050300.02);
-    }
-
-    if ($oldversion < 2012050300.03) {
-
-        // Define field coursedisplay to be added to course
-        $table = new xmldb_table('course');
-        $field = new xmldb_field('coursedisplay', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0', 'completionnotify');
-
-        // Conditionally launch add field coursedisplay
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Since structure of 'course' table has changed we need to re-read $SITE from DB.
-        $SITE = $DB->get_record('course', array('id' => $SITE->id));
-        $COURSE = clone($SITE);
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012050300.03);
-    }
-
-    if ($oldversion < 2012050300.04) {
-
-        // Define table course_display to be dropped
-        $table = new xmldb_table('course_display');
-
-        // Conditionally launch drop table for course_display
-        if ($dbman->table_exists($table)) {
-            $dbman->drop_table($table);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012050300.04);
-    }
-
-    if ($oldversion < 2012050300.05) {
-
-        // Clean up removed admin setting.
-        unset_config('navlinkcoursesections');
-
-        upgrade_main_savepoint(true, 2012050300.05);
-    }
-
-    if ($oldversion < 2012050400.01) {
-
-        // Define index sortorder (not unique) to be added to course
-        $table = new xmldb_table('course');
-        $index = new xmldb_index('sortorder', XMLDB_INDEX_NOTUNIQUE, array('sortorder'));
-
-        // Conditionally launch add index sortorder
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012050400.01);
-    }
-
-    if ($oldversion < 2012050400.02) {
-
-        // Clean up removed admin setting.
-        unset_config('enablecourseajax');
-
-        upgrade_main_savepoint(true, 2012050400.02);
-    }
-
-    if ($oldversion < 2012051100.01) {
-
-        // Define field idnumber to be added to groups
-        $table = new xmldb_table('groups');
-        $field = new xmldb_field('idnumber', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null, 'courseid');
-        $index = new xmldb_index('idnumber', XMLDB_INDEX_NOTUNIQUE, array('idnumber'));
-
-        // Conditionally launch add field idnumber
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Conditionally launch add index idnumber
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        // Define field idnumber to be added to groupings
-        $table = new xmldb_table('groupings');
-        $field = new xmldb_field('idnumber', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null, 'name');
-        $index = new xmldb_index('idnumber', XMLDB_INDEX_NOTUNIQUE, array('idnumber'));
-
-        // Conditionally launch add field idnumber
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Conditionally launch add index idnumber
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012051100.01);
-    }
-
-    if ($oldversion < 2012051100.03) {
-
-        // Amend course table to add sectioncache cache
-        $table = new xmldb_table('course');
-        $field = new xmldb_field('sectioncache', XMLDB_TYPE_TEXT, null, null, null, null, null, 'showgrades');
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Amend course_sections to add date, time and groupingid availability
-        // conditions and a setting about whether to show them
-        $table = new xmldb_table('course_sections');
-        $field = new xmldb_field('availablefrom', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'visible');
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-        $field = new xmldb_field('availableuntil', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'availablefrom');
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-        $field = new xmldb_field('showavailability', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'availableuntil');
-        // Conditionally launch add field showavailability
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-        $field = new xmldb_field('groupingid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'showavailability');
-        // Conditionally launch add field groupingid
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Since structure of 'course' table has changed we need to re-read $SITE from DB.
-        $SITE = $DB->get_record('course', array('id' => $SITE->id));
-        $COURSE = clone($SITE);
-
-        // Add course_sections_availability to add completion & grade availability conditions
-        $table = new xmldb_table('course_sections_availability');
-
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
-        $table->add_field('coursesectionid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('sourcecmid', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
-        $table->add_field('requiredcompletion', XMLDB_TYPE_INTEGER, '1', null, null, null, null);
-        $table->add_field('gradeitemid', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
-        $table->add_field('grademin', XMLDB_TYPE_NUMBER, '10, 5', null, null, null, null);
-        $table->add_field('grademax', XMLDB_TYPE_NUMBER, '10, 5', null, null, null, null);
-
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('coursesectionid', XMLDB_KEY_FOREIGN, array('coursesectionid'), 'course_sections', array('id'));
-        $table->add_key('sourcecmid', XMLDB_KEY_FOREIGN, array('sourcecmid'), 'course_modules', array('id'));
-        $table->add_key('gradeitemid', XMLDB_KEY_FOREIGN, array('gradeitemid'), 'grade_items', array('id'));
-
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012051100.03);
-    }
-
-    if ($oldversion < 2012052100.00) {
-
-        // Define field referencefileid to be added to files.
-        $table = new xmldb_table('files');
-
-        // Define field referencefileid to be added to files.
-        $field = new xmldb_field('referencefileid', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'sortorder');
-
-        // Conditionally launch add field referencefileid.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Define field referencelastsync to be added to files.
-        $field = new xmldb_field('referencelastsync', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'referencefileid');
-
-        // Conditionally launch add field referencelastsync.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Define field referencelifetime to be added to files.
-        $field = new xmldb_field('referencelifetime', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'referencelastsync');
-
-        // Conditionally launch add field referencelifetime.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        $key = new xmldb_key('referencefileid', XMLDB_KEY_FOREIGN, array('referencefileid'), 'files_reference', array('id'));
-        // Launch add key referencefileid
-        $dbman->add_key($table, $key);
-
-        // Define table files_reference to be created.
-        $table = new xmldb_table('files_reference');
-
-        // Adding fields to table files_reference.
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
-        $table->add_field('repositoryid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('lastsync', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
-        $table->add_field('lifetime', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
-        $table->add_field('reference', XMLDB_TYPE_TEXT, null, null, null, null, null);
-
-        // Adding keys to table files_reference.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('repositoryid', XMLDB_KEY_FOREIGN, array('repositoryid'), 'repository_instances', array('id'));
-
-        // Conditionally launch create table for files_reference
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012052100.00);
-    }
-
-    if ($oldversion < 2012052500.03) { // fix invalid course_completion_records MDL-27368
-        //first get all instances of duplicate records
-        $sql = 'SELECT userid, course FROM {course_completions} WHERE (deleted IS NULL OR deleted <> 1) GROUP BY userid, course HAVING (count(id) > 1)';
-        $duplicates = $DB->get_recordset_sql($sql, array());
-
-        foreach ($duplicates as $duplicate) {
-            $pointer = 0;
-            //now get all the records for this user/course
-            $sql = 'userid = ? AND course = ? AND (deleted IS NULL OR deleted <> 1)';
-            $completions = $DB->get_records_select('course_completions', $sql,
-                array($duplicate->userid, $duplicate->course), 'timecompleted DESC, timestarted DESC');
-            $needsupdate = false;
-            $origcompletion = null;
-            foreach ($completions as $completion) {
-                $pointer++;
-                if ($pointer === 1) { //keep 1st record but delete all others.
-                    $origcompletion = $completion;
-                } else {
-                    //we need to keep the "oldest" of all these fields as the valid completion record.
-                    $fieldstocheck = array('timecompleted', 'timestarted', 'timeenrolled');
-                    foreach ($fieldstocheck as $f) {
-                        if ($origcompletion->$f > $completion->$f) {
-                            $origcompletion->$f = $completion->$f;
-                            $needsupdate = true;
-                        }
-                    }
-                    $DB->delete_records('course_completions', array('id'=>$completion->id));
-                }
-            }
-            if ($needsupdate) {
-                $DB->update_record('course_completions', $origcompletion);
-            }
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012052500.03);
-    }
-
-    if ($oldversion < 2012052900.00) {
-        // Clean up all duplicate records in the course_completions table in preparation
-        // for adding a new index there.
-        upgrade_course_completion_remove_duplicates(
-            'course_completions',
-            array('userid', 'course'),
-            array('timecompleted', 'timestarted', 'timeenrolled')
-        );
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012052900.00);
-    }
-
-    if ($oldversion < 2012052900.01) {
-        // Add indexes to prevent new duplicates in the course_completions table.
-        // Define index useridcourse (unique) to be added to course_completions
-        $table = new xmldb_table('course_completions');
-        $index = new xmldb_index('useridcourse', XMLDB_INDEX_UNIQUE, array('userid', 'course'));
-
-        // Conditionally launch add index useridcourse
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012052900.01);
-    }
-
-    if ($oldversion < 2012052900.02) {
-        // Clean up all duplicate records in the course_completion_crit_compl table in preparation
-        // for adding a new index there.
-        upgrade_course_completion_remove_duplicates(
-            'course_completion_crit_compl',
-            array('userid', 'course', 'criteriaid'),
-            array('timecompleted')
-        );
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012052900.02);
-    }
-
-    if ($oldversion < 2012052900.03) {
-        // Add indexes to prevent new duplicates in the course_completion_crit_compl table.
-        // Define index useridcoursecriteraid (unique) to be added to course_completion_crit_compl
-        $table = new xmldb_table('course_completion_crit_compl');
-        $index = new xmldb_index('useridcoursecriteraid', XMLDB_INDEX_UNIQUE, array('userid', 'course', 'criteriaid'));
-
-        // Conditionally launch add index useridcoursecriteraid
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012052900.03);
-    }
-
-    if ($oldversion < 2012052900.04) {
-        // Clean up all duplicate records in the course_completion_aggr_methd table in preparation
-        // for adding a new index there.
-        upgrade_course_completion_remove_duplicates(
-            'course_completion_aggr_methd',
-            array('course', 'criteriatype')
-        );
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012052900.04);
-    }
-
-    if ($oldversion < 2012052900.05) {
-        // Add indexes to prevent new duplicates in the course_completion_aggr_methd table.
-        // Define index coursecriteratype (unique) to be added to course_completion_aggr_methd
-        $table = new xmldb_table('course_completion_aggr_methd');
-        $index = new xmldb_index('coursecriteriatype', XMLDB_INDEX_UNIQUE, array('course', 'criteriatype'));
-
-        // Conditionally launch add index coursecriteratype
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012052900.05);
-    }
-
-    if ($oldversion < 2012060600.01) {
-        // Add field referencehash to files_reference
-        $table = new xmldb_table('files_reference');
-        $field = new xmldb_field('referencehash', XMLDB_TYPE_CHAR, '40', null, XMLDB_NOTNULL, null, null, 'reference');
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-        upgrade_main_savepoint(true, 2012060600.01);
-    }
-
-    if ($oldversion < 2012060600.02) {
-        // Populate referencehash field with SHA1 hash of the reference - this shoudl affect only 2.3dev sites
-        // that were using the feature for testing. Production sites have the table empty.
-        $rs = $DB->get_recordset('files_reference', null, '', 'id, reference');
-        foreach ($rs as $record) {
-            $hash = sha1($record->reference);
-            $DB->set_field('files_reference', 'referencehash', $hash, array('id' => $record->id));
-        }
-        $rs->close();
-
-        upgrade_main_savepoint(true, 2012060600.02);
-    }
-
-    if ($oldversion < 2012060600.03) {
-        // Merge duplicate records in files_reference that were created during the development
-        // phase at 2.3dev sites. This is needed so we can create the unique index over
-        // (repositoryid, referencehash) fields.
-        $sql = "SELECT repositoryid, referencehash, MIN(id) AS minid
-                  FROM {files_reference}
-              GROUP BY repositoryid, referencehash
-                HAVING COUNT(*) > 1";
-        $duprs = $DB->get_recordset_sql($sql);
-        foreach ($duprs as $duprec) {
-            // get the list of all ids in {files_reference} that need to be remapped
-            $dupids = $DB->get_records_select('files_reference', "repositoryid = ? AND referencehash = ? AND id > ?",
-                array($duprec->repositoryid, $duprec->referencehash, $duprec->minid), '', 'id');
-            $dupids = array_keys($dupids);
-            // relink records in {files} that are now referring to a duplicate record
-            // in {files_reference} to refer to the first one
-            list($subsql, $subparams) = $DB->get_in_or_equal($dupids);
-            $DB->set_field_select('files', 'referencefileid', $duprec->minid, "referencefileid $subsql", $subparams);
-            // and finally remove all orphaned records from {files_reference}
-            $DB->delete_records_list('files_reference', 'id', $dupids);
-        }
-        $duprs->close();
-
-        upgrade_main_savepoint(true, 2012060600.03);
-    }
-
-    if ($oldversion < 2012060600.04) {
-        // Add a unique index over repositoryid and referencehash fields in files_reference table
-        $table = new xmldb_table('files_reference');
-        $index = new xmldb_index('uq_external_file', XMLDB_INDEX_UNIQUE, array('repositoryid', 'referencehash'));
-
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        upgrade_main_savepoint(true, 2012060600.04);
-    }
-
-    if ($oldversion < 2012061800.01) {
-
-        // Define field screenreader to be dropped from user
-        $table = new xmldb_table('user');
-        $field = new xmldb_field('ajax');
-
-        // Conditionally launch drop field screenreader
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012061800.01);
-    }
-
-    if ($oldversion < 2012062000.00) {
-        // Add field newcontextid to backup_files_template
-        $table = new xmldb_table('backup_files_template');
-        $field = new xmldb_field('newcontextid', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'info');
-
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        upgrade_main_savepoint(true, 2012062000.00);
-    }
-
-    if ($oldversion < 2012062000.01) {
-        // Add field newitemid to backup_files_template
-        $table = new xmldb_table('backup_files_template');
-        $field = new xmldb_field('newitemid', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'newcontextid');
-
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        upgrade_main_savepoint(true, 2012062000.01);
-    }
-
-    // Moodle v2.3.0 release upgrade line
-    // Put any upgrade step following this
-
-    if ($oldversion < 2012062500.02) {
-        // Drop some old backup tables, not used anymore
-
-        // Define table backup_files to be dropped
-        $table = new xmldb_table('backup_files');
-
-        // Conditionally launch drop table for backup_files
-        if ($dbman->table_exists($table)) {
-            $dbman->drop_table($table);
-        }
-
-        // Define table backup_ids to be dropped
-        $table = new xmldb_table('backup_ids');
-
-        // Conditionally launch drop table for backup_ids
-        if ($dbman->table_exists($table)) {
-            $dbman->drop_table($table);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012062500.02);
-    }
-
-    if ($oldversion < 2012070600.04) {
-        // Define table course_modules_avail_fields to be created
-        $table = new xmldb_table('course_modules_avail_fields');
-
-        // Adding fields to table course_modules_avail_fields
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
-        $table->add_field('coursemoduleid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('userfield', XMLDB_TYPE_CHAR, '50', null, null, null, null);
-        $table->add_field('customfieldid', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
-        $table->add_field('operator', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('value', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
-
-        // Adding keys to table course_modules_avail_fields
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('coursemoduleid', XMLDB_KEY_FOREIGN, array('coursemoduleid'), 'course_modules', array('id'));
-
-        // Conditionally launch create table for course_modules_avail_fields
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012070600.04);
-    }
-
-    if ($oldversion < 2012070600.05) {
-        // Define table course_sections_avail_fields to be created
-        $table = new xmldb_table('course_sections_avail_fields');
-
-        // Adding fields to table course_sections_avail_fields
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
-        $table->add_field('coursesectionid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('userfield', XMLDB_TYPE_CHAR, '50', null, null, null, null);
-        $table->add_field('customfieldid', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
-        $table->add_field('operator', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('value', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
-
-        // Adding keys to table course_sections_avail_fields
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('coursesectionid', XMLDB_KEY_FOREIGN, array('coursesectionid'), 'course_sections', array('id'));
-
-        // Conditionally launch create table for course_sections_avail_fields
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012070600.05);
-    }
-
-    if ($oldversion < 2012070600.06) {
-
-        // Drop "deleted" fields
-        $table = new xmldb_table('course_completions');
-        $field = new xmldb_field('timenotified');
-        $field = new xmldb_field('deleted');
-
-        // Conditionally launch drop field deleted from course_completions
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        $field = new xmldb_field('timenotified');
-        // Conditionally launch drop field timenotified from course_completions
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012070600.06);
-    }
-
-    if ($oldversion < 2012070600.07) {
-        $table = new xmldb_table('course_completion_crit_compl');
-        $field = new xmldb_field('deleted');
-
-        // Conditionally launch drop field deleted from course_completion_crit_compl
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012070600.07);
-    }
-
-    if ($oldversion < 2012070600.08) {
-
-        // Drop unused table "course_completion_notify"
-        $table = new xmldb_table('course_completion_notify');
-
-        // Conditionally launch drop table course_completion_notify
-        if ($dbman->table_exists($table)) {
-            $dbman->drop_table($table);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012070600.08);
-     }
-
-    if ($oldversion < 2012070600.09) {
-
-        // Define index path (not unique) to be added to context
-        $table = new xmldb_table('context');
-        $index = new xmldb_index('path', XMLDB_INDEX_NOTUNIQUE, array('path'), array('varchar_pattern_ops'));
-
-        // Recreate index with new pattern hint
-        if ($DB->get_dbfamily() === 'postgres') {
-            if ($dbman->index_exists($table, $index)) {
-                $dbman->drop_index($table, $index);
-            }
-            $dbman->add_index($table, $index);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012070600.09);
-    }
-
-    if ($oldversion < 2012070600.10) {
-
-        // Define index name (unique) to be dropped form role
-        $table = new xmldb_table('role');
-        $index = new xmldb_index('name', XMLDB_INDEX_UNIQUE, array('name'));
-
-        // Conditionally launch drop index name
-        if ($dbman->index_exists($table, $index)) {
-            $dbman->drop_index($table, $index);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012070600.10);
-    }
-
-    if ($oldversion < 2012070600.11) {
-
-        // Define index component-itemid-userid (not unique) to be added to role_assignments
-        $table = new xmldb_table('role_assignments');
-        $index = new xmldb_index('component-itemid-userid', XMLDB_INDEX_NOTUNIQUE, array('component', 'itemid', 'userid'));
-
-        // Conditionally launch add index component-itemid-userid
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012070600.11);
-    }
-
-    if ($oldversion < 2012071900.01) {
-        // Cleanup after simpeltests tool
-        capabilities_cleanup('tool_unittest');
-        unset_all_config_for_plugin('tool_unittest');
-
-        upgrade_main_savepoint(true, 2012071900.01);
-    }
-
-    if ($oldversion < 2012072400.00) {
-        // Remove obsolete xhtml strict setting - use THEME->doctype in theme config if necessary,
-        // see theme_config->doctype in lib/outputlib.php for more details.
-        unset_config('xmlstrictheaders');
-        upgrade_main_savepoint(true, 2012072400.00);
-    }
-
-    if ($oldversion < 2012072401.00) {
-
-        // Saves orphaned questions from the Dark Side
-        upgrade_save_orphaned_questions();
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012072401.00);
-    }
-
-    if ($oldversion < 2012072600.01) {
-        // Handle events with empty eventtype //MDL-32827
-
-        $DB->set_field('event', 'eventtype', 'site', array('eventtype' => '', 'courseid' => $SITE->id));
-        $DB->set_field_select('event', 'eventtype', 'due', "eventtype = '' AND courseid != 0 AND groupid = 0 AND (modulename = 'assignment' OR modulename = 'assign')");
-        $DB->set_field_select('event', 'eventtype', 'course', "eventtype = '' AND courseid != 0 AND groupid = 0");
-        $DB->set_field_select('event', 'eventtype', 'group', "eventtype = '' AND groupid != 0");
-        $DB->set_field_select('event', 'eventtype', 'user', "eventtype = '' AND userid != 0");
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012072600.01);
-    }
-
-    if ($oldversion < 2012080200.02) {
-        // Drop obsolete question upgrade field that should have been added to the install.xml.
-        $table = new xmldb_table('question');
-        $field = new xmldb_field('oldquestiontextformat', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0');
-
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        upgrade_main_savepoint(true, 2012080200.02);
-    }
-
-    if ($oldversion < 2012081400.01) {
-        // Move the ability to disable blogs to its own setting MDL-25012.
-
-        if (isset($CFG->bloglevel)) {
-            // Only change settings if existing setting was set.
-            if (empty($CFG->bloglevel)) {
-                set_config('enableblogs', 0);
-                // Now set the bloglevel to a valid setting as the disabled setting has been removed.
-                // This prevents confusing results when users enable the blog system in future.
-                set_config('bloglevel', BLOG_USER_LEVEL);
-            } else {
-                set_config('enableblogs', 1);
-            }
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012081400.01);
-    }
-
-    if ($oldversion < 2012081600.01) {
-        // Delete removed setting - Google Maps API V2 will not work in 2013.
-        unset_config('googlemapkey');
-        upgrade_main_savepoint(true, 2012081600.01);
-    }
-
-    if ($oldversion < 2012082300.01) {
-        // Add more custom enrol fields.
-        $table = new xmldb_table('enrol');
-        $field = new xmldb_field('customint5', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'customint4');
-
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        $field = new xmldb_field('customint6', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'customint5');
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        $field = new xmldb_field('customint7', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'customint6');
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        $field = new xmldb_field('customint8', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'customint7');
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        $field = new xmldb_field('customchar3', XMLDB_TYPE_CHAR, '1333', null, null, null, null, 'customchar2');
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        $field = new xmldb_field('customtext3', XMLDB_TYPE_TEXT, null, null, null, null, null, 'customtext2');
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        $field = new xmldb_field('customtext4', XMLDB_TYPE_TEXT, null, null, null, null, null, 'customtext3');
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2012082300.01);
-    }
-
-    if ($oldversion < 2012082300.02) {
-        // Define field component to be added to groups_members
-        $table = new xmldb_table('groups_members');
-        $field = new xmldb_field('component', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null, 'timeadded');
-
-        // Conditionally launch add field component
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Define field itemid to be added to groups_members
-        $field = new xmldb_field('itemid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'component');
-
-        // Conditionally launch add field itemid
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012082300.02);
-    }
-
-    if ($oldversion < 2012090500.00) {
-        $subquery = 'SELECT b.id FROM {blog_external} b where b.id = ' . $DB->sql_cast_char2int('{post}.content', true);
-        $sql = 'DELETE FROM {post}
-                      WHERE {post}.module = \'blog_external\'
-                            AND NOT EXISTS (' . $subquery . ')
-                            AND ' . $DB->sql_isnotempty('post', 'uniquehash', false, false);
-        $DB->execute($sql);
-        upgrade_main_savepoint(true, 2012090500.00);
-    }
-
-    if ($oldversion < 2012090700.01) {
-        // Add a category field in the course_request table
-        $table = new xmldb_table('course_request');
-        $field = new xmldb_field('category', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, 0, 'summaryformat');
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2012090700.01);
-    }
-
-    if ($oldversion < 2012091700.00) {
-
-        // Dropping screenreader field from user.
-        $table = new xmldb_table('user');
-        $field = new xmldb_field('screenreader');
-
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2012091700.00);
-    }
-
-    if ($oldversion < 2012092100.01) {
-        // Some folders still have a sortorder set, which is used for main files but is not
-        // supported by the folder resource. We reset the value here.
-        $sql = 'UPDATE {files} SET sortorder = ? WHERE component = ? AND filearea = ? AND sortorder <> ?';
-        $DB->execute($sql, array(0, 'mod_folder', 'content', 0));
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2012092100.01);
-    }
-
-    if ($oldversion < 2012092600.00) {
-        // Define index idname (unique) to be added to tag
-        $table = new xmldb_table('tag');
-        $index = new xmldb_index('idname', XMLDB_INDEX_UNIQUE, array('id', 'name'));
-
-        // Conditionally launch add index idname
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012092600.00);
-    }
-
-    if ($oldversion < 2012101500.01) {
-        // Find all orphaned blog associations that might exist.
-        $sql = "SELECT ba.id
-                  FROM {blog_association} ba
-             LEFT JOIN {post} p
-                    ON p.id = ba.blogid
-                 WHERE p.id IS NULL";
-        $orphanedrecordids = $DB->get_records_sql($sql);
-        // Now delete these associations.
-        foreach ($orphanedrecordids as $orphanedrecord) {
-            $DB->delete_records('blog_association', array('id' => $orphanedrecord->id));
-        }
-
-        upgrade_main_savepoint(true, 2012101500.01);
-    }
-
-    if ($oldversion < 2012101800.02) {
-        // Renaming backups using previous file naming convention.
-        upgrade_rename_old_backup_files_using_shortname();
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2012101800.02);
-    }
-
-    if ($oldversion < 2012103001.00) {
-        // create new event_subscriptions table
-        $table = new xmldb_table('event_subscriptions');
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
-        $table->add_field('url', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('courseid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
-        $table->add_field('groupid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
-        $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
-        $table->add_field('pollinterval', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
-        $table->add_field('lastupdated', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
-        $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012103001.00);
-    }
-
-    if ($oldversion < 2012103002.00) {
-        // Add subscription field to the event table
-        $table = new xmldb_table('event');
-        $field = new xmldb_field('subscriptionid', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'timemodified');
-
-        // Conditionally launch add field subscriptionid
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-        upgrade_main_savepoint(true, 2012103002.00);
-    }
-
-    if ($oldversion < 2012103003.00) {
-        // Fix uuid field in event table to match RFC-2445 UID property.
-        $table = new xmldb_table('event');
-        $field = new xmldb_field('uuid', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'visible');
-        // The column already exists, so make sure there are no nulls (crazy mysql).
-        $DB->set_field_select('event', 'uuid', '', "uuid IS NULL");
-        // Changing precision of field uuid on table event to (255).
-        $dbman->change_field_precision($table, $field);
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012103003.00);
-    }
-
-    if ($oldversion < 2012110200.00) {
-
-        // Define table course_format_options to be created
-        $table = new xmldb_table('course_format_options');
-
-        // Adding fields to table course_format_options
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
-        $table->add_field('courseid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('format', XMLDB_TYPE_CHAR, '21', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('sectionid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'format');
-        $table->add_field('name', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('value', XMLDB_TYPE_TEXT, null, null, null, null, null);
-
-        // Adding keys to table course_format_options
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('courseid', XMLDB_KEY_FOREIGN, array('courseid'), 'course', array('id'));
-
-        // Adding indexes to table course_format_options
-        $table->add_index('formatoption', XMLDB_INDEX_UNIQUE, array('courseid', 'format', 'sectionid', 'name'));
-
-        // Conditionally launch create table for course_format_options
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Changing type of field format on table course to char with length 21
-        $table = new xmldb_table('course');
-        $field = new xmldb_field('format', XMLDB_TYPE_CHAR, '21', null, XMLDB_NOTNULL, null, 'topics', 'summaryformat');
-
-        // Launch change of type for field format
-        $dbman->change_field_type($table, $field);
-
-        // Since structure of 'course' table has changed we need to re-read $SITE from DB.
-        $SITE = $DB->get_record('course', array('id' => $SITE->id));
-        $COURSE = clone($SITE);
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012110200.00);
-    }
-
-    if ($oldversion < 2012110201.00) {
-
-        // Copy fields 'coursedisplay', 'numsections', 'hiddensections' from table {course}
-        // to table {course_format_options} as the additional format options
-        $fields = array();
-        $table = new xmldb_table('course');
-        foreach (array('coursedisplay', 'numsections', 'hiddensections') as $fieldname) {
-            // first check that fields still exist
-            $field = new xmldb_field($fieldname);
-            if ($dbman->field_exists($table, $field)) {
-                $fields[] = $fieldname;
-            }
-        }
-
-        if (!empty($fields)) {
-            $transaction = $DB->start_delegated_transaction();
-            $rs = $DB->get_recordset_sql('SELECT id, format, '. join(',', $fields).'
-                FROM {course}
-                WHERE format <> ? AND format <> ?',
-                array('scorm', 'social'));
-            // (do not copy fields from scrom and social formats, we already know that they are not used)
-            foreach ($rs as $rec) {
-                foreach ($fields as $field) {
-                    try {
-                        $DB->insert_record('course_format_options',
-                                array(
-                                    'courseid'  => $rec->id,
-                                    'format'    => $rec->format,
-                                    'sectionid' => 0,
-                                    'name'      => $field,
-                                    'value'     => $rec->$field
-                                ));
-                    } catch (dml_exception $e) {
-                        // index 'courseid,format,sectionid,name' violation
-                        // continue; the entry in course_format_options already exists, use it
-                    }
-                }
-            }
-            $rs->close();
-            $transaction->allow_commit();
-
-            // Drop fields from table course
-            foreach ($fields as $fieldname) {
-                $field = new xmldb_field($fieldname);
-                $dbman->drop_field($table, $field);
-            }
-        }
-
-        // Since structure of 'course' table has changed we need to re-read $SITE from DB.
-        $SITE = $DB->get_record('course', array('id' => $SITE->id));
-        $COURSE = clone($SITE);
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012110201.00);
-    }
-
-    if ($oldversion < 2012110700.01) {
-
-        // Define field caller_component to be added to portfolio_log.
-        $table = new xmldb_table('portfolio_log');
-        $field = new xmldb_field('caller_component', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'caller_file');
-
-        // Conditionally launch add field caller_component.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2012110700.01);
-    }
-
-    if ($oldversion < 2012111200.00) {
-
-        // Define table temp_enroled_template to be created
-        $table = new xmldb_table('temp_enroled_template');
-
-        // Adding fields to table temp_enroled_template
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
-        $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
-        $table->add_field('courseid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
-        $table->add_field('roleid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-
-        // Adding keys to table temp_enroled_template
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-
-        // Adding indexes to table temp_enroled_template
-        $table->add_index('userid', XMLDB_INDEX_NOTUNIQUE, array('userid'));
-        $table->add_index('courseid', XMLDB_INDEX_NOTUNIQUE, array('courseid'));
-        $table->add_index('roleid', XMLDB_INDEX_NOTUNIQUE, array('roleid'));
-
-        // Conditionally launch create table for temp_enroled_template
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Define table temp_log_template to be created
-        $table = new xmldb_table('temp_log_template');
-
-        // Adding fields to table temp_log_template
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
-        $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
-        $table->add_field('course', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
-        $table->add_field('action', XMLDB_TYPE_CHAR, '40', null, XMLDB_NOTNULL, null, null);
-
-        // Adding keys to table temp_log_template
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-
-        // Adding indexes to table temp_log_template
-        $table->add_index('action', XMLDB_INDEX_NOTUNIQUE, array('action'));
-        $table->add_index('course', XMLDB_INDEX_NOTUNIQUE, array('course'));
-        $table->add_index('user', XMLDB_INDEX_NOTUNIQUE, array('userid'));
-        $table->add_index('usercourseaction', XMLDB_INDEX_NOTUNIQUE, array('userid', 'course', 'action'));
-
-        // Conditionally launch create table for temp_log_template
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012111200.00);
-    }
-
-    if ($oldversion < 2012111200.01) {
-        // Force the rebuild of the cache of every courses, some cached information could contain wrong icon references.
-        $DB->execute('UPDATE {course} set modinfo = ?, sectioncache = ?', array(null, null));
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2012111200.01);
-    }
-
-    if ($oldversion < 2012111601.01) {
-        // Clea up after old shared memory caching support.
-        unset_config('cachetype');
-        unset_config('rcache');
-        unset_config('rcachettl');
-        unset_config('intcachemax');
-        unset_config('memcachedhosts');
-        unset_config('memcachedpconn');
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2012111601.01);
-    }
-
-    if ($oldversion < 2012112100.00) {
-
-        // Define field eventtype to be added to event_subscriptions.
-        $table = new xmldb_table('event_subscriptions');
-        $field = new xmldb_field('eventtype', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null, 'userid');
-
-        // Conditionally launch add field eventtype.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2012112100.00);
-    }
-
-    // Moodle v2.4.0 release upgrade line
-    // Put any upgrade step following this
-
-    if ($oldversion < 2012120300.01) {
-        // Make sure site-course has format='site' //MDL-36840
-
-        if ($SITE->format !== 'site') {
-            $DB->set_field('course', 'format', 'site', array('id' => $SITE->id));
-            $SITE->format = 'site';
-            $COURSE->format = 'site';
-        }
-
-        // Main savepoint reached
-        upgrade_main_savepoint(true, 2012120300.01);
-    }
-
-    if ($oldversion < 2012120300.04) {
-        // Remove "_utf8" suffix from all langs in course table.
-        $langs = $DB->get_records_sql("SELECT DISTINCT lang FROM {course} WHERE lang LIKE ?", array('%_utf8'));
-
-        foreach ($langs as $lang=>$unused) {
-            $newlang = str_replace('_utf8', '', $lang);
-            $sql = "UPDATE {course} SET lang = :newlang WHERE lang = :lang";
-            $DB->execute($sql, array('newlang'=>$newlang, 'lang'=>$lang));
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2012120300.04);
-    }
-
-    if ($oldversion < 2012123000.00) {
-        // Purge removed module filters and all their settings.
-
-        $tables = array('filter_active', 'filter_config');
-        foreach ($tables as $table) {
-            $DB->delete_records_select($table, "filter LIKE 'mod/%'");
-            $filters = $DB->get_records_sql("SELECT DISTINCT filter FROM {{$table}} WHERE filter LIKE 'filter/%'");
-            foreach ($filters as $filter) {
-                $DB->set_field($table, 'filter', substr($filter->filter, 7), array('filter'=>$filter->filter));
-            }
-        }
-
-        $configs = array('stringfilters', 'filterall');
-        foreach ($configs as $config) {
-            if ($filters = get_config(null, $config)) {
-                $filters = explode(',', $filters);
-                $newfilters = array();
-                foreach($filters as $filter) {
-                    if (strpos($filter, '/') === false) {
-                        $newfilters[] = $filter;
-                    } else if (strpos($filter, 'filter/') === 0) {
-                        $newfilters[] = substr($filter, 7);
-                    }
-                }
-                $filters = implode(',', $newfilters);
-                set_config($config, $filters);
-            }
-        }
-
-        unset($tables);
-        unset($table);
-        unset($configs);
-        unset($newfilters);
-        unset($filters);
-        unset($filter);
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2012123000.00);
-    }
-
-    if ($oldversion < 2013021100.01) {
-        // Make sure there are no bogus nulls in old MySQL tables.
-        $DB->set_field_select('user', 'password', '', "password IS NULL");
-
-        // Changing precision of field password on table user to (255).
-        $table = new xmldb_table('user');
-        $field = new xmldb_field('password', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'username');
-
-        // Launch change of precision for field password.
-        $dbman->change_field_precision($table, $field);
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013021100.01);
-    }
-
-    if ($oldversion < 2013021800.00) {
-        // Add the site identifier to the cache config's file.
-        $siteidentifier = $DB->get_field('config', 'value', array('name' => 'siteidentifier'));
-        cache_helper::update_site_identifier($siteidentifier);
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013021800.00);
-    }
-
-    if ($oldversion < 2013021801.00) {
-        // Fixing possible wrong MIME types for SMART Notebook files.
-        $extensions = array('%.gallery', '%.galleryitem', '%.gallerycollection', '%.nbk', '%.notebook', '%.xbk');
-        $select = $DB->sql_like('filename', '?', false);
-        foreach ($extensions as $extension) {
-            $DB->set_field_select(
-                'files',
-                'mimetype',
-                'application/x-smarttech-notebook',
-                $select,
-                array($extension)
-            );
-        }
-        upgrade_main_savepoint(true, 2013021801.00);
-    }
-
-    if ($oldversion < 2013021801.01) {
-        // This upgrade step is re-written under MDL-38228 (see below).
-        /*
-        // Retrieve the list of course_sections as a recordset to save memory
-        $coursesections = $DB->get_recordset('course_sections', null, 'course, id', 'id, course, sequence');
-        foreach ($coursesections as $coursesection) {
-            // Retrieve all of the actual modules in this course and section combination to reduce DB calls
-            $actualsectionmodules = $DB->get_records('course_modules',
-                    array('course' => $coursesection->course, 'section' => $coursesection->id), '', 'id, section');
-
-            // Break out the current sequence so that we can compare it
-            $currentsequence = explode(',', $coursesection->sequence);
-            $newsequence = array();
-
-            // Check each of the modules in the current sequence
-            foreach ($currentsequence as $module) {
-                if (isset($actualsectionmodules[$module])) {
-                    $newsequence[] = $module;
-                    // We unset the actualsectionmodules so that we don't get duplicates and that we can add orphaned
-                    // modules later
-                    unset($actualsectionmodules[$module]);
-                }
-            }
-
-            // Append any modules which have somehow been orphaned
-            foreach ($actualsectionmodules as $module) {
-                $newsequence[] = $module->id;
-            }
-
-            // Piece it all back together
-            $sequence = implode(',', $newsequence);
-
-            // Only update if there have been changes
-            if ($sequence !== $coursesection->sequence) {
-                $coursesection->sequence = $sequence;
-                $DB->update_record('course_sections', $coursesection);
-
-                // And clear the sectioncache and modinfo cache - they'll be regenerated on next use
-                $course = new stdClass();
-                $course->id = $coursesection->course;
-                $course->sectioncache = null;
-                $course->modinfo = null;
-                $DB->update_record('course', $course);
-            }
-        }
-        $coursesections->close();
-        */
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013021801.01);
-    }
-
-    if ($oldversion < 2013021902.00) {
-        // ISO country change: Netherlands Antilles is split into BQ, CW & SX
-        // http://www.iso.org/iso/iso_3166-1_newsletter_vi-8_split_of_the_dutch_antilles_final-en.pdf
-        $sql = "UPDATE {user} SET country = '' WHERE country = ?";
-        $DB->execute($sql, array('AN'));
-
-        upgrade_main_savepoint(true, 2013021902.00);
-    }
-
-    if ($oldversion < 2013022600.00) {
-        // Delete entries regarding invalid 'interests' option which breaks course.
-        $DB->delete_records('course_sections_avail_fields', array('userfield' => 'interests'));
-        $DB->delete_records('course_modules_avail_fields', array('userfield' => 'interests'));
-        // Clear course cache (will be rebuilt on first visit) in case of changes to these.
-        $DB->execute('UPDATE {course} set modinfo = ?, sectioncache = ?', array(null, null));
-
-        upgrade_main_savepoint(true, 2013022600.00);
-    }
-
-    // Add index to field "timemodified" for grade_grades_history table.
-    if ($oldversion < 2013030400.00) {
-        $table = new xmldb_table('grade_grades_history');
-        $field = new xmldb_field('timemodified');
-
-        if ($dbman->field_exists($table, $field)) {
-            $index = new xmldb_index('timemodified', XMLDB_INDEX_NOTUNIQUE, array('timemodified'));
-            if (!$dbman->index_exists($table, $index)) {
-                $dbman->add_index($table, $index);
-            }
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013030400.00);
-    }
-
-    if ($oldversion < 2013030400.02) {
-        // Cleanup qformat blackboard settings.
-        unset_all_config_for_plugin('qformat_blackboard');
-
-        upgrade_main_savepoint(true, 2013030400.02);
-    }
-
-    // This is checking to see if the site has been running a specific version with a bug in it
-    // because this upgrade step is slow and is only needed if the site has been running with the affected versions.
-    if ($oldversion >= 2012062504.08 && $oldversion < 2012062504.13) {
-        // This upgrade step is re-written under MDL-38228 (see below).
-
-        /*
-        // Retrieve the list of course_sections as a recordset to save memory.
-        // This is to fix a regression caused by MDL-37939.
-        // In this case the upgrade step is fixing records where:
-        // The data in course_sections.sequence contains the correct module id
-        // The section field for on the course modules table may have been updated to point to the incorrect id.
-
-        // This query is looking for sections where the sequence is not in sync with the course_modules table.
-        // The syntax for the like query is looking for a value in a comma separated list.
-        // It adds a comma to either site of the list and then searches for LIKE '%,id,%'.
-        $sequenceconcat = $DB->sql_concat("','", 's.sequence', "','");
-        $moduleconcat = $DB->sql_concat("'%,'", 'cm.id', "',%'");
-        $sql = 'SELECT s2.id, s2.course, s2.sequence
-                FROM {course_sections} s2
-                JOIN(
-                    SELECT DISTINCT s.id
-                    FROM
-                    {course_modules} cm
-                    JOIN {course_sections} s
-                    ON
-                        cm.course = s.course
-                    WHERE cm.section != s.id AND ' . $sequenceconcat . ' LIKE ' . $moduleconcat . '
-                ) d
-                ON s2.id = d.id';
-        $coursesections = $DB->get_recordset_sql($sql);
-
-        foreach ($coursesections as $coursesection) {
-            // Retrieve all of the actual modules in this course and section combination to reduce DB calls.
-            $actualsectionmodules = $DB->get_records('course_modules',
-                    array('course' => $coursesection->course, 'section' => $coursesection->id), '', 'id, section');
-
-            // Break out the current sequence so that we can compare it.
-            $currentsequence = explode(',', $coursesection->sequence);
-            $orphanlist = array();
-
-            // Check each of the modules in the current sequence.
-            foreach ($currentsequence as $cmid) {
-                if (!empty($cmid) && !isset($actualsectionmodules[$cmid])) {
-                    $orphanlist[] = $cmid;
-                }
-            }
-
-            if (!empty($orphanlist)) {
-                list($sql, $params) = $DB->get_in_or_equal($orphanlist, SQL_PARAMS_NAMED);
-                $sql = "id $sql";
-
-                $DB->set_field_select('course_modules', 'section', $coursesection->id, $sql, $params);
-
-                // And clear the sectioncache and modinfo cache - they'll be regenerated on next use.
-                $course = new stdClass();
-                $course->id = $coursesection->course;
-                $course->sectioncache = null;
-                $course->modinfo = null;
-                $DB->update_record('course', $course);
-            }
-        }
-        $coursesections->close();
-
-        // No savepoint needed for this change.
-         */
-    }
-
-    if ($oldversion < 2013032200.01) {
-        // GD is now always available
-        set_config('gdversion', 2);
-
-        upgrade_main_savepoint(true, 2013032200.01);
-    }
-
-    if ($oldversion < 2013032600.03) {
-        // Fixing possible wrong MIME type for MIME HTML (MHTML) files.
-        $extensions = array('%.mht', '%.mhtml');
-        $select = $DB->sql_like('filename', '?', false);
-        foreach ($extensions as $extension) {
-            $DB->set_field_select(
-                'files',
-                'mimetype',
-                'message/rfc822',
-                $select,
-                array($extension)
-            );
-        }
-        upgrade_main_savepoint(true, 2013032600.03);
-    }
-
-    if ($oldversion < 2013032600.04) {
-        // MDL-31983 broke the quiz version number. Fix it.
-        $DB->set_field('modules', 'version', '2013021500',
-                array('name' => 'quiz', 'version' => '2013310100'));
-        upgrade_main_savepoint(true, 2013032600.04);
-    }
-
-    if ($oldversion < 2013040200.00) {
-        // Add openbadges tables.
-
-        // Define table 'badge' to be created.
-        $table = new xmldb_table('badge');
-
-        // Adding fields to table 'badge'.
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null);
-        $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'id');
-        $table->add_field('description', XMLDB_TYPE_TEXT, null, null, null, null, null, 'name');
-        $table->add_field('image', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'description');
-        $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'image');
-        $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'timecreated');
-        $table->add_field('usercreated', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'timemodified');
-        $table->add_field('usermodified', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'usercreated');
-        $table->add_field('issuername', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'usermodified');
-        $table->add_field('issuerurl', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'issuername');
-        $table->add_field('issuercontact', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'issuerurl');
-        $table->add_field('expiredate', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'issuercontact');
-        $table->add_field('expireperiod', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'expiredate');
-        $table->add_field('type', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '1', 'expireperiod');
-        $table->add_field('courseid', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'type');
-        $table->add_field('message', XMLDB_TYPE_TEXT, null, null, XMLDB_NOTNULL, null, null, 'courseid');
-        $table->add_field('messagesubject', XMLDB_TYPE_TEXT, null, null, XMLDB_NOTNULL, null, null, 'message');
-        $table->add_field('attachment', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '1', 'messagesubject');
-        $table->add_field('notification', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '1', 'attachment');
-        $table->add_field('status', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'notification');
-        $table->add_field('nextcron', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'status');
-
-        // Adding keys to table 'badge'.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('fk_courseid', XMLDB_KEY_FOREIGN, array('courseid'), 'course', array('id'));
-        $table->add_key('fk_usermodified', XMLDB_KEY_FOREIGN, array('usermodified'), 'user', array('id'));
-        $table->add_key('fk_usercreated', XMLDB_KEY_FOREIGN, array('usercreated'), 'user', array('id'));
-
-        // Adding indexes to table 'badge'.
-        $table->add_index('type', XMLDB_INDEX_NOTUNIQUE, array('type'));
-
-        // Conditionally launch create table for 'badge'.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Define table 'badge_criteria' to be created.
-        $table = new xmldb_table('badge_criteria');
-
-        // Adding fields to table 'badge_criteria'.
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null);
-        $table->add_field('badgeid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'id');
-        $table->add_field('criteriatype', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'badgeid');
-        $table->add_field('method', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '1', 'criteriatype');
-
-        // Adding keys to table 'badge_criteria'.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('fk_badgeid', XMLDB_KEY_FOREIGN, array('badgeid'), 'badge', array('id'));
-
-        // Adding indexes to table 'badge_criteria'.
-        $table->add_index('criteriatype', XMLDB_INDEX_NOTUNIQUE, array('criteriatype'));
-        $table->add_index('badgecriteriatype', XMLDB_INDEX_UNIQUE, array('badgeid', 'criteriatype'));
-
-        // Conditionally launch create table for 'badge_criteria'.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Define table 'badge_criteria_param' to be created.
-        $table = new xmldb_table('badge_criteria_param');
-
-        // Adding fields to table 'badge_criteria_param'.
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null);
-        $table->add_field('critid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'id');
-        $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'critid');
-        $table->add_field('value', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'name');
-
-        // Adding keys to table 'badge_criteria_param'.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('fk_critid', XMLDB_KEY_FOREIGN, array('critid'), 'badge_criteria', array('id'));
-
-        // Conditionally launch create table for 'badge_criteria_param'.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Define table 'badge_issued' to be created.
-        $table = new xmldb_table('badge_issued');
-
-        // Adding fields to table 'badge_issued'.
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null);
-        $table->add_field('badgeid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'id');
-        $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'badgeid');
-        $table->add_field('uniquehash', XMLDB_TYPE_TEXT, null, null, XMLDB_NOTNULL, null, null, 'userid');
-        $table->add_field('dateissued', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'uniquehash');
-        $table->add_field('dateexpire', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'dateissued');
-        $table->add_field('visible', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'dateexpire');
-        $table->add_field('issuernotified', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'visible');
-
-        // Adding keys to table 'badge_issued'.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('fk_badgeid', XMLDB_KEY_FOREIGN, array('badgeid'), 'badge', array('id'));
-        $table->add_key('fk_userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
-
-        $table->add_index('badgeuser', XMLDB_INDEX_UNIQUE, array('badgeid', 'userid'));
-
-        // Conditionally launch create table for 'badge_issued'.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Define table 'badge_criteria_met' to be created.
-        $table = new xmldb_table('badge_criteria_met');
-
-        // Adding fields to table 'badge_criteria_met'.
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null);
-        $table->add_field('issuedid', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'id');
-        $table->add_field('critid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'issuedid');
-        $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'critid');
-        $table->add_field('datemet', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'userid');
-
-        // Adding keys to table 'badge_criteria_met'
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('fk_critid', XMLDB_KEY_FOREIGN, array('critid'), 'badge_criteria', array('id'));
-        $table->add_key('fk_userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
-        $table->add_key('fk_issuedid', XMLDB_KEY_FOREIGN, array('issuedid'), 'badge_issued', array('id'));
-
-        // Conditionally launch create table for 'badge_criteria_met'.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Define table 'badge_manual_award' to be created.
-        $table = new xmldb_table('badge_manual_award');
-
-        // Adding fields to table 'badge_manual_award'.
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null);
-        $table->add_field('badgeid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'id');
-        $table->add_field('recipientid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'badgeid');
-        $table->add_field('issuerid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'recipientid');
-        $table->add_field('issuerrole', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'issuerid');
-        $table->add_field('datemet', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'issuerrole');
-
-        // Adding keys to table 'badge_manual_award'.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('fk_badgeid', XMLDB_KEY_FOREIGN, array('badgeid'), 'badge', array('id'));
-        $table->add_key('fk_recipientid', XMLDB_KEY_FOREIGN, array('recipientid'), 'user', array('id'));
-        $table->add_key('fk_issuerid', XMLDB_KEY_FOREIGN, array('issuerid'), 'user', array('id'));
-        $table->add_key('fk_issuerrole', XMLDB_KEY_FOREIGN, array('issuerrole'), 'role', array('id'));
-
-        // Conditionally launch create table for 'badge_manual_award'.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Define table 'badge_backpack' to be created.
-        $table = new xmldb_table('badge_backpack');
-
-        // Adding fields to table 'badge_backpack'.
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null);
-        $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'id');
-        $table->add_field('email', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null, 'userid');
-        $table->add_field('backpackurl', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'email');
-        $table->add_field('backpackuid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'backpackurl');
-        $table->add_field('backpackgid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'backpackuid');
-        $table->add_field('autosync', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'backpackgid');
-        $table->add_field('password', XMLDB_TYPE_CHAR, '50', null, null, null, null, 'autosync');
-
-        // Adding keys to table 'badge_backpack'.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('fk_userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
-
-        // Conditionally launch create table for 'badge_backpack'.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013040200.00);
-    }
-
-    if ($oldversion < 2013040201.00) {
-        // Convert name field in event table to text type as RFC-2445 doesn't have any limitation on it.
-        $table = new xmldb_table('event');
-        $field = new xmldb_field('name', XMLDB_TYPE_TEXT, null, null, XMLDB_NOTNULL, null, null);
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->change_field_type($table, $field);
-        }
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013040201.00);
-    }
-
-    if ($oldversion < 2013040300.01) {
-
-        // Define field completionstartonenrol to be dropped from course.
-        $table = new xmldb_table('course');
-        $field = new xmldb_field('completionstartonenrol');
-
-        // Conditionally launch drop field completionstartonenrol.
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        // Since structure of 'course' table has changed we need to re-read $SITE from DB.
-        $SITE = $DB->get_record('course', array('id' => $SITE->id));
-        $COURSE = clone($SITE);
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013040300.01);
-    }
-
-    if ($oldversion < 2013041200.00) {
-        // MDL-29877 Some bad restores created grade items with no category information.
-        $sql = "UPDATE {grade_items}
-                   SET categoryid = courseid
-                 WHERE itemtype <> 'course' and itemtype <> 'category'
-                       AND categoryid IS NULL";
-        $DB->execute($sql);
-        upgrade_main_savepoint(true, 2013041200.00);
-    }
-
-    if ($oldversion < 2013041600.00) {
-        // Copy constants from /course/lib.php instead of including the whole library:
-        $c = array( 'FRONTPAGENEWS'                 => 0,
-                    'FRONTPAGECOURSELIST'           => 1,
-                    'FRONTPAGECATEGORYNAMES'        => 2,
-                    'FRONTPAGETOPICONLY'            => 3,
-                    'FRONTPAGECATEGORYCOMBO'        => 4,
-                    'FRONTPAGEENROLLEDCOURSELIST'   => 5,
-                    'FRONTPAGEALLCOURSELIST'        => 6,
-                    'FRONTPAGECOURSESEARCH'         => 7);
-        // Update frontpage settings $CFG->frontpage and $CFG->frontpageloggedin. In 2.4 there was too much of hidden logic about them.
-        // This script tries to make sure that with the new (more user-friendly) frontpage settings the frontpage looks as similar as possible to what it was before upgrade.
-        $ncourses = $DB->count_records('course');
-        foreach (array('frontpage', 'frontpageloggedin') as $configkey) {
-            if ($frontpage = explode(',', $CFG->{$configkey})) {
-                $newfrontpage = array();
-                foreach ($frontpage as $v) {
-                    switch ($v) {
-                        case $c['FRONTPAGENEWS']:
-                            // Not related to course listings, leave as it is.
-                            $newfrontpage[] = $c['FRONTPAGENEWS'];
-                            break;
-                        case $c['FRONTPAGECOURSELIST']:
-                            if ($configkey === 'frontpageloggedin' && empty($CFG->disablemycourses)) {
-                                // In 2.4 unless prohibited in config, the "list of courses" was considered "list of enrolled courses" plus course search box.
-                                $newfrontpage[] = $c['FRONTPAGEENROLLEDCOURSELIST'];
-                            } else if ($ncourses <= 200) {
-                                // Still list of courses was only displayed in there were less than 200 courses in system. Otherwise - search box only.
-                                $newfrontpage[] = $c['FRONTPAGEALLCOURSELIST'];
-                                break; // skip adding search box
-                            }
-                            if (!in_array($c['FRONTPAGECOURSESEARCH'], $newfrontpage)) {
-                                $newfrontpage[] = $c['FRONTPAGECOURSESEARCH'];
-                            }
-                            break;
-                        case $c['FRONTPAGECATEGORYNAMES']:
-                            // In 2.4 search box was displayed automatically after categories list. In 2.5 it is displayed as a separate setting.
-                            $newfrontpage[] = $c['FRONTPAGECATEGORYNAMES'];
-                            if (!in_array($c['FRONTPAGECOURSESEARCH'], $newfrontpage)) {
-                                $newfrontpage[] = $c['FRONTPAGECOURSESEARCH'];
-                            }
-                            break;
-                        case $c['FRONTPAGECATEGORYCOMBO']:
-                            $maxcourses = empty($CFG->numcoursesincombo) ? 500 : $CFG->numcoursesincombo;
-                            // In 2.4 combo list was not displayed if there are more than $CFG->numcoursesincombo courses in the system.
-                            if ($ncourses < $maxcourses) {
-                                $newfrontpage[] = $c['FRONTPAGECATEGORYCOMBO'];
-                            }
-                            if (!in_array($c['FRONTPAGECOURSESEARCH'], $newfrontpage)) {
-                                $newfrontpage[] = $c['FRONTPAGECOURSESEARCH'];
-                            }
-                            break;
-                    }
-                }
-                set_config($configkey, join(',', $newfrontpage));
-            }
-        }
-        // $CFG->numcoursesincombo no longer affects whether the combo list is displayed. Setting is deprecated.
-        unset_config('numcoursesincombo');
-
-        upgrade_main_savepoint(true, 2013041600.00);
-    }
-
-    if ($oldversion < 2013041601.00) {
-        // Create a new 'badge_external' table first.
-        // Define table 'badge_external' to be created.
-        $table = new xmldb_table('badge_external');
-
-        // Adding fields to table 'badge_external'.
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null);
-        $table->add_field('backpackid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'id');
-        $table->add_field('collectionid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'backpackid');
-
-        // Adding keys to table 'badge_external'.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('fk_backpackid', XMLDB_KEY_FOREIGN, array('backpackid'), 'badge_backpack', array('id'));
-
-        // Conditionally launch create table for 'badge_external'.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Perform user data migration.
-        $usercollections = $DB->get_records('badge_backpack');
-        foreach ($usercollections as $usercollection) {
-            $collection = new stdClass();
-            $collection->backpackid = $usercollection->id;
-            $collection->collectionid = $usercollection->backpackgid;
-            $DB->insert_record('badge_external', $collection);
-        }
-
-        // Finally, drop the column.
-        // Define field backpackgid to be dropped from 'badge_backpack'.
-        $table = new xmldb_table('badge_backpack');
-        $field = new xmldb_field('backpackgid');
-
-        // Conditionally launch drop field backpackgid.
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013041601.00);
-    }
-
-    if ($oldversion < 2013041601.01) {
-        // Changing the default of field descriptionformat on table user to 1.
-        $table = new xmldb_table('user');
-        $field = new xmldb_field('descriptionformat', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '1', 'description');
-
-        // Launch change of default for field descriptionformat.
-        $dbman->change_field_default($table, $field);
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013041601.01);
-    }
-
-    if ($oldversion < 2013041900.00) {
-        require_once($CFG->dirroot . '/cache/locallib.php');
-        // The features bin needs updating.
-        cache_config_writer::update_default_config_stores();
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013041900.00);
-    }
-
-    if ($oldversion < 2013042300.00) {
-        // Adding index to unreadmessageid field of message_working table (MDL-34933)
-        $table = new xmldb_table('message_working');
-        $index = new xmldb_index('unreadmessageid_idx', XMLDB_INDEX_NOTUNIQUE, array('unreadmessageid'));
-
-        // Conditionally launch add index unreadmessageid
-        if (!$dbman->index_exists($table, $index)) {
-            $dbman->add_index($table, $index);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013042300.00);
-    }
-
-    // Moodle v2.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    if ($oldversion < 2013051400.01) {
-        // Fix incorrect cc-nc url. Unfortunately the license 'plugins' do
-        // not give a mechanism to do this.
-
-        $sql = "UPDATE {license}
-                   SET source = :url, version = :newversion
-                 WHERE shortname = :shortname AND version = :oldversion";
-
-        $params = array(
-            'url' => 'http://creativecommons.org/licenses/by-nc/3.0/',
-            'shortname' => 'cc-nc',
-            'newversion' => '2013051500',
-            'oldversion' => '2010033100'
-        );
-
-        $DB->execute($sql, $params);
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013051400.01);
-    }
-
-    if ($oldversion < 2013061400.01) {
-        // Clean up old tokens which haven't been deleted.
-        $DB->execute("DELETE FROM {user_private_key} WHERE NOT EXISTS
-                         (SELECT 'x' FROM {user} WHERE deleted = 0 AND id = userid)");
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013061400.01);
-    }
-
-    if ($oldversion < 2013061700.00) {
-        // MDL-40103: Remove unused template tables from the database.
-        // These are now created inline with xmldb_table.
-
-        $tablestocleanup = array('temp_enroled_template','temp_log_template','backup_files_template','backup_ids_template');
-        $dbman = $DB->get_manager();
-
-        foreach ($tablestocleanup as $table) {
-            $xmltable = new xmldb_table($table);
-            if ($dbman->table_exists($xmltable)) {
-                $dbman->drop_table($xmltable);
-            }
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013061700.00);
-    }
-
-    if ($oldversion < 2013070800.00) {
-
-        // Remove orphan repository instances.
-        if ($DB->get_dbfamily() === 'mysql') {
-            $sql = "DELETE {repository_instances} FROM {repository_instances}
-                    LEFT JOIN {context} ON {context}.id = {repository_instances}.contextid
-                    WHERE {context}.id IS NULL";
-        } else {
-            $sql = "DELETE FROM {repository_instances}
-                    WHERE NOT EXISTS (
-                        SELECT 'x' FROM {context}
-                        WHERE {context}.id = {repository_instances}.contextid)";
-        }
-        $DB->execute($sql);
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013070800.00);
-    }
-
-    if ($oldversion < 2013070800.01) {
-
-        // Define field lastnamephonetic to be added to user.
-        $table = new xmldb_table('user');
-        $field = new xmldb_field('lastnamephonetic', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'imagealt');
-        $index = new xmldb_index('lastnamephonetic', XMLDB_INDEX_NOTUNIQUE, array('lastnamephonetic'));
-
-        // Conditionally launch add field lastnamephonetic.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-            $dbman->add_index($table, $index);
-        }
-
-        // Define field firstnamephonetic to be added to user.
-        $table = new xmldb_table('user');
-        $field = new xmldb_field('firstnamephonetic', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'lastnamephonetic');
-        $index = new xmldb_index('firstnamephonetic', XMLDB_INDEX_NOTUNIQUE, array('firstnamephonetic'));
-
-        // Conditionally launch add field firstnamephonetic.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-            $dbman->add_index($table, $index);
-        }
-
-        // Define field alternatename to be added to user.
-        $table = new xmldb_table('user');
-        $field = new xmldb_field('middlename', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'firstnamephonetic');
-        $index = new xmldb_index('middlename', XMLDB_INDEX_NOTUNIQUE, array('middlename'));
-
-        // Conditionally launch add field firstnamephonetic.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-            $dbman->add_index($table, $index);
-        }
-
-        // Define field alternatename to be added to user.
-        $table = new xmldb_table('user');
-        $field = new xmldb_field('alternatename', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'middlename');
-        $index = new xmldb_index('alternatename', XMLDB_INDEX_NOTUNIQUE, array('alternatename'));
-
-        // Conditionally launch add field alternatename.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-            $dbman->add_index($table, $index);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013070800.01);
-    }
-    if ($oldversion < 2013071500.01) {
-        // The enrol_authorize plugin has been removed, if there are no records
-        // and no plugin files then remove the plugin data.
-        $enrolauthorize = new xmldb_table('enrol_authorize');
-        $enrolauthorizerefunds = new xmldb_table('enrol_authorize_refunds');
-
-        if (!file_exists($CFG->dirroot.'/enrol/authorize/version.php') &&
-            $dbman->table_exists($enrolauthorize) &&
-            $dbman->table_exists($enrolauthorizerefunds)) {
-
-            $enrolauthorizecount = $DB->count_records('enrol_authorize');
-            $enrolauthorizerefundcount = $DB->count_records('enrol_authorize_refunds');
-
-            if (empty($enrolauthorizecount) && empty($enrolauthorizerefundcount)) {
-
-                // Drop the database tables.
-                $dbman->drop_table($enrolauthorize);
-                $dbman->drop_table($enrolauthorizerefunds);
-
-                // Drop the message provider and associated data manually.
-                $DB->delete_records('message_providers', array('component' => 'enrol_authorize'));
-                $DB->delete_records_select('config_plugins', "plugin = 'message' AND ".$DB->sql_like('name', '?', false), array("%_provider_enrol_authorize_%"));
-                $DB->delete_records_select('user_preferences', $DB->sql_like('name', '?', false), array("message_provider_enrol_authorize_%"));
-
-                // Remove capabilities.
-                capabilities_cleanup('enrol_authorize');
-
-                // Remove all other associated config.
-                unset_all_config_for_plugin('enrol_authorize');
-            }
-        }
-        upgrade_main_savepoint(true, 2013071500.01);
-    }
-
-    if ($oldversion < 2013071500.02) {
-        // Define field attachment to be dropped from badge.
-        $table = new xmldb_table('badge');
-        $field = new xmldb_field('image');
-
-        // Conditionally launch drop field eventtype.
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        upgrade_main_savepoint(true, 2013071500.02);
-    }
-
-    if ($oldversion < 2013072600.01) {
-        upgrade_mssql_nvarcharmax();
-        upgrade_mssql_varbinarymax();
-
-        upgrade_main_savepoint(true, 2013072600.01);
-    }
-
-    if ($oldversion < 2013081200.00) {
-        // Define field uploadfiles to be added to external_services.
-        $table = new xmldb_table('external_services');
-        $field = new xmldb_field('uploadfiles', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'downloadfiles');
-
-        // Conditionally launch add field uploadfiles.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013081200.00);
-    }
-
-    if ($oldversion < 2013082300.01) {
-        // Define the table 'backup_logs' and the field 'message' which we will be changing from a char to a text field.
-        $table = new xmldb_table('backup_logs');
-        $field = new xmldb_field('message', XMLDB_TYPE_TEXT, null, null, XMLDB_NOTNULL, null, null, 'loglevel');
-
-        // Perform the change.
-        $dbman->change_field_type($table, $field);
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013082300.01);
-    }
-
-    // Convert SCORM course format courses to singleactivity.
-    if ($oldversion < 2013082700.00) {
-        // First set relevant singleactivity settings.
-        $formatoptions = new stdClass();
-        $formatoptions->format = 'singleactivity';
-        $formatoptions->sectionid = 0;
-        $formatoptions->name = 'activitytype';
-        $formatoptions->value = 'scorm';
-
-        $courses = $DB->get_recordset('course', array('format' => 'scorm'), 'id');
-        foreach ($courses as $course) {
-            $formatoptions->courseid = $course->id;
-            $DB->insert_record('course_format_options', $formatoptions);
-        }
-        $courses->close();
-
-        // Now update course format for these courses.
-        $sql = "UPDATE {course}
-                   SET format = 'singleactivity', modinfo = '', sectioncache = ''
-                 WHERE format = 'scorm'";
-        $DB->execute($sql);
-        upgrade_main_savepoint(true, 2013082700.00);
-    }
-
-    if ($oldversion < 2013090500.01) {
-        // Define field calendartype to be added to course.
-        $table = new xmldb_table('course');
-        $field = new xmldb_field('calendartype', XMLDB_TYPE_CHAR, '30', null, XMLDB_NOTNULL, null, null);
-
-        // Conditionally launch add field calendartype.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Since structure of 'course' table has changed we need to re-read $SITE from DB.
-        $SITE = $DB->get_record('course', array('id' => $SITE->id));
-        $COURSE = clone($SITE);
-
-        // Define field calendartype to be added to user.
-        $table = new xmldb_table('user');
-        $field = new xmldb_field('calendartype', XMLDB_TYPE_CHAR, '30', null, XMLDB_NOTNULL, null, 'gregorian');
-
-        // Conditionally launch add field calendartype.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013090500.01);
-    }
-
-    if ($oldversion < 2013091000.02) {
-
-        // Define field cacherev to be added to course.
-        $table = new xmldb_table('course');
-        $field = new xmldb_field('cacherev', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'completionnotify');
-
-        // Conditionally launch add field cacherev.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Since structure of 'course' table has changed we need to re-read $SITE from DB.
-        $SITE = $DB->get_record('course', array('id' => $SITE->id));
-        $COURSE = clone($SITE);
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013091000.02);
-    }
-
-    if ($oldversion < 2013091000.03) {
-
-        // Define field modinfo to be dropped from course.
-        $table = new xmldb_table('course');
-        $field = new xmldb_field('modinfo');
-
-        // Conditionally launch drop field modinfo.
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        // Define field sectioncache to be dropped from course.
-        $field = new xmldb_field('sectioncache');
-
-        // Conditionally launch drop field sectioncache.
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        // Since structure of 'course' table has changed we need to re-read $SITE from DB.
-        $SITE = $DB->get_record('course', array('id' => $SITE->id));
-        $COURSE = clone($SITE);
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013091000.03);
-    }
-
-    if ($oldversion < 2013091300.01) {
-
-        $table = new xmldb_table('user');
-
-        // Changing precision of field institution on table user to (255).
-        $field = new xmldb_field('institution', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'phone2');
-
-        // Launch change of precision for field institution.
-        $dbman->change_field_precision($table, $field);
-
-        // Changing precision of field department on table user to (255).
-        $field = new xmldb_field('department', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'institution');
-
-        // Launch change of precision for field department.
-        $dbman->change_field_precision($table, $field);
-
-        // Changing precision of field address on table user to (255).
-        $field = new xmldb_field('address', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'department');
-
-        // Launch change of precision for field address.
-        $dbman->change_field_precision($table, $field);
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013091300.01);
-    }
-
-    if ($oldversion < 2013092000.01) {
-
-        // Define table question_statistics to be created.
-        $table = new xmldb_table('question_statistics');
-
-        // Adding fields to table question_statistics.
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
-        $table->add_field('hashcode', XMLDB_TYPE_CHAR, '40', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('questionid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('slot', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
-        $table->add_field('subquestion', XMLDB_TYPE_INTEGER, '4', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('s', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
-        $table->add_field('effectiveweight', XMLDB_TYPE_NUMBER, '15, 5', null, null, null, null);
-        $table->add_field('negcovar', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0');
-        $table->add_field('discriminationindex', XMLDB_TYPE_NUMBER, '15, 5', null, null, null, null);
-        $table->add_field('discriminativeefficiency', XMLDB_TYPE_NUMBER, '15, 5', null, null, null, null);
-        $table->add_field('sd', XMLDB_TYPE_NUMBER, '15, 10', null, null, null, null);
-        $table->add_field('facility', XMLDB_TYPE_NUMBER, '15, 10', null, null, null, null);
-        $table->add_field('subquestions', XMLDB_TYPE_TEXT, null, null, null, null, null);
-        $table->add_field('maxmark', XMLDB_TYPE_NUMBER, '12, 7', null, null, null, null);
-        $table->add_field('positions', XMLDB_TYPE_TEXT, null, null, null, null, null);
-        $table->add_field('randomguessscore', XMLDB_TYPE_NUMBER, '12, 7', null, null, null, null);
-
-        // Adding keys to table question_statistics.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-
-        // Conditionally launch create table for question_statistics.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Define table question_response_analysis to be created.
-        $table = new xmldb_table('question_response_analysis');
-
-        // Adding fields to table question_response_analysis.
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
-        $table->add_field('hashcode', XMLDB_TYPE_CHAR, '40', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('questionid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('subqid', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('aid', XMLDB_TYPE_CHAR, '100', null, null, null, null);
-        $table->add_field('response', XMLDB_TYPE_TEXT, null, null, null, null, null);
-        $table->add_field('rcount', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
-        $table->add_field('credit', XMLDB_TYPE_NUMBER, '15, 5', null, XMLDB_NOTNULL, null, null);
-
-        // Adding keys to table question_response_analysis.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-
-        // Conditionally launch create table for question_response_analysis.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013092000.01);
-    }
-
-    if ($oldversion < 2013092001.01) {
-        // Force uninstall of deleted tool.
-        if (!file_exists("$CFG->dirroot/$CFG->admin/tool/bloglevelupgrade")) {
-            // Remove capabilities.
-            capabilities_cleanup('tool_bloglevelupgrade');
-            // Remove all other associated config.
-            unset_all_config_for_plugin('tool_bloglevelupgrade');
-        }
-        upgrade_main_savepoint(true, 2013092001.01);
-    }
-
-    if ($oldversion < 2013092001.02) {
-        // Define field version to be dropped from modules.
-        $table = new xmldb_table('modules');
-        $field = new xmldb_field('version');
-
-        // Conditionally launch drop field version.
-        if ($dbman->field_exists($table, $field)) {
-            // Migrate all plugin version info to config_plugins table.
-            $modules = $DB->get_records('modules');
-            foreach ($modules as $module) {
-                set_config('version', $module->version, 'mod_'.$module->name);
-            }
-            unset($modules);
-
-            $dbman->drop_field($table, $field);
-        }
-
-        // Define field version to be dropped from block.
-        $table = new xmldb_table('block');
-        $field = new xmldb_field('version');
-
-        // Conditionally launch drop field version.
-        if ($dbman->field_exists($table, $field)) {
-            $blocks = $DB->get_records('block');
-            foreach ($blocks as $block) {
-                set_config('version', $block->version, 'block_'.$block->name);
-            }
-            unset($blocks);
-
-            $dbman->drop_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013092001.02);
-    }
-
-    if ($oldversion < 2013092700.01) {
-
-        $table = new xmldb_table('files');
-
-        // Define field referencelastsync to be dropped from files.
-        $field = new xmldb_field('referencelastsync');
-
-        // Conditionally launch drop field referencelastsync.
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        // Define field referencelifetime to be dropped from files.
-        $field = new xmldb_field('referencelifetime');
-
-        // Conditionally launch drop field referencelifetime.
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013092700.01);
-    }
-
-    if ($oldversion < 2013100400.01) {
-        // Add user_devices core table.
-
-        // Define field id to be added to user_devices.
-        $table = new xmldb_table('user_devices');
-
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null);
-        $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'id');
-        $table->add_field('appid', XMLDB_TYPE_CHAR, '128', null, XMLDB_NOTNULL, null, null, 'userid');
-        $table->add_field('name', XMLDB_TYPE_CHAR, '32', null, XMLDB_NOTNULL, null, null, 'appid');
-        $table->add_field('model', XMLDB_TYPE_CHAR, '32', null, XMLDB_NOTNULL, null, null, 'name');
-        $table->add_field('platform', XMLDB_TYPE_CHAR, '32', null, XMLDB_NOTNULL, null, null, 'model');
-        $table->add_field('version', XMLDB_TYPE_CHAR, '32', null, XMLDB_NOTNULL, null, null, 'platform');
-        $table->add_field('pushid', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'version');
-        $table->add_field('uuid', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'pushid');
-        $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'uuid');
-        $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, 'timecreated');
-
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('pushid-userid', XMLDB_KEY_UNIQUE, array('pushid', 'userid'));
-        $table->add_key('pushid-platform', XMLDB_KEY_UNIQUE, array('pushid', 'platform'));
-        $table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
-
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013100400.01);
-    }
-
-    if ($oldversion < 2013100800.00) {
-
-        // Define field maxfraction to be added to question_attempts.
-        $table = new xmldb_table('question_attempts');
-        $field = new xmldb_field('maxfraction', XMLDB_TYPE_NUMBER, '12, 7', null, XMLDB_NOTNULL, null, '1', 'minfraction');
-
-        // Conditionally launch add field maxfraction.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013100800.00);
-    }
-
-    if ($oldversion < 2013100800.01) {
-        // Create a new 'user_password_resets' table.
-        $table = new xmldb_table('user_password_resets');
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null);
-        $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, null);
-        $table->add_field('timerequested', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, null);
-        $table->add_field('timererequested', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, 0, null);
-        $table->add_field('token', XMLDB_TYPE_CHAR, '32', null, XMLDB_NOTNULL, null, null, null);
-
-        // Adding keys to table.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('fk_userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
-
-        // Conditionally launch create table.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-        upgrade_main_savepoint(true, 2013100800.01);
-    }
-
-    if ($oldversion < 2013100800.02) {
-        $sql = "INSERT INTO {user_preferences}(userid, name, value)
-                SELECT id, 'htmleditor', 'textarea' FROM {user} u where u.htmleditor = 0";
-        $DB->execute($sql);
-
-        // Define field htmleditor to be dropped from user
-        $table = new xmldb_table('user');
-        $field = new xmldb_field('htmleditor');
-
-        // Conditionally launch drop field requested
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013100800.02);
-    }
-
-    if ($oldversion < 2013100900.00) {
-
-        // Define field lifetime to be dropped from files_reference.
-        $table = new xmldb_table('files_reference');
-        $field = new xmldb_field('lifetime');
-
-        // Conditionally launch drop field lifetime.
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013100900.00);
-    }
-
-    if ($oldversion < 2013100901.00) {
-        // Fixing possible wrong MIME type for Java Network Launch Protocol (JNLP) files.
-        $select = $DB->sql_like('filename', '?', false);
-        $DB->set_field_select(
-            'files',
-            'mimetype',
-            'application/x-java-jnlp-file',
-            $select,
-            array('%.jnlp')
-        );
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013100901.00);
-    }
-
-    if ($oldversion < 2013102100.00) {
-        // Changing default value for the status of a course backup.
-        $table = new xmldb_table('backup_courses');
-        $field = new xmldb_field('laststatus', XMLDB_TYPE_CHAR, '1', null, XMLDB_NOTNULL, null, '5', 'lastendtime');
-
-        // Launch change of precision for field value
-        $dbman->change_field_precision($table, $field);
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013102100.00);
-    }
-
-    if ($oldversion < 2013102201.00) {
-        $params = array('plugin' => 'editor_atto', 'name' => 'version');
-        $attoversion = $DB->get_record('config_plugins',
-                                       $params,
-                                       'value',
-                                       IGNORE_MISSING);
-
-        if ($attoversion) {
-            $attoversion = floatval($attoversion->value);
-        }
-        // Only these versions that were part of 2.6 beta should be removed.
-        // Manually installed versions of 2.5 - or later releases for 2.6 installed
-        // via the plugins DB should not be uninstalled.
-        if ($attoversion && $attoversion > 2013051500.00 && $attoversion < 2013102201.00) {
-            // Remove all other associated config.
-            unset_all_config_for_plugin('editor_atto');
-            unset_all_config_for_plugin('atto_bold');
-            unset_all_config_for_plugin('atto_clear');
-            unset_all_config_for_plugin('atto_html');
-            unset_all_config_for_plugin('atto_image');
-            unset_all_config_for_plugin('atto_indent');
-            unset_all_config_for_plugin('atto_italic');
-            unset_all_config_for_plugin('atto_link');
-            unset_all_config_for_plugin('atto_media');
-            unset_all_config_for_plugin('atto_orderedlist');
-            unset_all_config_for_plugin('atto_outdent');
-            unset_all_config_for_plugin('atto_strike');
-            unset_all_config_for_plugin('atto_title');
-            unset_all_config_for_plugin('atto_underline');
-            unset_all_config_for_plugin('atto_unlink');
-            unset_all_config_for_plugin('atto_unorderedlist');
-
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013102201.00);
-    }
-
-    if ($oldversion < 2013102500.01) {
-        // Find all fileareas that have missing root folder entry and add the root folder entry.
-        if (empty($CFG->filesrootrecordsfixed)) {
-            upgrade_fix_missing_root_folders();
-            // To skip running the same script on the upgrade to the next major release.
-            set_config('filesrootrecordsfixed', 1);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013102500.01);
-    }
-
-    if ($oldversion < 2013110500.01) {
-        // MDL-38228. Corrected course_modules upgrade script instead of 2013021801.01.
-
-        // This upgrade script fixes the mismatches between DB fields course_modules.section
-        // and course_sections.sequence. It makes sure that each module is included
-        // in the sequence of at least one section.
-        // There is also a separate script for admins: admin/cli/fix_course_sortorder.php
-
-        // This script in included in each major version upgrade process so make sure we don't run it twice.
-        if (empty($CFG->movingmoduleupgradescriptwasrun)) {
-            upgrade_course_modules_sequences();
-
-            // To skip running the same script on the upgrade to the next major release.
-            set_config('movingmoduleupgradescriptwasrun', 1);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013110500.01);
-    }
-
-    if ($oldversion < 2013110600.01) {
-
-        if (!file_exists($CFG->dirroot . '/theme/mymobile')) {
-            // Replace the mymobile settings.
-            $DB->set_field('course', 'theme', 'clean', array('theme' => 'mymobile'));
-            $DB->set_field('course_categories', 'theme', 'clean', array('theme' => 'mymobile'));
-            $DB->set_field('user', 'theme', 'clean', array('theme' => 'mymobile'));
-            $DB->set_field('mnet_host', 'theme', 'clean', array('theme' => 'mymobile'));
-
-            // Replace the theme configs.
-            if (get_config('core', 'theme') === 'mymobile') {
-                set_config('theme', 'clean');
-            }
-            if (get_config('core', 'thememobile') === 'mymobile') {
-                set_config('thememobile', 'clean');
-            }
-            if (get_config('core', 'themelegacy') === 'mymobile') {
-                set_config('themelegacy', 'clean');
-            }
-            if (get_config('core', 'themetablet') === 'mymobile') {
-                set_config('themetablet', 'clean');
-            }
-
-            // Hacky emulation of plugin uninstallation.
-            unset_all_config_for_plugin('theme_mymobile');
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013110600.01);
-    }
-
-    if ($oldversion < 2013110600.02) {
-
-        // If the user is logged in, we ensure that the alternate name fields are present
-        // in the session. It will not be the case when upgrading from 2.5 downwards.
-        if (!empty($USER->id)) {
-            $refreshuser = $DB->get_record('user', array('id' => $USER->id));
-            $fields = array('firstnamephonetic', 'lastnamephonetic', 'middlename', 'alternatename', 'firstname', 'lastname');
-            foreach ($fields as $field) {
-                $USER->{$field} = $refreshuser->{$field};
-            }
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013110600.02);
-    }
-
-    // Moodle v2.6.0 release upgrade line.
-    // Put any upgrade step following this.
-    if ($oldversion < 2013111800.01) {
-
-        // Delete notes of deleted courses.
-        $sql = "DELETE FROM {post}
-                 WHERE NOT EXISTS (SELECT {course}.id FROM {course}
-                                    WHERE {course}.id = {post}.courseid)
-                       AND {post}.module = ?";
-        $DB->execute($sql, array('notes'));
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013111800.01);
-    }
-
-    if ($oldversion < 2013122400.01) {
-        // Purge stored passwords from config_log table, ideally this should be in each plugin
-        // but that would complicate backporting...
-        $items = array(
-            'core/cronremotepassword', 'core/proxypassword', 'core/smtppass', 'core/jabberpassword',
-            'enrol_database/dbpass', 'enrol_ldap/bind_pw', 'url/secretphrase');
-        foreach ($items as $item) {
-            list($plugin, $name) = explode('/', $item);
-            $sqlcomparevalue =  $DB->sql_compare_text('value');
-            $sqlcompareoldvalue = $DB->sql_compare_text('oldvalue');
-            if ($plugin === 'core') {
-                $sql = "UPDATE {config_log}
-                           SET value = :value
-                         WHERE name = :name AND plugin IS NULL AND $sqlcomparevalue <> :empty";
-                $params = array('value' => '********', 'name' => $name, 'empty' => '');
-                $DB->execute($sql, $params);
-
-                $sql = "UPDATE {config_log}
-                           SET oldvalue = :value
-                         WHERE name = :name AND plugin IS NULL AND $sqlcompareoldvalue <> :empty";
-                $params = array('value' => '********', 'name' => $name, 'empty' => '');
-                $DB->execute($sql, $params);
-
-            } else {
-                $sql = "UPDATE {config_log}
-                           SET value = :value
-                         WHERE name = :name AND plugin = :plugin AND $sqlcomparevalue <> :empty";
-                $params = array('value' => '********', 'name' => $name, 'plugin' => $plugin, 'empty' => '');
-                $DB->execute($sql, $params);
-
-                $sql = "UPDATE {config_log}
-                           SET oldvalue = :value
-                         WHERE name = :name AND plugin = :plugin AND  $sqlcompareoldvalue <> :empty";
-                $params = array('value' => '********', 'name' => $name, 'plugin' => $plugin, 'empty' => '');
-                $DB->execute($sql, $params);
-            }
-        }
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2013122400.01);
-    }
-
-    if ($oldversion < 2014011000.01) {
-
-        // Define table cache_text to be dropped.
-        $table = new xmldb_table('cache_text');
-
-        // Conditionally launch drop table for cache_text.
-        if ($dbman->table_exists($table)) {
-            $dbman->drop_table($table);
-        }
-
-        unset_config('cachetext');
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014011000.01);
-    }
-
-    if ($oldversion < 2014011701.00) {
-        // Fix gradebook sortorder duplicates.
-        upgrade_grade_item_fix_sortorder();
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014011701.00);
-    }
-
-    if ($oldversion < 2014012300.01) {
-        // Remove deleted users home pages.
-        $sql = "DELETE FROM {my_pages}
-                WHERE EXISTS (SELECT {user}.id
-                                  FROM {user}
-                                  WHERE {user}.id = {my_pages}.userid
-                                  AND {user}.deleted = 1)
-                AND {my_pages}.private = 1";
-        $DB->execute($sql);
-
-        // Reached main savepoint.
-        upgrade_main_savepoint(true, 2014012300.01);
-    }
-
-    if ($oldversion < 2014012400.00) {
-        // Define table lock_db to be created.
-        $table = new xmldb_table('lock_db');
-
-        // Adding fields to table lock_db.
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
-        $table->add_field('resourcekey', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('expires', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
-        $table->add_field('owner', XMLDB_TYPE_CHAR, '36', null, null, null, null);
-
-        // Adding keys to table lock_db.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-
-        // Adding indexes to table lock_db.
-        $table->add_index('resourcekey_uniq', XMLDB_INDEX_UNIQUE, array('resourcekey'));
-        $table->add_index('expires_idx', XMLDB_INDEX_NOTUNIQUE, array('expires'));
-        $table->add_index('owner_idx', XMLDB_INDEX_NOTUNIQUE, array('owner'));
-
-        // Conditionally launch create table for lock_db.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014012400.00);
-    }
-
-    if ($oldversion < 2014021300.01) {
-        // Delete any cached stats to force recalculation later, then we can be sure that cached records will have the correct
-        // field.
-        $DB->delete_records('question_response_analysis');
-        $DB->delete_records('question_statistics');
-        $DB->delete_records('quiz_statistics');
-
-        // Define field variant to be added to question_statistics.
-        $table = new xmldb_table('question_statistics');
-        $field = new xmldb_field('variant', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'subquestion');
-
-        // Conditionally launch add field variant.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014021300.01);
-    }
-
-    if ($oldversion < 2014021300.02) {
-
-        // Define field variant to be added to question_response_analysis.
-        $table = new xmldb_table('question_response_analysis');
-        $field = new xmldb_field('variant', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'questionid');
-
-        // Conditionally launch add field variant.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014021300.02);
-    }
-
-    if ($oldversion < 2014021800.00) {
-
-        // Define field queued to be added to portfolio_tempdata.
-        $table = new xmldb_table('portfolio_tempdata');
-        $field = new xmldb_field('queued', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'instance');
-
-        // Conditionally launch add field queued.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014021800.00);
-    }
-
-    if ($oldversion < 2014021900.01) {
-        // Force uninstall of deleted tool.
-
-        // Normally, in this sort of situation, we would do a file_exists check,
-        // in case the plugin had been added back as an add-on. However, this
-        // plugin is completely useless after Moodle 2.6, so we check that the
-        // files have been removed in upgrade_stale_php_files_present, and we
-        // uninstall it unconditionally here.
-
-        // Remove all associated config.
-        unset_all_config_for_plugin('tool_qeupgradehelper');
-
-        upgrade_main_savepoint(true, 2014021900.01);
-    }
-
-    if ($oldversion < 2014021900.02) {
-
-        // Define table question_states to be dropped.
-        $table = new xmldb_table('question_states');
-
-        // Conditionally launch drop table for question_states.
-        if ($dbman->table_exists($table)) {
-            $dbman->drop_table($table);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014021900.02);
-    }
-
-    if ($oldversion < 2014021900.03) {
-
-        // Define table question_sessions to be dropped.
-        $table = new xmldb_table('question_sessions');
-
-        // Conditionally launch drop table for question_sessions.
-        if ($dbman->table_exists($table)) {
-            $dbman->drop_table($table);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014021900.03);
-    }
-
-    if ($oldversion < 2014022600.00) {
-        $table = new xmldb_table('task_scheduled');
-
-        // Adding fields to table task_scheduled.
-        $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('classname', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('lastruntime', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
-        $table->add_field('nextruntime', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
-        $table->add_field('blocking', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0');
-        $table->add_field('minute', XMLDB_TYPE_CHAR, '25', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('hour', XMLDB_TYPE_CHAR, '25', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('day', XMLDB_TYPE_CHAR, '25', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('month', XMLDB_TYPE_CHAR, '25', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('dayofweek', XMLDB_TYPE_CHAR, '25', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('faildelay', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
-        $table->add_field('customised', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0');
-        $table->add_field('disabled', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0');
-
-        // Adding keys to table task_scheduled.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-
-        // Adding indexes to table task_scheduled.
-        $table->add_index('classname_uniq', XMLDB_INDEX_UNIQUE, array('classname'));
-
-        // Conditionally launch create table for task_scheduled.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Define table task_adhoc to be created.
-        $table = new xmldb_table('task_adhoc');
-
-        // Adding fields to table task_adhoc.
-        $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('classname', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('nextruntime', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('faildelay', XMLDB_TYPE_INTEGER, '10', null, null, null, null);
-        $table->add_field('customdata', XMLDB_TYPE_TEXT, null, null, null, null, null);
-        $table->add_field('blocking', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0');
-
-        // Adding keys to table task_adhoc.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-
-        // Adding indexes to table task_adhoc.
-        $table->add_index('nextruntime_idx', XMLDB_INDEX_NOTUNIQUE, array('nextruntime'));
-
-        // Conditionally launch create table for task_adhoc.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014022600.00);
-    }
-
-    if ($oldversion < 2014031400.02) {
-        // Delete any cached stats to force recalculation later, then we can be sure that cached records will have the correct
-        // field.
-        $DB->delete_records('question_response_analysis');
-        $DB->delete_records('question_statistics');
-        $DB->delete_records('quiz_statistics');
-
-        // Define field response to be dropped from question_response_analysis.
-        $table = new xmldb_table('question_response_analysis');
-        $field = new xmldb_field('rcount');
-
-        // Conditionally launch drop field response.
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014031400.02);
-    }
-
-    if ($oldversion < 2014031400.03) {
-
-        // Define table question_response_count to be created.
-        $table = new xmldb_table('question_response_count');
-
-        // Adding fields to table question_response_count.
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
-        $table->add_field('analysisid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('try', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-        $table->add_field('rcount', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
-
-        // Adding keys to table question_response_count.
-        $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->add_key('analysisid', XMLDB_KEY_FOREIGN, array('analysisid'), 'question_response_analysis', array('id'));
-
-        // Conditionally launch create table for question_response_count.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014031400.03);
-    }
-
-    if ($oldversion < 2014031400.04) {
-
-        // Define field whichtries to be added to question_response_analysis.
-        $table = new xmldb_table('question_response_analysis');
-        $field = new xmldb_field('whichtries', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'hashcode');
-
-        // Conditionally launch add field whichtries.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014031400.04);
-    }
-
-    if ($oldversion < 2014032600.00) {
-        // Removing the themes from core.
-        $themes = array('afterburner', 'anomaly', 'arialist', 'binarius', 'boxxie', 'brick', 'formal_white', 'formfactor',
-            'fusion', 'leatherbound', 'magazine', 'nimble', 'nonzero', 'overlay', 'serenity', 'sky_high', 'splash',
-            'standard', 'standardold');
-
-        foreach ($themes as $key => $theme) {
-            if (check_dir_exists($CFG->dirroot . '/theme/' . $theme, false)) {
-                // Ignore the themes that have been re-downloaded.
-                unset($themes[$key]);
-            }
-        }
-
-        // Check we actually have themes to remove.
-        if (count($themes) > 0) {
-
-            // Replace the theme configs.
-            if (in_array(get_config('core', 'theme'), $themes)) {
-                set_config('theme', 'clean');
-            }
-            if (in_array(get_config('core', 'thememobile'), $themes)) {
-                set_config('thememobile', 'clean');
-            }
-            if (in_array(get_config('core', 'themelegacy'), $themes)) {
-                set_config('themelegacy', 'clean');
-            }
-            if (in_array(get_config('core', 'themetablet'), $themes)) {
-                set_config('themetablet', 'clean');
-            }
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014032600.00);
-    }
-
-    if ($oldversion < 2014032600.02) {
-        // Add new fields to the 'tag_instance' table.
-        $table = new xmldb_table('tag_instance');
-        $field = new xmldb_field('component', XMLDB_TYPE_CHAR, '100', null, false, null, null, 'tagid');
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        $field = new xmldb_field('contextid', XMLDB_TYPE_INTEGER, '10', null, false, null, null, 'itemid');
-        // Define the 'contextid' foreign key to be added to the tag_instance table.
-        $key = new xmldb_key('contextid', XMLDB_KEY_FOREIGN, array('contextid'), 'context', array('id'));
-        if ($dbman->field_exists($table, $field)) {
-            $dbman->drop_key($table, $key);
-            $DB->set_field('tag_instance', 'contextid', null, array('contextid' => 0));
-            $dbman->change_field_default($table, $field);
-        } else {
-            $dbman->add_field($table, $field);
-        }
-        $dbman->add_key($table, $key);
-
-        $field = new xmldb_field('timecreated', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'ordering');
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        $sql = "UPDATE {tag_instance}
-                   SET timecreated = timemodified";
-        $DB->execute($sql);
-
-        // Update all the course tags.
-        $sql = "UPDATE {tag_instance}
-                   SET component = 'core',
-                       contextid = (SELECT ctx.id
-                                      FROM {context} ctx
-                                     WHERE ctx.contextlevel = :contextlevel
-                                       AND ctx.instanceid = {tag_instance}.itemid)
-                 WHERE itemtype = 'course' AND contextid IS NULL";
-        $DB->execute($sql, array('contextlevel' => CONTEXT_COURSE));
-
-        // Update all the user tags.
-        $sql = "UPDATE {tag_instance}
-                   SET component = 'core',
-                       contextid = (SELECT ctx.id
-                                      FROM {context} ctx
-                                     WHERE ctx.contextlevel = :contextlevel
-                                       AND ctx.instanceid = {tag_instance}.itemid)
-                 WHERE itemtype = 'user' AND contextid IS NULL";
-        $DB->execute($sql, array('contextlevel' => CONTEXT_USER));
-
-        // Update all the blog post tags.
-        $sql = "UPDATE {tag_instance}
-                   SET component = 'core',
-                       contextid = (SELECT ctx.id
-                                      FROM {context} ctx
-                                      JOIN {post} p
-                                        ON p.userid = ctx.instanceid
-                                     WHERE ctx.contextlevel = :contextlevel
-                                       AND p.id = {tag_instance}.itemid)
-                 WHERE itemtype = 'post' AND contextid IS NULL";
-        $DB->execute($sql, array('contextlevel' => CONTEXT_USER));
-
-        // Update all the wiki page tags.
-        $sql = "UPDATE {tag_instance}
-                   SET component = 'mod_wiki',
-                       contextid = (SELECT ctx.id
-                                      FROM {context} ctx
-                                      JOIN {course_modules} cm
-                                        ON cm.id = ctx.instanceid
-                                      JOIN {modules} m
-                                        ON m.id = cm.module
-                                      JOIN {wiki} w
-                                        ON w.id = cm.instance
-                                      JOIN {wiki_subwikis} sw
-                                        ON sw.wikiid = w.id
-                                      JOIN {wiki_pages} wp
-                                        ON wp.subwikiid = sw.id
-                                     WHERE m.name = 'wiki'
-                                       AND ctx.contextlevel = :contextlevel
-                                       AND wp.id = {tag_instance}.itemid)
-                 WHERE itemtype = 'wiki_pages' AND contextid IS NULL";
-        $DB->execute($sql, array('contextlevel' => CONTEXT_MODULE));
-
-        // Update all the question tags.
-        $sql = "UPDATE {tag_instance}
-                   SET component = 'core_question',
-                       contextid = (SELECT qc.contextid
-                                      FROM {question} q
-                                      JOIN {question_categories} qc
-                                        ON q.category = qc.id
-                                     WHERE q.id = {tag_instance}.itemid)
-                 WHERE itemtype = 'question' AND contextid IS NULL";
-        $DB->execute($sql);
-
-        // Update all the tag tags.
-        $sql = "UPDATE {tag_instance}
-                   SET component = 'core',
-                       contextid = :systemcontext
-                 WHERE itemtype = 'tag' AND contextid IS NULL";
-        $DB->execute($sql, array('systemcontext' => context_system::instance()->id));
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014032600.02);
-    }
-
-    if ($oldversion < 2014032700.01) {
-
-        // Define field disabled to be added to task_scheduled.
-        $table = new xmldb_table('task_scheduled');
-        $field = new xmldb_field('disabled', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'customised');
-
-        // Conditionally launch add field disabled.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014032700.01);
-    }
-
-    if ($oldversion < 2014032700.02) {
-
-        // Update displayloginfailures setting.
-        if (empty($CFG->displayloginfailures)) {
-            set_config('displayloginfailures', 0);
-        } else {
-            set_config('displayloginfailures', 1);
-        }
-
-        // Main savepoint reached.
-        upgrade_main_savepoint(true, 2014032700.02);
-    }
-
-    if ($oldversion < 2014040800.00) {
-
-        // Define field availability to be added to course_modules.
-        $table = new xmldb_table('course_modules');
-        $field = new xmldb_field('availability', XMLDB_TYPE_TEXT, null, null, null, null, null, 'showdescription');
-
-        // Conditionally launch add field availability.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Define field availability to be added to course_sections.
-        $table = new xmldb_table('course_sections');
-        $field = new xmldb_field('availability', XMLDB_TYPE_TEXT, null, null, null, null, null, 'groupingid');
-
-        // Conditionally launch add field availability.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Update existing conditions to new format. This could be a slow
-        // process, so begin by counting the number of affected modules/sections.
-        // (Performance: On the OU system, these took ~0.3 seconds, with about
-        // 20,000 results out of about 400,000 total rows in those tables.)
-        $cmcount = $DB->count_records_sql("
-                SELECT COUNT(1)
-                  FROM {course_modules} cm
-                 WHERE cm.availablefrom != 0 OR
-                       cm.availableuntil != 0 OR
-                       EXISTS (SELECT 1 FROM {course_modules_availability} WHERE coursemoduleid = cm.id) OR
-                       EXISTS (SELECT 1 FROM {course_modules_avail_fields} WHERE coursemoduleid = cm.id)");
-        $sectcount = $DB->count_records_sql("
-                SELECT COUNT(1)
-                  FROM {course_sections} cs
-                 WHERE cs.groupingid != 0 OR
-                       cs.availablefrom != 0 OR
-                       cs.availableuntil != 0 OR
-                       EXISTS (SELECT 1 FROM {course_sections_availability} WHERE coursesectionid = cs.id) OR
-                       EXISTS (SELECT 1 FROM {course_sections_avail_fields} WHERE coursesectionid = cs.id)");
-
-        if ($cmcount + $sectcount > 0) {
-            // Show progress bar and start db transaction.
-            $transaction = $DB->start_delegated_transaction();
-            $pbar = new progress_bar('availupdate', 500, true);
-
-            // Loop through all course-modules.
-            // (Performance: On the OU system, the query took <1 second for ~20k
-            // results; updating all those entries took ~3 minutes.)
-            $done = 0;
-            $lastupdate = 0;
-            $rs = $DB->get_recordset_sql("
-                    SELECT cm.id, cm.availablefrom, cm.availableuntil, cm.showavailability,
-                           COUNT(DISTINCT cma.id) AS availcount,
-                           COUNT(DISTINCT cmf.id) AS fieldcount
-                      FROM {course_modules} cm
-                           LEFT JOIN {course_modules_availability} cma ON cma.coursemoduleid = cm.id
-                           LEFT JOIN {course_modules_avail_fields} cmf ON cmf.coursemoduleid = cm.id
-                     WHERE cm.availablefrom != 0 OR
-                           cm.availableuntil != 0 OR
-                           cma.id IS NOT NULL OR
-                           cmf.id IS NOT NULL
-                  GROUP BY cm.id, cm.availablefrom, cm.availableuntil, cm.showavailability");
-            foreach ($rs as $rec) {
-                // Update progress initially and then once per second.
-                if (time() != $lastupdate) {
-                    $lastupdate = time();
-                    $pbar->update($done, $cmcount + $sectcount,
-                            "Updating activity availability settings ($done/$cmcount)");
-                }
-
-                // Get supporting records - only if there are any (to reduce the
-                // number of queries where just date/group is used).
-                if ($rec->availcount) {
-                    $availrecs = $DB->get_records('course_modules_availability',
-                            array('coursemoduleid' => $rec->id));
-                } else {
-                    $availrecs = array();
-                }
-     &n