Merge branch 'MDL-30243' of git://github.com/lazydaisy/moodle
authorAparup Banerjee <aparup@moodle.com>
Mon, 28 Nov 2011 06:33:57 +0000 (14:33 +0800)
committerAparup Banerjee <aparup@moodle.com>
Mon, 28 Nov 2011 06:33:57 +0000 (14:33 +0800)
560 files changed:
admin/blocks.php
admin/cli/install.php
admin/cli/purge_caches.php [new file with mode: 0644]
admin/settings/users.php
admin/tool/langimport/index.php
admin/tool/langimport/lang/en/tool_langimport.php
admin/tool/unittest/other/pdflibtestpage.php
admin/tool/upgrade.txt [new file with mode: 0644]
admin/tool/xmldb/lang/en/tool_xmldb.php
admin/webservice/forms.php
auth/mnet/jump.php
backup/moodle2/backup_stepslib.php
backup/moodle2/restore_course_task.class.php
backup/moodle2/restore_root_task.class.php
backup/moodle2/restore_stepslib.php
backup/restore.php
backup/util/dbops/restore_dbops.class.php
backup/util/ui/renderer.php
backup/util/ui/restore_ui.class.php
backup/util/ui/yui/confirmcancel/confirmcancel.js
blocks/comments/block_comments.php
blocks/section_links/block_section_links.php
comment/comment.js
enrol/externallib.php
enrol/imsenterprise/lib.php
filter/mediaplugin/filter.php
filter/upgrade.txt [new file with mode: 0644]
grade/edit/tree/grade.php
grade/edit/tree/lib.php
grade/grading/form/rubric/edit.php
grade/grading/form/rubric/edit_form.php
grade/grading/form/rubric/js/rubriceditor.js
grade/grading/form/rubric/lang/en/gradingform_rubric.php
grade/grading/form/rubric/lib.php
grade/grading/form/rubric/renderer.php
grade/grading/form/rubric/rubriceditor.php
grade/grading/form/rubric/styles.css
grade/report/user/lib.php
group/lib.php
install.php
install/lang/af/admin.php
install/lang/af/langconfig.php
install/lang/am/install.php
install/lang/am/langconfig.php
install/lang/am/moodle.php
install/lang/ar/admin.php
install/lang/ar/error.php
install/lang/ar/install.php
install/lang/ar/langconfig.php
install/lang/ar/moodle.php
install/lang/ast/admin.php
install/lang/ast/error.php
install/lang/ast/install.php
install/lang/ast/langconfig.php
install/lang/ast/moodle.php
install/lang/az/admin.php
install/lang/az/error.php
install/lang/az/install.php
install/lang/az/langconfig.php
install/lang/be/langconfig.php
install/lang/be/moodle.php
install/lang/bg/admin.php
install/lang/bg/error.php
install/lang/bg/install.php
install/lang/bg/langconfig.php
install/lang/bg/moodle.php
install/lang/bn/admin.php
install/lang/bn/install.php
install/lang/bn/langconfig.php
install/lang/bn/moodle.php
install/lang/bs/install.php
install/lang/bs/langconfig.php
install/lang/ca/admin.php
install/lang/ca/error.php
install/lang/ca/install.php
install/lang/ca/langconfig.php
install/lang/ca/moodle.php
install/lang/ckb/langconfig.php [new file with mode: 0644]
install/lang/cs/admin.php
install/lang/cs/error.php
install/lang/cs/install.php
install/lang/cs/langconfig.php
install/lang/cs/moodle.php
install/lang/cy/admin.php
install/lang/cy/error.php
install/lang/cy/install.php
install/lang/cy/langconfig.php
install/lang/cy/moodle.php
install/lang/da/admin.php
install/lang/da/error.php
install/lang/da/install.php
install/lang/da/langconfig.php
install/lang/da/moodle.php
install/lang/de/admin.php
install/lang/de/error.php
install/lang/de/install.php
install/lang/de/langconfig.php
install/lang/de/moodle.php
install/lang/de_du/error.php
install/lang/de_du/install.php
install/lang/de_du/langconfig.php
install/lang/de_kids/langconfig.php
install/lang/dv/admin.php
install/lang/dv/error.php
install/lang/dv/install.php
install/lang/dv/langconfig.php
install/lang/dv/moodle.php
install/lang/el/admin.php
install/lang/el/error.php
install/lang/el/install.php
install/lang/el/langconfig.php
install/lang/el/moodle.php
install/lang/en/admin.php
install/lang/en/error.php
install/lang/en/install.php
install/lang/en/langconfig.php
install/lang/en/moodle.php
install/lang/en_us/install.php
install/lang/en_us/langconfig.php
install/lang/es/admin.php
install/lang/es/error.php
install/lang/es/install.php
install/lang/es/langconfig.php
install/lang/es/moodle.php
install/lang/es_ar/langconfig.php
install/lang/es_es/langconfig.php
install/lang/es_mx/langconfig.php
install/lang/et/admin.php
install/lang/et/error.php
install/lang/et/install.php
install/lang/et/langconfig.php
install/lang/et/moodle.php
install/lang/eu/admin.php
install/lang/eu/error.php
install/lang/eu/install.php
install/lang/eu/langconfig.php
install/lang/eu/moodle.php
install/lang/fa/admin.php
install/lang/fa/install.php
install/lang/fa/langconfig.php
install/lang/fa/moodle.php
install/lang/fi/admin.php
install/lang/fi/error.php
install/lang/fi/install.php
install/lang/fi/langconfig.php
install/lang/fi/moodle.php
install/lang/fil/langconfig.php
install/lang/fil/moodle.php
install/lang/fj/langconfig.php
install/lang/fr/admin.php
install/lang/fr/error.php
install/lang/fr/install.php
install/lang/fr/langconfig.php
install/lang/fr/moodle.php
install/lang/fr_ca/install.php
install/lang/fr_ca/langconfig.php
install/lang/fr_ca/moodle.php
install/lang/ga/langconfig.php
install/lang/gd/langconfig.php
install/lang/gl/admin.php
install/lang/gl/error.php
install/lang/gl/install.php
install/lang/gl/langconfig.php
install/lang/gl/moodle.php
install/lang/gu/error.php
install/lang/gu/langconfig.php
install/lang/gu/moodle.php
install/lang/he/admin.php
install/lang/he/error.php
install/lang/he/install.php
install/lang/he/langconfig.php
install/lang/he/moodle.php
install/lang/hi/langconfig.php
install/lang/hi/moodle.php
install/lang/hr/admin.php
install/lang/hr/error.php
install/lang/hr/install.php
install/lang/hr/langconfig.php
install/lang/hr/moodle.php
install/lang/hu/admin.php
install/lang/hu/error.php
install/lang/hu/install.php
install/lang/hu/langconfig.php
install/lang/hu/moodle.php
install/lang/hy/admin.php
install/lang/hy/error.php
install/lang/hy/install.php
install/lang/hy/langconfig.php
install/lang/hy/moodle.php
install/lang/id/langconfig.php
install/lang/id/moodle.php
install/lang/is/admin.php
install/lang/is/error.php
install/lang/is/install.php
install/lang/is/langconfig.php
install/lang/is/moodle.php
install/lang/it/admin.php
install/lang/it/error.php
install/lang/it/install.php
install/lang/it/langconfig.php
install/lang/it/moodle.php
install/lang/ja/admin.php
install/lang/ja/error.php
install/lang/ja/install.php
install/lang/ja/langconfig.php
install/lang/ja/moodle.php
install/lang/ka/admin.php
install/lang/ka/install.php
install/lang/ka/langconfig.php
install/lang/kk/install.php
install/lang/kk/langconfig.php
install/lang/kk/moodle.php
install/lang/km/admin.php
install/lang/km/error.php
install/lang/km/install.php
install/lang/km/langconfig.php
install/lang/km/moodle.php
install/lang/kn/langconfig.php
install/lang/ko/admin.php
install/lang/ko/error.php
install/lang/ko/install.php
install/lang/ko/langconfig.php
install/lang/ko/moodle.php
install/lang/la/langconfig.php
install/lang/la/moodle.php
install/lang/lo/admin.php
install/lang/lo/install.php
install/lang/lo/langconfig.php
install/lang/lo/moodle.php
install/lang/lt/langconfig.php
install/lang/lt/moodle.php
install/lang/lv/admin.php
install/lang/lv/error.php
install/lang/lv/install.php
install/lang/lv/langconfig.php
install/lang/lv/moodle.php
install/lang/mi_tn/langconfig.php
install/lang/mi_tn/moodle.php
install/lang/mi_wwow/admin.php
install/lang/mi_wwow/error.php
install/lang/mi_wwow/install.php
install/lang/mi_wwow/langconfig.php
install/lang/mi_wwow/moodle.php
install/lang/mk/admin.php
install/lang/mk/error.php
install/lang/mk/install.php
install/lang/mk/langconfig.php
install/lang/mk/moodle.php
install/lang/ml/langconfig.php
install/lang/ml/moodle.php
install/lang/mn/admin.php
install/lang/mn/error.php
install/lang/mn/install.php
install/lang/mn/langconfig.php
install/lang/mn/moodle.php
install/lang/mr/admin.php
install/lang/mr/error.php
install/lang/mr/install.php
install/lang/mr/langconfig.php
install/lang/mr/moodle.php
install/lang/ms/langconfig.php
install/lang/nl/admin.php
install/lang/nl/error.php
install/lang/nl/install.php
install/lang/nl/langconfig.php
install/lang/nl/moodle.php
install/lang/nn/langconfig.php
install/lang/nn/moodle.php
install/lang/no/admin.php
install/lang/no/error.php
install/lang/no/install.php
install/lang/no/langconfig.php
install/lang/no/moodle.php
install/lang/no_gr/langconfig.php
install/lang/no_gr/moodle.php
install/lang/oc_es/langconfig.php
install/lang/pl/admin.php
install/lang/pl/error.php
install/lang/pl/install.php
install/lang/pl/langconfig.php
install/lang/pl/moodle.php
install/lang/pt/admin.php
install/lang/pt/error.php
install/lang/pt/install.php
install/lang/pt/langconfig.php
install/lang/pt/moodle.php
install/lang/pt_br/admin.php
install/lang/pt_br/error.php
install/lang/pt_br/install.php
install/lang/pt_br/langconfig.php
install/lang/pt_br/moodle.php
install/lang/ro/admin.php
install/lang/ro/error.php
install/lang/ro/install.php
install/lang/ro/langconfig.php
install/lang/ro/moodle.php
install/lang/ru/admin.php
install/lang/ru/error.php
install/lang/ru/install.php
install/lang/ru/langconfig.php
install/lang/ru/moodle.php
install/lang/si/admin.php
install/lang/si/error.php
install/lang/si/install.php
install/lang/si/langconfig.php
install/lang/si/moodle.php
install/lang/sk/admin.php
install/lang/sk/error.php
install/lang/sk/install.php
install/lang/sk/langconfig.php
install/lang/sk/moodle.php
install/lang/sl/admin.php
install/lang/sl/error.php
install/lang/sl/install.php
install/lang/sl/langconfig.php
install/lang/sl/moodle.php
install/lang/sm/install.php
install/lang/sm/langconfig.php
install/lang/sm/moodle.php
install/lang/so/admin.php
install/lang/so/install.php
install/lang/so/langconfig.php
install/lang/so/moodle.php
install/lang/sq/langconfig.php
install/lang/sq/moodle.php
install/lang/sr/langconfig.php
install/lang/sr_cr/admin.php
install/lang/sr_cr/error.php
install/lang/sr_cr/install.php
install/lang/sr_cr/langconfig.php
install/lang/sr_cr/moodle.php
install/lang/sr_cr_bo/langconfig.php
install/lang/sr_lt/admin.php
install/lang/sr_lt/error.php
install/lang/sr_lt/install.php
install/lang/sr_lt/langconfig.php
install/lang/sr_lt/moodle.php
install/lang/sv/admin.php
install/lang/sv/error.php
install/lang/sv/install.php
install/lang/sv/langconfig.php
install/lang/sv/moodle.php
install/lang/ta/admin.php
install/lang/ta/error.php
install/lang/ta/install.php
install/lang/ta/langconfig.php
install/lang/ta/moodle.php
install/lang/ta_lk/admin.php
install/lang/ta_lk/error.php
install/lang/ta_lk/install.php
install/lang/ta_lk/langconfig.php
install/lang/ta_lk/moodle.php
install/lang/te/admin.php
install/lang/te/langconfig.php
install/lang/te/moodle.php
install/lang/th/admin.php
install/lang/th/install.php
install/lang/th/langconfig.php
install/lang/th/moodle.php
install/lang/ti/langconfig.php
install/lang/ti/moodle.php
install/lang/tl/admin.php
install/lang/tl/error.php
install/lang/tl/install.php
install/lang/tl/langconfig.php
install/lang/tl/moodle.php
install/lang/to/install.php
install/lang/to/langconfig.php
install/lang/to/moodle.php
install/lang/tr/admin.php
install/lang/tr/error.php
install/lang/tr/install.php
install/lang/tr/langconfig.php
install/lang/tr/moodle.php
install/lang/uk/langconfig.php
install/lang/uk/moodle.php
install/lang/ur/install.php
install/lang/ur/langconfig.php
install/lang/ur/moodle.php
install/lang/uz/install.php
install/lang/uz/langconfig.php
install/lang/uz/moodle.php
install/lang/vi/admin.php
install/lang/vi/install.php
install/lang/vi/langconfig.php
install/lang/vi/moodle.php
install/lang/wo/langconfig.php
install/lang/zh_cn/admin.php
install/lang/zh_cn/error.php
install/lang/zh_cn/install.php
install/lang/zh_cn/langconfig.php
install/lang/zh_cn/moodle.php
install/lang/zh_tw/admin.php
install/lang/zh_tw/error.php
install/lang/zh_tw/install.php
install/lang/zh_tw/langconfig.php
install/lang/zh_tw/moodle.php
install/lang/zu/error.php
install/lang/zu/install.php
install/lang/zu/langconfig.php
install/stringnames.txt
lang/en/admin.php
lang/en/backup.php
lang/en/error.php
lang/en/install.php
lang/en/moodle.php
lang/en/webservice.php
lib/adminlib.php
lib/bennu/iCalendar_components.php
lib/bennu/iCalendar_parameters.php
lib/bennu/iCalendar_properties.php
lib/datalib.php
lib/db/install.xml
lib/db/services.php
lib/db/upgrade.php
lib/db/upgradelib.php
lib/ddl/simpletest/testddl.php
lib/dml/moodle_database.php
lib/dml/mysqli_native_moodle_database.php
lib/dml/simpletest/testdml.php
lib/dml/sqlsrv_native_moodle_database.php
lib/dmllib.php
lib/editor/tinymce/lib.php
lib/editor/tinymce/settings.php
lib/filestorage/file_storage.php
lib/filterlib.php
lib/form/form.js
lib/formslib.php
lib/gradelib.php
lib/installlib.php
lib/moodlelib.php
lib/outputcomponents.php
lib/outputrequirementslib.php
lib/plagiarismlib.php
lib/questionlib.php
lib/resourcelib.php
lib/rsslib.php
lib/setup.php
lib/setuplib.php
lib/simpletest/testcompletionlib.php
lib/upgrade.txt
lib/upgradelib.php
lib/weblib.php
login/token.php
message/lib.php
mod/assignment/lib.php
mod/chat/report.php
mod/forum/db/access.php
mod/forum/lang/en/forum.php
mod/forum/lib.php
mod/forum/post.php
mod/forum/version.php
mod/lesson/continue.php
mod/lesson/lang/en/lesson.php
mod/lesson/mod_form.php
mod/lti/ajax.php
mod/lti/backup/moodle1/lib.php
mod/lti/backup/moodle2/backup_lti_stepslib.php
mod/lti/db/access.php
mod/lti/db/install.xml
mod/lti/db/log.php [new file with mode: 0644]
mod/lti/db/upgrade.php
mod/lti/edit_form.php
mod/lti/grade.php
mod/lti/index.php
mod/lti/instructor_edit_tool_type.php
mod/lti/lang/en/lti.php
mod/lti/launch.php
mod/lti/lib.php
mod/lti/localadminlib.php
mod/lti/locallib.php
mod/lti/mod_form.js
mod/lti/mod_form.php
mod/lti/request_tool.php
mod/lti/return.php
mod/lti/service.php
mod/lti/servicelib.php
mod/lti/settings.php
mod/lti/simpletest/testlocallib.php
mod/lti/styles.css
mod/lti/submissions.js
mod/lti/typessettings.php
mod/lti/version.php
mod/lti/view.php
mod/quiz/attemptlib.php
mod/quiz/editlib.php
mod/quiz/grade.php
mod/quiz/module.js
mod/quiz/report/attemptsreport.php
mod/quiz/startattempt.php
mod/quiz/styles.css
mod/quiz/summary.php
mod/scorm/datamodels/aicclib.php
mod/scorm/datamodels/scorm_12.js.php
mod/scorm/lib.php
mod/scorm/report/interactions/report.php
mod/url/locallib.php
mod/wiki/edit_form.php
mod/wiki/pagelib.php
mod/wiki/styles.css
plagiarism/lib.php
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/editlib.php
question/engine/datalib.php
question/format.php
question/format/xml/format.php
question/renderer.php [new file with mode: 0644]
question/type/edit_question_form.php
question/type/numerical/edit_numerical_form.php
question/type/numerical/questiontype.php
question/type/questiontypebase.php
question/type/shortanswer/edit_shortanswer_form.php
question/type/shortanswer/questiontype.php
question/type/truefalse/edit_truefalse_form.php
report/backups/index.php
report/configlog/index.php
report/courseoverview/index.php
report/log/index.php
report/loglive/index.php
report/questioninstances/index.php
report/security/index.php
report/stats/index.php
report/upgrade.txt
repository/dropbox/lib.php
repository/dropbox/locallib.php
repository/lib.php
tag/coursetagslib.php
tag/locallib.php
theme/anomaly/config.php
theme/anomaly/javascript/navigation.js [deleted file]
theme/anomaly/style/general.css
theme/base/style/blocks.css
theme/base/style/core.css
theme/base/style/user.css
theme/canvas/style/text.css
theme/image.php
theme/javascript.php
theme/mymobile/lang/en/theme_mymobile.php
theme/mymobile/renderers.php
theme/sky_high/lang/en/theme_sky_high.php
theme/standard/style/core.css
theme/standard/style/css3.css
theme/styles.php
user/lib.php
user/message.html
user/messageselect.php
user/profile.php
user/view.php
version.php
webservice/externallib.php
webservice/lib.php
webservice/renderer.php

index 8f4fdc9..ca9633d 100644 (file)
             exit;
 
         } else {
-            // Inform block it's about to be deleted
-            if (file_exists("$CFG->dirroot/blocks/$block->name/block_$block->name.php")) {
-                $blockobject = block_instance($block->name);
-                if ($blockobject) {
-                    $blockobject->before_delete();  //only if we can create instance, block might have been already removed
-                }
-            }
-
-            // First delete instances and then block
-            $instances = $DB->get_records('block_instances', array('blockname' => $block->name));
-            if(!empty($instances)) {
-                foreach($instances as $instance) {
-                    blocks_delete_instance($instance);
-                }
-            }
-
-            // Delete block
-            $DB->delete_records('block', array('id'=>$block->id));
-
-            drop_plugin_tables($block->name, "$CFG->dirroot/blocks/$block->name/db/install.xml", false); // old obsoleted table names
-            drop_plugin_tables('block_'.$block->name, "$CFG->dirroot/blocks/$block->name/db/install.xml", false);
-
-            // Delete the capabilities that were defined by this block
-            capabilities_cleanup('block/'.$block->name);
-
-            // Remove event handlers and dequeue pending events
-            events_uninstall('block/'.$block->name);
+            uninstall_plugin('block', $block->name);
 
             $a->block = $strblockname;
             $a->directory = $CFG->dirroot.'/blocks/'.$block->name;
index 68ed892..04d1ee8 100644 (file)
@@ -133,9 +133,6 @@ $CFG->dirroot              = dirname(dirname(dirname(__FILE__)));
 $CFG->libdir               = "$CFG->dirroot/lib";
 $CFG->wwwroot              = "http://localhost";
 $CFG->httpswwwroot         = $CFG->wwwroot;
-$CFG->dataroot             = str_replace('\\', '/', dirname(dirname(dirname(dirname(__FILE__)))).'/moodledata');
-$CFG->tempdir              = $CFG->dataroot.'/temp';
-$CFG->cachedir             = $CFG->dataroot.'/temp';
 $CFG->docroot              = 'http://docs.moodle.org';
 $CFG->running_installer    = true;
 $CFG->early_install_lang   = true;
@@ -186,7 +183,7 @@ list($options, $unrecognized) = cli_get_params(
         'chmod'             => '2777',
         'lang'              => $CFG->lang,
         'wwwroot'           => '',
-        'dataroot'          => $CFG->dataroot,
+        'dataroot'          => str_replace('\\', '/', dirname(dirname(dirname(dirname(__FILE__)))).'/moodledata'),
         'dbtype'            => $defaultdb,
         'dbhost'            => 'localhost',
         'dbname'            => 'moodle',
@@ -270,7 +267,7 @@ if ($interactive) {
 $chmod = octdec(clean_param($options['chmod'], PARAM_INT));
 if ($interactive) {
     cli_separator();
-    cli_heading('Data directories permission'); // todo localize
+    cli_heading(get_string('datarootpermission', 'install'));
     $prompt = get_string('clitypevaluedefault', 'admin', decoct($chmod));
     $error = '';
     do {
@@ -330,9 +327,12 @@ $CFG->httpswwwroot  = $CFG->wwwroot;
 
 
 //We need dataroot before lang download
-if (!empty($options['dataroot'])) {
-    $CFG->dataroot = $options['dataroot'];
+$dataroot = clean_param($options['dataroot'], PARAM_PATH);
+if ($dataroot !== $options['dataroot']) {
+    $a = (object)array('option' => 'dataroot', 'value' => $options['dataroot']);
+    cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
 }
+$CFG->dataroot = $dataroot;
 if ($interactive) {
     cli_separator();
     $i=0;
@@ -380,6 +380,8 @@ if ($interactive) {
         cli_error(get_string('pathserrcreatedataroot', 'install', $a));
     }
 }
+$CFG->tempdir  = $CFG->dataroot.'/temp';
+$CFG->cachedir = $CFG->dataroot.'/cache';
 
 // download required lang packs
 if ($CFG->lang !== 'en') {
diff --git a/admin/cli/purge_caches.php b/admin/cli/purge_caches.php
new file mode 100644 (file)
index 0000000..f008da2
--- /dev/null
@@ -0,0 +1,53 @@
+<?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/>.
+
+/**
+ * @package    core
+ * @subpackage cli
+ * @copyright  2011 David Mudrak <david@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+define('CLI_SCRIPT', true);
+
+require(dirname(dirname(dirname(__FILE__))).'/config.php');
+require_once($CFG->libdir.'/clilib.php');
+
+list($options, $unrecognized) = cli_get_params(array('help' => false), array('h' => 'help'));
+
+if ($unrecognized) {
+    $unrecognized = implode("\n  ", $unrecognized);
+    cli_error(get_string('cliunknowoption', 'admin', $unrecognized), 2);
+}
+
+if ($options['help']) {
+    $help =
+"Invalidates all Moodle internal caches
+
+Options:
+-h, --help            Print out this help
+
+Example:
+\$sudo -u www-data /usr/bin/php admin/cli/purge_caches.php
+";
+
+    echo $help;
+    exit(0);
+}
+
+purge_all_caches();
+
+exit(0);
\ No newline at end of file
index 02d49b0..256da17 100644 (file)
@@ -89,6 +89,9 @@ if ($hassiteconfig
                 $defaultuserid = 0;
             }
 
+            $restorersnewrole = $creatornewroles;
+            $restorersnewrole[0] = get_string('none');
+
             $temp->add(new admin_setting_configselect('notloggedinroleid', get_string('notloggedinroleid', 'admin'),
                           get_string('confignotloggedinroleid', 'admin'), $defaultguestid, ($guestroles + $otherroles)));
             $temp->add(new admin_setting_configselect('guestroleid', get_string('guestroleid', 'admin'),
@@ -97,12 +100,15 @@ if ($hassiteconfig
                           get_string('configdefaultuserroleid', 'admin'), $defaultuserid, ($userroles + $otherroles)));
             $temp->add(new admin_setting_configselect('creatornewroleid', get_string('creatornewroleid', 'admin'),
                           get_string('creatornewroleid_help', 'admin'), $defaultteacherid, $creatornewroles));
+            $temp->add(new admin_setting_configselect('restorernewroleid', get_string('restorernewroleid', 'admin'),
+                          get_string('restorernewroleid_help', 'admin'), $defaultteacherid, $restorersnewrole));
 
             // release memory
             unset($otherroles);
             unset($guestroles);
             unset($userroles);
             unset($creatornewroles);
+            unset($restorersnewrole);
         }
 
         $temp->add(new admin_setting_configcheckbox('autologinguests', get_string('autologinguests', 'admin'), get_string('configautologinguests', 'admin'), 0));
index 964c64c..80d8829 100644 (file)
@@ -35,17 +35,29 @@ require_once($CFG->libdir.'/componentlib.class.php');
 
 admin_externalpage_setup('toollangimport');
 
-if (!empty($CFG->skiplangupgrade)) {
-    echo $OUTPUT->header();
-    echo $OUTPUT->box(get_string('langimportdisabled', 'tool_langimport'));
-    echo $OUTPUT->footer();
-    die;
+if (empty($CFG->langotherroot)) {
+    throw new moodle_exception('missingcfglangotherroot', 'tool_langimport');
 }
 
 $mode          = optional_param('mode', 0, PARAM_INT);              // action
 $pack          = optional_param_array('pack', array(), PARAM_SAFEDIR);    // pack to install
 $uninstalllang = optional_param('uninstalllang', '', PARAM_LANG);   // installed pack to uninstall
 $confirm       = optional_param('confirm', 0, PARAM_BOOL);          // uninstallation confirmation
+$purgecaches   = optional_param('purgecaches', false, PARAM_BOOL);  // explicit caches reset
+
+if ($purgecaches) {
+    require_sesskey();
+    get_string_manager()->reset_caches();
+    redirect($PAGE->url);
+}
+
+if (!empty($CFG->skiplangupgrade)) {
+    echo $OUTPUT->header();
+    echo $OUTPUT->box(get_string('langimportdisabled', 'tool_langimport'));
+    echo $OUTPUT->single_button(new moodle_url($PAGE->url, array('purgecaches' => 1)), get_string('purgestringcaches', 'tool_langimport'));
+    echo $OUTPUT->footer();
+    die;
+}
 
 define('INSTALLATION_OF_SELECTED_LANG', 2);
 define('DELETION_OF_SELECTED_LANG', 4);
index e2fbf51..a5ead16 100644 (file)
 $string['install'] = 'Install selected language pack';
 $string['installedlangs'] = 'Installed language packs';
 $string['langimport'] = 'Language import utility';
-$string['langimportdisabled'] = 'Language import feature has been disabled. You have to update your language packs manually at the file-system level.';
+$string['langimportdisabled'] = 'Language import feature has been disabled. You have to update your language packs manually at the file-system level. Do not forget to purge string caches after you do so.';
 $string['langpackinstalled'] = 'Language pack {$a} was successfully installed';
 $string['langpackremoved'] = 'Language pack was uninstalled';
 $string['langpackupdateskipped'] = 'Update of {$a} language pack skipped';
 $string['langpackuptodate'] = 'Language pack {$a} is up-to-date';
 $string['langupdatecomplete'] = 'Language pack update completed';
+$string['missingcfglangotherroot'] = 'Missing configuration value $CFG->langotherroot';
 $string['missinglangparent'] = 'Missing parent language <em>{$a->parent}</em> of <em>{$a->lang}</em>.';
 $string['nolangupdateneeded'] = 'All your language packs are up to date, no update is needed';
 $string['pluginname'] = 'Language packs';
+$string['purgestringcaches'] = 'Purge string caches';
 $string['remotelangnotavailable'] = 'Because Moodle can not connect to download.moodle.org, we are unable to do language pack installation automatically. Please download the appropriate zip file(s) from http://download.moodle.org, copy them to your {$a} directory and unzip them manually.';
 $string['uninstall'] = 'Uninstall selected language pack';
 $string['uninstallconfirm'] = 'You are about to completely uninstall language pack {$a}, are you sure?';
index 644a86e..5266bfe 100644 (file)
@@ -19,8 +19,7 @@
  *
  * @package    tool
  * @subpackage unittest
- * @copyright 2009 David Mudrak <david.mudrak@gmail.com>
- * @author     N.D.Freear@open.ac.uk, T.J.Hunt@open.ac.uk
+ * @copyright  2009 David Mudrak <david.mudrak@gmail.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
diff --git a/admin/tool/upgrade.txt b/admin/tool/upgrade.txt
new file mode 100644 (file)
index 0000000..3af7d3a
--- /dev/null
@@ -0,0 +1,21 @@
+This files describes API changes in /admin/tool/* - plugins,
+information provided here is intended especially for developers.
+
+
+=== 2.2 ===
+
+API changes:
+* new admin tool plugin type introduced
+
+
+How to migrate existing admin reports:
+# move all files to new /admin/tool/yourplugin/ location
+# update all links to admin tools /$CFG->admin/report/ to /$CFG->admin/tool/
+# add language pack with at least 'pluginname' string
+# update all language strings (use 'tool_yourplugin' instead of 'report_yourplugin') - use AMOS hints in commit message
+# update all capability names
+# create db/install.php migration script - delete old settings and capabilities (see converted plugins for examples)
+# grep the plugin codebase and look for any remaining 'coursereport' occurrences
+# update CSS selectors
+
+See http://docs.moodle.org/dev/Admin_tools for more details and explanation.
index 1c2a350..b24a219 100644 (file)
@@ -71,6 +71,7 @@ $string['down'] = 'Down';
 $string['duplicate'] = 'Duplicate';
 $string['duplicatefieldname'] = 'Another field with that name exists';
 $string['duplicatekeyname'] = 'Another key with that name exists';
+$string['duplicatetablename'] = 'Another table with that name exists';
 $string['edit'] = 'Edit';
 $string['edit_field'] = 'Edit field';
 $string['edit_field_save'] = 'Save field';
@@ -113,6 +114,7 @@ $string['incorrectfieldname'] = 'Incorrect name';
 $string['index'] = 'Index';
 $string['indexes'] = 'Indexes';
 $string['integerincorrectlength'] = 'Incorrect length for integer field';
+$string['incorrecttablename'] = 'Incorrect table name';
 $string['key'] = 'Key';
 $string['keys'] = 'Keys';
 $string['listreservedwords'] = 'List of Reserved Words<br />(used to keep <a href="http://docs.moodle.org/en/XMLDB_reserved_words" target="_blank">XMLDB_reserved_words</a> updated)';
@@ -156,6 +158,7 @@ $string['selectonecommand'] = 'Please select one action from the list to view PH
 $string['selectonefieldkeyindex'] = 'Please select one field/key/index from the list to view the PHP code';
 $string['selecttable'] = 'Select table:';
 $string['table'] = 'Table';
+$string['tablenameempty'] = 'The table name cannot be empty';
 $string['tables'] = 'Tables';
 $string['textincorrectlength'] = 'Incorrect length for text field';
 $string['unload'] = 'Unload';
index 377d8cf..7520228 100644 (file)
@@ -68,6 +68,11 @@ class external_service_form extends moodleform {
                 get_string('restrictedusers', 'webservice'));
         $mform->addHelpButton('restrictedusers', 'restrictedusers', 'webservice');
 
+        //can users download files
+        $mform->addElement('advcheckbox', 'downloadfiles', get_string('downloadfiles', 'webservice'));
+        $mform->setAdvanced('downloadfiles');
+        $mform->addHelpButton('downloadfiles', 'downloadfiles', 'webservice');
+
         /// needed to select automatically the 'No required capability" option
         $currentcapabilityexist = false;
         if (empty($service->requiredcapability)) {
index d55346c..d44d058 100644 (file)
@@ -37,6 +37,13 @@ if (!is_enabled_auth('mnet')) {
 
 // If hostid hasn't been specified, try getting it using wwwroot
 if (!$hostid) {
+    $hostwwwroot = trim($hostwwwroot);
+    $hostwwwroot = rtrim($hostwwwroot, '/');
+
+    // ensure the wwwroot starts with a http or https prefix
+    if (strtolower(substr($hostwwwroot, 0, 4)) != 'http') {
+        $hostwwwroot = 'http://'.$hostwwwroot;
+    }
     $hostid = $DB->get_field('mnet_host', 'id', array('wwwroot' => $hostwwwroot));
 }
 
index 9c2ef17..8454934 100644 (file)
@@ -1114,14 +1114,12 @@ class backup_users_structure_step extends backup_structure_step {
         $user->set_source_sql('SELECT u.*, c.id AS contextid, m.wwwroot AS mnethosturl
                                  FROM {user} u
                                  JOIN {backup_ids_temp} bi ON bi.itemid = u.id
-                                 JOIN {context} c ON c.instanceid = u.id
+                            LEFT JOIN {context} c ON c.instanceid = u.id AND c.contextlevel = ' . CONTEXT_USER . '
                             LEFT JOIN {mnet_host} m ON m.id = u.mnethostid
                                 WHERE bi.backupid = ?
-                                  AND bi.itemname = ?
-                                  AND c.contextlevel = ?', array(
+                                  AND bi.itemname = ?', array(
                                       backup_helper::is_sqlparam($this->get_backupid()),
-                                      backup_helper::is_sqlparam('userfinal'),
-                                      backup_helper::is_sqlparam(CONTEXT_USER)));
+                                      backup_helper::is_sqlparam('userfinal')));
 
         // All the rest on information is only added if we arent
         // in an anonymized backup
@@ -1772,12 +1770,15 @@ class backup_annotate_all_user_files extends backup_execution_step {
             'backupid' => $this->get_backupid(), 'itemname' => 'userfinal'));
         foreach ($rs as $record) {
             $userid = $record->itemid;
-            $userctxid = get_context_instance(CONTEXT_USER, $userid)->id;
+            $userctx = get_context_instance(CONTEXT_USER, $userid);
+            if (!$userctx) {
+                continue; // User has not context, sure it's a deleted user, so cannot have files
+            }
             // Proceed with every user filearea
             foreach ($fileareas as $filearea) {
                 // We don't need to specify itemid ($userid - 5th param) as far as by
                 // context we can get all the associated files. See MDL-22092
-                backup_structure_dbops::annotate_files($this->get_backupid(), $userctxid, 'user', $filearea, null);
+                backup_structure_dbops::annotate_files($this->get_backupid(), $userctx->id, 'user', $filearea, null);
             }
         }
         $rs->close();
index fb441f8..1ab98bf 100644 (file)
@@ -133,6 +133,26 @@ class restore_course_task extends restore_task {
         $startdate->set_ui(new backup_setting_ui_dateselector($startdate, get_string('setting_course_startdate', 'backup')));
         $this->add_setting($startdate);
 
+        $keep_enrols = new restore_course_generic_setting('keep_roles_and_enrolments', base_setting::IS_BOOLEAN, false);
+        $keep_enrols->set_ui(new backup_setting_ui_select($keep_enrols, $keep_enrols->get_name(), array(1=>get_string('yes'), 0=>get_string('no'))));
+        $keep_enrols->get_ui()->set_label(get_string('setting_keep_roles_and_enrolments', 'backup'));
+        if ($this->get_target() != backup::TARGET_CURRENT_DELETING and $this->get_target() != backup::TARGET_EXISTING_DELETING) {
+            $keep_enrols->set_value(false);
+            $keep_enrols->set_status(backup_setting::LOCKED_BY_CONFIG);
+            $keep_enrols->set_visibility(backup_setting::HIDDEN);
+        }
+        $this->add_setting($keep_enrols);
+
+        $keep_groups = new restore_course_generic_setting('keep_groups_and_groupings', base_setting::IS_BOOLEAN, false);
+        $keep_groups->set_ui(new backup_setting_ui_select($keep_groups, $keep_groups->get_name(), array(1=>get_string('yes'), 0=>get_string('no'))));
+        $keep_groups->get_ui()->set_label(get_string('setting_keep_groups_and_groupings', 'backup'));
+        if ($this->get_target() != backup::TARGET_CURRENT_DELETING and $this->get_target() != backup::TARGET_EXISTING_DELETING) {
+            $keep_groups->set_value(false);
+            $keep_groups->set_status(backup_setting::LOCKED_BY_CONFIG);
+            $keep_groups->set_visibility(backup_setting::HIDDEN);
+        }
+        $this->add_setting($keep_groups);
+
         // Define overwrite_conf to decide if course configuration will be restored over existing one
         $overwrite = new restore_course_overwrite_conf_setting('overwrite_conf', base_setting::IS_BOOLEAN, false);
         $overwrite->set_ui(new backup_setting_ui_select($overwrite, $overwrite->get_name(), array(1=>get_string('yes'), 0=>get_string('no'))));
index 04b7f4b..a5163e9 100644 (file)
@@ -37,6 +37,10 @@ class restore_root_task extends restore_task {
         // Conditionally create the temp table (can exist from prechecks) and delete old stuff
         $this->add_step(new restore_create_and_clean_temp_stuff('create_and_clean_temp_stuff'));
 
+        // Now make sure the user that is running the restore can actually access the course
+        // before executing any other step (potentially performing permission checks)
+        $this->add_step(new restore_fix_restorer_access_step('fix_restorer_access'));
+
         // If we haven't preloaded information, load all the included inforef records to temp_ids table
         $this->add_step(new restore_load_included_inforef_records('load_inforef_records'));
 
index 3044c7f..ae93170 100644 (file)
@@ -802,7 +802,14 @@ class restore_groups_structure_step extends restore_structure_step {
 
         $data->groupingid = $this->get_new_parentid('grouping'); // Use new parentid
         $data->groupid    = $this->get_mappingid('group', $data->groupid); // Get from mappings
-        $DB->insert_record('groupings_groups', $data);  // No need to set this mapping (no child info nor files)
+
+        $params = array();
+        $params['groupingid'] = $data->groupingid;
+        $params['groupid']    = $data->groupid;
+
+        if (!$DB->record_exists('groupings_groups', $params)) {
+            $DB->insert_record('groupings_groups', $data);  // No need to set this mapping (no child info nor files)
+        }
     }
 
     protected function after_execute() {
@@ -1102,7 +1109,6 @@ class restore_course_structure_step extends restore_structure_step {
         global $CFG, $DB;
 
         $data = (object)$data;
-        $oldid = $data->id; // We'll need this later
 
         $fullname  = $this->get_setting_value('course_fullname');
         $shortname = $this->get_setting_value('course_shortname');
@@ -1115,7 +1121,13 @@ class restore_course_structure_step extends restore_structure_step {
         $data->id = $this->get_courseid();
         $data->fullname = $fullname;
         $data->shortname= $shortname;
-        $data->idnumber = '';
+
+        $context = get_context_instance_by_id($this->task->get_contextid());
+        if (has_capability('moodle/course:changeidnumber', $context, $this->task->get_userid())) {
+            $data->idnumber = '';
+        } else {
+            unset($data->idnumber);
+        }
 
         // Only restrict modules if original course was and target site too for new courses
         $data->restrictmodules = $data->restrictmodules && !empty($CFG->restrictmodulesfor) && $CFG->restrictmodulesfor == 'all';
@@ -1422,6 +1434,57 @@ class restore_enrolments_structure_step extends restore_structure_step {
 }
 
 
+/**
+ * Make sure the user restoring the course can actually access it.
+ */
+class restore_fix_restorer_access_step extends restore_execution_step {
+    protected function define_execution() {
+        global $CFG, $DB;
+
+        if (!$userid = $this->task->get_userid()) {
+            return;
+        }
+
+        if (empty($CFG->restorernewroleid)) {
+            // Bad luck, no fallback role for restorers specified
+            return;
+        }
+
+        $courseid = $this->get_courseid();
+        $context = context_course::instance($courseid);
+
+        if (is_enrolled($context, $userid, 'moodle/course:update', true) or is_viewing($context, $userid, 'moodle/course:update')) {
+            // Current user may access the course (admin, category manager or restored teacher enrolment usually)
+            return;
+        }
+
+        // Try to add role only - we do not need enrolment if user has moodle/course:view or is already enrolled
+        role_assign($CFG->restorernewroleid, $userid, $context);
+
+        if (is_enrolled($context, $userid, 'moodle/course:update', true) or is_viewing($context, $userid, 'moodle/course:update')) {
+            // Extra role is enough, yay!
+            return;
+        }
+
+        // The last chance is to create manual enrol if it does not exist and and try to enrol the current user,
+        // hopefully admin selected suitable $CFG->restorernewroleid ...
+        if (!enrol_is_enabled('manual')) {
+            return;
+        }
+        if (!$enrol = enrol_get_plugin('manual')) {
+            return;
+        }
+        if (!$DB->record_exists('enrol', array('enrol'=>'manual', 'courseid'=>$courseid))) {
+            $course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
+            $fields = array('status'=>ENROL_INSTANCE_ENABLED, 'enrolperiod'=>$enrol->get_config('enrolperiod', 0), 'roleid'=>$enrol->get_config('roleid', 0));
+            $enrol->add_instance($course, $fields);
+        }
+
+        enrol_try_internal_enrol($courseid, $userid);
+    }
+}
+
+
 /**
  * This structure steps restores the filters and their configs
  */
@@ -1981,7 +2044,7 @@ class restore_activity_grading_structure_step extends restore_structure_step {
         $newitemid = $this->get_mappingid(restore_gradingform_plugin::itemid_mapping($areaname), $data->itemid);
 
         $oldid = $data->id;
-        $data->formid = $newformid;
+        $data->definitionid = $newformid;
         $data->raterid = $this->get_mappingid('user', $data->raterid);
         $data->itemid = $newitemid;
 
index 04ed41a..2ac6b78 100644 (file)
@@ -46,7 +46,7 @@ if (!$restore->is_independent()) {
             $restore->execute();
         } catch(Exception $e) {
             $restore->cleanup();
-            throw new moodle_exception((string)$e);
+            throw $e;
         }
     } else {
         $restore->save_controller();
index f036470..58342b2 100644 (file)
@@ -824,54 +824,58 @@ abstract class restore_dbops {
             $newuserid = $DB->insert_record('user', $user);
             self::set_backup_ids_record($restoreid, 'user', $recuser->itemid, $newuserid);
             // Let's create the user context and annotate it (we need it for sure at least for files)
-            $newuserctxid = get_context_instance(CONTEXT_USER, $newuserid)->id;
-            self::set_backup_ids_record($restoreid, 'context', $recuser->parentitemid, $newuserctxid);
-
-            // Process custom fields
-            if (isset($user->custom_fields)) { // if present in backup
-                foreach($user->custom_fields['custom_field'] as $udata) {
-                    $udata = (object)$udata;
-                    // If the profile field has data and the profile shortname-datatype is defined in server
-                    if ($udata->field_data) {
-                        if ($field = $DB->get_record('user_info_field', array('shortname'=>$udata->field_name, 'datatype'=>$udata->field_type))) {
-                        /// Insert the user_custom_profile_field
-                            $rec = new stdClass();
-                            $rec->userid  = $newuserid;
-                            $rec->fieldid = $field->id;
-                            $rec->data    = $udata->field_data;
-                            $DB->insert_record('user_info_data', $rec);
+            // but for deleted users that don't have a context anymore (MDL-30192). We are done for them
+            // and nothing else (custom fields, prefs, tags, files...) will be created.
+            if (empty($user->deleted)) {
+                $newuserctxid = $user->deleted ? 0 : get_context_instance(CONTEXT_USER, $newuserid)->id;
+                self::set_backup_ids_record($restoreid, 'context', $recuser->parentitemid, $newuserctxid);
+
+                // Process custom fields
+                if (isset($user->custom_fields)) { // if present in backup
+                    foreach($user->custom_fields['custom_field'] as $udata) {
+                        $udata = (object)$udata;
+                        // If the profile field has data and the profile shortname-datatype is defined in server
+                        if ($udata->field_data) {
+                            if ($field = $DB->get_record('user_info_field', array('shortname'=>$udata->field_name, 'datatype'=>$udata->field_type))) {
+                            /// Insert the user_custom_profile_field
+                                $rec = new stdClass();
+                                $rec->userid  = $newuserid;
+                                $rec->fieldid = $field->id;
+                                $rec->data    = $udata->field_data;
+                                $DB->insert_record('user_info_data', $rec);
+                            }
                         }
                     }
                 }
-            }
 
-            // Process tags
-            if (!empty($CFG->usetags) && isset($user->tags)) { // if enabled in server and present in backup
-                $tags = array();
-                foreach($user->tags['tag'] as $usertag) {
-                    $usertag = (object)$usertag;
-                    $tags[] = $usertag->rawname;
+                // Process tags
+                if (!empty($CFG->usetags) && isset($user->tags)) { // if enabled in server and present in backup
+                    $tags = array();
+                    foreach($user->tags['tag'] as $usertag) {
+                        $usertag = (object)$usertag;
+                        $tags[] = $usertag->rawname;
+                    }
+                    tag_set('user', $newuserid, $tags);
                 }
-                tag_set('user', $newuserid, $tags);
-            }
 
-            // Process preferences
-            if (isset($user->preferences)) { // if present in backup
-                foreach($user->preferences['preference'] as $preference) {
-                    $preference = (object)$preference;
-                    // Prepare the record and insert it
-                    $preference->userid = $newuserid;
-                    $status = $DB->insert_record('user_preferences', $preference);
+                // Process preferences
+                if (isset($user->preferences)) { // if present in backup
+                    foreach($user->preferences['preference'] as $preference) {
+                        $preference = (object)$preference;
+                        // Prepare the record and insert it
+                        $preference->userid = $newuserid;
+                        $status = $DB->insert_record('user_preferences', $preference);
+                    }
                 }
-            }
 
-            // Create user files in pool (profile, icon, private) by context
-            restore_dbops::send_files_to_pool($basepath, $restoreid, 'user', 'icon', $recuser->parentitemid, $userid);
-            restore_dbops::send_files_to_pool($basepath, $restoreid, 'user', 'profile', $recuser->parentitemid, $userid);
-            if ($userfiles) { // private files only if enabled in settings
-                restore_dbops::send_files_to_pool($basepath, $restoreid, 'user', 'private', $recuser->parentitemid, $userid);
-            }
+                // Create user files in pool (profile, icon, private) by context
+                restore_dbops::send_files_to_pool($basepath, $restoreid, 'user', 'icon', $recuser->parentitemid, $userid);
+                restore_dbops::send_files_to_pool($basepath, $restoreid, 'user', 'profile', $recuser->parentitemid, $userid);
+                if ($userfiles) { // private files only if enabled in settings
+                    restore_dbops::send_files_to_pool($basepath, $restoreid, 'user', 'private', $recuser->parentitemid, $userid);
+                }
 
+            }
         }
         $rs->close();
     }
@@ -1197,7 +1201,7 @@ abstract class restore_dbops {
         // With problems of type error, throw exception, shouldn't happen if prechecks were originally
         // executed, so be radical here.
         if (array_key_exists('errors', $problems)) {
-            throw new restore_dbops_exception('restore_problems_processing_questions', null, implode(', ', $problems));
+            throw new restore_dbops_exception('restore_problems_processing_questions', null, implode(', ', $problems['errors']));
         }
     }
 
@@ -1354,10 +1358,11 @@ abstract class restore_dbops {
     /**
      * Deletes all of the content associated with the given course (courseid)
      * @param int $courseid
+     * @param array $options
      * @return bool True for success
      */
-    public static function delete_course_content($courseid) {
-        return remove_course_contents($courseid, false);
+    public static function delete_course_content($courseid, array $options = null) {
+        return remove_course_contents($courseid, false, $options);
     }
 }
 
index 4ca5414..0845440 100644 (file)
@@ -232,15 +232,9 @@ class core_backup_renderer extends plugin_renderer_base {
             $html .= $this->output->heading(get_string('restoretonewcourse', 'backup'), 2, array('class'=>'header'));
             $html .= $this->backup_detail_input(get_string('restoretonewcourse', 'backup'), 'radio', 'target', backup::TARGET_NEW_COURSE, array('checked'=>'checked'));
             $html .= $this->backup_detail_pair(get_string('selectacategory', 'backup'), $this->render($categories));
-            $html .= $this->backup_detail_pair('', html_writer::empty_tag('input', array('type'=>'submit', 'value'=>get_string('continue'), 'class'=>'newcoursecontinue')));
+            $html .= $this->backup_detail_pair('', html_writer::empty_tag('input', array('type'=>'submit', 'value'=>get_string('continue'))));
             $html .= html_writer::end_tag('div');
             $html .= html_writer::end_tag('form');
-            $config = new stdClass;
-            $config->title = get_string('confirmnewcoursecontinue', 'backup');
-            $config->question = get_string('confirmnewcoursecontinuequestion', 'backup');
-            $config->yesLabel = get_string('continue');
-            $config->noLabel = get_string('cancel');
-            $PAGE->requires->yui_module('moodle-backup-confirmcancel', 'M.core_backup.watch_newcoursecontinue_buttons', array($config));
         }
 
         if ($wholecourse && !empty($currentcourse)) {
index b932508..c497de7 100644 (file)
@@ -139,7 +139,10 @@ class restore_ui extends base_ui {
             throw new restore_ui_exception('restoreuifinalisedbeforeexecute');
         }
         if ($this->controller->get_target() == backup::TARGET_CURRENT_DELETING || $this->controller->get_target() == backup::TARGET_EXISTING_DELETING) {
-            restore_dbops::delete_course_content($this->controller->get_courseid());
+            $options = array();
+            $options['keep_roles_and_enrolments'] = $this->get_setting_value('keep_roles_and_enrolments');
+            $options['keep_groups_and_groupings'] = $this->get_setting_value('keep_groups_and_groupings');
+            restore_dbops::delete_course_content($this->controller->get_courseid(), $options);
         }
         $this->controller->execute_plan();
         $this->progress = self::PROGRESS_EXECUTED;
index 05395e4..267b853 100644 (file)
@@ -27,24 +27,4 @@ M.core_backup.watch_cancel_buttons = function(config) {
     });
 }
 
-M.core_backup.watch_newcoursecontinue_buttons = function(config) {
-    Y.all('.newcoursecontinue').each(function(){
-        this._confirmationListener = this._confirmationListener || this.on('click', function(e){
-            // Prevent the default event (sumbit) from firing
-            e.preventDefault();
-            // Create the confirm box
-            var confirm = new M.core.confirm(config);
-            // If the user clicks yes
-            confirm.on('complete-yes', function(e){
-                // Detach the listener for the confirm box so it doesn't fire again.
-                this._confirmationListener.detach();
-                // Simulate the original cancel button click
-                this.simulate('click');
-            }, this);
-            // Show the confirm box
-            confirm.show();
-        }, this);
-    });
-}
-
 }, '@VERSION@', {'requires':['base','node','node-event-simulate','moodle-enrol-notification']});
\ No newline at end of file
index 60bca8d..a00cd09 100644 (file)
@@ -74,7 +74,7 @@ class block_comments extends block_base {
         $args->linktext  = get_string('showcomments');
         $args->notoggle  = true;
         $args->autostart = true;
-        $args->displaycancel = true;
+        $args->displaycancel = false;
         $comment = new comment($args);
         $comment->set_view_permission(true);
 
index 1e80286..4fcde0f 100644 (file)
@@ -55,6 +55,7 @@ class block_section_links extends block_base {
         if(isset($this->config)){
             $config = $this->config;
         } else{
+            // TODO: Move these config settings to proper ones using component name
             $config = get_config('blocks/section_links');
         }
 
@@ -155,7 +156,8 @@ class block_section_links extends block_base {
     }
     function before_delete() {
         global $DB;
-        $DB->delete_records('config_plugins', 'plugin', 'blocks/section_links');
+        // TODO: Move these config settings to proper ones using component name
+        $DB->delete_records('config_plugins', array('plugin' => 'blocks/section_links'));
     }
 
     function has_config() {
index 87f0e9e..dcf669e 100644 (file)
@@ -58,6 +58,7 @@ M.core_comment = {
                         return false;
                     }, this);
                 }
+                scope.toggle_textarea(false);
                 CommentHelper.confirmoverlay = new Y.Overlay({
 bodyContent: '<div class="comment-delete-confirm"><a href="#" id="confirmdelete-'+this.client_id+'">'+M.str.moodle.yes+'</a> <a href="#" id="canceldelete-'+this.client_id+'">'+M.str.moodle.no+'</a></div>',
                                         visible: false
@@ -79,6 +80,7 @@ bodyContent: '<div class="comment-delete-confirm"><a href="#" id="confirmdelete-
                             var cid = scope.client_id;
                             var ta = Y.one('#dlg-content-'+cid);
                             ta.set('value', '');
+                            scope.toggle_textarea(false);
                             var container = Y.one('#comment-list-'+cid);
                             var result = scope.render([obj], true);
                             var newcomment = Y.Node.create(result.html);
index 2b69aaf..9e186ce 100644 (file)
@@ -57,7 +57,7 @@ class core_enrol_external extends external_api {
      * @return array of courses
      */
     public static function get_users_courses($userid) {
-        global $USER;
+        global $USER, $DB;
 
         // Do basic automatic PARAM checks on incoming data, using params description
         // If any problems are found then exceptions are thrown with helpful error messages
@@ -74,12 +74,17 @@ class core_enrol_external extends external_api {
                 // current user can not access this course, sorry we can not disclose who is enrolled in this course!
                 continue;
             }
+
             if ($userid != $USER->id and !has_capability('moodle/course:viewparticipants', $context)) {
                 // we need capability to view participants
                 continue;
             }
 
-            $result[] = array('id'=>$course->id, 'shortname'=>$course->shortname, 'fullname'=>$course->fullname, 'idnumber'=>$course->idnumber,'visible'=>$course->visible);
+            list($enrolledsqlselect, $enrolledparams) = get_enrolled_sql($context);
+            $enrolledsql = "SELECT COUNT(*) FROM ($enrolledsqlselect) AS 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);
         }
 
         return $result;
@@ -96,6 +101,7 @@ class core_enrol_external extends external_api {
                     'id'        => new external_value(PARAM_INT, 'id of course'),
                     'shortname' => new external_value(PARAM_RAW, 'short name of course'),
                     'fullname'  => new external_value(PARAM_RAW, 'long name of course'),
+                    'enrolledusercount' => new external_value(PARAM_INT, 'Number of enrolled users in this course'),
                     'idnumber'  => new external_value(PARAM_RAW, 'id number of course'),
                     'visible'   => new external_value(PARAM_INT, '1 means visible, 0 means hidden course'),
                 )
@@ -145,6 +151,7 @@ class core_enrol_external extends external_api {
         $withcapability = '';
         $groupid        = 0;
         $onlyactive     = false;
+        $userfields     = array();
         foreach ($options as $option) {
             switch ($option['name']) {
             case 'withcapability':
@@ -156,6 +163,12 @@ class core_enrol_external extends external_api {
             case 'onlyactive':
                 $onlyactive = !empty($option['value']);
                 break;
+            case 'userfields':
+                $thefields = explode(',', $option['value']);
+                foreach ($thefields as $f) {
+                    $userfields[] = clean_param($f, PARAM_ALPHANUMEXT);
+                }
+                break;
             }
         }
 
@@ -208,7 +221,7 @@ class core_enrol_external extends external_api {
                 continue;
             }
             context_instance_preload($user);
-            if ($userdetails = user_get_user_details($user, $course)) {
+            if ($userdetails = user_get_user_details($user, $course, $userfields)) {
                 $users[] = $userdetails;
             }
         }
@@ -249,8 +262,8 @@ class core_enrol_external extends external_api {
                     'city'        => new external_value(PARAM_NOTAGS, 'Home city of the user', VALUE_OPTIONAL),
                     'url'         => new external_value(PARAM_URL, 'URL of the user', VALUE_OPTIONAL),
                     'country'     => new external_value(PARAM_ALPHA, 'Home country code of the user, such as AU or CZ', VALUE_OPTIONAL),
-                    'profileimageurlsmall' => new external_value(PARAM_URL, 'User image profile URL - small version'),
-                    'profileimageurl' => new external_value(PARAM_URL, 'User image profile URL - big version'),
+                    'profileimageurlsmall' => new external_value(PARAM_URL, 'User image profile URL - small version', VALUE_OPTIONAL),
+                    'profileimageurl' => new external_value(PARAM_URL, 'User image profile URL - big version', VALUE_OPTIONAL),
                     'customfields' => new external_multiple_structure(
                         new external_single_structure(
                             array(
index a04d9d5..2dec772 100644 (file)
@@ -302,7 +302,7 @@ function get_recstatus($tagdata, $tagname){
 * Process the group tag. This defines a Moodle course.
 * @param string $tagconents The raw contents of the XML element
 */
-function process_group_tag($tagcontents){
+function process_group_tag($tagcontents) {
     global $DB;
 
     // Get configs
@@ -312,24 +312,24 @@ function process_group_tag($tagcontents){
 
     // Process tag contents
     $group = new stdClass();
-    if(preg_match('{<sourcedid>.*?<id>(.+?)</id>.*?</sourcedid>}is', $tagcontents, $matches)){
+    if (preg_match('{<sourcedid>.*?<id>(.+?)</id>.*?</sourcedid>}is', $tagcontents, $matches)) {
         $group->coursecode = trim($matches[1]);
     }
-    if(preg_match('{<description>.*?<short>(.*?)</short>.*?</description>}is', $tagcontents, $matches)){
+    if (preg_match('{<description>.*?<short>(.*?)</short>.*?</description>}is', $tagcontents, $matches)) {
         $group->description = trim($matches[1]);
     }
-    if(preg_match('{<org>.*?<orgunit>(.*?)</orgunit>.*?</org>}is', $tagcontents, $matches)){
+    if (preg_match('{<org>.*?<orgunit>(.*?)</orgunit>.*?</org>}is', $tagcontents, $matches)) {
         $group->category = trim($matches[1]);
     }
 
     $recstatus = ($this->get_recstatus($tagcontents, 'group'));
     //echo "<p>get_recstatus for this group returned $recstatus</p>";
 
-    if(!(strlen($group->coursecode)>0)){
+    if (!(strlen($group->coursecode)>0)) {
         $this->log_line('Error at line '.$line.': Unable to find course code in \'group\' element.');
-    }else{
+    } else {
         // First, truncate the course code if desired
-        if(intval($truncatecoursecodes)>0){
+        if (intval($truncatecoursecodes)>0) {
             $group->coursecode = ($truncatecoursecodes > 0)
                      ? substr($group->coursecode, 0, intval($truncatecoursecodes))
                      : $group->coursecode;
@@ -349,66 +349,75 @@ function process_group_tag($tagcontents){
         $group->coursecode = array($group->coursecode);
 
         // Third, check if the course(s) exist
-        foreach($group->coursecode as $coursecode){
+        foreach ($group->coursecode as $coursecode) {
             $coursecode = trim($coursecode);
-            if(!$DB->get_field('course', 'id', array('idnumber'=>$coursecode))) {
-              if(!$createnewcourses) {
-                  $this->log_line("Course $coursecode not found in Moodle's course idnumbers.");
-              } else {
-                // Create the (hidden) course(s) if not found
-                $course = new stdClass();
-                $course->fullname = $group->description;
-                $course->shortname = $coursecode;
-                $course->idnumber = $coursecode;
-                $course->format = 'topics';
-                $course->visible = 0;
-                // Insert default names for teachers/students, from the current language
-                $site = get_site();
-
-                // Handle course categorisation (taken from the group.org.orgunit field if present)
-                if(strlen($group->category)>0){
-                    // If the category is defined and exists in Moodle, we want to store it in that one
-                    if($catid = $DB->get_field('course_categories', 'id', array('name'=>$group->category))){
-                        $course->category = $catid;
-                    } elseif($createnewcategories) {
-                        // Else if we're allowed to create new categories, let's create this one
-                        $newcat = new stdClass();
-                        $newcat->name = $group->category;
-                        $newcat->visible = 0;
-                        $catid = $DB->insert_record('course_categories', $newcat);
-                        $course->category = $catid;
-                        $this->log_line("Created new (hidden) category, #$catid: $newcat->name");
-                    }else{
-                        // If not found and not allowed to create, stick with default
-                        $this->log_line('Category '.$group->category.' not found in Moodle database, so using default category instead.');
+            if (!$DB->get_field('course', 'id', array('idnumber'=>$coursecode))) {
+                if (!$createnewcourses) {
+                    $this->log_line("Course $coursecode not found in Moodle's course idnumbers.");
+                } else {
+                    // Create the (hidden) course(s) if not found
+                    $courseconfig = get_config('moodlecourse'); // Load Moodle Course shell defaults
+                    $course = new stdClass();
+                    $course->fullname = $group->description;
+                    $course->shortname = $coursecode;
+                    $course->idnumber = $coursecode;
+                    $course->format = $courseconfig->format;
+                    $course->visible = $courseconfig->visible;
+                    $course->numsections = $courseconfig->numsections;
+                    $course->hiddensections = $courseconfig->hiddensections;
+                    $course->newsitems = $courseconfig->newsitems;
+                    $course->showgrades = $courseconfig->showgrades;
+                    $course->showreports = $courseconfig->showreports;
+                    $course->maxbytes = $courseconfig->maxbytes;
+                    $course->groupmode = $courseconfig->groupmode;
+                    $course->groupmodeforce = $courseconfig->groupmodeforce;
+                    $course->enablecompletion = $courseconfig->enablecompletion;
+                    $course->completionstartonenrol = $courseconfig->completionstartonenrol;
+                    // Insert default names for teachers/students, from the current language
+
+                    // Handle course categorisation (taken from the group.org.orgunit field if present)
+                    if (strlen($group->category)>0) {
+                        // If the category is defined and exists in Moodle, we want to store it in that one
+                        if ($catid = $DB->get_field('course_categories', 'id', array('name'=>$group->category))) {
+                            $course->category = $catid;
+                        } else if ($createnewcategories) {
+                            // Else if we're allowed to create new categories, let's create this one
+                            $newcat = new stdClass();
+                            $newcat->name = $group->category;
+                            $newcat->visible = 0;
+                            $catid = $DB->insert_record('course_categories', $newcat);
+                            $course->category = $catid;
+                            $this->log_line("Created new (hidden) category, #$catid: $newcat->name");
+                        } else {
+                            // If not found and not allowed to create, stick with default
+                            $this->log_line('Category '.$group->category.' not found in Moodle database, so using default category instead.');
+                            $course->category = 1;
+                        }
+                    } else {
                         $course->category = 1;
                     }
-                }else{
-                    $course->category = 1;
-                }
-                $course->timecreated = time();
-                $course->startdate = time();
-                $course->numsections = 1;
-                // Choose a sort order that puts us at the start of the list!
-                $course->sortorder = 0;
+                    $course->timecreated = time();
+                    $course->startdate = time();
+                    // Choose a sort order that puts us at the start of the list!
+                    $course->sortorder = 0;
 
-                $courseid = $DB->insert_record('course', $course);
+                    $courseid = $DB->insert_record('course', $course);
 
-                // Setup the blocks
-                $course = $DB->get_record('course', array('id' => $courseid));
-                blocks_add_default_course_blocks($course);
+                    // Setup the blocks
+                    $course = $DB->get_record('course', array('id' => $courseid));
+                    blocks_add_default_course_blocks($course);
 
-                $section = new stdClass();
-                $section->course = $course->id;   // Create a default section.
-                $section->section = 0;
-                $section->summaryformat = FORMAT_HTML;
-                $section->id = $DB->insert_record("course_sections", $section);
+                    $section = new stdClass();
+                    $section->course = $course->id;   // Create a default section.
+                    $section->section = 0;
+                    $section->summaryformat = FORMAT_HTML;
+                    $section->id = $DB->insert_record("course_sections", $section);
 
-                add_to_log(SITEID, "course", "new", "view.php?id=$course->id", "$course->fullname (ID $course->id)");
+                    add_to_log(SITEID, "course", "new", "view.php?id=$course->id", "$course->fullname (ID $course->id)");
 
-                $this->log_line("Created course $coursecode in Moodle (Moodle ID is $course->id)");
-              }
-            }elseif($recstatus==3 && ($courseid = $DB->get_field('course', 'id', array('idnumber'=>$coursecode)))){
+                    $this->log_line("Created course $coursecode in Moodle (Moodle ID is $course->id)");
+                }
+            } else if ($recstatus==3 && ($courseid = $DB->get_field('course', 'id', array('idnumber'=>$coursecode)))) {
                 // If course does exist, but recstatus==3 (delete), then set the course as hidden
                 $DB->set_field('course', 'visible', '0', array('id'=>$courseid));
             }
index a94d298..e1e61ca 100644 (file)
@@ -171,10 +171,32 @@ class filter_mediaplugin extends moodle_text_filter {
 ///===========================
 /// utility functions
 
+/**
+ * Get mimetype of given url, useful for # alternative urls.
+ *
+ * @private
+ * @param string $url
+ * @return string $mimetype
+ */
+function filter_mediaplugin_get_mimetype($url) {
+    $matches = null;
+    if (preg_match("|^(.*)/[a-z]*file.php(\?file=)?(/[^&\?#]*)|", $url, $matches)) {
+        // remove the special moodle file serving hacks so that the *file.php is ignored
+        $url = $matches[1].$matches[3];
+    } else {
+        $url = preg_replace('/[#\?].*$/', '', $url);
+    }
+
+    $mimetype = mimeinfo('type', $url);
+
+    return $mimetype;
+}
 
 /**
  * Parse list of alternative URLs
  * @param string $url urls separated with '#', size specified as ?d=640x480 or #d=640x480
+ * @param int $defaultwidth
+ * @param int $defaultheight
  * @return array (urls, width, height)
  */
 function filter_mediaplugin_parse_alternatives($url, $defaultwidth = 0, $defaultheight = 0) {
@@ -252,7 +274,7 @@ function filter_mediaplugin_html5audio_callback(array $link) {
     $fallbacklink = null;
 
     foreach ($urls as $url) {
-        $mimetype = mimeinfo('type', $url);
+        $mimetype = filter_mediaplugin_get_mimetype($url);
         if (strpos($mimetype, 'audio/') !== 0) {
             continue;
         }
@@ -344,7 +366,7 @@ function filter_mediaplugin_html5video_callback(array $link) {
     $fallbacklink = null;
 
     foreach ($urls as $url) {
-        $mimetype = mimeinfo('type', $url);
+        $mimetype = filter_mediaplugin_get_mimetype($url);
         if (strpos($mimetype, 'video/') !== 0) {
             continue;
         }
@@ -546,7 +568,7 @@ function filter_mediaplugin_flv_callback($link) {
     $sources  = array();
 
     foreach ($urls as $url) {
-        $mimetype = mimeinfo('type', $url);
+        $mimetype = filter_mediaplugin_get_mimetype($url);
         if (strpos($mimetype, 'video/') !== 0) {
             continue;
         }
@@ -559,7 +581,7 @@ function filter_mediaplugin_flv_callback($link) {
         }
 
         if ($flashurl === null) {
-            $flashurl  = str_replace('&', '&amp;', $url);
+            $flashurl  = $url;
         }
     }
     if (!$sources) {
@@ -592,7 +614,7 @@ OET;
     // note: no need to print "this is flv link" because it is printed automatically if JS or Flash not available
 
     $output = html_writer::tag('span', $printlink, array('id'=>$id, 'class'=>'mediaplugin mediaplugin_flv'));
-    $output .= html_writer::script(js_writer::function_call('M.util.add_video_player', array($id, $flashurl, $width, $height, $autosize))); // we can not use standard JS init because this may be cached
+    $output .= html_writer::script(js_writer::function_call('M.util.add_video_player', array($id, rawurlencode($flashurl), $width, $height, $autosize))); // we can not use standard JS init because this may be cached
 
     return $output;
 }
@@ -799,7 +821,7 @@ function filter_mediaplugin_wmp_callback($link) {
         $mpsize = 'width="'.$link[4].'" height="'.($link[5] + 64).'"';
         $autosize = 'false';
     }
-    $mimetype = mimeinfo('type', $url);
+    $mimetype = filter_mediaplugin_get_mimetype($url);
 
 
 
@@ -861,7 +883,7 @@ function filter_mediaplugin_qt_callback($link) {
     } else {
         $size = 'width="'.$link[4].'" height="'.($link[5]+15).'"';
     }
-    $mimetype = mimeinfo('type', $url);
+    $mimetype = filter_mediaplugin_get_mimetype($url);
 
     // this is the safest fallback for incomplete or missing browser support for this format
     return <<<OET
diff --git a/filter/upgrade.txt b/filter/upgrade.txt
new file mode 100644 (file)
index 0000000..bb0522e
--- /dev/null
@@ -0,0 +1,11 @@
+This file describes API changes in core filter API and plugins,
+information provided here is intended especially for developers.
+
+=== 2.2 ===
+
+* legacy filters and legacy locations have been deprecated, so any
+  old filter should be updated to use the new moodle_text_filter,
+  and any filter bundled under mod/xxxx directories be moved to
+  /filter/xxxx (MDL-29995). They will stop working completely in
+  Moodle 2.3 (MDL-29996). See the glossary or data filters for
+  examples of legacy module filters and locations already updated.
index 9216dee..ab188de 100644 (file)
@@ -108,6 +108,7 @@ if ($grade = $DB->get_record('grade_grades', array('itemid' => $grade_item->id,
             $options->smiley  = false;
             $options->filter  = false;
             $options->noclean = false;
+            $options->para    = false;
             $grade->feedback  = format_text($grade->feedback, $grade->feedbackformat, $options);
         }
         $grade->feedbackformat = FORMAT_HTML;
index f890785..49af487 100644 (file)
@@ -803,7 +803,7 @@ class grade_edit_tree_column_range extends grade_edit_tree_column {
         } elseif ($item->is_external_item()) {
             $grademax = format_float($item->grademax, $item->get_decimals());
         } else {
-            $grademax = '<input type="text" size="4" id="grademax'.$item->id.'" name="grademax_'.$item->id.'" value="'.format_float($item->grademax, $item->get_decimals()).'" />';
+            $grademax = '<input type="text" size="6" id="grademax'.$item->id.'" name="grademax_'.$item->id.'" value="'.format_float($item->grademax, $item->get_decimals()).'" />';
         }
 
         $itemcell = clone($this->itemcell);
index d9390bb..09daca9 100644 (file)
@@ -44,8 +44,8 @@ $PAGE->set_url(new moodle_url('/grade/grading/form/rubric/edit.php', array('area
 $PAGE->set_title(get_string('definerubric', 'gradingform_rubric'));
 $PAGE->set_heading(get_string('definerubric', 'gradingform_rubric'));
 
-$mform = new gradingform_rubric_editrubric(null, array('areaid' => $areaid, 'context' => $context, 'allowdraft' => !$controller->has_active_instances()));
-$data = $controller->get_definition_for_editing();
+$mform = new gradingform_rubric_editrubric(null, array('areaid' => $areaid, 'context' => $context, 'allowdraft' => !$controller->has_active_instances()), 'post', '', array('class' => 'gradingform_rubric_editform'));
+$data = $controller->get_definition_for_editing(true);
 $returnurl = optional_param('returnurl', $manager->get_management_url(), PARAM_LOCALURL);
 $data->returnurl = $returnurl;
 $mform->set_data($data);
index 3bae783..64cf8f9 100644 (file)
@@ -58,8 +58,8 @@ class gradingform_rubric_editrubric extends moodleform {
 
         // rubric completion status
         $choices = array();
-        $choices[gradingform_controller::DEFINITION_STATUS_DRAFT]    = get_string('statusdraft', 'grading');
-        $choices[gradingform_controller::DEFINITION_STATUS_READY]    = get_string('statusready', 'grading');
+        $choices[gradingform_controller::DEFINITION_STATUS_DRAFT]    = html_writer::tag('span', get_string('statusdraft', 'core_grading'), array('class' => 'status draft'));
+        $choices[gradingform_controller::DEFINITION_STATUS_READY]    = html_writer::tag('span', get_string('statusready', 'core_grading'), array('class' => 'status ready'));
         $form->addElement('select', 'status', get_string('rubricstatus', 'gradingform_rubric'), $choices)->freeze();
 
         // rubric editor
@@ -80,6 +80,27 @@ class gradingform_rubric_editrubric extends moodleform {
         $form->closeHeaderBefore('buttonar');
     }
 
+    /**
+     * Setup the form depending on current values. This method is called after definition(),
+     * data submission and set_data().
+     * All form setup that is dependent on form values should go in here.
+     *
+     * We remove the element status if there is no current status (i.e. rubric is only being created)
+     * so the users do not get confused
+     */
+    public function definition_after_data() {
+        $form = $this->_form;
+        $el = $form->getElement('status');
+        if (!$el->getValue()) {
+            $form->removeElement('status');
+        } else {
+            $vals = array_values($el->getValue());
+            if ($vals[0] == gradingform_controller::DEFINITION_STATUS_READY) {
+                $this->findButton('saverubric')->setValue(get_string('save', 'gradingform_rubric'));
+            }
+        }
+    }
+
     /**
      * Form vlidation.
      * If there are errors return array of errors ("fieldname"=>"error message"),
index de3dd19..1d5d524 100644 (file)
@@ -12,6 +12,10 @@ M.gradingform_rubriceditor.init = function(Y, options) {
     }
     M.gradingform_rubriceditor.disablealleditors()
     Y.on('click', M.gradingform_rubriceditor.clickanywhere, 'body', null)
+    YUI().use('event-touch', function (Y) {
+        Y.one('body').on('touchstart', M.gradingform_rubriceditor.clickanywhere);
+        Y.one('body').on('touchend', M.gradingform_rubriceditor.clickanywhere);
+    })
     M.gradingform_rubriceditor.addhandlers()
 };
 
@@ -35,6 +39,7 @@ M.gradingform_rubriceditor.disablealleditors = function() {
 // it switches this element to edit mode. If rubric button is clicked it does nothing so the 'buttonclick'
 // function is invoked
 M.gradingform_rubriceditor.clickanywhere = function(e) {
+    if (e.type == 'touchstart') return
     var el = e.target
     // if clicked on button - disablecurrenteditor, continue
     if (el.get('tagName') == 'INPUT' && el.get('type') == 'submit') {
@@ -48,7 +53,7 @@ M.gradingform_rubriceditor.clickanywhere = function(e) {
         el = el.get('parentNode')
     }
     if (el) {
-        if (el.one('textarea').getStyle('display') == 'none') {
+        if (el.one('textarea').hasClass('hiddenelement')) {
             M.gradingform_rubriceditor.disablealleditors()
             M.gradingform_rubriceditor.editmode(el, true, focustb)
         }
@@ -61,19 +66,19 @@ M.gradingform_rubriceditor.clickanywhere = function(e) {
 // switch the criterion description or level to edit mode or switch back
 M.gradingform_rubriceditor.editmode = function(el, editmode, focustb) {
     var ta = el.one('textarea')
-    if (!editmode && ta.getStyle('display') == 'none') return;
-    if (editmode && ta.getStyle('display') == 'block') return;
-    var pseudotablink = '<a href="#" class="pseudotablink">&nbsp;</a>',
+    if (!editmode && ta.hasClass('hiddenelement')) return;
+    if (editmode && !ta.hasClass('hiddenelement')) return;
+    var pseudotablink = '<input type="text" size="1" class="pseudotablink"/>',
         taplain = ta.get('parentNode').one('.plainvalue'),
         tbplain = null,
-        tb = el.one('input[type=text]')
+        tb = el.one('.score input[type=text]')
     // add 'plainvalue' next to textarea for description/definition and next to input text field for score (if applicable)
     if (!taplain) {
-        ta.get('parentNode').append('<div class="plainvalue"><span class="textvalue">&nbsp;</span>'+pseudotablink+'</div>')
+        ta.get('parentNode').append('<div class="plainvalue">'+pseudotablink+'<span class="textvalue">&nbsp;</span></div>')
         taplain = ta.get('parentNode').one('.plainvalue')
         taplain.one('.pseudotablink').on('focus', M.gradingform_rubriceditor.clickanywhere)
         if (tb) {
-            tb.get('parentNode').append('<div class="plainvalue"><span class="textvalue">&nbsp;</span>'+pseudotablink+'</div>')
+            tb.get('parentNode').append('<span class="plainvalue">'+pseudotablink+'<span class="textvalue">&nbsp;</span></span>')
             tbplain = tb.get('parentNode').one('.plainvalue')
             tbplain.one('.pseudotablink').on('focus', M.gradingform_rubriceditor.clickanywhere)
         }
@@ -90,20 +95,33 @@ M.gradingform_rubriceditor.editmode = function(el, editmode, focustb) {
         }
         taplain.one('.textvalue').set('innerHTML', value)
         if (tb) tbplain.one('.textvalue').set('innerHTML', tb.get('value'))
+        // hide/display textarea, textbox and plaintexts
+        taplain.removeClass('hiddenelement')
+        ta.addClass('hiddenelement')
+        if (tb) {
+            tbplain.removeClass('hiddenelement')
+            tb.addClass('hiddenelement')
+        }
     } else {
         // if we need to show the input fields, set the width/height for textarea so it fills the cell
-        var width = parseFloat(ta.get('parentNode').getComputedStyle('width')),
-            height
-        if (el.hasClass('level')) height = parseFloat(el.getComputedStyle('height')) - parseFloat(el.one('.score').getComputedStyle('height'))
-        else height = parseFloat(ta.get('parentNode').getComputedStyle('height'))
-        ta.setStyle('width', Math.max(width,50)+'px').setStyle('height', Math.max(height,20)+'px')
-    }
-    // hide/display textarea, textbox and plaintexts
-    taplain.setStyle('display', editmode ? 'none' : 'block')
-    ta.setStyle('display', editmode ? 'block' : 'none')
-    if (tb) {
-        tbplain.setStyle('display', editmode ? 'none' : 'inline-block')
-        tb.setStyle('display', editmode ? 'inline-block' : 'none')
+        try {
+            var width = parseFloat(ta.get('parentNode').getComputedStyle('width')),
+                height
+            if (el.hasClass('level')) height = parseFloat(el.getComputedStyle('height')) - parseFloat(el.one('.score').getComputedStyle('height'))
+            else height = parseFloat(ta.get('parentNode').getComputedStyle('height'))
+            ta.setStyle('width', Math.max(width,50)+'px')
+            ta.setStyle('height', Math.max(height,20)+'px')
+        }
+        catch (err) {
+            // this browser do not support 'computedStyle', leave the default size of the textbox
+        }
+        // hide/display textarea, textbox and plaintexts
+        taplain.addClass('hiddenelement')
+        ta.removeClass('hiddenelement')
+        if (tb) {
+            tbplain.addClass('hiddenelement')
+            tb.removeClass('hiddenelement')
+        }
     }
     // focus the proper input field in edit mode
     if (editmode) { if (tb && focustb) tb.focus(); else ta.focus() }
index 0d78aa6..d7f605c 100644 (file)
@@ -53,12 +53,18 @@ $string['regradeoption0'] = 'Do not mark for regrade';
 $string['regradeoption1'] = 'Mark for regrade';
 $string['restoredfromdraft'] = 'NOTE: The last attempt to grade this person was not saved properly so draft grades have been restored. If you want to cancel these changes use the \'Cancel\' button below.';
 $string['rubric'] = 'Rubric';
+$string['rubricmapping'] = 'Score to grade mapping rules';
+$string['rubricmappingexplained'] = 'The minimum possible score for this rubric is <b>{$a->minscore} points</b> and it will be converted to the minimum grade available in this module (which is zero unless the scale is used).
+    The maximum score <b>{$a->maxscore} points</b> will be converted to the maximum grade.<br />
+    Intermediate scores will be converted respectively and rounded to the nearest available grade.<br />
+    If a scale is used instead of a grade, the score will be converted to the scale elements as if they were consecutive integers.';
 $string['rubricnotcompleted'] = 'Please choose something for each criterion';
 $string['rubricoptions'] = 'Rubric options';
 $string['rubricstatus'] = 'Current rubric status';
+$string['save'] = 'Save';
 $string['saverubric'] = 'Save rubric and make it ready';
 $string['saverubricdraft'] = 'Save as draft';
-$string['scorepostfix'] = '{$a} points';
+$string['scorepostfix'] = '{$a}points';
 $string['showdescriptionstudent'] = 'Display rubric description to those being graded';
 $string['showdescriptionteacher'] = 'Display rubric description during evaluation';
 $string['showremarksstudent'] = 'Show remarks to those being graded';
@@ -66,6 +72,4 @@ $string['showscorestudent'] = 'Display points for each level to those being grad
 $string['showscoreteacher'] = 'Display points for each level during evaluation';
 $string['sortlevelsasc'] = 'Sort order for levels:';
 $string['sortlevelsasc0'] = 'Descending by number of points';
-$string['sortlevelsasc1'] = 'Ascending by number of points';
-$string['statusdraft'] = 'Draft';
-$string['statusready'] = 'Ready';
\ No newline at end of file
+$string['sortlevelsasc1'] = 'Ascending by number of points';
\ No newline at end of file
index 6aa0d98..ff24e85 100644 (file)
@@ -360,9 +360,10 @@ class gradingform_rubric_controller extends gradingform_controller {
     /**
      * Converts the current definition into an object suitable for the editor form's set_data()
      *
+     * @param boolean $addemptycriterion whether to add an empty criterion if the rubric is completely empty (just being created)
      * @return stdClass
      */
-    public function get_definition_for_editing() {
+    public function get_definition_for_editing($addemptycriterion = false) {
 
         $definition = $this->get_definition();
         $properties = new stdClass();
@@ -378,6 +379,8 @@ class gradingform_rubric_controller extends gradingform_controller {
         $properties->rubric = array('criteria' => array(), 'options' => $this->get_options());
         if (!empty($definition->rubric_criteria)) {
             $properties->rubric['criteria'] = $definition->rubric_criteria;
+        } else if (!$definition && $addemptycriterion) {
+            $properties->rubric['criteria'] = array('addcriterion' => 1);
         }
 
         return $properties;
@@ -481,7 +484,8 @@ class gradingform_rubric_controller extends gradingform_controller {
         $output = $this->get_renderer($page);
         $criteria = $this->definition->rubric_criteria;
         $options = $this->get_options();
-        $rubric = $output->display_rubric($criteria, $options, self::DISPLAY_PREVIEW, 'rubric');
+        $rubric = $output->display_rubric_mapping_explained($this->get_min_max_score());
+        $rubric .= $output->display_rubric($criteria, $options, self::DISPLAY_PREVIEW, 'rubric');
 
         return $rubric;
     }
@@ -590,6 +594,28 @@ class gradingform_rubric_controller extends gradingform_controller {
 
         return array($subsql, $params);
     }
+
+    /**
+     * Calculates and returns the possible minimum and maximum score (in points) for this rubric
+     *
+     * @return array
+     */
+    public function get_min_max_score() {
+        if (!$this->is_form_available()) {
+            return null;
+        }
+        $returnvalue = array('minscore' => 0, 'maxscore' => 0);
+        foreach ($this->get_definition()->rubric_criteria as $id => $criterion) {
+            $scores = array();
+            foreach ($criterion['levels'] as $level) {
+                $scores[] = $level['score'];
+            }
+            sort($scores);
+            $returnvalue['minscore'] += $scores[0];
+            $returnvalue['maxscore'] += $scores[sizeof($scores)-1];
+        }
+        return $returnvalue;
+    }
 }
 
 /**
@@ -717,19 +743,7 @@ class gradingform_rubric_instance extends gradingform_instance {
         global $DB, $USER;
         $grade = $this->get_rubric_filling();
 
-        $minscore = 0;
-        $maxscore = 0;
-        foreach ($this->get_controller()->get_definition()->rubric_criteria as $id => $criterion) {
-            $scores = array();
-            foreach ($criterion['levels'] as $level) {
-                $scores[] = $level['score'];
-            }
-            sort($scores);
-            $minscore += $scores[0];
-            $maxscore += $scores[sizeof($scores)-1];
-        }
-
-        if ($maxscore <= $minscore) {
+        if (!($scores = $this->get_controller()->get_min_max_score()) || $scores['maxscore'] <= $scores['minscore']) {
             return -1;
         }
 
@@ -745,7 +759,7 @@ class gradingform_rubric_instance extends gradingform_instance {
         foreach ($grade['criteria'] as $id => $record) {
             $curscore += $this->get_controller()->get_definition()->rubric_criteria[$id]['levels'][$record['levelid']]['score'];
         }
-        return round(($curscore-$minscore)/($maxscore-$minscore)*($maxgrade-$mingrade), 0) + $mingrade; // TODO mapping
+        return round(($curscore-$scores['minscore'])/($scores['maxscore']-$scores['minscore'])*($maxgrade-$mingrade), 0) + $mingrade;
     }
 
     /**
index 8086833..f037263 100644 (file)
@@ -164,7 +164,7 @@ class gradingform_rubric_renderer extends plugin_renderer_base {
         $leveltemplate .= html_writer::start_tag('div', array('class' => 'level-wrapper'));
         if ($mode == gradingform_rubric_controller::DISPLAY_EDIT_FULL) {
             $definition = html_writer::tag('textarea', htmlspecialchars($level['definition']), array('name' => '{NAME}[criteria][{CRITERION-id}][levels][{LEVEL-id}][definition]', 'cols' => '10', 'rows' => '4'));
-            $score = html_writer::empty_tag('input', array('type' => 'text', 'name' => '{NAME}[criteria][{CRITERION-id}][levels][{LEVEL-id}][score]', 'size' => '4', 'value' => $level['score']));
+            $score = html_writer::empty_tag('input', array('type' => 'text', 'name' => '{NAME}[criteria][{CRITERION-id}][levels][{LEVEL-id}][score]', 'size' => '3', 'value' => $level['score']));
         } else {
             if ($mode == gradingform_rubric_controller::DISPLAY_EDIT_FROZEN) {
                 $leveltemplate .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => '{NAME}[criteria][{CRITERION-id}][levels][{LEVEL-id}][definition]', 'value' => $level['definition']));
@@ -181,7 +181,7 @@ class gradingform_rubric_renderer extends plugin_renderer_base {
         if ($mode == gradingform_rubric_controller::DISPLAY_EVAL_FROZEN && $level['checked']) {
             $leveltemplate .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => '{NAME}[criteria][{CRITERION-id}][levelid]', 'value' => $level['id']));
         }
-        $score = html_writer::tag('span', $score, array('id' => '{NAME}-criteria-{CRITERION-id}-levels-{LEVEL-id}-score'));
+        $score = html_writer::tag('span', $score, array('id' => '{NAME}-criteria-{CRITERION-id}-levels-{LEVEL-id}-score', 'class' => 'scorevalue'));
         $definitionclass = 'definition';
         if (isset($level['error_definition'])) {
             $definitionclass .= ' error';
@@ -453,4 +453,22 @@ class gradingform_rubric_renderer extends plugin_renderer_base {
         $html .= html_writer::end_tag('div');
         return $html;
     }
+
+    /**
+     * Generates and returns HTML code to display information box about how rubric score is converted to the grade
+     *
+     * @param array $scores
+     * @return string
+     */
+    public function display_rubric_mapping_explained($scores) {
+        $html = '';
+        if (!$scores) {
+            return $html;
+        }
+        $html .= $this->box(
+                html_writer::tag('h4', get_string('rubricmapping', 'gradingform_rubric')).
+                html_writer::tag('div', get_string('rubricmappingexplained', 'gradingform_rubric', (object)$scores))
+                , 'generalbox rubricmappingexplained');
+        return $html;
+    }
 }
index 7fb2331..92cd3be 100644 (file)
@@ -184,14 +184,14 @@ class MoodleQuickForm_rubriceditor extends HTML_QuickForm_input {
                 // when adding new criterion copy the number of levels and their scores from the last criterion
                 if (!empty($value['criteria'][$lastid]['levels'])) {
                     foreach ($value['criteria'][$lastid]['levels'] as $lastlevel) {
-                        $criterion['levels']['NEWID'+($i++)]['score'] = $lastlevel['score'];
+                        $criterion['levels']['NEWID'.($i++)]['score'] = $lastlevel['score'];
                     }
                 } else {
-                    $criterion['levels']['NEWID'+($i++)]['score'] = 0;
+                    $criterion['levels']['NEWID'.($i++)]['score'] = 0;
                 }
                 // add more levels so there are at least 3 in the new criterion. Increment by 1 the score for each next one
-                for ($i; $i<3; $i++) {
-                    $criterion['levels']['NEWID'+$i]['score'] = $criterion['levels']['NEWID'+($i-1)]['score'] + 1;
+                for ($i=$i; $i<3; $i++) {
+                    $criterion['levels']['NEWID'.$i]['score'] = $criterion['levels']['NEWID'.($i-1)]['score'] + 1;
                 }
                 // set other necessary fields (definition) for the levels in the new criterion
                 foreach (array_keys($criterion['levels']) as $i) {
index 4428ac3..b88df4e 100644 (file)
 
 */
 
+.gradingform_rubric_editform .status {font-weight:normal;text-transform:uppercase;font-size:60%;padding:0.25em;border:1px solid #EEE;}
+.gradingform_rubric_editform .status.ready {background-color:#e7f1c3;border-color:#AAEEAA;}
+.gradingform_rubric_editform .status.draft {background-color:#f3f2aa;border-color:#EEEE22;}
+
 .gradingform_rubric.editor .criterion .controls,
 .gradingform_rubric .criterion .description,
 .gradingform_rubric .criterion .levels,
@@ -75,7 +79,8 @@
 .gradingform_rubric .plainvalue.empty {font-style: italic; color: #AAA;}
 
 .gradingform_rubric.editor .criterion .levels .level .delete {position:absolute;right:0;bottom:0;}
-.gradingform_rubric .criterion .levels .level .score {font-style:italic;color:#575;font-weight: bold;margin-top:5px;}
+.gradingform_rubric .criterion .levels .level .score {font-style:italic;color:#575;font-weight: bold;margin-top:5px;white-space:nowrap;}
+.gradingform_rubric .criterion .levels .level .score .scorevalue {padding-right:5px;}
 
 /* Make invisible the buttons 'Move up' for the first criterion and 'Move down' for the last, because those buttons will make no change */
 .gradingform_rubric.editor .criterion.first .controls .moveup input,
 .gradingform_rubric .criterion .levels .level .definition.error,
 .gradingform_rubric .criterion .levels .level .score.error {background:#FFDDDD;}
 
-/**
- *
- */
-
 .gradingform_rubric-regrade {padding:10px;background:#FFDDDD;border:1px solid #F00;margin-bottom:10px;}
 .gradingform_rubric-restored {padding:10px;background:#FFFFDD;border:1px solid #FF0;margin-bottom:10px;}
 .gradingform_rubric-error {color:red;font-weight:bold;}
+
+/* special classes for elements created by rubriceditor.js */
+.gradingform_rubric.editor .hiddenelement {display:none;}
+.gradingform_rubric.editor .pseudotablink {background-color:transparent;border:0 solid;height:1px;width:1px;color:transparent;padding:0;margin:0;position:relative;float:right;}
\ No newline at end of file
index d96b75e..bc93369 100644 (file)
@@ -651,7 +651,7 @@ class grade_report_user extends grade_report {
             // Then left join with grade_grades and look for rows with null final grade (which includes grade items with no grade_grade)
             $sql = "SELECT gi.id, COUNT(u.id) AS count
                       FROM {grade_items} gi
-                      JOIN {user} u
+                      JOIN {user} u ON u.deleted = 0
                       JOIN ($enrolledsql) je ON je.id = u.id
                       JOIN (
                                SELECT DISTINCT ra.userid
@@ -660,10 +660,9 @@ class grade_report_user extends grade_report {
                                   AND ra.contextid " . get_related_contexts_string($this->context) . "
                            ) rainner ON rainner.userid = u.id
                       LEFT JOIN {grade_grades} gg
-                           ON (gg.itemid = gi.id AND gg.userid = u.id AND gg.finalgrade IS NOT NULL AND gg.hidden = 0)
+                             ON (gg.itemid = gi.id AND gg.userid = u.id AND gg.finalgrade IS NOT NULL AND gg.hidden = 0)
                       $groupsql
                      WHERE gi.courseid = :courseid
-                           AND u.deleted = 0
                            AND gg.finalgrade IS NULL
                            $groupwheresql
                   GROUP BY gi.id";
index 6c9e52c..aef61d7 100644 (file)
@@ -316,7 +316,7 @@ function groups_delete_group($grouporid) {
 
 /**
  * Delete grouping
- * @param int $groupingid
+ * @param int $groupingorid
  * @return bool success
  */
 function groups_delete_grouping($groupingorid) {
@@ -389,7 +389,7 @@ function groups_delete_group_members($courseid, $userid=0, $showfeedback=false)
     events_trigger('groups_members_removed', $eventdata);
 
     if ($showfeedback) {
-        echo $OUTPUT->notification(get_string('deleted').' groups_members');
+        echo $OUTPUT->notification(get_string('deleted').' - '.get_string('groupmembers', 'group'), 'notifysuccess');
     }
 
     return true;
@@ -407,15 +407,10 @@ function groups_delete_groupings_groups($courseid, $showfeedback=false) {
     $groupssql = "SELECT id FROM {groups} g WHERE g.courseid = ?";
     $DB->delete_records_select('groupings_groups', "groupid IN ($groupssql)", array($courseid));
 
-    // Delete all files associated with groupings for this course
-    $context = get_context_instance(CONTEXT_COURSE, $courseid);
-
     //trigger groups events
     events_trigger('groups_groupings_groups_removed', $courseid);
 
-    if ($showfeedback) {
-        echo $OUTPUT->notification(get_string('deleted').' groupings_groups');
-    }
+    // no need to show any feedback here - we delete usually first groupings and then groups
 
     return true;
 }
@@ -449,11 +444,11 @@ function groups_delete_groups($courseid, $showfeedback=false) {
 
     $DB->delete_records('groups', array('courseid'=>$courseid));
 
-    //trigger groups events
+    // trigger groups events
     events_trigger('groups_groups_deleted', $courseid);
 
     if ($showfeedback) {
-        echo $OUTPUT->notification(get_string('deleted').' groups');
+        echo $OUTPUT->notification(get_string('deleted').' - '.get_string('groups', 'group'), 'notifysuccess');
     }
 
     return true;
@@ -468,9 +463,6 @@ function groups_delete_groups($courseid, $showfeedback=false) {
 function groups_delete_groupings($courseid, $showfeedback=false) {
     global $DB, $OUTPUT;
 
-    $context = get_context_instance(CONTEXT_COURSE, $courseid);
-    $fs = get_file_storage();
-
     // delete any uses of groupings
     $sql = "DELETE FROM {groupings_groups}
              WHERE groupingid in (SELECT id FROM {groupings} g WHERE g.courseid = ?)";
@@ -488,11 +480,11 @@ function groups_delete_groupings($courseid, $showfeedback=false) {
 
     $DB->delete_records('groupings', array('courseid'=>$courseid));
 
-    //trigger groups events
+    // trigger groups events
     events_trigger('groups_groupings_deleted', $courseid);
 
     if ($showfeedback) {
-        echo $OUTPUT->notification(get_string('deleted').' groupings');
+        echo $OUTPUT->notification(get_string('deleted').' - '.get_string('groupings', 'group'), 'notifysuccess');
     }
 
     return true;
index 533c7ae..341a147 100644 (file)
@@ -166,7 +166,7 @@ $CFG->wwwroot              = install_guess_wwwroot(); // can not be changed - pp
 $CFG->httpswwwroot         = $CFG->wwwroot;
 $CFG->dataroot             = $config->dataroot;
 $CFG->tempdir              = $CFG->dataroot.'/temp';
-$CFG->cachedir             = $CFG->dataroot.'/temp';
+$CFG->cachedir             = $CFG->dataroot.'/cache';
 $CFG->admin                = $config->admin;
 $CFG->docroot              = 'http://docs.moodle.org';
 $CFG->langotherroot        = $CFG->dataroot.'/lang';
index fd482b5..8f23170 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index bc43354..9ec41ba 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 49b877b..711048a 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 7e7f825..2184283 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index a1b5294..ff3a392 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 23742d4..833772e 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 8f96f92..f287e93 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index ae1ba91..8ec2c48 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index b52182e..d57f678 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 2340bb1..a31788f 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 49fd10d..c6f7f60 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index b90de30..049e3a0 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 707450d..11da837 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index a6e93ab..cbfa52a 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 79ac459..3658f3d 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index a13f5a9..3ae8cae 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 82ae2f2..e7fa541 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 77021ce..7b0a16a 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
@@ -42,25 +42,25 @@ $string['dataroot'] = 'Verilənlərin kataloqu';
 $string['dbprefix'] = 'Cədvəllərin adlarının prefiksi';
 $string['dirroot'] = 'Moodle kataloqu';
 $string['environmenthead'] = 'Mühitin yoxlanması...';
-$string['environmentsub2'] = 'Moodlun hər versiyasında PHP-nin versiyasına minimal tələblər və PHP-nin mütləq olan genişlənmələrinin dəsti var.\r
-Mühitin tam yoxlanılması hər quraşdırmadan və yenilənmədən əvvəl yerinə yetirilir.\r
-Xahiş edirik ki, əgər yeni versiyanın necə qurulmasını və PHP genişlənməsinin əlavə edilməsini bilmirsinizsə administratora müraciət edin. ';
+$string['environmentsub2'] = 'Moodlun hər versiyasında PHP-nin versiyasına minimal tələblər və PHP-nin mütləq olan genişlənmələrinin dəsti var.
+Mühitin tam yoxlanılması hər quraşdırmadan və yenilənmədən əvvəl yerinə yetirilir.
+Xahiş edirik ki, əgər yeni versiyanın necə qurulmasını və PHP genişlənməsinin əlavə edilməsini bilmirsinizsə administratora müraciət edin.';
 $string['errorsinenvironment'] = 'Mühitin yoxlnılması yerinə yetirilmədi!';
 $string['installation'] = 'Quraşdırma';
 $string['langdownloaderror'] = 'Təəssüf ki,  "{$a}" dilini qurmaq mümkün olmadı. Quraşdırma prosesi ingilis dilində davam edəcək.';
-$string['memorylimithelp'] = '<p>Sizin serverdə PHP-də yaddaşın məhdudlaşdırılması  {$a}-da qurulub.</p>\r
-\r
-<p>Buna görə müəyyən müddətdən sonra yddaşla əlaqəli problemlər yarana bilər, xüsusən də Sizin çox sayda modullarınız və ya istifadəçiləriniz olarsa.</p>\r
-\r
-<p>Biz məsləhət görürük ki, əgər mümkünsə PHP-də yaddaşın məhdudlaşdırılması üçün daha böyük qiymət götürəsiniz, məsələn, 40M.\r
-   Bunu aşağıdakı üsullarla etmək olar:</p>\r
-<ol>\r
-<li>Əgər imkan varsa PHP-ni <i>--enable-memory-limit</i> açarı ilə kompilyasiya edin.\r
-Bu halda Moodle özü yaddaşa məhdudiyyət qoya bilir.</li>\r
-<li>Əgər Sizin php.ini faylını redaktə etməyə icazəniz varsa, <b>memory_limit</b>parametrini nə iləsə 40M kimi dəyişmək olar. Əgər icazəniz yoxdursa, administratordan xahiş edə bilərsiniz.</li>\r
-<li>Bəzi PHP serverlərində Moodle kataloqunda .htaccess faylı yaratmaq və aşağıdakı sətri daxil etmək olar:\r
-    <blockquote><div>php_value memory_limit 40M</div></blockquote>\r
-    <p>Buna baxmayaraq bəzi serverlərdə buna görə PHP-nin<b>bütünl</b> səhifələrinin işi dayana bilər (Siz səhifələrdə səhvləri görəcəksiniz). Belə olan halda .htaccess  faylını silmək lazımdır.</p></li>\r
+$string['memorylimithelp'] = '<p>Sizin serverdə PHP-də yaddaşın məhdudlaşdırılması  {$a}-da qurulub.</p>
+
+<p>Buna görə müəyyən müddətdən sonra yddaşla əlaqəli problemlər yarana bilər, xüsusən də Sizin çox sayda modullarınız və ya istifadəçiləriniz olarsa.</p>
+
+<p>Biz məsləhət görürük ki, əgər mümkünsə PHP-də yaddaşın məhdudlaşdırılması üçün daha böyük qiymət götürəsiniz, məsələn, 40M.
+   Bunu aşağıdakı üsullarla etmək olar:</p>
+<ol>
+<li>Əgər imkan varsa PHP-ni <i>--enable-memory-limit</i> açarı ilə kompilyasiya edin.
+Bu halda Moodle özü yaddaşa məhdudiyyət qoya bilir.</li>
+<li>Əgər Sizin php.ini faylını redaktə etməyə icazəniz varsa, <b>memory_limit</b>parametrini nə iləsə 40M kimi dəyişmək olar. Əgər icazəniz yoxdursa, administratordan xahiş edə bilərsiniz.</li>
+<li>Bəzi PHP serverlərində Moodle kataloqunda .htaccess faylı yaratmaq və aşağıdakı sətri daxil etmək olar:
+    <blockquote><div>php_value memory_limit 40M</div></blockquote>
+    <p>Buna baxmayaraq bəzi serverlərdə buna görə PHP-nin<b>bütünl</b> səhifələrinin işi dayana bilər (Siz səhifələrdə səhvləri görəcəksiniz). Belə olan halda .htaccess  faylını silmək lazımdır.</p></li>
 </ol>';
 $string['paths'] = 'Yollar';
 $string['pathserrcreatedataroot'] = 'Quraşdırma proqramı  ({$a->dataroot})  verilənlər kataloqunu yarada bilmir.';
index 9b3432a..9245032 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
@@ -30,4 +30,5 @@
 
 defined('MOODLE_INTERNAL') || die();
 
+$string['thisdirection'] = 'ltr';
 $string['thislanguage'] = 'Azərbaycanca';
index 3877409..ecad0ad 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index ec91764..71e43e5 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index aa6ef44..24f114d 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 7cd6f0b..d761ca5 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index e214b27..716717e 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
@@ -39,11 +39,16 @@ $string['databasetypehead'] = 'Избиране на драйвер за баз
 $string['dataroot'] = 'Директория за данни';
 $string['dbprefix'] = 'Представка на таблиците';
 $string['dirroot'] = 'Директория на Moodle';
+$string['environmenthead'] = 'Проверка на Вашата работна среда ...';
+$string['environmentsub2'] = 'Всяка версия на Moodle изисква някаква минимална версия на PHP и няколко необходими PHP разширения. Преди всяко инсталиране или надграждане се извършва пълна проверка на работната среда. Моля, обърнете се към администратора на сървъра ако не знаете как да инсталирате нова версия или да разрешите резширенията на PHP.';
+$string['errorsinenvironment'] = 'Проверката на роботната среда е прекратена!';
 $string['installation'] = 'Инсталиране';
 $string['langdownloaderror'] = 'За съжаление езикът "{$a}" не може да бъде изтеглен. Инсталирането ще продължи на английски.';
 $string['paths'] = 'Пътища';
 $string['pathshead'] = 'Потвърждаване на пътищата';
+$string['pathsroparentdataroot'] = 'Директория ({$a->parent}) не е разрешена за запис и директорията за данни ({$a->dataroot}) не може да бъде създадена от инсталатора.';
 $string['pathssubdataroot'] = 'Тази директория е място, където Moodle, записва качваните файлове. Тази директория трябва да е достъпна за четене И ЗА ЗАПИС от потребителя на интернет сървъра (обикновено \'nobody\' или \'apache\'), но не трябва да е достъпна пряко през Интернет. Инталаторът ще се опита да създаде директорията, ако тя не съществува.';
 $string['pathssubdirroot'] = 'Пълен път до директорията на Moodle.';
 $string['pathssubwwwroot'] = 'Пълен интернет адрес, на който ще се отваря Moodle. Не е възможно Moodle да се отваря чрез различни адреси. Ако Вашият сайт има няколко адреса трябва на всеки от другите адреси да направите пренасочване към този. Ако Вашият сайт се отваря както глобално от Интернет, така и от локална мрежа, настройте DNS, така че потребителите от локалната мрежа също да могат да ползват глобалния адрес. Ако адресът не е коректен, моля, променете адреса в браузъра си и започнете инсталирането с правилния адрес.';
+$string['phpextension'] = 'разширение на PHP';
 $string['wwwroot'] = 'Уеб адрес';
index 730a894..60eaad6 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 3093ede..218a3f9 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index fcdd34d..5d4de96 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index cdc0991..fa5129f 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 814ea6f..c3b92d3 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index f9686fe..6ffbb53 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index db5347a..99230a8 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 6f8f873..b622e39 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index cc9e213..573916f 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 8a55c64..b6dc99d 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 72057fc..19a10aa 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index f51849a..c5c29f7 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index fef9283..6c7ea38 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
diff --git a/install/lang/ckb/langconfig.php b/install/lang/ckb/langconfig.php
new file mode 100644 (file)
index 0000000..4901cd2
--- /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 2.2beta 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['thislanguage'] = 'سۆرانی';
index adb8afb..b620dd4 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index ccb7aa7..7077ab6 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 206af99..8463281 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 998f116..76dc93a 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 7705e8d..4fe8128 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 6e0267c..32d176c 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index b553a4b..eefeb40 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 08ea69a..7925c84 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index bb77d4d..06bddd5 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 534441c..a68ee93 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
@@ -33,3 +33,4 @@ defined('MOODLE_INTERNAL') || die();
 $string['language'] = 'Iaith';
 $string['next'] = 'Nesaf';
 $string['previous'] = 'Blaenorol';
+$string['reload'] = 'Ail-lwytho';
index 6a32f60..aecb5be 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index a609ef1..614fa44 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index d00a230..d3c4cd1 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 483421a..0caf239 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 00e5927..3c9559a 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index dadb6d3..18ee033 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 6484859..8e068f1 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 1e917ed..6e1bd1b 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 710840c..5f3329e 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 76f0c0d..7a48a53 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index c4e0e44..91489f3 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 60f9067..fc0f5b3 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index a0751b3..860366b 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 2475dd0..202a890 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index ad09ce5..f63370b 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 819a2e0..066eb28 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 57a27e4..21edf30 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index ceac3bd..430cb80 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 3767ba7..938708b 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 71a39b5..eef32ef 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index fbfbf47..4c9ab55 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 0e9541a..e60b7af 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 417b447..c3e337c 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index b49eab5..eab715b 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 9ff975f..0739471 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index c099dd4..7b9c713 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 6e5ed42..cb1bc0b 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 64dee26..f53d7e1 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index c329cf6..af0a936 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 8b4d953..a06bdd5 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 9193dd4..e1e807c 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 081d552..0d23d2f 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 51b81b9..545c124 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index f3bb1ba..f834135 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 1600961..4f668e9 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index b6d300e..ded914a 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index cc1b58d..a4f84a5 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 282c255..58ae4eb 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 54a63e2..42d0228 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta 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
index 1c9cad8..ee2521a 100644 (file)
@@ -16,7 +16,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Automatically generated strings for Moodle 2.2dev installer
+ * Automatically generated strings for Moodle 2.2beta installer
  *