Merge branch '48026-28' of git://github.com/samhemelryk/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 5 Nov 2014 23:33:46 +0000 (00:33 +0100)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 5 Nov 2014 23:33:46 +0000 (00:33 +0100)
499 files changed:
admin/tool/assignmentupgrade/version.php
admin/tool/availabilityconditions/version.php
admin/tool/behat/version.php
admin/tool/capability/version.php
admin/tool/customlang/version.php
admin/tool/dbtransfer/version.php
admin/tool/generator/version.php
admin/tool/health/version.php
admin/tool/innodb/version.php
admin/tool/installaddon/lang/en/tool_installaddon.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/messageinbound/lang/en/tool_messageinbound.php
admin/tool/messageinbound/version.php
admin/tool/monitor/classes/event/rule_created.php
admin/tool/monitor/classes/event/rule_deleted.php
admin/tool/monitor/classes/event/rule_updated.php
admin/tool/monitor/classes/eventobservers.php
admin/tool/monitor/classes/output/helpicon/renderable.php [deleted file]
admin/tool/monitor/classes/output/helpicon/renderer.php [deleted file]
admin/tool/monitor/classes/output/managerules/renderable.php
admin/tool/monitor/classes/output/managesubs/rules.php
admin/tool/monitor/classes/output/managesubs/subs.php
admin/tool/monitor/classes/rule.php
admin/tool/monitor/classes/rule_form.php
admin/tool/monitor/classes/subscription.php
admin/tool/monitor/classes/task/clean_events.php
admin/tool/monitor/db/access.php
admin/tool/monitor/db/install.xml
admin/tool/monitor/db/upgrade.php [new file with mode: 0644]
admin/tool/monitor/edit.php
admin/tool/monitor/help.php [deleted file]
admin/tool/monitor/help_ajax.php [deleted file]
admin/tool/monitor/index.php
admin/tool/monitor/lang/en/tool_monitor.php
admin/tool/monitor/lib.php
admin/tool/monitor/managerules.php
admin/tool/monitor/settings.php
admin/tool/monitor/tests/behat/disabled.feature [new file with mode: 0644]
admin/tool/monitor/tests/behat/rule.feature
admin/tool/monitor/tests/behat/subscription.feature
admin/tool/monitor/tests/eventobservers_test.php
admin/tool/monitor/tests/events_test.php
admin/tool/monitor/tests/generator_test.php
admin/tool/monitor/tests/rule_manager_test.php
admin/tool/monitor/tests/task_clean_events_test.php
admin/tool/monitor/version.php
admin/tool/multilangupgrade/version.php
admin/tool/phpunit/version.php
admin/tool/profiling/version.php
admin/tool/replace/version.php
admin/tool/spamcleaner/version.php
admin/tool/task/version.php
admin/tool/timezoneimport/version.php
admin/tool/unsuproles/version.php
admin/tool/uploadcourse/version.php
admin/tool/uploaduser/version.php
admin/tool/xmldb/version.php
auth/cas/version.php
auth/db/version.php
auth/email/version.php
auth/fc/version.php
auth/imap/version.php
auth/ldap/lang/en/auth_ldap.php
auth/ldap/version.php
auth/manual/version.php
auth/mnet/version.php
auth/nntp/version.php
auth/nologin/version.php
auth/none/version.php
auth/pam/version.php
auth/pop3/version.php
auth/radius/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
availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form-debug.js
availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form-min.js
availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form.js
availability/condition/profile/yui/src/form/js/form.js
backup/backup.class.php
badges/award.php
badges/criteria/award_criteria_manual.php
blocks/activity_modules/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/community/version.php
blocks/completionstatus/version.php
blocks/course_list/version.php
blocks/course_overview/version.php
blocks/course_summary/version.php
blocks/feedback/version.php
blocks/glossary_random/version.php
blocks/html/version.php
blocks/login/version.php
blocks/mentees/version.php
blocks/messages/version.php
blocks/mnet_hosts/version.php
blocks/myprofile/version.php
blocks/navigation/version.php
blocks/news_items/version.php
blocks/online_users/version.php
blocks/participants/version.php
blocks/private_files/version.php
blocks/quiz_results/version.php
blocks/recent_activity/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/tag_flickr/version.php
blocks/tag_youtube/version.php
blocks/tags/version.php
cache/locks/file/version.php
cache/stores/file/version.php
cache/stores/memcache/version.php
cache/stores/memcached/lib.php
cache/stores/memcached/version.php
cache/stores/mongodb/version.php
cache/stores/session/version.php
cache/stores/static/version.php
calendar/lib.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/rest.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/manual/version.php
enrol/meta/version.php
enrol/mnet/version.php
enrol/paypal/version.php
enrol/self/version.php
filter/activitynames/version.php
filter/algebra/version.php
filter/censor/version.php
filter/data/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/edit/settings/form.php
grade/export/grade_export_form.php
grade/export/ods/version.php
grade/export/txt/version.php
grade/export/xls/version.php
grade/export/xml/export.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/import.php
grade/import/xml/lang/en/gradeimport_xml.php
grade/import/xml/version.php
grade/report/grader/version.php
grade/report/history/version.php
grade/report/outcomes/version.php
grade/report/overview/classes/event/grade_report_viewed.php
grade/report/overview/version.php
grade/report/singleview/classes/local/screen/grade.php
grade/report/singleview/classes/local/screen/screen.php
grade/report/singleview/classes/local/screen/tablelike.php
grade/report/singleview/classes/local/screen/user.php
grade/report/singleview/classes/local/ui/checkbox_attribute.php
grade/report/singleview/classes/local/ui/dropdown_attribute.php
grade/report/singleview/classes/local/ui/feedback.php
grade/report/singleview/classes/local/ui/finalgrade.php
grade/report/singleview/classes/local/ui/grade_attribute_format.php
grade/report/singleview/classes/local/ui/override.php
grade/report/singleview/classes/local/ui/tabbable.php [deleted file]
grade/report/singleview/classes/local/ui/text_attribute.php
grade/report/singleview/index.php
grade/report/singleview/js/singleview.js
grade/report/singleview/lang/en/gradereport_singleview.php
grade/report/singleview/tests/behat/singleview.feature
grade/report/singleview/version.php
grade/report/user/classes/event/grade_report_viewed.php
grade/report/user/version.php
iplookup/index.php
lang/en/admin.php
lang/en/backup.php
lang/en/grades.php
lang/en/install.php
lib/classes/event/grade_report_viewed.php
lib/classes/grades_external.php
lib/db/services.php
lib/db/upgrade.php
lib/dml/moodle_database.php
lib/dml/oci_native_moodle_database.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/emoticon/version.php
lib/editor/atto/plugins/equation/version.php
lib/editor/atto/plugins/fontcolor/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/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/lang/en/atto_title.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/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-debug.js
lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-min.js
lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor.js
lib/editor/atto/yui/src/editor/js/autosave.js
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/filelib.php
lib/navigationlib.php
lib/outputrenderers.php
lib/phpunit/bootstrap.php
lib/setup.php
lib/setuplib.php
lib/tests/grades_externallib_test.php
lib/tests/moodle_page_test.php
lib/tests/setuplib_test.php
lib/tests/upgradelib_test.php
lib/upgradelib.php
lib/wordlist.txt
message/output/airnotifier/version.php
message/output/email/version.php
message/output/jabber/version.php
message/output/popup/version.php
mnet/service/enrol/version.php
mod/assign/feedback/comments/version.php
mod/assign/feedback/editpdf/version.php
mod/assign/feedback/file/version.php
mod/assign/feedback/offline/version.php
mod/assign/locallib.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/lang/en/choice.php
mod/choice/version.php
mod/data/edit.php
mod/data/field/checkbox/version.php
mod/data/field/date/version.php
mod/data/field/file/field.class.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/field.class.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/mapcourse.php
mod/feedback/version.php
mod/folder/version.php
mod/forum/classes/event/subscription_created.php
mod/forum/classes/event/subscription_deleted.php
mod/forum/classes/subscriptions.php
mod/forum/db/install.xml
mod/forum/db/upgrade.php
mod/forum/deprecatedlib.php
mod/forum/discuss.php
mod/forum/externallib.php
mod/forum/forum.js
mod/forum/index.php
mod/forum/lang/en/forum.php
mod/forum/lib.php
mod/forum/settracking.php
mod/forum/styles.css
mod/forum/subscribe.php
mod/forum/subscribe_ajax.php
mod/forum/tests/events_test.php
mod/forum/tests/externallib_test.php
mod/forum/tests/mail_test.php
mod/forum/tests/maildigest_test.php
mod/forum/tests/subscriptions_test.php
mod/forum/version.php
mod/glossary/version.php
mod/imscp/version.php
mod/label/version.php
mod/lesson/lang/en/lesson.php
mod/lesson/locallib.php
mod/lesson/styles.css
mod/lesson/timer.js
mod/lesson/version.php
mod/lti/instructor_edit_tool_type.php
mod/lti/lang/en/lti.php
mod/lti/launch.php
mod/lti/locallib.php
mod/lti/registration.php
mod/lti/registrationreturn.php
mod/lti/request_tool.php
mod/lti/return.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/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/datamodels/scorm_13.js
mod/scorm/datamodels/scorm_13lib.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/index.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/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/description/version.php
question/type/essay/version.php
question/type/match/version.php
question/type/missingtype/version.php
question/type/multianswer/version.php
question/type/multichoice/question.php
question/type/multichoice/tests/question_single_test.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/completion/version.php
report/configlog/version.php
report/courseoverview/version.php
report/eventlist/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
repository/alfresco/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/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
tag/tag.js
tag/tag_autocomplete.php
theme/base/version.php
theme/bootstrapbase/version.php
theme/canvas/version.php
theme/clean/version.php
theme/more/version.php
user/lib.php
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
user/renderer.php
version.php
webservice/amf/version.php
webservice/rest/version.php
webservice/soap/version.php
webservice/upload.php
webservice/xmlrpc/version.php

index 6a649a9..70a9fd6 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;
-$plugin->requires  = 2014050800;
+$plugin->version   = 2014111000;
+$plugin->requires  = 2014110400;
 $plugin->component = 'tool_assignmentupgrade';
-$plugin->dependencies = array('mod_assign' => 2014050800);
+$plugin->dependencies = array('mod_assign' => 2014110400);
index b1be891..2272aa3 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2014051200;
-$plugin->requires = 2014050800;
+$plugin->version = 2014111000;
+$plugin->requires = 2014110400;
 $plugin->component = 'tool_availabilityconditions';
index edef3bb..35adb63 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;   // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;   // Requires this Moodle version
+$plugin->version   = 2014111000;   // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;   // Requires this Moodle version
 $plugin->component = 'tool_behat'; // Full name of the plugin (used for diagnostics)
index 7e62685..863822c 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2014050800; // Requires this Moodle version.
+$plugin->version   = 2014111000; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2014110400; // Requires this Moodle version.
 $plugin->component = 'tool_capability'; // Full name of the plugin (used for diagnostics).
index beb8bfd..f0ffed6 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;
-$plugin->requires  = 2014050800;
+$plugin->version   = 2014111000;
+$plugin->requires  = 2014110400;
 $plugin->component = 'tool_customlang'; // Full name of the plugin (used for diagnostics)
index 0b69995..b1d8ab0 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2014050800; // Requires this Moodle version.
+$plugin->version   = 2014111000; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2014110400; // Requires this Moodle version.
 $plugin->component = 'tool_dbtransfer'; // Full name of the plugin (used for diagnostics).
index 42503a6..bbd2747 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2014051200;
-$plugin->requires = 2014050800;
+$plugin->version = 2014111000;
+$plugin->requires = 2014110400;
 $plugin->component = 'tool_generator';
index ca1e83e..11c1b60 100644 (file)
@@ -25,8 +25,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800; // Requires this Moodle version
+$plugin->version   = 2014111000; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400; // 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 f6b3705..c5ea4a7 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800; // Requires this Moodle version
+$plugin->version   = 2014111000; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400; // Requires this Moodle version
 $plugin->component = 'tool_innodb'; // Full name of the plugin (used for diagnostics)
index f162e05..b0135b9 100644 (file)
@@ -66,6 +66,7 @@ $string['validationmsg_filenotexists'] = 'Extracted file not found';
 $string['validationmsg_filesnumber'] = 'Not enough files found in the package';
 $string['validationmsg_filestatus'] = 'Unable to extract all files';
 $string['validationmsg_filestatus_info'] = 'Attempting to extract file {$a->file} resulted in error \'{$a->status}\'.';
+$string['validationmsg_foundlangfile'] = 'Found language file';
 $string['validationmsg_maturity'] = 'Declared maturity level';
 $string['validationmsg_maturity_help'] = 'The plugin can declare its maturity level. If the maintainer considers the plugin stable, the declared maturity level will read MATURITY_STABLE. All other maturity levels (such as alpha or beta) should be considered unstable and a warning is raised.';
 $string['validationmsg_missingexpectedlangenfile'] = 'English language file name mismatch';
index 998c645..da278d9 100644 (file)
@@ -24,6 +24,6 @@
 defined('MOODLE_INTERNAL') || die();
 
 $plugin->component  = 'tool_installaddon';
-$plugin->version    = 2014051200;
-$plugin->requires   = 2014050800;
+$plugin->version    = 2014111000;
+$plugin->requires   = 2014110400;
 $plugin->maturity   = MATURITY_STABLE;
index 7050367..f29650c 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014092801; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800; // Requires this Moodle version
+$plugin->version   = 2014111000; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400; // Requires this Moodle version
 $plugin->component = 'tool_langimport'; // Full name of the plugin (used for diagnostics)
index 9bceb93..8cc3fcf 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2014051200; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires = 2014050800; // Requires this Moodle version.
+$plugin->version = 2014111000; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires = 2014110400; // Requires this Moodle version.
 $plugin->component = 'logstore_database'; // Full name of the plugin (used for diagnostics).
index 156dddc..060f925 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2014051200; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires = 2014050800; // Requires this Moodle version.
+$plugin->version = 2014111000; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires = 2014110400; // Requires this Moodle version.
 $plugin->component = 'logstore_legacy'; // Full name of the plugin (used for diagnostics).
index 290e268..c8a2225 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2014051200; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires = 2014050800; // Requires this Moodle version.
+$plugin->version = 2014111000; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires = 2014110400; // Requires this Moodle version.
 $plugin->component = 'logstore_standard'; // Full name of the plugin (used for diagnostics).
index 258312b..766ed73 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2014051200; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires = 2014050800; // Requires this Moodle version.
+$plugin->version = 2014111000; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires = 2014110400; // Requires this Moodle version.
 $plugin->component = 'tool_log'; // Full name of the plugin (used for diagnostics).
index 329c956..c8271f3 100644 (file)
@@ -28,7 +28,7 @@ $string['configmessageinboundhost'] = 'The address of the server that Moodle sho
 $string['defaultexpiration'] = 'Default address expiry period';
 $string['defaultexpiration_help'] = 'When an email address is generated by the handler, it can be set to automatically expire after a period of time, so that it can no longer be used. It is advisable to set an expiry period.';
 $string['description'] = 'Description';
-$string['domain'] = 'Email Domain';
+$string['domain'] = 'Email domain';
 $string['edit'] = 'Edit';
 $string['edithandler'] = 'Edit settings for the {$a} handler';
 $string['editinghandler'] = 'Editing {$a}';
@@ -48,22 +48,22 @@ It is not possible to disable sender verification of this handler because the us
 $string['invalid_recipient_handler_name'] = 'Invalid recipient handler';
 $string['invalidrecipientdescription'] = 'The message "{$a->subject}" could not be authenticated, since it was sent from a different email address than in your user profile. For the message to be authenticated, you need to reply to this message.';
 $string['invalidrecipientdescriptionhtml'] = 'The message "{$a->subject}" could not be authenticated, since it was sent from a different email address than in your user profile. For the message to be authenticated, you need to reply to this message.';
-$string['invalidrecipientfinal'] = 'The message you sent with subject "{$a->subject}" could not be authenticated. Please check that you are sending your message from the e-mail account listed in your Moodle profile.';
+$string['invalidrecipientfinal'] = 'The message "{$a->subject}" could not be authenticated. Please check that you are sending your message from the same email address as in your profile.';
 $string['mailbox'] = 'Mailbox name';
 $string['mailboxconfiguration'] = 'Mailbox configuration';
 $string['mailboxdescription'] = '[mailbox]+subaddress@[domain]';
 $string['mailsettings'] = 'Mail settings';
 $string['message_handlers'] = 'Message handlers';
-$string['messageprocessingerror'] = 'You recently sent an e-mail to Moodle with the subject "{$a->subject}" but Moodle was unable to process it.
+$string['messageprocessingerror'] = 'You recently sent an email "{$a->subject}" but unfortunately it could not be processed.
 
 The details of the error are shown below.
 
 {$a->error}';
-$string['messageprocessingerrorhtml'] = '<p>You recently sent an e-mail to Moodle with the subject "{$a->subject}" but Moodle was unable to process it.</p>
+$string['messageprocessingerrorhtml'] = '<p>You recently sent an email "{$a->subject}" but unfortunately it could not be processed.</p>
 <p>The details of the error are shown below.</p>
 <p>{$a->error}</p>';
-$string['messageprocessingfailed'] = 'Moodle was unable to process the e-mail you sent with subject "{$a->subject}". The following error was given: "{$a->message}".';
-$string['messageprocessingfailedunknown'] = 'Moodle was unable to process the e-mail you sent with subject "{$a->subject}". Contact your system administrator for further information.';
+$string['messageprocessingfailed'] = 'The email "{$a->subject}" could not be processed. The error is as follows: "{$a->message}".';
+$string['messageprocessingfailedunknown'] = 'The email "{$a->subject}" could not be processed. Contact your administrator for further information.';
 $string['messageprocessingsuccess'] = '{$a->plain}
 
 If you do not wish to receive these notifications in the future, you can edit your personal messaging preferences by opening {$a->messagepreferencesurl} in your browser.';
@@ -76,14 +76,14 @@ $string['messageinboundgeneralconfiguration'] = 'General configuration';
 $string['messageinboundgeneralconfiguration_desc'] = 'Inbound message processing allows you to receive and process email within Moodle. This has applications such as sending email replies to forum posts or adding files to a user\'s private files.';
 $string['messageinboundhost'] = 'Incoming Mail Server';
 $string['messageinboundhostpass'] = 'Password';
-$string['messageinboundhostpass_desc'] = 'This is the password your service provider will have provided to log into your e-mail account with.';
+$string['messageinboundhostpass_desc'] = 'This is the password your service provider will have provided to log in to your email account with.';
 $string['messageinboundhostssl'] = 'Use SSL';
 $string['messageinboundhostssl_desc'] = 'Some mail servers support an additional level of security by encrypting communication between Moodle and your server. We recommend using this SSL encryption if your server supports it.';
 $string['messageinboundhosttype'] = 'Server type';
 $string['messageinboundhostuser'] = 'Username';
-$string['messageinboundhostuser_desc'] = 'This is the username your service provider will have provided to log into your e-mail account with.';
+$string['messageinboundhostuser_desc'] = 'This is the username your service provider will have provided to log in to your email account with.';
 $string['messageinboundmailboxconfiguration_desc'] = 'When messages are sent out, they fit into the format address+data@example.com. To reliably generate addresses from Moodle, please specify the address that you would normally use before the @ sign, and the domain after the @ sign separately. For example, the Mailbox name in the example would be "address", and the E-mail domain would be "example.com". You should use a dedicated e-mail account for this purpose.';
-$string['messageprovider:invalidrecipienthandler'] = 'Messages to confirm that an inbound messages came from you';
+$string['messageprovider:invalidrecipienthandler'] = 'Message to confirm that an inbound message came from you';
 $string['messageprovider:messageprocessingerror'] = 'Warning when an inbound message could not be processed';
 $string['messageprovider:messageprocessingsuccess'] = 'Confirmation that a message was successfully processed';
 $string['noencryption'] = 'Off - No encryption';
index 57e55ae..44c3bc7 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014091200;
-$plugin->requires  = 2014050800;
+$plugin->version   = 2014111000;
+$plugin->requires  = 2014110400;
 $plugin->component = 'tool_messageinbound';
index a5d6fe1..178445b 100644 (file)
@@ -44,7 +44,7 @@ class rule_created extends \core\event\base {
     protected function init() {
         $this->data['objecttable'] = 'tool_monitor_rules';
         $this->data['crud'] = 'c';
-        $this->data['edulevel'] = self::LEVEL_TEACHING;
+        $this->data['edulevel'] = self::LEVEL_OTHER;
     }
 
     /**
index 988a5b6..50e2d5b 100644 (file)
@@ -44,7 +44,7 @@ class rule_deleted extends \core\event\base {
     protected function init() {
         $this->data['objecttable'] = 'tool_monitor_rules';
         $this->data['crud'] = 'd';
-        $this->data['edulevel'] = self::LEVEL_TEACHING;
+        $this->data['edulevel'] = self::LEVEL_OTHER;
     }
 
     /**
index c17da2d..8b262c4 100644 (file)
@@ -44,7 +44,7 @@ class rule_updated extends \core\event\base {
     protected function init() {
         $this->data['objecttable'] = 'tool_monitor_rules';
         $this->data['crud'] = 'u';
-        $this->data['edulevel'] = self::LEVEL_TEACHING;
+        $this->data['edulevel'] = self::LEVEL_OTHER;
     }
 
     /**
index 2ffc4fd..f6c7939 100644 (file)
@@ -72,6 +72,9 @@ class eventobservers {
      * @param \core\event\base $event event object
      */
     public static function process_event(\core\event\base $event) {
+        if (!get_config('tool_monitor', 'enablemonitor')) {
+            return; // The tool is disabled. Nothing to do.
+        }
 
         if (empty(self::$instance)) {
             self::$instance = new static();
@@ -129,6 +132,7 @@ class eventobservers {
         $select = "SELECT COUNT(id) FROM {tool_monitor_events} ";
         $now = time();
         $messagestosend = array();
+        $allsubids = array();
 
         // Let us now process the events and check for subscriptions.
         foreach ($events as $eventobj) {
@@ -136,6 +140,7 @@ class eventobservers {
             $idstosend = array();
             foreach ($subscriptions as $subscription) {
                 $starttime = $now - $subscription->timewindow;
+                $starttime = ($starttime > $subscription->lastnotificationsent) ? $starttime : $subscription->lastnotificationsent;
                 if ($subscription->courseid == 0) {
                     // Site level subscription. Count all events.
                     $where = "eventname = :eventname AND timecreated >  :starttime";
@@ -188,9 +193,18 @@ class eventobservers {
             }
             if (!empty($idstosend)) {
                 $messagestosend[] = array('subscriptionids' => $idstosend, 'event' => $eventobj);
+                $allsubids = array_merge($allsubids, $idstosend);
             }
         }
 
+        if (!empty($allsubids)) {
+            // Update the last trigger flag.
+            list($sql, $params) = $DB->get_in_or_equal($allsubids, SQL_PARAMS_NAMED);
+            $params['now'] = $now;
+            $sql = "UPDATE {tool_monitor_subscriptions} SET lastnotificationsent = :now WHERE id $sql";
+            $DB->execute($sql, $params);
+        }
+
         // Schedule a task to send notification.
         if (!empty($messagestosend)) {
             $adhocktask = new notification_task();
diff --git a/admin/tool/monitor/classes/output/helpicon/renderable.php b/admin/tool/monitor/classes/output/helpicon/renderable.php
deleted file mode 100644 (file)
index 3cb0395..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-// This file is part of Moodle - http://moodle.org/
-//
-// Moodle is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Moodle is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
-
-/**
- * The file for the renderable class for the tool_monitor help icon.
- *
- * @package    tool_monitor
- * @copyright  2014 Mark Nelson <markn@moodle.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-namespace tool_monitor\output\helpicon;
-
-defined('MOODLE_INTERNAL') || die;
-
-/**
- * Renderable class for the tool_monitor help icon.
- *
- * @since      Moodle 2.8
- * @package    tool_monitor
- * @copyright  2014 Mark Nelson <markn@moodle.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-class renderable implements \renderable {
-
-    /**
-     * @var string $type the type we are displaying the help icon for (either rule or subscription).
-     */
-    public $type;
-
-    /**
-     * @var int $id the id of the type.
-     */
-    public $id;
-
-    /**
-     * The constructor.
-     *
-     * @param string $type the type we are displaying the help icon for (either rule or subscription).
-     * @param int $id the id of the type.
-     */
-    public function __construct($type, $id) {
-        $this->type = $type;
-        $this->id = $id;
-    }
-
-    /**
-     * Returns the string to display for the help icon.
-     *
-     * @param string $type the type we are displaying the help icon for (either rule or subscription).
-     * @param int $id the id of the type.
-     * @param boolean $ajax Whether this help is called from an AJAX script.
-     *      This is used to influence text formatting and determines which format to output the doclink in.
-     * @return string|object|array $a An object, string or number that can be used within translation strings
-     */
-    public static function get_help_string_parameters($type, $id, $ajax = false) {
-        if ($type == 'rule') {
-            $rule = \tool_monitor\rule_manager::get_rule($id);
-
-            $langstring = new \stdClass();
-            $langstring->eventname = $rule->get_event_name();
-            $langstring->eventcomponent = $rule->get_plugin_name();
-            $langstring->frequency = $rule->frequency;
-            $langstring->minutes = $rule->timewindow / MINSECS;
-
-            return get_formatted_help_string('rulehelp', 'tool_monitor', $ajax, $langstring);
-        }
-
-        // Must be a subscription.
-        $sub = \tool_monitor\subscription_manager::get_subscription($id);
-
-        $langstring = new \stdClass();
-        $langstring->eventname = $sub->get_event_name();
-        $langstring->moduleinstance = $sub->get_instance_name();
-        $langstring->frequency = $sub->frequency;
-        $langstring->minutes = $sub->timewindow / MINSECS;
-
-        return get_formatted_help_string('subhelp', 'tool_monitor', $ajax, $langstring);
-    }
-}
diff --git a/admin/tool/monitor/classes/output/helpicon/renderer.php b/admin/tool/monitor/classes/output/helpicon/renderer.php
deleted file mode 100644 (file)
index 99025f2..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-// This file is part of Moodle - http://moodle.org/
-//
-// Moodle is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Moodle is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
-
-/**
- * The file for the renderer class for the tool_monitor help icon.
- *
- * @package    tool_monitor
- * @copyright  2014 Mark Nelson <markn@moodle.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-namespace tool_monitor\output\helpicon;
-
-defined('MOODLE_INTERNAL') || die;
-
-/**
- * Renderer class for tool_monitor help icons.
- *
- * @since      Moodle 2.8
- * @package    tool_monitor
- * @copyright  2014 Mark Nelson <markn@moodle.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-class renderer extends \plugin_renderer_base {
-
-    /**
-     * Get the HTML for the help icon.
-     *
-     * @param renderable $renderable renderable widget
-     *
-     * @return string the HTML of the help icon to display.
-     */
-    protected function render_renderable(renderable $renderable) {
-        global $CFG;
-
-        // First get the help image icon.
-        $src = $this->pix_url('help');
-
-        if ($renderable->type == 'rule') {
-            $title = get_string('rulehelp', 'tool_monitor');
-        } else { // Must be a subscription.
-            $title = get_string('subhelp', 'tool_monitor');
-        }
-
-        $alt = get_string('helpwiththis');
-
-        $attributes = array('src' => $src, 'alt' => $alt, 'class' => 'iconhelp');
-        $output = \html_writer::empty_tag('img', $attributes);
-
-        // Now create the link around it - we need https on loginhttps pages.
-        $urlparams = array();
-        $urlparams['type'] = $renderable->type;
-        $urlparams['id'] = $renderable->id;
-        $urlparams['lang'] = current_language();
-        $url = new \moodle_url($CFG->httpswwwroot . '/admin/tool/monitor/help.php', $urlparams);
-
-        // Note: this title is displayed only if JS is disabled, otherwise the link will have the new ajax tooltip.
-        $title = get_string('helpprefix2', '', trim($title, ". \t"));
-
-        $attributes = array('href' => $url, 'title' => $title, 'aria-haspopup' => 'true', 'target' => '_blank');
-        $output = \html_writer::tag('a', $output, $attributes);
-
-        // Now, finally the span.
-        return \html_writer::tag('span', $output, array('class' => 'helptooltip'));
-    }
-}
index c42f837..d37b734 100644 (file)
@@ -66,13 +66,13 @@ class renderable extends \table_sql implements \renderable {
 
         $this->set_attribute('id', 'toolmonitorrules_table');
         $this->set_attribute('class', 'toolmonitor managerules generaltable generalbox');
-        $this->define_columns(array('name', 'description', 'context', 'plugin', 'eventname', 'filters', 'manage'));
+        $this->define_columns(array('name', 'description', 'course', 'plugin', 'eventname', 'filters', 'manage'));
         $this->define_headers(array(
-                get_string('name'),
+                get_string('rulename', 'tool_monitor'),
                 get_string('description'),
-                get_string('context', 'tool_monitor'),
-                get_string('plugin'),
-                get_string('eventname'),
+                get_string('course'),
+                get_string('area', 'tool_monitor'),
+                get_string('event', 'tool_monitor'),
                 get_string('frequency', 'tool_monitor'),
                 get_string('manage', 'tool_monitor'),
             )
@@ -93,7 +93,6 @@ class renderable extends \table_sql implements \renderable {
      * Generate content for name column.
      *
      * @param \tool_monitor\rule $rule rule object
-     *
      * @return string html used to display the column field.
      */
     public function col_name(\tool_monitor\rule $rule) {
@@ -104,7 +103,6 @@ class renderable extends \table_sql implements \renderable {
      * Generate content for description column.
      *
      * @param \tool_monitor\rule $rule rule object
-     *
      * @return string html used to display the column field.
      */
     public function col_description(\tool_monitor\rule $rule) {
@@ -112,10 +110,26 @@ class renderable extends \table_sql implements \renderable {
     }
 
     /**
-     * Generate content for plugin column.
+     * Generate content for course column.
      *
      * @param \tool_monitor\rule $rule rule object
+     * @return string html used to display the context column field.
+     */
+    public function col_course(\tool_monitor\rule $rule) {
+        $coursename = $rule->get_course_name($this->context);
+
+        $courseid = $rule->courseid;
+        if (empty($courseid)) {
+            return $coursename;
+        } else {
+            return \html_writer::link(new \moodle_url('/course/view.php', array('id' => $courseid)), $coursename);
+        }
+    }
+
+    /**
+     * Generate content for plugin column.
      *
+     * @param \tool_monitor\rule $rule rule object
      * @return string html used to display the column field.
      */
     public function col_plugin(\tool_monitor\rule $rule) {
@@ -126,7 +140,6 @@ class renderable extends \table_sql implements \renderable {
      * Generate content for eventname column.
      *
      * @param \tool_monitor\rule $rule rule object
-     *
      * @return string html used to display the column field.
      */
     public function col_eventname(\tool_monitor\rule $rule) {
@@ -137,7 +150,6 @@ class renderable extends \table_sql implements \renderable {
      * Generate content for filters column.
      *
      * @param \tool_monitor\rule $rule rule object
-     *
      * @return string html used to display the filters column field.
      */
     public function col_filters(\tool_monitor\rule $rule) {
@@ -148,7 +160,6 @@ class renderable extends \table_sql implements \renderable {
      * Generate content for manage column.
      *
      * @param \tool_monitor\rule $rule rule object
-     *
      * @return string html used to display the manage column field.
      */
     public function col_manage(\tool_monitor\rule $rule) {
@@ -171,11 +182,8 @@ class renderable extends \table_sql implements \renderable {
             $icon = $OUTPUT->render(new \pix_icon('t/copy', get_string('duplicaterule', 'tool_monitor')));
             $manage .= \html_writer::link($copyurl, $icon, array('class' => 'action-icon'));
 
-            $a = $rule->get_name($this->context);
-            $action = new \component_action('click', 'M.util.show_confirm_dialog', array('message' => get_string('ruleareyousure',
-                    'tool_monitor', $a)));
-            $icon = $OUTPUT->action_link($deleteurl, new \pix_icon('t/delete', get_string('deleterule', 'tool_monitor')), $action);
-            $manage .= $icon;
+            $icon = $OUTPUT->render(new \pix_icon('t/delete', get_string('deleterule', 'tool_monitor')));
+            $manage .= \html_writer::link($deleteurl, $icon, array('class' => 'action-icon'));
         } else {
             $manage = get_string('nopermission', 'tool_monitor');
         }
@@ -200,15 +208,4 @@ class renderable extends \table_sql implements \renderable {
             $this->initialbars($total > $pagesize);
         }
     }
-
-    /**
-     * Generate content for context column.
-     *
-     * @param \tool_monitor\rule $rule rule object
-     *
-     * @return string html used to display the context column field.
-     */
-    public function col_context(\tool_monitor\rule $rule) {
-        return ($rule->courseid == 0) ? get_string('system', 'tool_monitor') : get_string('course');
-    }
 }
index 6821583..7014a35 100644 (file)
@@ -53,11 +53,6 @@ class rules extends \table_sql implements \renderable {
      */
     protected $context;
 
-    /**
-     * @var \tool_monitor\output\helpicon\renderer the help icon renderer.
-     */
-    protected $helpiconrenderer;
-
     /**
      * Sets up the table_log parameters.
      *
@@ -67,16 +62,18 @@ class rules extends \table_sql implements \renderable {
      * @param int $perpage Number of rules to display per page.
      */
     public function __construct($uniqueid, \moodle_url $url, $courseid = 0, $perpage = 100) {
-        global $PAGE;
-
         parent::__construct($uniqueid);
 
         $this->set_attribute('class', 'toolmonitor subscriberules generaltable generalbox');
-        $this->define_columns(array('name', 'description', 'select'));
+        $this->define_columns(array('name', 'description', 'course', 'plugin', 'eventname', 'filters', 'select'));
         $this->define_headers(array(
-                get_string('name'),
+                get_string('rulename', 'tool_monitor'),
                 get_string('description'),
-                get_string('select')
+                get_string('course'),
+                get_string('area', 'tool_monitor'),
+                get_string('event', 'tool_monitor'),
+                get_string('frequency', 'tool_monitor'),
+                ''
             )
         );
         $this->courseid = $courseid;
@@ -88,7 +85,6 @@ class rules extends \table_sql implements \renderable {
         $this->pageable(true);
         $this->is_downloadable(false);
         $this->define_baseurl($url);
-        $this->helpiconrenderer = $PAGE->get_renderer('tool_monitor', 'helpicon');
         $total = \tool_monitor\rule_manager::count_rules_by_courseid($this->courseid);
         $this->totalcount = $total;
     }
@@ -97,45 +93,91 @@ class rules extends \table_sql implements \renderable {
      * Generate content for name column.
      *
      * @param \tool_monitor\rule $rule rule object
-     *
-     * @return string html used to display the column field.
+     * @return string html used to display the rule name.
      */
     public function col_name(\tool_monitor\rule $rule) {
-        $name = $rule->get_name($this->context);
-        $helpicon = new \tool_monitor\output\helpicon\renderable('rule', $rule->id);
-        $helpicon = $this->helpiconrenderer->render($helpicon);
-
-        return $name . $helpicon;
+        return $rule->get_name($this->context);
     }
 
     /**
      * Generate content for description column.
      *
      * @param \tool_monitor\rule $rule rule object
-     *
-     * @return string html used to display the column field.
+     * @return string html used to display the description.
      */
     public function col_description(\tool_monitor\rule $rule) {
         return $rule->get_description($this->context);
     }
 
+    /**
+     * Generate content for course column.
+     *
+     * @param \tool_monitor\rule $rule rule object
+     * @return string html used to display the course name.
+     */
+    public function col_course(\tool_monitor\rule $rule) {
+        $coursename = $rule->get_course_name($this->context);
+
+        $courseid = $rule->courseid;
+        if (empty($courseid)) {
+            return $coursename;
+        } else {
+            return \html_writer::link(new \moodle_url('/course/view.php', array('id' => $this->courseid)), $coursename);
+        }
+    }
+
     /**
      * Generate content for plugin column.
      *
      * @param \tool_monitor\rule $rule rule object
+     * @return string html used to display the plugin name.
+     */
+    public function col_plugin(\tool_monitor\rule $rule) {
+        return $rule->get_plugin_name();
+    }
+
+    /**
+     * Generate content for eventname column.
+     *
+     * @param \tool_monitor\rule $rule rule object
+     * @return string html used to display the event name.
+     */
+    public function col_eventname(\tool_monitor\rule $rule) {
+        return $rule->get_event_name();
+    }
+
+    /**
+     * Generate content for filters column.
      *
-     * @return string html used to display the column field.
+     * @param \tool_monitor\rule $rule rule object
+     * @return string html used to display the filters.
+     */
+    public function col_filters(\tool_monitor\rule $rule) {
+        return $rule->get_filters_description();
+    }
+
+    /**
+     * Generate content for select column.
+     *
+     * @param \tool_monitor\rule $rule rule object
+     * @return string html used to display the select field.
      */
     public function col_select(\tool_monitor\rule $rule) {
         global $OUTPUT;
 
-        $select = $rule->get_module_select($this->courseid);
-
-        if ($select instanceof \single_select) {
-            $select->set_label(get_string('subscribeto', 'tool_monitor', $rule->get_name($this->context)), array('class' => 'accesshide'));
-            return $OUTPUT->render($select);
+        $options = $rule->get_subscribe_options($this->courseid);
+        $text = get_string('subscribeto', 'tool_monitor', $rule->get_name($this->context));
+
+        if ($options instanceof \single_select) {
+            $options->set_label($text, array('class' => 'accesshide'));
+            return $OUTPUT->render($options);
+        } else if ($options instanceof \moodle_url) {
+            // A \moodle_url to subscribe.
+            $icon = $OUTPUT->pix_icon('t/add', $text);
+            $link = new \action_link($options, $icon);
+            return $OUTPUT->render($link);
         } else {
-            return $select;
+            return $options;
         }
     }
 
index 8ba616d..de8eebe 100644 (file)
@@ -48,11 +48,6 @@ class subs extends \table_sql implements \renderable {
      */
     protected $context;
 
-    /**
-     * @var \tool_monitor\output\helpicon\renderer the help icon renderer.
-     */
-    protected $helpiconrenderer;
-
     /**
      * Sets up the table_log parameters.
      *
@@ -62,18 +57,20 @@ class subs extends \table_sql implements \renderable {
      * @param int $perpage Number of rules to display per page.
      */
     public function __construct($uniqueid, \moodle_url $url, $courseid = 0, $perpage = 100) {
-        global $PAGE;
-
         parent::__construct($uniqueid);
 
         $this->set_attribute('class', 'toolmonitor subscriptions generaltable generalbox');
-        $this->define_columns(array('name', 'course', 'instance', 'unsubscribe', 'editrule'));
+        $this->define_columns(array('name', 'description', 'course', 'plugin', 'instance', 'eventname',
+            'filters', 'unsubscribe'));
         $this->define_headers(array(
-                get_string('name'),
+                get_string('rulename', 'tool_monitor'),
+                get_string('description'),
                 get_string('course'),
+                get_string('area', 'tool_monitor'),
                 get_string('moduleinstance', 'tool_monitor'),
-                get_string('unsubscribe', 'tool_monitor'),
-                get_string('editrule', 'tool_monitor')
+                get_string('event', 'tool_monitor'),
+                get_string('frequency', 'tool_monitor'),
+                get_string('unsubscribe', 'tool_monitor')
             )
         );
         $this->courseid = $courseid;
@@ -85,81 +82,99 @@ class subs extends \table_sql implements \renderable {
         $this->pageable(true);
         $this->is_downloadable(false);
         $this->define_baseurl($url);
-        $this->helpiconrenderer = $PAGE->get_renderer('tool_monitor', 'helpicon');
     }
 
     /**
      * Generate content for name column.
      *
      * @param \tool_monitor\subscription $sub subscription object
-     *
-     * @return string html used to display the column field.
+     * @return string html used to display the rule name.
      */
     public function col_name(\tool_monitor\subscription $sub) {
-        $name = $sub->get_name($this->context);
-        $helpicon = new \tool_monitor\output\helpicon\renderable('subscription', $sub->id);
-        $helpicon = $this->helpiconrenderer->render($helpicon);
+        return $sub->get_name($this->context);
+    }
 
-        return $name . $helpicon;
+    /**
+     * Generate content for description column.
+     *
+     * @param \tool_monitor\subscription $sub subscription object
+     * @return string html used to display the description.
+     */
+    public function col_description(\tool_monitor\subscription $sub) {
+        return $sub->get_description($this->context);
     }
 
     /**
      * Generate content for course column.
      *
      * @param \tool_monitor\subscription $sub subscription object
-     *
-     * @return string html used to display the column field.
+     * @return string html used to display the course name.
      */
     public function col_course(\tool_monitor\subscription $sub) {
-       return $sub->get_course_name($this->context);
+        $coursename = $sub->get_course_name($this->context);
+
+        $courseid = $sub->courseid;
+        if (empty($courseid)) {
+            return $coursename;
+        } else {
+            return \html_writer::link(new \moodle_url('/course/view.php', array('id' => $courseid)), $coursename);
+        }
     }
 
     /**
-     * Generate content for description column.
+     * Generate content for plugin column.
      *
      * @param \tool_monitor\subscription $sub subscription object
+     * @return string html used to display the plugin name.
+     */
+    public function col_plugin(\tool_monitor\subscription $sub) {
+        return $sub->get_plugin_name();
+    }
+
+    /**
+     * Generate content for instance column.
      *
-     * @return string html used to display the column field.
+     * @param \tool_monitor\subscription $sub subscription object
+     * @return string html used to display the instance name.
      */
     public function col_instance(\tool_monitor\subscription $sub) {
         return $sub->get_instance_name();
     }
 
     /**
-     * Generate content for manage column.
+     * Generate content for eventname column.
      *
      * @param \tool_monitor\subscription $sub subscription object
-     *
-     * @return string html used to display the column field.
+     * @return string html used to display the event name.
      */
-    public function col_unsubscribe(\tool_monitor\subscription $sub) {
-        global $OUTPUT, $CFG;
-
-        $a = $sub->get_name($this->context);
-        $deleteurl = new \moodle_url($CFG->wwwroot. '/admin/tool/monitor/index.php', array('subscriptionid' => $sub->id,
-                'action' => 'unsubscribe', 'courseid' => $this->courseid, 'sesskey' => sesskey()));
-        $action = new \component_action('click', 'M.util.show_confirm_dialog', array('message' => get_string('subareyousure',
-            'tool_monitor', $a)));
-        $icon = $OUTPUT->action_link($deleteurl,
-                new \pix_icon('t/delete', get_string('deletesubscription', 'tool_monitor')), $action);
-        return $icon;
+    public function col_eventname(\tool_monitor\subscription $sub) {
+        return $sub->get_event_name();
     }
 
     /**
-     * Generate content for edit rule column.
+     * Generate content for filters column.
      *
      * @param \tool_monitor\subscription $sub subscription object
+     * @return string html used to display the filters.
+     */
+    public function col_filters(\tool_monitor\subscription $sub) {
+        return $sub->get_filters_description();
+    }
+
+    /**
+     * Generate content for unsubscribe column.
      *
-     * @return string html used to display the column field.
+     * @param \tool_monitor\subscription $sub subscription object
+     * @return string html used to display the unsubscribe field.
      */
-    public function col_editrule(\tool_monitor\subscription $sub) {
-        if ($sub->can_manage_rule()) {
-            // User can manage rule.
-            $editurl = new \moodle_url('/admin/tool/monitor/edit.php', array('ruleid' => $sub->ruleid,
-                    'courseid' => $sub->rulecourseid));
-            return \html_writer::link($editurl, get_string('editrule', 'tool_monitor'));
-        }
-        return '-';
+    public function col_unsubscribe(\tool_monitor\subscription $sub) {
+        global $OUTPUT, $CFG;
+
+        $deleteurl = new \moodle_url($CFG->wwwroot. '/admin/tool/monitor/index.php', array('subscriptionid' => $sub->id,
+                'action' => 'unsubscribe', 'courseid' => $this->courseid, 'sesskey' => sesskey()));
+        $icon = $OUTPUT->render(new \pix_icon('t/delete', get_string('deletesubscription', 'tool_monitor')));
+
+        return \html_writer::link($deleteurl, $icon, array('class' => 'action-icon'));
     }
 
     /**
index 81b3aef..2a23eb1 100644 (file)
@@ -86,26 +86,40 @@ class rule {
     }
 
     /**
-     * Generate a select drop down with list of possible modules for a given course and rule.
+     * Gets the rule subscribe options for a given course and rule.
+     *
+     * Could be a select drop down with a list of possible module
+     * instances or a single link to subscribe if the rule plugin
+     * is not a module.
      *
      * @param int $courseid course id
      *
-     * @return \single_select a single select object
+     * @return \single_select|\moodle_url|string
      * @throws \coding_exception
      */
-    public function get_module_select($courseid) {
+    public function get_subscribe_options($courseid) {
         global $CFG;
-        $options = array();
-        if (strpos($this->plugin, 'mod_') === 0) {
-            $options[0] = get_string('allmodules', 'tool_monitor');
+
+        $url = new \moodle_url($CFG->wwwroot. '/admin/tool/monitor/index.php', array(
+            'courseid' => $courseid,
+            'ruleid' => $this->id,
+            'action' => 'subscribe',
+            'sesskey' => sesskey()
+        ));
+
+        if (strpos($this->plugin, 'mod_') !== 0) {
+            return $url;
+
         } else {
-            $options[0] = get_string('allevents', 'tool_monitor');
-        }
-        if (strpos($this->plugin, 'mod_') === 0) {
+            // Single select when the plugin is an activity.
+            $options = array();
+            $options[0] = get_string('allmodules', 'tool_monitor');
+
             if ($courseid == 0) {
                 // They need to be in a course to select module instance.
                 return get_string('selectcourse', 'tool_monitor');
             }
+
             // Let them select an instance.
             $cms = get_fast_modinfo($courseid);
             $instances = $cms->get_instances_of(str_replace('mod_', '',  $this->plugin));
@@ -115,10 +129,9 @@ class rule {
                     $options[$cminfo->id] = $cminfo->get_formatted_name();
                 }
             }
+
+            return new \single_select($url, 'cmid', $options);
         }
-        $url = new \moodle_url($CFG->wwwroot. '/admin/tool/monitor/index.php', array('courseid' => $courseid, 'ruleid' => $this->id,
-                'action' => 'subscribe', 'sesskey' => sesskey()));
-        return new \single_select($url, 'cmid', $options, '', $nothing = array('' => 'choosedots'));
     }
 
     /**
@@ -208,10 +221,25 @@ class rule {
     }
 
     /**
-     * Get properly formatted name of the rule associated.
+     * Get properly formatted name of the course associated.
      *
      * @param \context $context context where this name would be displayed.
+     * @return string The course fullname.
+     */
+    public function get_course_name($context) {
+        $courseid = $this->courseid;
+        if (empty($courseid)) {
+            return get_string('site');
+        } else {
+            $course = get_course($courseid);
+            return format_string($course->fullname, true, array('context' => $context));
+        }
+    }
+
+    /**
+     * Get properly formatted name of the rule associated.
      *
+     * @param \context $context context where this name would be displayed.
      * @return string Formatted name of the rule.
      */
     public function get_name(\context $context) {
@@ -222,7 +250,6 @@ class rule {
      * Get properly formatted description of the rule associated.
      *
      * @param \context $context context where this description would be displayed.
-     *
      * @return string Formatted description of the rule.
      */
     public function get_description(\context $context) {
index 4c80c55..549adba 100644 (file)
@@ -86,20 +86,17 @@ class rule_form extends \moodleform {
         );
 
         // Name field.
-        $mform->addElement('text', 'name', get_string('name', 'tool_monitor'), 'size="50"');
+        $mform->addElement('text', 'name', get_string('rulename', 'tool_monitor'), 'size="50"');
         $mform->addRule('name', get_string('required'), 'required');
         $mform->setType('name', PARAM_TEXT);
-        $mform->addHelpButton('name', 'name', 'tool_monitor');
 
         // Plugin field.
-        $mform->addElement('select', 'plugin', get_string('selectplugin', 'tool_monitor'), $pluginlist);
+        $mform->addElement('select', 'plugin', get_string('areatomonitor', 'tool_monitor'), $pluginlist);
         $mform->addRule('plugin', get_string('required'), 'required');
-        $mform->addHelpButton('plugin', 'selectplugin', 'tool_monitor');
 
         // Event field.
-        $mform->addElement('select', 'eventname', get_string('selectevent', 'tool_monitor'), $eventlist);
+        $mform->addElement('select', 'eventname', get_string('event', 'tool_monitor'), $eventlist);
         $mform->addRule('eventname', get_string('required'), 'required');
-        $mform->addHelpButton('eventname', 'selectevent', 'tool_monitor');
 
         // Freeze plugin and event fields for editing if there's a subscription for this rule.
         if ($subscriptioncount > 0) {
@@ -110,31 +107,29 @@ class rule_form extends \moodleform {
         }
 
         // Description field.
-        $mform->addElement('editor', 'description', get_string('description', 'tool_monitor'), $editoroptions);
-        $mform->addHelpButton('description', 'description', 'tool_monitor');
+        $mform->addElement('editor', 'description', get_string('description'), $editoroptions);
 
         // Filters.
-        $mform->addElement('header', 'customisefilters', get_string('customisefilters', 'tool_monitor'));
         $freq = array(1 => 1, 5 => 5, 10 => 10, 20 => 20, 30 => 30, 40 => 40, 50 => 50, 60 => 60, 70 => 70, 80 => 80, 90 => 90,
                 100 => 100, 1000 => 1000);
-        $mform->addElement('select', 'frequency', get_string('selectfrequency', 'tool_monitor'), $freq);
+        $mform->addElement('select', 'frequency', get_string('frequency', 'tool_monitor'), $freq);
         $mform->addRule('frequency', get_string('required'), 'required');
-        $mform->addHelpButton('frequency', 'selectfrequency', 'tool_monitor');
+        $mform->addHelpButton('frequency', 'frequency', 'tool_monitor');
 
         $mins = array(1 => 1, 5 => 5, 10 => 10, 15 => 15, 20 => 20, 25 => 25, 30 => 30, 35 => 35, 40 => 40, 45 => 45, 50 => 50,
                 55 => 55,  60 => 60);
-        $mform->addElement('select', 'minutes', get_string('selectminutes', 'tool_monitor'), $mins);
+        $mform->addElement('select', 'minutes', get_string('inminutes', 'tool_monitor'), $mins);
         $mform->addRule('minutes', get_string('required'), 'required');
 
         // Message template.
-        $mform->addElement('header', 'customisemessage', get_string('customisemessage', 'tool_monitor'));
         $mform->addElement('editor', 'template', get_string('messagetemplate', 'tool_monitor'), $editoroptions);
-        $mform->setDefault('template', get_string('defaultmessagetpl', 'tool_monitor'));
+        $mform->setDefault('template', array('text' => get_string('defaultmessagetemplate', 'tool_monitor'),
+                'format' => FORMAT_HTML));
         $mform->addRule('template', get_string('required'), 'required');
         $mform->addHelpButton('template', 'messagetemplate', 'tool_monitor');
 
         // Action buttons.
-        $this->add_action_buttons(false, get_string('savechanges'));
+        $this->add_action_buttons(true, get_string('savechanges'));
     }
 
     /**
index a729dc8..6e25f6e 100644 (file)
@@ -124,7 +124,6 @@ class subscription {
      * Get properly formatted name of the rule associated.
      *
      * @param \context $context context where this name would be displayed.
-     *
      * @return string Formatted name of the rule.
      */
     public function get_name(\context $context) {
@@ -135,7 +134,6 @@ class subscription {
      * Get properly formatted description of the rule associated.
      *
      * @param \context $context context where this description would be displayed.
-     *
      * @return string Formatted description of the rule.
      */
     public function get_description(\context $context) {
@@ -162,21 +160,16 @@ class subscription {
      * Get properly formatted name of the course associated.
      *
      * @param \context $context context where this name would be displayed.
-     *
      * @return string Formatted name of the rule.
      */
     public function get_course_name(\context $context) {
-        global $SITE;
         $courseid = $this->courseid;
         if (empty($courseid)) {
-            $coursename = format_string($SITE->fullname, true, array('context' => $context));
+            return get_string('site');
         } else {
-            $course = get_course($this->courseid);
-            $link = new \moodle_url('/course/view.php', array('id' => $course->id));
-            $coursename = format_string($course->fullname, true, array('context' => $context));
-            $coursename = \html_writer::link($link, $coursename);
+            $course = get_course($courseid);
+            return format_string($course->fullname, true, array('context' => $context));
         }
-        return $coursename;
     }
 
     /**
index 9efb360..84e8560 100644 (file)
@@ -44,6 +44,10 @@ class clean_events extends \core\task\scheduled_task {
     public function execute() {
         global $DB;
 
+        if (!get_config('tool_monitor', 'enablemonitor')) {
+            return; // The tool is disabled. Nothing to do.
+        }
+
         // Array to store which events have been triggered in which course.
         $courses = array();
 
index d1b687c..6fed5e8 100644 (file)
@@ -49,5 +49,13 @@ $capabilities = array(
             'manager' => CAP_ALLOW
         ),
     ),
-);
 
+    'tool/monitor:managetool' => array(
+        'riskbitmask' => RISK_XSS, RISK_CONFIG,
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_SYSTEM,
+        'archetypes' => array(
+            'manager' => CAP_ALLOW
+        ),
+    ),
+);
index 39d2bb9..7729199 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<XMLDB PATH="tool/monitor/db" VERSION="20140708" COMMENT="XMLDB file for Moodle tool/monitor"
+<XMLDB PATH="tool/monitor/db" VERSION="20141103" COMMENT="XMLDB file for Moodle tool/monitor"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"
 >
@@ -37,6 +37,7 @@
         <FIELD NAME="cmid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Course module id"/>
         <FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="User id of the subscriber"/>
         <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Timestamp of when this subscription was created"/>
+        <FIELD NAME="lastnotificationsent" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="Timestamp of the time when a notification was last sent for this subscription."/>
       </FIELDS>
       <KEYS>
         <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
diff --git a/admin/tool/monitor/db/upgrade.php b/admin/tool/monitor/db/upgrade.php
new file mode 100644 (file)
index 0000000..59f0e86
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Upgrade scirpt for tool_monitor.
+ *
+ * @package    tool_monitor
+ * @copyright  2014 onwards Ankit Agarwal <ankit.agrr@gmail.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Upgrade the plugin.
+ *
+ * @param int $oldversion
+ * @return bool always true
+ */
+function xmldb_tool_monitor_upgrade($oldversion) {
+    global $DB;
+
+    $dbman = $DB->get_manager();
+
+    if ($oldversion < 2014102000) {
+
+        // Define field lastnotificationsent to be added to tool_monitor_subscriptions.
+        $table = new xmldb_table('tool_monitor_subscriptions');
+        $field = new xmldb_field('lastnotificationsent', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'timecreated');
+
+        // Conditionally launch add field lastnotificationsent.
+        if (!$dbman->field_exists($table, $field)) {
+            $dbman->add_field($table, $field);
+        }
+
+        // Monitor savepoint reached.
+        upgrade_plugin_savepoint(true, 2014102000, 'tool', 'monitor');
+    }
+
+    return true;
+}
index ed43f1d..20bd3c4 100644 (file)
@@ -44,17 +44,12 @@ if (empty($courseid)) {
 require_capability('tool/monitor:managerules', $context);
 
 // Set up the page.
-$a = new stdClass();
-$a->coursename = $coursename;
-$a->reportname = get_string('pluginname', 'tool_monitor');
-$title = get_string('title', 'tool_monitor', $a);
 $url = new moodle_url("/admin/tool/monitor/edit.php", array('courseid' => $courseid, 'ruleid' => $ruleid));
 $manageurl = new moodle_url("/admin/tool/monitor/managerules.php", array('courseid' => $courseid));
-
 $PAGE->set_url($url);
 $PAGE->set_pagelayout('report');
-$PAGE->set_title($title);
-$PAGE->set_heading($title);
+$PAGE->set_title($coursename);
+$PAGE->set_heading($coursename);
 
 // Get data ready for mform.
 $eventlist = tool_monitor\eventlist::get_all_eventlist(true);
@@ -87,6 +82,11 @@ if (!empty($ruleid)) {
 $mform = new tool_monitor\rule_form(null, array('eventlist' => $eventlist, 'pluginlist' => $pluginlist, 'rule' => $rule,
         'courseid' => $courseid, 'subscriptioncount' => $subscriptioncount));
 
+if ($mform->is_cancelled()) {
+    redirect(new moodle_url('/admin/tool/monitor/managerules.php', array('courseid' => $courseid)));
+    exit();
+}
+
 if ($mformdata = $mform->get_data()) {
     $rule = \tool_monitor\rule_manager::clean_ruledata_form($mformdata);
 
@@ -106,5 +106,15 @@ if ($mformdata = $mform->get_data()) {
     }
     $mform->display();
     echo $OUTPUT->footer();
+    exit;
 }
 
+echo $OUTPUT->header();
+if (!empty($ruleid)) {
+    echo $OUTPUT->heading(get_string('editrule', 'tool_monitor'));
+} else {
+    echo $OUTPUT->heading(get_string('addrule', 'tool_monitor'));
+}
+$mform->set_data($rule);
+$mform->display();
+echo $OUTPUT->footer();
diff --git a/admin/tool/monitor/help.php b/admin/tool/monitor/help.php
deleted file mode 100644 (file)
index 572b4ba..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-// This file is part of Moodle - http://moodle.org/
-//
-// Moodle is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Moodle is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
-
-/**
- * Displays help on a new page.
- *
- * @copyright 2014 Mark Nelson <markn@moodle.com>
- * @package tool_monitor
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-define('NO_MOODLE_COOKIES', true);
-
-require_once('../../../config.php');
-
-$type = required_param('type', PARAM_ALPHA);
-$id = required_param('id', PARAM_INT);
-$lang = optional_param('lang', 'en', PARAM_LANG);
-
-// We don't actually modify the session here as we have NO_MOODLE_COOKIES set.
-$SESSION->lang = $lang;
-
-$PAGE->set_url('/admin/tool/monitor/help.php');
-$PAGE->set_pagelayout('popup');
-
-if ($type == 'rule') {
-    $item = \tool_monitor\rule_manager::get_rule($id);
-} else { // Must be a subscription.
-    $item = \tool_monitor\subscription_manager::get_subscription($id);
-}
-
-if ($item->courseid) {
-    $PAGE->set_context(context_course::instance($item->courseid));
-} else { // Must be system context.
-    $PAGE->set_context(context_system::instance());
-}
-
-// Get the help string data.
-$data = tool_monitor\output\helpicon\renderable::get_help_string_parameters($type, $id);
-
-echo $OUTPUT->header();
-if (!empty($data->heading)) {
-    echo $OUTPUT->heading($data->heading, 1, 'helpheading');
-}
-echo $data->text;
-if (isset($data->completedoclink)) {
-    echo $data->completedoclink;
-}
-echo $OUTPUT->footer();
diff --git a/admin/tool/monitor/help_ajax.php b/admin/tool/monitor/help_ajax.php
deleted file mode 100644 (file)
index 429ff3b..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-// This file is part of Moodle - http://moodle.org/
-//
-// Moodle is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Moodle is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
-
-/**
- * Displays help via AJAX call.
- *
- * @copyright 2014 Mark Nelson <markn@moodle.com>
- * @package tool_monitor
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-define('NO_MOODLE_COOKIES', true);
-define('AJAX_SCRIPT', true);
-
-require_once('../../../config.php');
-
-$type = required_param('type', PARAM_ALPHA);
-$id = required_param('id', PARAM_INT);
-$lang = optional_param('lang', 'en', PARAM_LANG);
-
-// We don't actually modify the session here as we have NO_MOODLE_COOKIES set.
-$SESSION->lang = $lang;
-$PAGE->set_url('/admin/tool/monitor/help_ajax.php');
-
-if ($type == 'rule') {
-    $item = \tool_monitor\rule_manager::get_rule($id);
-} else { // Must be a subscription.
-    $item = \tool_monitor\subscription_manager::get_subscription($id);
-}
-
-if ($item->courseid) {
-    $PAGE->set_context(context_course::instance($item->courseid));
-} else { // Must be system context.
-    $PAGE->set_context(context_system::instance());
-}
-
-echo json_encode(tool_monitor\output\helpicon\renderable::get_help_string_parameters($type, $id, true));
index 3a02a62..3e06a33 100644 (file)
@@ -30,6 +30,7 @@ $action = optional_param('action', '', PARAM_ALPHA);
 $cmid = optional_param('cmid', 0, PARAM_INT);
 $ruleid = optional_param('ruleid', 0, PARAM_INT);
 $subscriptionid = optional_param('subscriptionid', 0, PARAM_INT);
+$confirm = optional_param('confirm', false, PARAM_BOOL);
 
 // Validate course id.
 if (empty($courseid)) {
@@ -44,24 +45,22 @@ if (empty($courseid)) {
     $coursename = format_string($course->fullname, true, array('context' => $coursecontext));
 }
 
+if (!get_config('tool_monitor', 'enablemonitor')) {
+    // This should never happen as the this page does not appear in navigation when the tool is disabled.
+    throw new coding_exception('Event monitoring is disabled');
+}
+
 // Always build the page in site context.
 $context = context_system::instance();
 $sitename = format_string($SITE->fullname, true, array('context' => $context));
 $PAGE->set_context($context);
 
 // Set up the page.
-$a = new stdClass();
-$a->coursename = $sitename;
-$a->reportname = get_string('pluginname', 'tool_monitor');
-$title = get_string('title', 'tool_monitor', $a);
-$indexurl = new moodle_url("/admin/tool/monitor/index.php", array('courseid' => $courseid));
-
+$indexurl = new moodle_url('/admin/tool/monitor/index.php', array('courseid' => $courseid));
 $PAGE->set_url($indexurl);
 $PAGE->set_pagelayout('report');
-$PAGE->set_title($title);
-$PAGE->set_heading($title);
-
-echo $OUTPUT->header();
+$PAGE->set_title($sitename);
+$PAGE->set_heading($sitename);
 
 // Create/delete subscription if needed.
 if (!empty($action)) {
@@ -70,14 +69,38 @@ if (!empty($action)) {
         case 'subscribe' :
             $rule = \tool_monitor\rule_manager::get_rule($ruleid);
             $rule->subscribe_user($courseid, $cmid);
+            echo $OUTPUT->header();
             echo $OUTPUT->notification(get_string('subcreatesuccess', 'tool_monitor'), 'notifysuccess');
             break;
         case 'unsubscribe' :
-            \tool_monitor\subscription_manager::delete_subscription($subscriptionid);
-            echo $OUTPUT->notification(get_string('subdeletesuccess', 'tool_monitor'), 'notifysuccess');
+            // If the subscription does not exist, then redirect back as the subscription must have already been deleted.
+            if (!$subscription = $DB->record_exists('tool_monitor_subscriptions', array('id' => $subscriptionid))) {
+                redirect(new moodle_url('/admin/tool/monitor/index.php', array('courseid' => $courseid)));
+            }
+
+            // Set the URLs.
+            $confirmurl = new moodle_url('/admin/tool/monitor/index.php', array('subscriptionid' => $subscriptionid,
+                'courseid' => $courseid, 'action' => 'unsubscribe', 'confirm' => true,
+                'sesskey' => sesskey()));
+            $cancelurl = new moodle_url('/admin/tool/monitor/index.php', array('subscriptionid' => $subscriptionid,
+                'courseid' => $courseid, 'sesskey' => sesskey()));
+            if ($confirm) {
+                \tool_monitor\subscription_manager::delete_subscription($subscriptionid);
+                echo $OUTPUT->header();
+                echo $OUTPUT->notification(get_string('subdeletesuccess', 'tool_monitor'), 'notifysuccess');
+            } else {
+                $subscription = \tool_monitor\subscription_manager::get_subscription($subscriptionid);
+                echo $OUTPUT->header();
+                echo $OUTPUT->confirm(get_string('subareyousure', 'tool_monitor', $subscription->get_name($context)),
+                    $confirmurl, $cancelurl);
+                echo $OUTPUT->footer();
+                exit();
+            }
             break;
         default:
     }
+} else {
+    echo $OUTPUT->header();
 }
 
 // Render the current subscriptions list.
@@ -86,20 +109,27 @@ $renderer = $PAGE->get_renderer('tool_monitor', 'managesubs');
 if (!empty($totalsubs)) {
     // Show the subscriptions section only if there are subscriptions.
     $subs = new \tool_monitor\output\managesubs\subs('toolmonitorsubs', $indexurl, $courseid);
-    echo $OUTPUT->heading(get_string('currentsubscriptions', 'tool_monitor'));
+    echo $OUTPUT->heading(get_string('currentsubscriptions', 'tool_monitor'), 3);
     echo $renderer->render($subs);
 }
 
 // Render the potential rules list.
 $totalrules = \tool_monitor\rule_manager::count_rules_by_courseid($courseid);
-echo $OUTPUT->heading(get_string('rulescansubscribe', 'tool_monitor'));
+echo $OUTPUT->heading(get_string('rulescansubscribe', 'tool_monitor'), 3);
 $rules = new \tool_monitor\output\managesubs\rules('toolmonitorrules', $indexurl, $courseid);
 echo $renderer->render($rules);
+
+// Check if the user can manage the course rules we are viewing.
+if (empty($courseid)) {
+    $canmanagerules = has_capability('tool/monitor:managerules', $context);
+} else {
+    $canmanagerules = has_capability('tool/monitor:managerules', $coursecontext);
+}
 if (empty($totalrules)) {
     // No rules present. Show a link to manage rules page if permissions permit.
     echo html_writer::start_div();
     echo html_writer::tag('span', get_string('norules', 'tool_monitor'));
-    if (has_capability('tool/monitor:managerules', $context)) {
+    if ($canmanagerules) {
         $manageurl = new moodle_url("/admin/tool/monitor/managerules.php", array('courseid' => $courseid));
         $a = html_writer::link($manageurl, get_string('managerules', 'tool_monitor'));
         $link = "&nbsp;";
@@ -107,7 +137,7 @@ if (empty($totalrules)) {
         echo $link;
     }
     echo html_writer::end_div();
-} else if (has_capability('tool/monitor:managerules', $context)) {
+} else if ($canmanagerules) {
     $manageurl = new moodle_url("/admin/tool/monitor/managerules.php", array('courseid' => $courseid));
     echo $renderer->render_rules_link($manageurl);
 }
index efa38b1..474629e 100644 (file)
 
 $string['addrule'] = 'Add a new rule';
 $string['allevents'] = 'All events';
-$string['allmodules'] = 'All modules';
+$string['allmodules'] = 'All instances';
+$string['area'] = 'Area';
+$string['areatomonitor'] = 'Area to monitor';
+$string['contactadmin'] = 'Contact your administrator to enable it.';
 $string['core'] = 'Core';
-$string['context'] = 'Context';
-$string['customisefilters'] = 'Select the frequency of the events';
-$string['customisemessage'] = 'Customise the notification message';
 $string['currentsubscriptions'] = 'Your current subscriptions';
-$string['description_help'] = "Description is displayed to users when they want to subscribe to this rule. This helps them understand what the rule is about.";
-$string['defaultmessagetpl'] = 'Rule "{rulename}" has happened. You can find further details at {link}';
+$string['defaultmessagetemplate'] = 'Rule name: {rulename}<br />Description: {description}<br />Event name: {eventname}';
 $string['deleterule'] = 'Delete rule';
 $string['deletesubscription'] = 'Delete subscription';
 $string['description'] = 'Description:';
-$string['disablefieldswarning'] = 'Plugin and events fields can not be edited because this rule already has subscriptions.';
+$string['disablefieldswarning'] = 'Some fields can not be edited as this rule already has subscriptions.';
 $string['duplicaterule'] = 'Duplicate rule';
 $string['editrule'] = 'Edit rule';
+$string['enablehelp'] = 'Enable/disable event monitoring';
+$string['enablehelp_help'] = 'Event monitoring must be enabled before it can be used. Please note that enabling event monitoring can have associated permformance implications.';
+$string['event'] = 'Event';
 $string['eventnotfound'] = 'Event not found';
 $string['eventrulecreated'] = 'Rule created';
 $string['eventruledeleted'] = 'Rule deleted';
@@ -48,31 +50,37 @@ $string['eventsubcreated'] = 'Subscription created';
 $string['eventsubcriteriamet'] = 'Subscription criteria met';
 $string['eventsubdeleted'] = 'Subscription deleted';
 $string['errorincorrectevent'] = 'Please select an event related to the selected plugin';
-$string['freqdesc'] = '{$a->freq} times in {$a->mins} minutes';
-$string['frequency'] = 'Frequency';
+$string['freqdesc'] = '{$a->freq} time(s) in {$a->mins} minute(s)';
+$string['frequency'] = 'Notification threshold';
+$string['frequency_help'] = 'The number of events within a specified time period required for a notification message to be sent.';
+$string['inminutes'] = 'in minutes';
 $string['invalidmodule'] = 'Invalid module';
-$string['norules'] = 'There are no rules you can subscribe to.';
-$string['manageruleslink'] = 'You can manage rules from {$a} page.';
+$string['manageruleslink'] = 'You can manage rules from the {$a} page.';
 $string['managesubscriptionslink'] = 'You can subscribe to rules from the {$a} page.';
-$string['moduleinstance'] = 'Module instance';
 $string['manage'] = 'Manage';
 $string['managesubscriptions'] = 'Event monitoring';
 $string['managerules'] = 'Event monitoring rules';
-$string['messageheader'] = 'Customise your notification message';
 $string['messageprovider:notification'] = 'Notifications of rule subscriptions';
-$string['messagetemplate'] = 'Message template';
-$string['messagetemplate_help'] = 'This is the content of the message that will be sent to users, when the given conditions of the rule are met. You are allowed to use following templates in this.
-<br /> {link} - Link to the location where the event happened.
-<br /> {modulelink} - Link to the module where the event has happened.
-<br /> {rulename} - Name of this rule.
-<br /> {description} - Rule description.
-<br /> {eventname} - Name of the event associated with the rule.';
-$string['minutes'] = 'in minutes:';
-$string['name'] = 'Name of the rule: ';
-$string['name_help'] = "Choose a name for the rule.";
-$string['nopermission'] = "No permission";
+$string['nopermission'] = 'No permission';
+$string['messagetemplate'] = 'Notification message';
+$string['messagetemplate_help'] = 'A notification message is sent to subscribers once the notification threshold has been reached. It can include any or all of the following placeholders:
+<br /><br />
+* Link to the location of the event {link}<br />
+* Link to the area monitored {modulelink}<br />
+* Rule name {rulename}<br />
+* Description {description}<br />
+* Event {eventname}';
+$string['messagetemplate_link'] = 'admin/tool/monitor/managerules';
+$string['moduleinstance'] = 'Instance';
+$string['monitorenabled'] = 'Event monitoring is currently enabled. ';
+$string['monitordisabled'] = 'Event monitoring is currently disabled.';
+$string['monitor:managerules'] = 'Manage event monitor rules';
+$string['monitor:managetool'] = 'Enable/disable event monitoring';
+$string['monitor:subscribe'] = 'Subscribe to event monitor rules';
+$string['norules'] = 'There are no event monitoring rules.';
 $string['pluginname'] = 'Event monitor';
 $string['processevents'] = 'Process events';
+$string['rulename'] = 'Rule name';
 $string['ruleareyousure'] = 'Are you sure you want to delete rule "{$a}"?';
 $string['rulecopysuccess'] = 'Rule successfully duplicated';
 $string['ruledeletesuccess'] = 'Rule successfully deleted';
@@ -82,23 +90,12 @@ $string['rulenopermissions'] = 'You do not have permissions to "{$a} a rule"';
 $string['rulescansubscribe'] = 'Rules you can subscribe to';
 $string['selectacourse'] = 'Select a course';
 $string['selectcourse'] = 'Visit this report at course level to get a list of possible modules';
-$string['selectevent'] = 'Select an event:';
-$string['selectevent_help'] = "Select an event to monitor. Please note that some events are only triggered for the entire site (e.g. 'course created') and will never trigger when subscribed to from within a course.";
-$string['selectfrequency'] = 'Frequency of events:';
-$string['selectfrequency_help'] = "Frequency defines the denisty of the event occurrence. Select criterias to define how frequently the event should happen to trigger the notification.";
-$string['selectminutes'] = 'in minutes:';
-$string['selectplugin'] = 'Select the plugin type:';
-$string['selectplugin_help'] = "Select a plugin that you are interested in monitoring. The event list below would be updated to display events from the selected plugin.";
 $string['subareyousure'] = 'Are you sure you want to delete this subscription for the rule "{$a}"?';
 $string['subcreatesuccess'] = "Subscription successfully created";
 $string['subdeletesuccess'] = "Subscription successfully removed";
 $string['subhelp'] = 'Subscription details';
 $string['subhelp_help'] = 'This subscription listens for when the event \'{$a->eventname}\' has been triggered in \'{$a->moduleinstance}\' {$a->frequency} time(s) in {$a->minutes} minute(s).';
 $string['subscribeto'] = 'Subscribe to rule "{$a}"';
-$string['system'] = "System";
 $string['taskcleanevents'] = 'Removes any unnecessary event monitor events';
-$string['title'] = '{$a->coursename} : {$a->reportname}';
-$string['monitor:managerules'] = 'Manage event monitor rules';
-$string['monitor:subscribe'] = 'Subscribe to event monitor rules';
 $string['unsubscribe'] = 'Unsubscribe';
 
index d06ec5e..4b4ec31 100644 (file)
@@ -32,12 +32,32 @@ defined('MOODLE_INTERNAL') || die;
  * @param context         $context    The context of the course
  */
 function tool_monitor_extend_navigation_course($navigation, $course, $context) {
+    if (has_capability('tool/monitor:managerules', $context) && get_config('tool_monitor', 'enablemonitor')) {
+        $url = new moodle_url('/admin/tool/monitor/managerules.php', array('courseid' => $course->id));
+        $settingsnode = navigation_node::create(get_string('managerules', 'tool_monitor'), $url, navigation_node::TYPE_SETTING,
+                null, null, new pix_icon('i/settings', ''));
+        $reportnode = $navigation->get('coursereports');
+
+        if (isset($settingsnode) && !empty($reportnode)) {
+            $reportnode->add_node($settingsnode);
+        }
+    }
+}
+
+/**
+ * This function extends the navigation with the tool items
+ *
+ * @param navigation_node $navigation The navigation node to extend
+ * @param stdClass        $course     The course to object for the tool
+ * @param context         $context    The context of the course
+ */
+function tool_monitor_extend_navigation_frontpage($navigation, $course, $context) {
 
     if (has_capability('tool/monitor:managerules', $context)) {
         $url = new moodle_url('/admin/tool/monitor/managerules.php', array('courseid' => $course->id));
         $settingsnode = navigation_node::create(get_string('managerules', 'tool_monitor'), $url, navigation_node::TYPE_SETTING,
                 null, null, new pix_icon('i/settings', ''));
-        $reportnode = $navigation->get('coursereports');
+        $reportnode = $navigation->get('frontpagereports');
 
         if (isset($settingsnode) && !empty($reportnode)) {
             $reportnode->add_node($settingsnode);
@@ -55,9 +75,17 @@ function tool_monitor_extend_navigation_course($navigation, $course, $context) {
  * @param context         $coursecontext     The context of the course
  */
 function tool_monitor_extend_navigation_user_settings($navigation, $user, $usercontext, $course, $coursecontext) {
-    global $USER;
-    if (($USER->id == $user->id) && (has_capability('tool/monitor:subscribe', $coursecontext))) {
-        $url = new moodle_url('/admin/tool/monitor/index.php', array('courseid' => $course->id));
+    global $USER, $SITE;
+    if (($USER->id == $user->id) && (has_capability('tool/monitor:subscribe', $coursecontext)
+            && get_config('tool_monitor', 'enablemonitor'))) {
+        // The $course->id will always be the course that corresponds to the current context.
+        $courseid = $course->id;
+        // A $course->id of $SITE->id might either be the frontpage or the site. So if we get the site ID back, check the...
+        // ...courseid parameter passed to the page so we can know if we are looking at the frontpage rules or site level rules.
+        if ($course->id == $SITE->id && optional_param('courseid', $course->id, PARAM_INT) == 0) {
+            $courseid = 0;
+        }
+        $url = new moodle_url('/admin/tool/monitor/index.php', array('courseid' => $courseid));
         $subsnode = navigation_node::create(get_string('managesubscriptions', 'tool_monitor'), $url,
                 navigation_node::TYPE_SETTING, null, null, new pix_icon('i/settings', ''));
 
index bdafd03..c7ff382 100644 (file)
@@ -28,6 +28,8 @@ require_once($CFG->libdir.'/adminlib.php');
 $courseid = optional_param('courseid', 0, PARAM_INT);
 $ruleid = optional_param('ruleid', 0, PARAM_INT);
 $action = optional_param('action', '', PARAM_ALPHA);
+$confirm = optional_param('confirm', false, PARAM_BOOL);
+$status = optional_param('status', 0, PARAM_BOOL);
 
 // Validate course id.
 if (empty($courseid)) {
@@ -46,28 +48,36 @@ if (empty($courseid)) {
 require_capability('tool/monitor:managerules', $context);
 
 // Set up the page.
-$a = new stdClass();
-$a->coursename = $coursename;
-$a->reportname = get_string('pluginname', 'tool_monitor');
-$title = get_string('title', 'tool_monitor', $a);
 $manageurl = new moodle_url("/admin/tool/monitor/managerules.php", array('courseid' => $courseid));
-
 $PAGE->set_url($manageurl);
 $PAGE->set_pagelayout('report');
-$PAGE->set_title($title);
-$PAGE->set_heading($title);
+$PAGE->set_title($coursename);
+$PAGE->set_heading($coursename);
 
 // Site level report.
 if (empty($courseid)) {
     admin_externalpage_setup('toolmonitorrules', '', null, '', array('pagelayout' => 'report'));
 }
 
-echo $OUTPUT->header();
+if (!empty($action) && $action == 'changestatus') {
+    require_sesskey();
+    require_capability('tool/monitor:managetool', context_system::instance());
+    // Toggle status of the plugin.
+    set_config('enablemonitor', $status, 'tool_monitor');
+    redirect(new moodle_url('/admin/tool/monitor/managerules.php', array('courseid' => 0)));
+}
 
 // Copy/delete rule if needed.
 if (!empty($action) && $ruleid) {
     require_sesskey();
-    $rule = \tool_monitor\rule_manager::get_rule($ruleid);
+
+    // If the rule does not exist, then redirect back as the rule must have already been deleted.
+    if (!$rule = $DB->get_record('tool_monitor_rules', array('id' => $ruleid), '*', IGNORE_MISSING)) {
+        redirect(new moodle_url('/admin/tool/monitor/managerules.php', array('courseid' => $courseid)));
+    }
+
+    echo $OUTPUT->header();
+    $rule = \tool_monitor\rule_manager::get_rule($rule);
     if ($rule->can_manage_rule()) {
         switch ($action) {
             case 'copy' :
@@ -75,8 +85,20 @@ if (!empty($action) && $ruleid) {
                 echo $OUTPUT->notification(get_string('rulecopysuccess', 'tool_monitor'), 'notifysuccess');
                 break;
             case 'delete' :
-                $rule->delete_rule();
-                echo $OUTPUT->notification(get_string('ruledeletesuccess', 'tool_monitor'), 'notifysuccess');
+                $confirmurl = new moodle_url($CFG->wwwroot. '/admin/tool/monitor/managerules.php',
+                    array('ruleid' => $ruleid, 'courseid' => $courseid, 'action' => 'delete',
+                        'confirm' => true, 'sesskey' => sesskey()));
+                $cancelurl = new moodle_url($CFG->wwwroot. '/admin/tool/monitor/managerules.php',
+                    array('courseid' => $courseid));
+                if ($confirm) {
+                    $rule->delete_rule();
+                    echo $OUTPUT->notification(get_string('ruledeletesuccess', 'tool_monitor'), 'notifysuccess');
+                } else {
+                    echo $OUTPUT->confirm(get_string('ruleareyousure', 'tool_monitor', $rule->get_name($context)),
+                        $confirmurl, $cancelurl);
+                    echo $OUTPUT->footer();
+                    exit();
+                }
                 break;
             default:
         }
@@ -84,6 +106,36 @@ if (!empty($action) && $ruleid) {
         // User doesn't have permissions. Should never happen for real users.
         throw new moodle_exception('rulenopermissions', 'tool_monitor', $manageurl, $action);
     }
+} else {
+    echo $OUTPUT->header();
+}
+
+echo $OUTPUT->heading(get_string('managerules', 'tool_monitor'));
+$status = get_config('tool_monitor', 'enablemonitor');
+$help = new help_icon('enablehelp', 'tool_monitor');
+
+// Display option to enable/disable the plugin.
+if ($status) {
+    if (has_capability('tool/monitor:managetool', context_system::instance())) {
+        // We don't need to show enabled status to everyone.
+        echo get_string('monitorenabled', 'tool_monitor');
+        $disableurl = new moodle_url("/admin/tool/monitor/managerules.php",
+                array('courseid' => $courseid, 'action' => 'changestatus', 'status' => 0, 'sesskey' => sesskey()));
+        echo ' ' . html_writer::link($disableurl, get_string('disable'));
+        echo $OUTPUT->render($help);
+    }
+} else {
+    echo get_string('monitordisabled', 'tool_monitor');
+    if (has_capability('tool/monitor:managetool', context_system::instance())) {
+        $enableurl = new moodle_url("/admin/tool/monitor/managerules.php",
+                array('courseid' => $courseid, 'action' => 'changestatus', 'status' => 1, 'sesskey' => sesskey()));
+        echo ' ' . html_writer::link($enableurl, get_string('enable'));
+        echo $OUTPUT->render($help);
+    } else {
+        echo get_string('contactadmin', 'tool_monitor');
+    }
+    echo $OUTPUT->footer(); // Do not render anything else.
+    exit();
 }
 
 // Render the rule list.
index 9e32468..1913b84 100644 (file)
  */
 defined('MOODLE_INTERNAL') || die;
 
-if ($hassiteconfig) {
-
-    // Manage rules page.
-    $url = new moodle_url('/admin/tool/monitor/managerules.php', array('courseid' => 0));
-    $temp = new admin_externalpage('toolmonitorrules', get_string('managerules', 'tool_monitor'), $url,
-        'tool/monitor:managerules');
-    $ADMIN->add('reports', $temp);
-}
+// Manage rules page.
+$temp = new admin_externalpage(
+    'toolmonitorrules',
+    get_string('managerules', 'tool_monitor'),
+    new moodle_url('/admin/tool/monitor/managerules.php', array('courseid' => 0)),
+    'tool/monitor:managerules'
+);
+$ADMIN->add('reports', $temp);
diff --git a/admin/tool/monitor/tests/behat/disabled.feature b/admin/tool/monitor/tests/behat/disabled.feature
new file mode 100644 (file)
index 0000000..24dbea6
--- /dev/null
@@ -0,0 +1,20 @@
+@javascript @tool @tool_monitor
+Feature: Enable/disable managment of the event monitor
+  In order to manage event monitoring
+  As an admin
+  I need to enable/disable it
+
+  @javascript
+  Scenario: Tool is disabled by default.
+    Given I log in as "admin"
+    When I navigate to "Event monitoring rules" node in "Site administration > Reports"
+    Then I should see "Event monitoring is currently disabled"
+    And I should see "Enable"
+    And I should not see "Add a new rule"
+    And I click on "Enable" "link"
+    And I should see "Event monitoring is currently enabled"
+    And I should see "Disable"
+    And I should see "Add a new rule"
+    And I click on "Disable" "link"
+    And I should see "Event monitoring is currently disabled"
+    And I should not see "Add a new rule"
index 33287a8..bd9ff74 100644 (file)
@@ -14,148 +14,151 @@ Feature: tool_monitor_rule
     And the following "course enrolments" exist:
       | user | course | role |
       | teacher1 | C1 | editingteacher |
-    And   I log in as "admin"
-    And   I follow "Course 1"
-    And   I navigate to "Event monitoring rules" node in "Course administration > Reports"
-    And   I press "Add a new rule"
-    And   I set the following fields to these values:
-      | name              | New rule course level                             |
-      | plugin            | Forum                                             |
-      | eventname         | Post created                                      |
-      | id_description    | I want a rule to monitor posts created on a forum |
-      | frequency         | 1                                                 |
-      | minutes           | 1                                                 |
-      | Message template  | The forum post was created. {modulelink}          |
-    And   I press "Save changes"
-    And   I navigate to "Event monitoring rules" node in "Site administration > Reports"
-    And   I press "Add a new rule"
-    And   I set the following fields to these values:
-      | name              | New rule site level                               |
-      | plugin            | Forum                                             |
-      | eventname         | Post created                                      |
-      | id_description    | I want a rule to monitor posts created on a forum |
-      | frequency         | 1                                                 |
-      | minutes           | 1                                                 |
-      | Message template  | The forum post was created. {modulelink}          |
-    And  I press "Save changes"
-    And  I log out
+    And I log in as "admin"
+    And I navigate to "Event monitoring rules" node in "Site administration > Reports"
+    And I click on "Enable" "link"
+    And I am on homepage
+    And I follow "Course 1"
+    And I navigate to "Event monitoring rules" node in "Course administration > Reports"
+    And I press "Add a new rule"
+    And I set the following fields to these values:
+      | name                 | New rule course level                             |
+      | plugin               | Forum                                             |
+      | eventname            | Post created                                      |
+      | id_description       | I want a rule to monitor posts created on a forum |
+      | frequency            | 1                                                 |
+      | minutes              | 1                                                 |
+      | Notification message | The forum post was created. {modulelink}          |
+    And I press "Save changes"
+    And I navigate to "Event monitoring rules" node in "Site administration > Reports"
+    And I press "Add a new rule"
+    And I set the following fields to these values:
+      | name                 | New rule site level                               |
+      | plugin               | Forum                                             |
+      | eventname            | Post created                                      |
+      | id_description       | I want a rule to monitor posts created on a forum |
+      | frequency            | 1                                                 |
+      | minutes              | 1                                                 |
+      | Notification message | The forum post was created. {modulelink}          |
+    And I press "Save changes"
+    And I log out
 
   Scenario: Add a rule on course level
     Given I log in as "teacher1"
-    And   I am on homepage
-    And   I follow "Course 1"
-    And   I navigate to "Event monitoring rules" node in "Course administration > Reports"
-    When  I press "Add a new rule"
-    And   I set the following fields to these values:
-      | name              | New rule                                          |
-      | plugin            | Forum                                             |
-      | eventname         | Post created                                      |
-      | id_description    | I want a rule to monitor posts created on a forum |
-      | frequency         | 1                                                 |
-      | minutes           | 1                                                 |
-      | Message template  | The forum post was created. {modulelink}          |
-    And   I press "Save changes"
-    Then  "New rule" row "Context" column of "toolmonitorrules_table" table should contain "Course"
-    And   I should see "I want a rule to monitor posts created on a forum"
-    And   I should see "Forum"
-    And   I should see "Post created"
-    And   I should see "1 times in 1 minutes"
+    And I am on homepage
+    And I follow "Course 1"
+    And I navigate to "Event monitoring rules" node in "Course administration > Reports"
+    When I press "Add a new rule"
+    And I set the following fields to these values:
+      | name                 | New rule                                          |
+      | plugin               | Forum                                             |
+      | eventname            | Post created                                      |
+      | id_description       | I want a rule to monitor posts created on a forum |
+      | frequency            | 1                                                 |
+      | minutes              | 1                                                 |
+      | Notification message | The forum post was created. {modulelink}          |
+    And I press "Save changes"
+    Then "New rule" row "Course" column of "toolmonitorrules_table" table should contain "Course 1"
+    And I should see "I want a rule to monitor posts created on a forum"
+    And I should see "Forum"
+    And I should see "Post created"
+    And I should see "1 time(s) in 1 minute(s)"
 
   Scenario: Delete a rule on course level
     Given I log in as "teacher1"
-    And   I follow "Course 1"
-    And   I navigate to "Event monitoring rules" node in "Course administration > Reports"
-    When  I click on "Delete rule" "link"
-    Then  I should see "Are you sure you want to delete rule \"New rule course level\"?"
-    And   I press "Yes"
-    And   I should see "Rule successfully deleted"
-    And   I should not see "New rule course level"
+    And I follow "Course 1"
+    And I navigate to "Event monitoring rules" node in "Course administration > Reports"
+    When I click on "Delete rule" "link"
+    Then I should see "Are you sure you want to delete rule \"New rule course level\"?"
+    And I press "Continue"
+    And I should see "Rule successfully deleted"
+    And I should not see "New rule course level"
 
   Scenario: Edit a rule on course level
     Given I log in as "teacher1"
-    And   I follow "Course 1"
-    And   I navigate to "Event monitoring rules" node in "Course administration > Reports"
-    When  I click on "Edit rule" "link"
-    And   I set the following fields to these values:
-      | name              | New rule quiz                                  |
-      | plugin            | Quiz                                           |
-      | eventname         | Quiz attempt deleted                           |
-      | id_description    | I want a rule to monitor quiz attempts deleted |
-      | frequency         | 5                                              |
-      | minutes           | 5                                              |
-      | Message template  | Quiz attempt deleted. {modulelink}             |
-    And   I press "Save changes"
-    Then  I should see "New rule quiz"
-    And   I should see "I want a rule to monitor quiz attempts deleted"
-    And   I should see "Quiz attempt deleted"
-    And   I should see "5 times in 5 minutes"
+    And I follow "Course 1"
+    And I navigate to "Event monitoring rules" node in "Course administration > Reports"
+    When I click on "Edit rule" "link"
+    And I set the following fields to these values:
+      | name                 | New rule quiz                                  |
+      | plugin               | Quiz                                           |
+      | eventname            | Quiz attempt deleted                           |
+      | id_description       | I want a rule to monitor quiz attempts deleted |
+      | frequency            | 5                                              |
+      | minutes              | 5                                              |
+      | Notification message | Quiz attempt deleted. {modulelink}             |
+    And I press "Save changes"
+    Then I should see "New rule quiz"
+    And I should see "I want a rule to monitor quiz attempts deleted"
+    And I should see "Quiz attempt deleted"
+    And I should see "5 time(s) in 5 minute(s)"
 
   Scenario: Duplicate a rule on course level
     Given I log in as "teacher1"
-    And   I follow "Course 1"
-    And   I navigate to "Event monitoring rules" node in "Course administration > Reports"
-    When  I click on "Duplicate rule" "link"
-    Then  I should see "Rule successfully duplicated"
-    And   "#toolmonitorrules_r1" "css_element" should appear before "#toolmonitorrules_r2" "css_element"
-    And   I should see "New rule"
-    And   I should see "I want a rule to monitor posts created on a forum"
-    And   I should see "Forum"
-    And   I should see "Post created"
-    And   I should see "1 times in 1 minutes"
+    And I follow "Course 1"
+    And I navigate to "Event monitoring rules" node in "Course administration > Reports"
+    When I click on "Duplicate rule" "link"
+    Then I should see "Rule successfully duplicated"
+    And "#toolmonitorrules_r1" "css_element" should appear before "#toolmonitorrules_r2" "css_element"
+    And I should see "New rule"
+    And I should see "I want a rule to monitor posts created on a forum"
+    And I should see "Forum"
+    And I should see "Post created"
+    And I should see "1 time(s) in 1 minute(s)"
 
   Scenario: Add a rule on site level
     Given I log in as "admin"
-    And   I navigate to "Event monitoring rules" node in "Site administration > Reports"
-    When  I press "Add a new rule"
-    And   I set the following fields to these values:
-      | name              | New rule                                          |
-      | plugin            | Forum                                             |
-      | eventname         | Post created                                      |
-      | id_description    | I want a rule to monitor posts created on a forum |
-      | frequency         | 1                                                 |
-      | minutes           | 1                                                 |
-      | Message template  | The forum post was created. {modulelink}          |
-    And   I press "Save changes"
-    Then  "New rule" row "Context" column of "toolmonitorrules_table" table should contain "System"
-    And   I should see "I want a rule to monitor posts created on a forum"
-    And   I should see "Forum"
-    And   I should see "Post created"
-    And   I should see "1 times in 1 minutes"
+    And I navigate to "Event monitoring rules" node in "Site administration > Reports"
+    When I press "Add a new rule"
+    And I set the following fields to these values:
+      | name                 | New rule                                          |
+      | plugin               | Forum                                             |
+      | eventname            | Post created                                      |
+      | id_description       | I want a rule to monitor posts created on a forum |
+      | frequency            | 1                                                 |
+      | minutes              | 1                                                 |
+      | Notification message | The forum post was created. {modulelink}          |
+    And I press "Save changes"
+    Then "New rule" row "Course" column of "toolmonitorrules_table" table should contain "Site"
+    And I should see "I want a rule to monitor posts created on a forum"
+    And I should see "Forum"
+    And I should see "Post created"
+    And I should see "1 time(s) in 1 minute(s)"
 
   Scenario: Delete a rule on site level
     Given I log in as "admin"
-    And   I navigate to "Event monitoring rules" node in "Site administration > Reports"
-    When  I click on "Delete rule" "link"
-    Then  I should see "Are you sure you want to delete rule \"New rule site level\"?"
-    And   I press "Yes"
-    And   I should see "Rule successfully deleted"
-    And   I should not see "New rule site level"
+    And I navigate to "Event monitoring rules" node in "Site administration > Reports"
+    When I click on "Delete rule" "link"
+    Then I should see "Are you sure you want to delete rule \"New rule site level\"?"
+    And I press "Continue"
+    And I should see "Rule successfully deleted"
+    And I should not see "New rule site level"
 
   Scenario: Edit a rule on site level
     Given I log in as "admin"
-    And   I navigate to "Event monitoring rules" node in "Site administration > Reports"
-    When  I click on "Edit rule" "link"
-    And   I set the following fields to these values:
-      | name              | New Rule Quiz                                  |
-      | plugin            | Quiz                                           |
-      | eventname         | Quiz attempt deleted                           |
-      | id_description    | I want a rule to monitor quiz attempts deleted |
-      | frequency         | 5                                              |
-      | minutes           | 5                                              |
-      | Message template  | Quiz attempt deleted. {modulelink}             |
-    And   I press "Save changes"
-    Then  I should see "New Rule Quiz"
-    And   I should see "I want a rule to monitor quiz attempts deleted"
-    And   I should see "Quiz attempt deleted"
-    And   I should see "5 times in 5 minutes"
+    And I navigate to "Event monitoring rules" node in "Site administration > Reports"
+    When I click on "Edit rule" "link"
+    And I set the following fields to these values:
+      | name                 | New Rule Quiz                                  |
+      | plugin               | Quiz                                           |
+      | eventname            | Quiz attempt deleted                           |
+      | id_description       | I want a rule to monitor quiz attempts deleted |
+      | frequency            | 5                                              |
+      | minutes              | 5                                              |
+      | Notification message | Quiz attempt deleted. {modulelink}             |
+    And I press "Save changes"
+    Then I should see "New Rule Quiz"
+    And I should see "I want a rule to monitor quiz attempts deleted"
+    And I should see "Quiz attempt deleted"
+    And I should see "5 time(s) in 5 minute(s)"
 
   Scenario: Duplicate a rule on site level
     Given I log in as "admin"
-    And   I navigate to "Event monitoring rules" node in "Site administration > Reports"
-    When  I click on "Duplicate rule" "link"
-    Then  I should see "Rule successfully duplicated"
-    And   "#toolmonitorrules_r2" "css_element" should appear after "#toolmonitorrules_r1" "css_element"
-    And   I should see "I want a rule to monitor posts created on a forum"
-    And   I should see "Forum"
-    And   I should see "Post created"
-    And   I should see "1 times in 1 minutes"
+    And I navigate to "Event monitoring rules" node in "Site administration > Reports"
+    When I click on "Duplicate rule" "link"
+    Then I should see "Rule successfully duplicated"
+    And "#toolmonitorrules_r2" "css_element" should appear after "#toolmonitorrules_r1" "css_element"
+    And I should see "I want a rule to monitor posts created on a forum"
+    And I should see "Forum"
+    And I should see "Post created"
+    And I should see "1 time(s) in 1 minute(s)"
index f189a2a..cecba4e 100644 (file)
@@ -8,129 +8,172 @@ Feature: tool_monitor_subscriptions
     Given the following "courses" exist:
       | fullname | shortname |
       | Course 1 | C1        |
+      | Course 2 | C2        |
     And the following "users" exist:
       | username | firstname | lastname | email |
       | teacher1 | Teacher | 1 | teacher1@asd.com |
+      | teacher2 | Teacher | 2 | teacher2@asd.com |
     And the following "course enrolments" exist:
       | user | course | role |
       | teacher1 | C1 | editingteacher |
-    And   I log in as "admin"
-    And   I follow "Course 1"
-    And   I navigate to "Event monitoring rules" node in "Course administration > Reports"
-    And   I press "Add a new rule"
-    And   I set the following fields to these values:
-      | name              | New rule course level                             |
-      | plugin            | Core                                              |
-      | eventname         | Course viewed                                     |
-      | id_description    | I want a rule to monitor when a course is viewed. |
-      | frequency         | 1                                                 |
-      | minutes           | 1                                                 |
-      | Message template  | The course was viewed. {modulelink}               |
-    And   I press "Save changes"
-    And   I navigate to "Event monitoring rules" node in "Site administration > Reports"
-    And   I press "Add a new rule"
-    And   I set the following fields to these values:
-      | name              | New rule site level                               |
-      | plugin            | Core                                              |
-      | eventname         | Course viewed                                     |
-      | id_description    | I want a rule to monitor when a course is viewed. |
-      | frequency         | 1                                                 |
-      | minutes           | 1                                                 |
-      | Message template  | The course was viewed. {modulelink}               |
-    And  I press "Save changes"
-    And  I log out
+      | teacher1 | C2 | teacher |
+      | teacher2 | C1 | teacher |
+      | teacher2 | C2 | editingteacher |
+    And I log in as "admin"
+    And I navigate to "Event monitoring rules" node in "Site administration > Reports"
+    And I click on "Enable" "link"
+    And I am on homepage
+    And I follow "Course 1"
+    And I navigate to "Event monitoring rules" node in "Course administration > Reports"
+    And I press "Add a new rule"
+    And I set the following fields to these values:
+      | name                 | New rule course level                             |
+      | plugin               | Core                                              |
+      | eventname            | Course viewed                                     |
+      | id_description       | I want a rule to monitor when a course is viewed. |
+      | frequency            | 1                                                 |
+      | minutes              | 1                                                 |
+      | Notification message | The course was viewed. {modulelink}               |
+    And I press "Save changes"
+    And I navigate to "Event monitoring rules" node in "Site administration > Reports"
+    And I press "Add a new rule"
+    And I set the following fields to these values:
+      | name                 | New rule site level                               |
+      | plugin               | Core                                              |
+      | eventname            | Course viewed                                     |
+      | id_description       | I want a rule to monitor when a course is viewed. |
+      | frequency            | 1                                                 |
+      | minutes              | 1                                                 |
+      | Notification message | The course was viewed. {modulelink}               |
+    And I press "Save changes"
+    And I navigate to "Define roles" node in "Site administration > Users > Permissions"
+    And I follow "Non-editing teacher"
+    And I press "Edit"
+    And I click on "tool/monitor:managerules" "checkbox"
+    And I press "Save changes"
+    And I log out
 
   Scenario: Subscribe to a rule on course level
     Given I log in as "teacher1"
-    And   I follow "Course 1"
-    And   I navigate to "Event monitoring" node in "My profile settings"
-    And   I set the field "Select a course" to "Course 1"
-    When  I set the field "Subscribe to rule \"New rule course level\"" to "All events"
-    Then  I should see "Subscription successfully created"
-    And   "#toolmonitorsubs_r0" "css_element" should exist
+    And I follow "Course 1"
+    And I navigate to "Event monitoring" node in "My profile settings"
+    And I set the field "Select a course" to "Course 1"
+    When I follow "Subscribe to rule \"New rule course level\""
+    Then I should see "Subscription successfully created"
+    And "#toolmonitorsubs_r0" "css_element" should exist
 
   Scenario: Delete a subscription on course level
     Given I log in as "teacher1"
-    And   I follow "Course 1"
-    And   I navigate to "Event monitoring" node in "My profile settings"
-    And   I set the field "Select a course" to "Course 1"
-    And   I set the field "Subscribe to rule \"New rule course level\"" to "All events"
-    And   I should see "Subscription successfully created"
-    When  I click on "Delete subscription" "link" in the "New rule course level" "table_row"
-    And   I should see "Are you sure you want to delete this subscription for the rule \"New rule course level\"?"
-    And   I press "Yes"
-    Then  I should see "Subscription successfully removed"
-    And   "#toolmonitorsubs_r0" "css_element" should not exist
+    And I follow "Course 1"
+    And I navigate to "Event monitoring" node in "My profile settings"
+    And I set the field "Select a course" to "Course 1"
+    And I follow "Subscribe to rule \"New rule course level\""
+    And I should see "Subscription successfully created"
+    When I click on "Delete subscription" "link" in the "New rule course level" "table_row"
+    And I should see "Are you sure you want to delete this subscription for the rule \"New rule course level\"?"
+    And I press "Continue"
+    Then I should see "Subscription successfully removed"
+    And "#toolmonitorsubs_r0" "css_element" should not exist
 
   Scenario: Subscribe to a rule on site level
     Given I log in as "admin"
-    And   I navigate to "Event monitoring" node in "My profile settings"
-    And   I set the field "Select a course" to "Site"
-    When  I set the field "Subscribe to rule \"New rule site level\"" to "All events"
-    Then  I should see "Subscription successfully created"
-    And   "#toolmonitorsubs_r0" "css_element" should exist
+    And I navigate to "Event monitoring" node in "My profile settings"
+    And I set the field "Select a course" to "Site"
+    When I follow "Subscribe to rule \"New rule site level\""
+    Then I should see "Subscription successfully created"
+    And "#toolmonitorsubs_r0" "css_element" should exist
 
   Scenario: Delete a subscription on site level
     Given I log in as "admin"
-    And   I navigate to "Event monitoring" node in "My profile settings"
-    And   I set the field "Select a course" to "Site"
-    And   I set the field "Subscribe to rule \"New rule site level\"" to "All events"
-    And   I should see "Subscription successfully created"
-    And   "#toolmonitorsubs_r0" "css_element" should exist
-    When  I click on "Delete subscription" "link" in the "New rule site level" "table_row"
-    And   I should see "Are you sure you want to delete this subscription for the rule \"New rule site level\"?"
-    And   I press "Yes"
-    Then  I should see "Subscription successfully removed"
-    And   "#toolmonitorsubs_r0" "css_element" should not exist
+    And I navigate to "Event monitoring" node in "My profile settings"
+    And I set the field "Select a course" to "Site"
+    And I follow "Subscribe to rule \"New rule site level\""
+    And I should see "Subscription successfully created"
+    And "#toolmonitorsubs_r0" "css_element" should exist
+    When I click on "Delete subscription" "link" in the "New rule site level" "table_row"
+    And I should see "Are you sure you want to delete this subscription for the rule \"New rule site level\"?"
+    And I press "Continue"
+    Then I should see "Subscription successfully removed"
+    And "#toolmonitorsubs_r0" "css_element" should not exist
 
   Scenario: Receiving notification on site level
     Given I log in as "admin"
-    And   I navigate to "Messaging" node in "My profile settings"
-    And   I click on "input[name^=tool_monitor_notification_loggedin]" "css_element"
-    And   I press "Update profile"
-    And   I am on homepage
-    And   I follow "Course 1"
-    And   I navigate to "Event monitoring" node in "My profile settings"
-    And   I set the field "Select a course" to "Site"
-    And   I set the field "Subscribe to rule \"New rule site level\"" to "All events"
-    And   I should see "Subscription successfully created"
-    And   "#toolmonitorsubs_r0" "css_element" should exist
-    And   I am on homepage
-    And   I trigger cron
-    And   I am on homepage
-    When  I navigate to "Messages" node in "My profile"
-    And   I follow "Do not reply to this email (1)"
-    Then  I should see "The course was viewed."
+    And I navigate to "Messaging" node in "My profile settings"
+    And I click on "input[name^=tool_monitor_notification_loggedin]" "css_element"
+    And I press "Update profile"
+    And I am on homepage
+    And I follow "Course 1"
+    And I navigate to "Event monitoring" node in "My profile settings"
+    And I set the field "Select a course" to "Site"
+    And I follow "Subscribe to rule \"New rule site level\""
+    And I should see "Subscription successfully created"
+    And "#toolmonitorsubs_r0" "css_element" should exist
+    And I am on homepage
+    And I trigger cron
+    And I am on homepage
+    When I navigate to "Messages" node in "My profile"
+    And I follow "Do not reply to this email (1)"
+    Then I should see "The course was viewed."
 
   Scenario: Receiving notification on course level
     Given I log in as "teacher1"
-    And   I navigate to "Messaging" node in "My profile settings"
-    And   I click on "input[name^=tool_monitor_notification_loggedin]" "css_element"
-    And   I press "Update profile"
-    And   I am on homepage
-    And   I follow "Course 1"
-    And   I navigate to "Event monitoring" node in "My profile settings"
-    And   I set the field "Select a course" to "Course 1"
-    And   I set the field "Subscribe to rule \"New rule course level\"" to "All events"
-    And   I should see "Subscription successfully created"
-    And   "#toolmonitorsubs_r0" "css_element" should exist
-    And   I am on homepage
-    And   I follow "Course 1"
-    And   I trigger cron
-    And   I am on homepage
-    When  I navigate to "Messages" node in "My profile"
-    And   I follow "Do not reply to this email (1)"
-    Then  I should see "The course was viewed."
+    And I navigate to "Messaging" node in "My profile settings"
+    And I click on "input[name^=tool_monitor_notification_loggedin]" "css_element"
+    And I press "Update profile"
+    And I am on homepage
+    And I follow "Course 1"
+    And I navigate to "Event monitoring" node in "My profile settings"
+    And I set the field "Select a course" to "Course 1"
+    And I follow "Subscribe to rule \"New rule course level\""
+    And I should see "Subscription successfully created"
+    And "#toolmonitorsubs_r0" "css_element" should exist
+    And I am on homepage
+    And I follow "Course 1"
+    And I trigger cron
+    And I am on homepage
+    When I navigate to "Messages" node in "My profile"
+    And I follow "Do not reply to this email (1)"
+    Then I should see "The course was viewed."
 
   Scenario: Navigating via quick link to rules
     Given I log in as "admin"
-    And   I navigate to "Event monitoring" node in "My profile settings"
-    Then  I should see "You can manage rules from Event monitoring rules page."
-    And   I follow "Event monitoring rules"
-    And   I should see "Event monitor"
-    And   I should see "You can subscribe to rules from the Event monitoring page."
-    And   I log out
-    And   I log in as "teacher1"
-    And   I follow "Course 1"
-    And   I navigate to "Event monitoring" node in "My profile settings"
-    Then  I should not see "You can manage rules from Event monitoring rules page."
+    When I navigate to "Event monitoring" node in "My profile settings"
+    Then I should see "You can manage rules from the Event monitoring rules page."
+    And I follow "Event monitoring rules"
+    And I should see "You can subscribe to rules from the Event monitoring page."
+    And I log out
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I navigate to "Event monitoring" node in "My profile settings"
+    And I should see "You can manage rules from the Event monitoring rules page."
+    And I follow "Event monitoring rules"
+    And I should see "You can subscribe to rules from the Event monitoring page."
+    And I click on "//a[text()='Event monitoring']" "xpath_element"
+    And the field "courseid" matches value "Course 1"
+    And I set the field "courseid" to "Site"
+    And I should not see "You can manage rules from the Event monitoring rules page."
+    And I log out
+    And I log in as "teacher2"
+    And I follow "Course 1"
+    And I navigate to "Event monitoring" node in "My profile settings"
+    And I should not see "You can manage rules the from the Event monitoring rules page."
+
+  Scenario: No manage rules link when user does not have permission
+    Given I log in as "teacher1"
+    When I follow "Course 1"
+    And I navigate to "Event monitoring" node in "My profile settings"
+    Then I should see "You can manage rules from the Event monitoring rules page."
+    And I log out
+    And I log in as "teacher2"
+    And I follow "Course 1"
+    And I navigate to "Event monitoring" node in "My profile settings"
+    And I should not see "You can manage rules from the Event monitoring rules page."
+    And I follow "Home"
+    And I follow "Course 2"
+    And I navigate to "Event monitoring" node in "My profile settings"
+    And I should see "You can manage rules from the Event monitoring rules page."
+    And I log out
+    And I log in as "teacher1"
+    And I follow "Course 2"
+    And I navigate to "Event monitoring" node in "My profile settings"
+    And I should not see "You can manage rules from the Event monitoring rules page."
index 4e60183..74276d3 100644 (file)
@@ -35,6 +35,13 @@ require_once($CFG->dirroot . '/blog/lib.php');
  * Tests for event observers
  */
 class tool_monitor_eventobservers_testcase extends advanced_testcase {
+    /**
+     * Set up method.
+     */
+    public function setUp() {
+        // Enable monitor.
+        set_config('enablemonitor', 1, 'tool_monitor');
+    }
 
     /**
      * Test observer for course delete event.
@@ -266,6 +273,53 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
         $this->verify_processed_data($msgsink);
     }
 
+    /**
+     * Test that same events are not used twice to calculate conditions for a single subscription.
+     */
+    public function test_multiple_notification_not_sent() {
+        global $USER;
+
+        $this->resetAfterTest();
+        $this->setAdminUser();
+        $messagesink = $this->redirectMessages();
+
+        // Generate data.
+        $course = $this->getDataGenerator()->create_course();
+        $toolgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
+
+        $rulerecord = new stdClass();
+        $rulerecord->courseid = $course->id;
+        $rulerecord->eventname = '\mod_book\event\course_module_instance_list_viewed';
+        $rulerecord->frequency = 5;
+
+        $rule = $toolgenerator->create_rule($rulerecord);
+
+        $subrecord = new stdClass();
+        $subrecord->courseid = $course->id;
+        $subrecord->ruleid = $rule->id;
+        $subrecord->userid = $USER->id;
+        $toolgenerator->create_subscription($subrecord);
+
+        for ($i = 0; $i < 7; $i++) {
+            // Now let us trigger 7 instances of the event.
+            $event = \mod_book\event\course_module_instance_list_viewed::create_from_course($course);
+            $event->trigger();
+            sleep(1); // Add a second delay, to prevent time collisions.
+        }
+        $this->run_adhock_tasks();
+        $messages = $messagesink->get_messages();
+        $this->assertCount(1, $messages); // There should be only one message not 3.
+        for ($i = 0; $i < 3; $i++) {
+            // Now let us trigger 5 more instances of the event.
+            $event = \mod_book\event\course_module_instance_list_viewed::create_from_course($course);
+            $event->trigger();
+        }
+
+        $this->run_adhock_tasks();
+        $messages = $messagesink->get_messages();
+        $this->assertCount(2, $messages); // There should be two messages now.
+    }
+
     /**
      * Run adhoc tasks.
      */
index 730e18d..825fd5a 100644 (file)
@@ -34,6 +34,7 @@ class tool_monitor_events_testcase extends advanced_testcase {
      * Tests set up.
      */
     public function setUp() {
+        set_config('enablemonitor', 1, 'tool_monitor');
         $this->resetAfterTest();
     }
 
index 7e6403e..ca7f003 100644 (file)
@@ -36,6 +36,14 @@ defined('MOODLE_INTERNAL') || die();
  */
 class tool_monitor_generator_testcase extends advanced_testcase {
 
+    /**
+     * Set up method.
+     */
+    public function setUp() {
+        // Enable monitor.
+        set_config('enablemonitor', 1, 'tool_monitor');
+    }
+
     /**
      * Test create_rule data generator.
      */
index 1296791..a5173fa 100644 (file)
@@ -34,6 +34,14 @@ global $CFG;
  */
 class tool_monitor_rule_manager_testcase extends advanced_testcase {
 
+    /**
+     * Set up method.
+     */
+    public function setUp() {
+        // Enable monitor.
+        set_config('enablemonitor', 1, 'tool_monitor');
+    }
+
     /**
      * Test add_rule method.
      */
index 6737c1b..c9067ea 100644 (file)
@@ -36,6 +36,7 @@ class tool_monitor_task_clean_events_testcase extends advanced_testcase {
      * Test set up.
      */
     public function setUp() {
+        set_config('enablemonitor', 1, 'tool_monitor');
         $this->resetAfterTest(true);
     }
 
@@ -122,7 +123,7 @@ class tool_monitor_task_clean_events_testcase extends advanced_testcase {
         $task = new \tool_monitor\task\clean_events();
         $task->execute();
 
-        $events = $DB->get_records('tool_monitor_events');
+        $events = $DB->get_records('tool_monitor_events', array(), 'id');
         $this->assertEquals(4, count($events));
         $event1 = array_shift($events);
         $event2 = array_shift($events);
@@ -162,7 +163,7 @@ class tool_monitor_task_clean_events_testcase extends advanced_testcase {
         $task->execute();
 
         // We now should only have the chapter_viewed events.
-        $events = $DB->get_records('tool_monitor_events');
+        $events = $DB->get_records('tool_monitor_events', array(), 'id');
         $this->assertEquals(2, count($events));
         $event1 = array_shift($events);
         $event2 = array_shift($events);
index b8150b0..98589eb 100644 (file)
@@ -26,6 +26,6 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version   = 2014061901;       // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2014061900;       // Requires this Moodle version.
+$plugin->version   = 2014111000;       // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2014110400;       // Requires this Moodle version.
 $plugin->component = 'tool_monitor'; // Full name of the plugin (used for diagnostics).
index a861c9b..0758b92 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800; // Requires this Moodle version
+$plugin->version   = 2014111000; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400; // Requires this Moodle version
 $plugin->component = 'tool_multilangupgrade'; // Full name of the plugin (used for diagnostics)
 
index 4e54505..847bd6e 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800; // Requires this Moodle version
+$plugin->version   = 2014111000; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400; // Requires this Moodle version
 $plugin->component = 'tool_phpunit'; // Full name of the plugin (used for diagnostics)
 
index 45e4532..028eee4 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800; // Requires this Moodle version
+$plugin->version   = 2014111000; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400; // Requires this Moodle version
 $plugin->component = 'tool_profiling'; // Full name of the plugin (used for diagnostics)
index d25532e..7bbf3dc 100644 (file)
@@ -25,8 +25,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800; // Requires this Moodle version
+$plugin->version   = 2014111000; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400; // 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 1d00d81..379ac32 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;
-$plugin->requires  = 2014050800;
+$plugin->version   = 2014111000;
+$plugin->requires  = 2014110400;
 $plugin->component = 'tool_spamcleaner'; // Full name of the plugin (used for diagnostics)
 
index 443df77..1dcf9d5 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800; // Requires this Moodle version
+$plugin->version   = 2014111000; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400; // Requires this Moodle version
 $plugin->component = 'tool_task'; // Full name of the plugin (used for diagnostics)
 
index 8ba569f..7d34825 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;
-$plugin->requires  = 2014050800;
+$plugin->version   = 2014111000;
+$plugin->requires  = 2014110400;
 $plugin->component = 'tool_timezoneimport'; // Full name of the plugin (used for diagnostics)
 
index d643b39..97de3cf 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800; // Requires this Moodle version
+$plugin->version   = 2014111000; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400; // Requires this Moodle version
 $plugin->component = 'tool_unsuproles'; // Full name of the plugin (used for diagnostics)
 
index 47e8766..5d6d4c8 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;            // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2014050800;            // Requires this Moodle version.
+$plugin->version   = 2014111000;            // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2014110400;            // Requires this Moodle version.
 $plugin->component = 'tool_uploadcourse';   // Full name of the plugin (used for diagnostics).
index dfab35b..6ccf6d8 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800; // Requires this Moodle version
+$plugin->version   = 2014111000; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400; // Requires this Moodle version
 $plugin->component = 'tool_uploaduser'; // Full name of the plugin (used for diagnostics)
 
index 39a79f3..aef0b02 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800; // Requires this Moodle version
+$plugin->version   = 2014111000; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400; // Requires this Moodle version
 $plugin->component = 'tool_xmldb'; // Full name of the plugin (used for diagnostics)
 
index 5a1a6dc..874605c 100644 (file)
@@ -26,8 +26,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_cas';        // Full name of the plugin (used for diagnostics)
 
-$plugin->dependencies = array('auth_ldap' => 2014050800);
+$plugin->dependencies = array('auth_ldap' => 2014110400);
index 0b053e8..e83ace7 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_db';         // Full name of the plugin (used for diagnostics)
index 2f5cfd3..80a0de7 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_email';      // Full name of the plugin (used for diagnostics)
index 4867c7a..c389549 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_fc';         // Full name of the plugin (used for diagnostics)
index 6714111..7c629cd 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_imap';       // Full name of the plugin (used for diagnostics)
index 07b69a4..647835b 100644 (file)
@@ -79,7 +79,7 @@ $string['auth_ldap_passtype'] = 'Specify the format of new or changed passwords
 $string['auth_ldap_passtype_key'] = 'Password format';
 $string['auth_ldap_passwdexpire_settings'] = 'LDAP password expiration settings.';
 $string['auth_ldap_preventpassindb'] = 'Select yes to prevent passwords from being stored in Moodle\'s DB.';
-$string['auth_ldap_preventpassindb_key'] = 'Hide passwords';
+$string['auth_ldap_preventpassindb_key'] = 'Cache passwords';
 $string['auth_ldap_search_sub'] = 'Search users from subcontexts.';
 $string['auth_ldap_search_sub_key'] = 'Search subcontexts';
 $string['auth_ldap_server_settings'] = 'LDAP server settings';
index d1e4d10..2b10708 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_ldap';       // Full name of the plugin (used for diagnostics)
index 19e9ad0..9a5e1fb 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_manual';     // Full name of the plugin (used for diagnostics)
index 374fc84..2f6bbb2 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_mnet';       // Full name of the plugin (used for diagnostics)
index 9f9c048..a0bbd7a 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_nntp';       // Full name of the plugin (used for diagnostics)
index 303beea..2d1824a 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_nologin';    // Full name of the plugin (used for diagnostics)
index 14cf833..5e28e65 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_none';       // Full name of the plugin (used for diagnostics)
index 2d35dc9..ef06fde 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_pam';       // Full name of the plugin (used for diagnostics)
index 3a42901..25c1158 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_pop3';       // Full name of the plugin (used for diagnostics)
index a833dfe..2b309e6 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_radius';     // Full name of the plugin (used for diagnostics)
index 67c86c7..c609a58 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_shibboleth'; // Full name of the plugin (used for diagnostics)
index 8fa9510..77c1f4c 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'auth_webservice'; // Full name of the plugin (used for diagnostics)
index 7c2b906..b7596e4 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2014051200;
-$plugin->requires = 2014050800;
+$plugin->version = 2014111000;
+$plugin->requires = 2014110400;
 $plugin->component = 'availability_completion';
index 9d90ff3..7f785e1 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2014051200;
-$plugin->requires = 2014050800;
+$plugin->version = 2014111000;
+$plugin->requires = 2014110400;
 $plugin->component = 'availability_date';
index 87bf28e..ad2f3a3 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2014051200;
-$plugin->requires = 2014050800;
+$plugin->version = 2014111000;
+$plugin->requires = 2014110400;
 $plugin->component = 'availability_grade';
index 7261d7e..80706ed 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2014051200;
-$plugin->requires = 2014050800;
+$plugin->version = 2014111000;
+$plugin->requires = 2014110400;
 $plugin->component = 'availability_group';
index 4cc1638..1020022 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2014051200;
-$plugin->requires = 2014050800;
+$plugin->version = 2014111000;
+$plugin->requires = 2014110400;
 $plugin->component = 'availability_grouping';
index 2786078..dabf49e 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2014051200;
-$plugin->requires = 2014050800;
+$plugin->version = 2014111000;
+$plugin->requires = 2014110400;
 $plugin->component = 'availability_profile';
index 0973f47..c4b906d 100644 (file)
Binary files a/availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form-debug.js and b/availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form-debug.js differ
index f0ab241..6251004 100644 (file)
Binary files a/availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form-min.js and b/availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form-min.js differ
index 0973f47..c4b906d 100644 (file)
Binary files a/availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form.js and b/availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form.js differ
index afc486e..aa01d6a 100644 (file)
@@ -72,6 +72,9 @@ M.availability_profile.form.getNode = function(json) {
     if (json.op !== undefined &&
             node.one('select[name=op] > option[value=' + json.op + ']')) {
         node.one('select[name=op]').set('value', json.op);
+        if (json.op === 'isempty' || json.op === 'isnotempty') {
+            node.one('input[name=value]').set('disabled', true);
+        }
     }
     if (json.v !== undefined) {
         node.one('input').set('value', json.v);
index 7b56b05..08f66c8 100644 (file)
@@ -126,7 +126,7 @@ abstract class backup implements checksumable {
     const OPERATION_RESTORE ='restore';// We are performing one restore
 
     // Version (to keep CFG->backup_version (and release) updated automatically)
-    const VERSION = 2014051200;
+    const VERSION = 2014111000;
     const RELEASE = '2.8';
 }
 
index e288fe2..f60bf39 100644 (file)
@@ -81,6 +81,14 @@ $output = $PAGE->get_renderer('core', 'badges');
 // Roles that can award this badge.
 $acceptedroles = array_keys($badge->criteria[BADGE_CRITERIA_TYPE_MANUAL]->params);
 
+if (empty($acceptedroles)) {
+    echo $OUTPUT->header();
+    $return = html_writer::link(new moodle_url('recipients.php', array('id' => $badge->id)), $strrecipients);
+    echo $OUTPUT->notification(get_string('notacceptedrole', 'badges', $return));
+    echo $OUTPUT->footer();
+    die();
+}
+
 if (count($acceptedroles) > 1) {
     // If there is more than one role that can award a badge, prompt user to make a selection.
     // If it is an admin, include all accepted roles, otherwise only the ones that current user has in this context.
index 616ba97..fd0ad2e 100644 (file)
@@ -150,6 +150,11 @@ class award_criteria_manual extends award_criteria {
     public function review($userid, $filtered = false) {
         global $DB;
 
+        // Roles should always have a parameter.
+        if (empty($this->params)) {
+            return false;
+        }
+
         // Users were already filtered by criteria completion.
         if ($filtered) {
             return true;
index 7494d19..3b90b31 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'block_activity_modules'; // Full name of the plugin (used for diagnostics)
index 7682aa4..bb3ea54 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'block_admin_bookmarks'; // Full name of the plugin (used for diagnostics)
index dd5ffab..d20af66 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014062600;        // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires  = 2014050800;        // Requires this Moodle version.
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2014110400;        // Requires this Moodle version.
 $plugin->component = 'block_badges';
index c1f2b8e..0c8e5e2 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'block_blog_menu'; // Full name of the plugin (used for diagnostics)
index 9520d13..7179180 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'block_blog_recent'; // Full name of the plugin (used for diagnostics)
index d1519fb..c9c49b7 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'block_blog_tags'; // Full name of the plugin (used for diagnostics)
index 2b169f1..6c1475f 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014062600;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'block_calendar_month'; // Full name of the plugin (used for diagnostics)
index 2113bc9..e04a6f2 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014062600;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'block_calendar_upcoming'; // Full name of the plugin (used for diagnostics)
index 4b68fe4..4ddd58c 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'block_comments'; // Full name of the plugin (used for diagnostics)
index c824432..e1139fc 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'block_community'; // Full name of the plugin (used for diagnostics)
index d98e209..2012c0e 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version      = 2014051200; // The current plugin version (Date: YYYYMMDDXX).
-$plugin->requires     = 2014050800; // Requires this Moodle version.
+$plugin->version      = 2014111000; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires     = 2014110400; // Requires this Moodle version.
 $plugin->component    = 'block_completionstatus';
-$plugin->dependencies = array('report_completion' => 2014050800);
+$plugin->dependencies = array('report_completion' => 2014110400);
index 279389a..53e65ea 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2014050800;        // Requires this Moodle version
+$plugin->version   = 2014111000;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2014110400;        // Requires this Moodle version
 $plugin->component = 'block_course_list'; // Full name of the plugin (used for diagnostics)