Permalink
Browse files

Merge branch 'master' into install_master

  • Loading branch information...
2 parents 2c9ac05 + 83f26f6 commit a2c52dabefab5e57dbc84598ec46ddc0ea7b7c13 AMOS bot committed Sep 14, 2013
Showing 322 changed files with 7,295 additions and 3,238 deletions.
@@ -0,0 +1,125 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * This script 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";
+ }
+}
View
@@ -66,6 +66,16 @@
}
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
View
@@ -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
}
@@ -32,6 +32,7 @@
'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 @@
'moodle/badges:viewawarded',
'moodle/badges:createbadge',
'moodle/badges:awardbadge',
+ 'moodle/badges:configurecriteria',
'moodle/badges:configuremessages',
'moodle/badges:configuredetails',
'moodle/badges:deletebadge'
@@ -38,6 +38,7 @@
$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:<ul>
View
@@ -137,7 +137,7 @@ function loginpage_hook() {
// test pgtIou parameter for proxy mode (https connection
// in background from CAS server to the php server)
if ($authCAS != 'CAS' && !isset($_GET['pgtIou'])) {
- $PAGE->set_url('/auth/cas/auth.php');
+ $PAGE->set_url('/login/index.php');
$PAGE->navbar->add($CASform);
$PAGE->set_title("$site->fullname: $CASform");
$PAGE->set_heading($site->fullname);
@@ -35,13 +35,13 @@
$string['auth_dbfieldpass_key'] = 'Password field';
$string['auth_dbfielduser'] = 'Name of the field containing usernames';
$string['auth_dbfielduser_key'] = 'Username field';
-$string['auth_dbhost'] = 'The computer hosting the database server.';
+$string['auth_dbhost'] = 'The computer hosting the database server. Use a system DSN entry if using ODBC.';
$string['auth_dbhost_key'] = 'Host';
$string['auth_dbchangepasswordurl_key'] = 'Password-change URL';
$string['auth_dbinsertuser'] = 'Inserted user {$a->name} id {$a->id}';
$string['auth_dbinsertuserduplicate'] = 'Error inserting user {$a->username} - user with this username was already created through \'{$a->auth}\' plugin.';
$string['auth_dbinsertusererror'] = 'Error inserting user {$a}';
-$string['auth_dbname'] = 'Name of the database itself';
+$string['auth_dbname'] = 'Name of the database itself. Leave empty if using an ODBC DSN.';
$string['auth_dbname_key'] = 'DB name';
$string['auth_dbpass'] = 'Password matching the above username';
$string['auth_dbpass_key'] = 'Password';
View
@@ -766,26 +766,17 @@ function keepalive_client() {
}
$mnethostlogssql = "
SELECT
- mhostlogs.remoteid, mhostlogs.time, mhostlogs.userid, mhostlogs.ip,
- mhostlogs.course, mhostlogs.module, mhostlogs.cmid, mhostlogs.action,
- mhostlogs.url, mhostlogs.info, mhostlogs.username, c.fullname as coursename,
- c.modinfo
+ l.id as remoteid, l.time, l.userid, l.ip, l.course, l.module, l.cmid,
+ l.action, l.url, l.info, u.username
FROM
- (
- SELECT
- l.id as remoteid, l.time, l.userid, l.ip, l.course, l.module, l.cmid,
- l.action, l.url, l.info, u.username
- FROM
- {user} u
- INNER JOIN {log} l on l.userid = u.id
- WHERE
- u.mnethostid = ?
- AND l.id > ?
- ORDER BY remoteid ASC
- LIMIT 500
- ) mhostlogs
- INNER JOIN {course} c on c.id = mhostlogs.course
- ORDER by mhostlogs.remoteid ASC";
+ {user} u
+ INNER JOIN {log} l on l.userid = u.id
+ WHERE
+ u.mnethostid = ?
+ AND l.id > ?
+ AND l.course IS NOT NULL
+ ORDER by l.id ASC
+ LIMIT 500";
$mnethostlogs = $DB->get_records_sql($mnethostlogssql, array($mnethostid, $mnet_request->response['last log id']));
@@ -796,18 +787,18 @@ function keepalive_client() {
$processedlogs = array();
foreach($mnethostlogs as $hostlog) {
- // Extract the name of the relevant module instance from the
- // course modinfo if possible.
- if (!empty($hostlog->modinfo) && !empty($hostlog->cmid)) {
- $modinfo = unserialize($hostlog->modinfo);
- unset($hostlog->modinfo);
- $modulearray = array();
- foreach($modinfo as $module) {
- $modulearray[$module->cm] = $module->name;
+ try {
+ // Get impersonalised course information. If it is cached there will be no DB queries.
+ $modinfo = get_fast_modinfo($hostlog->course, -1);
+ $hostlog->coursename = $modinfo->get_course()->fullname;
+ if (!empty($hostlog->cmid) && isset($modinfo->cms[$hostlog->cmid])) {
+ $hostlog->resource_name = $modinfo->cms[$hostlog->cmid]->name;
+ } else {
+ $hostlog->resource_name = '';
}
- $hostlog->resource_name = $modulearray[$hostlog->cmid];
- } else {
- $hostlog->resource_name = '';
+ } catch (moodle_exception $e) {
+ // Course not found
+ continue;
}
$processedlogs[] = array (
@@ -363,6 +363,9 @@ public function execute_precheck($droptemptablesafter = false) {
if ($this->status != backup::STATUS_NEED_PRECHECK) {
throw new restore_controller_exception('cannot_precheck_wrong_status', $this->status);
}
+ // Basic/initial prevention against time/memory limits
+ set_time_limit(1 * 60 * 60); // 1 hour for 1 course initially granted
+ raise_memory_limit(MEMORY_EXTRA);
$this->precheck = restore_prechecks_helper::execute_prechecks($this, $droptemptablesafter);
if (!array_key_exists('errors', $this->precheck)) { // No errors, can be executed
$this->set_status(backup::STATUS_AWAITING);
View
@@ -43,7 +43,6 @@
}
}
-$outcome = $restore->process();
$heading = $course->fullname;
$PAGE->set_title($heading.': '.$restore->get_stage_name());
@@ -52,6 +51,15 @@
$renderer = $PAGE->get_renderer('core','backup');
echo $OUTPUT->header();
+
+// Prepare a progress bar which can display optionally during long-running
+// operations while setting up the UI.
+$slowprogress = new core_backup_display_progress_if_slow();
+// Depending on the code branch above, $restore may be a restore_ui or it may
+// be a restore_ui_independent_stage. Either way, this function exists.
+$restore->set_progress_reporter($slowprogress);
+$outcome = $restore->process();
+
if (!$restore->is_independent() && $restore->enforce_changed_dependencies()) {
debugging('Your settings have been altered due to unmet dependencies', DEBUG_DEVELOPER);
}
@@ -63,6 +63,7 @@
require_once($CFG->dirroot . '/backup/util/progress/core_backup_progress.class.php');
require_once($CFG->dirroot . '/backup/util/progress/core_backup_null_progress.class.php');
require_once($CFG->dirroot . '/backup/util/progress/core_backup_display_progress.class.php');
+require_once($CFG->dirroot . '/backup/util/progress/core_backup_display_progress_if_slow.class.php');
require_once($CFG->dirroot . '/backup/util/factories/backup_factory.class.php');
require_once($CFG->dirroot . '/backup/util/factories/restore_factory.class.php');
require_once($CFG->dirroot . '/backup/util/helper/backup_helper.class.php');
@@ -95,6 +95,11 @@ public function end_html() {
echo html_writer::end_div();
}
+ /**
+ * When progress is updated, updates the bar.
+ *
+ * @see core_backup_progress::update_progress()
+ */
public function update_progress() {
// If finished...
if (!$this->is_in_progress_section()) {
Oops, something went wrong.

0 comments on commit a2c52da

Please sign in to comment.