Merge branch 'MDL-30186' of git://github.com/timhunt/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 16 Nov 2011 23:11:29 +0000 (00:11 +0100)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 16 Nov 2011 23:11:29 +0000 (00:11 +0100)
22 files changed:
lib/simpletest/testcompletionlib.php
mod/assignment/lib.php
mod/quiz/startattempt.php
mod/quiz/styles.css
mod/quiz/summary.php
mod/scorm/lib.php
mod/wiki/styles.css
question/behaviour/adaptive/behaviour.php
question/behaviour/behaviourbase.php
question/behaviour/deferredfeedback/behaviour.php
question/behaviour/immediatefeedback/behaviour.php
question/behaviour/informationitem/behaviour.php
question/behaviour/interactive/behaviour.php
question/behaviour/interactivecountback/behaviour.php
question/behaviour/missing/behaviour.php
question/behaviour/upgrade.txt
question/type/numerical/edit_numerical_form.php
theme/base/style/core.css
theme/base/style/course.css
theme/mymobile/renderers.php
theme/standard/style/core.css
webservice/renderer.php

index f4288fd..c78063b 100644 (file)
@@ -527,7 +527,7 @@ WHERE
         $c->__construct((object)array('id'=>42));
 
         // 1) Basic usage
-        $c->expectAt(0,'get_tracked_users',array(false, array(), 0, '', '', ''));
+        $c->expectAt(0,'get_tracked_users',array(false, array(), 0, '', '', '', null));
         $c->setReturnValueAt(0,'get_tracked_users',array(
             (object)array('id'=>100,'firstname'=>'Woot','lastname'=>'Plugh'),
             (object)array('id'=>201,'firstname'=>'Vroom','lastname'=>'Xyzzy'),
@@ -556,7 +556,7 @@ WHERE
             ),$c->get_progress_all(false));
 
         // 2) With more than 1,000 results
-        $c->expectAt(1,'get_tracked_users',array(true, 3, 0, '', '', ''));
+        $c->expectAt(1,'get_tracked_users',array(true, 3, 0, '', '', '', null));
 
         $tracked=array();
         $ids=array();
index 5d4d5fb..0be90a6 100644 (file)
@@ -3540,7 +3540,7 @@ function assignment_get_coursemodule_info($coursemodule) {
         }
         if ($coursemodule->showdescription) {
             // Convert intro to html. Do not filter cached version, filters run at display time.
-            $info->content = format_module_intro('assignment', $assignment, $coursemodule->id, false);
+            $result->content = format_module_intro('assignment', $assignment, $coursemodule->id, false);
         }
         return $result;
     } else {
index c660df3..c3e31d8 100644 (file)
@@ -101,7 +101,7 @@ if ($lastattempt && !$lastattempt->timefinish) {
 $output = $PAGE->get_renderer('mod_quiz');
 if (!$quizobj->is_preview_user() && $messages) {
     print_error('attempterror', 'quiz', $quizobj->view_url(),
-            $output->print_messages($messages));
+            $output->access_messages($messages));
 }
 
 if ($accessmanager->is_preflight_check_required($currentattemptid)) {
index 60d83d4..f963409 100644 (file)
@@ -96,6 +96,13 @@ div.editq div.question div.content .singlequestion a .questiontext{text-decorati
 #page-mod-quiz-mod #reviewoptionshdr fieldset.fgroup span label,
 #adminquizreviewoptions span label {margin-left: 0.4em;}
 
+#page-mod-quiz-mod.dir-rtl #reviewoptionshdr .fitem,
+#adminquizreviewoptions .group {float: right; width: 24%;}
+#page-mod-quiz-mod.dir-rtl #reviewoptionshdr fieldset.fgroup span,
+#adminquizreviewoptions span {float: right; clear: right;}
+#page-mod-quiz-mod.dir-rtl #reviewoptionshdr .fitemtitle,
+#adminquizreviewoptions .fitemtitle {text-align: right;}
+
 /** Mod quiz view **/
 #page-mod-quiz-view .quizinfo,
 #page-mod-quiz-view #page .quizgradefeedback,
@@ -377,4 +384,4 @@ bank window's title is prominent enough*/
 .qnum label {padding-right: 0.25em;}
 
 /** settings.php */
-#adminquizreviewoptions {margin-bottom: 0.5em;}
+#adminquizreviewoptions {margin-bottom: 0.5em;}
\ No newline at end of file
index 065bb8c..869b4b1 100644 (file)
@@ -61,7 +61,7 @@ $messages = $accessmanager->prevent_access();
 $output = $PAGE->get_renderer('mod_quiz');
 if (!$attemptobj->is_preview_user() && $messages) {
     print_error('attempterror', 'quiz', $attemptobj->view_url(),
-            $output->print_messages($messages));
+            $output->access_messages($messages));
 }
 if ($accessmanager->is_preflight_check_required($attemptobj->get_attemptid())) {
     redirect($attemptobj->start_attempt_url(null, $page));
index b4c84a9..50906fb 100644 (file)
@@ -510,7 +510,7 @@ function scorm_cron () {
         $cfg_scorm = get_config('scorm');
         if (!empty($cfg_scorm->allowaicchacp)) {
             $expiretime = time() - ($cfg_scorm->aicchacpkeepsessiondata*24*60*60);
-            $DB->delete_records_select('scorm_aicc_session', 'WHERE timemodified < ?', array($expiretime));
+            $DB->delete_records_select('scorm_aicc_session', 'timemodified < ?', array($expiretime));
         }
     }
 
index 18e0391..dcfd480 100644 (file)
     float: right;
 }
 
+.dir-rtl .wiki_diffuserleft {
+    float: left;
+}
+
 .wiki_diffuserright {
     float: left;
 }
index c663b52..9144296 100644 (file)
@@ -38,8 +38,8 @@ defined('MOODLE_INTERNAL') || die();
 class qbehaviour_adaptive extends question_behaviour_with_save {
     const IS_ARCHETYPAL = true;
 
-    public function required_question_definition_type() {
-        return 'question_automatically_gradable';
+    public function is_compatible_question(question_definition $question) {
+        return $question instanceof question_automatically_gradable;
     }
 
     public function get_expected_data() {
index 95c0e2a..ca09117 100644 (file)
@@ -70,21 +70,39 @@ abstract class question_behaviour {
     public function __construct(question_attempt $qa, $preferredbehaviour) {
         $this->qa = $qa;
         $this->question = $qa->get_question();
-        $requiredclass = $this->required_question_definition_type();
-        if (!$this->question instanceof $requiredclass) {
+        if (!$this->is_compatible_question($this->question)) {
             throw new coding_exception('This behaviour (' . $this->get_name() .
                     ') cannot work with this question (' . get_class($this->question) . ')');
         }
     }
 
+    /**
+     * Some behaviours can only work with certing types of question. This method
+     * allows the behaviour to verify that a question is compatible.
+     *
+     * This implementation is only provided for backwards-compatibility. You should
+     * override this method if you are implementing a behaviour.
+     *
+     * @param question_definition $question the question.
+     */
+    public function is_compatible_question(question_definition $question) {
+        $requiredclass = $this->required_question_definition_type();
+        return $this->question instanceof $requiredclass;
+    }
+
     /**
      * Most behaviours can only work with {@link question_definition}s
      * of a particular subtype, or that implement a particular interface.
      * This method lets the behaviour document that. The type of
      * question passed to the constructor is then checked against this type.
+     *
+     * @deprecated since 2.2. Please use/override {@link is_compatible_question()} instead.
+     *
      * @return string class/interface name.
      */
-    public abstract function required_question_definition_type();
+    protected function required_question_definition_type() {
+        return 'question_definition';
+    }
 
     /**
      * @return string the name of this behaviour. For example the name of
index 8bc59fc..5c5de7a 100644 (file)
@@ -40,8 +40,8 @@ defined('MOODLE_INTERNAL') || die();
 class qbehaviour_deferredfeedback extends question_behaviour_with_save {
     const IS_ARCHETYPAL = true;
 
-    public function required_question_definition_type() {
-        return 'question_automatically_gradable';
+    public function is_compatible_question(question_definition $question) {
+        return $question instanceof question_automatically_gradable;
     }
 
     public static function get_unused_display_options() {
index 2e7bbe0..f12db5d 100644 (file)
@@ -42,8 +42,8 @@ defined('MOODLE_INTERNAL') || die();
 class qbehaviour_immediatefeedback extends question_behaviour_with_save {
     const IS_ARCHETYPAL = true;
 
-    public function required_question_definition_type() {
-        return 'question_automatically_gradable';
+    public function is_compatible_question(question_definition $question) {
+        return $question instanceof question_automatically_gradable;
     }
 
     public function get_min_fraction() {
index 8c2cefe..472a6e2 100644 (file)
@@ -39,8 +39,8 @@ defined('MOODLE_INTERNAL') || die();
  */
 class qbehaviour_informationitem extends question_behaviour {
 
-    public function required_question_definition_type() {
-        return 'question_definition';
+    public function is_compatible_question(question_definition $question) {
+        return true;
     }
 
     public function get_expected_data() {
index 976bb08..27e0b30 100644 (file)
@@ -52,8 +52,8 @@ class qbehaviour_interactive extends question_behaviour_with_save {
      */
     const READONLY_EXCEPT_TRY_AGAIN = 23485299;
 
-    public function required_question_definition_type() {
-        return 'question_automatically_gradable';
+    public function is_compatible_question(question_definition $question) {
+        return $question instanceof question_automatically_gradable;
     }
 
     public function get_right_answer_summary() {
index 5b3e7f4..8a14cb7 100644 (file)
@@ -64,8 +64,8 @@ require_once(dirname(__FILE__) . '/../interactive/behaviour.php');
 class qbehaviour_interactivecountback extends qbehaviour_interactive {
     const IS_ARCHETYPAL = false;
 
-    public function required_question_definition_type() {
-        return 'question_automatically_gradable_with_countback';
+    public function is_compatible_question(question_definition $question) {
+        return $question instanceof question_automatically_gradable_with_countback;
     }
 
     protected function adjust_fraction($fraction, question_attempt_pending_step $pendingstep) {
index 1726e01..3475040 100644 (file)
@@ -45,8 +45,9 @@ defined('MOODLE_INTERNAL') || die();
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 class qbehaviour_missing extends question_behaviour {
-    public function required_question_definition_type() {
-        return 'question_definition';
+
+    public function is_compatible_question(question_definition $question) {
+        return true;
     }
 
     public function summarise_action(question_attempt_step $step) {
index db780e8..63b941e 100644 (file)
@@ -2,10 +2,15 @@ This files describes API changes for question behaviour plugins.
 
 === 2.2 ===
 
-* The old
+1) The old
     public static function get_required_behaviours()
 method is no more. Instead use the ->dependencies facility in version.php. E.g.
 $plugin->dependencies = array(
     'qbehaviour_immediatefeedback' => 2011102700,
     'qbehaviour_deferredcbm'       => 2011102700
 );
+
+2) The old required_question_definition_type method has been replaced by a new
+is_compatible_question method. You should change your behaviour to override the
+new method, not the old one. This change has been implemented in a
+backwards-compatible way, so behaviours will not break.
index 512f694..2775ef0 100644 (file)
@@ -264,7 +264,7 @@ class qtype_numerical_edit_form extends question_edit_form {
                 if ($data['fraction'][$key] == 1) {
                     $maxgrade = true;
                 }
-                if (!is_numeric($data['tolerance'][$key])) {
+                if ($answer !== '*' && !is_numeric($data['tolerance'][$key])) {
                     $errors['tolerance['.$key.']'] =
                             get_string('mustbenumeric', 'qtype_calculated');
                 }
index 4976044..3abeb99 100644 (file)
@@ -218,6 +218,8 @@ a.skip:active {position: static;display: block;}
 .mform .ftags label.accesshide {display: block;position: static;}
 .mform .ftags select {margin-bottom: 0.7em;min-width: 22em;}
 
+input#id_externalurl {direction:ltr;}
+
 /** Browser corrections for mforms **/
 .ie .mform .fitem .felement {margin-left:0;text-align:left;float:left;}
 /** Fix IE double margin + float bugs **/
@@ -720,6 +722,23 @@ body.tag .managelink {padding: 5px;}
 .mod-indent-15,
 .mod-indent-huge {margin-left:300px;}
 
+.dir-rtl .mod-indent-1 {margin-right:20px;margin-left:0;}
+.dir-rtl .mod-indent-2 {margin-right:40px;margin-left:0;}
+.dir-rtl .mod-indent-3 {margin-right:60px;margin-left:0;}
+.dir-rtl .mod-indent-4 {margin-right:80px;margin-left:0;}
+.dir-rtl .mod-indent-5 {margin-right:100px;margin-left:0;}
+.dir-rtl .mod-indent-6 {margin-right:120px;margin-left:0;}
+.dir-rtl .mod-indent-7 {margin-right:140px;margin-left:0;}
+.dir-rtl .mod-indent-8 {margin-right:160px;margin-left:0;}
+.dir-rtl .mod-indent-9 {margin-right:180px;margin-left:0;}
+.dir-rtl .mod-indent-10 {margin-right:200px;margin-left:0;}
+.dir-rtl .mod-indent-11 {margin-right:220px;margin-left:0;}
+.dir-rtl .mod-indent-12 {margin-right:240px;margin-left:0;}
+.dir-rtl .mod-indent-13 {margin-right:260px;margin-left:0;}
+.dir-rtl .mod-indent-14 {margin-right:280px;margin-left:0;}
+.dir-rtl .mod-indent-15,
+.dir-rtl .mod-indent-huge {margin-right:300px;margin-left:0;}
+
 .dir-rtl .felement.feditor select {margin-right:18.75%;}
 
 /* Resourcelib mp3 player size: only width could be changed here, height hardcoded in JS */
@@ -804,3 +823,53 @@ ul li,
 ol li,
 .course-content ul.weeks .content .summary ol li,
 .course-content ul.topics .content .summary ol li {list-style: decimal outside none;}
+
+.dir-rtl #adminsettings #id_s__pathtodu,
+.dir-rtl #adminsettings #id_s__aspellpath,
+.dir-rtl #adminsettings #id_s__pathtodot,
+.dir-rtl #adminsettings #id_s__supportemail,
+.dir-rtl #adminsettings #id_s__supportpage,
+.dir-rtl #adminsettings #id_s__sessioncookie,
+.dir-rtl #adminsettings #id_s__sessioncookiepath,
+.dir-rtl #adminsettings #id_s__sessioncookiedomain,
+.dir-rtl #adminsettings #id_s__proxyhost,
+.dir-rtl #adminsettings #id_s__proxyuser,
+.dir-rtl #adminsettings #id_s__proxypassword,
+.dir-rtl #adminsettings #id_s__proxybypass,
+.dir-rtl #adminsettings #id_s__jabberhost,
+.dir-rtl #adminsettings #id_s__jabberserver,
+.dir-rtl #adminsettings #id_s__jabberusername,
+.dir-rtl #adminsettings #id_s__jabberpassword,
+.dir-rtl #adminsettings #id_s__additionalhtmlhead,
+.dir-rtl #adminsettings #id_s__additionalhtmltopofbody,
+.dir-rtl #adminsettings #id_s__additionalhtmlfooter,
+.dir-rtl #adminsettings #id_s__docroot,
+.dir-rtl #adminsettings #id_s__filter_tex_latexpreamble,
+.dir-rtl #adminsettings #id_s__filter_tex_latexbackground,
+.dir-rtl #adminsettings #id_s__filter_tex_pathlatex,
+.dir-rtl #adminsettings #id_s__filter_tex_pathdvips,
+.dir-rtl #adminsettings #id_s__filter_tex_pathconvert,
+.dir-rtl #adminsettings #id_s__blockedip,
+.dir-rtl #adminsettings #id_s__pathtoclam,
+.dir-rtl #adminsettings #id_s__quarantinedir,
+.dir-rtl #adminsettings #id_s__sitepolicy,
+.dir-rtl #adminsettings #id_s__sitepolicyguest,
+.dir-rtl #adminsettings #id_s__cronremotepassword,
+.dir-rtl #adminsettings #id_s__allowedip,
+.dir-rtl #adminsettings #id_s__blockedip,
+.dir-rtl #adminsettings #id_s_enrol_meta_nosyncroleids,
+.dir-rtl #adminsettings #id_s_enrol_ldap_host_url,
+.dir-rtl #adminsettings #id_s_enrol_ldap_ldapencoding,
+.dir-rtl #adminsettings #id_s_enrol_ldap_bind_dn,
+.dir-rtl #adminsettings #id_s_enrol_ldap_bind_pw,
+.dir-rtl #adminsettings #admin-emoticons .form-text,
+.dir-rtl #adminsettings #admin-role_mapping input[type=text],
+.dir-rtl #adminsettings #id_s_enrol_paypal_paypalbusiness,
+.dir-rtl #adminsettings #id_s_enrol_flatfile_location,
+#page-admin-setting-enrolsettingsflatfile.dir-rtl input[type=text],
+#page-admin-setting-enrolsettingsdatabase.dir-rtl input[type=text],
+#page-admin-auth-db.dir-rtl input[type=text] {direction: ltr;}
+
+#page-admin-setting-enrolsettingsflatfile.dir-rtl .informationbox {direction: ltr;text-align: left;}
+
+#page-admin-grade-edit-scale-edit.dir-rtl .error input#id_name {margin-right: 170px;}
\ No newline at end of file
index 3062ac6..37f9792 100644 (file)
@@ -27,7 +27,7 @@
 .path-course-view li.activity form.togglecompletion .ajaxworking {position:absolute;top:0; left:20px;width: 20px; height: 20px;background: url([[pix:i/ajaxloader]]) no-repeat;}
 .dir-rtl.path-course-view li.activity {margin-right:0px;margin-left:20px;}
 .dir-rtl.path-course-view li.activity form.togglecompletion,
-.dir-rtl.path-course-view li.activity span.autocompletion {right:auto;left:-20px;}
+.dir-rtl.path-course-view li.activity span.autocompletion {right:auto;right:-20px;}
 
 .section img.movetarget {height:16px;width:80px;}
 
index f7c253c..3007930 100644 (file)
@@ -380,7 +380,7 @@ class theme_mymobile_core_renderer extends core_renderer {
             return '';
         }
 
-        $loginapge = ((string)$this->page->url === get_login_url());
+        $loginpage = ((string)$this->page->url === get_login_url());
         $course = $this->page->course;
 
         if (session_is_loggedinas()) {
@@ -407,7 +407,7 @@ class theme_mymobile_core_renderer extends core_renderer {
             }
             if (isguestuser()) {
                 $loggedinas = $realuserinfo.get_string('loggedinasguest');
-                if (!$loginapge) {
+                if (!$loginpage) {
                     $loggedinas .= " (<a href=\"$loginurl\">".get_string('login').'</a>)';
                 }
             } else if (is_role_switched($course->id)) { // Has switched roles
@@ -421,7 +421,7 @@ class theme_mymobile_core_renderer extends core_renderer {
             }
         } else {
             $loggedinas = get_string('loggedinnot', 'moodle');
-            if (!$loginapge) {
+            if (!$loginpage) {
                 $loggedinas .= " (<a href=\"$loginurl\">".get_string('login').'</a>)';
             }
         }
index 12cf9d8..4b69618 100644 (file)
@@ -277,6 +277,8 @@ h2.tag-heading {text-align:center;margin-left:auto;margin-right:auto;width:95%;}
 #tags-management-links,
 .tag .managelink {text-align:right;}
 table#tag-management-list {margin: 10px auto;width: 80%;}
+#page-tag-index.dir-rtl .relatedpages {text-align:center;}
+#page-tag-index.dir-rtl .user-box {float:right;}
 
 /**
  * Overriding base
index 37b9935..75668fd 100644 (file)
@@ -46,15 +46,24 @@ class core_webservice_renderer extends plugin_renderer_base {
         $table->cellspacing = 0;
         $table->cellpadding = 0;
 
+        // LTR/RTL support, for drawing button arrows in the right direction
+        if (right_to_left()) {
+            $addarrow = '▶';
+            $removearrow = '◀';
+        } else {
+            $addarrow = '◀';
+            $removearrow = '▶';
+        }
+
         //create the add and remove button
         $addinput = html_writer::empty_tag('input',
                         array('name' => 'add', 'id' => 'add', 'type' => 'submit',
-                            'value' => '◀' . ' ' . get_string('add'),
+                            'value' => $addarrow . ' ' . get_string('add'),
                             'title' => get_string('add')));
         $addbutton = html_writer::tag('div', $addinput, array('id' => 'addcontrols'));
         $removeinput = html_writer::empty_tag('input',
                         array('name' => 'remove', 'id' => 'remove', 'type' => 'submit',
-                            'value' => '▶' . ' ' . get_string('remove'),
+                            'value' => $removearrow . ' ' . get_string('remove'),
                             'title' => get_string('remove')));
         $removebutton = html_writer::tag('div', $removeinput, array('id' => 'removecontrols'));