Merge branch 'wip-MDL-52193-master' of https://github.com/marinaglancy/moodle
authorDan Poltawski <dan@moodle.com>
Mon, 7 Dec 2015 15:36:55 +0000 (15:36 +0000)
committerDan Poltawski <dan@moodle.com>
Mon, 7 Dec 2015 15:36:55 +0000 (15:36 +0000)
319 files changed:
.travis.yml
Gruntfile.js
admin/roles/classes/define_role_table_advanced.php
admin/settings/plugins.php
admin/settings/subsystems.php
admin/tool/availabilityconditions/tests/behat/manage_conditions.feature
admin/tool/behat/tests/behat/data_generators.feature
admin/tool/customlang/db/upgrade.php
admin/tool/log/db/upgrade.php
admin/tool/log/store/database/db/upgrade.php
admin/tool/log/store/standard/db/upgrade.php
admin/tool/monitor/db/upgrade.php
auth/cas/db/upgrade.php
auth/db/tests/db_test.php
auth/ldap/db/upgrade.php
auth/manual/db/upgrade.php
auth/mnet/db/upgrade.php
availability/condition/completion/tests/behat/availability_completion.feature
availability/condition/completion/tests/behat/conditional_bug.feature
availability/condition/date/tests/behat/availability_date.feature
availability/condition/grade/tests/behat/availability_grade.feature
availability/condition/group/tests/behat/availability_group.feature
availability/condition/grouping/tests/behat/availability_grouping.feature
availability/condition/profile/tests/behat/availability_profile.feature
availability/tests/behat/display_availability.feature
availability/tests/behat/edit_availability.feature
availability/tests/info_test.php
backup/backup.class.php
backup/cc/cc2moodle.php
backup/cc/entities.class.php
backup/cc/restore_cc.php
backup/util/helper/restore_log_rule.class.php
backup/util/helper/tests/restore_log_rule_test.php [new file with mode: 0644]
badges/tests/behat/award_badge.feature
blocks/badges/db/upgrade.php
blocks/calendar_month/db/upgrade.php
blocks/calendar_upcoming/db/upgrade.php
blocks/community/db/upgrade.php
blocks/completionstatus/db/upgrade.php
blocks/course_summary/db/upgrade.php
blocks/glossary_random/block_glossary_random.php
blocks/html/db/upgrade.php
blocks/navigation/db/upgrade.php
blocks/online_users/tests/generator/lib.php
blocks/quiz_results/db/upgrade.php
blocks/recent_activity/db/upgrade.php
blocks/recent_activity/tests/behat/structural_changes.feature
blocks/rss_client/db/upgrade.php
blocks/section_links/db/upgrade.php
blocks/selfcompletion/db/upgrade.php
blocks/settings/db/upgrade.php
blog/edit.php
blog/edit_form.php
blog/index.php
blog/tests/behat/delete.feature [new file with mode: 0644]
completion/tests/behat/enable_manual_complete_mark.feature
completion/tests/behat/restrict_activity_by_date.feature
completion/tests/behat/restrict_activity_by_grade.feature
completion/tests/behat/restrict_section_availability.feature
completion/tests/behat/teacher_manual_completion.feature
course/edit_form.php
course/lib.php
course/tests/behat/activities_edit_completion.feature
course/tests/behat/role_renaming.feature [new file with mode: 0644]
course/tests/courselib_test.php
course/tests/externallib_test.php
enrol/database/db/upgrade.php
enrol/externallib.php
enrol/flatfile/db/upgrade.php
enrol/guest/db/upgrade.php
enrol/imsenterprise/db/upgrade.php
enrol/manual/db/upgrade.php
enrol/mnet/db/upgrade.php
enrol/paypal/db/upgrade.php
enrol/self/db/upgrade.php
enrol/upgrade.txt
filter/mathjaxloader/db/upgrade.php
filter/mediaplugin/db/upgrade.php
filter/tex/db/upgrade.php
grade/grading/form/rubric/db/upgrade.php
grade/report/overview/index.php
grade/report/singleview/classes/local/ui/dropdown_attribute.php
grade/report/singleview/classes/local/ui/text_attribute.php
grade/report/singleview/js/singleview.js
grade/report/user/db/upgrade.php
install/css.php
install/lang/bg/admin.php
install/lang/cs/install.php
install/lang/cs/moodle.php
install/lang/eu/moodle.php
install/lang/fr/moodle.php
install/lang/hu/moodle.php
install/lang/it/moodle.php
install/lang/lt/install.php
install/lang/no/moodle.php
install/lang/pl/moodle.php
install/lang/ro/admin.php
install/lang/zh_cn/admin.php
install/lang/zh_cn/moodle.php
install/lang/zh_tw/moodle.php
lang/en/admin.php
lang/en/blog.php
lang/en/cache.php
lang/en/edufields.php
lang/en/grades.php
lang/en/hub.php
lang/en/moodle.php
lang/en/plagiarism.php
lang/en/repository.php
lang/en/role.php
lib/accesslib.php
lib/ajax/service.php
lib/amd/build/form-autocomplete.min.js
lib/amd/build/templates.min.js
lib/amd/src/form-autocomplete.js
lib/amd/src/templates.js
lib/behat/classes/behat_context_helper.php
lib/behat/classes/behat_selectors.php
lib/classes/event/course_section_deleted.php [new file with mode: 0644]
lib/classes/plugininfo/calendartype.php
lib/classes/useragent.php
lib/db/access.php
lib/db/services.php
lib/db/upgrade.php
lib/deprecatedlib.php
lib/editor/atto/db/upgrade.php
lib/editor/atto/plugins/equation/db/upgrade.php
lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button-debug.js
lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button-min.js
lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button.js
lib/editor/atto/plugins/rtl/yui/src/button/js/button.js
lib/editor/atto/yui/build/moodle-editor_atto-plugin/moodle-editor_atto-plugin-debug.js
lib/editor/atto/yui/build/moodle-editor_atto-plugin/moodle-editor_atto-plugin-min.js
lib/editor/atto/yui/build/moodle-editor_atto-plugin/moodle-editor_atto-plugin.js
lib/editor/atto/yui/src/editor/meta/editor.json
lib/editor/tinymce/db/upgrade.php
lib/editor/tinymce/plugins/spellchecker/db/upgrade.php
lib/enrollib.php
lib/externallib.php
lib/filestorage/file_storage.php
lib/filestorage/stored_file.php
lib/filestorage/tests/file_storage_test.php
lib/filestorage/tests/fixtures/testimage.png [new file with mode: 0644]
lib/filterlib.php
lib/flowplayer/lib.php
lib/installlib.php
lib/medialib.php
lib/moodlelib.php
lib/navigationlib.php
lib/outputlib.php
lib/outputrenderers.php
lib/password_compat/readme_moodle.txt
lib/password_compat/tests/PasswordHashTest.php
lib/phpunit/classes/util.php
lib/tablelib.php
lib/testing/generator/block_generator.php
lib/testing/generator/data_generator.php
lib/tests/behat/behat_data_generators.php
lib/tests/behat/behat_hooks.php
lib/tests/externallib_test.php
lib/tests/useragent_test.php
lib/tests/weblib_test.php
lib/upgrade.txt
lib/weblib.php
message/externallib.php
message/output/email/db/upgrade.php
message/output/jabber/db/upgrade.php
message/output/popup/db/upgrade.php
message/tests/externallib_test.php
mod/assign/db/upgrade.php
mod/assign/extensionform.php
mod/assign/feedback/comments/db/upgrade.php
mod/assign/feedback/editpdf/db/upgrade.php
mod/assign/feedback/editpdf/yui/build/moodle-assignfeedback_editpdf-editor/moodle-assignfeedback_editpdf-editor-debug.js
mod/assign/feedback/editpdf/yui/build/moodle-assignfeedback_editpdf-editor/moodle-assignfeedback_editpdf-editor-min.js
mod/assign/feedback/editpdf/yui/build/moodle-assignfeedback_editpdf-editor/moodle-assignfeedback_editpdf-editor.js
mod/assign/feedback/editpdf/yui/src/editor/js/annotation.js
mod/assign/feedback/editpdf/yui/src/editor/js/annotationstamp.js
mod/assign/feedback/editpdf/yui/src/editor/js/comment.js
mod/assign/feedback/editpdf/yui/src/editor/js/commentsearch.js
mod/assign/feedback/editpdf/yui/src/editor/js/drawable.js
mod/assign/feedback/editpdf/yui/src/editor/js/editor.js
mod/assign/feedback/editpdf/yui/src/editor/js/globals.js
mod/assign/feedback/file/db/upgrade.php
mod/assign/gradingtable.php
mod/assign/lang/en/assign.php
mod/assign/locallib.php
mod/assign/module.js
mod/assign/renderable.php
mod/assign/submission/comments/db/upgrade.php
mod/assign/submission/file/db/upgrade.php
mod/assign/submission/onlinetext/db/upgrade.php
mod/assign/submission/onlinetext/locallib.php
mod/assign/tests/behat/grant_extension.feature
mod/assign/tests/locallib_test.php
mod/assign/view.php
mod/assignment/db/upgrade.php
mod/book/classes/external.php
mod/book/db/upgrade.php
mod/book/tests/behat/log_entries.feature
mod/chat/classes/external.php
mod/chat/db/upgrade.php
mod/chat/lib.php
mod/choice/classes/external.php
mod/choice/db/upgrade.php
mod/data/db/upgrade.php
mod/data/field/checkbox/field.class.php
mod/feedback/db/upgrade.php
mod/feedback/tests/behat/show_nonrespondents.feature
mod/folder/db/upgrade.php
mod/forum/db/upgrade.php
mod/forum/externallib.php
mod/forum/tests/behat/completion_condition_number_discussions.feature
mod/forum/tests/behat/forum_subscriptions_availability.feature
mod/glossary/classes/external.php [new file with mode: 0644]
mod/glossary/db/services.php [new file with mode: 0644]
mod/glossary/db/upgrade.php
mod/glossary/tests/external_test.php [new file with mode: 0644]
mod/glossary/version.php
mod/imscp/classes/external.php
mod/imscp/db/upgrade.php
mod/label/db/upgrade.php
mod/lesson/db/upgrade.php
mod/lesson/tests/behat/completion_condition_end_reached.feature
mod/lesson/tests/behat/completion_condition_time_spent.feature
mod/lti/db/upgrade.php
mod/page/db/upgrade.php
mod/quiz/db/upgrade.php
mod/quiz/report/overview/db/upgrade.php
mod/quiz/report/statistics/db/upgrade.php
mod/quiz/tests/behat/attempt_redo_questions.feature
mod/quiz/tests/behat/completion_condition_attempts_used.feature
mod/quiz/tests/behat/completion_condition_passing_grade.feature
mod/resource/db/upgrade.php
mod/scorm/classes/external.php
mod/scorm/datamodels/scorm_13lib.php
mod/scorm/datamodels/sequencinglib.php
mod/scorm/db/upgrade.php
mod/survey/db/upgrade.php
mod/url/db/upgrade.php
mod/wiki/db/upgrade.php
mod/workshop/db/upgrade.php
mod/workshop/form/accumulative/db/upgrade.php
mod/workshop/form/comments/db/upgrade.php
mod/workshop/form/numerrors/db/upgrade.php
mod/workshop/form/rubric/db/upgrade.php
notes/tests/behat/participants_notes.feature [new file with mode: 0644]
package.json
portfolio/boxnet/db/upgrade.php
portfolio/googledocs/db/upgrade.php
portfolio/picasa/db/upgrade.php
question/behaviour/manualgraded/db/upgrade.php
question/editlib.php
question/engine/upgrade/upgradelib.php
question/import.php
question/type/calculated/db/upgrade.php
question/type/ddimageortext/tests/behat/preview.feature
question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-form/moodle-qtype_ddimageortext-form-debug.js
question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-form/moodle-qtype_ddimageortext-form-min.js
question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-form/moodle-qtype_ddimageortext-form.js
question/type/ddimageortext/yui/src/form/js/form.js
question/type/ddmarker/db/upgrade.php
question/type/ddmarker/tests/behat/preview.feature
question/type/ddwtos/tests/behat/preview.feature
question/type/essay/db/upgrade.php
question/type/match/db/upgrade.php
question/type/multianswer/db/upgrade.php
question/type/multichoice/db/upgrade.php
question/type/numerical/db/upgrade.php
question/type/random/db/upgrade.php
question/type/randomsamatch/db/upgrade.php
question/type/shortanswer/db/upgrade.php
question/upgrade.txt
report/completion/styles.css
report/outline/index.php
report/outline/lang/en/report_outline.php
report/outline/tests/behat/outline.feature
report/participation/index.php
report/participation/tests/behat/message_participants.feature [new file with mode: 0644]
report/progress/styles.css
repository/alfresco/db/upgrade.php
repository/boxnet/db/upgrade.php
repository/dropbox/db/upgrade.php
repository/filesystem/lib.php
repository/googledocs/db/upgrade.php
repository/lib.php
repository/picasa/db/upgrade.php
theme/bootstrapbase/README.txt
theme/bootstrapbase/less/README
theme/bootstrapbase/less/moodle/modules.less
theme/bootstrapbase/readme_moodle.txt
theme/bootstrapbase/style/editor.css
theme/bootstrapbase/style/moodle.css
theme/clean/classes/core_renderer.php
theme/clean/lang/en/theme_clean.php
theme/clean/layout/columns1.php
theme/clean/layout/columns2.php
theme/clean/layout/columns3.php
theme/clean/layout/secure.php
theme/clean/lib.php
theme/clean/settings.php
theme/clean/style/custom.css
theme/clean/version.php
theme/more/db/upgrade.php
theme/more/lang/en/theme_more.php
theme/more/lib.php
theme/more/settings.php
theme/more/style/custom.css
theme/more/version.php
theme/upgrade.txt
user/addnote.php
user/edit_form.php
version.php
webservice/xmlrpc/lib.php
webservice/xmlrpc/locallib.php
webservice/xmlrpc/tests/fixtures/array_response.xml [new file with mode: 0644]
webservice/xmlrpc/tests/fixtures/fault_response.xml [new file with mode: 0644]
webservice/xmlrpc/tests/fixtures/value_response.xml [new file with mode: 0644]
webservice/xmlrpc/tests/lib_test.php [new file with mode: 0644]

index 9deb770..c462b85 100644 (file)
@@ -191,14 +191,6 @@ script:
         export phpcmd=`which php`;
       fi
 
-    - >
-      if [ "$CITEST" = "true" -a "$GIT_PREVIOUS_COMMIT" != "$UPSTREAM_FETCH_HEAD" ];
-      then
-        # This is a CI test, but it is based on an older weekly release.
-        # Warn in a way that will fail the test.
-        echo "Current commit is based on an older weekly release" && false;
-      fi
-
     # Actually run the CI Tests - do this outside of the main test to make output clearer.
     - >
       if [ "$CITEST" = 'true' ];
index a3b699e..dcc22a8 100644 (file)
@@ -50,6 +50,17 @@ module.exports = function(grunt) {
                     }
                 )
             }
+        },
+        less: {
+            bootstrapbase: {
+                files: {
+                    "theme/bootstrapbase/style/moodle.css": "theme/bootstrapbase/less/moodle.less",
+                    "theme/bootstrapbase/style/editor.css": "theme/bootstrapbase/less/editor.less",
+                },
+                options: {
+                    compress: true
+                }
+           }
         }
     });
 
@@ -208,13 +219,11 @@ module.exports = function(grunt) {
             grunt.task.run('shifter');
         // Are we in an AMD directory?
         } else if (path.basename(cwd) == 'amd') {
-            grunt.task.run('jshint');
-            grunt.task.run('uglify');
+            grunt.task.run('amd');
         } else {
             // Run them all!.
-            grunt.task.run('shifter');
-            grunt.task.run('jshint');
-            grunt.task.run('uglify');
+            grunt.task.run('css');
+            grunt.task.run('js');
         }
     };
 
@@ -222,9 +231,15 @@ module.exports = function(grunt) {
     // Register NPM tasks.
     grunt.loadNpmTasks('grunt-contrib-uglify');
     grunt.loadNpmTasks('grunt-contrib-jshint');
+    grunt.loadNpmTasks('grunt-contrib-less');
 
-    // Register the shifter task.
+    // Register JS tasks.
     grunt.registerTask('shifter', 'Run Shifter against the current directory', tasks.shifter);
+    grunt.registerTask('amd', ['jshint', 'uglify']);
+    grunt.registerTask('js', ['amd', 'shifter']);
+
+    // Register CSS taks.
+    grunt.registerTask('css', ['less:bootstrapbase']);
 
     // Register the startup task.
     grunt.registerTask('startup', 'Run the correct tasks for the current directory', tasks.startup);
index 06f565d..d18c144 100644 (file)
@@ -422,6 +422,12 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
         } else {
             // Updating role.
             $DB->update_record('role', $this->role);
+
+            // This will ensure the course contacts cache is purged so name changes get updated in
+            // the UI. It would be better to do this only when we know that fields affected are
+            // updated. But thats getting into the weeds of the coursecat cache and role edits
+            // should not be that frequent, so here is the ugly brutal approach.
+            coursecat::role_assignment_changed($this->role->id, context_system::instance());
         }
 
         // Assignable contexts.
index f5ea9e3..9ed5af8 100644 (file)
@@ -489,10 +489,9 @@ if ($hassiteconfig) {
 // Add Calendar type settings.
 if ($hassiteconfig) {
     $ADMIN->add('modules', new admin_category('calendartype', new lang_string('calendartypes', 'calendar')));
-    foreach (core_component::get_plugin_list_with_file('calendartype', 'settings.php') as $plugin => $settingspath) {
-        $settings = new admin_settingpage('calendartype_' . $plugin . '_settings', new lang_string('pluginname', 'calendartype_' . $plugin), 'moodle/site:config');
-        include($settingspath);
-        $ADMIN->add('calendartype', $settings);
+    foreach (core_plugin_manager::instance()->get_plugins_of_type('calendartype') as $plugin) {
+        /** @var \core\plugininfo\calendartype $plugin */
+        $plugin->load_settings($ADMIN, 'calendartype', $hassiteconfig);
     }
 }
 
index 1eae0d0..9cae26c 100644 (file)
@@ -34,7 +34,7 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
     // Conditional activities: completion and availability
     $optionalsubsystems->add(new admin_setting_configcheckbox('enablecompletion',
         new lang_string('enablecompletion','completion'),
-        new lang_string('configenablecompletion','completion'), 0));
+        new lang_string('configenablecompletion', 'completion'), 1));
 
     $options = array(
         1 => get_string('completionactivitydefault', 'completion'),
@@ -45,7 +45,7 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
 
     $optionalsubsystems->add($checkbox = new admin_setting_configcheckbox('enableavailability',
             new lang_string('enableavailability', 'availability'),
-            new lang_string('enableavailability_desc', 'availability'), 0));
+            new lang_string('enableavailability_desc', 'availability'), 1));
     $checkbox->set_affects_modinfo(true);
 
     $optionalsubsystems->add(new admin_setting_configcheckbox('enableplagiarism', new lang_string('enableplagiarism','plagiarism'), new lang_string('configenableplagiarism','plagiarism'), 0));
index 9234fee..65b0b4a 100644 (file)
@@ -8,6 +8,8 @@ Feature: Manage availability conditions
   Scenario: Display list of availability conditions
     # Check the report doesn't show when not enabled.
     Given I log in as "admin"
+    And the following config values are set as admin:
+      | enableavailability | 0 |
     And I expand "Site administration" node
     When I expand "Plugins" node
     Then I should not see "Availability restrictions"
@@ -28,8 +30,6 @@ Feature: Manage availability conditions
     Given the following "courses" exist:
       | fullname | shortname | format |
       | Course 1 | C1        | topics |
-    And the following config values are set as admin:
-      | enableavailability | 1 |
     And I log in as "admin"
     And I am on site homepage
     When I navigate to "Manage restrictions" node in "Site administration > Plugins > Availability restrictions"
index 9853ea5..0f3e3af 100644 (file)
@@ -424,9 +424,9 @@ Feature: Set up contextual data for tests
     And the following "grade categories" exist:
       | fullname         | course |
       | Grade category 1 | C1     |
-     And the following "grade items" exist:
-       | itemname                  | course | outcome | gradecategory    |
-       | Test Outcome Grade Item 1 | C1     | OT1     | Grade category 1 |
+    And the following "grade items" exist:
+      | itemname                  | course | outcome | gradecategory    |
+      | Test Outcome Grade Item 1 | C1     | OT1     | Grade category 1 |
     And the following config values are set as admin:
       | enableoutcomes | 1 |
     When I log in as "admin"
@@ -441,3 +441,15 @@ Feature: Set up contextual data for tests
     And I expand all fieldsets
     And "//div[contains(@class, 'fitem')]/div[contains(@class, 'fitemtitle')]/div[contains(@class, fstaticlabel) and contains(., 'Grade category')]/../../div[contains(@class, 'felement') and contains(., 'Grade category 1')]" "xpath_element" should exist
     And I press "Cancel"
+
+  Scenario: Add a block
+    Given the following "courses" exist:
+      | fullname | shortname |
+      | Course 1 | C1        |
+    And the following "blocks" exist:
+      | blockname    | contextlevel | reference | pagetypepattern | defaultregion |
+      | online_users | Course       | C1        | course-view-*   | site-pre      |
+    When I log in as "admin"
+    And I am on site homepage
+    And I follow "Course 1"
+    Then I should see "Online users"
index 489f887..01f87e9 100644 (file)
@@ -54,5 +54,8 @@ function xmldb_tool_customlang_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index da2a60c..2a4eab3 100644 (file)
@@ -52,5 +52,8 @@ function xmldb_tool_log_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index f12d844..565efed 100644 (file)
@@ -42,5 +42,8 @@ function xmldb_logstore_database_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 0fa6a8f..9b4247b 100644 (file)
@@ -120,5 +120,8 @@ function xmldb_logstore_standard_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index ffb1750..f02556d 100644 (file)
@@ -56,5 +56,8 @@ function xmldb_tool_monitor_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index f3abc34..bca88a4 100644 (file)
@@ -74,5 +74,8 @@ function xmldb_auth_cas_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index e619df6..7979bd8 100644 (file)
@@ -309,7 +309,7 @@ class auth_db_testcase extends advanced_testcase {
         require_once($CFG->libdir.'/password_compat/lib/password.php');
         set_config('passtype', 'saltedcrypt', 'auth/db');
         $auth->config->passtype = 'saltedcrypt';
-        $user3->pass = password_hash('heslo', PASSWORD_BCRYPT, array('salt' => 'best_salt_ever_moodle_rocks_dont_tell'));
+        $user3->pass = password_hash('heslo', PASSWORD_BCRYPT);
         $DB->update_record('auth_db_users', $user3);
         $this->assertTrue($auth->user_login('u3', 'heslo'));
 
index e73f929..3a320e3 100644 (file)
@@ -64,5 +64,8 @@ function xmldb_auth_ldap_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index e306b6a..3039953 100644 (file)
@@ -56,5 +56,8 @@ function xmldb_auth_manual_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 5d2cb16..0090939 100644 (file)
@@ -56,5 +56,8 @@ function xmldb_auth_mnet_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 3d95470..507ba1b 100644 (file)
@@ -16,9 +16,6 @@ Feature: availability_completion
       | user     | course | role           |
       | teacher1 | C1     | editingteacher |
       | student1 | C1     | student        |
-    And the following config values are set as admin:
-      | enableavailability  | 1 |
-      | enablecompletion | 1 |
 
   @javascript
   Scenario: Test condition
index b7f6fec..402afdd 100644 (file)
@@ -14,9 +14,6 @@ Feature: Confirm that conditions on completion no longer cause a bug
     And the following "course enrolments" exist:
       | user     | course | role           |
       | teacher1 | C1     | editingteacher |
-    And the following config values are set as admin:
-      | enableavailability | 1 |
-      | enablecompletion   | 1 |
 
   @javascript
   Scenario: Multiple completion conditions on glossary
index 925781d..161080f 100644 (file)
@@ -16,8 +16,6 @@ Feature: availability_date
       | user     | course | role           |
       | teacher1 | C1     | editingteacher |
       | student1 | C1     | student        |
-    And the following config values are set as admin:
-      | enableavailability  | 1 |
 
   @javascript
   Scenario: Test condition
index 967e7c8..9c250e1 100644 (file)
@@ -16,8 +16,6 @@ Feature: availability_grade
       | user     | course | role           |
       | teacher1 | C1     | editingteacher |
       | student1 | C1     | student        |
-    And the following config values are set as admin:
-      | enableavailability  | 1 |
 
   @javascript
   Scenario: Test condition
index d3c2b06..31d65d2 100644 (file)
@@ -16,8 +16,6 @@ Feature: availability_group
       | user     | course | role           |
       | teacher1 | C1     | editingteacher |
       | student1 | C1     | student        |
-    And the following config values are set as admin:
-      | enableavailability  | 1 |
 
   @javascript
   Scenario: Test condition
index e33b588..3c1ccb1 100644 (file)
@@ -22,8 +22,6 @@ Feature: availability_grouping
     And the following "group members" exist:
       | user     | group |
       | student1 | GI1   |
-    And the following config values are set as admin:
-      | enableavailability  | 1 |
 
   @javascript
   Scenario: Test condition
index ba207a1..2222fb7 100644 (file)
@@ -16,8 +16,6 @@ Feature: availability_profile
       | user     | course | role           |
       | teacher1 | C1     | editingteacher |
       | student1 | C1     | student        |
-    And the following config values are set as admin:
-      | enableavailability  | 1 |
 
   @javascript
   Scenario: Test condition
index ea70a05..0daeee2 100644 (file)
@@ -34,8 +34,6 @@ Feature: display_availability
       | user     | course | role           |
       | teacher1 | C1     | editingteacher |
       | student1 | C1     | student        |
-    And the following config values are set as admin:
-      | enableavailability | 1 |
 
   @javascript
   Scenario: Activity availability display
index 0af20b5..08a6f70 100644 (file)
@@ -29,6 +29,8 @@ Feature: edit_availability
       | student1 | C1     | student        |
 
   Scenario: Confirm the 'enable availability' option is working
+    Given the following config values are set as admin:
+      | enableavailability | 0 |
     When I log in as "teacher1"
     And I am on site homepage
     And I follow "Course 1"
@@ -55,9 +57,7 @@ Feature: edit_availability
   @javascript
   Scenario: Edit availability using settings in activity form
     # Set up.
-    Given the following config values are set as admin:
-      | enableavailability | 1 |
-    And I log in as "teacher1"
+    Given I log in as "teacher1"
     And I follow "Course 1"
 
     # Add a Page and check it has None in so far.
@@ -148,9 +148,7 @@ Feature: edit_availability
   @javascript
   Scenario: Edit availability using settings in section form
     # Set up.
-    Given the following config values are set as admin:
-      | enableavailability | 1 |
-    And I log in as "teacher1"
+    Given I log in as "teacher1"
     And I am on site homepage
     And I follow "Course 1"
     And I turn editing mode on
@@ -170,7 +168,9 @@ Feature: edit_availability
   @javascript
   Scenario: 'Add group/grouping access restriction' button unavailable
     # Button does not exist when conditional access restrictions are turned off.
-    Given I log in as "admin"
+    Given the following config values are set as admin:
+      | enableavailability | 0 |
+    And I log in as "admin"
     And I am on site homepage
     And I follow "Course 1"
     And I turn editing mode on
@@ -181,9 +181,7 @@ Feature: edit_availability
   @javascript
   Scenario: Use the 'Add group/grouping access restriction' button
     # Button should initially be disabled.
-    Given the following config values are set as admin:
-      | enableavailability | 1 |
-    And the following "groupings" exist:
+    Given the following "groupings" exist:
       | name | course | idnumber |
       | GX1  | C1     | GXI1     |
     And I log in as "admin"
index 1477978..d349b9c 100644 (file)
@@ -45,9 +45,10 @@ class info_testcase extends advanced_testcase {
      * Tests the info_module class (is_available, get_full_information).
      */
     public function test_info_module() {
-        global $DB;
+        global $DB, $CFG;
 
         // Create a course and pages.
+        $CFG->enableavailability = 0;
         $this->setAdminUser();
         $this->resetAfterTest();
         $generator = $this->getDataGenerator();
@@ -160,6 +161,7 @@ class info_testcase extends advanced_testcase {
         global $CFG, $DB;
         require_once($CFG->dirroot . '/course/lib.php');
         $this->resetAfterTest();
+        $CFG->enableavailability = 0;
 
         // Create a course and some pages:
         // 0. Invisible due to visible=0.
index 894aebd..0b2ed3f 100644 (file)
@@ -135,7 +135,7 @@ abstract class backup implements checksumable {
     /**
      * Usually same than major release zero version, mainly for informative/historic purposes.
      */
-    const RELEASE = '3.0';
+    const RELEASE = '3.1';
 }
 
 /*
index 0728dac..3b323ad 100644 (file)
@@ -144,7 +144,7 @@ class cc2moodle {
 
     public function generate_moodle_xml () {
 
-        global $CFG;
+        global $CFG, $OUTPUT;
 
         $cdir = static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'course_files';
 
@@ -213,7 +213,7 @@ class cc2moodle {
 
         } else {
             $status = false;
-            notify('The course is empty');
+            echo $OUTPUT->notification('The course is empty');
             static::log_action('The course is empty', false);
         }
 
index dfff6b2..4a8ef06 100644 (file)
@@ -198,7 +198,7 @@ class entities {
     }
 
     public function move_files($files, $destination_folder) {
-        global $CFG;
+        global $CFG, $OUTPUT;
 
         if (!empty($files)) {
 
@@ -220,7 +220,7 @@ class entities {
                 }
 
                 if (!$copy_success) {
-                    notify('WARNING: Cannot copy the file ' . $source . ' to ' . $destination);
+                    echo $OUTPUT->notification('WARNING: Cannot copy the file ' . $source . ' to ' . $destination);
                     cc2moodle::log_action('Cannot copy the file ' . $source . ' to ' . $destination, false);
                 }
             }
index 17d9170..94625fb 100644 (file)
@@ -25,6 +25,7 @@ require_once($CFG->dirroot . '/backup/cc/includes/constants.php');
 require_once($CFG->dirroot . '/backup/cc/cc2moodle.php');
 
 function cc_convert ($dir) {
+    global $OUTPUT;
 
     $manifest_file = $dir . DIRECTORY_SEPARATOR . 'imsmanifest.xml';
     $moodle_file = $dir . DIRECTORY_SEPARATOR . 'moodle.xml';
@@ -39,26 +40,26 @@ function cc_convert ($dir) {
             $detected_requirements = detect_requirements();
 
             if (!$detected_requirements["php5"]) {
-                notify(get_string('cc_import_req_php5', 'imscc'));
+                echo $OUTPUT->notification(get_string('cc_import_req_php5', 'imscc'));
                 return false;
             }
 
             if (!$detected_requirements["dom"]) {
-                notify(get_string('cc_import_req_dom', 'imscc'));
+                echo $OUTPUT->notification(get_string('cc_import_req_dom', 'imscc'));
                 return false;
             }
 
             if (!$detected_requirements["libxml"]) {
-                notify(get_string('cc_import_req_libxml', 'imscc'));
+                echo $OUTPUT->notification(get_string('cc_import_req_libxml', 'imscc'));
                 return false;
             }
 
             if (!$detected_requirements["libxmlminversion"]) {
-                notify(get_string('cc_import_req_libxmlminversion', 'imscc'));
+                echo $OUTPUT->notification(get_string('cc_import_req_libxmlminversion', 'imscc'));
                 return false;
             }
             if (!$detected_requirements["xsl"]) {
-                notify(get_string('cc_import_req_xsl', 'imscc'));
+                echo $OUTPUT->notification(get_string('cc_import_req_xsl', 'imscc'));
                 return false;
             }
 
@@ -76,17 +77,17 @@ function cc_convert ($dir) {
                     if (!$cc2moodle->is_auth()) {
                         return $cc2moodle->generate_moodle_xml();
                     } else {
-                        notify(get_string('cc2moodle_req_auth', 'imscc'));
+                        echo $OUTPUT->notification(get_string('cc2moodle_req_auth', 'imscc'));
                         return false;
                     }
 
                 } else {
-                    notify(get_string('cc2moodle_invalid_schema', 'imscc'));
+                    echo $OUTPUT->notification(get_string('cc2moodle_invalid_schema', 'imscc'));
                     return false;
                 }
 
             } else {
-                notify(get_string('cc2moodle_manifest_dont_load', 'imscc'));
+                echo $OUTPUT->notification(get_string('cc2moodle_manifest_dont_load', 'imscc'));
                 return false;
             }
         }
index bb7d4e3..6e182c0 100644 (file)
@@ -97,7 +97,10 @@ class restore_log_rule implements processable {
         return $this->module . '-' . $this->action;
     }
 
-    public function process($log) {
+    public function process($inputlog) {
+
+        // There might be multiple rules that process this log, we can't alter it in the process of checking it.
+        $log = clone($inputlog);
 
         // Reset the allpairs array
         $this->allpairs = array();
diff --git a/backup/util/helper/tests/restore_log_rule_test.php b/backup/util/helper/tests/restore_log_rule_test.php
new file mode 100644 (file)
index 0000000..03d016b
--- /dev/null
@@ -0,0 +1,52 @@
+<?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_backup
+ * @category   test
+ * @copyright  2015 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+// Include all the needed stuff
+global $CFG;
+require_once($CFG->dirroot . '/backup/util/includes/restore_includes.php');
+
+
+class backup_restore_log_rule_testcase extends basic_testcase {
+
+    function test_process_keeps_log_unmodified() {
+
+        // Prepare a tiny log entry.
+        $originallog = new stdClass();
+        $originallog->url = 'original';
+        $originallog->info = 'original';
+        $log = clone($originallog);
+
+        // Process it with a tiny log rule, only modifying url and info.
+        $lr = new restore_log_rule('test', 'test', 'changed', 'changed');
+        $result = $lr->process($log);
+
+        // The log has been processed.
+        $this->assertEquals('changed', $result->url);
+        $this->assertEquals('changed', $result->info);
+
+        // But the original log has been kept unmodified by the process() call.
+        $this->assertEquals($originallog, $log);
+    }
+}
index 4bb0a66..0b68bd7 100644 (file)
@@ -129,8 +129,6 @@ Feature: Award badges
       | user | course | role |
       | teacher1 | C1 | editingteacher |
       | student1 | C1 | student |
-    And the following config values are set as admin:
-      | enablecompletion | 1 |
     And I log in as "teacher1"
     And I follow "Course 1"
     And I follow "Edit settings"
@@ -180,8 +178,6 @@ Feature: Award badges
       | user | course | role |
       | teacher1 | C1 | editingteacher |
       | student1 | C1 | student |
-    And the following config values are set as admin:
-      | enablecompletion | 1 |
     And I log in as "teacher1"
     And I follow "Course 1"
     And I follow "Edit settings"
index 64c2e5d..a9ff3a1 100644 (file)
@@ -79,5 +79,8 @@ function xmldb_block_badges_upgrade($oldversion, $block) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 589c706..c83b12a 100644 (file)
@@ -79,5 +79,8 @@ function xmldb_block_calendar_month_upgrade($oldversion, $block) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index f3c8e4e..0836409 100644 (file)
@@ -79,5 +79,8 @@ function xmldb_block_calendar_upcoming_upgrade($oldversion, $block) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index c6002aa..bcc82dc 100644 (file)
@@ -69,5 +69,8 @@ function xmldb_block_community_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index bce3229..070ebcc 100644 (file)
@@ -76,5 +76,8 @@ function xmldb_block_completionstatus_upgrade($oldversion, $block) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
\ No newline at end of file
index b7c389a..0c1549e 100644 (file)
@@ -80,5 +80,8 @@ function xmldb_block_course_summary_upgrade($oldversion, $block) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
\ No newline at end of file
index a16d200..6ca3bb5 100644 (file)
@@ -84,14 +84,13 @@ class block_glossary_random extends block_base {
             $limitfrom = 0;
             $limitnum = 1;
 
-            $BROWSE = 'timemodified';
+            $orderby = 'timemodified ASC';
 
             switch ($this->config->type) {
 
                 case BGR_RANDOMLY:
                     $i = rand(1,$numberofentries);
                     $limitfrom = $i-1;
-                    $SORT = 'ASC';
                     break;
 
                 case BGR_NEXTONE:
@@ -104,11 +103,10 @@ class block_glossary_random extends block_base {
                         $i = 1;
                     }
                     $limitfrom = $i-1;
-                    $SORT = 'ASC';
                     break;
 
                 case BGR_NEXTALPHA:
-                    $BROWSE = 'concept';
+                    $orderby = 'concept ASC';
                     if (isset($this->config->previous)) {
                         $i = $this->config->previous + 1;
                     } else {
@@ -118,20 +116,19 @@ class block_glossary_random extends block_base {
                         $i = 1;
                     }
                     $limitfrom = $i-1;
-                    $SORT = 'ASC';
                     break;
 
                 default:  // BGR_LASTMODIFIED
                     $i = $numberofentries;
                     $limitfrom = 0;
-                    $SORT = 'DESC';
+                    $orderby = 'timemodified DESC, id DESC';
                     break;
             }
 
             if ($entry = $DB->get_records_sql("SELECT id, concept, definition, definitionformat, definitiontrust
                                                  FROM {glossary_entries}
                                                 WHERE glossaryid = ? AND approved = 1
-                                             ORDER BY $BROWSE $SORT", array($this->config->glossary), $limitfrom, $limitnum)) {
+                                             ORDER BY $orderby", array($this->config->glossary), $limitfrom, $limitnum)) {
 
                 $entry = reset($entry);
 
index 24776ae..ff87abf 100644 (file)
@@ -56,5 +56,8 @@ function xmldb_block_html_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 2f7240b..6ea9268 100644 (file)
@@ -81,5 +81,8 @@ function xmldb_block_navigation_upgrade($oldversion, $block) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
\ No newline at end of file
index a560fd5..6b721a9 100644 (file)
@@ -36,31 +36,6 @@ defined('MOODLE_INTERNAL') || die();
  */
 class block_online_users_generator extends testing_block_generator {
 
-    /**
-     * Create new block instance
-     * @param array|stdClass $record
-     * @param array $options
-     * @return stdClass activity record with extra cmid field
-     */
-    public function create_instance($record = null, array $options = null) {
-        global $DB, $CFG;
-        require_once("$CFG->dirroot/mod/page/locallib.php");
-
-        $this->instancecount++;
-
-        $record = (object)(array)$record;
-        $options = (array)$options;
-
-        $record = $this->prepare_record($record);
-
-        $id = $DB->insert_record('block_instances', $record);
-        context_block::instance($id);
-
-        $instance = $DB->get_record('block_instances', array('id'=>$id), '*', MUST_EXIST);
-
-        return $instance;
-    }
-
     /**
      * Create (simulated) logged in users and add some of them to groups in a course
      */
index d7edead..ec753c9 100644 (file)
@@ -104,5 +104,8 @@ function xmldb_block_quiz_results_upgrade($oldversion, $block) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
\ No newline at end of file
index 6a12a7a..8d0f893 100644 (file)
@@ -90,5 +90,8 @@ function xmldb_block_recent_activity_upgrade($oldversion, $block) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 4340c60..a43dbb7 100644 (file)
@@ -46,9 +46,7 @@ Feature: View structural changes in recent activity block
       | GG3      | G2    |
 
   Scenario: Check that Added module information is displayed respecting view capability
-    Given the following config values are set as admin:
-      | enableavailability | 1 |
-    And I log in as "teacher1"
+    Given I log in as "teacher1"
     And I follow "Course 1"
     And I turn editing mode on
     When I add a "Forum" to section "1" and I fill the form with:
index afc2b80..cf8294e 100644 (file)
@@ -50,5 +50,8 @@ function xmldb_block_rss_client_upgrade($oldversion) {
         upgrade_block_savepoint(true, 2015071700, 'rss_client');
     }
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 16d38de..057f275 100644 (file)
@@ -92,5 +92,8 @@ function xmldb_block_section_links_upgrade($oldversion, $block) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 79721a1..e79331c 100644 (file)
@@ -80,5 +80,8 @@ function xmldb_block_selfcompletion_upgrade($oldversion, $block) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
\ No newline at end of file
index 584ed9d..b1cf6f8 100644 (file)
@@ -81,5 +81,8 @@ function xmldb_block_settings_upgrade($oldversion, $block) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
\ No newline at end of file
index 7ff8333..14d4c87 100644 (file)
@@ -141,14 +141,15 @@ if ($action === 'delete') {
         // Output edit mode title.
         echo $OUTPUT->heading($strblogs . ': ' . get_string('deleteentry', 'blog'), 2);
 
+        echo $OUTPUT->confirm(get_string('blogdeleteconfirm', 'blog', format_string($entry->subject)),
+                              new moodle_url('edit.php', $optionsyes),
+                              new moodle_url('index.php', $optionsno));
+
+        echo '<br />';
         // Output the entry.
         $entry->prepare_render();
         echo $output->render($entry);
 
-        echo '<br />';
-        echo $OUTPUT->confirm(get_string('blogdeleteconfirm', 'blog'),
-                              new moodle_url('edit.php', $optionsyes),
-                              new moodle_url('index.php', $optionsno));
         echo $OUTPUT->footer();
         die;
     }
index 805bf79..773f153 100644 (file)
@@ -151,7 +151,7 @@ class blog_edit_form extends moodleform {
     public function validation($data, $files) {
         global $CFG, $DB, $USER;
 
-        $errors = array();
+        $errors = parent::validation($data, $files);
 
         // Validate course association.
         if (!empty($data['courseassoc'])) {
index ddbdf45..56ab7eb 100644 (file)
@@ -63,9 +63,9 @@ if ($entryid and !isset($userid)) {
     $userid = $entry->userid;
 }
 
-if (isset($userid) && !isset($courseid)) {
+if (isset($userid) && empty($courseid)) {
     $context = context_user::instance($userid);
-} else if (isset($courseid) && $courseid != SITEID) {
+} else if (!empty($courseid) && $courseid != SITEID) {
     $context = context_course::instance($courseid);
 } else {
     $context = context_system::instance();
diff --git a/blog/tests/behat/delete.feature b/blog/tests/behat/delete.feature
new file mode 100644 (file)
index 0000000..cd1dd5b
--- /dev/null
@@ -0,0 +1,43 @@
+@core @core_blog
+Feature: Delete a blog entry
+  In order to manage my blog entries
+  As a user
+  I need to be able to delete entries I no longer wish to appear
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email |
+      | testuser | Test | User | moodle@example.com |
+    And I log in as "testuser"
+    And I expand "Site pages" node
+    And I follow "Site blogs"
+    And I follow "Add a new entry"
+    And I set the following fields to these values:
+      | Entry title | Blog post one |
+      | Blog entry body | User 1 blog post content |
+    And I press "Save changes"
+    And I follow "Add a new entry"
+    And I set the following fields to these values:
+      | Entry title | Blog post two |
+      | Blog entry body | User 1 blog post content |
+    And I press "Save changes"
+    And I am on site homepage
+    And I expand "Site pages" node
+    And I follow "Site blogs"
+
+  Scenario: Delete blog post results in post deleted
+    Given I follow "Blog post one"
+    And I follow "Delete"
+    And I should see "Delete the blog entry 'Blog post one'?"
+    When I press "Continue"
+    Then I should not see "Blog post one"
+    And I should see "Blog post two"
+
+  Scenario: Delete confirmation screen works and allows cancel
+    Given I follow "Blog post one"
+    When I follow "Delete"
+    Then I should see "Delete the blog entry 'Blog post one'?"
+    And I press "Cancel"
+    And I should see "Blog post one"
+    And I should see "Blog post two"
+
index 93ba976..75a11a2 100644 (file)
@@ -17,9 +17,6 @@ Feature: Allow students to manually mark an activity as complete
       | user | course | role |
       | teacher1 | C1 | editingteacher |
       | student1 | C1 | student |
-    And the following config values are set as admin:
-      | enablecompletion | 1 |
-      | enableavailability | 1 |
     And I log in as "teacher1"
     And I am on site homepage
     And I follow "Course 1"
index fc3033d..5d19955 100644 (file)
@@ -16,8 +16,6 @@ Feature: Restrict activity availability through date conditions
       | user | course | role |
       | teacher1 | C1 | editingteacher |
       | student1 | C1 | student |
-    And the following config values are set as admin:
-      | enableavailability | 1 |
     And I log in as "teacher1"
     And I am on site homepage
     And I follow "Course 1"
index 3b0a60f..27fa423 100644 (file)
@@ -17,8 +17,6 @@ Feature: Restrict activity availability through grade conditions
       | user | course | role |
       | teacher1 | C1 | editingteacher |
       | student1 | C1 | student |
-    And the following config values are set as admin:
-      | enableavailability | 1 |
     And I log in as "teacher1"
     #And I am on site homepage
     And I follow "Course 1"
index 436c63d..3a74723 100644 (file)
@@ -16,9 +16,6 @@ Feature: Restrict sections availability through completion or grade conditions
       | user | course | role |
       | teacher1 | C1 | editingteacher |
       | student1 | C1 | student |
-    And the following config values are set as admin:
-      | enablecompletion   | 1 |
-      | enableavailability | 1 |
 
   @javascript
   Scenario: Show section greyed-out to student when completion condition is not satisfied
index 3b8c4d4..c1ce408 100644 (file)
@@ -16,11 +16,7 @@ Feature: Allow teachers to manually mark users as complete when configured
       | user     | course | role           |
       | student1 | CC1    | student        |
       | teacher1 | CC1    | editingteacher |
-    And the following config values are set as admin:
-      | enablecompletion | 1 |
     And I log in as "admin"
-    And I set the following administration settings values:
-      | Enable completion tracking | 1 |
     And I am on site homepage
     And I follow "Completion course"
     And completion tracking is "Enabled" in current course
index 6e0ed50..94d260c 100644 (file)
@@ -288,16 +288,19 @@ class course_edit_form extends moodleform {
         $options[0] = get_string('none');
         $mform->addElement('select', 'defaultgroupingid', get_string('defaultgrouping', 'group'), $options);
 
-        // Customizable role names in this course.
-        $mform->addElement('header','rolerenaming', get_string('rolerenaming'));
-        $mform->addHelpButton('rolerenaming', 'rolerenaming');
-
-        if ($roles = get_all_roles()) {
-            $roles = role_fix_names($roles, null, ROLENAME_ORIGINAL);
-            $assignableroles = get_roles_for_contextlevels(CONTEXT_COURSE);
-            foreach ($roles as $role) {
-                $mform->addElement('text', 'role_'.$role->id, get_string('yourwordforx', '', $role->localname));
-                $mform->setType('role_'.$role->id, PARAM_TEXT);
+        if ((empty($course->id) && guess_if_creator_will_have_course_capability('moodle/course:renameroles', $categorycontext))
+                || (!empty($course->id) && has_capability('moodle/course:renameroles', $coursecontext))) {
+            // Customizable role names in this course.
+            $mform->addElement('header', 'rolerenaming', get_string('rolerenaming'));
+            $mform->addHelpButton('rolerenaming', 'rolerenaming');
+
+            if ($roles = get_all_roles()) {
+                $roles = role_fix_names($roles, null, ROLENAME_ORIGINAL);
+                $assignableroles = get_roles_for_contextlevels(CONTEXT_COURSE);
+                foreach ($roles as $role) {
+                    $mform->addElement('text', 'role_' . $role->id, get_string('yourwordforx', '', $role->localname));
+                    $mform->setType('role_' . $role->id, PARAM_TEXT);
+                }
             }
         }
 
index ba830ca..21c4481 100644 (file)
@@ -1842,7 +1842,40 @@ function move_section_to($course, $section, $destination, $ignorenumsections = f
  * @return bool whether section was deleted
  */
 function course_delete_section($course, $section, $forcedeleteifnotempty = true) {
-    return course_get_format($course)->delete_section($section, $forcedeleteifnotempty);
+    global $DB;
+
+    // Prepare variables.
+    $courseid = (is_object($course)) ? $course->id : (int)$course;
+    $sectionnum = (is_object($section)) ? $section->section : (int)$section;
+    $section = $DB->get_record('course_sections', array('course' => $courseid, 'section' => $sectionnum));
+    if (!$section) {
+        // No section exists, can't proceed.
+        return false;
+    }
+    $format = course_get_format($course);
+    $sectionname = $format->get_section_name($section);
+
+    // Delete section.
+    $result = $format->delete_section($section, $forcedeleteifnotempty);
+
+    // Trigger an event for course section deletion.
+    if ($result) {
+        $context = context_course::instance($courseid);
+        $event = \core\event\course_section_deleted::create(
+                array(
+                    'objectid' => $section->id,
+                    'courseid' => $courseid,
+                    'context' => $context,
+                    'other' => array(
+                        'sectionnum' => $section->section,
+                        'sectionname' => $sectionname,
+                    )
+                )
+            );
+        $event->add_record_snapshot('course_sections', $section);
+        $event->trigger();
+    }
+    return $result;
 }
 
 /**
@@ -2486,6 +2519,8 @@ function save_local_role_names($courseid, $data) {
             $rolename->name = $value;
             $DB->insert_record('role_names', $rolename);
         }
+        // This will ensure the course contacts cache is purged..
+        coursecat::role_assignment_changed($roleid, $context);
     }
 }
 
index b264ea4..50878cc 100644 (file)
@@ -8,8 +8,6 @@ Feature: Edit completion settings of an activity
     Given the following "courses" exist:
       | fullname | shortname | enablecompletion |
       | Course 1 | C1        | 1                |
-    And the following config values are set as admin:
-      | enablecompletion | 1 |
     And I log in as "admin"
     And I am on site homepage
     And I follow "Course 1"
diff --git a/course/tests/behat/role_renaming.feature b/course/tests/behat/role_renaming.feature
new file mode 100644 (file)
index 0000000..7384c4c
--- /dev/null
@@ -0,0 +1,43 @@
+@core @core_course
+Feature: Rename roles in a course
+  In order to account for course-level differences
+  As a teacher
+  I need to be able to rename roles
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email                |
+      | student1 | Student   | 1        | student1@example.com |
+      | teacher1 | Teacher   | 1        | teacher1@example.com |
+    And the following "courses" exist:
+      | fullname | shortname |
+      | Course 1 | C1        |
+    And the following "course enrolments" exist:
+      | user     | course | role           |
+      | student1 | C1     | student        |
+      | teacher1 | C1     | editingteacher |
+
+  Scenario: Teacher can rename roles
+    Given I log in as "teacher1"
+    And I follow "Course 1"
+    And I click on "Edit settings" "link" in the "Administration" "block"
+    And I should see "Role renaming"
+    When I set the following fields to these values:
+      | Your word for 'Teacher' | Lecturer |
+      | Your word for 'Student' | Learner  |
+    And I press "Save and display"
+    And I navigate to "Enrolled users" node in "Course administration > Users"
+    Then I should see "Lecturer" in the "Teacher 1" "table_row"
+    And I should see "Learner" in the "Student 1" "table_row"
+
+  Scenario: Ability to rename roles can be prevented
+    Given I log in as "admin"
+    And I set the following system permissions of "Teacher" role:
+      | capability         | permission |
+      | moodle/course:renameroles | Inherit |
+    And I follow "Log out"
+    When I log in as "teacher1"
+    And I follow "Course 1"
+    And I click on "Edit settings" "link" in the "Administration" "block"
+    Then I should not see "Role renaming"
+    And I should not see "Your word for 'Teacher'"
index 110b0c4..421b1e4 100644 (file)
@@ -2009,6 +2009,44 @@ class core_course_courselib_testcase extends advanced_testcase {
         $this->assertEventContextNotUsed($event);
     }
 
+    /**
+     * Test that triggering a course_section_deleted event works as expected.
+     */
+    public function test_course_section_deleted_event() {
+        global $USER, $DB;
+        $this->resetAfterTest();
+        $sink = $this->redirectEvents();
+
+        // Create the course with sections.
+        $course = $this->getDataGenerator()->create_course(array('numsections' => 10), array('createsections' => true));
+        $sections = $DB->get_records('course_sections', array('course' => $course->id));
+        $coursecontext = context_course::instance($course->id);
+        $section = array_pop($sections);
+        course_delete_section($course, $section);
+        $events = $sink->get_events();
+        $event = array_pop($events); // Delete section event.
+        $sink->close();
+
+        // Validate event data.
+        $this->assertInstanceOf('\core\event\course_section_deleted', $event);
+        $this->assertEquals('course_sections', $event->objecttable);
+        $this->assertEquals($section->id, $event->objectid);
+        $this->assertEquals($course->id, $event->courseid);
+        $this->assertEquals($coursecontext->id, $event->contextid);
+        $this->assertEquals($section->section, $event->other['sectionnum']);
+        $expecteddesc = "The user with id '{$event->userid}' deleted section number '{$event->other['sectionnum']}' " .
+                "(section name '{$event->other['sectionname']}') for the course with id '{$event->courseid}'";
+        $this->assertEquals($expecteddesc, $event->get_description());
+        $this->assertEquals($section, $event->get_record_snapshot('course_sections', $event->objectid));
+        $this->assertNull($event->get_url());
+
+        // Test legacy data.
+        $sectionnum = $section->section;
+        $expectedlegacydata = array($course->id, "course", "delete section", 'view.php?id=' . $course->id, $sectionnum);
+        $this->assertEventLegacyLogData($expectedlegacydata, $event);
+        $this->assertEventContextNotUsed($event);
+    }
+
     public function test_course_integrity_check() {
         global $DB;
 
index e443b33..c5a6464 100644 (file)
@@ -1041,9 +1041,7 @@ class core_course_externallib_testcase extends externallib_advanced_testcase {
                     $this->assertEquals($course2['forcetheme'], $courseinfo->theme);
                 }
 
-                if (completion_info::is_enabled_for_site()) {
-                    $this->assertEquals($course2['enabledcompletion'], $courseinfo->enablecompletion);
-                }
+                $this->assertEquals($course2['enablecompletion'], $courseinfo->enablecompletion);
             } else if ($course['id'] == $course1['id']) {
                 $this->assertEquals($course1['fullname'], $courseinfo->fullname);
                 $this->assertEquals($course1['shortname'], $courseinfo->shortname);
index 450eaef..d1eb164 100644 (file)
@@ -53,5 +53,8 @@ function xmldb_enrol_database_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 7e64f21..331ee3d 100644 (file)
@@ -385,7 +385,10 @@ class core_enrol_external extends external_api {
                             * onlyactive (integer) return only users with active enrolments and matching time restrictions. This option requires \'moodle/course:enrolreview\' on the course context.
                             * userfields (\'string, string, ...\') return only the values of these user fields.
                             * limitfrom (integer) sql limit from.
-                            * limitnumber (integer) maximum number of returned users.', VALUE_DEFAULT, array()),
+                            * limitnumber (integer) maximum number of returned users.
+                            * sortby (string) sort by id, firstname or lastname. For ordering like the site does, use siteorder.
+                            * sortdirection (string) ASC or DESC',
+                            VALUE_DEFAULT, array()),
             )
         );
     }
@@ -417,6 +420,9 @@ class core_enrol_external extends external_api {
         $userfields     = array();
         $limitfrom = 0;
         $limitnumber = 0;
+        $sortby = 'us.id';
+        $sortparams = array();
+        $sortdirection = 'ASC';
         foreach ($options as $option) {
             switch ($option['name']) {
             case 'withcapability':
@@ -440,6 +446,26 @@ class core_enrol_external extends external_api {
             case 'limitnumber' :
                 $limitnumber = clean_param($option['value'], PARAM_INT);
                 break;
+            case 'sortby':
+                $sortallowedvalues = array('id', 'firstname', 'lastname', 'siteorder');
+                if (!in_array($option['value'], $sortallowedvalues)) {
+                    throw new invalid_parameter_exception('Invalid value for sortby parameter (value: ' . $option['value'] . '),' .
+                        'allowed values are: ' . implode(',', $sortallowedvalues));
+                }
+                if ($option['value'] == 'siteorder') {
+                    list($sortby, $sortparams) = users_order_by_sql('us');
+                } else {
+                    $sortby = 'us.' . $option['value'];
+                }
+                break;
+            case 'sortdirection':
+                $sortdirection = strtoupper($option['value']);
+                $directionallowedvalues = array('ASC', 'DESC');
+                if (!in_array($sortdirection, $directionallowedvalues)) {
+                    throw new invalid_parameter_exception('Invalid value for sortdirection parameter
+                        (value: ' . $sortdirection . '),' . 'allowed values are: ' . implode(',', $directionallowedvalues));
+                }
+                break;
             }
         }
 
@@ -503,7 +529,8 @@ class core_enrol_external extends external_api {
                         FROM {user} u $ctxjoin $groupjoin
                        WHERE u.id IN ($enrolledsql)
                   ) q ON q.id = us.id
-                ORDER BY us.id ASC";
+                ORDER BY $sortby $sortdirection";
+        $enrolledparams = array_merge($enrolledparams, $sortparams);
         $enrolledusers = $DB->get_recordset_sql($sql, $enrolledparams, $limitfrom, $limitnumber);
         $users = array();
         foreach ($enrolledusers as $user) {
index 8ad41f9..ebe5dd7 100644 (file)
@@ -54,5 +54,8 @@ function xmldb_enrol_flatfile_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index ccd51b1..8ae2004 100644 (file)
@@ -63,6 +63,9 @@ function xmldb_enrol_guest_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
 
index eb1f8ed..7fb9ea3 100644 (file)
@@ -56,5 +56,8 @@ function xmldb_enrol_imsenterprise_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index db7d182..7b98f19 100644 (file)
@@ -72,6 +72,9 @@ function xmldb_enrol_manual_upgrade($oldversion) {
         upgrade_plugin_savepoint(true, 2015091500, 'enrol', 'manual');
     }
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
 
index dea1555..e66d6ec 100644 (file)
@@ -55,5 +55,8 @@ function xmldb_enrol_mnet_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 01a1291..faf51dc 100644 (file)
@@ -70,5 +70,8 @@ function xmldb_enrol_paypal_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index eac4712..62cb0df 100644 (file)
@@ -71,6 +71,9 @@ function xmldb_enrol_self_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
 
index f98bcbb..38a41e1 100644 (file)
@@ -1,6 +1,9 @@
 This files describes API changes in /enrol/* - plugins,
 information provided here is intended especially for developers.
 
+=== 3.1 ===
+* core_enrol_external::get_enrolled_users now supports two additional parameters for ordering: sortby and sortdirection.
+
 === 3.0 ===
 
 * Added new events enrol_instance_created, enrol_instance_updated and
index 68a9316..eb1e4cd 100644 (file)
@@ -109,5 +109,8 @@ MathJax.Hub.Config({
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index adfa7db..3e37445 100644 (file)
@@ -78,5 +78,8 @@ function xmldb_filter_mediaplugin_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index b08a9e5..703a7d4 100644 (file)
@@ -74,5 +74,8 @@ function xmldb_filter_tex_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 8194960..a40da47 100644 (file)
@@ -62,5 +62,8 @@ function xmldb_gradingform_rubric_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 15954dc..e46885c 100644 (file)
@@ -36,6 +36,7 @@ if (!$course = $DB->get_record('course', array('id' => $courseid))) {
     print_error('nocourseid');
 }
 require_login(null, false);
+$PAGE->set_course($course);
 
 $context = context_course::instance($course->id);
 $systemcontext = context_system::instance();
@@ -64,9 +65,9 @@ if (isset($personalcontext) && $courseid == SITEID) {
 if ($userid == $USER->id) {
     $settings = $PAGE->settingsnav->find('mygrades', null);
     $settings->make_active();
-} else if ($courseid != SITEID) {
+} else if ($courseid != SITEID && $userid) {
     // Show some other navbar thing.
-    $user = $DB->get_record('user', array('id' => $userid));
+    $user = $DB->get_record('user', array('id' => $userid), '*', MUST_EXIST);
     $PAGE->navigation->extend_for_user($user);
 }
 
index aaaed88..19bc80c 100644 (file)
@@ -83,7 +83,7 @@ class dropdown_attribute extends element {
             'value' => $this->selected
         );
 
-        $attributes = array();
+        $attributes = array('tabindex' => '1');
 
         if (!empty($this->isdisabled)) {
             $attributes['disabled'] = 'DISABLED';
index 2766a9d..0102199 100644 (file)
@@ -85,9 +85,11 @@ class text_attribute extends element {
         $label = '';
         if (preg_match("/^feedback/", $this->name)) {
             $labeltitle = get_string('feedbackfor', 'gradereport_singleview', $this->label);
+            $attributes['tabindex'] = '2';
             $label = html_writer::tag('label', $labeltitle,  array('for' => $this->name, 'class' => 'accesshide'));
         } else if (preg_match("/^finalgrade/", $this->name)) {
             $labeltitle = get_string('gradefor', 'gradereport_singleview', $this->label);
+            $attributes['tabindex'] = '1';
             $label = html_writer::tag('label', $labeltitle,  array('for' => $this->name, 'class' => 'accesshide'));
         }
 
index 0c377b8..7ee45eb 100644 (file)
@@ -1,6 +1,96 @@
 M.gradereport_singleview = {};
 
 M.gradereport_singleview.init = function(Y) {
+    var getColumnIndex = function(cell) {
+        var rowNode = cell.ancestor('tr');
+        if (!rowNode || !cell) {
+            return;
+        }
+        var cells = rowNode.all('td, th');
+        return cells.indexOf(cell);
+    },
+    getNextCell = function(cell) {
+        var n = cell || document.activeElement,
+            next = n.next('td.cell, th.cell');
+        if (!next) {
+            return null;
+        }
+        // Continue on until we find a navigable cell
+        if (!next || !Y.one(next).one('input:not([type="hidden"]):not([disabled="DISABLED"]), select, a')) {
+            return getNextCell(next);
+        }
+        return next;
+    },
+    getPrevCell = function(cell) {
+        var n = cell || document.activeElement,
+            next = n.previous('td.cell, th.cell');
+        if (!next) {
+            return null;
+        }
+        // Continue on until we find a navigable cell
+        if (!Y.one(next).one('input:not([type="hidden"]):not([disabled="DISABLED"]), select, a')) {
+            return getPrevCell(next);
+        }
+        return next;
+    },
+    getAboveCell = function(cell) {
+        var n = cell || document.activeElement,
+            tr = n.ancestor('tr').previous('tr'),
+            columnIndex = getColumnIndex(n),
+            next = null;
+        if (tr) {
+            next = tr.all('td, th').item(columnIndex);
+        } else {
+            return null;
+        }
+        // Continue on until we find a navigable cell
+        if (!Y.one(next).one('input:not([type="hidden"]):not([disabled="DISABLED"]), select, a')) {
+            return getAboveCell(next);
+        }
+        return next;
+    },
+    getBelowCell = function(cell) {
+        var n = cell || document.activeElement,
+            tr = n.ancestor('tr').next('tr'),
+            columnIndex = getColumnIndex(n),
+            next = null;
+        if (tr) {
+            next = tr.all('td, th').item(columnIndex);
+        } else {
+            return null;
+        }
+        // Continue on until we find a navigable cell
+        if (!Y.one(next).one('input:not([type="hidden"]):not([disabled="DISABLED"]), select, a')) {
+            return getBelowCell(next);
+        }
+        return next;
+    };
+
+    // Add ctrl+arrow controls for navigation
+    Y.one(Y.config.doc.body).delegate('key', function(e) {
+        e.preventDefault();
+        e.stopPropagation();
+        var next = null;
+        switch (e.keyCode) {
+            case 37:
+                next = getPrevCell(this.ancestor('td, th'));
+                break;
+            case 38:
+                next = getAboveCell(this.ancestor('td, th'));
+                break;
+            case 39:
+                next = getNextCell(this.ancestor('td, th'));
+                break;
+            case 40:
+                next = getBelowCell(this.ancestor('td, th'));
+                break;
+        }
+        if (next) {
+            Y.one(next).one('input:not([type="hidden"]):not([disabled="DISABLED"]), select, a').focus();
+        }
+        return;
+    }, 'down:37,38,39,40+ctrl', 'table input, table select, table a');
+
     // Make toggle links
     Y.all('.include').each(function(link) {
         var type = link.getAttribute('class').split(" ")[2];
index b4627ef..f79d0d1 100644 (file)
@@ -42,5 +42,8 @@ function xmldb_gradereport_user_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 0228dff..88c69fc 100644 (file)
@@ -33,7 +33,7 @@ if (file_exists(dirname(dirname(__FILE__)).'/config.php')) {
 // MDL-43839 IE9 cannot handle all of our css.
 // Once IE9 is no longer supported we can include 'bootstrapbase/style/moodle.css'
 // and remove some of the CSS in $content.
-$files = array('');
+$files = array();
 
 $content = '';
 
index fb5e988..fc90ba2 100644 (file)
@@ -35,6 +35,7 @@ $string['cliansweryes'] = 'Да';
 $string['cliincorrectvalueerror'] = 'Грешка, некоректна стойност "{$a->value}" за "{$a->option}"';
 $string['cliincorrectvalueretry'] = 'Неправилна стойност. Моля опитайте отново';
 $string['clitypevalue'] = 'Тип стойност';
+$string['clitypevaluedefault'] = 'въведете стойност, натиснете Enter за да се използва стойността по подразбиране ({$a})';
 $string['cliyesnoprompt'] = 'Въведете y (означава да) или n (означава не)';
 $string['environmentrequireinstall'] = 'Трябва да бъде инсталиран и разрешен';
 $string['environmentrequireversion'] = 'Необходима е версия {$a->needed} а Вие имате  {$a->current}';
index fa05a34..3a79b41 100644 (file)
@@ -79,7 +79,7 @@ $string['phpversion'] = 'Verze PHP';
 $string['phpversionhelp'] = '<p>Moodle vyžaduje PHP alespoň verze 4.3.0 nebo 5.1.0 (PHP 5.0.x obsahuje množství chyb).</p>
 <p>Nyní používáte PHP verze {$a}.</p>
 <p>Musíte PHP upgradovat, nebo přejít k hostiteli s vyšší verzí!<br />
-(U PHP 5.0.x můžete také přejít na nižší verzi 4.4.x či 4.3.x.)</p>';
+(U PHP 5.0.x můžete také přejít na nižší verzi 4.4.x )</p>';
 $string['welcomep10'] = '{$a->installername} ({$a->installerversion})';
 $string['welcomep20'] = 'Podařilo se vám úspěšně nainstalovat a spustit balíček <strong>{$a->packname} {$a->packversion}</strong>. Gratulujeme!';
 $string['welcomep30'] = '<strong>{$a->installername}</strong> obsahuje aplikace k vytvoření prostředí, ve kterém bude provozován váš <strong>Moodle</strong>. Jmenovitě se jedná o:';
index 102bae0..bccdf72 100644 (file)
@@ -31,6 +31,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['language'] = 'Jazyk';
+$string['moodlelogo'] = 'Moodle logo';
 $string['next'] = 'Další';
 $string['previous'] = 'Předchozí';
 $string['reload'] = 'Obnovit';
index b672e38..f483805 100644 (file)
@@ -31,6 +31,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['language'] = 'Hizkuntza';
+$string['moodlelogo'] = 'Moodle-ren logoa';
 $string['next'] = 'Hurrengoa';
 $string['previous'] = 'Aurrekoa';
 $string['reload'] = 'Berriz kargatu';
index 58e103c..e166cf8 100644 (file)
@@ -31,6 +31,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['language'] = 'Langue';
+$string['moodlelogo'] = 'Logo Moodle';
 $string['next'] = 'Suivant';
 $string['previous'] = 'Précédent';
 $string['reload'] = 'Actualiser';
index e3aa83c..57df885 100644 (file)
@@ -31,6 +31,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['language'] = 'Nyelv';
+$string['moodlelogo'] = 'Moodle-logó';
 $string['next'] = 'Következő';
 $string['previous'] = 'Előző';
 $string['reload'] = 'Újbóli betöltés';
index b831e82..afcef7b 100644 (file)
@@ -31,6 +31,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['language'] = 'Lingua';
+$string['moodlelogo'] = 'Logo Moodle';
 $string['next'] = 'Successivo';
 $string['previous'] = 'Precedente';
 $string['reload'] = 'Ricarica';
index e2ff7cc..38b0af5 100644 (file)
@@ -31,7 +31,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['admindirname'] = 'Administratoriaus katalogas';
-$string['availablelangs'] = 'Galimų kalbų sąrašas';
+$string['availablelangs'] = 'Galimi kalbų paketai';
 $string['chooselanguagehead'] = 'Pasirinkite kalbą';
 $string['chooselanguagesub'] = 'Pasirinkite diegimo kalbą. Ši kalba bus naudojama ir kaip numatytoji svetainės kalba, nors vėliau ją bus galima pakeisti.';
 $string['clialreadyconfigured'] = 'Failas config.php jau yra, prašau naudoti admin/cli/install_database.php jei norite įrašyti šią svetainę.';
index 880f416..599fe50 100644 (file)
@@ -31,6 +31,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['language'] = 'Språk';
+$string['moodlelogo'] = 'Moodlelogo';
 $string['next'] = 'Neste';
 $string['previous'] = 'Forrige';
 $string['reload'] = 'Last på nytt';
index fdba76d..e20932d 100644 (file)
@@ -31,6 +31,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['language'] = 'Język';
+$string['moodlelogo'] = 'Logo Moodle';
 $string['next'] = 'Dalej';
 $string['previous'] = 'Poprzedni';
 $string['reload'] = 'Odśwież';
index 8d1758c..6d15446 100644 (file)
@@ -42,3 +42,4 @@ Vă rugăm folosiţi --opţiunea Ajutor.';
 $string['cliyesnoprompt'] = 'introduceţi d (pentru \'da\') sau \'n\' (pentru \'nu\')';
 $string['environmentrequireinstall'] = 'trebuie instalat şi activat';
 $string['environmentrequireversion'] = 'versiuna necesară este {$a->needed} în timp ce dumneavoastră rulaţi versiunea {$a->current}';
+$string['upgradekeyset'] = 'Actualizează cheie  (lăsați gol pentru a nu fi setat)';
index d212e87..8f9c4a3 100644 (file)
@@ -42,3 +42,4 @@ $string['cliunknowoption'] = '未识别的选项:
 $string['cliyesnoprompt'] = '输入y(表示是)或n(表示否)';
 $string['environmentrequireinstall'] = '必须安装并启用';
 $string['environmentrequireversion'] = '需要 {$a->needed} 版本,而您的是 {$a->current}';
+$string['upgradekeyset'] = '升级密码(若不要设定请保持空白)';
index 259fc48..10a3c0e 100644 (file)
@@ -31,6 +31,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['language'] = '语言';
+$string['moodlelogo'] = 'Moodle图标';
 $string['next'] = '向后';
 $string['previous'] = '向前';
 $string['reload'] = '重新载入';
index e8bc0f5..8b35289 100644 (file)
@@ -31,6 +31,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['language'] = '語言';
+$string['moodlelogo'] = 'Moodle 商標';
 $string['next'] = '往後';
 $string['previous'] = '向前';
 $string['reload'] = '重新載入';
index 390320b..1ecd467 100644 (file)
@@ -911,9 +911,9 @@ $string['requiredentrieschanged'] = '<strong>IMPORTANT - PLEASE READ<br/>(This w
 $string['requiremodintro'] = 'Require activity description';
 $string['requiremodintro_desc'] = 'If enabled, users will be forced to enter a description for each activity.';
 $string['requires'] = 'Requires';
-$string['purgecaches']= 'Purge all caches';
-$string['purgecachesconfirm']= 'Moodle can cache themes, javascript, language strings, filtered text, rss feeds and many other pieces of calculated data.  Purging these caches will delete that data from the server and force browsers to refetch data, so that you can be sure you are seeing the most up-to-date values produced by the current code.  There is no danger in purging caches, but your site may appear slower for a while until the server and clients calculate new information and cache it.';
-$string['purgecachesfinished']= 'All caches were purged.';
+$string['purgecaches'] = 'Purge all caches';
+$string['purgecachesconfirm'] = 'Moodle can cache themes, javascript, language strings, filtered text, rss feeds and many other pieces of calculated data.  Purging these caches will delete that data from the server and force browsers to refetch data, so that you can be sure you are seeing the most up-to-date values produced by the current code.  There is no danger in purging caches, but your site may appear slower for a while until the server and clients calculate new information and cache it.';
+$string['purgecachesfinished'] = 'All caches were purged.';
 $string['requestcategoryselection'] = 'Enable category selection';
 $string['restorecourse'] = 'Restore course';
 $string['restorernewroleid'] = 'Restorers\' role in courses';
index a37b84a..c71832b 100644 (file)
@@ -41,7 +41,7 @@ $string['blogaboutthis'] = 'Blog about this {$a->type}';
 $string['blogaboutthiscourse'] = 'Add an entry about this course';
 $string['blogaboutthismodule'] = 'Add an entry about this {$a}';
 $string['blogadministration'] = 'Blog administration';
-$string['blogdeleteconfirm'] = 'Delete this blog entry?';
+$string['blogdeleteconfirm'] = 'Delete the blog entry \'{$a}\'?';
 $string['blogdisable'] = 'Blogging is disabled!';
 $string['blogentries'] = 'Blog entries';
 $string['blogentriesabout'] = 'Blog entries about {$a}';
index 257bb4d..a44742e 100644 (file)
@@ -89,7 +89,7 @@ $string['editsharing'] = 'Edit sharing';
 $string['editstore'] = 'Edit store';
 $string['editstoresuccess'] = 'Succesfully edited the cache store.';
 $string['editdefinitionmappings'] = '{$a} definition store mappings';
-$string['editdefinitionsharing'] =  'Edit definition sharing for {$a}';
+$string['editdefinitionsharing'] = 'Edit definition sharing for {$a}';
 $string['ex_configcannotsave'] = 'Unable to save the cache config to file.';
 $string['ex_nodefaultlock'] = 'Unable to find a default lock instance.';
 $string['ex_unabletolock'] = 'Unable to acquire a lock for caching.';
index d35a18d..08037a1 100644 (file)
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
-$string['field101']='Natural and Physical Science';
-$string['field10101']='Mathematical Sciences';
-$string['field1010101']='Mathematics';
-$string['field1010103']='Statistics';
-$string['field1010199']='Mathematical Sciences (Other)';
-$string['field10103']='Physics and Astronomy';
-$string['field1010301']='Physics';
-$string['field1010303']='Astronomy';
-$string['field10105']='Chemical Sciences';
-$string['field1010501']='Organic Chemistry';
-$string['field1010503']='Inorganic Chemistry';
-$string['field1010599']='Chemical Sciences (Other)';
-$string['field10107']='Earth Sciences';
-$string['field1010701']='Atmospheric Sciences';
-$string['field1010703']='Geology';
-$string['field1010705']='Geophysics';
-$string['field1010707']='Geochemistry';
-$string['field1010709']='Soil Science';
-$string['field1010711']='Hydrology';
-$string['field1010713']='Oceanography';
-$string['field1010799']='Earth Sciences (Other)';
-$string['field10109']='Biological Sciences';
-$string['field1010901']='Biochemistry and Cell Biology';
-$string['field1010903']='Botany';
-$string['field1010905']='Ecology and Evolution';
-$string['field1010907']='Marine Science';
-$string['field1010909']='Genetics';
-$string['field1010911']='Microbiology';
-$string['field1010913']='Human Biology';
-$string['field1010915']='Zoology';
-$string['field1010999']='Biological Sciences (Other)';
-$string['field10199']='Other Natural and Physical Sciences';
-$string['field1019901']='Medical Science';
-$string['field1019903']='Forensic Science';
-$string['field1019905']='Food Science and Biotechnology';
-$string['field1019907']='Pharmacology';
-$string['field1019909']='Laboratory Technology';
-$string['field1019999']='Natural and Physical Sciences (Other)';
-$string['field102']='Information Technology';
-$string['field10201']='Computer Science';
-$string['field1020101']='Formal Language Theory';
-$string['field1020103']='Programming';
-$string['field1020105']='Computational Theory';
-$string['field1020107']='Compiler Construction';
-$string['field1020109']='Algorithms';
-$string['field1020111']='Data Structures';
-$string['field1020113']='Networks and Communications';
-$string['field1020115']='Computer Graphics';
-$string['field1020117']='Operating Systems';
-$string['field1020119']='Artificial Intelligence';
-$string['field1020199']='Computer Science (Other)';
-$string['field10203']='Information Systems';
-$string['field1020301']='Conceptual Modelling';
-$string['field1020303']='Database Management';
-$string['field1020305']='Systems Analysis and Design';
-$string['field1020307']='Decision Support Systems';
-$string['field1020399']='Information Systems (Other)';
-$string['field10299']='Other Information Technology';
-$string['field1029901']='Security Science';
-$string['field1029999']='Information Technology (Other)';
-$string['field103']='Engineering and Related Technologies';
-$string['field10301']='Manufacturing Engineering and Technology';
-$string['field1030101']='Manufacturing Engineering';
-$string['field1030103']='Printing';
-$string['field1030105']='Textile Making';
-$string['field1030107']='Garment Making';
-$string['field1030109']='Footwear Making';
-$string['field1030111']='Wood Machining and Turning';
-$string['field1030113']='Cabinet Making';
-$string['field1030115']='Furniture Upholstery and Renovation';
-$string['field1030117']='Furniture Polishing';
-$string['field1030199']='Manufacturing Engineering and Technology (Other)';
-$string['field10303']='Process and Resources Engineering';
-$string['field1030301']='Chemical Engineering';
-$string['field1030303']='Mining Engineering';
-$string['field1030305']='Materials Engineering';
-$string['field1030307']='Food Processing Technology';
-$string['field1030399']='Process and Resources Engineering (Other)';
-$string['field10305']='Automotive Engineering and Technology';
-$string['field1030501']='Automotive Engineering';
-$string['field1030503']='Vehicle Mechanics';
-$string['field1030505']='Automotive Electrics and Electronics';
-$string['field1030507']='Automotive Vehicle Refinishing';
-$string['field1030509']='Automotive Body Construction';
-$string['field1030511']='Panel Beating';
-$string['field1030513']='Upholstery and Vehicle Trimming';
-$string['field1030515']='Automotive Vehicle Operations';
-$string['field1030599']='Automotive Engineering and Technology (Other)';
-$string['field10307']='Mechanical and Industrial Engineering and Technology';
-$string['field1030701']='Mechanical Engineering';
-$string['field1030703']='Industrial Engineering';
-$string['field1030705']='Toolmaking';
-$string['field1030707']='Metal Fitting, Turning and Machining';
-$string['field1030709']='Sheetmetal Working';
-$string['field1030711']='Boilermaking and Welding';
-$string['field1030713']='Metal Casting and Patternmaking';
-$string['field1030715']='Precision Metalworking';
-$string['field1030717']='Plant and Machine Operations';
-$string['field1030799']='Mechanical and Industrial Engineering and Technology (Other)';
-$string['field10309']='Civil Engineering';
-$string['field1030901']='Construction Engineering';
-$string['field1030903']='Structural Engineering';
-$string['field1030905']='Building Services Engineering';
-$string['field1030907']='Water and Sanitary Engineering';
-$string['field1030909']='Transport Engineering';
-$string['field1030911']='Geotechnical Engineering';
-$string['field1030913']='Ocean Engineering';
-$string['field1030999']='Civil Engineering (Other)';
-$string['field10311']='Geomatic Engineering';
-$string['field1031101']='Surveying';
-$string['field1031103']='Mapping Science';
-$string['field1031199']='Geomatic Engineering (Other)';
-$string['field10313']='Electrical and Electronic Engineering and Technology';
-$string['field1031301']='Electrical Engineering';
-$string['field1031303']='Electronic Engineering';
-$string['field1031305']='Computer Engineering';
-$string['field1031307']='Communications Technologies';
-$string['field1031309']='Communications Equipment Installation and Maintenance';
-$string['field1031311']='Powerline Installation and Maintenance';
-$string['field1031313']='Electrical Fitting, Electrical Mechanics';
-$string['field1031315']='Refrigeration and Air Conditioning Mechanics';
-$string['field1031317']='Electronic Equipment Servicing';
-$string['field1031399']='Electrical and Electronic Engineering and Technology (Other)';
-$string['field10315']='Aerospace Engineering and Technology';
-$string['field1031501']='Aerospace Engineering';
-$string['field1031503']='Aircraft Maintenance Engineering';
-$string['field1031505']='Aircraft Operation';
-$string['field1031507']='Air Traffic Control';
-$string['field1031599']='Aerospace Engineering and Technology (Other)';
-$string['field10317']='Maritime Engineering and Technology';
-$string['field1031701']='Maritime Engineering';
-$string['field1031703']='Marine Construction';
-$string['field1031705']='Marine Craft Operation';
-$string['field1031799']='Maritime Engineering and Technology (Other)';
-$string['field10399']='Other Engineering and Related Technologies';
-$string['field1039901']='Environmental Engineering';
-$string['field1039903']='Biomedical Engineering';
-$string['field1039905']='Fire Technology';
-$string['field1039907']='Rail Operations';
-$string['field1039909']='Cleaning';
-$string['field1039999']='Engineering and Related Technologies (Other)';
-$string['field104']='Architecture and Building';
-$string['field10401']='Architecture and Urban Environment';
-$string['field1040101']='Architecture';
-$string['field1040103']='Urban Design and Regional Planning';
-$string['field1040105']='Landscape Architecture';
-$string['field1040107']='Interior and Environmental Design';
-$string['field1040199']='Architecture and Urban Environment (Other)';
-$string['field10403']='Building';
-$string['field1040301']='Building Science and Technology';
-$string['field1040303']='Building Construction Management';
-$string['field1040305']='Building Surveying';
-$string['field1040307']='Building Construction Economics';
-$string['field1040309']='Bricklaying and Stonemasonry';
-$string['field1040311']='Carpentry and Joinery';
-$string['field1040313']='Ceiling, Wall and Floor Fixing';
-$string['field1040315']='Roof Fixing';
-$string['field1040317']='Plastering';
-$string['field1040319']='Furnishing Installation';
-$string['field1040321']='Floor Coverings';
-$string['field1040323']='Glazing';
-$string['field1040325']='Painting, Decorating and Sign Writing';
-$string['field1040327']='Plumbing';
-$string['field1040329']='Scaffolding and Rigging';
-$string['field1040399']='Building (Other)';
-$string['field105']='Agriculture, Environmental and Related Studies';
-$string['field10501']='Agriculture';
-$string['field1050101']='Agricultural Science';
-$string['field1050103']='Wool Science';
-$string['field1050105']='Animal Husbandry';
-$string['field1050199']='Agriculture (Other)';
-$string['field10503']='Horticulture and Viticulture';
-$string['field1050301']='Horticulture';
-$string['field1050303']='Viticulture';
-$string['field10505']='Forestry Studies';
-$string['field1050501']='Forestry Studies';
-$string['field10507']='Fisheries Studies';
-$string['field1050701']='Aquaculture';
-$string['field1050799']='Fisheries Studies (Other)';
-$string['field10509']='Environmental Studies';
-$string['field1050901']='Land, Parks and Wildlife Management';
-$string['field1050999']='Environmental Studies (Other)';
-$string['field10599']='Other Agriculture, Environmental and Related Studies';
-$string['field1059901']='Pest and Weed Control';
-$string['field1059999']='Agriculture, Environmental and Related Studies (Other)';
-$string['field106']='Health';
-$string['field10601']='Medical Studies';
-$string['field1060101']='General Medicine';
-$string['field1060103']='Surgery';
-$string['field1060105']='Psychiatry';
-$string['field1060107']='Obstetrics and Gynaecology';
-$string['field1060109']='Paediatrics';
-$string['field1060111']='Anaesthesiology';
-$string['field1060113']='Pathology';
-$string['field1060115']='Radiology';
-$string['field1060117']='Internal Medicine';
-$string['field1060119']='General Practice';
-$string['field1060199']='Medical Studies (Other)';
-$string['field10603']='Nursing';
-$string['field1060301']='General Nursing';
-$string['field1060303']='Midwifery';
-$string['field1060305']='Mental Health Nursing';
-$string['field1060307']='Community Nursing';
-$string['field1060309']='Critical Care Nursing';
-$string['field1060311']='Aged Care Nursing';
-$string['field1060313']='Palliative Care Nursing';
-$string['field1060315']='Mothercraft Nursing and Family and Child Health Nursing';
-$string['field1060399']='Nursing (Other)';
-$string['field10605']='Pharmacy';
-$string['field1060501']='Pharmacy';
-$string['field10607']='Dental Studies';
-$string['field1060701']='Dentistry';
-$string['field1060703']='Dental Assisting';
-$string['field1060705']='Dental Technology';
-$string['field1060799']='Dental Studies (Other)';
-$string['field10609']='Optical Science';
-$string['field1060901']='Optometry';
-$string['field1060903']='Optical Technology';
-$string['field1060999']='Optical Science (Other)';
-$string['field10611']='Veterinary Studies';
-$string['field1061101']='Veterinary Science';
-$string['field1061103']='Veterinary Assisting';
-$string['field1061199']='Veterinary Studies (Other)';
-$string['field10613']='Public Health';
-$string['field1061301']='Occupational Health and Safety';
-$string['field1061303']='Environmental Health';
-$string['field1061305']='Indigenous Health';
-$string['field1061307']='Health Promotion';
-$string['field1061309']='Community Health';
-$string['field1061311']='Epidemiology';
-$string['field1061399']='Public Health (Other)';
-$string['field10615']='Radiography';
-$string['field1061501']='Radiography';
-$string['field10617']='Rehabilitation Therapies';
-$string['field1061701']='Physiotherapy';
-$string['field1061703']='Occupational Therapy';
-$string['field1061705']='Chiropractic and Osteopathy';
-$string['field1061707']='Speech Pathology';
-$string['field1061709']='Audiology';
-$string['field1061711']='Massage Therapy';
-$string['field1061713']='Podiatry';
-$string['field1061799']='Rehabilitation Therapies (Other)';
-$string['field10619']='Complementary Therapies';
-$string['field1061901']='Naturopathy';
-$string['field1061903']='Acupuncture';
-$string['field1061905']='Traditional Chinese Medicine';
-$string['field1061999']='Complementary Therapies (Other)';
-$string['field10699']='Other Health';
-$string['field1069901']='Nutrition and Dietetics';
-$string['field1069903']='Human Movement';
-$string['field1069905']='Paramedical Studies';
-$string['field1069907']='First Aid';
-$string['field1069999']='Health (Other)';
-$string['field107']='Education';
-$string['field10701']='Teacher Education';
-$string['field1070101']='Teacher Education: Early Childhood';
-$string['field1070103']='Teacher Education: Primary';
-$string['field1070105']='Teacher Education: Secondary';
-$string['field1070107']='Teacher-Librarianship';
-$string['field1070109']='Teacher Education: Vocational Education and Training';
-$string['field1070111']='Teacher Education: Higher Education';
-$string['field1070113']='Teacher Education: Special Education';
-$string['field1070115']='English As A Second Language Teaching';
-$string['field1070117']='Nursing Education Teacher Training';
-$string['field1070199']='Teacher Education (Other)';
-$string['field10703']='Curriculum and Education Studies';
-$string['field1070301']='Curriculum Studies';
-$string['field1070303']='Education Studies';
-$string['field10799']='Other Education';
-$string['field1079999']='Education (Other)';
-$string['field108']='Management and Commerce';
-$string['field10801']='Accounting';
-$string['field1080101']='Accounting';
-$string['field10803']='Business and Management';
-$string['field1080301']='Business Management';
-$string['field1080303']='Human Resource Management';
-$string['field1080305']='Personal Management Training';
-$string['field1080307']='Organisation Management';
-$string['field1080309']='Industrial Relations';
-$string['field1080311']='International Business';
-$string['field1080313']='Public and Health Care Administration';
-$string['field1080315']='Project Management';
-$string['field1080317']='Quality Management';
-$string['field1080319']='Hospitality Management';
-$string['field1080321']='Farm Management and Agribusiness';
-$string['field1080323']='Tourism Management';
-$string['field1080399']='Business and Management (Other)';
-$string['field10805']='Sales and Marketing';
-$string['field1080501']='Sales';
-$string['field1080503']='Real Estate';
-$string['field1080505']='Marketing';
-$string['field1080507']='Advertising';
-$string['field1080509']='Public Relations';
-$string['field1080599']='Sales and Marketing (Other)';
-$string['field10807']='Tourism';
-$string['field1080701']='Tourism';
-$string['field10809']='Office Studies';
-$string['field1080901']='Secretarial and Clerical Studies';
-$string['field1080903']='Keyboard Skills';
-$string['field1080905']='Practical Computing Skills';
-$string['field1080999']='Office Studies (Other)';
-$string['field10811']='Banking, Finance and Related Fields';
-$string['field1081101']='Banking and Finance';
-$string['field1081103']='Insurance and Actuarial Studies';
-$string['field1081105']='Investment and Securities';
-$string['field1081199']='Banking, Finance and Related Fields (Other)';
-$string['field10899']='Other Management and Commerce';
-$string['field1089901']='Purchasing, Warehousing and Distribution';
-$string['field1089903']='Valuation';
-$string['field1089999']='Management and Commerce (Other)';
-$string['field109']='Society and Culture';
-$string['field10901']='Political Science and Policy Studies';
-$string['field1090101']='Political Science';
-$string['field1090103']='Policy Studies';
-$string['field10903']='Studies In Human Society';
-$string['field1090301']='Sociology';
-$string['field1090303']='Anthropology';
-$string['field1090305']='History';
-$string['field1090307']='Archaeology';
-$string['field1090309']='Human Geography';
-$string['field1090311']='Indigenous Studies';
-$string['field1090313']='Gender Specific Studies';
-$string['field1090399']='Studies In Human Society (Other)';
-$string['field10905']='Human Welfare Studies and Services';
-$string['field1090501']='Social Work';
-$string['field1090503']='Children\'S Services';
-$string['field1090505']='Youth Work';
-$string['field1090507']='Care For The Aged';
-$string['field1090509']='Care For The Disabled';
-$string['field1090511']='Residential Client Care';
-$string['field1090513']='Counselling';
-$string['field1090515']='Welfare Studies';
-$string['field1090599']='Human Welfare Studies and Services (Other)';
-$string['field10907']='Behavioural Science';
-$string['field1090701']='Psychology';
-$string['field1090799']='Behavioural Science (Other)';
-$string['field10909']='Law';
-$string['field1090901']='Business and Commercial Law';
-$string['field1090903']='Constitutional Law';
-$string['field1090905']='Criminal Law';
-$string['field1090907']='Family Law';
-$string['field1090909']='International Law';
-$string['field1090911']='Taxation Law';
-$string['field1090913']='Legal Practice';
-$string['field1090999']='Law (Other)';
-$string['field10911']='Justice and Law Enforcement';
-$string['field1091101']='Justice Administration';
-$string['field1091103']='Legal Studies';
-$string['field1091105']='Police Studies';
-$string['field1091199']='Justice and Law Enforcement (Other)';
-$string['field10913']='Librarianship, Information Management and Curatorial Studies';
-$string['field1091301']='Librarianship and Information Management';
-$string['field1091303']='Curatorial Studies';
-$string['field10915']='Language and Literature';
-$string['field1091501']='English Language';
-$string['field1091503']='Northern European Languages';
-$string['field1091505']='Southern European Languages';
-$string['field1091507']='Eastern European Languages';
-$string['field1091509']='Southwest Asian and North African Languages';
-$string['field1091511']='Southern Asian Languages';
-$string['field1091513']='Southeast Asian Languages';
-$string['field1091515']='Eastern Asian Languages';
-$string['field1091517']='Australian Indigenous Languages';
-$string['field1091519']='Translating and Interpreting';
-$string['field1091521']='Linguistics';
-$string['field1091523']='Literature';
-$string['field1091599']='Language and Literature (Other)';
-$string['field10917']='Philosophy and Religious Studies';
-$string['field1091701']='Philosophy';
-$string['field1091703']='Religious Studies';
-$string['field10919']='Economics and Econometrics';
-$string['field1091901']='Economics';
-$string['field1091903']='Econometrics';
-$string['field10921']='Sport and Recreation';
-$string['field1092101']='Sport and Recreation Activities';
-$string['field1092103']='Sports Coaching, Officiating and Instruction';
-$string['field1092199']='Sport and Recreation (Other)';
-$string['field10999']='Other Society and Culture';
-$string['field1099901']='Family and Consumer Studies';
-$string['field1099903']='Criminology';
-$string['field1099905']='Security Services';
-$string['field1099999']='Society and Culture (Other)';
-$string['field110']='Creative Arts';
-$string['field11001']='Performing Arts';
-$string['field1100101']='Music';
-$string['field1100103']='Drama and Theatre Studies';
-$string['field1100105']='Dance';
-$string['field1100199']='Performing Arts (Other)';
-$string['field11003']='Visual Arts and Crafts';
-$string['field1100301']='Fine Arts';
-$string['field1100303']='Photography';
-$string['field1100305']='Crafts';
-$string['field1100307']='Jewellery Making';
-$string['field1100309']='Floristry';
-$string['field1100399']='Visual Arts and Crafts (Other)';
-$string['field11005']='Graphic and Design Studies';
-$string['field1100501']='Graphic Arts and Design Studies';
-$string['field1100503']='Textile Design';
-$string['field1100505']='Fashion Design';
-$string['field1100599']='Graphic and Design Studies (Other)';
-$string['field11007']='Communication and Media Studies';
-$string['field1100701']='Audio Visual Studies';
-$string['field1100703']='Journalism';
-$string['field1100705']='Written Communication';
-$string['field1100707']='Verbal Communication';
-$string['field1100799']='Communication and Media Studies (Other)';
-$string['field11099']='Other Creative Arts';
-$string['field1109999']='Creative Arts (Other)';
-$string['field111']='Food, Hospitality and Personal Services';
-$string['field11101']='Food and Hospitality';
-$string['field1110101']='Hospitality';
-$string['field1110103']='Food and Beverage Service';
-$string['field1110105']='Butchery';
-$string['field1110107']='Baking and Pastrymaking';
-$string['field1110109']='Cookery';
-$string['field1110111']='Food Hygiene';
-$string['field1110199']='Food and Hospitality (Other)';
-$string['field11103']='Personal Services';
-$string['field1110301']='Beauty Therapy';
-$string['field1110303']='Hairdressing';
-$string['field1110399']='Personal Services (Other)';
-$string['field112']='Mixed Field Programmes';
-$string['field11201']='General Education Programmes';
-$string['field1120101']='General Primary and Secondary Education Programmes';
-$string['field1120103']='Literacy and Numeracy Programmes';
-$string['field1120105']='Learning Skills Programmes';
-$string['field1120199']='General Education Programmes (Other)';
-$string['field11203']='Social Skills Programmes';
-$string['field1120301']='Social and Interpersonal Skills Programmes';
-$string['field1120303']='Survival Skills Programmes';
-$string['field1120305']='Parental Education Programmes';
-$string['field1120399']='Social Skills Programmes (Other)';
-$string['field11205']='Employment Skills Programmes';
-$string['field1120501']='Career Development Programmes';
-$string['field1120503']='Job Search Skills Programmes';
-$string['field1120505']='Work Practices Programmes';
-$string['field1120599']='Employment Skills Programmes (Other)';
-$string['field11299']='Other Mixed Field Programmes';
-$string['field1129999']='Mixed Field Programmes (Other)';
+$string['field101'] = 'Natural and Physical Science';
+$string['field10101'] = 'Mathematical Sciences';
+$string['field1010101'] = 'Mathematics';
+$string['field1010103'] = 'Statistics';
+$string['field1010199'] = 'Mathematical Sciences (Other)';
+$string['field10103'] = 'Physics and Astronomy';
+$string['field1010301'] = 'Physics';
+$string['field1010303'] = 'Astronomy';
+$string['field10105'] = 'Chemical Sciences';
+$string['field1010501'] = 'Organic Chemistry';
+$string['field1010503'] = 'Inorganic Chemistry';
+$string['field1010599'] = 'Chemical Sciences (Other)';
+$string['field10107'] = 'Earth Sciences';
+$string['field1010701'] = 'Atmospheric Sciences';
+$string['field1010703'] = 'Geology';
+$string['field1010705'] = 'Geophysics';
+$string['field1010707'] = 'Geochemistry';
+$string['field1010709'] = 'Soil Science';
+$string['field1010711'] = 'Hydrology';
+$string['field1010713'] = 'Oceanography';
+$string['field1010799'] = 'Earth Sciences (Other)';
+$string['field10109'] = 'Biological Sciences';
+$string['field1010901'] = 'Biochemistry and Cell Biology';
+$string['field1010903'] = 'Botany';
+$string['field1010905'] = 'Ecology and Evolution';
+$string['field1010907'] = 'Marine Science';
+$string['field1010909'] = 'Genetics';
+$string['field1010911'] = 'Microbiology';
+$string['field1010913'] = 'Human Biology';
+$string['field1010915'] = 'Zoology';
+$string['field1010999'] = 'Biological Sciences (Other)';
+$string['field10199'] = 'Other Natural and Physical Sciences';
+$string['field1019901'] = 'Medical Science';
+$string['field1019903'] = 'Forensic Science';
+$string['field1019905'] = 'Food Science and Biotechnology';
+$string['field1019907'] = 'Pharmacology';
+$string['field1019909'] = 'Laboratory Technology';
+$string['field1019999'] = 'Natural and Physical Sciences (Other)';
+$string['field102'] = 'Information Technology';
+$string['field10201'] = 'Computer Science';
+$string['field1020101'] = 'Formal Language Theory';
+$string['field1020103'] = 'Programming';
+$string['field1020105'] = 'Computational Theory';
+$string['field1020107'] = 'Compiler Construction';
+$string['field1020109'] = 'Algorithms';
+$string['field1020111'] = 'Data Structures';
+$string['field1020113'] = 'Networks and Communications';
+$string['field1020115'] = 'Computer Graphics';
+$string['field1020117'] = 'Operating Systems';
+$string['field1020119'] = 'Artificial Intelligence';
+$string['field1020199'] = 'Computer Science (Other)';
+$string['field10203'] = 'Information Systems';
+$string['field1020301'] = 'Conceptual Modelling';
+$string['field1020303'] = 'Database Management';
+$string['field1020305'] = 'Systems Analysis and Design';
+$string['field1020307'] = 'Decision Support Systems';
+$string['field1020399'] = 'Information Systems (Other)';
+$string['field10299'] = 'Other Information Technology';
+$string['field1029901'] = 'Security Science';
+$string['field1029999'] = 'Information Technology (Other)';
+$string['field103'] = 'Engineering and Related Technologies';
+$string['field10301'] = 'Manufacturing Engineering and Technology';
+$string['field1030101'] = 'Manufacturing Engineering';
+$string['field1030103'] = 'Printing';
+$string['field1030105'] = 'Textile Making';
+$string['field1030107'] = 'Garment Making';
+$string['field1030109'] = 'Footwear Making';
+$string['field1030111'] = 'Wood Machining and Turning';
+$string['field1030113'] = 'Cabinet Making';
+$string['field1030115'] = 'Furniture Upholstery and Renovation';
+$string['field1030117'] = 'Furniture Polishing';
+$string['field1030199'] = 'Manufacturing Engineering and Technology (Other)';
+$string['field10303'] = 'Process and Resources Engineering';
+$string['field1030301'] = 'Chemical Engineering';
+$string['field1030303'] = 'Mining Engineering';
+$string['field1030305'] = 'Materials Engineering';
+$string['field1030307'] = 'Food Processing Technology';
+$string['field1030399'] = 'Process and Resources Engineering (Other)';
+$string['field10305'] = 'Automotive Engineering and Technology';
+$string['field1030501'] = 'Automotive Engineering';
+$string['field1030503'] = 'Vehicle Mechanics';
+$string['field1030505'] = 'Automotive Electrics and Electronics';
+$string['field1030507'] = 'Automotive Vehicle Refinishing';
+$string['field1030509'] = 'Automotive Body Construction';
+$string['field1030511'] = 'Panel Beating';
+$string['field1030513'] = 'Upholstery and Vehicle Trimming';
+$string['field1030515'] = 'Automotive Vehicle Operations';
+$string['field1030599'] = 'Automotive Engineering and Technology (Other)';
+$string['field10307'] = 'Mechanical and Industrial Engineering and Technology';
+$string['field1030701'] = 'Mechanical Engineering';
+$string['field1030703'] = 'Industrial Engineering';
+$string['field1030705'] = 'Toolmaking';
+$string['field1030707'] = 'Metal Fitting, Turning and Machining';
+$string['field1030709'] = 'Sheetmetal Working';
+$string['field1030711'] = 'Boilermaking and Welding';
+$string['field1030713'] = 'Metal Casting and Patternmaking';
+$string['field1030715'] = 'Precision Metalworking';
+$string['field1030717'] = 'Plant and Machine Operations';
+$string['field1030799'] = 'Mechanical and Industrial Engineering and Technology (Other)';
+$string['field10309'] = 'Civil Engineering';
+$string['field1030901'] = 'Construction Engineering';
+$string['field1030903'] = 'Structural Engineering';
+$string['field1030905'] = 'Building Services Engineering';
+$string['field1030907'] = 'Water and Sanitary Engineering';
+$string['field1030909'] = 'Transport Engineering';
+$string['field1030911'] = 'Geotechnical Engineering';
+$string['field1030913'] = 'Ocean Engineering';
+$string['field1030999'] = 'Civil Engineering (Other)';
+$string['field10311'] = 'Geomatic Engineering';
+$string['field1031101'] = 'Surveying';
+$string['field1031103'] = 'Mapping Science';
+$string['field1031199'] = 'Geomatic Engineering (Other)';
+$string['field10313'] = 'Electrical and Electronic Engineering and Technology';
+$string['field1031301'] = 'Electrical Engineering';
+$string['field1031303'] = 'Electronic Engineering';
+$string['field1031305'] = 'Computer Engineering';
+$string['field1031307'] = 'Communications Technologies';
+$string['field1031309'] = 'Communications Equipment Installation and Maintenance';
+$string['field1031311'] = 'Powerline Installation and Maintenance';
+$string['field1031313'] = 'Electrical Fitting, Electrical Mechanics';
+$string['field1031315'] = 'Refrigeration and Air Conditioning Mechanics';
+$string['field1031317'] = 'Electronic Equipment Servicing';
+$string['field1031399'] = 'Electrical and Electronic Engineering and Technology (Other)';
+$string['field10315'] = 'Aerospace Engineering and Technology';
+$string['field1031501'] = 'Aerospace Engineering';
+$string['field1031503'] = 'Aircraft Maintenance Engineering';
+$string['field1031505'] = 'Aircraft Operation';
+$string['field1031507'] = 'Air Traffic Control';
+$string['field1031599'] = 'Aerospace Engineering and Technology (Other)';
+$string['field10317'] = 'Maritime Engineering and Technology';
+$string['field1031701'] = 'Maritime Engineering';
+$string['field1031703'] = 'Marine Construction';
+$string['field1031705'] = 'Marine Craft Operation';
+$string['field1031799'] = 'Maritime Engineering and Technology (Other)';
+$string['field10399'] = 'Other Engineering and Related Technologies';
+$string['field1039901'] = 'Environmental Engineering';
+$string['field1039903'] = 'Biomedical Engineering';
+$string['field1039905'] = 'Fire Technology';
+$string['field1039907'] = 'Rail Operations';
+$string['field1039909'] = 'Cleaning';
+$string['field1039999'] = 'Engineering and Related Technologies (Other)';
+$string['field104'] = 'Architecture and Building';
+$string['field10401'] = 'Architecture and Urban Environment';
+$string['field1040101'] = 'Architecture';
+$string['field1040103'] = 'Urban Design and Regional Planning';
+$string['field1040105'] = 'Landscape Architecture';
+$string['field1040107'] = 'Interior and Environmental Design';
+$string['field1040199'] = 'Architecture and Urban Environment (Other)';
+$string['field10403'] = 'Building';
+$string['field1040301'] = 'Building Science and Technology';
+$string['field1040303'] = 'Building Construction Management';
+$string['field1040305'] = 'Building Surveying';
+$string['field1040307'] = 'Building Construction Economics';
+$string['field1040309'] = 'Bricklaying and Stonemasonry';
+$string['field1040311'] = 'Carpentry and Joinery';
+$string['field1040313'] = 'Ceiling, Wall and Floor Fixing';
+$string['field1040315'] = 'Roof Fixing';
+$string['field1040317'] = 'Plastering';
+$string['field1040319'] = 'Furnishing Installation';
+$string['field1040321'] = 'Floor Coverings';
+$string['field1040323'] = 'Glazing';
+$string['field1040325'] = 'Painting, Decorating and Sign Writing';
+$string['field1040327'] = 'Plumbing';
+$string['field1040329'] = 'Scaffolding and Rigging';
+$string['field1040399'] = 'Building (Other)';
+$string['field105'] = 'Agriculture, Environmental and Related Studies';
+$string['field10501'] = 'Agriculture';
+$string['field1050101'] = 'Agricultural Science';
+$string['field1050103'] = 'Wool Science';
+$string['field1050105'] = 'Animal Husbandry';
+$string['field1050199'] = 'Agriculture (Other)';
+$string['field10503'] = 'Horticulture and Viticulture';
+$string['field1050301'] = 'Horticulture';
+$string['field1050303'] = 'Viticulture';
+$string['field10505'] = 'Forestry Studies';
+$string['field1050501'] = 'Forestry Studies';
+$string['field10507'] = 'Fisheries Studies';
+$string['field1050701'] = 'Aquaculture';
+$string['field1050799'] = 'Fisheries Studies (Other)';
+$string['field10509'] = 'Environmental Studies';
+$string['field1050901'] = 'Land, Parks and Wildlife Management';
+$string['field1050999'] = 'Environmental Studies (Other)';
+$string['field10599'] = 'Other Agriculture, Environmental and Related Studies';
+$string['field1059901'] = 'Pest and Weed Control';
+$string['field1059999'] = 'Agriculture, Environmental and Related Studies (Other)';
+$string['field106'] = 'Health';
+$string['field10601'] = 'Medical Studies';
+$string['field1060101'] = 'General Medicine';
+$string['field1060103'] = 'Surgery';
+$string['field1060105'] = 'Psychiatry';
+$string['field1060107'] = 'Obstetrics and Gynaecology';
+$string['field1060109'] = 'Paediatrics';
+$string['field1060111'] = 'Anaesthesiology';
+$string['field1060113'] = 'Pathology';
+$string['field1060115'] = 'Radiology';
+$string['field1060117'] = 'Internal Medicine';
+$string['field1060119'] = 'General Practice';
+$string['field1060199'] = 'Medical Studies (Other)';
+$string['field10603'] = 'Nursing';
+$string['field1060301'] = 'General Nursing';
+$string['field1060303'] = 'Midwifery';
+$string['field1060305'] = 'Mental Health Nursing';
+$string['field1060307'] = 'Community Nursing';
+$string['field1060309'] = 'Critical Care Nursing';
+$string['field1060311'] = 'Aged Care Nursing';
+$string['field1060313'] = 'Palliative Care Nursing';
+$string['field1060315'] = 'Mothercraft Nursing and Family and Child Health Nursing';
+$string['field1060399'] = 'Nursing (Other)';
+$string['field10605'] = 'Pharmacy';
+$string['field1060501'] = 'Pharmacy';
+$string['field10607'] = 'Dental Studies';
+$string['field1060701'] = 'Dentistry';
+$string['field1060703'] = 'Dental Assisting';
+$string['field1060705'] = 'Dental Technology';
+$string['field1060799'] = 'Dental Studies (Other)';
+$string['field10609'] = 'Optical Science';
+$string['field1060901'] = 'Optometry';
+$string['field1060903'] = 'Optical Technology';
+$string['field1060999'] = 'Optical Science (Other)';
+$string['field10611'] = 'Veterinary Studies';
+$string['field1061101'] = 'Veterinary Science';
+$string['field1061103'] = 'Veterinary Assisting';
+$string['field1061199'] = 'Veterinary Studies (Other)';
+$string['field10613'] = 'Public Health';
+$string['field1061301'] = 'Occupational Health and Safety';
+$string['field1061303'] = 'Environmental Health';
+$string['field1061305'] = 'Indigenous Health';
+$string['field1061307'] = 'Health Promotion';
+$string['field1061309'] = 'Community Health';
+$string['field1061311'] = 'Epidemiology';
+$string['field1061399'] = 'Public Health (Other)';
+$string['field10615'] = 'Radiography';
+$string['field1061501'] = 'Radiography';
+$string['field10617'] = 'Rehabilitation Therapies';
+$string['field1061701'] = 'Physiotherapy';
+$string['field1061703'] = 'Occupational Therapy';
+$string['field1061705'] = 'Chiropractic and Osteopathy';
+$string['field1061707'] = 'Speech Pathology';
+$string['field1061709'] = 'Audiology';
+$string['field1061711'] = 'Massage Therapy';
+$string['field1061713'] = 'Podiatry';
+$string['field1061799'] = 'Rehabilitation Therapies (Other)';
+$string['field10619'] = 'Complementary Therapies';
+$string['field1061901'] = 'Naturopathy';
+$string['field1061903'] = 'Acupuncture';
+$string['field1061905'] = 'Traditional Chinese Medicine';
+$string['field1061999'] = 'Complementary Therapies (Other)';
+$string['field10699'] = 'Other Health';
+$string['field1069901'] = 'Nutrition and Dietetics';
+$string['field1069903'] = 'Human Movement';
+$string['field1069905'] = 'Paramedical Studies';
+$string['field1069907'] = 'First Aid';
+$string['field1069999'] = 'Health (Other)';
+$string['field107'] = 'Education';
+$string['field10701'] = 'Teacher Education';
+$string['field1070101'] = 'Teacher Education: Early Childhood';
+$string['field1070103'] = 'Teacher Education: Primary';
+$string['field1070105'] = 'Teacher Education: Secondary';
+$string['field1070107'] = 'Teacher-Librarianship';
+$string['field1070109'] = 'Teacher Education: Vocational Education and Training';
+$string['field1070111'] = 'Teacher Education: Higher Education';
+$string['field1070113'] = 'Teacher Education: Special Education';
+$string['field1070115'] = 'English As A Second Language Teaching';
+$string['field1070117'] = 'Nursing Education Teacher Training';
+$string['field1070199'] = 'Teacher Education (Other)';
+$string['field10703'] = 'Curriculum and Education Studies';
+$string['field1070301'] = 'Curriculum Studies';
+$string['field1070303'] = 'Education Studies';
+$string['field10799'] = 'Other Education';
+$string['field1079999'] = 'Education (Other)';
+$string['field108'] = 'Management and Commerce';
+$string['field10801'] = 'Accounting';
+$string['field1080101'] = 'Accounting';
+$string['field10803'] = 'Business and Management';
+$string['field1080301'] = 'Business Management';
+$string['field1080303'] = 'Human Resource Management';
+$string['field1080305'] = 'Personal Management Training';
+$string['field1080307'] = 'Organisation Management';
+$string['field1080309'] = 'Industrial Relations';
+$string['field1080311'] = 'International Business';
+$string['field1080313'] = 'Public and Health Care Administration';
+$string['field1080315'] = 'Project Management';
+$string['field1080317'] = 'Quality Management';
+$string['field1080319'] = 'Hospitality Management';
+$string['field1080321'] = 'Farm Management and Agribusiness';
+$string['field1080323'] = 'Tourism Management';
+$string['field1080399'] = 'Business and Management (Other)';
+$string['field10805'] = 'Sales and Marketing';
+$string['field1080501'] = 'Sales';
+$string['field1080503'] = 'Real Estate';
+$string['field1080505'] = 'Marketing';
+$string['field1080507'] = 'Advertising';
+$string['field1080509'] = 'Public Relations';
+$string['field1080599'] = 'Sales and Marketing (Other)';
+$string['field10807'] = 'Tourism';
+$string['field1080701'] = 'Tourism';
+$string['field10809'] = 'Office Studies';
+$string['field1080901'] = 'Secretarial and Clerical Studies';
+$string['field1080903'] = 'Keyboard Skills';
+$string['field1080905'] = 'Practical Computing Skills';
+$string['field1080999'] = 'Office Studies (Other)';
+$string['field10811'] = 'Banking, Finance and Related Fields';
+$string['field1081101'] = 'Banking and Finance';
+$string['field1081103'] = 'Insurance and Actuarial Studies';
+$string['field1081105'] = 'Investment and Securities';
+$string['field1081199'] = 'Banking, Finance and Related Fields (Other)';
+$string['field10899'] = 'Other Management and Commerce';
+$string['field1089901'] = 'Purchasing, Warehousing and Distribution';
+$string['field1089903'] = 'Valuation';
+$string['field1089999'] = 'Management and Commerce (Other)';
+$string['field109'] = 'Society and Culture';
+$string['field10901'] = 'Political Science and Policy Studies';
+$string['field1090101'] = 'Political Science';
+$string['field1090103'] = 'Policy Studies';
+$string['field10903'] = 'Studies In Human Society';
+$string['field1090301'] = 'Sociology';
+$string['field1090303'] = 'Anthropology';
+$string['field1090305'] = 'History';
+$string['field1090307'] = 'Archaeology';
+$string['field1090309'] = 'Human Geography';
+$string['field1090311'] = 'Indigenous Studies';
+$string['field1090313'] = 'Gender Specific Studies';
+$string['field1090399'] = 'Studies In Human Society (Other)';
+$string['field10905'] = 'Human Welfare Studies and Services';
+$string['field1090501'] = 'Social Work';
+$string['field1090503'] = 'Children\'S Services';
+$string['field1090505'] = 'Youth Work';
+$string['field1090507'] = 'Care For The Aged';
+$string['field1090509'] = 'Care For The Disabled';
+$string['field1090511'] = 'Residential Client Care';
+$string['field1090513'] = 'Counselling';
+$string['field1090515'] = 'Welfare Studies';
+$string['field1090599'] = 'Human Welfare Studies and Services (Other)';
+$string['field10907'] = 'Behavioural Science';
+$string['field1090701'] = 'Psychology';
+$string['field1090799'] = 'Behavioural Science (Other)';
+$string['field10909'] = 'Law';
+$string['field1090901'] = 'Business and Commercial Law';
+$string['field1090903'] = 'Constitutional Law';
+$string['field1090905'] = 'Criminal Law';
+$string['field1090907'] = 'Family Law';
+$string['field1090909'] = 'International Law';
+$string['field1090911'] = 'Taxation Law';
+$string['field1090913'] = 'Legal Practice';
+$string['field1090999'] = 'Law (Other)';
+$string['field10911'] = 'Justice and Law Enforcement';
+$string['field1091101'] = 'Justice Administration';
+$string['field1091103'] = 'Legal Studies';
+$string['field1091105'] = 'Police Studies';
+$string['field1091199'] = 'Justice and Law Enforcement (Other)';
+$string['field10913'] = 'Librarianship, Information Management and Curatorial Studies';
+$string['field1091301'] = 'Librarianship and Information Management';
+$string['field1091303'] = 'Curatorial Studies';
+$string['field10915'] = 'Language and Literature';
+$string['field1091501'] = 'English Language';
+$string['field1091503'] = 'Northern European Languages';
+$string['field1091505'] = 'Southern European Languages';
+$string['field1091507'] = 'Eastern European Languages';
+$string['field1091509'] = 'Southwest Asian and North African Languages';
+$string['field1091511'] = 'Southern Asian Languages';
+$string['field1091513'] = 'Southeast Asian Languages';
+$string['field1091515'] = 'Eastern Asian Languages';
+$string['field1091517'] = 'Australian Indigenous Languages';
+$string['field1091519'] = 'Translating and Interpreting';
+$string['field1091521'] = 'Linguistics';
+$string['field1091523'] = 'Literature';
+$string['field1091599'] = 'Language and Literature (Other)';
+$string['field10917'] = 'Philosophy and Religious Studies';
+$string['field1091701'] = 'Philosophy';
+$string['field1091703'] = 'Religious Studies';
+$string['field10919'] = 'Economics and Econometrics';
+$string['field1091901'] = 'Economics';
+$string['field1091903'] = 'Econometrics';
+$string['field10921'] = 'Sport and Recreation';
+$string['field1092101'] = 'Sport and Recreation Activities';
+$string['field1092103'] = 'Sports Coaching, Officiating and Instruction';
+$string['field1092199'] = 'Sport and Recreation (Other)';
+$string['field10999'] = 'Other Society and Culture';
+$string['field1099901'] = 'Family and Consumer Studies';
+$string['field1099903'] = 'Criminology';
+$string['field1099905'] = 'Security Services';
+$string['field1099999'] = 'Society and Culture (Other)';
+$string['field110'] = 'Creative Arts';
+$string['field11001'] = 'Performing Arts';
+$string['field1100101'] = 'Music';
+$string['field1100103'] = 'Drama and Theatre Studies';
+$string['field1100105'] = 'Dance';
+$string['field1100199'] = 'Performing Arts (Other)';
+$string['field11003'] = 'Visual Arts and Crafts';
+$string['field1100301'] = 'Fine Arts';
+$string['field1100303'] = 'Photography';
+$string['field1100305'] = 'Crafts';
+$string['field1100307'] = 'Jewellery Making';
+$string['field1100309'] = 'Floristry';
+$string['field1100399'] = 'Visual Arts and Crafts (Other)';
+$string['field11005'] = 'Graphic and Design Studies';
+$string['field1100501'] = 'Graphic Arts and Design Studies';
+$string['field1100503'] = 'Textile Design';
+$string['field1100505'] = 'Fashion Design';
+$string['field1100599'] = 'Graphic and Design Studies (Other)';
+$string['field11007'] = 'Communication and Media Studies';
+$string['field1100701'] = 'Audio Visual Studies';
+$string['field1100703'] = 'Journalism';
+$string['field1100705'] = 'Written Communication';
+$string['field1100707'] = 'Verbal Communication';
+$string['field1100799'] = 'Communication and Media Studies (Other)';
+$string['field11099'] = 'Other Creative Arts';
+$string['field1109999'] = 'Creative Arts (Other)';
+$string['field111'] = 'Food, Hospitality and Personal Services';
+$string['field11101'] = 'Food and Hospitality';
+$string['field1110101'] = 'Hospitality';
+$string['field1110103'] = 'Food and Beverage Service';
+$string['field1110105'] = 'Butchery';
+$string['field1110107'] = 'Baking and Pastrymaking';
+$string['field1110109'] = 'Cookery';
+$string['field1110111'] = 'Food Hygiene';
+$string['field1110199'] = 'Food and Hospitality (Other)';
+$string['field11103'] = 'Personal Services';
+$string['field1110301'] = 'Beauty Therapy';
+$string['field1110303'] = 'Hairdressing';
+$string['field1110399'] = 'Personal Services (Other)';
+$string['field112'] = 'Mixed Field Programmes';
+$string['field11201'] = 'General Education Programmes';
+$string['field1120101'] = 'General Primary and Secondary Education Programmes';
+$string['field1120103'] = 'Literacy and Numeracy Programmes';
+$string['field1120105'] = 'Learning Skills Programmes';
+$string['field1120199'] = 'General Education Programmes (Other)';
+$string['field11203'] = 'Social Skills Programmes';
+$string['field1120301'] = 'Social and Interpersonal Skills Programmes';
+$string['field1120303'] = 'Survival Skills Programmes';
+$string['field1120305'] = 'Parental Education Programmes';
+$string['field1120399'] = 'Social Skills Programmes (Other)';
+$string['field11205'] = 'Employment Skills Programmes';
+$string['field1120501'] = 'Career Development Programmes';
+$string['field1120503'] = 'Job Search Skills Programmes';
+$string['field1120505'] = 'Work Practices Programmes';
+$string['field1120599'] = 'Employment Skills Programmes (Other)';
+$string['field11299'] = 'Other Mixed Field Programmes';
+$string['field1129999'] = 'Mixed Field Programmes (Other)';
index cfa4f89..6bbb927 100644 (file)
@@ -71,11 +71,11 @@ $string['aggregationcoefextra_help'] = 'If the aggregation is \'Natural\' or \'S
 
 If the aggregation is \'Mean of grades (with extra credits)\' and the extra credit is set to a value greater than zero, the extra credit is the factor by which the grade is multiplied before adding it to the total after the computation of the mean.';
 $string['aggregationcoefextra_link'] = 'grade/aggregation';
-$string['aggregationcoefextrasum'] = 'Extra credit'; // for the form with checkboxes: Natural or Simple weighted mean
+$string['aggregationcoefextrasum'] = 'Extra credit'; // For the form with checkboxes: Natural or Simple weighted mean.
 $string['aggregationcoefextrasumabbr'] = '+';
 $string['aggregationcoefextrasum_help'] = 'If the extra credit checkbox is ticked, the grade item\'s maximum grade is not added to the category\'s maximum grade, resulting in the possibility of achieving the maximum grade (or grades over the maximum if enabled by the site administrator) in the category without having the maximum grade in all the grade items.';
 $string['aggregationcoefextrasum_link'] = 'grade/aggregation';
-$string['aggregationcoefextraweight'] = 'Extra credit weight'; // for the form with input: Mean of grades (with extra credits) only
+$string['aggregationcoefextraweight'] = 'Extra credit weight'; // For the form with input: Mean of grades (with extra credits) only.
 $string['aggregationcoefextraweight_help'] = 'If the extra credit weight is set to a value greater than zero, the grade acts as extra credit during aggregation. The number is the factor by which the grade is multiplied before adding it to the total for the computation of the mean.';
 $string['aggregationcoefextraweight_link'] = 'grade/aggregation';
 $string['aggregationcoefweight'] = 'Item weight';
@@ -251,7 +251,7 @@ $string['gradeboundary_help'] = 'This setting determines the minimum percentage
 $string['gradecategories'] = 'Grade categories';
 $string['gradecategory'] = 'Grade category';
 $string['gradecategoryonmodform'] = 'Grade category';
-$string['gradecategoryonmodform_help'] =  'This setting controls the category in which this activity\'s grades are placed in the gradebook.';
+$string['gradecategoryonmodform_help'] = 'This setting controls the category in which this activity\'s grades are placed in the gradebook.';
 $string['gradecategorysettings'] = 'Grade category settings';
 $string['gradedisplay'] = 'Grade display';
 $string['gradedisplaytype'] = 'Grade display type';
index 3b5d5c8..76c1b81 100644 (file)
@@ -98,7 +98,7 @@ $string['errorcronnoxmlrpc'] = 'XML-RPC must be enabled in order to update the r
 $string['errorhublisting'] = 'An error occurred when retrieving the hub listing from Moodle. Please try again later. ({$a})';
 $string['errorlangnotrecognized'] = 'The provided language code is unknown by Moodle. Please contact {$a}';
 $string['errorregistration'] = 'An error occurred during registration, please try again later. ({$a})';
-$string['errorunpublishcourses']= 'Due to an unexpected error, the courses could not be deleted on the hub. Try again later (recommended) or contact the hub administrator.';
+$string['errorunpublishcourses'] = 'Due to an unexpected error, the courses could not be deleted on the hub. Try again later (recommended) or contact the hub administrator.';
 $string['existingscreenshotnumber'] = '{$a} existing screenshots. You will be able to see these screenshots on this page, only once the hub administrator enables your course.';
 $string['existingscreenshots'] = 'Existing screenshots';
 $string['forceunregister'] = 'Yes, clean registration data';
index 9b92f32..59d6080 100644 (file)
@@ -738,6 +738,7 @@ $string['eventcourseresetended'] = 'Course reset ended';
 $string['eventcourseresetstarted'] = 'Course reset started';
 $string['eventcourserestored'] = 'Course restored';
 $string['eventcourseupdated'] = 'Course updated';
+$string['eventcoursesectiondeleted'] = 'Course section deleted';
 $string['eventcoursesectionupdated'] = 'Course section updated';
 $string['eventcoursemoduleinstancelistviewed'] = 'Course module instance list viewed';
 $string['eventcourseuserreportviewed'] = 'Course user report viewed';
@@ -834,7 +835,7 @@ $string['frontpageformatloggedin'] = 'Front page format when logged in';
 $string['frontpagenews'] = 'News items';
 $string['frontpagesettings'] = 'Front page settings';
 $string['fulllistofcourses'] = 'All courses';
-$string['fullname'] = 'Full name'; // @deprecated - use fullnamecourse or fullnameuser or some own context specific string
+$string['fullname'] = 'Full name'; /* @deprecated - Use fullnamecourse or fullnameuser or some own context specific string. */
 $string['fullnamecourse'] = 'Course full name';
 $string['fullnamecourse_help'] = 'The full name of the course is displayed at the top of each page in the course and in the list of courses.';
 $string['fullnamedisplay'] = '{$a->firstname} {$a->lastname}';
@@ -1606,7 +1607,7 @@ $string['scalestandard_link'] = 'grade/scale';
 $string['scalestip'] = 'To create custom scales, use the \'Scales...\' link in your course administration menu.';
 $string['scalestip2'] = 'To create custom scales, click the Grades link in the course administration menu, then choose Edit, Scales.';
 $string['screenshot'] = 'Screenshot';
-$string['search'] = 'Search'; // TODO MDL-34652 rename to searchforums and move to mod_forum
+$string['search'] = 'Search'; // TODO MDL-34652 rename to searchforums and move to mod_forum.
 $string['search_help'] = 'For basic searching of one or more words anywhere in the text, just type them separated by spaces. All words longer than two characters are used.
 
 For advanced searching, press the search button without typing anything in the search box to access the advanced search form.';
@@ -1674,7 +1675,7 @@ $string['setcategorytheme'] = 'Set category theme';
 $string['setpassword'] = 'Set password';
 $string['setpasswordinstructions'] = 'Please enter and repeat your new password below, then click "Set password". <br />Your new password will be saved, and you will be logged in.';
 $string['settings'] = 'Settings';
-$string['shortname'] = 'Short name'; // @deprecated MDL-34652 - use shortnamecourse or shortnameuser or some own context specific string
+$string['shortname'] = 'Short name'; /* @deprecated MDL-34652 - Use shortnamecourse or shortnameuser or some own context specific string. */
 $string['shortnamecollisionwarning'] = '[*] = This shortname is already in use by a course and will need to be changed upon approval';
 $string['shortnamecourse'] = 'Course short name';
 $string['shortnamecourse_help'] = 'The short name of the course is displayed in the navigation and is used in the subject line of course email messages.';
index 213eaea..723b28d 100644 (file)
@@ -24,7 +24,7 @@
 
 $string['availableplugins'] = 'Available plugins';
 $string['configplagiarismplugins'] = 'Please choose the plagiarism plugin you would like to configure';
-$string['enableplagiarism'] ='Enable plagiarism plugins';
+$string['enableplagiarism'] = 'Enable plagiarism plugins';
 $string['configenableplagiarism'] = 'This will allow administrators to configure plagiarism plugins (if installed)';
 $string['manageplagiarism'] = 'Manage plagiarism plugins';
 $string['nopluginsinstalled'] = 'No plagiarism plugins are installed.';
index 845f099..60e4628 100644 (file)
@@ -32,7 +32,7 @@ $string['addplugin'] = 'Add a repository plugin';
 $string['allowexternallinks'] = 'Allow external links';
 $string['areamainfile'] = 'Main file';
 $string['coursebackup'] = 'Course backups';
-$string['pluginname'] = 'Repository plugin name'; // todo fix this, this string identifier is reserved
+$string['pluginname'] = 'Repository plugin name'; // Todo fix this, this string identifier is reserved.
 $string['pluginnamehelp'] = 'If you leave this empty the default name will be used.';
 $string['sectionbackup'] = 'Section backups';
 $string['activitybackup'] = 'Activity backup';
index 4b2ee09..f429e4c 100644 (file)
@@ -141,6 +141,7 @@ $string['course:managescales'] = 'Manage scales';
 $string['course:markcomplete'] = 'Mark users as complete in course completion';
 $string['course:movesections'] = 'Move sections';
 $string['course:publish'] = 'Publish a course into hub';
+$string['course:renameroles'] = 'Rename roles';
 $string['course:request'] = 'Request new courses';
 $string['course:reset'] = 'Reset course';
 $string['course:reviewotherusers'] = 'Review other users';
index 4475357..f50c23f 100644 (file)
@@ -6222,7 +6222,7 @@ class context_system extends context {
      * Returns system context instance.
      *
      * @static
-     * @param int $instanceid
+     * @param int $instanceid should be 0
      * @param int $strictness
      * @param bool $cache
      * @return context_system context instance
@@ -6474,19 +6474,19 @@ class context_user extends context {
      * Returns user context instance.
      *
      * @static
-     * @param int $instanceid
+     * @param int $userid id from {user} table
      * @param int $strictness
      * @return context_user context instance
      */
-    public static function instance($instanceid, $strictness = MUST_EXIST) {
+    public static function instance($userid, $strictness = MUST_EXIST) {
         global $DB;
 
-        if ($context = context::cache_get(CONTEXT_USER, $instanceid)) {
+        if ($context = context::cache_get(CONTEXT_USER, $userid)) {
             return $context;
         }
 
-        if (!$record = $DB->get_record('context', array('contextlevel'=>CONTEXT_USER, 'instanceid'=>$instanceid))) {
-            if ($user = $DB->get_record('user', array('id'=>$instanceid, 'deleted'=>0), 'id', $strictness)) {
+        if (!$record = $DB->get_record('context', array('contextlevel' => CONTEXT_USER, 'instanceid' => $userid))) {
+            if ($user = $DB->get_record('user', array('id' => $userid, 'deleted' => 0), 'id', $strictness)) {
                 $record = context::insert_context_record(CONTEXT_USER, $user->id, '/'.SYSCONTEXTID, 0);
             }
         }
@@ -6652,19 +6652,19 @@ class context_coursecat extends context {
      * Returns course category context instance.
      *
      * @static
-     * @param int $instanceid
+     * @param int $categoryid id from {course_categories} table
      * @param int $strictness
      * @return context_coursecat context instance
      */
-    public static function instance($instanceid, $strictness = MUST_EXIST) {
+    public static function instance($categoryid, $strictness = MUST_EXIST) {
         global $DB;
 
-        if ($context = context::cache_get(CONTEXT_COURSECAT, $instanceid)) {
+        if ($context = context::cache_get(CONTEXT_COURSECAT, $categoryid)) {
             return $context;
         }
 
-        if (!$record = $DB->get_record('context', array('contextlevel'=>CONTEXT_COURSECAT, 'instanceid'=>$instanceid))) {
-            if ($category = $DB->get_record('course_categories', array('id'=>$instanceid), 'id,parent', $strictness)) {
+        if (!$record = $DB->get_record('context', array('contextlevel' => CONTEXT_COURSECAT, 'instanceid' => $categoryid))) {
+            if ($category = $DB->get_record('course_categories', array('id' => $categoryid), 'id,parent', $strictness)) {
                 if ($category->parent) {
                     $parentcontext = context_coursecat::instance($category->parent);
                     $record = context::insert_context_record(CONTEXT_COURSECAT, $category->id, $parentcontext->path);
@@ -6906,19 +6906,19 @@ class context_course extends context {
      * Returns course context instance.
      *
      * @static
-     * @param int $instanceid
+     * @param int $courseid id from {course} table
      * @param int $strictness
      * @return context_course context instance
      */
-    public static function instance($instanceid, $strictness = MUST_EXIST) {
+    public static function instance($courseid, $strictness = MUST_EXIST) {
         global $DB;
 
-        if ($context = context::cache_get(CONTEXT_COURSE, $instanceid)) {
+        if ($context = context::cache_get(CONTEXT_COURSE, $courseid)) {
             return $context;
         }
 
-        if (!$record = $DB->get_record('context', array('contextlevel'=>CONTEXT_COURSE, 'instanceid'=>$instanceid))) {
-            if ($course = $DB->get_record('course', array('id'=>$instanceid), 'id,category', $strictness)) {
+        if (!$record = $DB->get_record('context', array('contextlevel' => CONTEXT_COURSE, 'instanceid' => $courseid))) {
+            if ($course = $DB->get_record('course', array('id' => $courseid), 'id,category', $strictness)) {
                 if ($course->category) {
                     $parentcontext = context_coursecat::instance($course->category);
                     $record = context::insert_context_record(CONTEXT_COURSE, $course->id, $parentcontext->path);
@@ -7167,19 +7167,19 @@ class context_module extends context {
      * Returns module context instance.
      *
      * @static
-     * @param int $instanceid
+     * @param int $cmid id of the record from {course_modules} table; pass cmid there, NOT id in the instance column
      * @param int $strictness
      * @return context_module context instance
      */
-    public static function instance($instanceid, $strictness = MUST_EXIST) {
+    public static function instance($cmid, $strictness = MUST_EXIST) {
         global $DB;
 
-        if ($context = context::cache_get(CONTEXT_MODULE, $instanceid)) {
+        if ($context = context::cache_get(CONTEXT_MODULE, $cmid)) {
             return $context;
         }
 
-        if (!$record = $DB->get_record('context', array('contextlevel'=>CONTEXT_MODULE, 'instanceid'=>$instanceid))) {
-            if ($cm = $DB->get_record('course_modules', array('id'=>$instanceid), 'id,course', $strictness)) {
+        if (!$record = $DB->get_record('context', array('contextlevel' => CONTEXT_MODULE, 'instanceid' => $cmid))) {
+            if ($cm = $DB->get_record('course_modules', array('id' => $cmid), 'id,course', $strictness)) {
                 $parentcontext = context_course::instance($cm->course);
                 $record = context::insert_context_record(CONTEXT_MODULE, $cm->id, $parentcontext->path);
             }
@@ -7379,19 +7379,19 @@ class context_block extends context {
      * Returns block context instance.
      *
      * @static
-     * @param int $instanceid
+     * @param int $blockinstanceid id from {block_instances} table.
      * @param int $strictness
      * @return context_block context instance
      */
-    public static function instance($instanceid, $strictness = MUST_EXIST) {
+    public static function instance($blockinstanceid, $strictness = MUST_EXIST) {
         global $DB;
 
-        if ($context = context::cache_get(CONTEXT_BLOCK, $instanceid)) {
+        if ($context = context::cache_get(CONTEXT_BLOCK, $blockinstanceid)) {
             return $context;
         }
 
-        if (!$record = $DB->get_record('context', array('contextlevel'=>CONTEXT_BLOCK, 'instanceid'=>$instanceid))) {
-            if ($bi = $DB->get_record('block_instances', array('id'=>$instanceid), 'id,parentcontextid', $strictness)) {
+        if (!$record = $DB->get_record('context', array('contextlevel' => CONTEXT_BLOCK, 'instanceid' => $blockinstanceid))) {
+            if ($bi = $DB->get_record('block_instances', array('id' => $blockinstanceid), 'id,parentcontextid', $strictness)) {
                 $parentcontext = context::instance_by_id($bi->parentcontextid);
                 $record = context::insert_context_record(CONTEXT_BLOCK, $bi->id, $parentcontext->path);
             }
index ce58f01..e72f165 100644 (file)
@@ -82,6 +82,12 @@ foreach ($requests as $request) {
         $result = call_user_func_array($callable,
                                        array_values($params));
 
+        // Validate the return parameters.
+        if ($externalfunctioninfo->returns_desc !== null) {
+            $callable = array($externalfunctioninfo->classname, 'clean_returnvalue');
+            $result = call_user_func($callable, $externalfunctioninfo->returns_desc, $result);
+        }
+
         $response['error'] = false;
         $response['data'] = $result;
         $responses[$index] = $response;
index 5b663e8..1adc2b0 100644 (file)
Binary files a/lib/amd/build/form-autocomplete.min.js and b/lib/amd/build/form-autocomplete.min.js differ
index 71f74a7..87a7d6c 100644 (file)
Binary files a/lib/amd/build/templates.min.js and b/lib/amd/build/templates.min.js differ
index ed6ed9c..24d32c4 100644 (file)
@@ -37,9 +37,6 @@ define(['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification']
         UP: 38
     };
 
-    /** @var {Number} closeSuggestionsTimer - integer used to cancel window.setTimeout. */
-    var closeSuggestionsTimer = null;
-
     /**
      * Make an item in the selection list "active".
      *
@@ -72,6 +69,52 @@ define(['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification']
         selectionElement.attr('aria-activedescendant', itemId);
     };
 
+    /**
+     * Update the element that shows the currently selected items.
+     *
+     * @method updateSelectionList
+     * @private
+     * @param {Object} options Original options for this autocomplete element.
+     * @param {Object} state State variables for this autocomplete element.
+     * @param {JQuery} originalSelect The JQuery object matching the hidden select list.
+     */
+    var updateSelectionList = function(options, state, originalSelect) {
+        // Build up a valid context to re-render the template.
+        var items = [];
+        var newSelection = $(document.getElementById(state.selectionId));
+        var activeId = newSelection.attr('aria-activedescendant');
+        var activeValue = false;
+
+        if (activeId) {
+            activeValue = $(document.getElementById(activeId)).attr('data-value');
+        }
+        originalSelect.children('option').each(function(index, ele) {
+            if ($(ele).prop('selected')) {
+                items.push( { label: $(ele).html(), value: $(ele).attr('value') } );
+            }
+        });
+        var context = $.extend({ items: items }, options, state);
+
+        // Render the template.
+        templates.render('core/form_autocomplete_selection', context).done(function(newHTML) {
+            // Add it to the page.
+            newSelection.empty().append($(newHTML).html());
+
+            if (activeValue !== false) {
+                // Reselect any previously selected item.
+                newSelection.children('[aria-selected=true]').each(function(index, ele) {
+                    if ($(ele).attr('data-value') === activeValue) {
+                        activateSelection(index, state);
+                    }
+                });
+            }
+        }).fail(notification.exception);
+        // Because this function get's called after changing the selection, this is a good place
+        // to trigger a change notification.
+        originalSelect.change();
+    };
+
+
     /**
      * Remove the given item from the list of selected things.
      *
@@ -363,51 +406,6 @@ define(['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification']
         closeSuggestions(state);
     };
 
-    /**
-     * Update the element that shows the currently selected items.
-     *
-     * @method updateSelectionList
-     * @private
-     * @param {Object} options Original options for this autocomplete element.
-     * @param {Object} state State variables for this autocomplete element.
-     * @param {JQuery} originalSelect The JQuery object matching the hidden select list.
-     */
-    var updateSelectionList = function(options, state, originalSelect) {
-        // Build up a valid context to re-render the template.
-        var items = [];
-        var newSelection = $(document.getElementById(state.selectionId));
-        var activeId = newSelection.attr('aria-activedescendant');
-        var activeValue = false;
-
-        if (activeId) {
-            activeValue = $(document.getElementById(activeId)).attr('data-value');
-        }
-        originalSelect.children('option').each(function(index, ele) {
-            if ($(ele).prop('selected')) {
-                items.push( { label: $(ele).html(), value: $(ele).attr('value') } );
-            }
-        });
-        var context = $.extend({ items: items }, options, state);
-
-        // Render the template.
-        templates.render('core/form_autocomplete_selection', context).done(function(newHTML) {
-            // Add it to the page.
-            newSelection.empty().append($(newHTML).html());
-
-            if (activeValue !== false) {
-                // Reselect any previously selected item.
-                newSelection.children('[aria-selected=true]').each(function(index, ele) {
-                    if ($(ele).attr('data-value') === activeValue) {
-                        activateSelection(index, state);
-                    }
-                });
-            }
-        }).fail(notification.exception);
-        // Because this function get's called after changing the selection, this is a good place
-        // to trigger a change notification.
-        originalSelect.change();
-    };
-
     /**
      * Select the currently active item from the suggestions list.
      *
@@ -568,15 +566,12 @@ define(['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification']
                 createItem(options, state, originalSelect);
             }
         });
-        inputElement.on('blur focus', function(e) {
-            // We may be blurring because we have clicked on the suggestion list. We
-            // dont want to close the selection list before the click event fires, so
-            // we have to delay.
-            if (closeSuggestionsTimer) {
-                window.clearTimeout(closeSuggestionsTimer);
-            }
-            closeSuggestionsTimer = window.setTimeout(function() {
-                if (e.type == 'blur') {
+        inputElement.on('blur', function() {
+            window.setTimeout(function() {
+                // Get the current element with focus.
+                var focusElement = $(document.activeElement);
+                // Only close the menu if the input hasn't regained focus.
+                if (focusElement.attr('id') != inputElement.attr('id')) {
                     if (options.tags) {
                         createItem(options, state, originalSelect);
                     }
@@ -589,9 +584,6 @@ define(['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification']
             arrowElement.on('click', function() {
                 // Prevent the close timer, or we will open, then close the suggestions.
                 inputElement.focus();
-                if (closeSuggestionsTimer) {
-                    window.clearTimeout(closeSuggestionsTimer);
-                }
                 // Show the suggestions list.
                 updateSuggestions(options, state, inputElement.val(), originalSelect);
             });
index 6e4bc0c..bde7e0d 100644 (file)
@@ -52,6 +52,83 @@ define([ 'core/mustache',
     /** @var {String} themeName for the current render */
     var currentThemeName = '';
 
+    /**
+     * Load a template from the cache or local storage or ajax request.
+     *
+     * @method getTemplate
+     * @private
+     * @param {string} templateName - should consist of the component and the name of the template like this:
+     *                              core/menu (lib/templates/menu.mustache) or
+     *                              tool_bananas/yellow (admin/tool/bananas/templates/yellow.mustache)
+     * @return {Promise} JQuery promise object resolved when the template has been fetched.
+     */
+    var getTemplate = function(templateName, async) {
+        var deferred = $.Deferred();
+        var parts = templateName.split('/');
+        var component = parts.shift();
+        var name = parts.shift();
+
+        var searchKey = currentThemeName + '/' + templateName;
+
+        // First try request variables.
+        if (searchKey in templateCache) {
+            deferred.resolve(templateCache[searchKey]);
+            return deferred.promise();
+        }
+
+        // Now try local storage.
+        var cached = storage.get('core_template/' + searchKey);
+
+        if (cached) {
+            deferred.resolve(cached);
+            templateCache[searchKey] = cached;
+            return deferred.promise();
+        }
+
+        // Oh well - load via ajax.
+        var promises = ajax.call([{
+            methodname: 'core_output_load_template',
+            args:{
+                component: component,
+                template: name,
+                themename: currentThemeName
+            }
+        }], async, false);
+
+        promises[0].done(
+            function (templateSource) {
+                storage.set('core_template/' + searchKey, templateSource);
+                templateCache[searchKey] = templateSource;
+                deferred.resolve(templateSource);
+            }
+        ).fail(
+            function (ex) {
+                deferred.reject(ex);
+            }
+        );
+        return deferred.promise();
+    };
+
+    /**
+     * Load a partial from the cache or ajax.
+     *
+     * @method partialHelper
+     * @private
+     * @param {string} name The partial name to load.
+     * @return {string}
+     */
+    var partialHelper = function(name) {
+        var template = '';
+
+        getTemplate(name, false).done(
+            function(source) {
+                template = source;
+            }
+        ).fail(notification.exception);
+
+        return template;
+    };
+
     /**
      * Render image icons.
      *
@@ -92,26 +169,6 @@ define([ 'core/mustache',
         return result.trim();
     };
 
-    /**
-     * Load a partial from the cache or ajax.
-     *
-     * @method partialHelper
-     * @private
-     * @param {string} name The partial name to load.
-     * @return {string}
-     */
-    var partialHelper = function(name) {
-        var template = '';
-
-        getTemplate(name, false).done(
-            function(source) {
-                template = source;
-            }
-        ).fail(notification.exception);
-
-        return template;
-    };
-
     /**
      * Render blocks of javascript and save them in an array.
      *
@@ -270,63 +327,6 @@ define([ 'core/mustache',
         return deferred.promise();
     };
 
-    /**
-     * Load a template from the cache or local storage or ajax request.
-     *
-     * @method getTemplate
-     * @private
-     * @param {string} templateName - should consist of the component and the name of the template like this:
-     *                              core/menu (lib/templates/menu.mustache) or
-     *                              tool_bananas/yellow (admin/tool/bananas/templates/yellow.mustache)
-     * @return {Promise} JQuery promise object resolved when the template has been fetched.
-     */
-    var getTemplate = function(templateName, async) {
-        var deferred = $.Deferred();
-        var parts = templateName.split('/');
-        var component = parts.shift();
-        var name = parts.shift();
-
-        var searchKey = currentThemeName + '/' + templateName;
-
-        // First try request variables.
-        if (searchKey in templateCache) {
-            deferred.resolve(templateCache[searchKey]);
-            return deferred.promise();
-        }
-
-        // Now try local storage.
-        var cached = storage.get('core_template/' + searchKey);
-
-        if (cached) {
-            deferred.resolve(cached);
-            templateCache[searchKey] = cached;
-            return deferred.promise();
-        }
-
-        // Oh well - load via ajax.
-        var promises = ajax.call([{
-            methodname: 'core_output_load_template',
-            args:{
-                component: component,
-                template: name,
-                themename: currentThemeName
-            }
-        }], async, false);
-
-        promises[0].done(
-            function (templateSource) {
-                storage.set('core_template/' + searchKey, templateSource);
-                templateCache[searchKey] = templateSource;
-                deferred.resolve(templateSource);
-            }
-        ).fail(
-            function (ex) {
-                deferred.reject(ex);
-            }
-        );
-        return deferred.promise();
-    };
-
     /**
      * Execute a block of JS returned from a template.
      * Call this AFTER adding the template HTML into the DOM so the nodes can be found.
index cdeea57..0223495 100644 (file)
@@ -15,7 +15,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Helper to initialise behat contexts from moodle code.
+ * Helper to get behat contexts from other contexts.
  *
  * @package    core
  * @category   test
@@ -25,8 +25,7 @@
 
 // NOTE: no MOODLE_INTERNAL test here, this file may be required by behat before including /config.php.
 
-use Behat\Mink\Session as Session,
-    Behat\Mink\Mink as Mink;
+use \Behat\Behat\Context\BehatContext;
 
 /**
  * Helper to get behat contexts.
@@ -39,28 +38,18 @@ use Behat\Mink\Session as Session,
 class behat_context_helper {
 
     /**
-     * List of already initialized contexts.
-     *
-     * @var array
+     * @var BehatContext main behat context.
      */
-    protected static $contexts = array();
+    protected static $maincontext = false;
 
     /**
-     * @var Mink.
-     */
-    protected static $mink = false;
-
-    /**
-     * Sets the browser session.
+     * Save main behat context reference to be used for finding sub-contexts.
      *
-     * @param Session $session
+     * @param BehatContext $maincontext
      * @return void
      */
-    public static function set_session(Session $session) {
-
-        // Set mink to be able to init a context.
-        self::$mink = new Mink(array('mink' => $session));
-        self::$mink->setDefaultSessionName('mink');
+    public static function set_main_context(BehatContext $maincontext) {
+        self::$maincontext = $maincontext;
     }
 
     /**
@@ -76,36 +65,10 @@ class behat_context_helper {
      */
     public static function get($classname) {
 
-        if (!self::init_context($classname)) {
+        if (!$subcontext = self::$maincontext->getSubcontextByClassName($classname)) {
             throw coding_exception('The required "' . $classname . '" class does not exist');
         }
 
-        return self::$contexts[$classname];
+        return $subcontext;
     }
-
-    /**
-     * Initializes the required context.
-     *
-     * @throws coding_exception
-     * @param string $classname
-     * @return bool
-     */
-    protected static function init_context($classname) {
-
-        if (!empty(self::$contexts[$classname])) {
-            return true;
-        }
-
-        if (!class_exists($classname)) {
-            return false;
-        }
-
-        $instance = new $classname();
-        $instance->setMink(self::$mink);
-
-        self::$contexts[$classname] = $instance;
-
-        return true;
-    }
-
 }
index add2130..4b85386 100644 (file)
@@ -131,7 +131,7 @@ XPATH
     [./descendant::*[self::h2][normalize-space(.) = %locator%] or %locator% = 'frontpage']
 XPATH
         , 'table' => <<<XPATH
-.//table[(./@id = %locator% or contains(.//caption, %locator%) or contains(concat(' ', normalize-space(@class), ' '), %locator% ))]
+.//table[(./@id = %locator% or contains(.//caption, %locator%) or contains(.//th, %locator%) or contains(concat(' ', normalize-space(@class), ' '), %locator% ))]
 XPATH
         , 'table_row' => <<<XPATH
 .//tr[contains(normalize-space(.), %locator%) and not(.//tr[contains(normalize-space(.), %locator%)])]
diff --git a/lib/classes/event/course_section_deleted.php b/lib/classes/event/course_section_deleted.php
new file mode 100644 (file)
index 0000000..e73f144
--- /dev/null
@@ -0,0 +1,101 @@
+<?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/>.
+
+/**
+ * Course section deleted event.
+ *
+ * @package    core
+ * @copyright  2015 Ruslan Kabalin, Lancaster University.
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace core\event;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Course section deleted event class.
+ *
+ * @property-read array $other {
+ *      Extra information about event.
+ *
+ *      - int sectionnum: section number.
+ *      - string sectionname: section name.
+ * }
+ *
+ * @package    core
+ * @since      Moodle 3.1
+ * @copyright  2015 Ruslan Kabalin, Lancaster University.
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class course_section_deleted extends base {
+
+    /**
+     * Init method.
+     *
+     * @return void
+     */
+    protected function init() {
+        $this->data['objecttable'] = 'course_sections';
+        $this->data['crud'] = 'd';
+        $this->data['edulevel'] = self::LEVEL_TEACHING;
+    }
+
+    /**
+     * Return localised event name.
+     *
+     * @return string
+     */
+    public static function get_name() {
+        return get_string('eventcoursesectiondeleted');
+    }
+
+    /**
+     * Returns non-localised event description with id's for admin use only.
+     *
+     * @return string
+     */
+    public function get_description() {
+        return "The user with id '$this->userid' deleted section number '{$this->other['sectionnum']}' " .
+                "(section name '{$this->other['sectionname']}') for the course with id '$this->courseid'";
+    }
+
+    /**
+     * Return legacy data for add_to_log().
+     *
+     * @return array
+     */
+    protected function get_legacy_logdata() {
+        return array($this->courseid, 'course', 'delete section', 'view.php?id=' . $this->courseid, $this->other['sectionnum']);
+    }
+
+    /**
+     * Custom validation.
+     *
+     * @throws \coding_exception
+     * @return void
+     */
+    protected function validate_data() {
+        parent::validate_data();
+
+        if (!isset($this->other['sectionnum'])) {
+            throw new \coding_exception('The \'sectionnum\' value must be set in other.');
+        }
+        if (!isset($this->other['sectionname'])) {
+            throw new \coding_exception('The \'sectionname\' value must be set in other.');
+        }
+    }
+}
index 5e81a57..9e999c2 100644 (file)
@@ -23,6 +23,8 @@
  */
 namespace core\plugininfo;
 
+use part_of_admin_tree, admin_settingpage;
+
 defined('MOODLE_INTERNAL') || die();
 
 /**
index 5ed0c73..b62cf41 100644 (file)
@@ -215,7 +215,7 @@ class core_useragent {
      * @return bool
      */
     protected function is_useragent_web_crawler() {
-        $regex = '/Googlebot|google\.com|Yahoo! Slurp|\[ZSEBOT\]|msnbot|bingbot|BingPreview|Yandex|AltaVista|Baiduspider|Teoma/';
+        $regex = '/Googlebot|google\.com|Yahoo! Slurp|\[ZSEBOT\]|msnbot|bingbot|BingPreview|Yandex|AltaVista|Baiduspider|Teoma/i';
         return (preg_match($regex, $this->useragent));
     }
 
index 7dac929..ccc30c9 100644 (file)
@@ -982,6 +982,16 @@ $capabilities = array(
         'clonepermissionsfrom' => 'moodle/course:update'
     ),
 
+    'moodle/course:renameroles' => array(
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:update'
+    ),
+
     'moodle/course:changeidnumber' => array(
 
         'riskbitmask' => RISK_XSS,
index 8060d7f..61b5752 100644 (file)
@@ -906,6 +906,15 @@ $functions = array(
         'capabilities'  => '',
     ),
 
+    'core_message_delete_message' => array(
+        'classname'     => 'core_message_external',
+        'methodname'    => 'delete_message',
+        'classpath'     => 'message/externallib.php',
+        'description'   => 'Deletes a message.',
+        'type'          => 'write',
+        'capabilities'  => 'moodle/site:deleteownmessage',
+    ),
+
     // === notes related functions ===
 
     'moodle_notes_create_notes' => array(
@@ -1123,7 +1132,7 @@ $functions = array(
     ),
 
     // Tag functions.
-   'core_tag_update_tags' => array(
+    'core_tag_update_tags' => array(
         'classname'   => 'core_tag_external',
         'methodname'  => 'update_tags',
         'description' => 'Updates tags',
@@ -1160,6 +1169,7 @@ $services = array(
             'core_enrol_get_enrolled_users',
             'core_enrol_get_course_enrolment_methods',
             'enrol_self_enrol_user',
+            'enrol_self_get_instance_info',
             'core_user_get_users_by_id',
             'core_webservice_get_site_info',
             'core_notes_create_notes',
@@ -1216,6 +1226,7 @@ $services = array(
             'core_completion_get_course_completion_status',
             'core_user_view_user_list',
             'core_message_mark_message_read',
+            'core_message_delete_message',
             'core_notes_view_notes',
             'mod_forum_view_forum_discussion',
             'core_user_view_user_profile',
@@ -1258,6 +1269,7 @@ $services = array(
             'mod_lti_view_lti',
             'mod_imscp_view_imscp',
             'mod_imscp_get_imscps_by_courses',
+            'mod_glossary_get_glossaries_by_courses',
             ),
         'enabled' => 0,
         'restrictedusers' => 0,
index 3b343c0..40b21c7 100644 (file)
@@ -4606,5 +4606,8 @@ function xmldb_main_upgrade($oldversion) {
         upgrade_main_savepoint(true, 2015100800.01);
     }
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 9ecb9b6..cd38aa4 100644 (file)
@@ -901,9 +901,10 @@ function print_container_end($return=false) {
 /**
  * Print a bold message in an optional color.
  *
- * @deprecated use $OUTPUT->notification instead.
+ * @deprecated since Moodle 2.0 MDL-19077 - use $OUTPUT->notification instead.
+ * @todo MDL-50469 This will be deleted in Moodle 3.3.
  * @param string $message The message to print out
- * @param string $style Optional style to display message text in
+ * @param string $classes Optional style to display message text in
  * @param string $align Alignment option
  * @param bool $return whether to return an output string or echo now
  * @return string|bool Depending on $result
@@ -911,6 +912,8 @@ function print_container_end($return=false) {
 function notify($message, $classes = 'notifyproblem', $align = 'center', $return = false) {
     global $OUTPUT;
 
+    debugging('notify() is deprecated, please use $OUTPUT->notification() instead', DEBUG_DEVELOPER);
+
     if ($classes == 'green') {
         debugging('Use of deprecated class name "green" in notify. Please change to "notifysuccess".', DEBUG_DEVELOPER);
         $classes = 'notifysuccess'; // Backward compatible with old color system
@@ -2395,8 +2398,8 @@ function get_referer($stripquery = true) {
  * @deprecated since Moodle 3.0 use \core_useragent::is_web_crawler instead.
  */
 function is_web_crawler() {
-    debugging("is_web_crawler() has been deprecated, please use \\core_useragent\\is_web_crawler() instead.", DEBUG_DEVELOPER);
-    return core_useragent::is_crawler();
+    debugging('is_web_crawler() has been deprecated, please use core_useragent::is_web_crawler() instead.', DEBUG_DEVELOPER);
+    return core_useragent::is_web_crawler();
 }
 
 /**
index 86e2944..547bbad 100644 (file)
@@ -102,5 +102,8 @@ function xmldb_editor_atto_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 3f8efdb..63a1c85 100644 (file)
@@ -39,5 +39,8 @@ function xmldb_atto_equation_upgrade($oldversion) {
         upgrade_plugin_savepoint(true, 2015083100, 'atto', 'equation');
     }
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
\ No newline at end of file
index ba14c13..21c5cda 100644 (file)
Binary files a/lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button-debug.js and b/lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button-debug.js differ
index 51d0be4..21c5088 100644 (file)
Binary files a/lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button-min.js and b/lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button-min.js differ
index ba14c13..21c5cda 100644 (file)
Binary files a/lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button.js and b/lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button.js differ
index 2fb1543..88bf7c0 100644 (file)
@@ -63,7 +63,7 @@ Y.namespace('M.atto_rtl').Button = Y.Base.create('button', Y.M.editor_atto.Edito
      */
     _toggleRTL: function(e, direction) {
         var host = this.get('host'),
-            sourceSelection = rangy.saveSelection(),
+            sourceSelection = window.rangy.saveSelection(),
             selection = host.getSelection(),
             newDirection = {
                 rtl: 'ltr',
@@ -82,7 +82,7 @@ Y.namespace('M.atto_rtl').Button = Y.Base.create('button', Y.M.editor_atto.Edito
             }
 
             // Change selection from the containing paragraph to the original one.
-            rangy.restoreSelection(sourceSelection);
+            window.rangy.restoreSelection(sourceSelection);
             // Mark the text as having been updated.
             this.markUpdated();
         }
index da400f2..41e53ad 100644 (file)
Binary files a/lib/editor/atto/yui/build/moodle-editor_atto-plugin/moodle-editor_atto-plugin-debug.js and b/lib/editor/atto/yui/build/moodle-editor_atto-plugin/moodle-editor_atto-plugin-debug.js differ
index e49012e..040eb14 100644 (file)
Binary files a/lib/editor/atto/yui/build/moodle-editor_atto-plugin/moodle-editor_atto-plugin-min.js and b/lib/editor/atto/yui/build/moodle-editor_atto-plugin/moodle-editor_atto-plugin-min.js differ
index 6cedbfa..e436da5 100644 (file)
Binary files a/lib/editor/atto/yui/build/moodle-editor_atto-plugin/moodle-editor_atto-plugin.js and b/lib/editor/atto/yui/build/moodle-editor_atto-plugin/moodle-editor_atto-plugin.js differ
index c990715..a8f9ff3 100644 (file)
@@ -27,7 +27,8 @@
             "event-outside",
             "handlebars",
             "event-custom",
-            "timers"
+            "timers",
+            "moodle-editor_atto-menu"
         ]
     },
     "moodle-editor_atto-menu": {
index 73127cd..6323f52 100644 (file)
@@ -184,5 +184,8 @@ fontselect,fontsizeselect,wrap,code,search,replace,wrap,nonbreaking,charmap,tabl
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index 0998976..021ab45 100644 (file)
@@ -56,5 +56,8 @@ function xmldb_tinymce_spellchecker_upgrade($oldversion) {
     // Moodle v2.9.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.0.0 release upgrade line.
+    // Put any upgrade step following this.
+
     return true;
 }
index c69fb39..426c9a2 100644 (file)
@@ -452,7 +452,7 @@ function enrol_add_course_navigation(navigation_node $coursenode, $course) {
             }
         }
         // Check role permissions
-        if (has_any_capability(array('moodle/role:assign', 'moodle/role:safeoverride','moodle/role:override', 'moodle/role:assign'), $coursecontext)) {
+        if (has_any_capability(array('moodle/role:assign', 'moodle/role:safeoverride', 'moodle/role:override'), $coursecontext)) {
             $url = new moodle_url('/admin/roles/check.php', array('contextid'=>$coursecontext->id));
             $permissionsnode->add(get_string('checkpermissions', 'role'), $url, navigation_node::TYPE_SETTING, null, 'permissions', new pix_icon('i/checkpermissions', ''));
         }
index 7fd7e52..002d572 100644 (file)
@@ -964,21 +964,28 @@ class external_util {
      * Validate a list of courses, returning the complete course objects for valid courses.
      *
      * @param  array $courseids A list of course ids
+     * @param  array $courses   An array of courses already pre-fetched, indexed by course id.
      * @return array            An array of courses and the validation warnings
      */
-    public static function validate_courses($courseids) {
+    public static function validate_courses($courseids, $courses = array()) {
         // Delete duplicates.
         $courseids = array_unique($courseids);
-        $courses = array();
         $warnings = array();
 
+        // Remove courses which are not even requested.
+        $courses =  array_intersect_key($courses, array_flip($courseids));
+
         foreach ($courseids as $cid) {
             // Check the user can function in this context.
             try {
                 $context = context_course::instance($cid);
                 external_api::validate_context($context);
-                $courses[$cid] = get_course($cid);
+
+                if (!isset($courses[$cid])) {
+                    $courses[$cid] = get_course($cid);
+                }
             } catch (Exception $e) {
+                unset($courses[$cid]);
                 $warnings[] = array(
                     'item' => 'course',
                     'itemid' => $cid,
index c832f61..9290814 100644 (file)
@@ -1521,7 +1521,6 @@ class file_storage {
 
         $width    = $imageinfo['width'];
         $height   = $imageinfo['height'];
-        $mimetype = $imageinfo['mimetype'];
 
         if ($keepaspectratio) {
             if (0 >= $newwidth and 0 >= $newheight) {
@@ -1553,15 +1552,53 @@ class file_storage {
             }
         }
 
+        // The original image.
         $img = imagecreatefromstring($file->get_content());
+
+        // A new true color image where we will copy our original image.
+        $newimg = imagecreatetruecolor($newwidth, $newheight);
+
+        // Determine if the file supports transparency.
+        $hasalpha = $filerecord['mimetype'] == 'image/png' || $filerecord['mimetype'] == 'image/gif';
+
+        // Maintain transparency.
+        if ($hasalpha) {
+            imagealphablending($newimg, true);
+
+            // Get the current transparent index for the original image.
+            $colour = imagecolortransparent($img);
+            if ($colour == -1) {
+                // Set a transparent colour index if there's none.
+                $colour = imagecolorallocatealpha($newimg, 255, 255, 255, 127);
+                // Save full alpha channel.
+                imagesavealpha($newimg, true);
+            }
+            imagecolortransparent($newimg, $colour);
+            imagefill($newimg, 0, 0, $colour);
+        }
+
+        // Process the image to be output.
         if ($height != $newheight or $width != $newwidth) {
-            $newimg = imagecreatetruecolor($newwidth, $newheight);
-            if (!imagecopyresized($newimg, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height)) {
+            // Resample if the dimensions differ from the original.
+            if (!imagecopyresampled($newimg, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height)) {
                 // weird
                 throw new file_exception('storedfileproblem', 'Can not resize image');
             }
             imagedestroy($img);
             $img = $newimg;
+
+        } else if ($hasalpha) {
+            // Just copy to the new image with the alpha channel.
+            if (!imagecopy($newimg, $img, 0, 0, 0, 0, $width, $height)) {
+                // Weird.
+                throw new file_exception('storedfileproblem', 'Can not copy image');
+            }
+            imagedestroy($img);
+            $img = $newimg;
+
+        } else {
+            // No particular processing needed for the original image.
+            imagedestroy($newimg);
         }
 
         ob_start();
@@ -1580,6 +1617,11 @@ class file_storage {
 
             case 'image/png':
                 $quality = (int)$quality;
+
+                // Woah nelly! Because PNG quality is in the range 0 - 9 compared to JPEG quality,
+                // the latter of which can go to 100, we need to make sure that quality here is
+                // in a safe range or PHP WILL CRASH AND DIE. You have been warned.
+                $quality = $quality > 9 ? (int)(max(1.0, (float)$quality / 100.0) * 9.0) : $quality;
                 imagepng($img, NULL, $quality, NULL);
                 break;
 
@@ -2154,7 +2196,7 @@ class file_storage {
         $now = time();
         foreach ($rs as $record) {
             $this->update_references($record->id, $now, null,
-                    $storedfile->get_contenthash(), $storedfile->get_filesize(), 0);
+                    $storedfile->get_contenthash(), $storedfile->get_filesize(), 0, $storedfile->get_timemodified());
         }
         $rs->close();
     }
@@ -2372,8 +2414,9 @@ class file_storage {
      * @param string $contenthash
      * @param int $filesize
      * @param int $status 0 if ok or 666 if source is missing
+     * @param int $timemodified last time modified of the source, if known
      */
-    public function update_references($referencefileid, $lastsync, $lifetime, $contenthash, $filesize, $status) {
+    public function update_references($referencefileid, $lastsync, $lifetime, $contenthash, $filesize, $status, $timemodified = null) {
         global $DB;
         $referencefileid = clean_param($referencefileid, PARAM_INT);
         $lastsync = clean_param($lastsync, PARAM_INT);
@@ -2383,9 +2426,10 @@ class file_storage {
         $params = array('contenthash' => $contenthash,
                     'filesize' => $filesize,
                     'status' => $status,
-                    'referencefileid' => $referencefileid);
+                    'referencefileid' => $referencefileid,
+                    'timemodified' => $timemodified);
         $DB->execute('UPDATE {files} SET contenthash = :contenthash, filesize = :filesize,
-            status = :status
+            status = :status ' . ($timemodified ? ', timemodified = :timemodified' : '') . '
             WHERE referencefileid = :referencefileid', $params);
         $data = array('id' => $referencefileid, 'lastsync' => $lastsync);
         $DB->update_record('files_reference', (object)$data);
index a959baf..b115f96 100644 (file)
@@ -961,8 +961,9 @@ class stored_file {
      * @param null|string $contenthash if set to null contenthash is not changed
      * @param int $filesize new size of the file
      * @param int $status new status of the file (0 means OK, 666 - source missing)
+     * @param int $timemodified last time modified of the source, if known
      */
-    public function set_synchronized($contenthash, $filesize, $status = 0) {
+    public function set_synchronized($contenthash, $filesize, $status = 0, $timemodified = null) {
         if (!$this->is_external_file()) {
             return;
         }
@@ -974,12 +975,15 @@ class stored_file {
             $oldcontenthash = $this->file_record->contenthash;
         }
         // this will update all entries in {files} that have the same filereference id
-        $this->fs->update_references($this->file_record->referencefileid, $now, null, $contenthash, $filesize, $status);
+        $this->fs->update_references($this->file_record->referencefileid, $now, null, $contenthash, $filesize, $status, $timemodified);
         // we don't need to call update() for this object, just set the values of changed fields
         $this->file_record->contenthash = $contenthash;
         $this->file_record->filesize = $filesize;
         $this->file_record->status = $status;
         $this->file_record->referencelastsync = $now;
+        if ($timemodified) {
+            $this->file_record->timemodified = $timemodified;
+        }
         if (isset($oldcontenthash)) {
             $this->fs->deleted_file_cleanup($oldcontenthash);
         }
index 9c7ff1d..95d6065 100644 (file)
@@ -986,6 +986,69 @@ class core_files_file_storage_testcase extends advanced_testcase {
         $this->assertInstanceOf('stored_file', $converted);
     }
 
+    public function test_convert_image_png() {
+        global $CFG;
+
+        $this->resetAfterTest(false);
+
+        $filepath = $CFG->dirroot.'/lib/filestorage/tests/fixtures/testimage.png';
+        $syscontext = context_system::instance();
+        $filerecord = array(
+            'contextid' => $syscontext->id,
+            'component' => 'core',
+            'filearea'  => 'unittest',
+            'itemid'    => 0,
+            'filepath'  => '/images/',
+            'filename'  => 'testimage.png',
+        );
+
+        $fs = get_file_storage();
+        $original = $fs->create_file_from_pathname($filerecord, $filepath);
+
+        // Vanilla test.
+        $filerecord['filename'] = 'testimage-converted-nosize.png';
+        $vanilla = $fs->convert_image($filerecord, $original);
+        $this->assertInstanceOf('stored_file', $vanilla);
+        // Assert that byte 25 has the ascii value 6 for PNG-24.
+        $this->assertTrue(ord(substr($vanilla->get_content(), 25, 1)) == 6);
+
+        // 10x10 resize test; also testing for a ridiculous quality setting, which
+        // we should if necessary scale to the 0 - 9 range.
+        $filerecord['filename'] = 'testimage-converted-10x10.png';
+        $converted = $fs->convert_image($filerecord, $original, 10, 10, true, 100);
+        $this->assertInstanceOf('stored_file', $converted);
+        // Assert that byte 25 has the ascii value 6 for PNG-24.
+        $this->assertTrue(ord(substr($converted->get_content(), 25, 1)) == 6);
+
+        // Transparency test.
+        $filerecord['filename'] = 'testimage-converted-102x31.png';
+        $converted = $fs->convert_image($filerecord, $original, 102, 31, true, 9);
+        $this->assertInstanceOf('stored_file', $converted);
+        // Assert that byte 25 has the ascii value 6 for PNG-24.
+        $this->assertTrue(ord(substr($converted->get_content(), 25, 1)) == 6);
+
+        $originalfile = imagecreatefromstring($original->get_content());
+        $convertedfile = imagecreatefromstring($converted->get_content());
+        $vanillafile = imagecreatefromstring($vanilla->get_content());
+
+        $originalcolors = imagecolorsforindex($originalfile, imagecolorat($originalfile, 0, 0));
+        $convertedcolors = imagecolorsforindex($convertedfile, imagecolorat($convertedfile, 0, 0));
+        $vanillacolors = imagecolorsforindex($vanillafile, imagecolorat($vanillafile, 0, 0));
+        $this->assertEquals(count($originalcolors), 4);
+        $this->assertEquals(count($convertedcolors), 4);
+        $this->assertEquals(count($vanillacolors), 4);
+        $this->assertEquals($originalcolors['red'], $convertedcolors['red']);
+        $this->assertEquals($originalcolors['green'], $convertedcolors['green']);
+        $this->assertEquals($originalcolors['blue'], $convertedcolors['blue']);
+        $this->assertEquals($originalcolors['alpha'], $convertedcolors['alpha']);
+        $this->assertEquals($originalcolors['red'], $vanillacolors['red']);
+        $this->assertEquals($originalcolors['green'], $vanillacolors['green']);
+        $this->assertEquals($originalcolors['blue'], $vanillacolors['blue']);
+        $this->assertEquals($originalcolors['alpha'], $vanillacolors['alpha']);
+        $this->assertEquals($originalcolors['alpha'], 127);
+
+    }
+
     private function generate_file_record() {
         $syscontext = context_system::instance();
         $filerecord = new stdClass();
diff --git a/lib/filestorage/tests/fixtures/testimage.png b/lib/filestorage/tests/fixtures/testimage.png
new file mode 100644 (file)
index 0000000..791ad6e
Binary files /dev/null and b/lib/filestorage/tests/fixtures/testimage.png differ
index ba89fd2..0c23431 100644 (file)
@@ -463,7 +463,7 @@ class filterobject {
      * @param bool $fullmatch
      * @param mixed $replacementphrase
      */
-    function filterobject($phrase, $hreftagbegin = '<span class="highlight">',
+    public function __construct($phrase, $hreftagbegin = '<span class="highlight">',
                                    $hreftagend = '</span>',
                                    $casesensitive = false,
                                    $fullmatch = false,
index fa15b38..f9206c4 100644 (file)
@@ -36,7 +36,7 @@ function flowplayer_send_flash_content($filename) {
     // Note: Do not use any fancy APIs here, this must work in all supported versions.
 
     // No url params.
-    if (!empty($_GET) or !empty($_POST) or !empty($_REQUEST)) {
+    if (!empty($_GET) or !empty($_POST)) {
         header("HTTP/1.1 404 Not Found");
         die;
     }
index d69ed35..8f033c9 100644 (file)
@@ -337,6 +337,7 @@ function install_print_header($config, $stagename, $heading, $stagetext, $stagec
 
     echo '<link rel="stylesheet" type="text/css" href="'.$CFG->wwwroot.'/install/css.php" />
           <title>'.get_string('installation','install').' - Moodle '.$CFG->target_release.'</title>
+          <meta name="robots" content="noindex">
           <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
           <meta http-equiv="pragma" content="no-cache" />
           <meta http-equiv="expires" content="0" />';
index 34c2829..a32a34c 100644 (file)
@@ -989,6 +989,7 @@ class core_media_player_swf extends core_media_player {
     <param name="scale" value="aspect" />
     <param name="base" value="." />
     <param name="allowscriptaccess" value="never" />
+    <param name="allowfullscreen" value="true" />
 <!--[if !IE]>-->
     <object type="application/x-shockwave-flash" data="$url" width="$width" height="$height">
       <param name="controller" value="true" />
@@ -997,6 +998,7 @@ class core_media_player_swf extends core_media_player {
       <param name="scale" value="aspect" />
       <param name="base" value="." />
       <param name="allowscriptaccess" value="never" />
+      <param name="allowfullscreen" value="true" />
 <!--<![endif]-->
 $fallback
 <!--[if !IE]>-->
index abb73c3..8fd08cd 100644 (file)
@@ -4936,7 +4936,6 @@ function remove_course_contents($courseid, $showfeedback = true, array $options
     $oldcourse->summary          = '';
     $oldcourse->cacherev         = 0;
     $oldcourse->legacyfiles      = 0;
-    $oldcourse->enablecompletion = 0;
     if (!empty($options['keep_groups_and_groupings'])) {
         $oldcourse->defaultgroupingid = 0;
     }