Merge branch 'MDL-67265' of git://github.com/Chocolate-lightning/moodle_forum-project
authorAndrew Nicols <andrew@nicols.co.uk>
Fri, 15 Nov 2019 02:35:00 +0000 (10:35 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Fri, 15 Nov 2019 02:35:00 +0000 (10:35 +0800)
456 files changed:
admin/cli/install.php
admin/tool/analytics/version.php
admin/tool/availabilityconditions/version.php
admin/tool/behat/version.php
admin/tool/capability/version.php
admin/tool/cohortroles/version.php
admin/tool/customlang/version.php
admin/tool/dataprivacy/version.php
admin/tool/dbtransfer/version.php
admin/tool/filetypes/version.php
admin/tool/generator/version.php
admin/tool/health/version.php
admin/tool/httpsreplace/version.php
admin/tool/innodb/version.php
admin/tool/installaddon/version.php
admin/tool/langimport/version.php
admin/tool/log/store/database/version.php
admin/tool/log/store/legacy/version.php
admin/tool/log/store/standard/version.php
admin/tool/log/version.php
admin/tool/lp/version.php
admin/tool/lpimportcsv/version.php
admin/tool/lpmigrate/version.php
admin/tool/messageinbound/version.php
admin/tool/mobile/classes/api.php
admin/tool/mobile/tests/externallib_test.php
admin/tool/mobile/version.php
admin/tool/monitor/version.php
admin/tool/multilangupgrade/version.php
admin/tool/oauth2/version.php
admin/tool/phpunit/version.php
admin/tool/policy/version.php
admin/tool/profiling/version.php
admin/tool/recyclebin/version.php
admin/tool/replace/version.php
admin/tool/spamcleaner/version.php
admin/tool/task/version.php
admin/tool/templatelibrary/version.php
admin/tool/unsuproles/version.php
admin/tool/uploadcourse/version.php
admin/tool/uploaduser/version.php
admin/tool/usertours/version.php
admin/tool/xmldb/version.php
auth/cas/version.php
auth/db/version.php
auth/email/version.php
auth/ldap/version.php
auth/lti/version.php
auth/manual/version.php
auth/mnet/version.php
auth/nologin/version.php
auth/none/version.php
auth/oauth2/version.php
auth/shibboleth/version.php
auth/webservice/version.php
availability/condition/completion/version.php
availability/condition/date/version.php
availability/condition/grade/version.php
availability/condition/group/version.php
availability/condition/grouping/version.php
availability/condition/profile/version.php
backup/backup.class.php
blocks/activity_modules/version.php
blocks/activity_results/version.php
blocks/admin_bookmarks/version.php
blocks/badges/version.php
blocks/blog_menu/version.php
blocks/blog_recent/version.php
blocks/blog_tags/version.php
blocks/calendar_month/version.php
blocks/calendar_upcoming/version.php
blocks/comments/version.php
blocks/completionstatus/version.php
blocks/course_list/version.php
blocks/course_summary/version.php
blocks/feedback/version.php
blocks/globalsearch/version.php
blocks/glossary_random/version.php
blocks/html/version.php
blocks/login/version.php
blocks/lp/version.php
blocks/mentees/version.php
blocks/mnet_hosts/version.php
blocks/myoverview/version.php
blocks/myprofile/version.php
blocks/navigation/version.php
blocks/news_items/version.php
blocks/online_users/version.php
blocks/private_files/version.php
blocks/quiz_results/version.php
blocks/recent_activity/version.php
blocks/recentlyaccessedcourses/version.php
blocks/recentlyaccesseditems/version.php
blocks/rss_client/version.php
blocks/search_forums/version.php
blocks/section_links/version.php
blocks/selfcompletion/version.php
blocks/settings/version.php
blocks/site_main_menu/version.php
blocks/social_activities/version.php
blocks/starredcourses/version.php
blocks/tag_flickr/version.php
blocks/tag_youtube/version.php
blocks/tags/version.php
blocks/timeline/version.php
cache/locks/file/version.php
cache/stores/apcu/version.php
cache/stores/file/version.php
cache/stores/memcached/version.php
cache/stores/mongodb/version.php
cache/stores/redis/version.php
cache/stores/session/version.php
cache/stores/static/version.php
calendar/type/gregorian/version.php
course/format/singleactivity/version.php
course/format/social/version.php
course/format/topics/version.php
course/format/weeks/version.php
course/modlib.php
course/moodleform_mod.php
course/tests/modlib_test.php
customfield/field/checkbox/version.php
customfield/field/date/version.php
customfield/field/select/version.php
customfield/field/text/version.php
customfield/field/textarea/version.php
dataformat/csv/version.php
dataformat/excel/version.php
dataformat/html/version.php
dataformat/json/version.php
dataformat/ods/version.php
dataformat/pdf/version.php
enrol/category/version.php
enrol/cohort/version.php
enrol/database/version.php
enrol/flatfile/version.php
enrol/guest/version.php
enrol/imsenterprise/version.php
enrol/ldap/version.php
enrol/lti/version.php
enrol/manual/version.php
enrol/meta/version.php
enrol/mnet/version.php
enrol/paypal/version.php
enrol/self/version.php
files/converter/googledrive/version.php
files/converter/unoconv/version.php
filter/activitynames/version.php
filter/algebra/version.php
filter/censor/version.php
filter/data/version.php
filter/displayh5p/lang/en/filter_displayh5p.php
filter/displayh5p/version.php
filter/emailprotect/version.php
filter/emoticon/version.php
filter/glossary/version.php
filter/mathjaxloader/version.php
filter/mediaplugin/version.php
filter/multilang/version.php
filter/tex/version.php
filter/tidy/version.php
filter/urltolink/version.php
grade/export/ods/version.php
grade/export/txt/version.php
grade/export/xls/version.php
grade/export/xml/version.php
grade/grading/form/guide/version.php
grade/grading/form/rubric/version.php
grade/import/csv/version.php
grade/import/direct/version.php
grade/import/xml/version.php
grade/report/grader/version.php
grade/report/history/version.php
grade/report/outcomes/version.php
grade/report/overview/version.php
grade/report/singleview/version.php
grade/report/user/version.php
h5p/classes/core.php
h5p/classes/framework.php
h5p/tests/event_h5p_deleted_test.php [moved from h5p/tests/event_h5p_deleted.php with 100% similarity]
h5p/tests/event_h5p_viewed_test.php [moved from h5p/tests/event_h5p_viewed.php with 100% similarity]
h5p/tests/generator/lib.php
h5p/tests/generator_test.php
h5p/tests/h5p_core_test.php
install.php
lang/en/completion.php
lang/en/grades.php
lib/amd/build/local/aria/focuslock.min.js [new file with mode: 0644]
lib/amd/build/local/aria/focuslock.min.js.map [new file with mode: 0644]
lib/amd/build/modal.min.js
lib/amd/build/modal.min.js.map
lib/amd/src/local/aria/focuslock.js [new file with mode: 0644]
lib/amd/src/modal.js
lib/antivirus/clamav/version.php
lib/db/install.xml
lib/db/upgrade.php
lib/editor/atto/plugins/accessibilitychecker/version.php
lib/editor/atto/plugins/accessibilityhelper/version.php
lib/editor/atto/plugins/align/version.php
lib/editor/atto/plugins/backcolor/version.php
lib/editor/atto/plugins/bold/version.php
lib/editor/atto/plugins/charmap/version.php
lib/editor/atto/plugins/clear/version.php
lib/editor/atto/plugins/collapse/version.php
lib/editor/atto/plugins/emojipicker/version.php
lib/editor/atto/plugins/emoticon/version.php
lib/editor/atto/plugins/equation/version.php
lib/editor/atto/plugins/fontcolor/version.php
lib/editor/atto/plugins/h5p/version.php
lib/editor/atto/plugins/html/version.php
lib/editor/atto/plugins/image/version.php
lib/editor/atto/plugins/indent/version.php
lib/editor/atto/plugins/italic/version.php
lib/editor/atto/plugins/link/version.php
lib/editor/atto/plugins/managefiles/version.php
lib/editor/atto/plugins/media/version.php
lib/editor/atto/plugins/noautolink/version.php
lib/editor/atto/plugins/orderedlist/version.php
lib/editor/atto/plugins/recordrtc/version.php
lib/editor/atto/plugins/rtl/version.php
lib/editor/atto/plugins/strike/version.php
lib/editor/atto/plugins/subscript/version.php
lib/editor/atto/plugins/superscript/version.php
lib/editor/atto/plugins/table/version.php
lib/editor/atto/plugins/title/version.php
lib/editor/atto/plugins/underline/version.php
lib/editor/atto/plugins/undo/version.php
lib/editor/atto/plugins/unorderedlist/version.php
lib/editor/atto/version.php
lib/editor/textarea/version.php
lib/editor/tinymce/plugins/ctrlhelp/version.php
lib/editor/tinymce/plugins/managefiles/version.php
lib/editor/tinymce/plugins/moodleemoticon/version.php
lib/editor/tinymce/plugins/moodleimage/version.php
lib/editor/tinymce/plugins/moodlemedia/version.php
lib/editor/tinymce/plugins/moodlenolink/version.php
lib/editor/tinymce/plugins/pdw/version.php
lib/editor/tinymce/plugins/spellchecker/version.php
lib/editor/tinymce/plugins/wrap/version.php
lib/editor/tinymce/version.php
lib/form/modgrade.php
lib/mlbackend/php/version.php
lib/mlbackend/python/version.php
lib/phpunit/tests/basic_test.php
lib/setup.php
lib/upgrade.txt
media/player/html5audio/version.php
media/player/html5video/version.php
media/player/swf/version.php
media/player/videojs/version.php
media/player/vimeo/version.php
media/player/youtube/version.php
message/output/airnotifier/version.php
message/output/email/version.php
message/output/jabber/version.php
message/output/popup/version.php
message/templates/message_drawer_view_conversation_body_confirm_dialogue.mustache
mnet/service/enrol/version.php
mod/assign/feedback/comments/version.php
mod/assign/feedback/editpdf/classes/pdf.php
mod/assign/feedback/editpdf/version.php
mod/assign/feedback/file/version.php
mod/assign/feedback/offline/version.php
mod/assign/submission/comments/version.php
mod/assign/submission/file/version.php
mod/assign/submission/onlinetext/version.php
mod/assign/version.php
mod/assignment/type/offline/version.php
mod/assignment/type/online/version.php
mod/assignment/type/upload/version.php
mod/assignment/type/uploadsingle/version.php
mod/assignment/version.php
mod/book/tool/exportimscp/version.php
mod/book/tool/importhtml/version.php
mod/book/tool/print/version.php
mod/book/version.php
mod/chat/version.php
mod/choice/version.php
mod/data/field/checkbox/version.php
mod/data/field/date/version.php
mod/data/field/file/version.php
mod/data/field/latlong/version.php
mod/data/field/menu/version.php
mod/data/field/multimenu/version.php
mod/data/field/number/version.php
mod/data/field/picture/version.php
mod/data/field/radiobutton/version.php
mod/data/field/text/version.php
mod/data/field/textarea/version.php
mod/data/field/url/version.php
mod/data/preset/imagegallery/version.php
mod/data/version.php
mod/feedback/version.php
mod/folder/version.php
mod/forum/amd/build/grades/expandconversation.min.js
mod/forum/amd/build/grades/expandconversation.min.js.map
mod/forum/amd/build/grades/grader.min.js
mod/forum/amd/build/grades/grader.min.js.map
mod/forum/amd/build/local/grades/grader.min.js
mod/forum/amd/build/local/grades/grader.min.js.map
mod/forum/amd/build/local/layout/fullscreen.min.js
mod/forum/amd/build/local/layout/fullscreen.min.js.map
mod/forum/amd/src/grades/expandconversation.js
mod/forum/amd/src/grades/grader.js
mod/forum/amd/src/local/grades/grader.js
mod/forum/amd/src/local/layout/fullscreen.js
mod/forum/backup/moodle2/backup_forum_stepslib.php
mod/forum/backup/moodle2/restore_forum_stepslib.php
mod/forum/export.php
mod/forum/lang/en/forum.php
mod/forum/report/summary/version.php
mod/forum/templates/grades/grade_button.mustache
mod/forum/version.php
mod/glossary/version.php
mod/imscp/version.php
mod/label/version.php
mod/lesson/version.php
mod/lti/service/basicoutcomes/version.php
mod/lti/service/gradebookservices/version.php
mod/lti/service/memberships/version.php
mod/lti/service/profile/version.php
mod/lti/service/toolproxy/version.php
mod/lti/service/toolsettings/version.php
mod/lti/version.php
mod/page/version.php
mod/quiz/accessrule/delaybetweenattempts/version.php
mod/quiz/accessrule/ipaddress/version.php
mod/quiz/accessrule/numattempts/version.php
mod/quiz/accessrule/offlineattempts/version.php
mod/quiz/accessrule/openclosedate/version.php
mod/quiz/accessrule/password/version.php
mod/quiz/accessrule/safebrowser/version.php
mod/quiz/accessrule/securewindow/version.php
mod/quiz/accessrule/timelimit/version.php
mod/quiz/report/grading/version.php
mod/quiz/report/overview/version.php
mod/quiz/report/responses/version.php
mod/quiz/report/statistics/version.php
mod/quiz/version.php
mod/resource/version.php
mod/scorm/report/basic/version.php
mod/scorm/report/graphs/version.php
mod/scorm/report/interactions/version.php
mod/scorm/report/objectives/version.php
mod/scorm/version.php
mod/survey/version.php
mod/url/version.php
mod/wiki/version.php
mod/workshop/allocation/manual/version.php
mod/workshop/allocation/random/version.php
mod/workshop/allocation/scheduled/version.php
mod/workshop/eval/best/version.php
mod/workshop/form/accumulative/version.php
mod/workshop/form/comments/version.php
mod/workshop/form/numerrors/version.php
mod/workshop/form/rubric/version.php
mod/workshop/lang/en/workshop.php
mod/workshop/version.php
portfolio/boxnet/version.php
portfolio/download/version.php
portfolio/flickr/version.php
portfolio/googledocs/version.php
portfolio/mahara/version.php
portfolio/picasa/version.php
question/behaviour/adaptive/version.php
question/behaviour/adaptivenopenalty/version.php
question/behaviour/deferredcbm/version.php
question/behaviour/deferredfeedback/version.php
question/behaviour/immediatecbm/version.php
question/behaviour/immediatefeedback/version.php
question/behaviour/informationitem/version.php
question/behaviour/interactive/version.php
question/behaviour/interactivecountback/version.php
question/behaviour/manualgraded/version.php
question/behaviour/missing/version.php
question/format/aiken/version.php
question/format/blackboard_six/version.php
question/format/examview/version.php
question/format/gift/version.php
question/format/missingword/version.php
question/format/multianswer/version.php
question/format/webct/version.php
question/format/xhtml/version.php
question/format/xml/version.php
question/type/calculated/version.php
question/type/calculatedmulti/version.php
question/type/calculatedsimple/version.php
question/type/ddimageortext/version.php
question/type/ddmarker/version.php
question/type/ddwtos/version.php
question/type/description/version.php
question/type/essay/version.php
question/type/gapselect/version.php
question/type/match/version.php
question/type/missingtype/version.php
question/type/multianswer/version.php
question/type/multichoice/version.php
question/type/numerical/version.php
question/type/random/version.php
question/type/randomsamatch/version.php
question/type/shortanswer/version.php
question/type/truefalse/version.php
report/backups/version.php
report/competency/version.php
report/completion/version.php
report/configlog/version.php
report/courseoverview/version.php
report/eventlist/version.php
report/insights/version.php
report/log/version.php
report/loglive/version.php
report/outline/version.php
report/participation/version.php
report/performance/version.php
report/progress/version.php
report/questioninstances/version.php
report/security/version.php
report/stats/version.php
report/usersessions/version.php
repository/areafiles/version.php
repository/boxnet/version.php
repository/coursefiles/version.php
repository/dropbox/version.php
repository/equella/version.php
repository/filesystem/version.php
repository/flickr/version.php
repository/flickr_public/version.php
repository/googledocs/version.php
repository/local/version.php
repository/merlot/version.php
repository/nextcloud/version.php
repository/onedrive/version.php
repository/picasa/version.php
repository/recent/version.php
repository/s3/version.php
repository/skydrive/version.php
repository/upload/version.php
repository/url/version.php
repository/user/version.php
repository/webdav/version.php
repository/wikimedia/version.php
repository/youtube/version.php
search/engine/simpledb/version.php
search/engine/solr/version.php
theme/boost/version.php
theme/classic/version.php
theme/upgrade.txt
user/profile/field/checkbox/version.php
user/profile/field/datetime/version.php
user/profile/field/menu/version.php
user/profile/field/text/version.php
user/profile/field/textarea/version.php
version.php
webservice/rest/version.php
webservice/soap/version.php
webservice/xmlrpc/version.php

index ea71571..cfc8ea0 100644 (file)
@@ -157,6 +157,7 @@ $CFG->lang                 = 'en';
 $CFG->dirroot              = dirname(dirname(__DIR__));
 $CFG->libdir               = "$CFG->dirroot/lib";
 $CFG->wwwroot              = "http://localhost";
+$CFG->httpswwwroot         = $CFG->wwwroot;
 $CFG->docroot              = 'http://docs.moodle.org';
 $CFG->running_installer    = true;
 $CFG->early_install_lang   = true;
@@ -388,6 +389,7 @@ if ($interactive) {
     }
 }
 $CFG->wwwroot       = $wwwroot;
+$CFG->httpswwwroot  = $CFG->wwwroot;
 
 //We need dataroot before lang download
 $CFG->dataroot = $options['dataroot'];
index c2e2b1c..5a16f21 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052002; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100; // Requires this Moodle version.
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200; // Requires this Moodle version.
 $plugin->component = 'tool_analytics'; // Full name of the plugin (used for diagnostics).
index 93abae8..0cbd887 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000;
-$plugin->requires = 2019051100;
+$plugin->version = 2019111800;
+$plugin->requires = 2019111200;
 $plugin->component = 'tool_availabilityconditions';
index cf851e4..c7fdb16 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;   // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;   // Requires this Moodle version
+$plugin->version   = 2019111800;   // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;   // Requires this Moodle version
 $plugin->component = 'tool_behat'; // Full name of the plugin (used for diagnostics)
index 24be970..3725bff 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100; // Requires this Moodle version.
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200; // Requires this Moodle version.
 $plugin->component = 'tool_capability'; // Full name of the plugin (used for diagnostics).
index d740274..c8f4c09 100644 (file)
@@ -25,8 +25,8 @@
 defined('MOODLE_INTERNAL') || die();
 
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100; // Requires this Moodle version.
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200; // Requires this Moodle version.
 $plugin->component = 'tool_cohortroles'; // Full name of the plugin (used for diagnostics).
 
 $plugin->dependencies = array(
index f00ae9e..edc4a00 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;
 $plugin->component = 'tool_customlang'; // Full name of the plugin (used for diagnostics)
index 5b24401..636f744 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;        // Moodle 3.5dev (Build 2018031600) and upwards.
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;        // Moodle 3.5dev (Build 2018031600) and upwards.
 $plugin->component = 'tool_dataprivacy';
index 67a9ff7..24baf79 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100; // Requires this Moodle version.
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200; // Requires this Moodle version.
 $plugin->component = 'tool_dbtransfer'; // Full name of the plugin (used for diagnostics).
index 4305e36..f76300b 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000;
-$plugin->requires = 2019051100;
+$plugin->version = 2019111800;
+$plugin->requires = 2019111200;
 $plugin->component = 'tool_filetypes';
index 6f083da..1f4d954 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000;
-$plugin->requires = 2019051100;
+$plugin->version = 2019111800;
+$plugin->requires = 2019111200;
 $plugin->component = 'tool_generator';
index 32c49ed..e389ec2 100644 (file)
@@ -25,8 +25,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100; // Requires this Moodle version
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200; // Requires this Moodle version
 $plugin->component = 'tool_health'; // Full name of the plugin (used for diagnostics)
 
 $plugin->maturity  = MATURITY_ALPHA; // this version's maturity level
index be54f19..a2fd75e 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100; // Requires this Moodle version.
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200; // Requires this Moodle version.
 $plugin->component = 'tool_httpsreplace'; // Full name of the plugin (used for diagnostics).
index d18c6d5..dddc257 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100; // Requires this Moodle version
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200; // Requires this Moodle version
 $plugin->component = 'tool_innodb'; // Full name of the plugin (used for diagnostics)
index 0bf941e..0196b38 100644 (file)
@@ -24,6 +24,6 @@
 defined('MOODLE_INTERNAL') || die();
 
 $plugin->component  = 'tool_installaddon';
-$plugin->version    = 2019052000;
-$plugin->requires   = 2019051100;
+$plugin->version    = 2019111800;
+$plugin->requires   = 2019111200;
 $plugin->maturity   = MATURITY_STABLE;
index 11d6a2f..e14da79 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100; // Requires this Moodle version
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200; // Requires this Moodle version
 $plugin->component = 'tool_langimport'; // Full name of the plugin (used for diagnostics)
index 4b02fe9..800477a 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires = 2019051100; // Requires this Moodle version.
+$plugin->version = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires = 2019111200; // Requires this Moodle version.
 $plugin->component = 'logstore_database'; // Full name of the plugin (used for diagnostics).
index 6ffb112..6845278 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires = 2019051100; // Requires this Moodle version.
+$plugin->version = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires = 2019111200; // Requires this Moodle version.
 $plugin->component = 'logstore_legacy'; // Full name of the plugin (used for diagnostics).
index 71b86f9..dcd1211 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires = 2019051100; // Requires this Moodle version.
+$plugin->version = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires = 2019111200; // Requires this Moodle version.
 $plugin->component = 'logstore_standard'; // Full name of the plugin (used for diagnostics).
index db8d74d..eed004e 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires = 2019051100; // Requires this Moodle version.
+$plugin->version = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires = 2019111200; // Requires this Moodle version.
 $plugin->component = 'tool_log'; // Full name of the plugin (used for diagnostics).
index c0a1fb9..1e86dce 100644 (file)
@@ -25,6 +25,6 @@
 defined('MOODLE_INTERNAL') || die();
 
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100; // Requires this Moodle version.
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200; // Requires this Moodle version.
 $plugin->component = 'tool_lp'; // Full name of the plugin (used for diagnostics).
index 19b1cda..1fc6fcb 100644 (file)
@@ -25,8 +25,8 @@
 defined('MOODLE_INTERNAL') || die();
 
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100; // Requires this Moodle version.
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200; // Requires this Moodle version.
 $plugin->component = 'tool_lpimportcsv'; // Full name of the plugin (used for diagnostics).
-$plugin->dependencies = array('tool_lp' => 2019051100);
+$plugin->dependencies = array('tool_lp' => 2019111200);
 
index 27df30a..f63b000 100644 (file)
@@ -24,8 +24,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100; // Requires this Moodle version.
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200; // Requires this Moodle version.
 $plugin->component = 'tool_lpmigrate'; // Full name of the plugin (used for diagnostics).
 $plugin->dependencies = array(
     'tool_lp' => ANY_VERSION
index bde3449..5fc7b14 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;
 $plugin->component = 'tool_messageinbound';
index 7d49d92..146990c 100644 (file)
@@ -299,6 +299,13 @@ class api {
             $settings->calendar_maxevents = $CFG->calendar_maxevents;
         }
 
+        if (empty($section) or $section == 'coursecolors') {
+            $colornumbers = range(1, 10);
+            foreach ($colornumbers as $number) {
+                $settings->{'core_admin_coursecolor' . $number} = get_config('core_admin', 'coursecolor' . $number);
+            }
+        }
+
         return $settings;
     }
 
index 04ed07b..1dbdf3b 100644 (file)
@@ -222,6 +222,13 @@ class tool_mobile_external_testcase extends externallib_advanced_testcase {
             array('name' => 'calendar_lookahead', 'value' => $CFG->calendar_lookahead),
             array('name' => 'calendar_maxevents', 'value' => $CFG->calendar_maxevents),
         );
+        $colornumbers = range(1, 10);
+        foreach ($colornumbers as $number) {
+            $expected[] = [
+                'name' => 'core_admin_coursecolor' . $number,
+                'value' => get_config('core_admin', 'coursecolor' . $number)
+            ];
+        }
         $this->assertCount(0, $result['warnings']);
         $this->assertEquals($expected, $result['settings']);
 
index d429c54..392d5b2 100644 (file)
@@ -23,9 +23,9 @@
  */
 
 defined('MOODLE_INTERNAL') || die();
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100; // Requires this Moodle version.
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200; // Requires this Moodle version.
 $plugin->component = 'tool_mobile'; // Full name of the plugin (used for diagnostics).
 $plugin->dependencies = array(
-    'webservice_rest' => 2019051100
+    'webservice_rest' => 2019111200
 );
index 58d88d8..d5fd219 100644 (file)
@@ -26,6 +26,6 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version   = 2019052000;     // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100;     // Requires this Moodle version.
+$plugin->version   = 2019111800;     // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200;     // Requires this Moodle version.
 $plugin->component = 'tool_monitor'; // Full name of the plugin (used for diagnostics).
index f0750b6..242fdec 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100; // Requires this Moodle version
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200; // Requires this Moodle version
 $plugin->component = 'tool_multilangupgrade'; // Full name of the plugin (used for diagnostics)
 
index d3a0f36..14e51ca 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100; // Requires this Moodle version.
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200; // Requires this Moodle version.
 $plugin->component = 'tool_oauth2'; // Full name of the plugin (used for diagnostics).
 
index 5a6358d..2028751 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100; // Requires this Moodle version
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200; // Requires this Moodle version
 $plugin->component = 'tool_phpunit'; // Full name of the plugin (used for diagnostics)
 
index 2c211e8..e3723b6 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;         // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100;         // Requires this Moodle version.
+$plugin->version   = 2019111800;         // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200;         // Requires this Moodle version.
 $plugin->component = 'tool_policy';      // Full name of the plugin (used for diagnostics).
index 756def9..ca4fe22 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100; // Requires this Moodle version
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200; // Requires this Moodle version
 $plugin->component = 'tool_profiling'; // Full name of the plugin (used for diagnostics)
index b644e4d..ecbe561 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100; // Requires this Moodle version.
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200; // Requires this Moodle version.
 $plugin->component = 'tool_recyclebin'; // Full name of the plugin (used for diagnostics).
index de0e3df..23f731a 100644 (file)
@@ -25,8 +25,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100; // Requires this Moodle version
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200; // Requires this Moodle version
 $plugin->component = 'tool_replace'; // Full name of the plugin (used for diagnostics)
 
 $plugin->maturity  = MATURITY_ALPHA; // this version's maturity level
index d56a836..4457d4b 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;
 $plugin->component = 'tool_spamcleaner'; // Full name of the plugin (used for diagnostics)
 
index f4e09e4..310690e 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100; // Requires this Moodle version
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200; // Requires this Moodle version
 $plugin->component = 'tool_task'; // Full name of the plugin (used for diagnostics)
 
index 625a195..c983a76 100644 (file)
@@ -21,6 +21,6 @@
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 defined('MOODLE_INTERNAL') || die();
-$plugin->version   = 2019052002; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100; // Requires this Moodle version.
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200; // Requires this Moodle version.
 $plugin->component = 'tool_templatelibrary'; // Full name of the plugin (used for diagnostics).
index b71623d..6688a89 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100; // Requires this Moodle version
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200; // Requires this Moodle version
 $plugin->component = 'tool_unsuproles'; // Full name of the plugin (used for diagnostics)
 
index 6efdbba..e51d2c2 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;            // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100;            // Requires this Moodle version.
+$plugin->version   = 2019111800;            // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200;            // Requires this Moodle version.
 $plugin->component = 'tool_uploadcourse';   // Full name of the plugin (used for diagnostics).
index 490ed22..865ee07 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100; // Requires this Moodle version
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200; // Requires this Moodle version
 $plugin->component = 'tool_uploaduser'; // Full name of the plugin (used for diagnostics)
 
index be0ca0d..0a977db 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;            // The current module version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100;            // Requires this Moodle version.
+$plugin->version   = 2019111800;            // The current module version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200;            // Requires this Moodle version.
 $plugin->component = 'tool_usertours';      // Full name of the plugin (used for diagnostics).
index 78b045c..124c29e 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100; // Requires this Moodle version
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200; // Requires this Moodle version
 $plugin->component = 'tool_xmldb'; // Full name of the plugin (used for diagnostics)
 
index d3f9271..1fc16d2 100644 (file)
@@ -26,8 +26,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'auth_cas';        // Full name of the plugin (used for diagnostics)
 
-$plugin->dependencies = array('auth_ldap' => 2019051100);
+$plugin->dependencies = array('auth_ldap' => 2019111200);
index 2abdd68..ae766d4 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'auth_db';         // Full name of the plugin (used for diagnostics)
index 033a486..13624a0 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'auth_email';      // Full name of the plugin (used for diagnostics)
index bdea652..d16b0ae 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'auth_ldap';       // Full name of the plugin (used for diagnostics)
index 3ee8238..27494f8 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires = 2019051100; // Requires this Moodle version.
+$plugin->version = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires = 2019111200; // Requires this Moodle version.
 $plugin->component = 'auth_lti'; // Full name of the plugin (used for diagnostics).
index 7197cd5..6c56a08 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'auth_manual';     // Full name of the plugin (used for diagnostics)
index b546cac..1c5e7b8 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'auth_mnet';       // Full name of the plugin (used for diagnostics)
index 09103da..8a6a918 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'auth_nologin';    // Full name of the plugin (used for diagnostics)
index 8643466..b09772e 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'auth_none';       // Full name of the plugin (used for diagnostics)
index 5aea717..57d863d 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052001;        // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100;        // Requires this Moodle version.
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200;        // Requires this Moodle version.
 $plugin->component = 'auth_oauth2';       // Full name of the plugin (used for diagnostics).
index 666267c..e562e90 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'auth_shibboleth'; // Full name of the plugin (used for diagnostics)
index 8d6160b..762c0d4 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'auth_webservice'; // Full name of the plugin (used for diagnostics)
index 67e3967..71d6281 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000;
-$plugin->requires = 2019051100;
+$plugin->version = 2019111800;
+$plugin->requires = 2019111200;
 $plugin->component = 'availability_completion';
index 62adb4d..ff76c48 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000;
-$plugin->requires = 2019051100;
+$plugin->version = 2019111800;
+$plugin->requires = 2019111200;
 $plugin->component = 'availability_date';
index 2583133..6fb713f 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000;
-$plugin->requires = 2019051100;
+$plugin->version = 2019111800;
+$plugin->requires = 2019111200;
 $plugin->component = 'availability_grade';
index bc852bc..7a2a63a 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000;
-$plugin->requires = 2019051100;
+$plugin->version = 2019111800;
+$plugin->requires = 2019111200;
 $plugin->component = 'availability_group';
index 45e46da..e53c39a 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000;
-$plugin->requires = 2019051100;
+$plugin->version = 2019111800;
+$plugin->requires = 2019111200;
 $plugin->component = 'availability_grouping';
index e8a8bac..1ede4b2 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000;
-$plugin->requires = 2019051100;
+$plugin->version = 2019111800;
+$plugin->requires = 2019111200;
 $plugin->component = 'availability_profile';
index 03449e0..ed639c5 100644 (file)
@@ -142,7 +142,7 @@ abstract class backup implements checksumable {
      * point is backup when some behavior/approach channged, in order to allow
      * conditional coding based on it.
      */
-    const VERSION = 2019052000;
+    const VERSION = 2019111800;
     /**
      * Usually same than major release zero version, mainly for informative/historic purposes.
      */
index ee7ad64..b2eac0b 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_activity_modules'; // Full name of the plugin (used for diagnostics)
index 08fe783..e10881b 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;               // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100;               // Requires this Moodle version.
+$plugin->version   = 2019111800;               // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200;               // Requires this Moodle version.
 $plugin->component = 'block_activity_results'; // Full name of the plugin (used for diagnostics).
\ No newline at end of file
index c217884..87d64b7 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_admin_bookmarks'; // Full name of the plugin (used for diagnostics)
index 93a3924..7291d8d 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100;        // Requires this Moodle version.
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200;        // Requires this Moodle version.
 $plugin->component = 'block_badges';
index 2416b1b..0efc4f9 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_blog_menu'; // Full name of the plugin (used for diagnostics)
index a5f3b56..9c09ae7 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_blog_recent'; // Full name of the plugin (used for diagnostics)
index 0c714d0..2a5bdc4 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_blog_tags'; // Full name of the plugin (used for diagnostics)
index 64fd601..0442430 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_calendar_month'; // Full name of the plugin (used for diagnostics)
index 2acd6b5..acf9f84 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_calendar_upcoming'; // Full name of the plugin (used for diagnostics)
index 31d3228..c3c58ff 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_comments'; // Full name of the plugin (used for diagnostics)
index c0ccbd6..d00508e 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version      = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires     = 2019051100; // Requires this Moodle version.
+$plugin->version      = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires     = 2019111200; // Requires this Moodle version.
 $plugin->component    = 'block_completionstatus';
-$plugin->dependencies = array('report_completion' => 2019051100);
+$plugin->dependencies = array('report_completion' => 2019111200);
index c7de7ac..b794775 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_course_list'; // Full name of the plugin (used for diagnostics)
index 567b988..11ef527 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_course_summary'; // Full name of the plugin (used for diagnostics)
index d8367fc..f9e9438 100644 (file)
@@ -24,8 +24,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_feedback';  // Full name of the plugin (used for diagnostics)
 
-$plugin->dependencies = array('mod_feedback' => 2019051100);
+$plugin->dependencies = array('mod_feedback' => 2019111200);
index 33c49fe..7951a96 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version = 2019052000;
-$plugin->requires  = 2019051100;
+$plugin->version = 2019111800;
+$plugin->requires  = 2019111200;
 $plugin->component = 'block_globalsearch';
index 85d9212..803f2ea 100644 (file)
@@ -24,8 +24,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_glossary_random'; // Full name of the plugin (used for diagnostics)
 
-$plugin->dependencies = array('mod_glossary' => 2019051100);
+$plugin->dependencies = array('mod_glossary' => 2019111200);
index 14e6e02..46a8d71 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_html';      // Full name of the plugin (used for diagnostics)
index efa4258..7b0315b 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_login';     // Full name of the plugin (used for diagnostics)
index 442301e..6489d37 100644 (file)
@@ -24,8 +24,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;
 $plugin->component = 'block_lp';
 $plugin->dependencies = array(
     'tool_lp' => ANY_VERSION
index 1c5eb89..0eb0e65 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_mentees';   // Full name of the plugin (used for diagnostics)
index 104771b..3492cc3 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_mnet_hosts'; // Full name of the plugin (used for diagnostics)
index bb97960..8b31314 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019100900;         // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100;         // Requires this Moodle version.
+$plugin->version   = 2019111800;         // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200;         // Requires this Moodle version.
 $plugin->component = 'block_myoverview'; // Full name of the plugin (used for diagnostics).
index e450842..65e9161 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_myprofile'; // Full name of the plugin (used for diagnostics)
index 22f11b7..6631b28 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_navigation'; // Full name of the plugin (used for diagnostics)
index 8e224cb..1685620 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;         // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;         // Requires this Moodle version
+$plugin->version   = 2019111800;         // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;         // Requires this Moodle version
 $plugin->component = 'block_news_items'; // Full name of the plugin (used for diagnostics)
-$plugin->dependencies = array('mod_forum' => 2019051100);
+$plugin->dependencies = array('mod_forum' => 2019111200);
index c5806d3..4a03498 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052001;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_online_users'; // Full name of the plugin (used for diagnostics)
index c7e14d4..6514a4d 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_private_files'; // Full name of the plugin (used for diagnostics)
index 1775aa9..a525cd0 100644 (file)
@@ -24,8 +24,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_quiz_results'; // Full name of the plugin (used for diagnostics)
 
-$plugin->dependencies = array('mod_quiz' => 2019051100);
+$plugin->dependencies = array('mod_quiz' => 2019111200);
index 5e932ca..9744d6b 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_recent_activity'; // Full name of the plugin (used for diagnostics)
index 08dcbad..cabcf37 100644 (file)
@@ -22,6 +22,6 @@
  */
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052001;            // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100;            // Requires this Moodle version.
+$plugin->version   = 2019111800;            // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200;            // Requires this Moodle version.
 $plugin->component = 'block_recentlyaccessedcourses'; // Full name of the plugin (used for diagnostics).
index d60ba3c..87b78a9 100644 (file)
@@ -22,6 +22,6 @@
  */
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052001;            // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100;            // Requires this Moodle version.
+$plugin->version   = 2019111800;            // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200;            // Requires this Moodle version.
 $plugin->component = 'block_recentlyaccesseditems'; // Full name of the plugin (used for diagnostics).
index 3c104d8..f90483c 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_rss_client'; // Full name of the plugin (used for diagnostics)
index eb01039..7aa1f2d 100644 (file)
@@ -24,8 +24,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_search_forums'; // Full name of the plugin (used for diagnostics)
 
-$plugin->dependencies = array('mod_forum' => 2019051100);
+$plugin->dependencies = array('mod_forum' => 2019111200);
index 614cd32..1a93d96 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_section_links'; // Full name of the plugin (used for diagnostics)
index 536af5d..28dd98c 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_selfcompletion'; // Full name of the plugin (used for diagnostics)
index 925525c..a4c50af 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_settings';  // Full name of the plugin (used for diagnostics)
index 6d5fce5..4794873 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_site_main_menu'; // Full name of the plugin (used for diagnostics)
index 8e5f6d1..8da7f01 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_social_activities'; // Full name of the plugin (used for diagnostics)
index 83a69d1..e321574 100644 (file)
@@ -23,6 +23,6 @@
  */
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version = 2019052001;
-$plugin->requires  = 2019051100;
+$plugin->version = 2019111800;
+$plugin->requires  = 2019111200;
 $plugin->component = 'block_starredcourses';
\ No newline at end of file
index eb71aea..661835e 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_tag_flickr'; // Full name of the plugin (used for diagnostics)
index f382698..b2c43fb 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_tag_youtube'; // Full name of the plugin (used for diagnostics)
index 1e19230..8c0adc2 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'block_tags';      // Full name of the plugin (used for diagnostics)
index 47db537..497eae5 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;         // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100;         // Requires this Moodle version.
+$plugin->version   = 2019111800;         // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200;         // Requires this Moodle version.
 $plugin->component = 'block_timeline'; // Full name of the plugin (used for diagnostics).
index 6834bea..777dfff 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'cachelock_file';  // Full name of the plugin (used for diagnostics)
index 8918e38..465179f 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version = 2019052000;
-$plugin->requires = 2019051100;
+$plugin->version = 2019111800;
+$plugin->requires = 2019111200;
 $plugin->maturity = MATURITY_STABLE;
 $plugin->component = 'cachestore_apcu';
index ea07304..73b2b8b 100644 (file)
@@ -27,6 +27,6 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version = 2019052000;    // The current module version (Date: YYYYMMDDXX)
-$plugin->requires = 2019051100;    // Requires this Moodle version.
+$plugin->version = 2019111800;    // The current module version (Date: YYYYMMDDXX)
+$plugin->requires = 2019111200;    // Requires this Moodle version.
 $plugin->component = 'cachestore_file';  // Full name of the plugin.
\ No newline at end of file
index d93f172..a841414 100644 (file)
@@ -26,6 +26,6 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version   = 2019052000;    // The current module version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;    // Requires this Moodle version.
+$plugin->version   = 2019111800;    // The current module version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;    // Requires this Moodle version.
 $plugin->component = 'cachestore_memcached';  // Full name of the plugin.
\ No newline at end of file
index be3875b..b0d3556 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version   = 2019052000;    // The current module version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;    // Requires this Moodle version.
+$plugin->version   = 2019111800;    // The current module version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;    // Requires this Moodle version.
 $plugin->component = 'cachestore_mongodb';  // Full name of the plugin.
\ No newline at end of file
index 363a606..92ea9f9 100644 (file)
@@ -24,8 +24,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version    = 2019052000;
-$plugin->requires   = 2019051100; // Requires this Moodle version.
+$plugin->version    = 2019111800;
+$plugin->requires   = 2019111200; // Requires this Moodle version.
 $plugin->maturity   = MATURITY_STABLE;
 $plugin->component  = 'cachestore_redis';
 $plugin->release    = '3.0.4 (Build: 20160509)';
index aa360df..4709642 100644 (file)
@@ -27,6 +27,6 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version = 2019052000;    // The current module version (Date: YYYYMMDDXX)
-$plugin->requires = 2019051100;    // Requires this Moodle version.
+$plugin->version = 2019111800;    // The current module version (Date: YYYYMMDDXX)
+$plugin->requires = 2019111200;    // Requires this Moodle version.
 $plugin->component = 'cachestore_session';  // Full name of the plugin.
\ No newline at end of file
index 958bb96..9f71f5d 100644 (file)
@@ -27,6 +27,6 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version   = 2019052000;    // The current module version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;    // Requires this Moodle version.
+$plugin->version   = 2019111800;    // The current module version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;    // Requires this Moodle version.
 $plugin->component = 'cachestore_static';  // Full name of the plugin.
\ No newline at end of file
index 41a5914..de0cdf3 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100; // Requires this Moodle version.
+$plugin->version   = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200; // Requires this Moodle version.
 $plugin->component = 'calendartype_gregorian'; // Full name of the plugin (used for diagnostics).
index 63030f8..ecd4c40 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;              // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;              // Requires this Moodle version
+$plugin->version   = 2019111800;              // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;              // Requires this Moodle version
 $plugin->component = 'format_singleactivity'; // Full name of the plugin (used for diagnostics)
index 651f46a..41c9bcd 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'format_social';   // Full name of the plugin (used for diagnostics)
index 71a48d4..5e3f288 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100;        // Requires this Moodle version.
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200;        // Requires this Moodle version.
 $plugin->component = 'format_topics';    // Full name of the plugin (used for diagnostics).
index f9acd01..216611b 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100;        // Requires this Moodle version.
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200;        // Requires this Moodle version.
 $plugin->component = 'format_weeks';    // Full name of the plugin (used for diagnostics).
index 181586d..c9e1240 100644 (file)
@@ -72,7 +72,11 @@ function add_moduleinfo($moduleinfo, $course, $mform = null) {
     $completion = new completion_info($course);
     if ($completion->is_enabled()) {
         $newcm->completion                = $moduleinfo->completion;
-        $newcm->completiongradeitemnumber = $moduleinfo->completiongradeitemnumber;
+        if ($moduleinfo->completiongradeitemnumber === '') {
+            $newcm->completiongradeitemnumber = null;
+        } else {
+            $newcm->completiongradeitemnumber = $moduleinfo->completiongradeitemnumber;
+        }
         $newcm->completionview            = $moduleinfo->completionview;
         $newcm->completionexpected        = $moduleinfo->completionexpected;
     }
@@ -411,7 +415,7 @@ function set_moduleinfo_defaults($moduleinfo) {
     // Convert the 'use grade' checkbox into a grade-item number: 0 if checked, null if not.
     if (isset($moduleinfo->completionusegrade) && $moduleinfo->completionusegrade) {
         $moduleinfo->completiongradeitemnumber = 0;
-    } else {
+    } else if (!isset($moduleinfo->completiongradeitemnumber)) {
         $moduleinfo->completiongradeitemnumber = null;
     }
 
@@ -524,7 +528,11 @@ function update_moduleinfo($cm, $moduleinfo, $course, $mform = null) {
         // the activity may be locked; if so, these should not be updated.
         if (!empty($moduleinfo->completionunlocked)) {
             $cm->completion = $moduleinfo->completion;
-            $cm->completiongradeitemnumber = $moduleinfo->completiongradeitemnumber;
+            if ($moduleinfo->completiongradeitemnumber === '') {
+                $cm->completiongradeitemnumber = null;
+            } else {
+                $cm->completiongradeitemnumber = $moduleinfo->completiongradeitemnumber;
+            }
             $cm->completionview = $moduleinfo->completionview;
         }
         // The expected date does not affect users who have completed the activity,
@@ -684,6 +692,7 @@ function get_moduleinfo_data($cm, $course) {
     $data->completionview     = $cm->completionview;
     $data->completionexpected = $cm->completionexpected;
     $data->completionusegrade = is_null($cm->completiongradeitemnumber) ? 0 : 1;
+    $data->completiongradeitemnumber = $cm->completiongradeitemnumber;
     $data->showdescription    = $cm->showdescription;
     $data->tags               = core_tag_tag::get_item_tags_array('core', 'course_modules', $cm->id);
     if (!empty($CFG->enableavailability)) {
index ead3500..b00cf76 100644 (file)
@@ -370,6 +370,9 @@ abstract class moodleform_mod extends moodleform {
                 if ($mform->elementExists('completionusegrade')) {
                     $mform->freeze('completionusegrade');
                 }
+                if ($mform->elementExists('completiongradeitemnumber')) {
+                    $mform->freeze('completiongradeitemnumber');
+                }
                 $mform->freeze($this->_customcompletionelements);
             }
         }
@@ -449,16 +452,46 @@ abstract class moodleform_mod extends moodleform {
                     $errors[$gradepassfieldname] = get_string('gradepassgreaterthangrade', 'grades', $grade);
                 }
             }
+
+            // We have a grade if there is a non-falsey value for:
+            // - the assessedfieldname for Ratings there; or
+            // - the gradefieldname for Ratings there.
+            if (empty($data[$assessedfieldname]) && empty($data[$gradefieldname])) {
+                // There are no grades set therefore completion is not allowed.
+                if (isset($data['completiongradeitemnumber']) && $data['completiongradeitemnumber'] == (string) $itemnumber) {
+                    $errors['completiongradeitemnumber'] = get_string(
+                        'badcompletiongradeitemnumber',
+                        'completion',
+                        get_string("grade_{$itemname}_name", $component)
+                    );
+                }
+            }
         }
 
         // Completion: Don't let them choose automatic completion without turning
         // on some conditions. Ignore this check when completion settings are
         // locked, as the options are then disabled.
-        if (array_key_exists('completion', $data) &&
-                $data['completion'] == COMPLETION_TRACKING_AUTOMATIC &&
-                !empty($data['completionunlocked'])) {
-            if (empty($data['completionview']) && empty($data['completionusegrade']) &&
-                !$this->completion_rule_enabled($data)) {
+        $automaticcompletion = array_key_exists('completion', $data);
+        $automaticcompletion = $automaticcompletion && $data['completion'] == COMPLETION_TRACKING_AUTOMATIC;
+        $automaticcompletion = $automaticcompletion && !empty($data['completionunlocked']);
+
+        if ($automaticcompletion) {
+            // View to complete.
+            $rulesenabled = !empty($data['completionview']);
+
+            // Use grade to complete (only one grade item).
+            $rulesenabled = $rulesenabled || !empty($data['completionusegrade']);
+
+            // Use grade to complete (specific grade item).
+            if (!$rulesenabled && isset($data['completiongradeitemnumber'])) {
+                $rulesenabled = $data['completiongradeitemnumber'] != '';
+            }
+
+            // Module-specific completion rules.
+            $rulesenabled = $rulesenabled || $this->completion_rule_enabled($data);
+
+            if (!$rulesenabled) {
+                // No rules are enabled. Can't set automatically completed without rules.
                 $errors['completion'] = get_string('badautocompletion', 'completion');
             }
         }
@@ -657,17 +690,53 @@ abstract class moodleform_mod extends moodleform {
                 $gotcompletionoptions = true;
             }
 
-            // Automatic completion once it's graded
             if (plugin_supports('mod', $this->_modname, FEATURE_GRADE_HAS_GRADE, false)) {
-                $mform->addElement('checkbox', 'completionusegrade', get_string('completionusegrade', 'completion'),
-                    get_string('completionusegrade_desc', 'completion'));
-                $mform->hideIf('completionusegrade', 'completion', 'ne', COMPLETION_TRACKING_AUTOMATIC);
-                $mform->addHelpButton('completionusegrade', 'completionusegrade', 'completion');
+                // This activity supports grading.
                 $gotcompletionoptions = true;
 
-                // If using the rating system, there is no grade unless ratings are enabled.
-                if ($this->_features->rating) {
-                    $mform->disabledIf('completionusegrade', 'assessed', 'eq', 0);
+                $component = "mod_{$this->_modname}";
+                $itemnames = component_gradeitems::get_itemname_mapping_for_component($component);
+
+                if (count($itemnames) === 1) {
+                    // Only one gradeitem in this activity.
+                    // We use the completionusegrade field here.
+                    $mform->addElement(
+                        'checkbox',
+                        'completionusegrade',
+                        get_string('completionusegrade', 'completion'),
+                        get_string('completionusegrade_desc', 'completion')
+                    );
+                    $mform->hideIf('completionusegrade', 'completion', 'ne', COMPLETION_TRACKING_AUTOMATIC);
+                    $mform->addHelpButton('completionusegrade', 'completionusegrade', 'completion');
+
+                    // The disabledIf logic differs between ratings and other grade items due to different field types.
+                    if ($this->_features->rating) {
+                        // If using the rating system, there is no grade unless ratings are enabled.
+                        $mform->disabledIf('completionusegrade', 'assessed', 'eq', 0);
+                    } else {
+                        // All other field types use the '$gradefieldname' field's modgrade_type.
+                        $itemnumbers = array_keys($itemnames);
+                        $itemnumber = array_shift($itemnumbers);
+                        $gradefieldname = component_gradeitems::get_field_name_for_itemnumber($component, $itemnumber, 'grade');
+                        $mform->disabledIf('completionusegrade', "{$gradefieldname}[modgrade_type]", 'eq', 'none');
+                    }
+                } else if (count($itemnames) > 1) {
+                    // There are multiple grade items in this activity.
+                    // Show them all.
+                    $options = [
+                        '' => get_string('activitygradenotrequired', 'completion'),
+                    ];
+                    foreach ($itemnames as $itemnumber => $itemname) {
+                        $options[$itemnumber] = get_string("grade_{$itemname}_name", $component);
+                    }
+
+                    $mform->addElement(
+                        'select',
+                        'completiongradeitemnumber',
+                        get_string('completionusegrade', 'completion'),
+                        $options
+                    );
+                    $mform->hideIf('completiongradeitemnumber', 'completion', 'ne', COMPLETION_TRACKING_AUTOMATIC);
                 }
             }
 
index 2196333..c6eab11 100644 (file)
@@ -112,6 +112,7 @@ class core_course_modlib_testcase extends advanced_testcase {
         $expecteddata->completionview     = $assigncm->completionview;
         $expecteddata->completionexpected = $assigncm->completionexpected;
         $expecteddata->completionusegrade = is_null($assigncm->completiongradeitemnumber) ? 0 : 1;
+        $expecteddata->completiongradeitemnumber = null;
         $expecteddata->showdescription    = $assigncm->showdescription;
         $expecteddata->tags               = core_tag_tag::get_item_tags_array('core', 'course_modules', $assigncm->id);
         $expecteddata->availabilityconditionsjson = null;
index 27105d7..0205e44 100644 (file)
@@ -24,5 +24,5 @@
 defined('MOODLE_INTERNAL') || die();
 
 $plugin->component = 'customfield_checkbox';
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;
index 23a9f25..30b4b2b 100644 (file)
@@ -25,6 +25,6 @@
 defined('MOODLE_INTERNAL') || die();
 
 $plugin->component = 'customfield_date';
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;
 
index 367f630..bbf13b0 100644 (file)
@@ -25,5 +25,5 @@
 defined('MOODLE_INTERNAL') || die();
 
 $plugin->component = 'customfield_select';
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;
index 0f38b30..f5ed72f 100644 (file)
@@ -25,5 +25,5 @@
 defined('MOODLE_INTERNAL') || die();
 
 $plugin->component = 'customfield_text';
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;
index 9315748..7884806 100644 (file)
@@ -25,5 +25,5 @@
 defined('MOODLE_INTERNAL') || die();
 
 $plugin->component = 'customfield_textarea';
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;
index 131cb78..d601973 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;  // Requires this Moodle version.
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;  // Requires this Moodle version.
 $plugin->component = 'dataformat_csv';
 
index b75c0c5..dce6768 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;  // Requires this Moodle version.
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;  // Requires this Moodle version.
 $plugin->component = 'dataformat_excel';
 
index eb7afda..83b4d48 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;  // Requires this Moodle version.
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;  // Requires this Moodle version.
 $plugin->component = 'dataformat_html';
index 30c0250..58d6409 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;  // Requires this Moodle version.
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;  // Requires this Moodle version.
 $plugin->component = 'dataformat_json';
index ab4112d..f9e1d46 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;  // Requires this Moodle version.
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;  // Requires this Moodle version.
 $plugin->component = 'dataformat_ods';
 
index dd978ea..dfe72a8 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;  // Requires this Moodle version.
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;  // Requires this Moodle version.
 $plugin->component = 'dataformat_pdf';
index 753f611..4891765 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'enrol_category';  // Full name of the plugin (used for diagnostics)
index dc64f49..91462f0 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'enrol_cohort';    // Full name of the plugin (used for diagnostics)
index 6d61709..a262064 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'enrol_database';  // Full name of the plugin (used for diagnostics)
index 55076fa..3ecc435 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDRR)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDRR)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'enrol_flatfile';  // Full name of the plugin (used for diagnostics)
index 5487601..ff777a7 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'enrol_guest';     // Full name of the plugin (used for diagnostics)
index c5c3852..ca293db 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version.
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version.
 $plugin->component = 'enrol_imsenterprise';
index 82385f3..0e97a42 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'enrol_ldap';      // Full name of the plugin (used for diagnostics)
index e2fa3d0..65e791a 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires = 2019051100; // Requires this Moodle version.
+$plugin->version = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires = 2019111200; // Requires this Moodle version.
 $plugin->component = 'enrol_lti'; // Full name of the plugin (used for diagnostics).
index d0ac795..9e9a611 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'enrol_manual';    // Full name of the plugin (used for diagnostics)
index c10499d..ff130c7 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'enrol_meta';      // Full name of the plugin (used for diagnostics)
index 6c883bf..67be192 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'enrol_mnet';      // Full name of the plugin (used for diagnostics)
index 7994728..1dd7834 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'enrol_paypal';    // Full name of the plugin (used for diagnostics)
index d4e51fe..dae54c1 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'enrol_self';      // Full name of the plugin (used for diagnostics)
index 8759f62..c5a10ee 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;         // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;         // Requires this Moodle version
+$plugin->version   = 2019111800;         // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;         // Requires this Moodle version
 $plugin->component = 'fileconverter_googledrive'; // Full name of the plugin (used for diagnostics).
index cdb2df9..7a3d98a 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;         // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;         // Requires this Moodle version
+$plugin->version   = 2019111800;         // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;         // Requires this Moodle version
 $plugin->component = 'fileconverter_unoconv'; // Full name of the plugin (used for diagnostics).
index 27c4abe..f937331 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'filter_activitynames'; // Full name of the plugin (used for diagnostics)
index 1596148..5333898 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'filter_algebra';  // Full name of the plugin (used for diagnostics)
index b4ce4de..fec8087 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'filter_censor';   // Full name of the plugin (used for diagnostics)
index dee7b60..2dddd51 100644 (file)
@@ -25,8 +25,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version  = 2019052000;
-$plugin->requires = 2019051100;  // Requires this Moodle version.
+$plugin->version  = 2019111800;
+$plugin->requires = 2019111200;  // Requires this Moodle version.
 $plugin->component= 'filter_data';
 
-$plugin->dependencies = array('mod_data' => 2019051100);
+$plugin->dependencies = array('mod_data' => 2019111200);
index 950324d..dfb1f12 100644 (file)
@@ -27,8 +27,6 @@ defined('MOODLE_INTERNAL') || die;
 $string['allowedsourceslist'] = 'Allowed sources';
 $string['allowedsourceslistdesc'] = 'A list of URLs from which users can embed H5P content. If none are specified, all URLs will remain as links and not be displayed as embedded H5P content.
 
-\'[id]\' is a placeholder for the H5P content ID in the external source.
-
-The wildcard character \'*\' may be used to specify subdomains. For example, *.example.com will allow embedded H5P content from any subdomain of example.com, but not from the example.com domain.';
+\'[id]\' is a placeholder for the H5P content ID in the external source.';
 $string['filtername'] = 'Display H5P';
 $string['privacy:metadata'] = 'The display H5P filter does not store any personal data.';
index 4f81765..88a3038 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version  = 2019110800;
-$plugin->requires = 2019092000;
+$plugin->version  = 2019111800;
+$plugin->requires = 2019111200;
 $plugin->component = 'filter_displayh5p';
index dec078c..fd067f1 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'filter_emailprotect'; // Full name of the plugin (used for diagnostics)
index 43d4af9..285688c 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'filter_emoticon'; // Full name of the plugin (used for diagnostics)
index fafca60..4f788a1 100644 (file)
@@ -25,8 +25,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version  = 2019052000;
-$plugin->requires = 2019051100;  // Requires this Moodle version.
+$plugin->version  = 2019111800;
+$plugin->requires = 2019111200;  // Requires this Moodle version.
 $plugin->component= 'filter_glossary';
 
-$plugin->dependencies = array('mod_glossary' => 2019051100);
+$plugin->dependencies = array('mod_glossary' => 2019111200);
index 4583e04..6659239 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version  = 2019052000;
-$plugin->requires = 2019051100;  // Requires this Moodle version.
+$plugin->version  = 2019111800;
+$plugin->requires = 2019111200;  // Requires this Moodle version.
 $plugin->component= 'filter_mathjaxloader';
index 1be71d6..c000a5c 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'filter_mediaplugin'; // Full name of the plugin (used for diagnostics)
index 1861c79..624b3ad 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'filter_multilang'; // Full name of the plugin (used for diagnostics)
index 1e89b59..67ce940 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'filter_tex';      // Full name of the plugin (used for diagnostics)
index 5057bb5..673a3ce 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'filter_tidy';     // Full name of the plugin (used for diagnostics)
index 173aa9d..471eff4 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'filter_urltolink'; // Full name of the plugin (used for diagnostics)
index f46355d..c4db272 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'gradeexport_ods'; // Full name of the plugin (used for diagnostics)
index 9ce3085..804193e 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'gradeexport_txt'; // Full name of the plugin (used for diagnostics)
index 80d0ade..51ff115 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'gradeexport_xls'; // Full name of the plugin (used for diagnostics)
index a4dad63..64443e9 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'gradeexport_xml'; // Full name of the plugin (used for diagnostics)
index a774d44..1e9f5fd 100644 (file)
@@ -25,6 +25,6 @@
 defined('MOODLE_INTERNAL') || die();
 
 $plugin->component  = 'gradingform_guide';
-$plugin->version    = 2019100300;
-$plugin->requires   = 2019051100;
+$plugin->version    = 2019111800;
+$plugin->requires   = 2019111200;
 $plugin->maturity   = MATURITY_STABLE;
index f08c267..438c5d9 100644 (file)
@@ -25,8 +25,8 @@
 defined('MOODLE_INTERNAL') || die();
 
 $plugin->component  = 'gradingform_rubric';
-$plugin->version    = 2019052006;
+$plugin->version    = 2019111800;
 
-$plugin->requires   = 2019051100;
+$plugin->requires   = 2019111200;
 
 $plugin->maturity   = MATURITY_STABLE;
index 1669e72..5119a4f 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'gradeimport_csv'; // Full name of the plugin (used for diagnostics)
index be391af..33d0329 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'gradeimport_direct'; // Full name of the plugin (used for diagnostics).
-$plugin->dependencies = array('gradeimport_csv' => 2019051100); // Grade import csv is required for this plugin.
\ No newline at end of file
+$plugin->dependencies = array('gradeimport_csv' => 2019111200); // Grade import csv is required for this plugin.
\ No newline at end of file
index 04ef5b2..107391e 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'gradeimport_xml'; // Full name of the plugin (used for diagnostics)
index 10f2165..77c6cfb 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'gradereport_grader'; // Full name of the plugin (used for diagnostics)
index 0b6ab86..b19225b 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;
-$plugin->requires  = 2019051100;
+$plugin->version   = 2019111800;
+$plugin->requires  = 2019111200;
 $plugin->component = 'gradereport_history';
index 9394b8a..ef5fef0 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'gradereport_outcomes'; // Full name of the plugin (used for diagnostics)
index 2f22935..dc2317d 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'gradereport_overview'; // Full name of the plugin (used for diagnostics)
index d769f39..860d209 100644 (file)
@@ -25,5 +25,5 @@
 defined('MOODLE_INTERNAL') || die();
 
 $plugin->component = 'gradereport_singleview'; // Full name of the plugin (used for diagnostics).
-$plugin->version  = 2019052000;
-$plugin->requires = 2019051100;
+$plugin->version  = 2019111800;
+$plugin->requires = 2019111200;
index e2634be..7596a6c 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
+$plugin->version   = 2019111800;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'gradereport_user'; // Full name of the plugin (used for diagnostics)
index 418304b..fb4eb27 100644 (file)
@@ -171,11 +171,16 @@ class core extends \H5PCore {
         $typesinstalled = [];
 
         foreach ($contenttypes->contentTypes as $type) {
+            // Don't fetch content types that require a higher H5P core API version.
+            if (!$this->is_required_core_api($type->coreApiVersionNeeded)) {
+                continue;
+            }
+
             $library = [
                 'machineName' => $type->id,
                 'majorVersion' => $type->version->major,
                 'minorVersion' => $type->version->minor,
-                'patchVersion' => $type->version->patch,
+                'patchVersion' => $type->version->patch
             ];
 
             $factory = new \core_h5p\factory();
@@ -284,4 +289,21 @@ class core extends \H5PCore {
 
         return $contenttypes;
     }
+
+    /**
+     * Checks that the required H5P core API version or higher is installed.
+     *
+     * @param stdClass $coreapi Object with properties major and minor for the core API version required.
+     * @return bool True if the required H5P core API version is installed. False if not.
+     */
+    public function is_required_core_api($coreapi): bool {
+        if (isset($coreapi) && !empty($coreapi)) {
+            if (($coreapi->major > H5PCore::$coreApi['majorVersion']) ||
+                (($coreapi->major == H5PCore::$coreApi['majorVersion']) && ($coreapi->minor > H5PCore::$coreApi['minorVersion']))) {
+                return false;
+            }
+        }
+        return true;
+    }
+
 }
index 3c63966..416f358 100644 (file)
@@ -720,6 +720,8 @@ class framework implements \H5PFrameworkInterface {
             'droplibrarycss' => $droplibrarycss,
             'semantics' => $librarydata['semantics'],
             'addto' => isset($librarydata['addTo']) ? json_encode($librarydata['addTo']) : null,
+            'coremajor' => isset($librarydata['coreApi']['majorVersion']) ? $librarydata['coreApi']['majorVersion'] : null,
+            'coreminor' => isset($librarydata['coreApi']['majorVersion']) ? $librarydata['coreApi']['minorVersion'] : null,
         );
 
         if ($new) {
index 26ba067..e9981a9 100644 (file)
@@ -372,7 +372,9 @@ class core_h5p_generator extends \component_generator_base {
                 'majorversion' => $contenttype->version->major,
                 'minorversion' => $contenttype->version->minor,
                 'patchversion' => $contenttype->version->patch,
-                'runnable' => 1
+                'runnable' => 1,
+                'coremajor' => $contenttype->coreApiVersionNeeded->major,
+                'coreminor' => $contenttype->coreApiVersionNeeded->minor
             ];
             $DB->insert_record('h5p_libraries', (object) $library);
         }
index 2ddd341..118484c 100644 (file)
@@ -243,7 +243,9 @@ class generator_testcase extends \advanced_testcase {
             'preloadedcss' => 'css/example.css',
             'droplibrarycss' => '',
             'semantics' => 'Semantics example',
-            'addto' => '/regex11/'
+            'addto' => '/regex11/',
+            'coremajor' => null,
+            'coreminor' => null,
         ];
 
         $this->assertEquals($expected, $data);
index 4fef3e1..9bca6c6 100644 (file)
@@ -60,26 +60,32 @@ class h5p_core_test extends \advanced_testcase {
             $this->markTestSkipped('PHPUNIT_LONGTEST is not defined');
         }
 
+        // Get info of latest content types versions.
+        $contenttypes = $this->core->get_latest_content_types()->contentTypes;
+        // We are installing the first content type.
+        $librarydata = $contenttypes[0];
+
         $library = [
-                'machineName' => 'H5P.Accordion',
-                'majorVersion' => 1,
-                'minorVersion' => 0,
-                'patchVersion' => 0,
+                'machineName' => $librarydata->id,
+                'majorVersion' => $librarydata->version->major,
+                'minorVersion' => $librarydata->version->minor,
+                'patchVersion' => $librarydata->version->patch,
         ];
 
-        $sql = 'SELECT count(id)
-                  FROM {files}
-                 WHERE ' . $DB->sql_like('filepath', ':filepath');
-        $params['filepath'] = "/{$library['machineName']}-%";
+        // Verify that the content type is not yet installed.
+        $conditions['machinename'] = $library['machineName'];
+        $typeinstalled = $DB->count_records('h5p_libraries', $conditions);
 
-        $contentfiles = $DB->count_records_sql($sql, $params);
-
-        $this->assertEquals(0, $contentfiles);
+        $this->assertEquals(0, $typeinstalled);
 
+        // Fetch the content type.
         $this->core->fetch_content_type($library);
 
-        $contentfiles = $DB->count_records_sql($sql, $params);
-        $this->assertGreaterThan(0, $contentfiles);
+        // Check that the content type is now installed.
+        $typeinstalled = $DB->get_record('h5p_libraries', $conditions);
+        $this->assertEquals($librarydata->id, $typeinstalled->machinename);
+        $this->assertEquals($librarydata->coreApiVersionNeeded->major, $typeinstalled->coremajor);
+        $this->assertEquals($librarydata->coreApiVersionNeeded->minor, $typeinstalled->coreminor);
     }
 
     /**
index d2c2f50..973f833 100644 (file)
@@ -160,6 +160,7 @@ $CFG->lang                 = $config->lang;
 $CFG->dirroot              = __DIR__;
 $CFG->libdir               = "$CFG->dirroot/lib";
 $CFG->wwwroot              = install_guess_wwwroot(); // can not be changed - ppl must use the real address when installing
+$CFG->httpswwwroot         = $CFG->wwwroot;
 $CFG->dataroot             = $config->dataroot;
 $CFG->tempdir              = $CFG->dataroot.'/temp';
 $CFG->backuptempdir        = $CFG->tempdir.'/backup';
index 786835c..4091898 100644 (file)
@@ -34,6 +34,7 @@ $string['activitiescompleted'] = 'Activity completion';
 $string['activitiescompletednote'] = 'Note: Activity completion must be set for an activity to appear in the above list.';
 $string['activitycompletion'] = 'Activity completion';
 $string['activitycompletionupdated'] = 'Changes saved';
+$string['activitygradenotrequired'] = 'Grade not required';
 $string['affectedactivities'] = 'The changes will affect the following <b>{$a}</b> activities or resources:';
 $string['aggregationmethod'] = 'Aggregation method';
 $string['all'] = 'All';
@@ -41,6 +42,7 @@ $string['any'] = 'Any';
 $string['approval'] = 'Approval';
 $string['areyousureoverridecompletion'] = 'Are you sure you want to override the current completion state of this activity for this user and mark it "{$a}"?';
 $string['badautocompletion'] = 'When you select automatic completion, you must also enable at least one requirement (below).';
+$string['badcompletiongradeitemnumber'] = 'Require grade can\'t be enabled for <b>{$a}</b> because grading by {$a} is not enabled.';
 $string['bulkactivitycompletion'] = 'Bulk edit activity completion';
 $string['bulkactivitydetail'] = 'Select the activities you wish to bulk edit.';
 $string['bulkcompletiontracking'] = 'Completion tracking';
index c60964c..649b684 100644 (file)
@@ -563,6 +563,7 @@ $string['noselecteditems'] = 'no items were selected.';
 $string['notteachererror'] = 'You must be a teacher to use this feature.';
 $string['notenrolled'] = 'You are currently not enrolled in any courses.';
 $string['nousersloaded'] = 'No users loaded';
+$string['nouserstograde'] = 'No users to grade';
 $string['numberofgrades'] = 'Number of grades';
 $string['onascaleof'] = 'on a scale of {$a->grademin} to {$a->grademax}';
 $string['operations'] = 'Operations';
diff --git a/lib/amd/build/local/aria/focuslock.min.js b/lib/amd/build/local/aria/focuslock.min.js
new file mode 100644 (file)
index 0000000..c183662
Binary files /dev/null and b/lib/amd/build/local/aria/focuslock.min.js differ
diff --git a/lib/amd/build/local/aria/focuslock.min.js.map b/lib/amd/build/local/aria/focuslock.min.js.map
new file mode 100644 (file)
index 0000000..1518967
Binary files /dev/null and b/lib/amd/build/local/aria/focuslock.min.js.map differ
index 833b5c9..604c45b 100644 (file)
Binary files a/lib/amd/build/modal.min.js and b/lib/amd/build/modal.min.js differ
index 33a5e2c..b83637a 100644 (file)
Binary files a/lib/amd/build/modal.min.js.map and b/lib/amd/build/modal.min.js.map differ
diff --git a/lib/amd/src/local/aria/focuslock.js b/lib/amd/src/local/aria/focuslock.js
new file mode 100644 (file)
index 0000000..ccae766
--- /dev/null
@@ -0,0 +1,296 @@
+// 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/>.
+
+/**
+ * Tab locking system.
+ *
+ * This is based on code and examples provided in the ARIA specification.
+ * https://www.w3.org/TR/wai-aria-practices/examples/dialog-modal/dialog.html
+ *
+ * @module     core/tablock
+ * @class      tablock
+ * @package    core
+ * @copyright  2019 Andrew Nicols <andrew@nicols.co.uk>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+const selectors = {
+    focusable: 'input:not([type="hidden"]), a[href], button, textarea, select, [tabindex]',
+};
+
+const lockRegionStack = [];
+const initialFocusElementStack = [];
+const finalFocusElementStack = [];
+
+let lastFocus = null;
+let ignoreFocusChanges = false;
+let isLocked = false;
+
+/**
+ * The lock handler.
+ *
+ * This is the item that does a majority of the work.
+ * The overall logic from this comes from the examles in the WCAG guidelines.
+ *
+ * The general idea is that if the focus is not held within by an Element within the lock region, then we replace focus
+ * on the first element in the lock region. If the first element is the element previously selected prior to the
+ * user-initiated focus change, then instead jump to the last element in the lock region.
+ *
+ * This gives us a solution which supports focus locking of any kind, which loops in both directions, and which
+ * prevents the lock from escaping the modal entirely.
+ *
+ * @param {Event} event The event from the focus change
+ */
+const lockHandler = event => {
+    if (ignoreFocusChanges) {
+        // The focus change was made by an internal call to set focus.
+        return;
+    }
+
+    const lockRegion = getCurrentLockRegion();
+
+    if (!lockRegion.parentNode) {
+        // The lock region does not exist.
+        // Perhaps it was removed without being untrapped.
+        untrapFocus();
+    }
+
+    if (lockRegion.contains(event.target)) {
+        lastFocus = event.target;
+    } else {
+        focusFirstDescendant();
+        if (lastFocus == document.activeElement) {
+            focusLastDescendant();
+        }
+        lastFocus = document.activeElement;
+    }
+};
+
+/**
+ * Focus the first descendant of the current lock region.
+ *
+ * @returns {Bool} Whether a node was focused
+ */
+const focusFirstDescendant = () => {
+    const lockRegion = getCurrentLockRegion();
+
+    // Grab all elements in the lock region and attempt to focus each element until one is focused.
+    // We can capture most of this in the query selector, but some cases may still reject focus.
+    // For example, a disabled text area cannot be focused, and it becomes difficult to provide a decent query selector
+    // to capture this.
+    // The use of Array.some just ensures that we stop as soon as we have a successful focus.
+    const focusableElements = Array.from(lockRegion.querySelectorAll(selectors.focusable));
+    return focusableElements.some(focusableElement => attemptFocus(focusableElement));
+};
+
+/**
+ * Focus the last descendant of the current lock region.
+ *
+ * @returns {Bool} Whether a node was focused
+ */
+const focusLastDescendant = () => {
+    const lockRegion = getCurrentLockRegion();
+
+    // Grab all elements in the lock region, reverse them, and attempt to focus each element until one is focused.
+    // We can capture most of this in the query selector, but some cases may still reject focus.
+    // For example, a disabled text area cannot be focused, and it becomes difficult to provide a decent query selector
+    // to capture this.
+    // The use of Array.some just ensures that we stop as soon as we have a successful focus.
+    const focusableElements = Array.from(lockRegion.querySelectorAll(selectors.focusable)).reverse();
+    return focusableElements.some(focusableElement => attemptFocus(focusableElement));
+};
+
+/**
+ * Check whether the supplied focusTarget is actually focusable.
+ * There are cases where a normally focusable element can reject focus.
+ *
+ * Note: This example is a wholesale copy of the WCAG example.
+ *
+ * @param {HTMLElement} focusTarget
+ * @returns {Bool}
+ */
+const isFocusable = focusTarget => {
+    if (focusTarget.tabIndex > 0 || (focusTarget.tabIndex === 0 && focusTarget.getAttribute('tabIndex') !== null)) {
+        return true;
+    }
+
+    if (focusTarget.disabled) {
+        return false;
+    }
+
+    switch (focusTarget.nodeName) {
+        case 'A':
+            return !!focusTarget.href && focusTarget.rel != 'ignore';
+        case 'INPUT':
+            return focusTarget.type != 'hidden' && focusTarget.type != 'file';
+        case 'BUTTON':
+        case 'SELECT':
+        case 'TEXTAREA':
+            return true;
+        default:
+            return false;
+    }
+};
+
+/**
+ * Attempt to focus the supplied focusTarget.
+ *
+ * Note: This example is a heavily inspired by the WCAG example.
+ *
+ * @param {HTMLElement} focusTarget
+ * @returns {Bool} Whether focus was successful o rnot.
+ */
+const attemptFocus = focusTarget => {
+    if (!isFocusable(focusTarget)) {
+        return false;
+    }
+
+    // The ignoreFocusChanges variable prevents the focus event handler from interfering and entering a fight with itself.
+    ignoreFocusChanges = true;
+
+    try {
+        focusTarget.focus();
+    } catch (e) {
+        // Ignore failures. We will just try to focus the next element in the list.
+        // eslint-disable-line
+    }
+
+    ignoreFocusChanges = false;
+
+    // If focus was successful the activeElement will be the one we focused.
+    return (document.activeElement === focusTarget);
+};
+
+/**
+ * Get the current lock region from the top of the stack.
+ *
+ * @returns {HTMLElement}
+ */
+const getCurrentLockRegion = () => {
+    return lockRegionStack[lockRegionStack.length - 1];
+};
+
+/**
+ * Add a new lock region to the stack.
+ *
+ * @param {HTMLElement} newLockRegion
+ */
+const addLockRegionToStack = newLockRegion => {
+    if (newLockRegion === getCurrentLockRegion()) {
+        return;
+    }
+
+    lockRegionStack.push(newLockRegion);
+    const currentLockRegion = getCurrentLockRegion();
+
+    // Append an empty div which can be focused just outside of the item locked.
+    // This locks tab focus to within the tab region, and does not allow it to extend back into the window by
+    // guaranteeing the existence of a tabable item after the lock region which can be focused but which will be caught
+    // by the handler.
+    const element = document.createElement('div');
+    element.tabIndex = 0;
+    element.style.position = 'fixed';
+    element.style.top = 0;
+    element.style.left = 0;
+
+    const initialNode = element.cloneNode();
+    currentLockRegion.parentNode.insertBefore(initialNode, currentLockRegion);
+    initialFocusElementStack.push(initialNode);
+
+    const finalNode = element.cloneNode();
+    currentLockRegion.parentNode.insertBefore(finalNode, currentLockRegion.nextSibling);
+    finalFocusElementStack.push(finalNode);
+};
+
+/**
+ * Remove the top lock region from the stack.
+ */
+const removeLastLockRegionFromStack = () => {
+    // Take the top element off the stack, and replce the current lockRegion value.
+    lockRegionStack.pop();
+
+    const finalNode = finalFocusElementStack.pop();
+    if (finalNode) {
+        // The final focus element may have been removed if it was part of a parent item.
+        finalNode.remove();
+    }
+
+    const initialNode = initialFocusElementStack.pop();
+    if (initialNode) {
+        // The initial focus element may have been removed if it was part of a parent item.
+        initialNode.remove();
+    }
+};
+
+/**
+ * Whether any region is left in the stack.
+ *
+ * @return {Bool}
+ */
+const hasTrappedRegionsInStack = () => {
+    return !!lockRegionStack.length;
+};
+
+/**
+ * Start trapping the focus and lock it to the specified newLockRegion.
+ *
+ * @param {HTMLElement} newLockRegion The container to lock focus to
+ */
+export const trapFocus = newLockRegion => {
+    // Update the lock region stack.
+    // This allows us to support nesting.
+    addLockRegionToStack(newLockRegion);
+
+    if (!isLocked) {
+        // Add the focus handler.
+        document.addEventListener('focus', lockHandler, true);
+    }
+
+    // Attempt to focus on the first item in the lock region.
+    if (!focusFirstDescendant()) {
+        const currentLockRegion = getCurrentLockRegion();
+
+        // No focusable descendants found in the region yet.
+        // This can happen when the region is locked before content is generated.
+        // Focus on the region itself for now.
+        const originalRegionTabIndex = currentLockRegion.tabIndex;
+        currentLockRegion.tabIndex = 0;
+        attemptFocus(currentLockRegion);
+        currentLockRegion.tabIndex = originalRegionTabIndex;
+    }
+
+    // Keep track of the last item focused.
+    lastFocus = document.activeElement;
+
+    isLocked = true;
+};
+
+/**
+ * Stop trapping the focus.
+ */
+export const untrapFocus = () => {
+    // Remove the top region from the stack.
+    removeLastLockRegionFromStack();
+
+    if (hasTrappedRegionsInStack()) {
+        // The focus manager still has items in the stack.
+        return;
+    }
+
+    document.removeEventListener('focus', lockHandler, true);
+
+    lastFocus = null;
+    ignoreFocusChanges = false;
+    isLocked = false;
+};
index a44a43a..65ab6f4 100644 (file)
  * @copyright  2016 Ryan Wyllie <ryan@moodle.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
-define(['jquery', 'core/templates', 'core/notification', 'core/key_codes',
-        'core/custom_interaction_events', 'core/modal_backdrop', 'core/event', 'core/modal_events'],
-     function($, Templates, Notification, KeyCodes, CustomEvents, ModalBackdrop, Event, ModalEvents) {
+define([
+    'jquery',
+    'core/templates',
+    'core/notification',
+    'core/key_codes',
+    'core/custom_interaction_events',
+    'core/modal_backdrop',
+    'core/event',
+    'core/modal_events',
+    'core/local/aria/focuslock',
+], function($, Templates, Notification, KeyCodes, CustomEvents, ModalBackdrop, Event, ModalEvents, FocusLock) {
 
     var SELECTORS = {
         CONTAINER: '[data-region="modal-container"]',
@@ -114,6 +122,7 @@ define(['jquery', 'core/templates', 'core/notification', 'core/key_codes',
         }
 
         $('body').append(this.root);
+        FocusLock.trapFocus(this.root[0]);
 
         // If we'd cached any JS then we can run it how that the modal is
         // attached to the DOM.
@@ -594,6 +603,7 @@ define(['jquery', 'core/templates', 'core/notification', 'core/key_codes',
      */
     Modal.prototype.hide = function() {
         this.getBackdrop().done(function(backdrop) {
+            FocusLock.untrapFocus();
             if (!this.countOtherVisibleModals()) {
                 // Hide the backdrop if we're the last open modal.
                 backdrop.hide();
@@ -691,31 +701,6 @@ define(['jquery', 'core/templates', 'core/notification', 'core/key_codes',
         this.hiddenSiblings = [];
     };
 
-    /**
-     * Handle the tab event to lock focus within this modal.
-     *
-     * @method handleTabLock
-     * @param {event} e The tab key jQuery event
-     */
-    Modal.prototype.handleTabLock = function(e) {
-        if (!this.hasFocus()) {
-            return;
-        }
-
-        var target = $(document.activeElement);
-        var focusableElements = this.modal.find(SELECTORS.CAN_RECEIVE_FOCUS);
-        var firstFocusable = focusableElements.first();
-        var lastFocusable = focusableElements.last();
-
-        if (target.is(firstFocusable) && e.shiftKey) {
-            lastFocusable.focus();
-            e.preventDefault();
-        } else if (target.is(lastFocusable) && !e.shiftKey) {
-            firstFocusable.focus();
-            e.preventDefault();
-        }
-    };
-
     /**
      * Set up all of the event handling for the modal.
      *
@@ -727,9 +712,7 @@ define(['jquery', 'core/templates', 'core/notification', 'core/key_codes',
                 return;
             }
 
-            if (e.keyCode == KeyCodes.tab) {
-                this.handleTabLock(e);
-            } else if (e.keyCode == KeyCodes.escape) {
+            if (e.keyCode == KeyCodes.escape) {
                 this.hide();
             }
         }.bind(this));
index beda0d8..d19e7a6 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;          // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2019051100;          // Requires this Moodle version.
+$plugin->version   = 2019111800;          // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2019111200;          // Requires this Moodle version.
 $plugin->component = 'antivirus_clamav';  // Full name of the plugin (used for diagnostics).