Merge branch 'MDL-30428-master-1' of git://git.luns.net.uk/moodle
authorAparup Banerjee <aparup@moodle.com>
Fri, 25 Nov 2011 03:59:10 +0000 (11:59 +0800)
committerAparup Banerjee <aparup@moodle.com>
Fri, 25 Nov 2011 03:59:10 +0000 (11:59 +0800)
549 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/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/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/upgradelib.php
lib/weblib.php
login/token.php
message/lib.php
mod/assignment/lib.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/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/lib.php
tag/coursetagslib.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
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..0ecb234 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 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..2496a49 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 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
  *
  * 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 d518df2..eaf101c 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 1ac033b..f29e2fb 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 c65d02e..9333692 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 e8a343b..6a18b7b 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 2ac6bdc..cbd7ac5 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 4aed163..dd1fffc 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 89bc356..ee310d7 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 e4f4f24..fedb7c0 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