Merge branch 'MDL-35364_23' of git://github.com/timhunt/moodle into MOODLE_23_STABLE
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 24 Apr 2013 21:37:17 +0000 (23:37 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 24 Apr 2013 21:37:17 +0000 (23:37 +0200)
17 files changed:
grade/lib.php
lib/db/install.xml
lib/db/upgrade.php
lib/portfoliolib.php
mod/assign/locallib.php
mod/forum/view.php
mod/quiz/accessmanager.php
mod/quiz/accessrule/accessrulebase.php
mod/quiz/mod_form.php
mod/quiz/module.js
mod/quiz/settings.php
question/format/blackboard_six/format.php
question/format/gift/format.php
question/format/xml/format.php
repository/lib.php
repository/upload/lib.php
version.php

index a1e634b..dd7afbf 100644 (file)
@@ -2424,7 +2424,7 @@ abstract class grade_helper {
             return self::$managesetting;
         }
         $context = get_context_instance(CONTEXT_COURSE, $courseid);
-        if (has_capability('moodle/course:update', $context)) {
+        if (has_capability('moodle/grade:manage', $context)) {
             self::$managesetting = new grade_plugin_info('coursesettings', new moodle_url('/grade/edit/settings/index.php', array('id'=>$courseid)), get_string('course'));
         } else {
             self::$managesetting = false;
index 22835b2..1fc7e86 100644 (file)
       <KEYS>
         <KEY NAME="primary" TYPE="primary" FIELDS="id" COMMENT="primary key of the table, please edit me"/>
       </KEYS>
+      <INDEXES>
+        <INDEX NAME="unreadmessageid_idx" UNIQUE="false" FIELDS="unreadmessageid" COMMENT="Index on unreadmessage id"/>
+      </INDEXES>
     </TABLE>
     <TABLE NAME="files" COMMENT="description of files, content is stored in sha1 file pool" PREVIOUS="message_working" NEXT="files_reference">
       <FIELDS>
index f261807..04ae4e1 100644 (file)
@@ -1152,5 +1152,19 @@ function xmldb_main_upgrade($oldversion) {
         upgrade_main_savepoint(true, 2012062506.06);
     }
 
+    if ($oldversion < 2012062506.08) {
+        // 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, 2012062506.08);
+    }
+
     return true;
 }
index be531b1..7ee90d3 100644 (file)
@@ -1260,7 +1260,7 @@ function portfolio_rewrite_pluginfile_url_callback($contextid, $component, $file
         $filename = array_pop($bits);
         $filepath = implode('/', $bits);
     }
-    if (!$file = $fs->get_file($contextid, $component, $filearea, $itemid, $filepath, $filename)) {
+    if (!$file = $fs->get_file($contextid, $component, $filearea, $itemid, $filepath, urldecode($filename))) {
         debugging("Couldn't find a file from the embedded path info context $contextid component $component filearea $filearea itemid $itemid filepath $filepath name $filename");
         return $matches;
     }
index 8954ba9..0a5d8c4 100644 (file)
@@ -3123,7 +3123,7 @@ class assign {
         } else {
             $usergrade = '-';
             if (isset($gradinginfo->items[0]->grades[$userid]) &&
-                    !$grading_info->items[0]->grades[$userid]->hidden) {
+                    !$gradinginfo->items[0]->grades[$userid]->hidden) {
                 $usergrade = $gradinginfo->items[0]->grades[$userid]->str_grade;
             }
             $gradestring = $usergrade;
index 1b0fa94..37d5261 100644 (file)
     }
 
     if (!empty($forum->blockafter) && !empty($forum->blockperiod)) {
+        $a = new stdClass();
         $a->blockafter = $forum->blockafter;
         $a->blockperiod = get_string('secondstotime'.$forum->blockperiod);
-        echo $OUTPUT->notification(get_string('thisforumisthrottled','forum',$a));
+        echo $OUTPUT->notification(get_string('thisforumisthrottled', 'forum', $a));
     }
 
     if ($forum->type == 'qanda' && !has_capability('moodle/course:manageactivities', $context)) {
index fe0f6cc..4d7ad31 100644 (file)
@@ -123,6 +123,24 @@ class quiz_access_manager {
         return $options;
     }
 
+    /**
+     * Validate the data from any form fields added using {@link add_settings_form_fields()}.
+     * @param array $errors the errors found so far.
+     * @param array $data the submitted form data.
+     * @param array $files information about any uploaded files.
+     * @param mod_quiz_mod_form $quizform the quiz form object.
+     * @return array $errors the updated $errors array.
+     */
+    public static function validate_settings_form_fields(array $errors,
+            array $data, $files, mod_quiz_mod_form $this) {
+
+        foreach (self::get_rule_classes() as $rule) {
+            $errors = $rule::validate_settings_form_fields($errors, $data, $files, $this);
+        }
+
+        return $errors;
+    }
+
     /**
      * Save any submitted settings when the quiz settings form is submitted.
      *
index 4b585cd..362d7e3 100644 (file)
@@ -256,6 +256,20 @@ abstract class quiz_access_rule_base {
         // By default do nothing.
     }
 
+    /**
+     * Validate the data from any form fields added using {@link add_settings_form_fields()}.
+     * @param array $errors the errors found so far.
+     * @param array $data the submitted form data.
+     * @param array $files information about any uploaded files.
+     * @param mod_quiz_mod_form $quizform the quiz form object.
+     * @return array $errors the updated $errors array.
+     */
+    public static function validate_settings_form_fields(array $errors,
+            array $data, $files, mod_quiz_mod_form $quizform) {
+
+        return $errors;
+    }
+
     /**
      * @return array key => lang string any choices to add to the quiz Browser
      *      security settings menu.
index 320b01a..9c71ac8 100644 (file)
@@ -568,6 +568,9 @@ class mod_quiz_mod_form extends moodleform_mod {
             }
         }
 
+        // Any other rule plugins.
+        $errors = quiz_access_manager::validate_settings_form_fields($errors, $data, $files, $this);
+
         return $errors;
     }
 }
index 5e505f9..c3aa382 100644 (file)
@@ -96,13 +96,7 @@ M.mod_quiz.timer = {
         var Y = M.mod_quiz.timer.Y;
         var secondsleft = Math.floor((M.mod_quiz.timer.endtime - new Date().getTime())/1000);
         
-        // If this is a preview and time expired, display timeleft 0 and don't renew the timer.
-        if (M.mod_quiz.timer.preview && secondsleft < 0) {
-            Y.one('#quiz-time-left').setContent('0:00:00');
-            return;
-        }
-
-        // If time has expired, Set the hidden form field that says time has expired.
+        // If time has expired, set the hidden form field that says time has expired and submit
         if (secondsleft < 0) {
             M.mod_quiz.timer.stop(null);
             Y.one('#quiz-time-left').setContent(M.str.quiz.timesup);
index 6b296ab..6ebd84b 100644 (file)
@@ -37,10 +37,20 @@ foreach ($reports as $report => $reportdir) {
     $strreportname = get_string($report . 'report', 'quiz_'.$report);
     $reportsbyname[$strreportname] = $report;
 }
-ksort($reportsbyname);
+collatorlib::ksort($reportsbyname);
+
+// First get a list of quiz reports with there own settings pages. If there none,
+// we use a simpler overall menu structure.
+$rules = get_plugin_list_with_file('quizaccess', 'settings.php', false);
+$rulesbyname = array();
+foreach ($rules as $rule => $ruledir) {
+    $strrulename = get_string('pluginname', 'quizaccess_' . $rule);
+    $rulesbyname[$strrulename] = $rule;
+}
+collatorlib::ksort($rulesbyname);
 
 // Create the quiz settings page.
-if (empty($reportsbyname)) {
+if (empty($reportsbyname) && empty($rulesbyname)) {
     $pagetitle = get_string('modulename', 'quiz');
 } else {
     $pagetitle = get_string('generalsettings', 'admin');
@@ -202,14 +212,14 @@ if (!empty($CFG->enableoutcomes)) {
 
 // Now, depending on whether any reports have their own settings page, add
 // the quiz setting page to the appropriate place in the tree.
-if (empty($reportsbyname)) {
+if (empty($reportsbyname) && empty($rulesbyname)) {
     $ADMIN->add('modsettings', $quizsettings);
 } else {
     $ADMIN->add('modsettings', new admin_category('modsettingsquizcat',
             get_string('modulename', 'quiz'), !$module->visible));
     $ADMIN->add('modsettingsquizcat', $quizsettings);
 
-    // Add the report pages for the settings.php files in sub directories of mod/quiz/report.
+    // Add settings pages for the quiz report subplugins.
     foreach ($reportsbyname as $strreportname => $report) {
         $reportname = $report;
 
@@ -218,7 +228,21 @@ if (empty($reportsbyname)) {
         if ($ADMIN->fulltree) {
             include($CFG->dirroot . "/mod/quiz/report/$reportname/settings.php");
         }
-        $ADMIN->add('modsettingsquizcat', $settings);
+        if (!empty($settings)) {
+            $ADMIN->add('modsettingsquizcat', $settings);
+        }
+    }
+
+    // Add settings pages for the quiz access rule subplugins.
+    foreach ($rulesbyname as $strrulename => $rule) {
+        $settings = new admin_settingpage('modsettingsquizcat' . $rule,
+                $strrulename, 'moodle/site:config', !$module->visible);
+        if ($ADMIN->fulltree) {
+            include($CFG->dirroot . "/mod/quiz/accessrule/$rule/settings.php");
+        }
+        if (!empty($settings)) {
+            $ADMIN->add('modsettingsquizcat', $settings);
+        }
     }
 }
 
index 2fab6f8..8374ef4 100644 (file)
@@ -78,10 +78,10 @@ class qformat_blackboard_six extends qformat_blackboard_six_base {
             // For now we will do that searching for a required tag.
             // This is certainly not bullet-proof but works for all usual files.
             $fileobj->text = file_get_contents($filename);
-            if (strpos($text, '<questestinterop>')) {
+            if (strpos($fileobj->text, '<questestinterop>')) {
                 $fileobj->filetype = self::FILETYPE_QTI;
             }
-            if (strpos($text, '<POOL>')) {
+            if (strpos($fileobj->text, '<POOL>')) {
                 $fileobj->filetype = self::FILETYPE_POOL;
             }
             // In all other cases we are not able to handle this question file.
index ecca6e2..cac8374 100644 (file)
@@ -719,10 +719,6 @@ class qformat_gift extends qformat_default {
             // Check for plugins
             if ($out = $this->try_exporting_using_qtypes($question->qtype, $question)) {
                 $expout .= $out;
-            } else {
-                $expout .= "Question type $question->qtype is not supported\n";
-                echo $OUTPUT->notification(get_string('nohandler', 'qformat_gift',
-                        question_bank::get_qtype_name($question->qtype)));
             }
         }
 
index 9c8304c..9acb480 100644 (file)
@@ -1095,6 +1095,7 @@ class qformat_xml extends qformat_default {
     public function writequestion($question) {
         global $CFG, $OUTPUT;
 
+        $invalidquestion = false;
         $fs = get_file_storage();
         $contextid = $question->contextid;
         // Get files used by the questiontext.
@@ -1402,11 +1403,12 @@ class qformat_xml extends qformat_default {
                 break;
 
             default:
-                // try support by optional plugin
+                // Try support by optional plugin.
                 if (!$data = $this->try_exporting_using_qtypes($question->qtype, $question)) {
-                    notify(get_string('unsupportedexport', 'qformat_xml', $question->qtype));
+                    $invalidquestion = true;
+                } else {
+                    $expout .= $data;
                 }
-                $expout .= $data;
         }
 
         // Output any hints.
@@ -1427,8 +1429,11 @@ class qformat_xml extends qformat_default {
 
         // close the question tag
         $expout .= "  </question>\n";
-
-        return $expout;
+        if ($invalidquestion) {
+            return '';
+        } else {
+            return $expout;
+        }
     }
 
     public function write_answers($answers) {
index d59a7c0..0439f52 100644 (file)
@@ -1135,11 +1135,17 @@ abstract class repository {
             return;
         }
 
-        // do NOT mess with permissions here, the calling party is responsible for making
-        // sure the scanner engine can access the files!
-
+        $clamparam = ' --stdout ';
+        // If we are dealing with clamdscan, clamd is likely run as a different user
+        // that might not have permissions to access your file.
+        // To make clamdscan work, we use --fdpass parameter that passes the file
+        // descriptor permissions to clamd, which allows it to scan given file
+        // irrespective of directory and file permissions.
+        if (basename($CFG->pathtoclam) == 'clamdscan') {
+            $clamparam .= '--fdpass ';
+        }
         // execute test
-        $cmd = escapeshellcmd($CFG->pathtoclam).' --stdout '.escapeshellarg($thefile);
+        $cmd = escapeshellcmd($CFG->pathtoclam).$clamparam.escapeshellarg($thefile);
         exec($cmd, $output, $return);
 
         if ($return == 0) {
index 5b443a5..72799ba 100644 (file)
@@ -138,12 +138,7 @@ class repository_upload extends repository {
             }
         }
 
-        // scan the files, throws exception and deletes if virus found
-        // this is tricky because clamdscan daemon might not be able to access the files
-        $permissions = fileperms($_FILES[$elname]['tmp_name']);
-        @chmod($_FILES[$elname]['tmp_name'], $CFG->filepermissions);
         self::antivir_scan_file($_FILES[$elname]['tmp_name'], $_FILES[$elname]['name'], true);
-        @chmod($_FILES[$elname]['tmp_name'], $permissions);
 
         // {@link repository::build_source_field()}
         $sourcefield = $this->get_file_source_info($_FILES[$elname]['name']);
index 5fb5877..d2951cb 100644 (file)
@@ -30,7 +30,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 
-$version  = 2012062506.07;              // YYYYMMDD      = weekly release date of this DEV branch
+$version  = 2012062506.08;              // YYYYMMDD      = weekly release date of this DEV branch
                                         //         RR    = release increments - 00 in DEV branches
                                         //           .XX = incremental changes