Merge branch 'MDL-38254_m23' of git://github.com/rwijaya/moodle into MOODLE_23_STABLE
authorDan Poltawski <dan@moodle.com>
Wed, 10 Apr 2013 04:13:51 +0000 (12:13 +0800)
committerDan Poltawski <dan@moodle.com>
Wed, 10 Apr 2013 04:13:51 +0000 (12:13 +0800)
40 files changed:
backup/moodle2/restore_stepslib.php
backup/util/ui/renderer.php
backup/util/ui/restore_ui_components.php
course/lib.php
course/modedit.php
course/tests/courselib_test.php
enrol/externallib.php
install/lang/lt_uni/admin.php [new file with mode: 0644]
install/lang/lt_uni/error.php [new file with mode: 0644]
install/lang/lt_uni/install.php [new file with mode: 0644]
install/lang/lt_uni/moodle.php [new file with mode: 0644]
install/lang/pl/install.php
lang/en/backup.php
lang/en/countries.php
lib/dml/mssql_native_moodle_database.php
lib/dml/sqlsrv_native_moodle_database.php
lib/modinfolib.php
lib/moodlelib.php
lib/navigationlib.php
lib/phpunit/classes/util.php
lib/tests/fixtures/langtest/aa/langconfig.php [new file with mode: 0644]
lib/tests/fixtures/langtest/bb/langconfig.php [new file with mode: 0644]
lib/tests/fixtures/langtest/bc/langconfig.php [new file with mode: 0644]
lib/tests/fixtures/langtest/cda/langconfig.php [new file with mode: 0644]
lib/tests/fixtures/langtest/cdb/langconfig.php [new file with mode: 0644]
lib/tests/fixtures/langtest/cdc/langconfig.php [new file with mode: 0644]
lib/tests/fixtures/langtest/de/langconfig.php [new file with mode: 0644]
lib/tests/fixtures/langtest/de_du/langconfig.php [new file with mode: 0644]
lib/tests/fixtures/langtest/de_kids/langconfig.php [new file with mode: 0644]
lib/tests/fixtures/langtest/sd/langconfig.php [new file with mode: 0644]
lib/tests/moodlelib_test.php
lib/tests/string_test.php [new file with mode: 0644]
lib/timezone.txt
mod/quiz/report/grading/report.php
mod/quiz/startattempt.php
mod/wiki/pagelib.php
repository/lib.php
theme/base/style/grade.css
theme/mymobile/config.php
version.php

index 4f2a213..db1ab8a 100644 (file)
@@ -150,6 +150,11 @@ class restore_gradebook_structure_step extends restore_structure_step {
         if ($data->itemtype=='manual') {
             // manual grade items store category id in categoryid
             $data->categoryid = $this->get_mappingid('grade_category', $data->categoryid, NULL);
+            // if mapping failed put in course's grade category
+            if (NULL == $data->categoryid) {
+                $coursecat = grade_category::fetch_course_category($this->get_courseid());
+                $data->categoryid = $coursecat->id;
+            }
         } else if ($data->itemtype=='course') {
             // course grade item stores their category id in iteminstance
             $coursecat = grade_category::fetch_course_category($this->get_courseid());
index 9e0ab9d..aa66d37 100644 (file)
@@ -521,6 +521,15 @@ class core_backup_renderer extends plugin_renderer_base {
         $url = $component->get_url();
 
         $output = html_writer::start_tag('div', array('class' => 'restore-course-search'));
+
+        $countstr = '';
+        if ($component->has_more_results()) {
+            $countstr = get_string('morecoursesearchresults', 'backup', $component->get_count());
+        } else {
+            $countstr = get_string('totalcoursesearchresults', 'backup', $component->get_count());
+        }
+
+        $output .= html_writer::tag('div', $countstr, array('class'=>'rcs-totalresults'));
         $output .= html_writer::start_tag('div', array('class' => 'rcs-results'));
 
         $table = new html_table();
@@ -590,8 +599,14 @@ class core_backup_renderer extends plugin_renderer_base {
             return $output;
         }
 
-        $output .= html_writer::tag('div', get_string('totalcoursesearchresults', 'backup', $component->get_count()), array('class'=>'ics-totalresults'));
+        $countstr = '';
+        if ($component->has_more_results()) {
+            $countstr = get_string('morecoursesearchresults', 'backup', $component->get_count());
+        } else {
+            $countstr = get_string('totalcoursesearchresults', 'backup', $component->get_count());
+        }
 
+        $output .= html_writer::tag('div', $countstr, array('class'=>'ics-totalresults'));
         $output .= html_writer::start_tag('div', array('class' => 'ics-results'));
 
         $table = new html_table();
@@ -610,6 +625,14 @@ class core_backup_renderer extends plugin_renderer_base {
             );
             $table->data[] = $row;
         }
+        if ($component->has_more_results()) {
+            $cell = new html_table_cell(get_string('moreresults', 'backup'));
+            $cell->colspan = 3;
+            $cell->attributes['class'] = 'notifyproblem';
+            $row = new html_table_row(array($cell));
+            $row->attributes['class'] = 'rcs-course';
+            $table->data[] = $row;
+        }
         $output .= html_writer::table($table);
         $output .= html_writer::end_tag('div');
 
index b95681d..c82443e 100644 (file)
@@ -65,6 +65,11 @@ abstract class restore_search_base implements renderable {
      * @var array
      */
     private $requiredcapabilities = array();
+    /**
+     * Indicates if we have more than maxresults found.
+     * @var boolean
+     */
+    private $hasmoreresults = false;
 
     /**
      * Constructor
@@ -177,7 +182,7 @@ abstract class restore_search_base implements renderable {
         foreach ($this->requiredcapabilities as $cap) {
             $requiredcaps[] = $cap['capability'];
         }
-        // Iterate while we have records and haven't reached MAXRESULTS
+        // Iterate while we have records and haven't reached $this->maxresults.
         while ($totalcourses > $offs and $this->totalcount < self::$MAXRESULTS) {
             $resultset = $DB->get_records_sql($sql, $params, $offs, $blocksz);
             foreach ($resultset as $result) {
@@ -188,11 +193,14 @@ abstract class restore_search_base implements renderable {
                         continue;
                     }
                 }
-                $this->results[$result->id] = $result;
-                $this->totalcount++;
-                if ($this->totalcount >= self::$MAXRESULTS) {
+                // Check if we are over the limit.
+                if ($this->totalcount+1 > self::$MAXRESULTS) {
+                    $this->hasmoreresults = true;
                     break;
                 }
+                // If not, then continue.
+                $this->totalcount++;
+                $this->results[$result->id] = $result;
             }
             $offs += $blocksz;
         }
@@ -201,7 +209,10 @@ abstract class restore_search_base implements renderable {
     }
 
     final public function has_more_results() {
-        return $this->get_count() >= self::$MAXRESULTS;
+        if ($this->results === null) {
+            $this->search();
+        }
+        return $this->hasmoreresults;
     }
 
     /**
index 78a6eb7..c2ac680 100644 (file)
@@ -2917,16 +2917,23 @@ function set_coursemodule_visible($id, $visible, $prevstateoverrides=false) {
         }
     }
 
+    $cminfo = new stdClass();
+    $cminfo->id = $id;
+    $cminfo->visible = $visible;
+
     if ($prevstateoverrides) {
-        if ($visible == '0') {
-            // Remember the current visible state so we can toggle this back.
-            $DB->set_field('course_modules', 'visibleold', $cm->visible, array('id'=>$id));
+        // If we making whole section visiblility change..
+        if ($visible == 0) {
+            // Retain previous visibility state.
+            $cminfo->visibleold = $cm->visible;
         } else {
-            // Get the previous saved visible states.
-            return $DB->set_field('course_modules', 'visible', $cm->visibleold, array('id'=>$id));
+            // Restore previous visibility state.
+            $cminfo->visible = $cm->visibleold;
         }
+    } else {
+        $cminfo->visibleold = $visible;
     }
-    return $DB->set_field("course_modules", "visible", $visible, array("id"=>$id));
+    return $DB->update_record('course_modules', $cminfo);
 }
 
 /**
@@ -3167,15 +3174,17 @@ function moveto_module($mod, $section, $beforemod=NULL) {
 /// Update module itself if necessary
 
     // If moving to a hidden section then hide module.
-    if (!$section->visible && $mod->visible) {
-        // Set this in the object because it is sent as a response to ajax calls.
-        set_coursemodule_visible($mod->id, 0, true);
-        $mod->visible = 0;
-    }
-    if ($section->visible && !$mod->visible) {
-        set_coursemodule_visible($mod->id, 1, true);
-        // Set this in the object because it is sent as a response to ajax calls.
-        $mod->visible = $mod->visibleold;
+    if ($mod->section != $section->id) {
+        if (!$section->visible && $mod->visible) {
+            // Set this in the object because it is sent as a response to ajax calls.
+            set_coursemodule_visible($mod->id, 0, true);
+            $mod->visible = 0;
+        }
+        if ($section->visible && !$mod->visible) {
+            set_coursemodule_visible($mod->id, 1, true);
+            // Set this in the object because it is sent as a response to ajax calls.
+            $mod->visible = $mod->visibleold;
+        }
     }
 
 /// Add the module into the new section
index 00cc318..3e79b85 100644 (file)
@@ -412,6 +412,7 @@ if ($mform->is_cancelled()) {
         $newcm->module           = $fromform->module;
         $newcm->instance         = 0; // not known yet, will be updated later (this is similar to restore code)
         $newcm->visible          = $fromform->visible;
+        $newcm->visibleold       = $fromform->visible;
         $newcm->groupmode        = $fromform->groupmode;
         $newcm->groupingid       = $fromform->groupingid;
         $newcm->groupmembersonly = $fromform->groupmembersonly;
@@ -481,7 +482,6 @@ if ($mform->is_cancelled()) {
         // make sure visibility is set correctly (in particular in calendar)
         // note: allow them to set it even without moodle/course:activityvisibility
         set_coursemodule_visible($fromform->coursemodule, $fromform->visible);
-        $DB->set_field('course_modules', 'visibleold', 1, array('id' => $fromform->coursemodule));
 
         if (isset($fromform->cmidnumber)) { //label
             // set cm idnumber - uniqueness is already verified by form validation
index ab573d0..a265acc 100644 (file)
@@ -290,4 +290,265 @@ class courselib_testcase extends advanced_testcase {
         // Check that the section number has been changed in the cm
         $this->assertEquals($newsection->id, $cm->section);
     }
+
+    public function test_module_visibility() {
+        $this->setAdminUser();
+        $this->resetAfterTest(true);
+
+        // Create course and modules.
+        $course = $this->getDataGenerator()->create_course(array('numsections' => 5));
+        $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
+        $page = $this->getDataGenerator()->create_module('page', array('duedate' => time(), 'course' => $course->id));
+        $modules = compact('forum', 'page');
+
+        // Hiding the modules.
+        foreach ($modules as $mod) {
+            set_coursemodule_visible($mod->cmid, 0);
+            $this->check_module_visibility($mod, 0, 0);
+        }
+
+        // Showing the modules.
+        foreach ($modules as $mod) {
+            set_coursemodule_visible($mod->cmid, 1);
+            $this->check_module_visibility($mod, 1, 1);
+        }
+    }
+
+    public function test_section_visibility() {
+        $this->setAdminUser();
+        $this->resetAfterTest(true);
+
+        // Create course.
+        $course = $this->getDataGenerator()->create_course(array('numsections' => 3), array('createsections' => true));
+
+        // Testing an empty section.
+        $sectionnumber = 1;
+        set_section_visible($course->id, $sectionnumber, 0);
+        $section_info = get_fast_modinfo($course)->get_section_info($sectionnumber);
+        $this->assertEquals($section_info->visible, 0);
+        set_section_visible($course->id, $sectionnumber, 1);
+        $section_info = get_fast_modinfo($course)->get_section_info($sectionnumber);
+        $this->assertEquals($section_info->visible, 1);
+
+        // Testing a section with visible modules.
+        $sectionnumber = 2;
+        $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id),
+                array('section' => $sectionnumber));
+        $page= $this->getDataGenerator()->create_module('page', array('duedate' => time(),
+                'course' => $course->id), array('section' => $sectionnumber));
+        $modules = compact('forum', 'page');
+        set_section_visible($course->id, $sectionnumber, 0);
+        $section_info = get_fast_modinfo($course)->get_section_info($sectionnumber);
+        $this->assertEquals($section_info->visible, 0);
+        foreach ($modules as $mod) {
+            $this->check_module_visibility($mod, 0, 1);
+        }
+        set_section_visible($course->id, $sectionnumber, 1);
+        $section_info = get_fast_modinfo($course)->get_section_info($sectionnumber);
+        $this->assertEquals($section_info->visible, 1);
+        foreach ($modules as $mod) {
+            $this->check_module_visibility($mod, 1, 1);
+        }
+
+        // Testing a section with hidden modules, which should stay hidden.
+        $sectionnumber = 3;
+        $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id),
+                array('section' => $sectionnumber));
+        $page = $this->getDataGenerator()->create_module('page', array('duedate' => time(),
+                'course' => $course->id), array('section' => $sectionnumber));
+        $modules = compact('forum', 'page');
+        foreach ($modules as $mod) {
+            set_coursemodule_visible($mod->cmid, 0);
+            $this->check_module_visibility($mod, 0, 0);
+        }
+        set_section_visible($course->id, $sectionnumber, 0);
+        $section_info = get_fast_modinfo($course)->get_section_info($sectionnumber);
+        $this->assertEquals($section_info->visible, 0);
+        foreach ($modules as $mod) {
+            $this->check_module_visibility($mod, 0, 0);
+        }
+        set_section_visible($course->id, $sectionnumber, 1);
+        $section_info = get_fast_modinfo($course)->get_section_info($sectionnumber);
+        $this->assertEquals($section_info->visible, 1);
+        foreach ($modules as $mod) {
+            $this->check_module_visibility($mod, 0, 0);
+        }
+    }
+
+    /**
+     * Helper function to assert that a module has correctly been made visible, or hidden.
+     *
+     * @param stdClass $mod module information
+     * @param int $visibility the current state of the module
+     * @param int $visibleold the current state of the visibleold property
+     * @return void
+     */
+    public function check_module_visibility($mod, $visibility, $visibleold) {
+        global $DB;
+
+        rebuild_course_cache($mod->course);
+        $course = $DB->get_record('course', array('id' => $mod->course));
+        $cm = get_fast_modinfo($course)->get_cm($mod->cmid);
+
+        $this->assertEquals($visibility, $cm->visible);
+        $this->assertEquals($visibleold, $cm->visibleold);
+
+        // Check the module grade items.
+        $grade_items = grade_item::fetch_all(array('itemtype' => 'mod', 'itemmodule' => $cm->modname,
+                'iteminstance' => $cm->instance, 'courseid' => $cm->course));
+        if ($grade_items) {
+            foreach ($grade_items as $grade_item) {
+                if ($visibility) {
+                    $this->assertFalse($grade_item->is_hidden(), "$cm->modname grade_item not visible");
+                } else {
+                    $this->assertTrue($grade_item->is_hidden(), "$cm->modname grade_item not hidden");
+                }
+            }
+        }
+
+        // Check the events visibility.
+        if ($events = $DB->get_records('event', array('instance' => $cm->instance, 'modulename' => $cm->modname))) {
+            foreach ($events as $event) {
+                $calevent = new calendar_event($event);
+                $this->assertEquals($visibility, $calevent->visible, "$cm->modname calendar_event visibility");
+            }
+        }
+    }
+
+    /**
+     * Tests moving a module between hidden/visible sections and
+     * verifies that the course/module visiblity seettings are
+     * retained.
+     */
+    public function test_moveto_module_between_hidden_sections() {
+        global $DB;
+
+        $this->resetAfterTest(true);
+
+        $course = $this->getDataGenerator()->create_course(array('numsections' => 4), array('createsections' => true));
+        $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
+        $page = $this->getDataGenerator()->create_module('page', array('course' => $course->id));
+        $quiz= $this->getDataGenerator()->create_module('quiz', array('course' => $course->id));
+
+        // Set the page as hidden
+        set_coursemodule_visible($page->cmid, 0);
+
+        // Set sections 3 as hidden.
+        set_section_visible($course->id, 3, 0);
+
+        $modinfo = get_fast_modinfo($course);
+
+        $hiddensection = $modinfo->get_section_info(3);
+        // New section is definitely not visible:
+        $this->assertEquals($hiddensection->visible, 0);
+
+        $forumcm = $modinfo->cms[$forum->cmid];
+        $pagecm = $modinfo->cms[$page->cmid];
+
+        // Move the forum and the page to a hidden section.
+        moveto_module($forumcm, $hiddensection);
+        moveto_module($pagecm, $hiddensection);
+
+        // Reset modinfo cache.
+        $reset = 'reset';
+        get_fast_modinfo($reset);
+
+        $modinfo = get_fast_modinfo($course);
+
+        // Verify that forum and page have been moved to the hidden section and quiz has not.
+        $this->assertContains($forum->cmid, $modinfo->sections[3]);
+        $this->assertContains($page->cmid, $modinfo->sections[3]);
+        $this->assertNotContains($quiz->cmid, $modinfo->sections[3]);
+
+        // Verify that forum has been made invisible.
+        $forumcm = $modinfo->cms[$forum->cmid];
+        $this->assertEquals($forumcm->visible, 0);
+        // Verify that old state has been retained.
+        $this->assertEquals($forumcm->visibleold, 1);
+
+        // Verify that page has stayed invisible.
+        $pagecm = $modinfo->cms[$page->cmid];
+        $this->assertEquals($pagecm->visible, 0);
+        // Verify that old state has been retained.
+        $this->assertEquals($pagecm->visibleold, 0);
+
+        // Verify that quiz has been unaffected.
+        $quizcm = $modinfo->cms[$quiz->cmid];
+        $this->assertEquals($quizcm->visible, 1);
+
+        // Move forum and page back to visible section.
+        $visiblesection = $modinfo->get_section_info(2);
+        moveto_module($forumcm, $visiblesection);
+        moveto_module($pagecm, $visiblesection);
+
+        // Reset modinfo cache.
+        $reset = 'reset';
+        get_fast_modinfo($reset);
+        $modinfo = get_fast_modinfo($course);
+
+        // Verify that forum has been made visible.
+        $forumcm = $modinfo->cms[$forum->cmid];
+        $this->assertEquals($forumcm->visible, 1);
+
+        // Verify that page has stayed invisible.
+        $pagecm = $modinfo->cms[$page->cmid];
+        $this->assertEquals($pagecm->visible, 0);
+
+        // Move the page in the same section (this is what mod duplicate does_
+        moveto_module($pagecm, $visiblesection, $forumcm);
+
+        // Reset modinfo cache.
+        $reset = 'reset';
+        get_fast_modinfo($reset);
+
+        // Verify that the the page is still hidden
+        $modinfo = get_fast_modinfo($course);
+        $pagecm = $modinfo->cms[$page->cmid];
+        $this->assertEquals($pagecm->visible, 0);
+    }
+
+    /**
+     * Tests moving a module around in the same section. moveto_module()
+     * is called this way in modduplicate.
+     */
+    public function test_moveto_module_in_same_section() {
+        global $DB;
+
+        $this->resetAfterTest(true);
+
+        $course = $this->getDataGenerator()->create_course(array('numsections' => 3), array('createsections' => true));
+        $page = $this->getDataGenerator()->create_module('page', array('course' => $course->id));
+        $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
+
+        // Simulate inconsistent visible/visibleold values (MDL-38713).
+        $cm = $DB->get_record('course_modules', array('id' => $page->cmid), '*', MUST_EXIST);
+        $cm->visible = 0;
+        $cm->visibleold = 1;
+        $DB->update_record('course_modules', $cm);
+
+        $modinfo = get_fast_modinfo($course);
+        $forumcm = $modinfo->cms[$forum->cmid];
+        $pagecm = $modinfo->cms[$page->cmid];
+
+        // Verify that page is hidden.
+        $this->assertEquals($pagecm->visible, 0);
+
+        // Verify section 0 is where all mods added.
+        $section = $modinfo->get_section_info(0);
+        $this->assertEquals($section->id, $forumcm->section);
+        $this->assertEquals($section->id, $pagecm->section);
+
+
+        // Move the forum and the page to a hidden section.
+        moveto_module($pagecm, $section, $forumcm);
+
+        // Reset modinfo cache.
+        $reset = 'reset';
+        get_fast_modinfo($reset);
+
+        // Verify that the the page is still hidden
+        $modinfo = get_fast_modinfo($course);
+        $pagecm = $modinfo->cms[$page->cmid];
+        $this->assertEquals($pagecm->visible, 0);
+    }
 }
index 7e8dd4c..6486134 100644 (file)
@@ -87,7 +87,7 @@ class core_enrol_external extends external_api {
             }
 
             list($enrolledsqlselect, $enrolledparams) = get_enrolled_sql($context);
-            $enrolledsql = "SELECT COUNT(*) FROM ($enrolledsqlselect) AS enrolleduserids";
+            $enrolledsql = "SELECT COUNT('x') FROM ($enrolledsqlselect) enrolleduserids";
             $enrolledusercount = $DB->count_records_sql($enrolledsql, $enrolledparams);
 
             $result[] = array('id'=>$course->id, 'shortname'=>$course->shortname, 'fullname'=>$course->fullname, 'idnumber'=>$course->idnumber,'visible'=>$course->visible, 'enrolledusercount'=>$enrolledusercount);
diff --git a/install/lang/lt_uni/admin.php b/install/lang/lt_uni/admin.php
new file mode 100644 (file)
index 0000000..4b8efef
--- /dev/null
@@ -0,0 +1,37 @@
+<?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/>.
+
+/**
+ * Automatically generated strings for Moodle installer
+ *
+ * Do not edit this file manually! It contains just a subset of strings
+ * needed during the very first steps of installation. This file was
+ * generated automatically by export-installer.php (which is part of AMOS
+ * {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
+ * list of strings defined in /install/stringnames.txt.
+ *
+ * @package   installer
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$string['clitypevalue'] = 'tipo reikšmė';
+$string['clitypevaluedefault'] = 'tipo reikšmė, paspauskite „Enter“, jei norite naudoti numatytąją reikšmę ({$a})';
+$string['cliunknowoption'] = 'Neatpažintos parinktys: {$a} naudokite --žinyno parinktį.';
+$string['environmentrequireinstall'] = 'turi būti įdiegta ir įjungta';
+$string['environmentrequireversion'] = 'būtina naudoti versiją {$a->needed}, o jūs naudojate {$a->current}';
diff --git a/install/lang/lt_uni/error.php b/install/lang/lt_uni/error.php
new file mode 100644 (file)
index 0000000..e45ac05
--- /dev/null
@@ -0,0 +1,48 @@
+<?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/>.
+
+/**
+ * Automatically generated strings for Moodle installer
+ *
+ * Do not edit this file manually! It contains just a subset of strings
+ * needed during the very first steps of installation. This file was
+ * generated automatically by export-installer.php (which is part of AMOS
+ * {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
+ * list of strings defined in /install/stringnames.txt.
+ *
+ * @package   installer
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$string['cannotcreatelangdir'] = 'Negalima sukurti kalbos katalogo';
+$string['cannotcreatetempdir'] = 'Negalima sukurti laikinojo katalogo';
+$string['cannotdownloadcomponents'] = 'Negalima atsisiųsti komponentų';
+$string['cannotdownloadzipfile'] = 'Negalima atsisiųsti ZIP failo';
+$string['cannotfindcomponent'] = 'Nepavyko rasti komponento';
+$string['cannotsavemd5file'] = 'Negalima įrašyti md5 failo';
+$string['cannotsavezipfile'] = 'Negalima įrašyti ZIP failo';
+$string['cannotunzipfile'] = 'Negalima išskleisti failo';
+$string['componentisuptodate'] = 'Komponentas atnaujintas';
+$string['downloadedfilecheckfailed'] = 'Nepavyko patikrinti atsisiųsto failo';
+$string['invalidmd5'] = 'Kintamojo patikra nepavyko – bandykite dar kartą';
+$string['missingrequiredfield'] = 'Trūksta būtino lauko';
+$string['remotedownloaderror'] = 'Nepavyko į serverį atsisiųsti komponento, patikrinkite tarpinio serverio parametrus, labai rekomenduojama naudoti PHP cURL plėtinį.<br /><br />Turite rankiniu būdu atsisiųsti <a href="{$a->url}">{$a->url}</a> failą, nukopijuoti jį į {$a->dest} serveryje ir ten jį išskleisti.';
+$string['wrongdestpath'] = 'Neteisingas paskirties kelias';
+$string['wrongsourcebase'] = 'Neteisingas šaltinio URL pagrindas';
+$string['wrongzipfilename'] = 'Neteisingas ZIP failo vardas';
diff --git a/install/lang/lt_uni/install.php b/install/lang/lt_uni/install.php
new file mode 100644 (file)
index 0000000..6d0cec9
--- /dev/null
@@ -0,0 +1,66 @@
+<?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/>.
+
+/**
+ * Automatically generated strings for Moodle installer
+ *
+ * Do not edit this file manually! It contains just a subset of strings
+ * needed during the very first steps of installation. This file was
+ * generated automatically by export-installer.php (which is part of AMOS
+ * {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
+ * list of strings defined in /install/stringnames.txt.
+ *
+ * @package   installer
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$string['admindirname'] = 'Administratoriaus katalogas';
+$string['chooselanguagesub'] = 'Pasirinkite diegimo kalbą. Ši kalba bus naudojama ir kaip numatytoji svetainės kalba, nors vėliau ją bus galima pakeisti.';
+$string['clialreadyconfigured'] = 'Failas config.php jau yra, prašau naudoti admin/cli/install_database.php jei norite įrašyti šią svetainę.';
+$string['clialreadyinstalled'] = 'Failas config.php jau yra. Jei norite atnaujinti svetainę, naudokite admin/cli/upgrade.php.';
+$string['cliinstallheader'] = '„Moodle“ {$a} komandų eilutės diegimo programa';
+$string['databasehost'] = 'Duomenų bazės pagrindinis kompiuteris';
+$string['dataroot'] = 'Duomenų katalogas';
+$string['datarootpermission'] = 'Duomenų katalogo leidimai';
+$string['dbprefix'] = 'Lentelių priešvardis';
+$string['dirroot'] = '„Moodle“ katalogas';
+$string['environmenthead'] = 'Tikrinama aplinka...';
+$string['environmentsub2'] = 'Kiekvienas „Moodle“ leidimas turi minimalius PHP versijos ir privalomų PHP plėtinių skaičiaus reikalavimus. Prieš kiekvieną diegimą ir versijos naujinimą, išsamiai tikrinama aplinka. Jei nežinote, kaip įdiegti naują versiją arba įjungti PHP plėtinius, kreipkitės į serverio administratorių.';
+$string['errorsinenvironment'] = 'Aplinkos patikra nepavyko!';
+$string['installation'] = 'Diegimas';
+$string['langdownloaderror'] = 'Deja, {$a} kalbos atsisiųsti nepavyko. Diegimo procesas bus tęsiamas anglų kalba.';
+$string['memorylimithelp'] = '<p>Serverio PHP atminties limitas dabar nustatytas kaip {$a}.</p> <p>Vėliau dėl to „Moodle“ gali iškilti atminties problemų, ypač jei įjungta daug modulių ir (arba) yra daug vartotojų.</p> <p>Rekomenduojame sukonfigūruoti didesnį PHP limitą, jei galima, pvz., 40M. Galite pabandyti tai atlikti keliais būdais:</p> <ol> <li>Jei galite, pakartotinai sukompiliuokite PHP naudodami <i>--enable-memory-limit</i>. Taip „Moodle“ pati galės nustatyti atminties limitą.</li> <li>Jei turite prieigą prie php.ini failo, galite pakeisti <b>memory_limit</b> parametro reikšmę į 40M ar pan. Jei prieigos neturite, galite paprašyti, kad tai padarytų administratorius.</li> <li>Kai kuriuose PHP serveriuose „Moodle“ kataloge galite sukurti .htaccess failą, kuriame būtų ši eilutė : <blockquote><div>php_value memory_limit 40M</div></blockquote> <p>Tačiau kai kuriuose serveriuose dėl to neveiks <b>visi</b> PHP puslapiai (peržiūrėdami puslapius matysite klaidą), todėl the .htaccess failą teks pašalinti.</p></li> </ol>';
+$string['pathserrcreatedataroot'] = 'Diegimo programa negali sukurti duomenų katalogo ({$a->dataroot}).';
+$string['pathshead'] = 'Patvirtinti kelius';
+$string['pathsrodataroot'] = 'Į šakninį duomenų katalogą negalima įrašyti.';
+$string['pathsroparentdataroot'] = 'Į pirminį katalogą ({$a->parent}) negalima įrašyti. Diegimo programa negali sukurti katalogo ({$a->dataroot}).';
+$string['pathssubadmindir'] = 'Labai mažai žiniatinklio pagrindinių kompiuterių naudoja /admin kaip specialų URL, kad galėtumėte pasiekti valdymo skydą ar pan. Deja, dėl to kyla konfliktas su „Moodle“ administratoriaus puslapių standartine vieta. Tai galite ištaisyti, jei diegdami pervardysite administratoriaus katalogą ir tą naują pavadinimą įdėsite čia. Pavyzdžiui, <em>moodleadmin</em>. Taip bus ištaisyti administratoriaus saitai „Moodle“.';
+$string['pathssubdataroot'] = 'Reikalinga vieta, kur „Moodle“ galėtų saugoti įkeltus failus. Iš šio katalogo turi galėti skaityti IR Į JĮ  ĮRAŠYTI žiniatinklio serverio vartotojas (paprastai „nobody“ arba „apache“), bet jis neturi būti tiesiogiai pasiekiamas per žiniatinklį. Diegimo programa bandys jį sukurti, jei jo dar nėra.';
+$string['pathssubdirroot'] = 'Visas „Moodle“ diegimo katalogo kelias.';
+$string['pathssubwwwroot'] = 'Visas žiniatinklio adresas, kur bus galima pasiekti „Moodle“. „Moodle“ negalima pasiekti naudojant kelis adresus. Jei jūsų svetainė turi kelis viešuosius adresus, turite nustatyti nuolatinį peradresavimą iš jų visų, išskyrus šį vieną. Jei svetainę galima pasiekti tiek iš intraneto, tiek iš interneto, čia naudokite viešąjį adresą ir nustatykite DNS, kad intraneto vartotojai taip pat galėtų naudoti viešąjį adresą. Jei adresas klaidingas, naršyklėje pakeiskite URL, kad pakartotinai paleidus diegti būtų naudojama kita reikšmė.';
+$string['pathsunsecuredataroot'] = 'Šakninio duomenų katalogo kelias nesaugus';
+$string['pathswrongadmindir'] = 'Nėra administratoriaus katalogo';
+$string['phpversionhelp'] = '<p>„Moodle“ reikalauja, kad PHP versija būtų bent 4.3.0 arba 5.1.0 (5.0.x versijoje yra daug problemų).</p> <p>Dabar naudojate versiją {$a}</p> <p>Turite atnaujinti PHP versiją arba perkelti į pagrindinį kompiuterį, kuriame veikia naujesnė PHP versija!<br /> (Jei naudojate 5.0.x versiją, taip pat galite paleisti senesnę 4.4.x versiją)</p>';
+$string['welcomep20'] = 'Matote šį puslapį, nes į kompiuterį sėkmingai įdiegėte ir paleidote <strong>{$a->packname} {$a->packversion}</strong> paketą. Sveikiname!';
+$string['welcomep30'] = 'Šiame <strong>{$a->installername}</strong> leidime yra taikomosios programos, skirtos aplinkai, kurioje veiks <strong>Moodle</strong>, sukurti:';
+$string['welcomep40'] = 'Pakete taip pat yra <strong>Moodle {$a->moodlerelease} ({$a->moodleversion})</strong>.';
+$string['welcomep50'] = 'Visoms šio paketo taikomosioms programoms taikomos atitinkamos licencijos. Visas <strong>{$a->installername}</strong> paketas yra <a href="http://www.opensource.org/docs/definition_plain.html">atvirojo kodo</a> ir platinamas pagal <a href="http://www.gnu.org/copyleft/gpl.html">GPL</a> licenciją.';
+$string['welcomep60'] = 'Šiuose puslapiuose bus pateikta keletas paprastų veiksmų, kad būtų galima sukonfigūruoti ir nustatyti <strong>Moodle</strong> kompiuteryje. Galite priimti numatytuosius parametrus arba pasirinktinai juos pakeisti, kad atitiktų jūsų poreikius.';
+$string['welcomep70'] = 'Norėdami tęsti <strong>Moodle</strong> sąranką, spustelėkite žemiau esantį mygtuką Kitas.';
+$string['wwwroot'] = 'Žiniatinklio adresas';
diff --git a/install/lang/lt_uni/moodle.php b/install/lang/lt_uni/moodle.php
new file mode 100644 (file)
index 0000000..a0462de
--- /dev/null
@@ -0,0 +1,33 @@
+<?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/>.
+
+/**
+ * Automatically generated strings for Moodle installer
+ *
+ * Do not edit this file manually! It contains just a subset of strings
+ * needed during the very first steps of installation. This file was
+ * generated automatically by export-installer.php (which is part of AMOS
+ * {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
+ * list of strings defined in /install/stringnames.txt.
+ *
+ * @package   installer
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$string['next'] = 'Pirmyn';
index 22d60fc..5dbbcf4 100644 (file)
@@ -33,11 +33,15 @@ defined('MOODLE_INTERNAL') || die();
 $string['admindirname'] = 'Katalog admin';
 $string['availablelangs'] = 'Dostępne paczki językowe';
 $string['chooselanguagehead'] = 'Wybierz język';
-$string['chooselanguagesub'] = 'Proszę wybrać język TYLKO do instalacji. Stronę i języki dla użytkowników będzie można wybrać na następnym ekranie.';
-$string['clialreadyinstalled'] = 'Plik config.php już istnieje, użyj admin/cli/upgrade.php jeśli chcesz uaktualnić witrynę.';
+$string['chooselanguagesub'] = 'Proszę wybrać język do instalacji. Ten język będą również użyty jako domyślny język witryny, przy czym może być później zmieniony.';
+$string['clialreadyconfigured'] = 'Plik config.php już istnieje, użyj admin/cli/install_database.php jeśli chcesz zainstalować tę witrynę.';
+$string['clialreadyinstalled'] = 'Plik config.php już istnieje, użyj admin/cli/upgrade.php, jeśli chcesz uaktualnić witrynę.';
+$string['cliinstallheader'] = 'Program instalacyjny Moodle {$a} z linii poleceń';
 $string['databasehost'] = 'Host bazy danych';
 $string['databasename'] = 'Nazwa bazy danych';
-$string['dataroot'] = 'Katalog z danymi';
+$string['databasetypehead'] = 'Wybierz sterownik bazy danych';
+$string['dataroot'] = 'Katalog danych';
+$string['datarootpermission'] = 'Prawa katalogów danych';
 $string['dbprefix'] = 'Prefiks tabel';
 $string['dirroot'] = 'Katalog Moodle';
 $string['environmenthead'] = 'Sprawdzam środowisko (ustawienia) ...';
@@ -64,10 +68,13 @@ $string['pathserrcreatedataroot'] = 'Katalog danych ({$a->dataroot}) nie może z
 $string['pathshead'] = 'Potwierdź ścieżki';
 $string['pathsrodataroot'] = 'Główny katalog danych nie ma uprawnień do zapisu. ';
 $string['pathsroparentdataroot'] = 'Nadrzędny katalog ({$a->parent}) jest tylko do odczytu. Katalog danych ({$a->dataroot}) nie może zostać utworzony przez instalator. ';
+$string['pathssubadmindir'] = 'Nieliczne portale używają URL /admin jako specjalnego adresu panelu sterowania. Niestety jest to sprzeczne ze standardowej lokalizacją folderu stron administratora Moodle. Można to naprawić poprzez zmianę nazwy katalogu administratora w instalacji i podanie tej nazwy tu, np.: <em>moodleadmin.</em> Linki administratora Moodle będą automatycznie poprawione.';
+$string['pathssubdataroot'] = 'Potrzebny jest obszar, gdzie Moodle może zapisywać ładowane do niego pliki. Katalog ten powinien mieć prawo do odczyt i ZAPISU  przez użytkownika serwera WWW (zwykle &quot;nobody&quot; lub &quot;apache&quot;), ale może być być dostępny bezpośrednio przez sieć. Instalator spróbuje go utworzyć, jeśli nie istnieje.';
 $string['pathssubdirroot'] = 'Pełna ścieżka do katalogu z instalacją Moodle.';
+$string['pathssubwwwroot'] = 'Pełny adres internetowy, pod którym Moodle będzie dostępny. Moodle nie może być dostępny przy użyciu wielu adresów. Jeśli twoja witryna ma kilka adresów publicznych, należy skonfigurować trwałe przekierowania z wszystkich z nich na jeden. Jeśli Twoja witryna jest dostępna zarówno z intranetu i Internetu, korzystaj z publicznego adresu i ustaw DNS tak, aby użytkownicy Intranetu korzystali też z adresu publicznego. Jeśli adres nie jest poprawny, należy ponownie uruchomić instalację z innym adresem.';
 $string['pathsunsecuredataroot'] = 'Lokalizacja głównego katalogu danych nie jest bezpieczna';
 $string['pathswrongadmindir'] = 'Katalog admin nie istnieje';
-$string['phpextension'] = '{$a} rozszerzenie PHP';
+$string['phpextension'] = 'rozszerzenie PHP {$a}';
 $string['phpversion'] = 'Wersja PHP';
 $string['phpversionhelp'] = '<p>Moodle wymaga wersji PHP co najmniej 4.3.0 lub 5.1.0 (5.0.x posiada kilka znanych problemów).</p>
 <p>Obecnie jest uruchomiona wersja {$a}</p>
index e053c96..3658375 100644 (file)
@@ -240,3 +240,4 @@ $string['setting_keep_roles_and_enrolments'] = 'Keep current roles and enrolment
 $string['setting_keep_groups_and_groupings'] = 'Keep current groups and groupings';
 $string['totalcategorysearchresults'] = 'Total categories: {$a}';
 $string['totalcoursesearchresults'] = 'Total courses: {$a}';
+$string['morecoursesearchresults'] = 'More than {$a} courses found, showing first {$a} results';
index bf033ab..2f2b4c5 100644 (file)
@@ -52,7 +52,8 @@ $string['BJ'] = 'Benin';
 $string['BL'] = 'Saint Barthélemy';
 $string['BM'] = 'Bermuda';
 $string['BN'] = 'Brunei Darussalam';
-$string['BO'] = 'Bolivia';
+$string['BO'] = 'Bolivia, Plurinational State Of';
+$string['BQ'] = 'Bonaire, Sint Eustatius And Saba';
 $string['BR'] = 'Brazil';
 $string['BS'] = 'Bahamas';
 $string['BT'] = 'Bhutan';
@@ -65,6 +66,7 @@ $string['CC'] = 'Cocos (Keeling) Islands';
 $string['CD'] = 'Congo, The Democratic Republic Of The';
 $string['CF'] = 'Central African Republic';
 $string['CG'] = 'Congo';
+$string['CH'] = 'Switzerland';
 $string['CI'] = 'Côte D\'Ivoire';
 $string['CK'] = 'Cook Islands';
 $string['CL'] = 'Chile';
@@ -74,6 +76,7 @@ $string['CO'] = 'Colombia';
 $string['CR'] = 'Costa Rica';
 $string['CU'] = 'Cuba';
 $string['CV'] = 'Cape Verde';
+$string['CW'] = 'Curaçao';
 $string['CX'] = 'Christmas Island';
 $string['CY'] = 'Cyprus';
 $string['CZ'] = 'Czech Republic';
@@ -121,7 +124,6 @@ $string['HN'] = 'Honduras';
 $string['HR'] = 'Croatia';
 $string['HT'] = 'Haiti';
 $string['HU'] = 'Hungary';
-$string['CH'] = 'Switzerland';
 $string['ID'] = 'Indonesia';
 $string['IE'] = 'Ireland';
 $string['IL'] = 'Israel';
@@ -157,12 +159,12 @@ $string['LS'] = 'Lesotho';
 $string['LT'] = 'Lithuania';
 $string['LU'] = 'Luxembourg';
 $string['LV'] = 'Latvia';
-$string['LY'] = 'State of Libya';
+$string['LY'] = 'Libya';
 $string['MA'] = 'Morocco';
 $string['MC'] = 'Monaco';
 $string['MD'] = 'Moldova, Republic Of';
 $string['ME'] = 'Montenegro';
-$string['MF'] = 'Saint Martin';
+$string['MF'] = 'Saint Martin (French Part)';
 $string['MG'] = 'Madagascar';
 $string['MH'] = 'Marshall Islands';
 $string['MK'] = 'Macedonia, The Former Yugoslav Republic Of';
@@ -204,7 +206,7 @@ $string['PL'] = 'Poland';
 $string['PM'] = 'Saint Pierre And Miquelon';
 $string['PN'] = 'Pitcairn';
 $string['PR'] = 'Puerto Rico';
-$string['PS'] = 'Palestinian Territory, Occupied';
+$string['PS'] = 'Palestine, State Of';
 $string['PT'] = 'Portugal';
 $string['PW'] = 'Palau';
 $string['PY'] = 'Paraguay';
@@ -220,7 +222,7 @@ $string['SC'] = 'Seychelles';
 $string['SD'] = 'Sudan';
 $string['SE'] = 'Sweden';
 $string['SG'] = 'Singapore';
-$string['SH'] = 'Saint Helena';
+$string['SH'] = 'Saint Helena, Ascension And Tristan Da Cunha';
 $string['SI'] = 'Slovenia';
 $string['SJ'] = 'Svalbard And Jan Mayen';
 $string['SK'] = 'Slovakia';
@@ -229,8 +231,10 @@ $string['SM'] = 'San Marino';
 $string['SN'] = 'Senegal';
 $string['SO'] = 'Somalia';
 $string['SR'] = 'Suriname';
+$string['SS'] = 'South Sudan';
 $string['ST'] = 'Sao Tome And Principe';
 $string['SV'] = 'El Salvador';
+$string['SX'] = 'Sint Maarten (Dutch Part)';
 $string['SY'] = 'Syrian Arab Republic';
 $string['SZ'] = 'Swaziland';
 $string['TC'] = 'Turks And Caicos Islands';
@@ -257,7 +261,7 @@ $string['UY'] = 'Uruguay';
 $string['UZ'] = 'Uzbekistan';
 $string['VA'] = 'Holy See (Vatican City State)';
 $string['VC'] = 'Saint Vincent And The Grenadines';
-$string['VE'] = 'Venezuela';
+$string['VE'] = 'Venezuela, Bolivarian Republic Of';
 $string['VG'] = 'Virgin Islands, British';
 $string['VI'] = 'Virgin Islands, U.S.';
 $string['VN'] = 'Viet Nam';
index 323a2fe..6c85715 100644 (file)
@@ -713,7 +713,11 @@ class mssql_native_moodle_database extends moodle_database {
         $this->query_end($result);
 
         if ($limitfrom) { // Skip $limitfrom records
-            mssql_data_seek($result, $limitfrom);
+            if (!@mssql_data_seek($result, $limitfrom)) {
+                // Nothing, most probably seek past the end.
+                mssql_free_result($result);
+                $result = null;
+            }
         }
 
         return $this->create_recordset($result);
@@ -1176,7 +1180,7 @@ class mssql_native_moodle_database extends moodle_database {
     public function sql_concat() {
         $arr = func_get_args();
         foreach ($arr as $key => $ele) {
-            $arr[$key] = ' CAST(' . $ele . ' AS VARCHAR(255)) ';
+            $arr[$key] = ' CAST(' . $ele . ' AS NVARCHAR(255)) ';
         }
         $s = implode(' + ', $arr);
         if ($s === '') {
index bfa96b9..6081d0b 100644 (file)
@@ -1241,7 +1241,7 @@ class sqlsrv_native_moodle_database extends moodle_database {
         $arr = func_get_args();
 
         foreach ($arr as $key => $ele) {
-            $arr[$key] = ' CAST('.$ele.' AS VARCHAR(255)) ';
+            $arr[$key] = ' CAST('.$ele.' AS NVARCHAR(255)) ';
         }
         $s = implode(' + ', $arr);
 
index 5b8d3ef..5dce79f 100644 (file)
@@ -1279,6 +1279,12 @@ function get_fast_modinfo(&$course, $userid=0) {
 function rebuild_course_cache($courseid=0, $clearonly=false) {
     global $COURSE, $DB, $CFG;
 
+    if (!$clearonly && !empty($CFG->upgraderunning)) {
+        debugging('Function rebuild_course_cache() should not be called from upgrade script unless with argument clearonly.',
+                DEBUG_DEVELOPER);
+        $clearonly = true;
+    }
+
     // Destroy navigation caches
     navigation_cache::destroy_volatile_caches();
 
index a1252e1..690fc1e 100644 (file)
@@ -6455,28 +6455,18 @@ class core_string_manager implements string_manager {
     }
 
     /**
-     * Returns dependencies of current language, en is not included.
+     * Returns list of all explicit parent languages for the given language.
      *
-     * @param string $lang
-     * @return array all parents, the lang itself is last
+     * English (en) is considered as the top implicit parent of all language packs
+     * and is not included in the returned list. The language itself is appended to the
+     * end of the list. The method is aware of circular dependency risk.
+     *
+     * @see self::populate_parent_languages()
+     * @param string $lang the code of the language
+     * @return array all explicit parent languages with the lang itself appended
      */
     public function get_language_dependencies($lang) {
-        if ($lang === 'en') {
-            return array();
-        }
-        if (!file_exists("$this->otherroot/$lang/langconfig.php")) {
-            return array();
-        }
-        $string = array();
-        include("$this->otherroot/$lang/langconfig.php");
-
-        if (empty($string['parentlanguage'])) {
-            return array($lang);
-        } else {
-            $parentlang = $string['parentlanguage'];
-            unset($string);
-            return array_merge($this->get_language_dependencies($parentlang), array($lang));
-        }
+        return $this->populate_parent_languages($lang);
     }
 
     /**
@@ -6981,6 +6971,46 @@ class core_string_manager implements string_manager {
         fulldelete($this->menucache);
         $this->get_list_of_translations(true);
     }
+
+    /// End of external API ////////////////////////////////////////////////////
+
+    /**
+     * Helper method that recursively loads all parents of the given language.
+     *
+     * @see self::get_language_dependencies()
+     * @param string $lang language code
+     * @param array $stack list of parent languages already populated in previous recursive calls
+     * @return array list of all parents of the given language with the $lang itself added as the last element
+     */
+    protected function populate_parent_languages($lang, array $stack = array()) {
+
+        // English does not have a parent language.
+        if ($lang === 'en') {
+            return $stack;
+        }
+
+        // Prevent circular dependency (and thence the infinitive recursion loop).
+        if (in_array($lang, $stack)) {
+            return $stack;
+        }
+
+        // Load language configuration and look for the explicit parent language.
+        if (!file_exists("$this->otherroot/$lang/langconfig.php")) {
+            return $stack;
+        }
+        $string = array();
+        include("$this->otherroot/$lang/langconfig.php");
+
+        if (empty($string['parentlanguage']) or $string['parentlanguage'] === 'en') {
+            unset($string);
+            return array_merge(array($lang), $stack);
+
+        } else {
+            $parentlang = $string['parentlanguage'];
+            unset($string);
+            return $this->populate_parent_languages($parentlang, array_merge(array($lang), $stack));
+        }
+    }
 }
 
 
index f8709a7..a97d462 100644 (file)
@@ -667,12 +667,18 @@ class navigation_node implements renderable {
      * Hides the node and any children it has.
      *
      * @since 2.3.5
+     * @param array $typestohide Optional. An array of node types that should be hidden.
+     *      If null all nodes will be hidden.
+     *      If an array is given then nodes will only be hidden if their type mtatches an element in the array.
+     *          e.g. array(navigation_node::TYPE_COURSE) would hide only course nodes.
      */
-    public function hide() {
-        $this->display = false;
-        if ($this->has_children()) {
-            foreach ($this->children as $child) {
-                $child->hide();
+    public function hide(array $typestohide = null) {
+        if ($typestohide === null || in_array($this->type, $typestohide)) {
+            $this->display = false;
+            if ($this->has_children()) {
+                foreach ($this->children as $child) {
+                    $child->hide($typestohide);
+                }
             }
         }
     }
@@ -2745,18 +2751,24 @@ class global_navigation extends navigation_node {
     public function set_expansion_limit($type) {
         global $SITE;
         $nodes = $this->find_all_of_type($type);
+
+        // We only want to hide specific types of nodes.
+        // Only nodes that represent "structure" in the navigation tree should be hidden.
+        // If we hide all nodes then we risk hiding vital information.
+        $typestohide = array(
+            self::TYPE_CATEGORY,
+            self::TYPE_COURSE,
+            self::TYPE_SECTION,
+            self::TYPE_ACTIVITY
+        );
+
         foreach ($nodes as $node) {
             // We need to generate the full site node
             if ($type == self::TYPE_COURSE && $node->key == $SITE->id) {
                 continue;
             }
             foreach ($node->children as $child) {
-                // We still want to show course reports and participants containers
-                // or there will be navigation missing.
-                if ($type == self::TYPE_COURSE && $child->type === self::TYPE_CONTAINER) {
-                    continue;
-                }
-                $child->hide();
+                $child->hide($typestohide);
             }
         }
         return true;
index f5a20f7..a29e687 100644 (file)
@@ -587,6 +587,17 @@ class phpunit_util {
             if ($COURSE->id != $oldsite->id) {
                 $warnings[] = 'Warning: unexpected change of $COURSE';
             }
+
+        }
+
+        if (ini_get('max_execution_time') != 0) {
+            // This is special warning for all resets because we do not want any
+            // libraries to mess with timeouts unintentionally.
+            // Our PHPUnit integration is not supposed to change it either.
+
+            // TODO: MDL-38912 uncomment and fix all + somehow resolve timeouts in failed tests.
+            //$warnings[] = 'Warning: max_execution_time was changed.';
+            set_time_limit(0);
         }
 
         // restore original globals
diff --git a/lib/tests/fixtures/langtest/aa/langconfig.php b/lib/tests/fixtures/langtest/aa/langconfig.php
new file mode 100644 (file)
index 0000000..15ea4c8
--- /dev/null
@@ -0,0 +1,4 @@
+<?php
+
+$string['thislanguage'] = 'AA native name';
+$string['thislanguageint'] = 'AA international name';
diff --git a/lib/tests/fixtures/langtest/bb/langconfig.php b/lib/tests/fixtures/langtest/bb/langconfig.php
new file mode 100644 (file)
index 0000000..3e7802c
--- /dev/null
@@ -0,0 +1,4 @@
+<?php
+
+$string['thislanguage'] = 'Orphaned language with non-existing parent';
+$string['parentlanguage'] = 'bbparent';
diff --git a/lib/tests/fixtures/langtest/bc/langconfig.php b/lib/tests/fixtures/langtest/bc/langconfig.php
new file mode 100644 (file)
index 0000000..cec2bf9
--- /dev/null
@@ -0,0 +1,4 @@
+<?php
+
+$string['thislanguage'] = 'My parent is orphaned language';
+$string['parentlanguage'] = 'bb';
diff --git a/lib/tests/fixtures/langtest/cda/langconfig.php b/lib/tests/fixtures/langtest/cda/langconfig.php
new file mode 100644 (file)
index 0000000..e9af9ca
--- /dev/null
@@ -0,0 +1,4 @@
+<?php
+
+$string['thislanguage'] = 'Circular dependency A';
+$string['parentlanguage'] = 'cdc';
diff --git a/lib/tests/fixtures/langtest/cdb/langconfig.php b/lib/tests/fixtures/langtest/cdb/langconfig.php
new file mode 100644 (file)
index 0000000..e3f4c62
--- /dev/null
@@ -0,0 +1,4 @@
+<?php
+
+$string['thislanguage'] = 'Circular dependency B';
+$string['parentlanguage'] = 'cda';
diff --git a/lib/tests/fixtures/langtest/cdc/langconfig.php b/lib/tests/fixtures/langtest/cdc/langconfig.php
new file mode 100644 (file)
index 0000000..42be227
--- /dev/null
@@ -0,0 +1,4 @@
+<?php
+
+$string['thislanguage'] = 'Circular dependency C';
+$string['parentlanguage'] = 'cdb';
diff --git a/lib/tests/fixtures/langtest/de/langconfig.php b/lib/tests/fixtures/langtest/de/langconfig.php
new file mode 100644 (file)
index 0000000..843d7c1
--- /dev/null
@@ -0,0 +1,4 @@
+<?php
+
+$string['thislanguage'] = 'Deutsch';
+$string['parentlanguage'] = 'en';
diff --git a/lib/tests/fixtures/langtest/de_du/langconfig.php b/lib/tests/fixtures/langtest/de_du/langconfig.php
new file mode 100644 (file)
index 0000000..173d669
--- /dev/null
@@ -0,0 +1,4 @@
+<?php
+
+$string['thislanguage'] = 'Deutsch - Du';
+$string['parentlanguage'] = 'de';
diff --git a/lib/tests/fixtures/langtest/de_kids/langconfig.php b/lib/tests/fixtures/langtest/de_kids/langconfig.php
new file mode 100644 (file)
index 0000000..c5305ef
--- /dev/null
@@ -0,0 +1,4 @@
+<?php
+
+$string['thislanguage'] = 'Deutsch - Kids';
+$string['parentlanguage'] = 'de_du';
diff --git a/lib/tests/fixtures/langtest/sd/langconfig.php b/lib/tests/fixtures/langtest/sd/langconfig.php
new file mode 100644 (file)
index 0000000..6551f7f
--- /dev/null
@@ -0,0 +1,4 @@
+<?php
+
+$string['thislanguage'] = 'Self dependency';
+$string['parentlanguage'] = 'sd';
index fef75b5..12e756b 100644 (file)
@@ -1536,6 +1536,59 @@ class moodlelib_testcase extends advanced_testcase {
         $USER = $olduser;
     }
 
+    /**
+     * Test some critical TZ/DST.
+     *
+     * This method tests some special TZ/DST combinations that were fixed
+     * by MDL-38999. The tests are done by comparing the results of the
+     * output using Moodle TZ/DST support and PHP native one.
+     *
+     * Note: If you don't trust PHP TZ/DST support, can verify the
+     * harcoded expectations below with:
+     * http://www.tools4noobs.com/online_tools/unix_timestamp_to_datetime/
+     */
+    public function test_some_moodle_special_dst() {
+        $stamp = 1365386400; // 2013/04/08 02:00:00 GMT/UTC.
+
+        // In Europe/Tallinn it was 2013/04/08 05:00:00.
+        $expectation = '2013/04/08 05:00:00';
+        $phpdt = DateTime::createFromFormat('U', $stamp, new DateTimeZone('UTC'));
+        $phpdt->setTimezone(new DateTimeZone('Europe/Tallinn'));
+        $phpres = $phpdt->format('Y/m/d H:i:s'); // PHP result.
+        $moodleres = userdate($stamp, '%Y/%m/%d %H:%M:%S', 'Europe/Tallinn', false); // Moodle result.
+        $this->assertSame($expectation, $phpres);
+        $this->assertSame($expectation, $moodleres);
+
+        // In St. Johns it was 2013/04/07 23:30:00.
+        $expectation = '2013/04/07 23:30:00';
+        $phpdt = DateTime::createFromFormat('U', $stamp, new DateTimeZone('UTC'));
+        $phpdt->setTimezone(new DateTimeZone('America/St_Johns'));
+        $phpres = $phpdt->format('Y/m/d H:i:s'); // PHP result.
+        $moodleres = userdate($stamp, '%Y/%m/%d %H:%M:%S', 'America/St_Johns', false); // Moodle result.
+        $this->assertSame($expectation, $phpres);
+        $this->assertSame($expectation, $moodleres);
+
+        $stamp = 1383876000; // 2013/11/08 02:00:00 GMT/UTC.
+
+        // In Europe/Tallinn it was 2013/11/08 04:00:00.
+        $expectation = '2013/11/08 04:00:00';
+        $phpdt = DateTime::createFromFormat('U', $stamp, new DateTimeZone('UTC'));
+        $phpdt->setTimezone(new DateTimeZone('Europe/Tallinn'));
+        $phpres = $phpdt->format('Y/m/d H:i:s'); // PHP result.
+        $moodleres = userdate($stamp, '%Y/%m/%d %H:%M:%S', 'Europe/Tallinn', false); // Moodle result.
+        $this->assertSame($expectation, $phpres);
+        $this->assertSame($expectation, $moodleres);
+
+        // In St. Johns it was 2013/11/07 22:30:00.
+        $expectation = '2013/11/07 22:30:00';
+        $phpdt = DateTime::createFromFormat('U', $stamp, new DateTimeZone('UTC'));
+        $phpdt->setTimezone(new DateTimeZone('America/St_Johns'));
+        $phpres = $phpdt->format('Y/m/d H:i:s'); // PHP result.
+        $moodleres = userdate($stamp, '%Y/%m/%d %H:%M:%S', 'America/St_Johns', false); // Moodle result.
+        $this->assertSame($expectation, $phpres);
+        $this->assertSame($expectation, $moodleres);
+    }
+
     public function test_userdate() {
         global $USER, $CFG, $DB;
 
diff --git a/lib/tests/string_test.php b/lib/tests/string_test.php
new file mode 100644 (file)
index 0000000..c238881
--- /dev/null
@@ -0,0 +1,113 @@
+<?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/>.
+
+/**
+ * Unit tests for localization support in lib/moodlelib.php
+ *
+ * @package     core
+ * @category    test
+ * @copyright   2013 David Mudrak <david@moodle.com>
+ * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+global $CFG;
+require_once($CFG->libdir.'/moodlelib.php');
+
+/**
+ * Tests for the API of the string_manager
+ *
+ * @copyright 2013 David Mudrak <david@moodle.com>
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class string_manager_test extends advanced_testcase {
+
+    public function test_string_manager_instance() {
+        global $CFG;
+        $this->resetAfterTest();
+
+        $otherroot = dirname(__FILE__).'/fixtures/langtest';
+        $stringman = testable_core_string_manager::instance($otherroot);
+        $this->assertTrue(in_array('string_manager', class_implements($stringman)));
+    }
+
+    public function test_get_language_dependencies() {
+        global $CFG;
+        $this->resetAfterTest();
+
+        $otherroot = dirname(__FILE__).'/fixtures/langtest';
+        $stringman = testable_core_string_manager::instance($otherroot);
+
+        // There is no parent language for 'en'.
+        $this->assertSame(array(), $stringman->get_language_dependencies('en'));
+        // Language with no parent language declared.
+        $this->assertSame(array('aa'), $stringman->get_language_dependencies('aa'));
+        // Language with parent language explicitly set to English (en < de).
+        $this->assertSame(array('de'), $stringman->get_language_dependencies('de'));
+        // Language dependency hierarchy (de < de_du < de_kids).
+        $this->assertSame(array('de', 'de_du', 'de_kids'), $stringman->get_language_dependencies('de_kids'));
+        // Language with the parent language misconfigured to itself (sd < sd).
+        $this->assertSame(array('sd'), $stringman->get_language_dependencies('sd'));
+        // Language with circular dependency (cda < cdb < cdc < cda).
+        $this->assertSame(array('cda', 'cdb', 'cdc'), $stringman->get_language_dependencies('cdc'));
+        // Orphaned language (N/A < bb).
+        $this->assertSame(array('bb'), $stringman->get_language_dependencies('bb'));
+        // Descendant of an orphaned language (N/A < bb < bc).
+        $this->assertSame(array('bb', 'bc'), $stringman->get_language_dependencies('bc'));
+    }
+}
+
+
+/**
+ * Helper class providing testable string_manager
+ *
+ * @copyright 2013 David Mudrak <david@moodle.com>
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class testable_core_string_manager extends core_string_manager {
+
+    /**
+     * Factory method
+     *
+     * @param string $otherroot full path to the location of installed upstream language packs
+     * @param string $localroot full path to the location of locally customized language packs, defaults to $otherroot
+     * @param string $cacheroot full path to the location of on-disk cache
+     * @param bool $usecache use application permanent cache
+     * @param array $translist explicit list of visible translations
+     * @param string $menucache the location of a file that caches the list of available translations
+     * @return testable_core_string_manager
+     */
+    public static function instance($otherroot, $localroot = null, $cacheroot = null, $usecache = false,
+                                    array $translist = array(), $menucache = null) {
+        global $CFG;
+
+        if (is_null($localroot)) {
+            $localroot = $otherroot;
+        }
+
+        if (is_null($cacheroot)) {
+            $cacheroot = $CFG->cachedir.'/lang';
+        }
+
+        if (is_null($menucache)) {
+            $menucache = $CFG->cachedir.'/languages';
+        }
+
+        return new testable_core_string_manager($otherroot, $localroot, $cacheroot, $usecache, $translist, $menucache);
+    }
+}
index 0d541bb..95db9fa 100644 (file)
@@ -202,7 +202,7 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 201,Asia/Yerevan,1992,RussiaAsia,180,60,3,-1,6,0,26:00,9,-1,6,0,25:00
 202,Asia/Yerevan,1993,RussiaAsia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
 203,Asia/Yerevan,1995,,240,0,0,0,0,0,00:00,0,0,0,0,00:00
-204,Asia/Yerevan,1997,RussiaAsia,240,0,0,0,0,0,00:00,0,0,0,0,00:00
+204,Asia/Yerevan,1997,RussiaAsia,240,60,3,-1,0,0,06:00,10,-1,0,0,06:00
 205,Asia/Yerevan,2012,,240,0,0,0,0,0,00:00,0,0,0,0,00:00
 206,Asia/Baku,1970,RussiaAsia,240,0,0,0,0,0,00:00,0,0,0,0,00:00
 207,Asia/Baku,1981,RussiaAsia,240,60,4,1,-1,0,04:00,10,1,-1,0,03:00
@@ -272,7 +272,7 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 271,Asia/Nicosia,1978,Cyprus,120,60,4,1,0,0,02:00,10,2,-1,0,01:00
 272,Asia/Nicosia,1979,Cyprus,120,60,4,1,0,0,02:00,9,-1,0,0,01:00
 273,Asia/Nicosia,1981,Cyprus,120,60,3,-1,0,0,02:00,9,-1,0,0,01:00
-274,Asia/Nicosia,1998,EUAsia,120,60,3,-1,0,0,02:00,9,-1,0,0,01:00
+274,Asia/Nicosia,1998,EUAsia,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
 275,Asia/Tbilisi,1970,RussiaAsia,240,0,0,0,0,0,00:00,0,0,0,0,00:00
 276,Asia/Tbilisi,1981,RussiaAsia,240,60,4,1,-1,0,04:00,10,1,-1,0,03:00
 277,Asia/Tbilisi,1984,RussiaAsia,240,60,4,1,-1,0,04:00,9,-1,0,0,06:00
@@ -282,8 +282,8 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 281,Asia/Tbilisi,1994,E-EurAsia,240,60,3,-1,0,0,04:00,9,-1,0,0,03:00
 282,Asia/Tbilisi,1995,E-EurAsia,240,0,12,31,-1,0,16:00,9,-1,0,0,03:00
 283,Asia/Tbilisi,1996,,240,0,0,0,0,0,00:00,0,0,0,0,00:00
-284,Asia/Tbilisi,1997,E-EurAsia,240,0,0,0,0,0,00:00,0,0,0,0,00:00
-285,Asia/Tbilisi,2004,RussiaAsia,180,0,0,0,0,0,00:00,0,0,0,0,00:00
+284,Asia/Tbilisi,1997,E-EurAsia,240,60,3,-1,0,0,04:00,10,-1,0,0,03:00
+285,Asia/Tbilisi,2004,RussiaAsia,180,60,3,-1,0,0,05:00,10,-1,0,0,05:00
 286,Asia/Tbilisi,2005,,240,0,0,0,0,0,00:00,0,0,0,0,00:00
 287,Asia/Dili,1970,,540,0,0,0,0,0,00:00,0,0,0,0,00:00
 288,Asia/Dili,1976,,480,0,0,0,0,0,00:00,0,0,0,0,00:00
@@ -905,7 +905,7 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 904,Europe/Sofia,1982,C-Eur,120,60,3,-1,0,0,04:00,9,-1,0,0,04:00
 905,Europe/Sofia,1991,E-Eur,120,60,3,-1,0,0,02:00,9,-1,0,0,01:00
 906,Europe/Sofia,1996,E-Eur,120,60,3,-1,0,0,02:00,10,-1,0,0,01:00
-907,Europe/Sofia,1997,EU,120,60,3,-1,0,0,02:00,10,-1,0,0,01:00
+907,Europe/Sofia,1997,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
 908,Europe/Prague,1970,Czech,60,0,4,9,-1,0,03:00,10,1,0,0,03:00
 909,Europe/Prague,1979,EU,60,60,4,1,0,0,1:00,9,-1,0,0,1:00
 910,Europe/Prague,1981,EU,60,60,3,-1,0,0,1:00,9,-1,0,0,1:00
@@ -939,9 +939,9 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 938,Europe/Tallinn,1985,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
 939,Europe/Tallinn,1989,C-Eur,120,60,3,-1,0,0,04:00,9,-1,0,0,04:00
 940,Europe/Tallinn,1996,C-Eur,120,60,3,-1,0,0,04:00,10,-1,0,0,04:00
-941,Europe/Tallinn,1998,EU,120,60,3,-1,0,0,04:00,10,-1,0,0,04:00
+941,Europe/Tallinn,1998,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
 942,Europe/Tallinn,1999,,120,0,0,0,0,0,00:00,0,0,0,0,00:00
-943,Europe/Tallinn,2002,EU,120,0,0,0,0,0,00:00,0,0,0,0,00:00
+943,Europe/Tallinn,2002,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
 944,Europe/Helsinki,1970,Finland,120,60,4,3,-1,0,02:00,10,3,-1,0,01:00
 945,Europe/Helsinki,1981,Finland,120,60,3,-1,0,0,04:00,9,-1,0,0,04:00
 946,Europe/Helsinki,1982,Finland,120,0,3,-1,0,0,04:00,9,-1,0,0,04:00
@@ -994,9 +994,9 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 993,Europe/Riga,1985,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
 994,Europe/Riga,1989,Latvia,120,60,3,-1,0,0,04:00,9,-1,0,0,04:00
 995,Europe/Riga,1996,Latvia,120,0,3,-1,0,0,04:00,9,-1,0,0,04:00
-996,Europe/Riga,1997,EU,120,0,3,-1,0,0,04:00,9,-1,0,0,04:00
+996,Europe/Riga,1997,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
 997,Europe/Riga,2000,,120,0,0,0,0,0,00:00,0,0,0,0,00:00
-998,Europe/Riga,2001,EU,120,0,0,0,0,0,00:00,0,0,0,0,00:00
+998,Europe/Riga,2001,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
 999,Europe/Vaduz,1970,,60,0,0,0,0,0,00:00,0,0,0,0,00:00
 1000,Europe/Vaduz,1981,EU,60,60,3,-1,0,0,1:00,9,-1,0,0,1:00
 1001,Europe/Vaduz,1996,EU,60,60,3,-1,0,0,1:00,10,-1,0,0,1:00
@@ -1006,9 +1006,9 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 1005,Europe/Vilnius,1985,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
 1006,Europe/Vilnius,1991,C-Eur,120,60,3,-1,0,0,04:00,9,-1,0,0,04:00
 1007,Europe/Vilnius,1996,C-Eur,120,60,3,-1,0,0,04:00,10,-1,0,0,04:00
-1008,Europe/Vilnius,1998,EU,60,60,3,-1,0,0,03:00,10,-1,0,0,03:00
+1008,Europe/Vilnius,1998,EU,60,60,3,-1,0,0,1:00,10,-1,0,0,1:00
 1009,Europe/Vilnius,1999,,120,0,0,0,0,0,00:00,0,0,0,0,00:00
-1010,Europe/Vilnius,2003,EU,120,0,0,0,0,0,00:00,0,0,0,0,00:00
+1010,Europe/Vilnius,2003,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
 1011,Europe/Luxembourg,1970,Belgium,60,0,5,19,-1,0,03:00,10,7,-1,0,03:00
 1012,Europe/Luxembourg,1977,EU,60,60,4,1,0,0,1:00,9,-1,0,0,1:00
 1013,Europe/Luxembourg,1978,EU,60,60,4,1,0,0,1:00,10,1,-1,0,1:00
@@ -1032,7 +1032,7 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 1031,Europe/Chisinau,1991,Russia,120,60,3,-1,0,0,04:00,9,-1,0,0,04:00
 1032,Europe/Chisinau,1992,E-Eur,120,60,3,-1,0,0,02:00,9,-1,0,0,01:00
 1033,Europe/Chisinau,1996,E-Eur,120,60,3,-1,0,0,02:00,10,-1,0,0,01:00
-1034,Europe/Chisinau,1997,EU,120,60,3,-1,0,0,02:00,10,-1,0,0,01:00
+1034,Europe/Chisinau,1997,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
 1035,Europe/Monaco,1970,France,60,120,4,2,-1,0,03:00,9,16,-1,0,03:00
 1036,Europe/Monaco,1976,France,60,60,3,28,-1,0,02:00,9,26,-1,0,01:00
 1037,Europe/Monaco,1977,EU,60,60,4,1,0,0,1:00,9,-1,0,0,1:00
@@ -1093,7 +1093,7 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 1092,Europe/Bucharest,1993,Romania,120,0,3,-1,0,0,02:00,9,-1,0,0,02:00
 1093,Europe/Bucharest,1994,E-Eur,120,60,3,-1,0,0,02:00,9,-1,0,0,01:00
 1094,Europe/Bucharest,1996,E-Eur,120,60,3,-1,0,0,02:00,10,-1,0,0,01:00
-1095,Europe/Bucharest,1997,EU,120,60,3,-1,0,0,02:00,10,-1,0,0,01:00
+1095,Europe/Bucharest,1997,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
 1096,Europe/Kaliningrad,1970,Russia,180,60,9,1,-1,0,03:00,10,1,-1,0,02:00
 1097,Europe/Kaliningrad,1981,Russia,180,60,4,1,-1,0,03:00,10,1,-1,0,02:00
 1098,Europe/Kaliningrad,1984,Russia,180,60,4,1,-1,0,03:00,9,-1,0,0,05:00
@@ -1325,7 +1325,7 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 1324,Europe/Istanbul,1991,Turkey,120,60,3,-1,0,0,03:00,9,-1,0,0,03:00
 1325,Europe/Istanbul,1996,Turkey,120,60,3,-1,0,0,03:00,10,-1,0,0,03:00
 1326,Europe/Istanbul,2006,Turkey,120,0,3,-1,0,0,03:00,10,-1,0,0,03:00
-1327,Europe/Istanbul,2007,EU,120,0,3,-1,0,0,03:00,10,-1,0,0,03:00
+1327,Europe/Istanbul,2007,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
 1328,Europe/Kiev,1970,Russia,180,60,9,1,-1,0,03:00,10,1,-1,0,02:00
 1329,Europe/Kiev,1981,Russia,180,60,4,1,-1,0,03:00,10,1,-1,0,02:00
 1330,Europe/Kiev,1984,Russia,180,60,4,1,-1,0,03:00,9,-1,0,0,05:00
@@ -1358,7 +1358,7 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 1357,Europe/Simferopol,1992,E-Eur,120,60,3,-1,0,0,02:00,9,-1,0,0,01:00
 1358,Europe/Simferopol,1994,E-Eur,180,60,3,-1,0,0,03:00,9,-1,0,0,02:00
 1359,Europe/Simferopol,1996,Russia,180,60,3,-1,0,0,05:00,10,-1,0,0,05:00
-1360,Europe/Simferopol,1997,EU,120,60,3,-1,0,0,04:00,10,-1,0,0,04:00
+1360,Europe/Simferopol,1997,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
 1361,EST,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
 1362,MST,1970,,-420,0,0,0,0,0,00:00,0,0,0,0,00:00
 1363,HST,1970,,-600,0,0,0,0,0,00:00,0,0,0,0,00:00
@@ -1558,13 +1558,13 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 1557,America/St_Johns,1988,StJohns,-210,120,4,1,0,0,-3:29,10,-1,0,0,-4:29
 1558,America/St_Johns,1989,StJohns,-210,60,4,1,0,0,-3:29,10,-1,0,0,-4:29
 1559,America/St_Johns,2007,StJohns,-210,60,3,8,0,0,-3:29,11,1,0,0,-4:29
-1560,America/St_Johns,2011,Canada,-210,60,3,8,0,0,-3:29,11,1,0,0,-4:29
+1560,America/St_Johns,2011,Canada,-210,60,3,8,0,0,-1:30,11,1,0,0,-2:30
 1561,America/Goose_Bay,1970,StJohns,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
 1562,America/Goose_Bay,1987,StJohns,-240,60,4,1,0,0,-3:59,10,-1,0,0,-4:59
 1563,America/Goose_Bay,1988,StJohns,-240,120,4,1,0,0,-3:59,10,-1,0,0,-4:59
 1564,America/Goose_Bay,1989,StJohns,-240,60,4,1,0,0,-3:59,10,-1,0,0,-4:59
 1565,America/Goose_Bay,2007,StJohns,-240,60,3,8,0,0,-3:59,11,1,0,0,-4:59
-1566,America/Goose_Bay,2011,Canada,-240,60,3,8,0,0,-3:59,11,1,0,0,-4:59
+1566,America/Goose_Bay,2011,Canada,-240,60,3,8,0,0,-2:00,11,1,0,0,-3:00
 1567,America/Halifax,1970,Halifax,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
 1568,America/Halifax,1973,Halifax,-240,0,4,-1,0,0,-2:00,10,-1,0,0,-3:00
 1569,America/Halifax,1974,Canada,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
@@ -1691,7 +1691,7 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 1690,America/Matamoros,1989,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
 1691,America/Matamoros,2001,Mexico,-360,60,5,1,0,0,-4:00,9,-1,0,0,-5:00
 1692,America/Matamoros,2002,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1693,America/Matamoros,2010,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1693,America/Matamoros,2010,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
 1694,America/Monterrey,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
 1695,America/Monterrey,1988,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
 1696,America/Monterrey,1989,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
@@ -1706,7 +1706,7 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 1705,America/Ojinaga,1998,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
 1706,America/Ojinaga,2001,Mexico,-420,60,5,1,0,0,-5:00,9,-1,0,0,-6:00
 1707,America/Ojinaga,2002,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1708,America/Ojinaga,2010,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1708,America/Ojinaga,2010,US,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
 1709,America/Chihuahua,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
 1710,America/Chihuahua,1996,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
 1711,America/Chihuahua,1998,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
@@ -1730,7 +1730,7 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 1729,America/Tijuana,1996,Mexico,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
 1730,America/Tijuana,2001,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
 1731,America/Tijuana,2002,Mexico,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1732,America/Tijuana,2010,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1732,America/Tijuana,2010,US,-480,60,3,8,0,0,-6:00,11,1,0,0,-7:00
 1733,America/Santa_Isabel,1970,,-480,0,0,0,0,0,00:00,0,0,0,0,00:00
 1734,America/Santa_Isabel,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
 1735,America/Santa_Isabel,1987,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
@@ -2266,7 +2266,7 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 2265,America/Asuncion,2005,Para,-240,60,10,15,0,0,-4:00,3,8,0,0,-5:00
 2266,America/Asuncion,2010,Para,-240,60,10,1,0,0,-4:00,4,8,0,0,-5:00
 2267,America/Asuncion,2013,Para,-240,60,10,1,0,0,-4:00,3,24,-1,0,-5:00
-2268,America/Asuncion,2014,Para,-240,0,10,1,0,0,-4:00,3,24,-1,0,-5:00
+2268,America/Asuncion,2014,Para,-240,60,10,1,0,0,-4:00,4,8,0,0,-5:00
 2269,America/Lima,1970,Peru,-300,0,12,31,-1,0,07:00,3,24,0,0,-6:00
 2270,America/Lima,1986,Peru,-300,60,1,1,-1,0,-5:00,4,1,-1,0,-6:00
 2271,America/Lima,1995,Peru,-300,0,1,1,-1,0,-5:00,4,1,-1,0,-6:00
index 6d20d2a..9d31f04 100644 (file)
@@ -484,7 +484,6 @@ class quiz_grading_report extends quiz_default_report {
         $transaction = $DB->start_delegated_transaction();
         foreach ($qubaids as $qubaid) {
             $attempt = $attempts[$qubaid];
-            $quba = question_engine::load_questions_usage_by_activity($qubaid);
             $attemptobj = new quiz_attempt($attempt, $this->quiz, $this->cm, $this->course);
             $attemptobj->process_submitted_actions(time());
         }
index 374db3f..f1f08ca 100644 (file)
@@ -105,7 +105,7 @@ if ($lastattempt && ($lastattempt->state == quiz_attempt::IN_PROGRESS ||
 
 } else {
     // Get number for the next or unfinished attempt.
-    if ($lastattempt && !$lastattempt->preview && !$quizobj->is_preview_user()) {
+    if ($lastattempt) {
         $attemptnumber = $lastattempt->attempt + 1;
     } else {
         $lastattempt = false;
index 6779d80..0cb5302 100644 (file)
@@ -2065,7 +2065,7 @@ class page_wiki_save extends page_wiki_edit {
 
             //deleting old locks
             wiki_delete_locks($this->page->id, $USER->id, $this->section);
-            $url = new moodle_url('view.php', array('pageid' => $this->page->id, 'group' => $this->subwiki->groupid));
+            $url = new moodle_url('/mod/wiki/view.php', array('pageid' => $this->page->id, 'group' => $this->subwiki->groupid));
             redirect($url);
         } else {
             print_error('savingerror', 'wiki');
index 9d59b2d..d59a7c0 100644 (file)
@@ -652,7 +652,14 @@ abstract class repository {
 
         // Prevent access to private repositories when logged in as.
         if (session_is_loggedinas()) {
-            $can = false;
+            $allowed = array('coursefiles', 'equella', 'filesystem', 'flickr_public', 'local', 'merlot', 'recent',
+                's3', 'upload', 'url', 'user', 'webdav', 'wikimedia', 'youtube');
+            // Are only accessible the repositories which do not contain private data (any data
+            // that is not part of Moodle, "Private files" is not considered "Pivate"). And if they
+            // do not contain private data, then it should not be a user instance, which is private by definition.
+            if (!in_array($this->type, $allowed) || $repocontext->contextlevel == CONTEXT_USER) {
+                $can = false;
+            }
         }
 
         // We are going to ensure that the current context was legit, and reliable to check
index e4f0a42..9571674 100644 (file)
@@ -62,4 +62,7 @@
 #page-grade-grading-pick .template-actions .action .action-text {display:inline;}
 #page-grade-grading-pick .template-actions .action .action-icon {margin:0px 3px;}
 #page-grade-grading-pick .template-preview-confirm {width:50%;margin:1em auto;border:1px solid #EEE; padding: 1em;}
-#page-grade-grading-pick .singlebutton {clear:both;}
\ No newline at end of file
+#page-grade-grading-pick .singlebutton,
+.path-grade-report-user h2.main {
+    clear:both;
+}
\ No newline at end of file
index 544c792..e0aa636 100644 (file)
@@ -163,4 +163,7 @@ $THEME->javascripts = array(
 
 // Sets a custom render factory to use with the theme, used when working with custom renderers.
 $THEME->rendererfactory = 'theme_overridden_renderer_factory';
-$THEME->csspostprocess = 'mymobile_user_settings';
\ No newline at end of file
+$THEME->csspostprocess = 'mymobile_user_settings';
+
+// Disables CSS Optimiser for MyMobile theme.
+$THEME->supportscssoptimisation = false;
\ No newline at end of file
index d744a25..c21831e 100644 (file)
 defined('MOODLE_INTERNAL') || die();
 
 
-$version  = 2012062506.03;              // YYYYMMDD      = weekly release date of this DEV branch
+$version  = 2012062506.04;              // YYYYMMDD      = weekly release date of this DEV branch
                                         //         RR    = release increments - 00 in DEV branches
                                         //           .XX = incremental changes
 
-$release  = '2.3.6+ (Build: 20130328)';  // Human-friendly version name
+$release  = '2.3.6+ (Build: 20130405)';  // Human-friendly version name
 
 $branch   = '23';                       // this version's branch
 $maturity = MATURITY_STABLE;            // this version's maturity level