diff --git a/admin/cli/fix_course_sequence.php b/admin/cli/fix_course_sequence.php new file mode 100644 index 00000000000..b825422302f --- /dev/null +++ b/admin/cli/fix_course_sequence.php @@ -0,0 +1,125 @@ +. + +/** + * This script fixed incorrectly deleted users. + * + * @package core + * @subpackage cli + * @copyright 2013 Marina Glancy + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +define('CLI_SCRIPT', true); + +require(__DIR__.'/../../config.php'); +require_once($CFG->libdir.'/clilib.php'); + +// Get cli options. +list($options, $unrecognized) = cli_get_params( + array( + 'courses' => false, + 'fix' => false, + 'help' => false + ), + array( + 'h' => 'help', + 'c' => 'courses', + 'f' => 'fix' + ) +); + +if ($options['help'] || empty($options['courses'])) { + $help = +"Checks and fixes that course modules and sections reference each other correctly. + +Compares DB fields course_sections.sequence and course_modules.section +checking that: +- course_sections.sequence contains each module id not more than once in the course +- for each moduleid from course_sections.sequence the field course_modules.section + refers to the same section id (this means course_sections.sequence is more + important if they are different) +- each module in the course is present in one of course_sections.sequence +- section sequences do not contain non-existing course modules + +If there are any mismatches, the message is displayed. If --fix is specified, +the records in DB are corrected. + +This script may run for a long time on big systems if called for all courses. + +Avoid executing the script when another user may simultaneously edit any of the +courses being checked (recommended to run in mainenance mode). + +Options: +-c, --courses List courses that need to be checked (comma-separated + values or * for all). Required +-f, --fix Fix the mismatches in DB. If not specified check only and + report problems to STDERR +-h, --help Print out this help + +Example: +\$sudo -u www-data /usr/bin/php admin/cli/fix_course_sequence.php --courses=* +\$sudo -u www-data /usr/bin/php admin/cli/fix_course_sequence.php --courses=2,3,4 --fix +"; + + echo $help; + die; +} + +$courseslist = preg_split('/\s*,\s*/', $options['courses'], -1, PREG_SPLIT_NO_EMPTY); +if (in_array('*', $courseslist)) { + $where = ''; + $params = array(); +} else { + list($sql, $params) = $DB->get_in_or_equal($courseslist, SQL_PARAMS_NAMED, 'id'); + $where = 'WHERE id '. $sql; +} +$coursescount = $DB->get_field_sql('SELECT count(id) FROM {course} '. $where, $params); + +if (!$coursescount) { + cli_error('No courses found'); +} +echo "Checking $coursescount courses...\n\n"; + +require_once($CFG->dirroot. '/course/lib.php'); + +$problems = array(); +$courses = $DB->get_fieldset_sql('SELECT id FROM {course} '. $where, $params); +foreach ($courses as $courseid) { + $errors = course_integrity_check($courseid, null, null, true, empty($options['fix'])); + if ($errors) { + if (!empty($options['fix'])) { + // Reset the course cache to make sure cache is recalculated next time the course is viewed. + rebuild_course_cache($courseid, true); + } + foreach ($errors as $error) { + cli_problem($error); + } + $problems[] = $courseid; + } else { + echo "Course [$courseid] is OK\n"; + } +} +if (!count($problems)) { + echo "\n...All courses are OK\n"; +} else { + if (!empty($options['fix'])) { + echo "\n...Found and fixed ".count($problems)." courses with problems". "\n"; + } else { + echo "\n...Found ".count($problems)." courses with problems. To fix run:\n"; + echo "\$sudo -u www-data /usr/bin/php admin/cli/fix_course_sequence.php --courses=".join(',', $problems)." --fix". "\n"; + } +} \ No newline at end of file diff --git a/admin/index.php b/admin/index.php index 466832c5357..1f186b6417a 100644 --- a/admin/index.php +++ b/admin/index.php @@ -66,6 +66,16 @@ if (empty($_GET['cache']) and empty($_POST['cache']) and empty($_GET['sesskey']) } require('../config.php'); + +// Invalidate the cache of version.php in any circumstances to help core_component +// detecting if the version has changed and component cache should be reset. +if (function_exists('opcache_invalidate')) { + opcache_invalidate($CFG->dirroot . '/version.php', true); +} +// Make sure the component cache gets rebuilt if necessary, any method that +// indirectly calls the protected init() method is good here. +core_component::get_core_subsystems(); + require_once($CFG->libdir.'/adminlib.php'); // various admin-only functions require_once($CFG->libdir.'/upgradelib.php'); // general upgrade/install related functions require_once($CFG->libdir.'/pluginlib.php'); // available updates notifications diff --git a/admin/modules.php b/admin/modules.php index 8eab4bc50a6..c8f69d45f37 100644 --- a/admin/modules.php +++ b/admin/modules.php @@ -43,14 +43,13 @@ SET visibleold=visible, visible=0 WHERE module=?"; $DB->execute($sql, array($module->id)); - // clear the course modinfo cache for courses - // where we just uninstalld something - $sql = "UPDATE {course} - SET modinfo='' - WHERE id IN (SELECT DISTINCT course + // Increment course.cacherev for courses where we just made something invisible. + // This will force cache rebuilding on the next request. + increment_revision_number('course', 'cacherev', + "id IN (SELECT DISTINCT course FROM {course_modules} - WHERE visibleold=1 AND module=?)"; - $DB->execute($sql, array($module->id)); + WHERE visibleold=1 AND module=?)", + array($module->id)); admin_get_root(true, false); // settings not required - only pages } @@ -60,14 +59,13 @@ } $DB->set_field("modules", "visible", "1", array("id"=>$module->id)); // Show main module $DB->set_field('course_modules', 'visible', '1', array('visibleold'=>1, 'module'=>$module->id)); // Get the previous saved visible state for the course module. - // clear the course modinfo cache for courses - // where we just made something visible - $sql = "UPDATE {course} - SET modinfo = '' - WHERE id IN (SELECT DISTINCT course + // Increment course.cacherev for courses where we just made something visible. + // This will force cache rebuilding on the next request. + increment_revision_number('course', 'cacherev', + "id IN (SELECT DISTINCT course FROM {course_modules} - WHERE visible=1 AND module=?)"; - $DB->execute($sql, array($module->id)); + WHERE visible=1 AND module=?)", + array($module->id)); admin_get_root(true, false); // settings not required - only pages } diff --git a/admin/settings/badges.php b/admin/settings/badges.php index 10994fcb086..276582c3ccc 100644 --- a/admin/settings/badges.php +++ b/admin/settings/badges.php @@ -32,6 +32,7 @@ if (($hassiteconfig || has_any_capability(array( 'moodle/badges:createbadge', 'moodle/badges:manageglobalsettings', 'moodle/badges:awardbadge', + 'moodle/badges:configurecriteria', 'moodle/badges:configuremessages', 'moodle/badges:configuredetails', 'moodle/badges:deletebadge'), $systemcontext))) { @@ -74,6 +75,7 @@ if (($hassiteconfig || has_any_capability(array( 'moodle/badges:viewawarded', 'moodle/badges:createbadge', 'moodle/badges:awardbadge', + 'moodle/badges:configurecriteria', 'moodle/badges:configuremessages', 'moodle/badges:configuredetails', 'moodle/badges:deletebadge' diff --git a/admin/tool/behat/lang/en/tool_behat.php b/admin/tool/behat/lang/en/tool_behat.php index 9f426cc6a01..a67581d7664 100644 --- a/admin/tool/behat/lang/en/tool_behat.php +++ b/admin/tool/behat/lang/en/tool_behat.php @@ -38,6 +38,7 @@ $string['stepsdefinitionscontains'] = 'Contains'; $string['stepsdefinitionsfilters'] = 'Steps definitions'; $string['stepsdefinitionstype'] = 'Type'; $string['theninfo'] = 'Then. Checkings to ensure the outcomes are the expected ones'; +$string['unknownexceptioninfo'] = 'There was a problem with Selenium or the browser, try to upgrade Selenium to the latest version. Error: '; $string['viewsteps'] = 'Filter'; $string['wheninfo'] = 'When. Actions that provokes an event'; $string['wrongbehatsetup'] = 'Something is wrong with behat setup, ensure: