Merge branch 'MDL-45034-master' of git://github.com/damyon/moodle
authorSam Hemelryk <sam@moodle.com>
Tue, 15 Apr 2014 21:23:30 +0000 (09:23 +1200)
committerSam Hemelryk <sam@moodle.com>
Tue, 15 Apr 2014 21:23:30 +0000 (09:23 +1200)
Conflicts:
lib/editor/atto/plugins/image/yui/build/moodle-atto_image-button/moodle-atto_image-button-min.js

422 files changed:
admin/tool/log/db/install.php
admin/tool/log/db/upgrade.php [new file with mode: 0644]
admin/tool/log/store/legacy/classes/event/legacy_logged.php
admin/tool/log/store/legacy/settings.php
admin/tool/log/version.php
availability/classes/info_section.php
blocks/comments/classes/event/comment_created.php
blocks/comments/classes/event/comment_deleted.php
filter/glossary/filter.php
filter/glossary/tests/filter_test.php
filter/glossary/version.php
filter/tex/filter.php
filter/tex/tests/filter_test.php [new file with mode: 0644]
install/lang/de/admin.php
install/lang/en_us/admin.php [new file with mode: 0644]
install/lang/it/install.php
install/lang/kl/moodle.php [new file with mode: 0644]
install/lang/lt/error.php [new file with mode: 0644]
install/lang/mn_mong/langconfig.php [new file with mode: 0644]
install/lang/no/langconfig.php
lang/en/moodle.php
lang/en/question.php
lib/classes/event/assessable_submitted.php
lib/classes/event/assessable_uploaded.php
lib/classes/event/base.php
lib/classes/event/blog_association_created.php
lib/classes/event/blog_comment_created.php
lib/classes/event/blog_comment_deleted.php
lib/classes/event/blog_entries_viewed.php
lib/classes/event/blog_entry_created.php
lib/classes/event/blog_entry_deleted.php
lib/classes/event/blog_entry_updated.php
lib/classes/event/calendar_event_created.php
lib/classes/event/calendar_event_deleted.php
lib/classes/event/calendar_event_updated.php
lib/classes/event/cohort_created.php
lib/classes/event/cohort_deleted.php
lib/classes/event/cohort_member_added.php
lib/classes/event/cohort_member_removed.php
lib/classes/event/cohort_updated.php
lib/classes/event/comment_created.php
lib/classes/event/comment_deleted.php
lib/classes/event/comments_viewed.php
lib/classes/event/content_viewed.php
lib/classes/event/course_category_created.php
lib/classes/event/course_category_deleted.php
lib/classes/event/course_category_updated.php
lib/classes/event/course_completed.php
lib/classes/event/course_completion_updated.php
lib/classes/event/course_content_deleted.php
lib/classes/event/course_created.php
lib/classes/event/course_deleted.php
lib/classes/event/course_module_completion_updated.php
lib/classes/event/course_module_created.php
lib/classes/event/course_module_deleted.php
lib/classes/event/course_module_instance_list_viewed.php
lib/classes/event/course_module_instances_list_viewed.php
lib/classes/event/course_module_updated.php
lib/classes/event/course_module_viewed.php
lib/classes/event/course_reset_ended.php
lib/classes/event/course_reset_started.php
lib/classes/event/course_resources_list_viewed.php
lib/classes/event/course_restored.php
lib/classes/event/course_section_updated.php
lib/classes/event/course_updated.php
lib/classes/event/email_failed.php
lib/classes/event/group_created.php
lib/classes/event/group_deleted.php
lib/classes/event/group_member_added.php
lib/classes/event/group_member_removed.php
lib/classes/event/group_updated.php
lib/classes/event/grouping_created.php
lib/classes/event/grouping_deleted.php
lib/classes/event/grouping_updated.php
lib/classes/event/item_tagged.php
lib/classes/event/item_untagged.php
lib/classes/event/manager.php
lib/classes/event/message_contact_added.php
lib/classes/event/message_contact_blocked.php
lib/classes/event/message_contact_removed.php
lib/classes/event/message_contact_unblocked.php
lib/classes/event/message_read.php
lib/classes/event/message_sent.php
lib/classes/event/mnet_access_control_created.php
lib/classes/event/mnet_access_control_updated.php
lib/classes/event/note_created.php
lib/classes/event/note_deleted.php
lib/classes/event/note_updated.php
lib/classes/event/notes_viewed.php
lib/classes/event/question_category_created.php [new file with mode: 0644]
lib/classes/event/role_allow_assign_updated.php
lib/classes/event/role_allow_override_updated.php
lib/classes/event/role_allow_switch_updated.php
lib/classes/event/role_assigned.php
lib/classes/event/role_capabilities_updated.php
lib/classes/event/role_deleted.php
lib/classes/event/role_unassigned.php
lib/classes/event/tag_created.php
lib/classes/event/tag_deleted.php
lib/classes/event/tag_flagged.php
lib/classes/event/tag_unflagged.php
lib/classes/event/tag_updated.php
lib/classes/event/unknown_logged.php [new file with mode: 0644]
lib/classes/event/user_created.php
lib/classes/event/user_deleted.php
lib/classes/event/user_enrolment_created.php
lib/classes/event/user_enrolment_deleted.php
lib/classes/event/user_enrolment_updated.php
lib/classes/event/user_graded.php
lib/classes/event/user_list_viewed.php
lib/classes/event/user_loggedin.php
lib/classes/event/user_loggedinas.php
lib/classes/event/user_loggedout.php
lib/classes/event/user_login_failed.php
lib/classes/event/user_profile_viewed.php
lib/classes/event/user_updated.php
lib/classes/event/webservice_function_called.php
lib/classes/event/webservice_login_failed.php
lib/classes/event/webservice_service_created.php
lib/classes/event/webservice_service_deleted.php
lib/classes/event/webservice_service_updated.php
lib/classes/event/webservice_service_user_added.php
lib/classes/event/webservice_service_user_removed.php
lib/classes/event/webservice_token_created.php
lib/classes/event/webservice_token_sent.php
lib/csslib.php
lib/db/services.php
lib/dml/mariadb_native_moodle_database.php
lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button-debug.js
lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button-min.js
lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button.js
lib/editor/atto/plugins/table/yui/src/button/js/button.js
lib/editor/atto/styles.css
lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-debug.js
lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-min.js
lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor.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/js/editor-plugin-buttons.js
lib/editor/atto/yui/src/editor/js/toolbar-keyboardnav.js
lib/modinfolib.php
lib/pagelib.php
lib/setuplib.php
lib/tests/csslib_test.php
lib/tests/event_unknown_logged_test.php [new file with mode: 0644]
lib/upgradelib.php
message/output/airnotifier/classes/manager.php [changed mode: 0755->0644]
message/output/airnotifier/db/access.php [changed mode: 0755->0644]
message/output/airnotifier/db/install.php [changed mode: 0755->0644]
message/output/airnotifier/db/install.xml [changed mode: 0755->0644]
message/output/airnotifier/db/services.php [changed mode: 0755->0644]
message/output/airnotifier/externallib.php [changed mode: 0755->0644]
message/output/airnotifier/lang/en/message_airnotifier.php [changed mode: 0755->0644]
message/output/airnotifier/message_output_airnotifier.php [changed mode: 0755->0644]
message/output/airnotifier/requestaccesskey.php [changed mode: 0755->0644]
message/output/airnotifier/rest.php [changed mode: 0755->0644]
message/output/airnotifier/settings.php [changed mode: 0755->0644]
message/output/airnotifier/style.css [changed mode: 0755->0644]
message/output/airnotifier/tests/externallib_test.php [changed mode: 0755->0644]
message/output/airnotifier/version.php [changed mode: 0755->0644]
message/output/airnotifier/yui/src/toolboxes/js/toolboxes.js [changed mode: 0755->0644]
mod/assign/classes/event/all_submissions_downloaded.php
mod/assign/classes/event/assessable_submitted.php
mod/assign/classes/event/extension_granted.php
mod/assign/classes/event/identities_revealed.php
mod/assign/classes/event/marker_updated.php
mod/assign/classes/event/statement_accepted.php
mod/assign/classes/event/submission_created.php
mod/assign/classes/event/submission_duplicated.php
mod/assign/classes/event/submission_graded.php
mod/assign/classes/event/submission_locked.php
mod/assign/classes/event/submission_status_updated.php
mod/assign/classes/event/submission_unlocked.php
mod/assign/classes/event/submission_updated.php
mod/assign/classes/event/workflow_state_updated.php
mod/assign/lib.php
mod/assign/submission/comments/classes/event/comment_created.php
mod/assign/submission/comments/classes/event/comment_deleted.php
mod/assign/submission/file/classes/event/assessable_uploaded.php
mod/assign/submission/file/classes/event/submission_created.php
mod/assign/submission/file/classes/event/submission_updated.php
mod/assign/submission/onlinetext/classes/event/assessable_uploaded.php
mod/assign/submission/onlinetext/classes/event/submission_created.php
mod/assign/submission/onlinetext/classes/event/submission_updated.php
mod/book/classes/event/chapter_created.php
mod/book/classes/event/chapter_deleted.php
mod/book/classes/event/chapter_updated.php
mod/book/classes/event/chapter_viewed.php
mod/book/classes/event/course_module_instance_list_viewed.php
mod/book/classes/event/course_module_viewed.php
mod/book/lib.php
mod/book/tool/exportimscp/classes/event/book_exported.php
mod/book/tool/print/classes/event/book_printed.php
mod/book/tool/print/classes/event/chapter_printed.php
mod/book/tool/print/lib.php
mod/chat/classes/event/course_module_instance_list_viewed.php
mod/chat/classes/event/message_sent.php
mod/chat/classes/event/sessions_viewed.php
mod/chat/lib.php
mod/choice/classes/event/answer_submitted.php
mod/choice/classes/event/answer_updated.php
mod/choice/classes/event/course_module_instance_list_viewed.php
mod/choice/classes/event/course_module_viewed.php
mod/choice/classes/event/report_viewed.php
mod/choice/lib.php
mod/data/classes/event/comment_created.php
mod/data/classes/event/comment_deleted.php
mod/data/classes/event/course_module_instance_list_viewed.php
mod/data/classes/event/course_module_viewed.php
mod/data/classes/event/field_created.php
mod/data/classes/event/field_deleted.php
mod/data/classes/event/field_updated.php
mod/data/classes/event/record_created.php
mod/data/classes/event/record_deleted.php
mod/data/classes/event/record_updated.php
mod/data/classes/event/template_updated.php
mod/data/classes/event/template_viewed.php
mod/data/lib.php
mod/feedback/classes/event/course_module_instance_list_viewed.php
mod/feedback/classes/event/course_module_viewed.php
mod/feedback/classes/event/response_deleted.php
mod/feedback/classes/event/response_submitted.php
mod/feedback/lib.php
mod/folder/classes/event/course_module_instance_list_viewed.php
mod/folder/classes/event/course_module_viewed.php
mod/folder/classes/event/folder_updated.php
mod/folder/lib.php
mod/forum/classes/event/assessable_uploaded.php
mod/forum/classes/event/course_module_instance_list_viewed.php
mod/forum/classes/event/course_module_viewed.php
mod/forum/classes/event/course_searched.php
mod/forum/classes/event/discussion_created.php
mod/forum/classes/event/discussion_deleted.php
mod/forum/classes/event/discussion_moved.php
mod/forum/classes/event/discussion_updated.php
mod/forum/classes/event/discussion_viewed.php
mod/forum/classes/event/post_created.php
mod/forum/classes/event/post_deleted.php
mod/forum/classes/event/post_updated.php
mod/forum/classes/event/readtracking_disabled.php
mod/forum/classes/event/readtracking_enabled.php
mod/forum/classes/event/subscribers_viewed.php
mod/forum/classes/event/subscription_created.php
mod/forum/classes/event/subscription_deleted.php
mod/forum/classes/event/userreport_viewed.php
mod/forum/lib.php
mod/glossary/approve.php
mod/glossary/classes/event/category_created.php
mod/glossary/classes/event/category_deleted.php
mod/glossary/classes/event/category_updated.php
mod/glossary/classes/event/comment_created.php
mod/glossary/classes/event/comment_deleted.php
mod/glossary/classes/event/course_module_instance_list_viewed.php
mod/glossary/classes/event/course_module_viewed.php
mod/glossary/classes/event/entry_approved.php
mod/glossary/classes/event/entry_created.php
mod/glossary/classes/event/entry_deleted.php
mod/glossary/classes/event/entry_disapproved.php
mod/glossary/classes/event/entry_updated.php
mod/glossary/classes/event/entry_viewed.php
mod/glossary/classes/local/concept_cache.php [new file with mode: 0644]
mod/glossary/db/caches.php [new file with mode: 0644]
mod/glossary/db/events.php [new file with mode: 0644]
mod/glossary/deleteentry.php
mod/glossary/edit.php
mod/glossary/editcategories.php
mod/glossary/import.php
mod/glossary/lang/en/glossary.php
mod/glossary/lib.php
mod/glossary/tests/concept_cache_test.php [new file with mode: 0644]
mod/glossary/tests/generator/lib.php
mod/glossary/tests/generator_test.php
mod/glossary/version.php
mod/imscp/classes/event/course_module_instance_list_viewed.php
mod/imscp/classes/event/course_module_viewed.php
mod/imscp/lib.php
mod/label/lib.php
mod/lesson/classes/event/course_module_instance_list_viewed.php
mod/lesson/classes/event/course_module_viewed.php
mod/lesson/classes/event/essay_assessed.php
mod/lesson/classes/event/essay_attempt_viewed.php
mod/lesson/classes/event/highscore_added.php
mod/lesson/classes/event/highscores_viewed.php
mod/lesson/classes/event/lesson_ended.php
mod/lesson/classes/event/lesson_started.php
mod/lesson/lib.php
mod/lti/classes/event/course_module_instance_list_viewed.php
mod/lti/classes/event/course_module_viewed.php
mod/lti/classes/event/unknown_service_api_called.php
mod/page/classes/event/course_module_instance_list_viewed.php
mod/page/classes/event/course_module_viewed.php
mod/page/lib.php
mod/quiz/addrandom.php
mod/quiz/attempt.php
mod/quiz/classes/event/attempt_abandoned.php
mod/quiz/classes/event/attempt_becameoverdue.php
mod/quiz/classes/event/attempt_deleted.php [new file with mode: 0644]
mod/quiz/classes/event/attempt_preview_started.php [new file with mode: 0644]
mod/quiz/classes/event/attempt_reviewed.php [new file with mode: 0644]
mod/quiz/classes/event/attempt_started.php
mod/quiz/classes/event/attempt_submitted.php
mod/quiz/classes/event/attempt_summary_viewed.php [new file with mode: 0644]
mod/quiz/classes/event/attempt_viewed.php [new file with mode: 0644]
mod/quiz/classes/event/course_module_instance_list_viewed.php [new file with mode: 0644]
mod/quiz/classes/event/course_module_viewed.php [new file with mode: 0644]
mod/quiz/classes/event/edit_page_viewed.php [new file with mode: 0644]
mod/quiz/classes/event/group_override_created.php [new file with mode: 0644]
mod/quiz/classes/event/group_override_deleted.php [new file with mode: 0644]
mod/quiz/classes/event/group_override_updated.php [new file with mode: 0644]
mod/quiz/classes/event/question_manually_graded.php [new file with mode: 0644]
mod/quiz/classes/event/report_viewed.php [new file with mode: 0644]
mod/quiz/classes/event/user_override_created.php [new file with mode: 0644]
mod/quiz/classes/event/user_override_deleted.php [new file with mode: 0644]
mod/quiz/classes/event/user_override_updated.php [new file with mode: 0644]
mod/quiz/comment.php
mod/quiz/edit.php
mod/quiz/index.php
mod/quiz/lang/en/quiz.php
mod/quiz/lib.php
mod/quiz/locallib.php
mod/quiz/overridedelete.php
mod/quiz/overrideedit.php
mod/quiz/processattempt.php
mod/quiz/report.php
mod/quiz/report/attemptsreport.php
mod/quiz/report/statistics/tests/fixtures/questions03.csv [new file with mode: 0644]
mod/quiz/report/statistics/tests/fixtures/quizzes.csv
mod/quiz/report/statistics/tests/fixtures/responsecounts00.csv
mod/quiz/report/statistics/tests/fixtures/responsecounts03.csv [new file with mode: 0644]
mod/quiz/report/statistics/tests/fixtures/steps03.csv [new file with mode: 0644]
mod/quiz/review.php
mod/quiz/summary.php
mod/quiz/tests/events_test.php
mod/quiz/view.php
mod/resource/classes/event/course_module_instance_list_viewed.php
mod/resource/classes/event/course_module_viewed.php
mod/resource/lib.php
mod/scorm/classes/event/attempt_deleted.php
mod/scorm/classes/event/course_module_instance_list_viewed.php
mod/scorm/classes/event/course_module_viewed.php
mod/scorm/classes/event/interactions_viewed.php
mod/scorm/classes/event/report_viewed.php
mod/scorm/classes/event/sco_launched.php
mod/scorm/classes/event/tracks_viewed.php
mod/scorm/classes/event/user_report_viewed.php
mod/scorm/lib.php
mod/survey/classes/event/course_module_instance_list_viewed.php
mod/survey/classes/event/course_module_viewed.php
mod/survey/classes/event/report_downloaded.php
mod/survey/classes/event/report_viewed.php
mod/survey/classes/event/response_submitted.php
mod/survey/lib.php
mod/upgrade.txt
mod/url/classes/event/course_module_instance_list_viewed.php
mod/url/classes/event/course_module_viewed.php
mod/url/lib.php
mod/wiki/classes/event/comment_created.php
mod/wiki/classes/event/comment_deleted.php
mod/wiki/classes/event/comments_viewed.php
mod/wiki/classes/event/course_module_instance_list_viewed.php
mod/wiki/classes/event/course_module_viewed.php
mod/wiki/classes/event/page_created.php
mod/wiki/classes/event/page_deleted.php
mod/wiki/classes/event/page_diff_viewed.php
mod/wiki/classes/event/page_history_viewed.php
mod/wiki/classes/event/page_locks_deleted.php
mod/wiki/classes/event/page_map_viewed.php
mod/wiki/classes/event/page_updated.php
mod/wiki/classes/event/page_version_deleted.php
mod/wiki/classes/event/page_version_restored.php
mod/wiki/classes/event/page_version_viewed.php
mod/wiki/classes/event/page_viewed.php
mod/workshop/classes/event/assessable_uploaded.php
mod/workshop/classes/event/assessment_evaluated.php
mod/workshop/classes/event/assessment_evaluations_reset.php
mod/workshop/classes/event/assessment_reevaluated.php
mod/workshop/classes/event/assessments_reset.php
mod/workshop/classes/event/course_module_instance_list_viewed.php
mod/workshop/classes/event/course_module_viewed.php
mod/workshop/classes/event/phase_switched.php
mod/workshop/classes/event/submission_assessed.php
mod/workshop/classes/event/submission_created.php
mod/workshop/classes/event/submission_reassessed.php
mod/workshop/classes/event/submission_updated.php
mod/workshop/classes/event/submission_viewed.php
question/category_class.php
question/classes/statistics/questions/all_calculated_for_qubaid_condition.php
question/classes/statistics/questions/calculated.php
question/classes/statistics/questions/calculator.php
question/classes/statistics/responses/analysis_for_class.php
question/tests/events_test.php [new file with mode: 0644]
question/type/numerical/question.php
question/type/numerical/tests/question_test.php
report/completion/classes/event/report_viewed.php
report/completion/classes/event/user_report_viewed.php
report/log/classes/event/report_viewed.php
report/log/classes/event/user_report_viewed.php
report/log/graph.php
report/log/locallib.php
report/log/tests/behat/filter_log.feature
report/log/tests/behat/user_log.feature
report/log/user.php
report/loglive/classes/event/report_viewed.php
report/loglive/classes/table_log.php
report/loglive/tests/behat/loglive_report.feature
report/outline/classes/event/activity_viewed.php
report/outline/classes/event/outline_viewed.php
report/participation/classes/event/report_viewed.php
report/participation/index.php
report/participation/lang/en/report_participation.php
report/participation/locallib.php [new file with mode: 0644]
report/participation/tests/behat/filter_paticipation.feature [new file with mode: 0644]
report/stats/classes/event/report_viewed.php
report/stats/classes/event/user_report_viewed.php
repository/wikimedia/lib.php
tag/manage.php
theme/bootstrapbase/less/moodle/core.less
theme/bootstrapbase/less/moodle/responsive.less
theme/bootstrapbase/style/moodle.css
theme/styles.php
version.php

index 6fccec4..52d2d9d 100644 (file)
 
 defined('MOODLE_INTERNAL') || die();
 
+/**
+ * Install the plugin.
+ */
 function xmldb_tool_log_install() {
-    global $CFG;
+    global $CFG, $DB;
 
     $enabled = array();
 
-    // For now enable only the legacy logging, this keeps 100% BC.
+    // Add data to new log only from now on.
+    if (file_exists("$CFG->dirroot/$CFG->admin/tool/log/store/standard")) {
+        $enabled[] = 'logstore_standard';
+    }
+
+    // Enable legacy log reading, but only if there are existing data.
     if (file_exists("$CFG->dirroot/$CFG->admin/tool/log/store/legacy")) {
-        $enabled[] = 'logstore_legacy';
+        unset_config('loglegacy', 'logstore_legacy');
+        // Do not enabled legacy logging if somebody installed a new
+        // site and in less than one day upgraded to 2.7.
+        $params = array('yesterday' => time() - 60*60*24);
+        if ($DB->record_exists_select('log', "time < :yesterday", $params)) {
+            $enabled[] = 'logstore_legacy';
+        }
     }
 
     set_config('enabled_stores', implode(',', $enabled), 'tool_log');
diff --git a/admin/tool/log/db/upgrade.php b/admin/tool/log/db/upgrade.php
new file mode 100644 (file)
index 0000000..0dc0597
--- /dev/null
@@ -0,0 +1,47 @@
+<?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/>.
+
+/**
+ * Logging support.
+ *
+ * @package    tool_log
+ * @copyright  2014 Petr Skoda {@link http://skodak.org}
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Upgrade the plugin.
+ *
+ * @param int $oldversion
+ * @return bool always true
+ */
+function xmldb_tool_log_upgrade($oldversion) {
+    global $CFG, $DB, $OUTPUT;
+
+    $dbman = $DB->get_manager();
+
+    if ($oldversion < 2014040600) {
+        // Reset logging defaults in dev branches,
+        // in production upgrade the install.php is executed instead.
+        require_once(__DIR__ . '/install.php');
+        xmldb_tool_log_install();
+        upgrade_plugin_savepoint(true, 2014040600, 'tool', 'log');
+    }
+
+    return true;
+}
index 198e27a..f485cca 100644 (file)
@@ -22,6 +22,7 @@ defined('MOODLE_INTERNAL') || die();
  * Legacy log emulation event class.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2013 Petr Skoda {@link http://skodak.org}
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index d9ed97b..0a7149e 100644 (file)
@@ -27,7 +27,7 @@ defined('MOODLE_INTERNAL') || die();
 if ($hassiteconfig) {
     $settings->add(new admin_setting_configcheckbox('logstore_legacy/loglegacy',
         new lang_string('loglegacy', 'logstore_legacy'),
-        new lang_string('loglegacy_help', 'logstore_legacy'), 1));
+        new lang_string('loglegacy_help', 'logstore_legacy'), 0));
 
     $settings->add(new admin_setting_configcheckbox('logguests',
         new lang_string('logguests', 'admin'),
index 0838cd2..a70afc3 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2014011300; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires = 2014011000; // Requires this Moodle version.
+$plugin->version = 2014040600; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires = 2014040300; // Requires this Moodle version.
 $plugin->component = 'tool_log'; // Full name of the plugin (used for diagnostics).
index 67f02d6..777c46a 100644 (file)
@@ -43,7 +43,7 @@ class info_section extends info {
      * @param \section_info $section Section object
      */
     public function __construct(\section_info $section) {
-        parent::__construct(\get_course($section->course), $section->visible,
+        parent::__construct($section->modinfo->get_course(), $section->visible,
                 $section->availability);
         $this->section = $section;
     }
index db96870..5864f83 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * block_comments comment created event.
  *
  * @package    block_comments
+ * @since      Moodle 2.7
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index a347c0b..6e1214d 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * block_comments comment deleted event.
  *
  * @package    block_comments
+ * @since      Moodle 2.7
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index a1ddebb..016efd6 100644 (file)
@@ -17,7 +17,7 @@
 /**
  * This filter provides automatic linking to
  * glossary entries, aliases and categories when
- * found inside every Moodle text
+ * found inside every Moodle text.
  *
  * @package    filter
  * @subpackage glossary
 defined('MOODLE_INTERNAL') || die();
 
 /**
- * Glossary filtering
+ * Glossary linking filter class.
  *
- * TODO: erase the $GLOSSARY_EXCLUDECONCEPTS global => require format_text()
- *       to be able to pass arbitrary $options['filteroptions']['glossary'] to filter_text()
+ * NOTE: multilang glossary entries are not compatible with this filter.
  */
 class filter_glossary extends moodle_text_filter {
+    /** @var int $cachecourseid cache invalidation flag in case content from multiple courses displayed. */
+    protected $cachecourseid = null;
+    /** @var int $cacheuserid cache invalidation flag in case user is switched. */
+    protected $cacheuserid = null;
+    /** @var array $cacheconceptlist page level filter cache, this should be always faster than MUC */
+    protected $cacheconceptlist = null;
 
     public function setup($page, $context) {
         // This only requires execution once per request.
@@ -49,185 +54,100 @@ class filter_glossary extends moodle_text_filter {
     }
 
     public function filter($text, array $options = array()) {
-        global $CFG, $DB, $GLOSSARY_EXCLUDECONCEPTS;
-
-        // Trivial-cache - keyed on $cachedcontextid
-        static $cachedcontextid;
-        static $conceptlist;
-
-        static $nothingtodo;         // To avoid processing if no glossaries / concepts are found
+        global $CFG, $USER, $GLOSSARY_EXCLUDEENTRY;
 
         // Try to get current course.
         $coursectx = $this->context->get_course_context(false);
         if (!$coursectx) {
+            // Only global glossaries will be linked.
             $courseid = 0;
         } else {
             $courseid = $coursectx->instanceid;
         }
 
-        // Initialise/invalidate our trivial cache if dealing with a different context
-        if (!isset($cachedcontextid) || $cachedcontextid !== $this->context->id) {
-            $cachedcontextid = $this->context->id;
-            $conceptlist = array();
-            $nothingtodo = false;
-        }
-
-        if (($nothingtodo === true) || (!has_capability('mod/glossary:view', $this->context))) {
-            return $text;
+        if ($this->cachecourseid != $courseid or $this->cacheuserid != $USER->id) {
+            // Invalidate the page cache.
+            $this->cacheconceptlist = null;
         }
 
-        // Create a list of all the concepts to search for.  It may be cached already.
-        if (empty($conceptlist)) {
-
-            // Find all the glossaries we need to examine
-            if (!$glossaries = $DB->get_records_sql_menu('
-                    SELECT g.id, g.name
-                      FROM {glossary} g, {course_modules} cm, {modules} m
-                     WHERE m.name = \'glossary\'
-                       AND cm.module = m.id
-                       AND cm.visible = 1
-                       AND g.id = cm.instance
-                       AND g.usedynalink != 0
-                       AND (g.course = ? OR g.globalglossary = 1)
-                  ORDER BY g.globalglossary, g.id', array($courseid))) {
-                $nothingtodo = true;
+        if (is_array($this->cacheconceptlist) and empty($GLOSSARY_EXCLUDEENTRY)) {
+            if (empty($this->cacheconceptlist)) {
                 return $text;
             }
+            return filter_phrases($text, $this->cacheconceptlist);
+        }
 
-            // Make a list of glossary IDs for searching
-            $glossarylist = implode(',', array_keys($glossaries));
-
-            // Pull out all the raw data from the database for entries, categories and aliases
-            $entries = $DB->get_records_select('glossary_entries',
-                    'glossaryid IN ('.$glossarylist.') AND usedynalink != 0 AND approved != 0 ', null, '',
-                    'id,glossaryid, concept, casesensitive, 0 AS category, fullmatch');
-
-            $categories = $DB->get_records_select('glossary_categories',
-                    'glossaryid IN ('.$glossarylist.') AND usedynalink != 0', null, '',
-                    'id,glossaryid,name AS concept, 1 AS casesensitive, 1 AS category, 1 AS fullmatch');
-
-            $aliases = $DB->get_records_sql('
-                    SELECT ga.id, ge.id AS entryid, ge.glossaryid,
-                           ga.alias AS concept, ge.concept AS originalconcept,
-                           casesensitive, 0 AS category, fullmatch
-                      FROM {glossary_alias} ga,
-                           {glossary_entries} ge
-                      WHERE ga.entryid = ge.id
-                        AND ge.glossaryid IN ('.$glossarylist.')
-                        AND ge.usedynalink != 0
-                        AND ge.approved != 0', null);
-
-            // Combine them into one big list
-            $concepts = array();
-            if ($entries and $categories) {
-                $concepts = array_merge($entries, $categories);
-            } else if ($categories) {
-                $concepts = $categories;
-            } else if ($entries) {
-                $concepts = $entries;
-            }
-
-            if ($aliases) {
-                $concepts = array_merge($concepts, $aliases);
-            }
-
-            if (!empty($concepts)) {
-                foreach ($concepts as $key => $concept) {
-                    // Trim empty or unlinkable concepts
-                    $currentconcept = trim(strip_tags($concept->concept));
-
-                    // Concept must be HTML-escaped, so do the same as format_string
-                    // to turn ampersands into &amp;.
-                    $currentconcept = replace_ampersands_not_followed_by_entity($currentconcept);
-
-                    if (empty($currentconcept)) {
-                        unset($concepts[$key]);
-                        continue;
-                    } else {
-                        $concepts[$key]->concept = $currentconcept;
-                    }
-
-                    // Rule out any small integers.  See bug 1446
-                    $currentint = intval($currentconcept);
-                    if ($currentint && (strval($currentint) == $currentconcept) && $currentint < 1000) {
-                        unset($concepts[$key]);
-                    }
-                }
-            }
-
-            if (empty($concepts)) {
-                $nothingtodo = true;
-                return $text;
-            }
+        list($glossaries, $allconcepts) = \mod_glossary\local\concept_cache::get_concepts($courseid);
 
-            usort($concepts, 'filter_glossary::sort_entries_by_length');
+        if (!$allconcepts) {
+            $this->cacheuserid = $USER->id;
+            $this->cachecourseid = $courseid;
+            $this->cacheconcepts = array();
+            return $text;
+        }
 
-            $strcategory = get_string('category', 'glossary');
+        $strcategory = get_string('category', 'glossary');
 
-            // Loop through all the concepts, setting up our data structure for the filter
-            $conceptlist = array();    // We will store all the concepts here
+        $conceptlist = array();
+        $excluded = false;
 
+        foreach ($allconcepts as $concepts) {
             foreach ($concepts as $concept) {
-                $glossaryname = str_replace(':', '-', $glossaries[$concept->glossaryid]);
-                if ($concept->category) {       // Link to a category
-                    // TODO: Fix this string usage
-                    $title = strip_tags($glossaryname.': '.$strcategory.' '.$concept->concept);
-                    $href_tag_begin = '<a class="glossary autolink category glossaryid'.$concept->glossaryid.'" title="'.$title.'" '.
-                                      'href="'.$CFG->wwwroot.'/mod/glossary/view.php?g='.$concept->glossaryid.
-                                      '&amp;mode=cat&amp;hook='.$concept->id.'">';
+                if (!empty($GLOSSARY_EXCLUDEENTRY) and $concept->id == $GLOSSARY_EXCLUDEENTRY) {
+                    $excluded = true;
+                    continue;
+                }
+                if ($concept->category) { // Link to a category.
+                    // TODO: Fix this string usage.
+                    $title = $glossaries[$concept->glossaryid] . ': ' . $strcategory . ' ' . $concept->concept;
+                    $link = new moodle_url('/mod/glossary/view.php', array('g' => $concept->glossaryid, 'mode' => 'cat', 'hook' => $concept->id));
+                    $attributes = array(
+                        'href'  => $link,
+                        'title' => $title,
+                        'class' => 'glossary autolink category glossaryid' . $concept->glossaryid);
+
                 } else { // Link to entry or alias
-                    if (!empty($concept->originalconcept)) {  // We are dealing with an alias (so show and point to original)
-                        $title = str_replace('"', "'", html_entity_decode(
-                                strip_tags($glossaryname.': '.$concept->originalconcept)));
-                        $concept->id = $concept->entryid;
-                    } else { // This is an entry
-                        // We need to remove entities from the content here because it
-                        // will be escaped by html_writer below.
-                        $title = str_replace('"', "'", html_entity_decode(
-                                strip_tags($glossaryname.': '.$concept->concept)));
-                    }
-                    // hardcoding dictionary format in the URL rather than defaulting
+                    $title = $glossaries[$concept->glossaryid] . ': ' . $concept->concept;
+                    // Hardcoding dictionary format in the URL rather than defaulting
                     // to the current glossary format which may not work in a popup.
                     // for example "entry list" means the popup would only contain
                     // a link that opens another popup.
-                    $link = new moodle_url('/mod/glossary/showentry.php', array('courseid'=>$courseid, 'eid'=>$concept->id, 'displayformat'=>'dictionary'));
+                    $link = new moodle_url('/mod/glossary/showentry.php', array('eid' => $concept->id, 'displayformat' => 'dictionary'));
                     $attributes = array(
-                        'href' => $link,
-                        'title'=> $title,
-                        'class'=> 'glossary autolink concept glossaryid'.$concept->glossaryid);
-
-                    // this flag is optionally set by resource_pluginfile()
-                    // if processing an embedded file use target to prevent getting nested Moodles
-                    if (isset($CFG->embeddedsoforcelinktarget) && $CFG->embeddedsoforcelinktarget) {
-                        $attributes['target'] = '_top';
-                    }
-
-                    $href_tag_begin = html_writer::start_tag('a', $attributes);
+                        'href'  => $link,
+                        'title' => str_replace('&amp;', '&', $title), // Undo the s() mangling.
+                        'class' => 'glossary autolink concept glossaryid' . $concept->glossaryid);
                 }
+                // This flag is optionally set by resource_pluginfile()
+                // if processing an embedded file use target to prevent getting nested Moodles.
+                if (!empty($CFG->embeddedsoforcelinktarget)) {
+                    $attributes['target'] = '_top';
+                }
+                $href_tag_begin = html_writer::start_tag('a', $attributes);
+
                 $conceptlist[] = new filterobject($concept->concept, $href_tag_begin, '</a>',
                     $concept->casesensitive, $concept->fullmatch);
             }
-
-            $conceptlist = filter_remove_duplicates($conceptlist);
         }
 
-        if (!empty($GLOSSARY_EXCLUDECONCEPTS)) {
-            $reducedconceptlist=array();
-            foreach($conceptlist as $concept) {
-                if(!in_array($concept->phrase,$GLOSSARY_EXCLUDECONCEPTS)) {
-                    $reducedconceptlist[]=$concept;
-                }
-            }
-            return filter_phrases($text, $reducedconceptlist);
+        usort($conceptlist, 'filter_glossary::sort_entries_by_length');
+
+        if (!$excluded) {
+            // Do not cache the excluded list here, it is used once per page only.
+            $this->cacheuserid = $USER->id;
+            $this->cachecourseid = $courseid;
+            $this->cacheconceptlist = $conceptlist;
         }
 
+        if (empty($conceptlist)) {
+            return $text;
+        }
         return filter_phrases($text, $conceptlist);   // Actually search for concepts!
     }
 
-
     private static function sort_entries_by_length($entry0, $entry1) {
-        $len0 = strlen($entry0->concept);
-        $len1 = strlen($entry1->concept);
+        $len0 = strlen($entry0->phrase);
+        $len1 = strlen($entry1->phrase);
 
         if ($len0 < $len1) {
             return 1;
index c8f3966..ccf54ed 100644 (file)
@@ -53,18 +53,22 @@ class filter_glossary_filter_testcase extends advanced_testcase {
                 array('course' => $course->id, 'mainglossary' => 1));
 
         // Create two entries with ampersands and one normal entry.
+        /** @var mod_glossary_generator $generator */
         $generator = $this->getDataGenerator()->get_plugin_generator('mod_glossary');
         $normal = $generator->create_content($glossary, array('concept' => 'normal'));
         $amp1 = $generator->create_content($glossary, array('concept' => 'A&B'));
         $amp2 = $generator->create_content($glossary, array('concept' => 'C&amp;D'));
 
+        filter_manager::reset_caches();
+        \mod_glossary\local\concept_cache::reset_caches();
+
         // Format text with all three entries in HTML.
         $html = '<p>A&amp;B C&amp;D normal</p>';
         $filtered = format_text($html, FORMAT_HTML, array('context' => $context));
 
         // Find all the glossary links in the result.
         $matches = array();
-        preg_match_all('~courseid=' . $course->id . '&amp;eid=([0-9]+).*?title="(.*?)"~', $filtered, $matches);
+        preg_match_all('~eid=([0-9]+).*?title="(.*?)"~', $filtered, $matches);
 
         // There should be 3 glossary links.
         $this->assertEquals(3, count($matches[1]));
index 9d099fb..d20d57f 100644 (file)
@@ -25,8 +25,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version  = 2013110500;
-$plugin->requires = 2013110500;  // Requires this Moodle version
+$plugin->version  = 2014040600;
+$plugin->requires = 2014040300;  // Requires this Moodle version
 $plugin->component= 'filter_glossary';
 
-$plugin->dependencies = array('mod_glossary' => 2013110500);
+$plugin->dependencies = array('mod_glossary' => 2014040600);
index 6e593f3..05eae5d 100644 (file)
@@ -114,7 +114,11 @@ class filter_tex extends moodle_text_filter {
         global $CFG, $DB;
 
         /// Do a quick check using stripos to avoid unnecessary work
-        if (!preg_match('/<tex/i',$text) and !strstr($text,'$$') and !strstr($text,'\\[') and !preg_match('/\[tex/i',$text)) { //added one more tag (dlnsk)
+        if ((!preg_match('/<tex/i', $text)) &&
+                (strpos($text,'$$') === false) &&
+                (strpos($text,'\\[') === false) &&
+                (strpos($text, '\\(') === false) &&
+                (!preg_match('/\[tex/i',$text))) {
             return $text;
         }
 
@@ -146,9 +150,20 @@ class filter_tex extends moodle_text_filter {
         // or $$ TeX expression $$
         // or \[ TeX expression \]          // original tag of MathType and TeXaide (dlnsk)
         // or [tex] TeX expression [/tex]   // somtime it's more comfortable than <tex> (dlnsk)
-        preg_match_all('/<tex(?:\s+alt=["\'](.*?)["\'])?>(.+?)<\/tex>|\$\$(.+?)\$\$|\\\\\[(.+?)\\\\\]|\\[tex\\](.+?)\\[\/tex\\]/is', $text, $matches);
+        $rules = array(
+            '<tex(?:\s+alt=["\'](.*?)["\'])?>(.+?)<\/tex>',
+            '\$\$(.+?)\$\$',
+            '\\\\\[(.+?)\\\\\]',
+            '\\\\\((.+?)\\\\\)',
+            '\\[tex\\](.+?)\\[\/tex\\]'
+        );
+        $megarule = '/' . implode($rules, '|') . '/is';
+        preg_match_all($megarule, $text, $matches);
         for ($i=0; $i<count($matches[0]); $i++) {
-            $texexp = $matches[2][$i] . $matches[3][$i] . $matches[4][$i] . $matches[5][$i];
+            $texexp = '';
+            for ($j = 0; $j < count($rules); $j++) {
+                $texexp .= $matches[$j + 2][$i];
+            }
             $alt = $matches[1][$i];
             $texexp = str_replace('<nolink>','',$texexp);
             $texexp = str_replace('</nolink>','',$texexp);
diff --git a/filter/tex/tests/filter_test.php b/filter/tex/tests/filter_test.php
new file mode 100644 (file)
index 0000000..1b03725
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Unit test for the filter_tex
+ *
+ * @package    filter_tex
+ * @copyright  2014 Damyon Wiese
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+global $CFG;
+require_once($CFG->dirroot . '/filter/tex/filter.php');
+
+
+/**
+ * Unit tests for filter_tex.
+ *
+ * Test the delimiter parsing used by the tex filter.
+ *
+ * @copyright  2014 Damyon Wiese
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class filter_tex_testcase extends advanced_testcase {
+
+    protected $filter;
+
+    protected function setUp() {
+        parent::setUp();
+        $this->resetAfterTest(true);
+        $this->filter = new filter_tex(context_system::instance(), array());
+    }
+
+    function run_with_delimiters($start, $end, $filtershouldrun) {
+        $pre = 'Some pre text';
+        $post = 'Some post text';
+        $equation = ' \sum{a^b} ';
+
+        $before = $pre . $start . $equation . $end . $post;
+
+        $after = trim($this->filter->filter($before));
+
+        if ($filtershouldrun) {
+            $this->assertNotEquals($after, $before);
+        } else {
+            $this->assertEquals($after, $before);
+        }
+    }
+
+    function test_delimiters() {
+        // First test the list of supported delimiters.
+        $this->run_with_delimiters('$$', '$$', true);
+        $this->run_with_delimiters('\\(', '\\)', true);
+        $this->run_with_delimiters('\\[', '\\]', true);
+        $this->run_with_delimiters('[tex]', '[/tex]', true);
+        $this->run_with_delimiters('<tex>', '</tex>', true);
+        $this->run_with_delimiters('<tex alt="nonsense">', '</tex>', true);
+        // Now test some cases that shouldn't be executed.
+        $this->run_with_delimiters('<textarea>', '</textarea>', false);
+        $this->run_with_delimiters('$', '$', false);
+        $this->run_with_delimiters('(', ')', false);
+        $this->run_with_delimiters('[', ']', false);
+        $this->run_with_delimiters('$$', '\\]', false);
+    }
+
+}
index 7a9a9fe..2d58506 100644 (file)
@@ -38,7 +38,7 @@ $string['clitypevalue'] = 'Wert eingeben';
 $string['clitypevaluedefault'] = 'Wert eingeben oder Standardwert benutzen ({$a})';
 $string['cliunknowoption'] = 'Nicht erkannte Optionen:
   {$a}
-Hilfe wird über die Option -help angezeigt.';
+Hilfe wird über die Option --help angezeigt.';
 $string['cliyesnoprompt'] = 'y (yes=ja) oder n (no=nein) eingeben';
 $string['environmentrequireinstall'] = 'muss installiert und aktiviert sein';
 $string['environmentrequireversion'] = 'Version {$a->needed} ist erforderlich - aktuell ist {$a->current} installiert.';
diff --git a/install/lang/en_us/admin.php b/install/lang/en_us/admin.php
new file mode 100644 (file)
index 0000000..e321f9d
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Automatically generated strings for Moodle installer
+ *
+ * Do not edit this file manually! It contains just a subset of strings
+ * needed during the very first steps of installation. This file was
+ * generated automatically by export-installer.php (which is part of AMOS
+ * {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
+ * list of strings defined in /install/stringnames.txt.
+ *
+ * @package   installer
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$string['cliunknowoption'] = 'Unrecognized options:
+  {$a}
+Please use --help option.';
index 3a83b60..a1db518 100644 (file)
@@ -46,7 +46,7 @@ $string['dbprefix'] = 'Prefisso tabelle';
 $string['dirroot'] = 'Cartella di Moodle';
 $string['environmenthead'] = 'Verifica dell\'ambiente...';
 $string['environmentsub2'] = 'Ciascuna release di Moodle prevede come requisito minimo una data versione del PHP ed una serie di estensioni. Prima di una installazione o di un aggiornamento viene eseguita la verifica dei requisiti minimi. Se non sai come installare nuove versioni del PHP o le sue estensioni, contatta l\'amministratore del tuo server.';
-$string['errorsinenvironment'] = 'Ci sono problemi nel vostro ambiente';
+$string['errorsinenvironment'] = 'Sono stati riscontarti problemi nel tuo ambiente';
 $string['installation'] = 'Installazione';
 $string['langdownloaderror'] = 'Purtroppo non è stato possibile scaricare la lingua "{$a}". L\'installazione proseguirà in lingua Inglese.';
 $string['memorylimithelp'] = '<p>Il limite di memoria assegnata al PHP attualmente è {$a}.</p>
@@ -57,10 +57,10 @@ $string['memorylimithelp'] = '<p>Il limite di memoria assegnata al PHP attualmen
 <ol>
 <li>Se possibile, ricompila il PHP con l\'opzione <i>--enable-memory-limit</i>.
 Questo consentirà a Moodle di impostare in autonomia il limite di memoria.</li>
-<li>Se hai accesso al file php.ini, è possibile modificare la variabile <b>memory_limit</b> a un valore più alto, ad esempio 40M. Se non hai accesso, potete chiedere al vostro amministratore di sistema di farlo.</li>
+<li>Se hai accesso al file php.ini, è possibile modificare la variabile <b>memory_limit</b> a un valore più alto, ad esempio 40M. Se non hai accesso, puoi chiedere all\'amministratore di sistema di farlo.</li>
 <li>Su alcuni server con il PHP è possibile creare un file .htaccess nella cartella di Moodle contenente questa linea:
 <blockquote>php_value memory_limit 40M</blockquote>
-<p>Tuttavia, su alcuni server la direttiva potrebbe impedire  a <b>tutte</b> le pagine PHP di funzionare (apapriranno degli erorri durante la visualizzazione delle pagine), in tal caso dovrai rimuovere il file .htaccess.</li></ol>';
+<p>Tuttavia, su alcuni server la direttiva potrebbe impedire a <b>tutte</b> le pagine PHP di funzionare (appariranno degli errori durante la visualizzazione delle pagine), in tal caso dovrai rimuovere il file .htaccess.</li></ol>';
 $string['paths'] = 'Percorsi';
 $string['pathserrcreatedataroot'] = 'Lo script di installazione non ha potuto creare la Cartella dei dati ({$a->dataroot}).';
 $string['pathshead'] = 'Conferma percorsi';
diff --git a/install/lang/kl/moodle.php b/install/lang/kl/moodle.php
new file mode 100644 (file)
index 0000000..35e5a8a
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Automatically generated strings for Moodle installer
+ *
+ * Do not edit this file manually! It contains just a subset of strings
+ * needed during the very first steps of installation. This file was
+ * generated automatically by export-installer.php (which is part of AMOS
+ * {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
+ * list of strings defined in /install/stringnames.txt.
+ *
+ * @package   installer
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$string['language'] = 'Oqaaseq';
+$string['next'] = 'Tullia';
diff --git a/install/lang/lt/error.php b/install/lang/lt/error.php
new file mode 100644 (file)
index 0000000..db7d451
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Automatically generated strings for Moodle installer
+ *
+ * Do not edit this file manually! It contains just a subset of strings
+ * needed during the very first steps of installation. This file was
+ * generated automatically by export-installer.php (which is part of AMOS
+ * {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
+ * list of strings defined in /install/stringnames.txt.
+ *
+ * @package   installer
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$string['cannotcreatelangdir'] = 'Negalima sukurti kalbos katalogo';
+$string['cannotcreatetempdir'] = 'Negalima sukurti laikinojo katalogo';
+$string['cannotdownloadcomponents'] = 'Negalima atsisiųsti komponentų';
+$string['cannotdownloadzipfile'] = 'Negalima atsisiųsti ZIP failo';
diff --git a/install/lang/mn_mong/langconfig.php b/install/lang/mn_mong/langconfig.php
new file mode 100644 (file)
index 0000000..7b9131a
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Automatically generated strings for Moodle installer
+ *
+ * Do not edit this file manually! It contains just a subset of strings
+ * needed during the very first steps of installation. This file was
+ * generated automatically by export-installer.php (which is part of AMOS
+ * {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
+ * list of strings defined in /install/stringnames.txt.
+ *
+ * @package   installer
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$string['thislanguage'] = 'Mongolian';
index c3103ca..91a63b4 100644 (file)
@@ -30,6 +30,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$string['parentlanguage'] = 'Arved språk';
+$string['parentlanguage'] = '';
 $string['thisdirection'] = 'ltr';
 $string['thislanguage'] = 'Norsk - bokmål';
index 916abb7..d09245d 100644 (file)
@@ -739,6 +739,7 @@ $string['eventcoursesectionupdated'] = ' Course section updated';
 $string['eventcoursemoduleinstancelistviewed'] = 'Course module instance list viewed';
 $string['eventemailfailed'] = 'Email failed to send';
 $string['eventname'] = 'Event name';
+$string['eventunknownlogged'] = 'Unknown event';
 $string['eventusercreated'] = 'User created';
 $string['eventuserdeleted'] = 'User deleted';
 $string['eventuserlistviewed'] = 'User list viewed';
index b1f6385..63ef294 100644 (file)
@@ -137,6 +137,7 @@ $string['errorprocess'] = 'Error occurred during processing!';
 $string['errorprocessingresponses'] = 'An error occurred while processing your responses ({$a}). Click continue to return to the page you were on and try again.';
 $string['errorsavingcomment'] = 'Error saving the comment for question {$a->name} in the database.';
 $string['errorupdatingattempt'] = 'Error updating attempt {$a->id} in the database.';
+$string['eventquestioncategorycreated'] = 'Question category created';
 $string['exportcategory'] = 'Export category';
 $string['exportcategory_help'] = 'This setting determines the category from which the exported questions will be taken.
 
index 6b4bf6e..62752af 100644 (file)
@@ -37,6 +37,7 @@ defined('MOODLE_INTERNAL') || die();
  * Both events could be triggered in a row, first the uploaded, then the submitted.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 972195c..64fdabe 100644 (file)
@@ -44,6 +44,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 33870ce..e0034bd 100644 (file)
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * All other event classes must extend this class.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Petr Skoda {@link http://skodak.org}
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  *
@@ -338,7 +339,7 @@ abstract class base implements \IteratorAggregate {
         }
 
         if (!class_exists($classname)) {
-            return false;
+            return self::restore_unknown($data, $logextra);
         }
         $event = new $classname();
         if (!($event instanceof \core\event\base)) {
@@ -370,6 +371,27 @@ abstract class base implements \IteratorAggregate {
         return $event;
     }
 
+    /**
+     * Restore unknown event.
+     *
+     * @param array $data
+     * @param array $logextra
+     * @return unknown_logged
+     */
+    protected static final function restore_unknown(array $data, array $logextra) {
+        $classname = '\core\event\unknown_logged';
+
+        /** @var unknown_logged $event */
+        $event = new $classname();
+        $event->restored = true;
+        $event->triggered = true;
+        $event->dispatched = true;
+        $event->data = $data;
+        $event->logextra = $logextra;
+
+        return $event;
+    }
+
     /**
      * Create fake event from legacy log data.
      *
index 28c03c1..495a643 100644 (file)
@@ -39,6 +39,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2013 onwards Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 1ac2850..3bd1005 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * blog comment created event.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index cf8e7da..4e07272 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * blog comment deleted event.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 6da91bb..a22092d 100644 (file)
@@ -36,6 +36,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2013 onwards Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 1b3f6b1..c476189 100644 (file)
@@ -21,7 +21,7 @@ defined('MOODLE_INTERNAL') || die();
 /**
  * Event for when a new blog entry is added..
  *
- * @package    core_blog
+ * @package    core
  * @copyright  2013 Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -31,7 +31,8 @@ defined('MOODLE_INTERNAL') || die();
  *
  * Class for event to be triggered when a blog entry is created.
  *
- * @package    core_blog
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 467d811..e2acde8 100644 (file)
@@ -16,7 +16,7 @@
 /**
  * Event for when a new blog entry is deleted.
  *
- * @package    core_blog
+ * @package    core
  * @copyright  2013 Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -29,7 +29,8 @@ defined('MOODLE_INTERNAL') || die();
  *
  * Event for when a new blog entry is deleted.
  *
- * @package    core_blog
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index ff9686b..dcfec20 100644 (file)
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * Event to be triggered when a blog entry is updated.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index b9b83a6..9dceaca 100644 (file)
@@ -35,6 +35,7 @@ defined('MOODLE_INTERNAL') || die();
  *     -int repeatid: Id of the parent event if present, else 0.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 onwards Ankit Agarwal <ankit.agrr@gmail.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 329aed5..296ad68 100644 (file)
@@ -35,6 +35,7 @@ defined('MOODLE_INTERNAL') || die();
  *     -int repeatid: Id of the parent event if present, else 0.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 onwards Ankit Agarwal <ankit.agrr@gmail.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index ffab5b9..6226502 100644 (file)
@@ -35,6 +35,7 @@ defined('MOODLE_INTERNAL') || die();
  *     -int repeatid: Id of the parent event if present, else 0.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 onwards Ankit Agarwal <ankit.agrr@gmail.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index cfe435d..ee748e4 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * Cohort created event class.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Dan Poltawski <dan@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index ccc2ccd..4b9c520 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * Cohort deleted event class.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Dan Poltawski <dan@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 8dc153d..a32c341 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * User added to a cohort event class.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Dan Poltawski <dan@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index e42868a..6145fa2 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * User removed from a cohort event class.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Dan Poltawski <dan@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 7ee1226..e023643 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * Cohort updated event class.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Dan Poltawski <dan@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 2e18f69..539bfc4 100644 (file)
@@ -38,6 +38,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index be04218..de7829f 100644 (file)
@@ -38,6 +38,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index fbea09d..4964ee4 100644 (file)
@@ -32,6 +32,7 @@ defined('MOODLE_INTERNAL') || die();
  * This class has to be extended by any event which is triggred while viewing comment.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 797ad37..9f7ab5f 100644 (file)
@@ -37,6 +37,7 @@ debugging('core\event\content_viewed has been deprecated. Please extend base eve
  * This class has been deprecated, please extend base event or other relevent abstract class.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Ankit Agarwal
  * @deprecated since Moodle 2.7
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
index c131f27..4e60ffc 100644 (file)
@@ -22,6 +22,7 @@ defined('MOODLE_INTERNAL') || die();
  * Course category created event.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 63333b4..e14dc68 100644 (file)
@@ -28,6 +28,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 2cb7739..d12bbaa 100644 (file)
@@ -22,6 +22,7 @@ defined('MOODLE_INTERNAL') || die();
  * Course category updated event.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 300bcdc..05a43ee 100644 (file)
@@ -21,7 +21,8 @@ defined('MOODLE_INTERNAL') || die();
 /**
  * Event when course completed.
  *
- * @package    core_event
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 9ffa4f6..d687080 100644 (file)
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * Event when course module completion is updated.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 05a59d1..fe64a58 100644 (file)
@@ -28,6 +28,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 93e6bab..16fee48 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 357b9cd..fc999d5 100644 (file)
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 6233bfb..88d8067 100644 (file)
@@ -22,6 +22,7 @@ defined('MOODLE_INTERNAL') || die();
  * Event when course module completion is updated.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index c73f711..fd0aebb 100644 (file)
@@ -39,6 +39,7 @@ defined('MOODLE_INTERNAL') || die();
  * Class for event to be triggered when a new course module is created.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
  */
index 82d01d1..fa539d6 100644 (file)
@@ -38,6 +38,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
  */
index 87c222a..f4a5782 100644 (file)
@@ -37,6 +37,7 @@ defined('MOODLE_INTERNAL') || die();
  *     \mod_chat\event\course_module_instance_list_viewed extends \core\event\course_module_instance_list_viewed
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2013 onwards Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index a7c2df1..6534c5c 100644 (file)
@@ -32,6 +32,7 @@ defined('MOODLE_INTERNAL') || die();
  *
  * @deprecated Since Moodle 2.7
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index e1069d6..976987b 100644 (file)
@@ -39,6 +39,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
  */
index 9f9b654..4c88c4b 100644 (file)
@@ -31,6 +31,7 @@ defined('MOODLE_INTERNAL') || die();
  * Class for event to be triggered when a course module is viewed.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2013 onwards Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 02aa67c..f3191d2 100644 (file)
@@ -35,6 +35,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 91531ef..59c6abe 100644 (file)
@@ -35,6 +35,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 24e046a..cae5e3a 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * Event for viewing the list of course resources.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Marina Glancy
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 02a9dd2..8858f4b 100644 (file)
@@ -32,6 +32,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index bec63f3..dd92950 100644 (file)
@@ -36,6 +36,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index a7d8bc3..9d3be66 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index d0220da..90830ab 100644 (file)
@@ -22,6 +22,7 @@ defined('MOODLE_INTERNAL') || die();
  * Email failed event.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2013 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index ff92010..a9faa24 100644 (file)
@@ -15,9 +15,9 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * core_group created event.
+ * Group created event.
  *
- * @package    core_group
+ * @package    core
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -26,9 +26,10 @@ namespace core\event;
 defined('MOODLE_INTERNAL') || die();
 
 /**
- * core_group created event class.
+ * Group created event class.
  *
- * @package    core_group
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index e1cfca4..f1879fb 100644 (file)
@@ -15,9 +15,9 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * core_group deleted event.
+ * Group deleted event.
  *
- * @package    core_group
+ * @package    core
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -26,9 +26,10 @@ namespace core\event;
 defined('MOODLE_INTERNAL') || die();
 
 /**
- * core_group deleted event class.
+ * Group deleted event class.
  *
- * @package    core_group
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index a248f91..674fd7e 100644 (file)
@@ -15,9 +15,9 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * core_group member added event.
+ * Group member added event.
  *
- * @package    core_group
+ * @package    core
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -26,7 +26,7 @@ namespace core\event;
 defined('MOODLE_INTERNAL') || die();
 
 /**
- * core_group member added event class.
+ * Group member added event class.
  *
  * @property-read array $other {
  *      Extra information about event.
@@ -35,7 +35,8 @@ defined('MOODLE_INTERNAL') || die();
  *      @type int itemid id of item.
  * }
  *
- * @package    core_group
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 8557359..3842a41 100644 (file)
@@ -15,9 +15,9 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * core_group member removed event.
+ * Group member removed event.
  *
- * @package    core_group
+ * @package    core
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -26,9 +26,10 @@ namespace core\event;
 defined('MOODLE_INTERNAL') || die();
 
 /**
- * core_group member removed event class.
+ * Group member removed event class.
  *
- * @package    core_group
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 4b03799..e5d61f9 100644 (file)
@@ -15,7 +15,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * core_group updated event.
+ * Group updated event.
  *
  * @package    core_group
  * @copyright  2013 Frédéric Massart
@@ -26,9 +26,10 @@ namespace core\event;
 defined('MOODLE_INTERNAL') || die();
 
 /**
- * core_group updated event class.
+ * Group updated event class.
  *
- * @package    core_group
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index b4ecb1a..e5a00e3 100644 (file)
@@ -15,7 +15,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * core_group grouping created event.
+ * Grouping created event.
  *
  * @package    core_group
  * @copyright  2013 Frédéric Massart
@@ -26,9 +26,10 @@ namespace core\event;
 defined('MOODLE_INTERNAL') || die();
 
 /**
- * core_group grouping created event class.
+ * Grouping created event class.
  *
- * @package    core_group
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 3603be9..a3d0efc 100644 (file)
@@ -15,9 +15,9 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * core_group grouping deleted event.
+ * Grouping deleted event.
  *
- * @package    core_group
+ * @package    core
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -26,9 +26,10 @@ namespace core\event;
 defined('MOODLE_INTERNAL') || die();
 
 /**
- * core_group grouping deleted event class.
+ * Grouping deleted event class.
  *
- * @package    core_group
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 4e351dd..2dfca36 100644 (file)
@@ -15,9 +15,9 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * core_group grouping updated event.
+ * Grouping updated event.
  *
- * @package    core_group
+ * @package    core
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -26,9 +26,10 @@ namespace core\event;
 defined('MOODLE_INTERNAL') || die();
 
 /**
- * core_group grouping updated event class.
+ * Grouping updated event class.
  *
- * @package    core_group
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 7ad49fb..1eb4996 100644 (file)
@@ -28,6 +28,7 @@
  * }
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 4967536..da60d86 100644 (file)
@@ -28,6 +28,7 @@
  * }
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 738bb7d..879b4a6 100644 (file)
@@ -22,6 +22,7 @@ defined('MOODLE_INTERNAL') || die();
  * New event manager class.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Petr Skoda {@link http://skodak.org}
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 6ea7dd8..5d2c94e 100644 (file)
@@ -18,6 +18,7 @@
  * Message contact added event class.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 3d79fbd..6b1cdf6 100644 (file)
@@ -18,6 +18,7 @@
  * Message contact blocked event class.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 78c0d04..2ca36ea 100644 (file)
@@ -18,6 +18,7 @@
  * Message contact removed event class.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 2475511..c931462 100644 (file)
@@ -18,6 +18,7 @@
  * Message contact unblocked event class.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 664f2f2..3ed0a5f 100644 (file)
@@ -24,6 +24,7 @@
  * }
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 3aad156..2240fcf 100644 (file)
@@ -24,6 +24,7 @@
  * }
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index cf9cb13..56b70c4 100644 (file)
@@ -18,6 +18,7 @@
  * Mnet access control created event class.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2013 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 79ac0ec..b2badfa 100644 (file)
@@ -18,6 +18,7 @@
  * Mnet access control updated event class.
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2013 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index e4a804b..fe2f208 100644 (file)
@@ -38,6 +38,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index bf15884..53403b7 100644 (file)
@@ -38,6 +38,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 54c8fb3..79cc5aa 100644 (file)
@@ -38,6 +38,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 5765111..58a688e 100644 (file)
@@ -32,6 +32,7 @@ defined('MOODLE_INTERNAL') || die();
  * Class for event to be triggered when a note is viewed.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Ankit Agarwal
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
diff --git a/lib/classes/event/question_category_created.php b/lib/classes/event/question_category_created.php
new file mode 100644 (file)
index 0000000..a620065
--- /dev/null
@@ -0,0 +1,80 @@
+<?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/>.
+
+/**
+ * Question category created event class.
+ *
+ * @package    core
+ * @since      Moodle 2.7
+ * @copyright  2014 Mark Nelson <markn@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+namespace core\event;
+
+defined('MOODLE_INTERNAL') || die();
+
+class question_category_created extends base {
+
+    /**
+     * Init method.
+     */
+    protected function init() {
+        $this->data['objecttable'] = 'question_categories';
+        $this->data['crud'] = 'c';
+        $this->data['edulevel'] = self::LEVEL_TEACHING;
+    }
+
+    /**
+     * Returns localised general event name.
+     *
+     * @return string
+     */
+    public static function get_name() {
+        return get_string('eventquestioncategorycreated', 'question');
+    }
+
+    /**
+     * Returns description of what happened.
+     *
+     * @return string
+     */
+    public function get_description() {
+        return 'A question category with the id of ' . $this->objectid . ' was created by a user with the id ' . $this->userid;
+    }
+
+    /**
+     * Returns relevant URL.
+     *
+     * @return \moodle_url
+     */
+    public function get_url() {
+        if ($this->contextlevel == CONTEXT_MODULE) {
+            return new \moodle_url('/question/category.php', array('cmid' => $this->contextinstanceid));
+        } else {
+            return new \moodle_url('/question/category.php', array('courseid' => $this->courseid));
+        }
+    }
+
+    /**
+     * Return the legacy event log data.
+     *
+     * @return array
+     */
+    protected function get_legacy_logdata() {
+        return array($this->courseid, 'quiz', 'addcategory', 'view.php?id=' . $this->contextinstanceid,
+            $this->objectid, $this->contextinstanceid);
+    }
+}
index b5f2dd1..50b9475 100644 (file)
@@ -21,7 +21,8 @@ defined('MOODLE_INTERNAL') || die();
 /**
  * Event when role allow assignments is updated.
  *
- * @package    core_event
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 9451cfa..3e3c6ac 100644 (file)
@@ -21,7 +21,8 @@ defined('MOODLE_INTERNAL') || die();
 /**
  * Event when role allow override is updated.
  *
- * @package    core_event
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 7b96dde..0d03614 100644 (file)
@@ -21,7 +21,8 @@ defined('MOODLE_INTERNAL') || die();
 /**
  * Event when role allow switch is updated.
  *
- * @package    core_event
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index cad0a1b..79b5639 100644 (file)
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Petr Skoda {@link http://skodak.org}
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 9347479..5c65f95 100644 (file)
@@ -21,7 +21,8 @@ defined('MOODLE_INTERNAL') || die();
 /**
  * Role updated event.
  *
- * @package    core_event
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index de3e963..9a52582 100644 (file)
@@ -29,7 +29,8 @@ defined('MOODLE_INTERNAL') || die();
  *      @type string archetype role type.
  * }
  *
- * @package    core_event
+ * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 4521ab3..4a0908f 100644 (file)
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Petr Skoda {@link http://skodak.org}
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 9b6e9ac..a94c78b 100644 (file)
@@ -25,6 +25,7 @@
  * }
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 55c1356..6077b8a 100644 (file)
@@ -25,6 +25,7 @@
  * }
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 18adc67..5c4b8fc 100644 (file)
@@ -25,6 +25,7 @@
  * }
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 6acc93c..70e2518 100644 (file)
@@ -25,6 +25,7 @@
  * }
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 8381097..a2059a5 100644 (file)
@@ -25,6 +25,7 @@
  * }
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
diff --git a/lib/classes/event/unknown_logged.php b/lib/classes/event/unknown_logged.php
new file mode 100644 (file)
index 0000000..a0e7544
--- /dev/null
@@ -0,0 +1,41 @@
+<?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/>.
+
+namespace core\event;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Unknown event class.
+ *
+ * @package    core
+ * @since      Moodle 2.7
+ * @copyright  2014 Petr Skoda
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class unknown_logged extends base {
+    public function init() {
+        throw new \coding_exception('unknown events cannot be triggered');
+    }
+
+    public static function get_name() {
+        return get_string('eventunknownlogged', 'core');
+    }
+
+    public function get_description() {
+        return 'Unknown event (' . $this->eventname . ')';
+    }
+}
index ec91dc3..88ce8ca 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * Event when new user profile is created.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 37d9edb..dcfdddb 100644 (file)
@@ -39,6 +39,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 825eb53..5338cd6 100644 (file)
@@ -35,6 +35,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 4c7a905..7339566 100644 (file)
@@ -36,6 +36,7 @@ defined('MOODLE_INTERNAL') || die();
  * Event when user is unenrolled from a course.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 5bfad22..02c5c7c 100644 (file)
@@ -35,6 +35,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index ae77611..ba3f374 100644 (file)
@@ -17,7 +17,7 @@
 /**
  * Grade edited event.
  *
- * @package    core_grades
+ * @package    core
  * @copyright  2014 Petr Skoda
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -37,7 +37,8 @@ defined('MOODLE_INTERNAL') || die();
  *     -bool overridden: Is this grade override?
  *     -float finalgrade: the final grade value.
  *
- * @package    core_grades
+ * @package    core
+ * @since      Moodle 2.7
  * @copyright  2013 Petr Skoda
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 315b376..6cb6210 100644 (file)
@@ -26,6 +26,7 @@
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index ec94f35..6966893 100644 (file)
@@ -18,6 +18,7 @@
  * User login event.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index bf88da9..b292c58 100644 (file)
@@ -37,6 +37,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index f332ae1..310e5e6 100644 (file)
@@ -35,6 +35,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 7ea66cf..c671792 100644 (file)
@@ -37,6 +37,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.7
  * @copyright  2014 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 919ecc7..7bc8ba8 100644 (file)
@@ -26,6 +26,7 @@
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Mark Nelson <markn@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index af7c04f..69e36c5 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * Event when user profile is updated.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index a2f3e8c..b40cec2 100644 (file)
@@ -35,6 +35,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 7d82a95..181dbb7 100644 (file)
@@ -37,6 +37,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 9aa7e24..46f5199 100644 (file)
@@ -35,6 +35,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 7832e0a..517bea8 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * core webservice service deleted event class.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 121f7a3..dacc33b 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * core webservice service updated event class.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 4bf7c94..d27fdb1 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * core webservice service user added event class.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 7114b47..95b71c5 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * core webservice service user removed event class.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index db241df..1eda6b0 100644 (file)
@@ -35,6 +35,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index e674929..e5498c5 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * core webservice token sent event class.
  *
  * @package    core
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index e6d13b3..06612bb 100644 (file)
@@ -107,14 +107,29 @@ function css_write_file($filename, $content) {
 /**
  * Takes CSS and chunks it if the number of selectors within it exceeds $maxselectors.
  *
+ * The chunking will not split a group of selectors, or a media query. That means that
+ * if n > $maxselectors and there are n selectors grouped together,
+ * they will not be chunked and you could end up with more selectors than desired.
+ * The same applies for a media query that has more than n selectors.
+ *
+ * Also, as we do not split group of selectors or media queries, the chunking might
+ * not be as optimal as it could be, having files with less selectors than it could
+ * potentially contain.
+ *
+ * String functions used here are not compliant with unicode characters. But that is
+ * not an issue as the syntax of CSS is using ASCII codes. Even if we have unicode
+ * characters in comments, or in the property 'content: ""', it will behave correcly.
+ *
+ * Please note that this strips out the comments if chunking happens.
+ *
  * @param string $css The CSS to chunk.
  * @param string $importurl The URL to use for import statements.
  * @param int $maxselectors The number of selectors to limit a chunk to.
- * @param int $buffer The buffer size to use when chunking. You shouldn't need to reduce this
- *      unless you are lowering the maximum selectors.
+ * @param int $buffer Not used any more.
  * @return array An array of CSS chunks.
  */
 function css_chunk_by_selector_count($css, $importurl, $maxselectors = 4095, $buffer = 50) {
+
     // Check if we need to chunk this CSS file.
     $count = substr_count($css, ',') + substr_count($css, '{');
     if ($count < $maxselectors) {
@@ -122,44 +137,116 @@ function css_chunk_by_selector_count($css, $importurl, $maxselectors = 4095, $bu
         return array($css);
     }
 
-    // Chunk time ?!
-    // Split the CSS by array, making sure to save the delimiter in the process.
-    $parts = preg_split('#([,\}])#', $css, null, PREG_SPLIT_DELIM_CAPTURE + PREG_SPLIT_NO_EMPTY);
-    // We need to chunk the array. Each delimiter is stored separately so we multiple by 2.
-    // We also subtract 100 to give us a small buffer just in case.
-    $parts = array_chunk($parts, $maxselectors * 2 - $buffer * 2);
-    $css = array();
-    $partcount = count($parts);
-    foreach ($parts as $key => $chunk) {
-        if (end($chunk) === ',') {
-            // Damn last element was a comma.
-            // Pretty much the only way to deal with this is to take the styles from the end of the
-            // comma separated chain of selectors and apply it to the last selector we have here in place
-            // of the comma.
-            // Unit tests are essential for making sure this works.
-            $styles = false;
-            $i = $key;
-            while ($styles === false && $i < ($partcount - 1)) {
-                $i++;
-                $nextpart = $parts[$i];
-                foreach ($nextpart as $style) {
-                    if (strpos($style, '{') !== false) {
-                        $styles = preg_replace('#^[^\{]+#', '', $style);
-                        break;
-                    }
+    $chunks = array();                  // The final chunks.
+    $offsets = array();                 // The indexes to chunk at.
+    $offset = 0;                        // The current offset.
+    $selectorcount = 0;                 // The number of selectors since the last split.
+    $lastvalidoffset = 0;               // The last valid index to split at.
+    $lastvalidoffsetselectorcount = 0;  // The number of selectors used at the time were could split.
+    $inrule = 0;                        // The number of rules we are in, should not be greater than 1.
+    $inmedia = false;                   // Whether or not we are in a media query.
+    $mediacoming = false;               // Whether or not we are expeting a media query.
+    $currentoffseterror = null;         // Not null when we have recorded an error for the current split.
+    $offseterrors = array();            // The offsets where we found errors.
+
+    // Remove the comments. Because it's easier, safer and probably a lot of other good reasons.
+    $css = preg_replace('#/\*(.*?)\*/#s', '', $css);
+    $strlen = strlen($css);
+
+    // Walk through the CSS content character by character.
+    for ($i = 1; $i <= $strlen; $i++) {
+        $char = $css[$i - 1];
+        $offset = $i;
+
+        // Is that a media query that I see coming towards us?
+        if ($char === '@') {
+            if (!$inmedia && substr($css, $offset, 5) === 'media') {
+                $mediacoming = true;
+            }
+        }
+
+        // So we are entering a rule or a media query...
+        if ($char === '{') {
+            if ($mediacoming) {
+                $inmedia = true;
+                $mediacoming = false;
+            } else {
+                $inrule++;
+                $selectorcount++;
+            }
+        }
+
+        // Let's count the number of selectors, but only if we are not in a rule as they
+        // can contain commas too.
+        if (!$inrule && $char === ',') {
+            $selectorcount++;
+        }
+
+        // We reached the end of something.
+        if ($char === '}') {
+            // Oh, we are in a media query.
+            if ($inmedia) {
+                if (!$inrule) {
+                    // This is the end of the media query.
+                    $inmedia = false;
+                } else {
+                    // We were in a rule, in the media query.
+                    $inrule--;
                 }
+            } else {
+                $inrule--;
+            }
+
+            // We are not in a media query, and there is no pending rule, it is safe to split here.
+            if (!$inmedia && !$inrule) {
+                $lastvalidoffset = $offset;
+                $lastvalidoffsetselectorcount = $selectorcount;
             }
-            if ($styles === false) {
-                $styles = '/** Error chunking CSS **/';
+        }
+
+        // Alright, this is splitting time...
+        if ($selectorcount > $maxselectors) {
+            if (!$lastvalidoffset) {
+                // We must have reached more selectors into one set than we were allowed. That means that either
+                // the chunk size value is too small, or that we have a gigantic group of selectors, or that a media
+                // query contains more selectors than the chunk size. We have to ignore this because we do not
+                // support split inside a group of selectors or media query.
+                if ($currentoffseterror === null) {
+                    $currentoffseterror = $offset;
+                    $offseterrors[] = $currentoffseterror;
+                }
             } else {
-                $styles .= '}';
+                // We identify the offset to split at and reset the number of selectors found from there.
+                $offsets[] = $lastvalidoffset;
+                $selectorcount = $selectorcount - $lastvalidoffsetselectorcount;
+                $lastvalidoffset = 0;
+                $currentoffseterror = null;
             }
-            array_pop($chunk);
-            array_push($chunk, $styles);
         }
-        $css[] = join('', $chunk);
     }
-    // The array $css now contains CSS split into perfect sized chunks.
+
+    // Report offset errors.
+    if (!empty($offseterrors)) {
+        debugging('Could not find a safe place to split at offset(s): ' . implode(', ', $offseterrors) . '. Those were ignored.',
+            DEBUG_DEVELOPER);
+    }
+
+    // Now that we have got the offets, we can chunk the CSS.
+    $offsetcount = count($offsets);
+    foreach ($offsets as $key => $index) {
+        $start = 0;
+        if ($key > 0) {
+            $start = $offsets[$key - 1];
+        }
+        // From somewhere up to the offset.
+        $chunks[] = substr($css, $start, $index - $start);
+    }
+    // Add the last chunk (if there is one), from the last offset to the end of the string.
+    if (end($offsets) != $strlen) {
+        $chunks[] = substr($css, end($offsets));
+    }
+
+    // The array $chunks now contains CSS split into perfect sized chunks.
     // Import statements can only appear at the very top of a CSS file.
     // Imported sheets are applied in the the order they are imported and
     // are followed by the contents of the CSS.
@@ -170,7 +257,7 @@ function css_chunk_by_selector_count($css, $importurl, $maxselectors = 4095, $bu
     // followed by the contents of the final chunk in the actual sheet.
     $importcss = '';
     $slashargs = strpos($importurl, '.php?') === false;
-    $parts = count($css);
+    $parts = count($chunks);
     for ($i = 1; $i < $parts; $i++) {
         if ($slashargs) {
             $importcss .= "@import url({$importurl}/chunk{$i});\n";
@@ -178,10 +265,10 @@ function css_chunk_by_selector_count($css, $importurl, $maxselectors = 4095, $bu
             $importcss .= "@import url({$importurl}&chunk={$i});\n";
         }
     }
-    $importcss .= end($css);
-    $css[key($css)] = $importcss;
+    $importcss .= end($chunks);
+    $chunks[key($chunks)] = $importcss;
 
-    return $css;
+    return $chunks;
 }
 
 /**
index d93c067..3b29fd0 100644 (file)
@@ -943,7 +943,9 @@ $services = array(
             'mod_assign_submit_for_grading',
             'mod_assign_save_grade',
             'mod_assign_save_user_extensions',
-            'mod_assign_reveal_identities'),
+            'mod_assign_reveal_identities',
+            'message_airnotifier_is_system_configured',
+            'message_airnotifier_are_notification_preferences_configured'),
         'enabled' => 0,
         'restrictedusers' => 0,
         'shortname' => MOODLE_OFFICIAL_MOBILE_SERVICE,
index cbf5992..12dc9eb 100644 (file)
@@ -81,7 +81,7 @@ class mariadb_native_moodle_database extends mysqli_native_moodle_database {
     public function get_server_info() {
         $version = $this->mysqli->server_info;
         $matches = null;
-        if (preg_match('/^5\.5\.5-(10\..+)-MariaDB$/i', $version, $matches)) {
+        if (preg_match('/^5\.5\.5-(10\..+)-MariaDB/i', $version, $matches)) {
             // Looks like MariaDB decided to use these weird version numbers for better BC with MySQL...
             $version = $matches[1];
         }
index a1ef105..9a488ac 100644 (file)
Binary files a/lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button-debug.js and b/lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button-debug.js differ
index d2ffa29..b32f788 100644 (file)
Binary files a/lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button-min.js and b/lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button-min.js differ
index a1ef105..9a488ac 100644 (file)
Binary files a/lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button.js and b/lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button.js differ
index 44f1e9f..a7f81e4 100644 (file)
@@ -177,25 +177,28 @@ Y.namespace('M.atto_table').Button = Y.Base.create('button', Y.M.editor_atto.Edi
      * @private
      */
     _displayTableEditor: function(e) {
-        var cell = this._getSuitableTableCell();
+        var selection = this.get('host').getSelectionParentNode(),
+            cell;
+
+        if (!selection) {
+            // We don't have a current selection at all, so show the standard dialogue.
+            return this._displayDialogue(e);
+        }
+
+        // Check all of the table cells found in the selection.
+        Y.one(selection).ancestors('th, td', true).each(function(node) {
+            if (this.editor.contains(node)) {
+                cell = node;
+            }
+        }, this);
+
         if (cell) {
             // Add the cell to the EventFacade to save duplication in when showing the menu.
             e.tableCell = cell;
             return this._showTableMenu(e);
         }
-        return this._displayDialogue(e);
-    },
 
-    /**
-     * Returns whether or not the parameter node exists within the editor.
-     *
-     * @method _stopAtContentEditableFilter
-     * @param  {Node} node
-     * @private
-     * @return {boolean} whether or not the parameter node exists within the editor.
-     */
-    _stopAtContentEditableFilter: function(node) {
-        this.editor.contains(node);
+        return this._displayDialogue(e);
     },
 
     /**
@@ -242,44 +245,6 @@ Y.namespace('M.atto_table').Button = Y.Base.create('button', Y.M.editor_atto.Edi
         return this._content;
     },
 
-    /**
-     * Given the current selection, return a table cell suitable for table editing
-     * purposes, i.e. the first table cell selected, or the first cell in the table
-     * that the selection exists in, or null if not within a table.
-     *
-     * @method _getSuitableTableCell
-     * @private
-     * @return {Node} suitable target cell, or null if not within a table
-     */
-    _getSuitableTableCell: function() {
-        var targetcell = null,
-            host = this.get('host');
-
-        host.getSelectedNodes().some(function (node) {
-            if (node.ancestor('td, th, caption', true, this._stopAtContentEditableFilter)) {
-                targetcell = node;
-
-                var caption = node.ancestor('caption', true, this._stopAtContentEditableFilter);
-                if (caption) {
-                    var table = caption.get('parentNode');
-                    if (table) {
-                        targetcell = table.one('td, th');
-                    }
-                }
-
-                // Once we've found a cell to target, we shouldn't need to keep looking.
-                return true;
-            }
-        });
-
-        if (targetcell) {
-            var selection = host.getSelectionFromNode(targetcell);
-            host.setSelection(selection);
-        }
-
-        return targetcell;
-    },
-
     /**
      * Change a node from one type to another, copying all attributes and children.
      *
index c416a6f..84be800 100644 (file)
@@ -155,7 +155,7 @@ div.editor_atto_content:hover .atto_control {
     display: block;
 }
 
-.yui3-menu-hidden {
+.editor_atto_menu.yui3-menu-hidden {
     display: none;
 }
 
index 70434d2..75ede19 100644 (file)
Binary files a/lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-debug.js and b/lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-debug.js differ
index ed3bea3..2b4110d 100644 (file)
Binary files a/lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-min.js and b/lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-min.js differ
index 60740c0..50973bd 100644 (file)
Binary files a/lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor.js and b/lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor.js differ
index 5149d80..3c7dca6 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 f22d5ad..4e29469 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 e1cb432..4fd24e4 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 daa1661..33c2ba4 100644 (file)
@@ -600,6 +600,9 @@ EditorPluginButtons.prototype = {
             this.get('host').focus();
         }
 
+        // Save the selection.
+        this.get('host').saveSelection();
+
         // Ensure that we focus on this button next time.
         if (creatorButton) {
             this.get('host')._setTabFocus(creatorButton);
index 2771a8a..4f4e630 100644 (file)
@@ -88,6 +88,7 @@ EditorToolbarNav.prototype = {
         button = this._findFirstFocusable(buttons, current, direction);
         if (button) {
             button.focus();
+            this._setTabFocus(button);
         } else {
             Y.log("Unable to find a button to focus on", 'debug', LOGNAME);
         }
index 6b89395..053b28d 100644 (file)
@@ -2234,6 +2234,7 @@ class cached_cm_info {
  *    visible or not available, so this would be true in that case) - obtained dynamically
  * @property-read string $sequence Comma-separated list of all modules in the section. Note, this field may not exactly
  *    match course_sections.sequence if later has references to non-existing modules or not modules of not available module types.
+ * @property-read course_modinfo $modinfo
  */
 class section_info implements IteratorAggregate {
     /**
@@ -2649,6 +2650,15 @@ class section_info implements IteratorAggregate {
         return $this->modinfo->get_course_id();
     }
 
+    /**
+     * Modinfo object
+     *
+     * @return course_modinfo
+     */
+    private function get_modinfo() {
+        return $this->modinfo;
+    }
+
     /**
      * Prepares section data for inclusion in sectioncache cache, removing items
      * that are set to defaults, and adding availability data if required.
index 59a6d1a..3aae32f 100644 (file)
@@ -803,7 +803,6 @@ class moodle_page {
      * @return renderer_base
      */
     public function get_renderer($component, $subtype = null, $target = null) {
-        $target = null;
         if ($this->pagelayout === 'maintenance') {
             // If the page is using the maintenance layout then we're going to force target to maintenance.
             // This leads to a special core renderer that is designed to block access to API's that are likely unavailable for this
index ed350cd..4cb804e 100644 (file)
@@ -1261,7 +1261,7 @@ function disable_output_buffering() {
  */
 function redirect_if_major_upgrade_required() {
     global $CFG;
-    $lastmajordbchanges = 2014040408.00;
+    $lastmajordbchanges = 2014040800.00;
     if (empty($CFG->version) or (float)$CFG->version < $lastmajordbchanges or
             during_initial_install() or !empty($CFG->adminsetuppending)) {
         try {
index a798e20..8ba3a26 100644 (file)
@@ -1082,7 +1082,7 @@ CSS;
     public function test_css_chunking() {
         // Test with an even number of styles.
         $css = 'a{}b{}c{}d{}e{}f{}';
-        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2, 0);
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2);
         $this->assertInternalType('array', $chunks);
         $this->assertCount(3, $chunks);
         $this->assertArrayHasKey(0, $chunks);
@@ -1094,7 +1094,7 @@ CSS;
 
         // Test with an odd number of styles.
         $css = 'a{}b{}c{}d{}e{}';
-        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2, 0);
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2);
         $this->assertInternalType('array', $chunks);
         $this->assertCount(3, $chunks);
         $this->assertArrayHasKey(0, $chunks);
@@ -1104,21 +1104,9 @@ CSS;
         $this->assertSame('c{}d{}', $chunks[1]);
         $this->assertSame("@import url(styles.php?type=test&chunk=1);\n@import url(styles.php?type=test&chunk=2);\ne{}", $chunks[2]);
 
-        // Test buffering. Set a buffer that will reduce the effective sheet size back to two.
-        $css = 'a{}b{}c{}d{}e{}f{}';
-        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 6, 4);
-        $this->assertInternalType('array', $chunks);
-        $this->assertCount(3, $chunks);
-        $this->assertArrayHasKey(0, $chunks);
-        $this->assertArrayHasKey(1, $chunks);
-        $this->assertArrayHasKey(2, $chunks);
-        $this->assertSame('a{}b{}', $chunks[0]);
-        $this->assertSame('c{}d{}', $chunks[1]);
-        $this->assertSame("@import url(styles.php?type=test&chunk=1);\n@import url(styles.php?type=test&chunk=2);\ne{}f{}", $chunks[2]);
-
         // Test well placed commas.
         $css = 'a,b{}c,d{}e,f{}';
-        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2, 0);
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2);
         $this->assertInternalType('array', $chunks);
         $this->assertCount(3, $chunks);
         $this->assertArrayHasKey(0, $chunks);
@@ -1130,56 +1118,117 @@ CSS;
 
         // Test unfortunately placed commas.
         $css = 'a{}b,c{color:red;}d{}e{}f{}';
-        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2, 0);
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2);
         $this->assertInternalType('array', $chunks);
-        $this->assertCount(3, $chunks);
+        $this->assertCount(4, $chunks);
         $this->assertArrayHasKey(0, $chunks);
         $this->assertArrayHasKey(1, $chunks);
         $this->assertArrayHasKey(2, $chunks);
-        $this->assertSame('a{}b{color:red;}', $chunks[0]);
-        $this->assertSame('c{color:red;}d{}', $chunks[1]);
-        $this->assertSame("@import url(styles.php?type=test&chunk=1);\n@import url(styles.php?type=test&chunk=2);\ne{}f{}", $chunks[2]);
+        $this->assertArrayHasKey(3, $chunks);
+        $this->assertSame('a{}', $chunks[0]);
+        $this->assertSame('b,c{color:red;}', $chunks[1]);
+        $this->assertSame('d{}e{}', $chunks[2]);
+        $this->assertSame("@import url(styles.php?type=test&chunk=1);\n@import url(styles.php?type=test&chunk=2);\n@import url(styles.php?type=test&chunk=3);\nf{}", $chunks[3]);
 
         // Test unfortunate CSS.
         $css = 'a,b,c,d,e,f{color:red;}';
         $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2, 0);
         $this->assertInternalType('array', $chunks);
-        $this->assertCount(3, $chunks);
+        $this->assertCount(1, $chunks);
         $this->assertArrayHasKey(0, $chunks);
-        $this->assertArrayHasKey(1, $chunks);
-        $this->assertArrayHasKey(2, $chunks);
-        $this->assertSame('a,b{color:red;}', $chunks[0]);
-        $this->assertSame('c,d{color:red;}', $chunks[1]);
-        $this->assertSame("@import url(styles.php?type=test&chunk=1);\n@import url(styles.php?type=test&chunk=2);\ne,f{color:red;}", $chunks[2]);
+        $this->assertSame('a,b,c,d,e,f{color:red;}', $chunks[0]);
+        $this->assertDebuggingCalled('Could not find a safe place to split at offset(s): 6. Those were ignored.');
 
         // Test to make sure invalid CSS isn't totally ruined.
         $css = 'a{},,,e{},';
-        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2, 0);
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2);
         // Believe it or not we want to care what comes out here as this will be parsed correctly
         // by a browser.
         $this->assertInternalType('array', $chunks);
-        $this->assertCount(2, $chunks);
+        $this->assertCount(3, $chunks);
         $this->assertArrayHasKey(0, $chunks);
         $this->assertArrayHasKey(1, $chunks);
-        $this->assertSame('a{},{}', $chunks[0]);
-        $this->assertSame("@import url(styles.php?type=test&chunk=1);\n,e{}/** Error chunking CSS **/", $chunks[1]);
+        $this->assertArrayHasKey(2, $chunks);
+        $this->assertSame('a{}', $chunks[0]);
+        $this->assertSame(',,,e{}', $chunks[1]);
+        $this->assertSame("@import url(styles.php?type=test&chunk=1);\n@import url(styles.php?type=test&chunk=2);\n,", $chunks[2]);
+        $this->assertDebuggingCalled('Could not find a safe place to split at offset(s): 6. Those were ignored.');
 
         // Test utter crap CSS to make sure we don't loop to our deaths.
         $css = 'a,b,c,d,e,f';
-        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2, 0);
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2);
         $this->assertInternalType('array', $chunks);
-        $this->assertCount(3, $chunks);
+        $this->assertCount(1, $chunks);
         $this->assertArrayHasKey(0, $chunks);
-        $this->assertArrayHasKey(1, $chunks);
-        $this->assertArrayHasKey(2, $chunks);
-        $this->assertSame('a,b/** Error chunking CSS **/', $chunks[0]);
-        $this->assertSame('c,d/** Error chunking CSS **/', $chunks[1]);
-        $this->assertSame("@import url(styles.php?type=test&chunk=1);\n@import url(styles.php?type=test&chunk=2);\ne,f", $chunks[2]);
+        $this->assertSame($css, $chunks[0]);
+        $this->assertDebuggingCalled('Could not find a safe place to split at offset(s): 6. Those were ignored.');
+
         // Test another death situation to make sure we're invincible.
         $css = 'a,,,,,e';
-        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2, 0);
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2);
         $this->assertInternalType('array', $chunks);
+        $this->assertDebuggingCalled('Could not find a safe place to split at offset(s): 4. Those were ignored.');
         // I don't care what the outcome is, I just want to make sure it doesn't die.
+
+        // Test media queries.
+        $css = '@media (min-width: 980px) { .a,.b{} }';
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2);
+        $this->assertCount(1, $chunks);
+        $this->assertSame('@media (min-width: 980px) { .a,.b{} }', $chunks[0]);
+
+        // Test special rules.
+        $css = 'a,b{ background-image: linear-gradient(to bottom, #ffffff, #cccccc);}d,e{}';
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2);
+        $this->assertCount(2, $chunks);
+        $this->assertSame('a,b{ background-image: linear-gradient(to bottom, #ffffff, #cccccc);}', $chunks[0]);
+        $this->assertSame("@import url(styles.php?type=test&chunk=1);\nd,e{}", $chunks[1]);
+
+        // Test media queries with too many selectors.
+        $css = '@media (min-width: 980px) { a,b,c,d{} }';
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2);
+        $this->assertCount(1, $chunks);
+        $this->assertSame('@media (min-width: 980px) { a,b,c,d{} }', $chunks[0]);
+        $this->assertDebuggingCalled('Could not find a safe place to split at offset(s): 34. Those were ignored.');
+
+        // Complex test.
+        $css = '@media (a) {b{}} c{} d,e{} f,g,h{} i,j{x:a,b,c} k,l{} @media(x){l,m{ y: a,b,c}} n{}';
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 3);
+        $this->assertCount(6, $chunks);
+        $this->assertSame('@media (a) {b{}} c{}', $chunks[0]);
+        $this->assertSame(' d,e{}', $chunks[1]);
+        $this->assertSame(' f,g,h{}', $chunks[2]);
+        $this->assertSame(' i,j{x:a,b,c}', $chunks[3]);
+        $this->assertSame(' k,l{}', $chunks[4]);
+        $this->assertSame("@import url(styles.php?type=test&chunk=1);\n@import url(styles.php?type=test&chunk=2);\n@import url(styles.php?type=test&chunk=3);\n@import url(styles.php?type=test&chunk=4);\n@import url(styles.php?type=test&chunk=5);\n @media(x){l,m{ y: a,b,c}} n{}", $chunks[5]);
+
+        // Multiple offset errors.
+        $css = 'a,b,c{} d,e,f{}';
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2);
+        $this->assertCount(2, $chunks);
+        $this->assertSame('a,b,c{}', $chunks[0]);
+        $this->assertSame("@import url(styles.php?type=test&chunk=1);\n d,e,f{}", $chunks[1]);
+        $this->assertDebuggingCalled('Could not find a safe place to split at offset(s): 6, 14. Those were ignored.');
+
+        // Test the split according to IE.
+        $css = str_repeat('a{}', 4100);
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test');
+        $this->assertCount(2, $chunks);
+        $this->assertSame(str_repeat('a{}', 4095), $chunks[0]);
+        $this->assertSame("@import url(styles.php?type=test&chunk=1);\n" . str_repeat('a{}', 5), $chunks[1]);
+
+        // Test strip out comments.
+        $css = ".a {/** a\nb\nc */} /** a\nb\nc */ .b{} /** .c,.d{} */ e{}";
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2);
+        $this->assertCount(2, $chunks);
+        $this->assertSame('.a {}  .b{}', $chunks[0]);
+        $this->assertSame("@import url(styles.php?type=test&chunk=1);\n  e{}", $chunks[1]);
+
+        // Test something with unicode characters.
+        $css = 'a,b{} nav a:hover:after { content: "↓"; } b{ color:test;}';
+        $chunks = css_chunk_by_selector_count($css, 'styles.php?type=test', 2);
+        $this->assertCount(2, $chunks);
+        $this->assertSame('a,b{}', $chunks[0]);
+        $this->assertSame("@import url(styles.php?type=test&chunk=1);\n nav a:hover:after { content: \"↓\"; } b{ color:test;}", $chunks[1]);
     }
 
     /**
diff --git a/lib/tests/event_unknown_logged_test.php b/lib/tests/event_unknown_logged_test.php
new file mode 100644 (file)
index 0000000..7d07dce
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Tests for event manager, base event and observers.
+ *
+ * @package    core
+ * @category   phpunit
+ * @copyright  2014 Petr Skoda
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+require_once(__DIR__.'/fixtures/event_fixtures.php');
+
+class core_event_unknown_logged_testcase extends advanced_testcase {
+
+    public function test_restore_event() {
+        $event1 = \core_tests\event\unittest_executed::create(array('context' => context_system::instance(), 'other' => array('sample' => 1, 'xx' => 10)));
+        $data1 = $event1->get_data();
+
+        $data1['eventname'] = '\mod_xx\event\xx_yy';
+        $data1['component'] = 'mod_xx';
+        $data1['action'] = 'yy';
+        $data1['target'] = 'xx';
+        $extra1 = array('origin' => 'cli');
+
+        $event2 = \core\event\base::restore($data1, $extra1);
+        $data2 = $event2->get_data();
+        $extra2 = $event2->get_logextra();
+
+        $this->assertInstanceOf('core\event\unknown_logged', $event2);
+        $this->assertTrue($event2->is_triggered());
+        $this->assertTrue($event2->is_restored());
+        $this->assertNull($event2->get_url());
+        $this->assertEquals($data1, $data2);
+        $this->assertEquals($extra1, $extra2);
+    }
+}
\ No newline at end of file
index 611f44c..01e48c1 100644 (file)
@@ -2097,31 +2097,39 @@ function upgrade_grade_item_fix_sortorder() {
     // to do it more efficiently by doing a series of update statements rather than updating
     // every single grade item in affected courses.
 
-    $transaction = $DB->start_delegated_transaction();
-
-    $sql = "SELECT DISTINCT g1.id, g1.courseid, g1.sortorder
+    $sql = "SELECT DISTINCT g1.courseid
               FROM {grade_items} g1
               JOIN {grade_items} g2 ON g1.courseid = g2.courseid
              WHERE g1.sortorder = g2.sortorder AND g1.id != g2.id
-             ORDER BY g1.courseid ASC, g1.sortorder DESC, g1.id DESC";
-
-    // Get all duplicates in course order, highest sort order, and higest id first so that we can make space at the
-    // bottom higher end of the sort orders and work down by id.
-    $rs = $DB->get_recordset_sql($sql);
+             ORDER BY g1.courseid ASC";
+    foreach ($DB->get_fieldset_sql($sql) as $courseid) {
+        $transaction = $DB->start_delegated_transaction();
+        $items = $DB->get_records('grade_items', array('courseid' => $courseid), '', 'id, sortorder, sortorder AS oldsort');
+
+        // Get all duplicates in course order, highest sort order, and higest id first so that we can make space at the
+        // bottom higher end of the sort orders and work down by id.
+        $sql = "SELECT DISTINCT g1.id, g1.sortorder
+                FROM {grade_items} g1
+                JOIN {grade_items} g2 ON g1.courseid = g2.courseid
+                WHERE g1.sortorder = g2.sortorder AND g1.id != g2.id AND g1.courseid = :courseid
+                ORDER BY g1.sortorder DESC, g1.id DESC";
+
+        // This is the O(N*N) like the database version we're replacing, but at least the constants are a billion times smaller...
+        foreach ($DB->get_records_sql($sql, array('courseid' => $courseid)) as $duplicate) {
+            foreach ($items as $item) {
+                if ($item->sortorder > $duplicate->sortorder || ($item->sortorder == $duplicate->sortorder && $item->id > $duplicate->id)) {
+                    $item->sortorder += 1;
+                }
+            }
+        }
+        foreach ($items as $item) {
+            if ($item->sortorder != $item->oldsort) {
+                $DB->update_record('grade_items', array('id' => $item->id, 'sortorder' => $item->sortorder));
+            }
+        }
 
-    foreach($rs as $duplicate) {
-        $DB->execute("UPDATE {grade_items}
-                         SET sortorder = sortorder + 1
-                       WHERE courseid = :courseid AND
-                       (sortorder > :sortorder OR (sortorder = :sortorder2 AND id > :id))",
-            array('courseid' => $duplicate->courseid,
-                'sortorder' => $duplicate->sortorder,
-                'sortorder2' => $duplicate->sortorder,
-                'id' => $duplicate->id));
+        $transaction->allow_commit();
     }
-    $rs->close();
-
-    $transaction->allow_commit();
 }
 
 /**
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index b1fe4cf..7a98b89
@@ -68,7 +68,8 @@ class message_output_airnotifier extends message_output {
             "type" => $eventdata->component . '_' . $eventdata->name,
             "device" => "xxxxxxxxxx",   // Since at this point we don't know the device, we use a 10 chars device platform.
             "notif" => "x",             // 1 or 0 wheter is a notification or not (it may be a private message).
-            "userfrom" => fullname($eventdata->userfrom));
+            "userfrom" => (!empty($eventdata->userfrom)) ? fullname($eventdata->userfrom) : ''
+        );
 
         // Calculate the size of the message knowing Apple payload must be lower than 256 bytes.
         // Airnotifier using few bytes of the payload, we must limit our message to even less characters.
@@ -109,10 +110,10 @@ class message_output_airnotifier extends message_output {
             $curl->setHeader($header);
             $params = array(
                 'alert'     => $message,
-                'date'      => $eventdata->timecreated,
+                'date'      => (!empty($eventdata->timecreated)) ? $eventdata->timecreated : time(),
                 'site'      => $siteid,
                 'type'      => $eventdata->component . '_' . $eventdata->name,
-                'userfrom'  => fullname($eventdata->userfrom),
+                'userfrom'  => (!empty($eventdata->userfrom)) ? fullname($eventdata->userfrom) : '',
                 'device'    => $devicetoken->platform,
                 'notif'     => (!empty($eventdata->notification)) ? '1' : '0',
                 'token'     => $devicetoken->pushid);
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 3e180e3..f1bc1d2 100644 (file)
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * mod_assign all submissions downloaded event class.
  *
  * @package    mod_assign
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 258aa9e..b639423 100644 (file)
@@ -36,6 +36,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    mod_assign
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index a7c20ec..3b26e51 100644 (file)
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * mod_assign extension granted event class.
  *
  * @package    mod_assign
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 1bc307a..ad8948f 100644 (file)
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * mod_assign identities revealed event class.
  *
  * @package    mod_assign
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index ba36181..362fb3f 100644 (file)
@@ -36,6 +36,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    mod_assign
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index ea92ec3..d0a0811 100644 (file)
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * mod_assign statement accepted event class.
  *
  * @package    mod_assign
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 22df013..ad67856 100644 (file)
@@ -37,6 +37,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    mod_assign
+ * @since      Moodle 2.7
  * @copyright  2014 Adrian Greeve <adrian@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index e25a3c4..04e4b1c 100644 (file)
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * mod_assign submission duplicated event class.
  *
  * @package    mod_assign
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index ff82bd3..3ac1e46 100644 (file)
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * mod_assign submission graded event class.
  *
  * @package    mod_assign
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 5327faf..5275478 100644 (file)
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * mod_assign submission locked event class.
  *
  * @package    mod_assign
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index e998ef2..6941310 100644 (file)
@@ -36,6 +36,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    mod_assign
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 5e97042..5105e35 100644 (file)
@@ -30,6 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * mod_assign submission unlocked event class.
  *
  * @package    mod_assign
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 69120ab..d2cebf4 100644 (file)
@@ -37,6 +37,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    mod_assign
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 683b140..d1cb048 100644 (file)
@@ -36,6 +36,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    mod_assign
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 240cc6a..d6dca2c 100644 (file)
@@ -827,6 +827,11 @@ function assign_scale_used_anywhere($scaleid) {
 /**
  * List the actions that correspond to a view of this module.
  * This is used by the participation report.
+ *
+ * Note: This is not used by new logging system. Event with
+ *       crud = 'r' and edulevel = LEVEL_PARTICIPATING will
+ *       be considered as view action.
+ *
  * @return array
  */
 function assign_get_view_actions() {
@@ -836,6 +841,11 @@ function assign_get_view_actions() {
 /**
  * List the actions that correspond to a post of this module.
  * This is used by the participation report.
+ *
+ * Note: This is not used by new logging system. Event with
+ *       crud = ('c' || 'u' || 'd') and edulevel = LEVEL_PARTICIPATING
+ *       will be considered as post action.
+ *
  * @return array
  */
 function assign_get_post_actions() {
index 0339217..73a97a0 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * assignsubmission_comments comment created event.
  *
  * @package    assignsubmission_comments
+ * @since      Moodle 2.7
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 2b11fa3..ed65072 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * assignsubmission_comments comment deleted event.
  *
  * @package    assignsubmission_comments
+ * @since      Moodle 2.7
  * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 2529420..ba79ba8 100644 (file)
@@ -37,6 +37,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    assignsubmission_file
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 277d3b9..c04ee4b 100644 (file)
@@ -38,6 +38,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    assignsubmission_file
+ * @since      Moodle 2.7
  * @copyright  2014 Adrian Greeve <adrian@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 9818d3e..7fc9e0b 100644 (file)
@@ -38,6 +38,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    assignsubmission_file
+ * @since      Moodle 2.7
  * @copyright  2014 Adrian Greeve <adrian@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 5b2a6d6..2bf262d 100644 (file)
@@ -38,6 +38,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    assignsubmission_onlinetext
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index b05f7e2..2320e03 100644 (file)
@@ -38,6 +38,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    assignsubmission_onlinetext
+ * @since      Moodle 2.7
  * @copyright  2014 Adrian Greeve <adrian@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 3752639..fab9f41 100644 (file)
@@ -38,6 +38,7 @@ defined('MOODLE_INTERNAL') || die();
  * }
  *
  * @package    assignsubmission_onlinetext
+ * @since      Moodle 2.7
  * @copyright  2014 Adrian Greeve <adrian@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 36a7773..5377973 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * mod_book chapter created event class.
  *
  * @package    mod_book
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 8186409..d882a6b 100644 (file)
@@ -29,6 +29,7 @@ defined('MOODLE_INTERNAL') || die();
  * mod_book chapter deleted event class.
  *
  * @package    mod_book
+ * @since      Moodle 2.6
  * @copyright  2013 Frédéric Massart
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */