Compare commits

..

1435 Commits

Author SHA1 Message Date
Eloy Lafuente (stronk7) 68b1fd2c55 Moodle release 2.8.3 2015-01-30 12:35:40 +01:00
AMOS bot e5cfbd85d8 Automatically generated installer lang files 2015-01-30 00:04:12 +08:00
Eloy Lafuente (stronk7) 6e1308b948 weekly release 2.8.2+ 2015-01-29 10:28:18 +01:00
Eloy Lafuente (stronk7) c889f1b592 Merge branch 'install_28_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_28_STABLE 2015-01-29 10:28:13 +01:00
Andrew Nicols 4d3403d5a7 Merge branch 'MDL-36877_28' of https://github.com/jmvedrine/moodle into MOODLE_28_STABLE 2015-01-29 09:10:04 +08:00
Jean-Michel Vedrine fc0613cb0c MDL-36877 mod_lesson: Fix while MDL-38578 is not solved 2015-01-28 21:25:55 +01:00
Simon Coggins 9b59baccb1 MDL-48855 dev: Fix ctags command to handle extra whitespace 2015-01-28 12:42:15 +01:00
Marina Glancy d08b45781f MDL-48978 user: fixed regression from MDL-37704 2015-01-28 11:58:48 +01:00
David Monllao 43439ea041 Merge branch 'MDL-48914-28' of git://github.com/rtcn2/moodle into MOODLE_28_STABLE 2015-01-28 17:44:49 +08:00
Andrew Nicols 2ceba911aa MDL-48542 user_menu: Handle invalid strings better 2015-01-28 15:38:56 +08:00
Damyon Wiese a72f2cca7f MDL-48980 Security: Always clean the result from min_get_slash_argument
The result from this function is used in send_file calls and if unclean
(windows dir separators, or .. path components) it could expose sensitive
files (e.g. .php files). Now we always clean the result from this function
even if it means double cleaning.

I also fixed the unit test for this function and added a new test for this cleaning.

I also updated the comments to point to get_file_argument as the full version of
min_get_slash_argument.
2015-01-28 14:38:11 +08:00
Andrew Nicols 2f12e58ce4 Merge branch 'MDL-41026-28-fixes' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2015-01-28 13:59:15 +08:00
Andrew Nicols e86817b76c MDL-41026 webservices: Correct unit tests 2015-01-28 13:58:46 +08:00
Andrew Nicols f6ab2b1ccf MDL-48542 user_menu: Increment index for all menu items
The invalid type was not causing the idx to incremented, thus missing off
the final divider.
2015-01-28 12:10:45 +08:00
Andrew Nicols ba43cfbd21 MDL-48542 user_menu: Improve user menu tests
Add additional test cases, and actually test that the output is roughly
what we expect.
2015-01-28 12:10:44 +08:00
Andrew Nicols cd1ea20389 Merge branch 'MDL-48542-28' of git://github.com/jethac/moodle into MOODLE_28_STABLE 2015-01-28 12:09:46 +08:00
Andrew Nicols 412aa0210b Merge branch 'MDL-41026-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2015-01-28 10:06:28 +08:00
Eloy Lafuente (stronk7) 7e67e4d619 Merge branch 'MDL-48685-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2015-01-28 00:46:29 +01:00
Eloy Lafuente (stronk7) 510ffce704 Merge branch 'MDL-48660-m28' of https://github.com/sammarshallou/moodle into MOODLE_28_STABLE 2015-01-27 21:13:45 +01:00
AMOS bot ad93802610 Automatically generated installer lang files 2015-01-28 00:04:23 +08:00
Eloy Lafuente (stronk7) 8d4ef0df4b Merge branch 'MDL-40285_m28' of git://github.com/markn86/moodle into MOODLE_28_STABLE 2015-01-27 12:21:11 +01:00
Eloy Lafuente (stronk7) 01f200ad39 Merge branch 'MDL-48383-28' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2015-01-27 12:01:24 +01:00
sam marshall b749aaa935 MDL-48660 Availability: filter_user_list() should respect 'view hidden'
Updated filter_user_list and get_user_list_sql to account for
the viewhiddenactivities and viewhiddensections capabilities.
2015-01-27 10:59:53 +00:00
Mark Nelson 041dd2902d MDL-40285 mod_assign: added extra group submissions behat scenario
Thanks a lot to Jody Steele for providing the basis for the scenario.
2015-01-27 00:35:31 -08:00
Mark Nelson 790eb7ee05 MDL-40285 mod_assign: show details for all default group members 2015-01-27 00:35:31 -08:00
Andrew Nicols 97f243a916 Merge branch 'MDL-47871_m28' of https://github.com/markn86/moodle into MOODLE_28_STABLE 2015-01-27 13:13:57 +08:00
Jerome Mouneyrac 27acee5df2 MDL-41026 webservices: use correct param format in external apis 2015-01-27 10:08:25 +05:30
Mark Nelson aee1045f7e MDL-47871 tool_monitor: allow teachers to duplicate site rules 2015-01-26 19:36:27 -08:00
Andrew Nicols d110033f81 Merge branch 'MDL-48491-28' of git://github.com/zbdd/moodle into MOODLE_28_STABLE 2015-01-27 10:57:57 +08:00
Andrew Nicols eeaf95494f MDL-48685 core_useragent: Correct IE 5.0 issues 2015-01-27 08:36:28 +08:00
Andrew Nicols 483bdb5c24 MDL-48685 tests: Add testing for supports_json_contenttype 2015-01-27 08:36:28 +08:00
Andrew Nicols 54d3ed0357 MDL-48685 tests: Add additional User Agents
* Firefox 33; Mac OS X 10.10
* Chrome 39; Mac OS X
* Safari; iPhone 6 Plus; iOS 8.1; Build 12B411
* Opera 12.15 (Build 1748); Mac OS X
2015-01-27 08:36:28 +08:00
Andrew Nicols 89cb4f9f35 MDL-48685 tests: Rewrite useragent tests 2015-01-27 08:36:27 +08:00
Eloy Lafuente (stronk7) 0c6add5bf9 Merge branch 'MDL-48916_28' of https://github.com/wesleysitu/moodle into MOODLE_28_STABLE 2015-01-27 01:09:35 +01:00
Eloy Lafuente (stronk7) f3a8098268 Merge branch 'MDL-48921-28-2nd' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2015-01-27 01:02:46 +01:00
Eloy Lafuente (stronk7) c3e2b05d40 Merge branch 'wip-MDL-48325-28' of git://github.com/abgreeve/moodle into MOODLE_28_STABLE 2015-01-27 00:25:57 +01:00
Eloy Lafuente (stronk7) 7458e60445 Merge branch 'MDL-48720-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2015-01-26 19:11:34 +01:00
Eloy Lafuente (stronk7) bf986b9e45 Merge branch 'MDL-35765-28' of git://github.com/merrill-oakland/moodle into MOODLE_28_STABLE 2015-01-26 17:32:25 +01:00
Eloy Lafuente (stronk7) e534402886 Merge branch 'MDL-36877_28' of git://github.com/jmvedrine/moodle into MOODLE_28_STABLE 2015-01-26 16:04:37 +01:00
Eloy Lafuente (stronk7) 22896c10ba Merge branch 'MDL-48711-28' of git://github.com/merrill-oakland/moodle into MOODLE_28_STABLE 2015-01-26 11:14:42 +01:00
Eloy Lafuente (stronk7) 58ad8a2321 Merge branch 'MDL-43421-28' of git://github.com/mr-russ/moodle into MOODLE_28_STABLE 2015-01-26 10:24:59 +01:00
Jean-Michel Vedrine cbc028dbae MDL-36877 Lesson: final page not displayed if show gradebook set to no 2015-01-25 19:44:19 +01:00
Rod Norfor fc811dd468 MDL-48914 admin: check maxuserperpage in existingroleholders->find_users 2015-01-23 15:59:34 +00:00
Andrew Nicols c06aa292b1 weekly release 2.8.2+ 2015-01-23 08:28:04 +08:00
Andrew Nicols e52a55c407 Merge branch 'install_28_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_28_STABLE 2015-01-23 08:27:57 +08:00
Dan Poltawski 0b331a73c6 Merge branch 'MDL-48949_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2015-01-22 17:53:23 +00:00
Tim Hunt a52b56b719 MDL-48949 mod_lti: tidy mod/lti/upgrade.txt 2015-01-22 17:29:39 +00:00
Adrian Greeve a6acd5ff4f MDL-48325 mod_data: Export to portfolio button uses capability.
The Export to portfolio button now checks the mod/data:exportownentry
capability to see if the export button should be shown.
2015-01-22 14:59:33 +08:00
Zachary Durber 3a57e2a532 MDL-48491 enrolments: Paypal enrolments send email as support user. 2015-01-22 13:47:45 +08:00
Andrew Nicols a1d1479ff1 Revert "Merge branch 'wip-mdl-48624-m28' of https://github.com/rajeshtaneja/moodle into MOODLE_28_STABLE"
This reverts commit 48549b6515, reversing
changes made to 87802c924f.
2015-01-22 12:16:27 +08:00
Frederic Massart 737a5f7fe4 MDL-48383 task: Indicate when a task will not run if plugin is disabled 2015-01-22 11:08:10 +08:00
Eloy Lafuente (stronk7) a51d8d8560 Merge branch 'MDL-48823_28' of git://github.com/dmonllao/moodle into MOODLE_28_STABLE 2015-01-21 12:32:28 +01:00
Frederic Massart b71598cf81 MDL-48921 admin: Keep the search string in the URL after form submission 2015-01-21 15:50:51 +08:00
Andrew Nicols 9a0284c657 MDL-48720 mod_forum: Tidy up whitespace to comply with coding style 2015-01-21 12:42:42 +08:00
Andrew Nicols 9a220d7976 MDL-48720 mod_forum: Only copy discussion preferences when moving posts
Rather than adding discussion preferences to a user based upon their
subscription to the source forum, only respect any actively selected
preference. That is to say that:
* if a user has opted into a discussion and following a move would be
  unsubscribed, re-subscribe them;
* if a user has opted out of a discussion and following a move would be
  subscribed once more, unsubscribe them; and
* if a user has not made an active choice, follow the discussion preference
  for the target forum.
2015-01-21 12:42:41 +08:00
David Monllao b550538ce3 MDL-48823 admin: Just one admin tree reload after settings changes 2015-01-21 10:42:17 +08:00
Andrew Nicols 89b5e52ba8 Merge branch 'wip-mdl-48761-m28' of https://github.com/rajeshtaneja/moodle into MOODLE_28_STABLE 2015-01-21 10:22:01 +08:00
Rajesh Taneja e947035dc7 MDL-48761 behat: Added new step for debugging scenarios 2015-01-21 10:17:39 +08:00
Wesley Situ 0c8e82aade MDL-48916 atto_undo: Clarify text for "Undo/Redo" 2015-01-20 16:21:02 -08:00
Eloy Lafuente (stronk7) af04908d0d Merge branch 'wip-MDL-48847-m28' of git://github.com/marinaglancy/moodle into MOODLE_28_STABLE 2015-01-21 00:28:38 +01:00
Eloy Lafuente (stronk7) 4c8fae005e Merge branch 'MDL-48830-m28' of https://github.com/micaherne/moodle into MOODLE_28_STABLE 2015-01-21 00:04:14 +01:00
Eric Merrill 2c1f64c0da MDL-48711 gradebook: Properly compute extra-redit status for cat grades
When seeing if a grade item for a category is computed for extra-credit
status, we need to use the *grandparent* of the item.
2015-01-20 16:06:02 -05:00
Eric Merrill e8a979d4bb MDL-35765 availability: Use category total full names 2015-01-20 15:38:07 -05:00
Eloy Lafuente (stronk7) c41fe79c85 Merge branch 'MDL-48873_moodle28' of https://github.com/StudiUM/moodle into MOODLE_28_STABLE 2015-01-20 19:27:22 +01:00
Eloy Lafuente (stronk7) 189dee55d4 Merge branch 'MDL-48813_m28' of git://github.com/sbourget/moodle into MOODLE_28_STABLE 2015-01-20 19:20:39 +01:00
Eloy Lafuente (stronk7) 7f2083fadf Merge branch 'wip-mdl-48837-m28' of https://github.com/rajeshtaneja/moodle into MOODLE_28_STABLE 2015-01-20 18:52:14 +01:00
Dan Poltawski f11c6059ea Merge branch 'MDL-48798-28' of https://github.com/vadimonus/moodle into MOODLE_28_STABLE 2015-01-20 17:50:24 +00:00
Eloy Lafuente (stronk7) 45b68d3cdd Merge branch 'MDL-48477_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2015-01-20 18:44:43 +01:00
Eloy Lafuente (stronk7) 38e8b26234 Merge branch 'MDL-48779-28' of https://github.com/vadimonus/moodle into MOODLE_28_STABLE 2015-01-20 18:41:21 +01:00
Eloy Lafuente (stronk7) dfe44858da Merge branch 'MDL-47792_28' of git://github.com/dmonllao/moodle into MOODLE_28_STABLE 2015-01-20 18:38:06 +01:00
Dan Poltawski 2f0f15c2e7 Merge branch 'wip-mdl-48831-m28' of https://github.com/rajeshtaneja/moodle into MOODLE_28_STABLE 2015-01-20 17:30:50 +00:00
Dan Poltawski f40423c766 Merge branch 'MDL-48829_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2015-01-20 17:07:54 +00:00
Eloy Lafuente (stronk7) 48549b6515 Merge branch 'wip-mdl-48624-m28' of https://github.com/rajeshtaneja/moodle into MOODLE_28_STABLE 2015-01-20 17:34:04 +01:00
Eloy Lafuente (stronk7) 87802c924f Merge branch 'MDL-47166-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2015-01-20 16:15:46 +01:00
David Monllao e31f7ac7b9 Merge branch 'MDL-48765-28' of git://github.com/gurgus/moodle into MOODLE_28_STABLE 2015-01-20 17:08:57 +08:00
David Monllao f3b0ba7c8f Merge branch 'MDL-48776-28' of git://github.com/gurgus/moodle into MOODLE_28_STABLE 2015-01-20 16:07:54 +08:00
Andrew Nicols 8b6412b1f7 Merge branch 'MDL-42172-28' of https://github.com/vadimonus/moodle into MOODLE_28_STABLE 2015-01-20 15:43:15 +08:00
Patrik Granlöv f9d5676c10 MDL-35486 outputlib: Fix typos in comments
Just a copy-past text error in two comments.
2015-01-20 14:03:34 +08:00
Andrew Nicols af152f8d1e Merge branch 'MDL-44560-28' of git://github.com/xow/moodle into MOODLE_28_STABLE 2015-01-20 13:26:02 +08:00
Andrew Nicols 628109a9cf Merge branch 'MDL-38277_m28' of https://github.com/sbourget/moodle into MOODLE_28_STABLE 2015-01-20 12:44:40 +08:00
Aaron Barnes 6aca5dd717 MDL-47792 javascript: Fix for cropped headers and horizontal align 2015-01-20 11:40:19 +08:00
Jean-Michel Vedrine 7e11f1b2f5 MDL-48596 mod_lesson: editing interface won't expand to full screen 2015-01-20 11:05:04 +08:00
Andrew Nicols 054221331a Merge branch 'MDL-48741_28' of git://github.com/stronk7/moodle into MOODLE_28_STABLE 2015-01-20 09:56:47 +08:00
Jetha Chan 2dfdb127b6 MDL-48542 user_menu: add proper divider support
Added divider support to the user menu; hardened the custom user menu against invalid input.
2015-01-19 23:58:40 +08:00
Jetha Chan 3014b8cb60 MDL-48542 user_menu: add custom user menu unit test 2015-01-19 23:58:40 +08:00
Dave Cooper 5c703c83fd MDL-48776 core_message: Fixed userid check.
Thanks to Oleg Demeshev for providing the patch.
2015-01-19 15:21:03 +08:00
Andrew Nicols 24b7c67edb Merge branch 'MDL-46976-28' of git://github.com/danpoltawski/moodle into MOODLE_28_STABLE 2015-01-19 12:19:16 +08:00
Andrew Nicols 695503a7f1 Merge branch 'MDL-48073-28' of git://github.com/gurgus/moodle into MOODLE_28_STABLE 2015-01-19 11:37:22 +08:00
Nivedita Setru 542db0f6fe MDL-48073 enrol: Fixed group filter resetting erroneously. 2015-01-19 11:26:07 +08:00
Rajesh Taneja 33211ce256 MDL-48624 behat: Added extended timeout in workshop step
i_allocate_submissions_in_workshop_as step sometimes
fails because of server speed. Added extended timout
ensuring they wait enough before failing.
2015-01-19 10:18:49 +08:00
Rajesh Taneja 20a095345b MDL-48624 behat: Added extended timeout to ensure step pass
following_should_download_between_and_bytes step sometimes
fails because of server speed. Added extended timout
ensuring they wait enough before failing.
Also, not calling force download while running behat site
2015-01-19 10:18:42 +08:00
Jean-Michel Vedrine 175b34c45d MDL-43386 Lesson: Grade essay student response formatting not correct 2015-01-18 20:41:51 +01:00
Vadim Dvorovenko a8808ad7ba MDL-42172 Authentification: Adding alternate names to "Lock user fields"
Adding alternate name fields (firstnamephonetic, lastnamephonetic,
middlename, alternatename) to "Lock user fields" for all
authentification plugins. This is needed to sync alternate name fields
with external data sources and to lock them for editing.
2015-01-17 23:10:09 +07:00
Vadim Dvorovenko 5e25d5630b MDL-48798 Statistics: Adding lang string for user activity.
New lang string for 'Activity' (meaning count of user actions) in stats
reports to disambiguate it with 'Activity' (meaning course module).

AMOS BEGIN
 CPY [activity,core],[useractivity,core]
AMOS END
2015-01-17 23:04:11 +07:00
AMOS bot 778e83669f Automatically generated installer lang files 2015-01-18 00:03:58 +08:00
Vadim Dvorovenko ad2c1a2156 MDL-48779 MNet: multibyte substr in certificate generation
Using core_text::substr instead of substr for trimming certificate
data. Is needed for sites with long unicode sitename to prevent
breaking line between unicode pair.
2015-01-17 23:01:47 +07:00
Gilles-Philippe Leblanc 6dc66f5a48 MDL-48873 auth_cas: Wrong redirection with bad multiauth login 2015-01-16 11:55:08 -05:00
Ray Bon 54ea4bee35 MDL-48837 phpunit: Restore system default timezone 2015-01-16 12:47:13 +08:00
John Okely 3bb4665841 MDL-44560 glossary: Fix pagination on glossary category view
Credit to Sebastian B for this fix
2015-01-16 11:12:42 +08:00
Rajesh Taneja f0724d200a MDL-48831 behat: Added behat test for label activity
Thanks to Neill Magill, for providing test feature.
2015-01-16 10:39:05 +08:00
Rajesh Taneja a43bbc7838 MDL-48831 behat: Fixed activity show hide for label
Labels are not links and have dimmed_text class
So updated find query for show/hide activity check
2015-01-16 10:39:05 +08:00
Eloy Lafuente (stronk7) 7e5840e4b6 MDL-48741 behat: add new moodle_list formatter (rerun compatible) 2015-01-16 03:14:56 +01:00
Stephen Bourget 521af16fe5 MDL-38277 Lesson: Fix strings on activity report 2015-01-15 12:56:25 -05:00
Tim Hunt 27fc1831e8 MDL-48829 quiz nav: add a data attr to buttons giving the page
This way, if you need to know which page each button goes to in
JavaScript, you can find out.
2015-01-15 10:18:39 +00:00
Tim Hunt 142c67ce07 MDL-48477 questions: no delete icon for only top-level category
The back end code already threw an exception if you clicked the icon,
so you could not delete the category, but we should not have shown the
icon in the first place.

Thanks to Pramith Dayananda for working out the fix for this issue. I am
just committing it.
2015-01-15 10:18:31 +00:00
Michael Aherne 5b469142de MDL-48830 accesslib: Add sort field to query 2015-01-15 10:17:08 +00:00
Andrew Nicols 2ea6a2b161 weekly release 2.8.2+ 2015-01-15 14:20:20 +08:00
Andrew Nicols 273eec1330 Merge branch 'install_28_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_28_STABLE 2015-01-15 14:20:09 +08:00
Charles Fulton 147d54f9ff MDL-48765 enrol: do not use a non-breaking space as a separator 2015-01-15 11:21:19 +08:00
Marina Glancy a9bac80cac MDL-48847 groups: fixed incorrect user count 2015-01-15 11:12:25 +08:00
Dan Poltawski 1dcf25db8b MDL-46976 user: trim whitespace from input email address
Don't complain about invalid email address, we are a computer, we
love the jobs users hate.

ref: https://www.youtube.com/watch?v=5tquSbZEP-g
2015-01-14 17:14:50 +00:00
AMOS bot e6b538e2a2 Automatically generated installer lang files 2015-01-15 00:04:03 +08:00
Dan Poltawski c5203c98bf Merge branch 'MDL-14730_28' of git://github.com/jmvedrine/moodle into MOODLE_28_STABLE 2015-01-14 10:27:46 +00:00
John Okely 27cf863db5 MDL-47761 enrol: Show more detail for self-enrolment errors
Thanks to Mirko Otto for the solution
2015-01-14 00:30:15 +01:00
Eloy Lafuente (stronk7) 76da38fd5c Merge branch 'M28_MDL-48574_workflow_state_updated_batch_single' of https://github.com/Dave-B/moodle into MOODLE_28_STABLE 2015-01-14 00:14:45 +01:00
Eloy Lafuente (stronk7) 87caaf87e3 Merge branch 'MDL-41166-28' of git://github.com/danpoltawski/moodle into MOODLE_28_STABLE 2015-01-13 23:42:25 +01:00
Eloy Lafuente (stronk7) bb1aaadf48 Merge branch 'MDL-48753_m28' of git://github.com/markn86/moodle into MOODLE_28_STABLE 2015-01-13 15:48:42 +01:00
Dan Poltawski 601c8883c8 Merge branch 'MDL-36824_m28' of https://github.com/sbourget/moodle into MOODLE_28_STABLE 2015-01-13 13:15:06 +00:00
Dan Poltawski f049403ed1 Merge branch 'MDL-39103-28' of git://github.com/xow/moodle into MOODLE_28_STABLE
Conflicts:
	mod/lesson/lib.php
2015-01-13 12:54:53 +00:00
Dan Poltawski 7e6be7ba1f Merge branch 'MDL-45784-28' of git://github.com/xow/moodle into MOODLE_28_STABLE 2015-01-13 12:34:45 +00:00
Dan Poltawski 1d0a5a5be9 Merge branch 'MDL-48474_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2015-01-13 11:47:53 +00:00
Stephen Bourget 871a756d06 MDL-48750 Lesson: Behat test for lesson attempt info
behat test provided by Jean-Michel Vedrine
2015-01-13 10:59:53 +00:00
Stephen Bourget 6c5b72e889 MDL-48750 Lesson: Fix attempt info displayed by course overview block 2015-01-13 10:59:29 +00:00
Dan Poltawski 7f3932c840 Merge branch 'MDL-40326_28' of git://github.com/jmvedrine/moodle into MOODLE_28_STABLE 2015-01-13 10:08:18 +00:00
Dan Poltawski 4ed7ae68a0 Merge branch 'MDL-48510-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2015-01-13 08:29:11 +00:00
Ankit Agarwal 64a15b04b1 MDL-48510 inbound: use 0 expiration for private files handler 2015-01-13 09:29:13 +05:30
Ankit Agarwal 8293f6c86f MDL-48510 inbound: Support disabling of expiration changes in UI 2015-01-13 09:26:20 +05:30
Ankit Agarwal 5a8291753a MDL-48510 inbound: Use correct value of expiration 2015-01-13 09:26:20 +05:30
Andrew Nicols 312163cd26 Merge branch 'MDL-43898-28' of git://github.com/danpoltawski/moodle into MOODLE_28_STABLE 2015-01-13 10:28:12 +08:00
Stephen Bourget 282c5c2b7d MDL-48813 Lesson: Remove unused GROUPMEMBERSONLY 2015-01-12 16:38:47 -05:00
Eloy Lafuente (stronk7) de12ede98e MDL-35155 database: better sql_substr() impl. for mssql/sqlsrv + unit tests
MSSQL's substring() implementation is somehow silly/strict and unable to
perform implicit casts to integer both for the start and length parameters.

This hits Moodle badly because of another problems (MDL-23997) we decided
to cast to string all bound placeholders long ago.

So this commit just enforces the cast of the start and length parameters to
integer. And includes unit tests for using placeholders on all positions in
the sql_substr() method.
2015-01-12 18:26:38 +01:00
Eloy Lafuente (stronk7) 817f22818b Merge branch 'MDL-35155-28' of git://github.com/danpoltawski/moodle into MOODLE_28_STABLE 2015-01-12 18:26:29 +01:00
AMOS bot 2aaab5b275 Automatically generated installer lang files 2015-01-13 00:04:00 +08:00
AMOS bot 3571d0a90e Automatically generated installer lang files 2015-01-13 00:04:00 +08:00
Dan Poltawski d926178366 Merge branch 'MDL-31774_28' of git://github.com/jmvedrine/moodle into MOODLE_28_STABLE 2015-01-12 14:37:51 +00:00
Dan Poltawski 1cc4ac0486 Merge branch 'MDL-47935-28' of git://github.com/gurgus/moodle into MOODLE_28_STABLE 2015-01-12 12:59:39 +00:00
Dan Poltawski f7ae8d3b11 Merge branch 'MDL-44907-28' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2015-01-12 11:30:32 +00:00
Andrew Nicols 595b56d28d Merge branch 'MDL-46671-28' of https://github.com/pjking07/moodle into MOODLE_28_STABLE 2015-01-12 13:57:10 +08:00
Andrew Nicols 55f84c72b4 Merge branch 'MDL-47425-28' of git://github.com/zbdd/moodle into MOODLE_28_STABLE 2015-01-12 13:44:26 +08:00
Sam Hemelryk 2dcc434f67 MDL-48753 badges: converted func to named params
Converted the SQL params within badges_get_user_badges to
named params.
Unit tests added for this function at the same time.
UI covered by behat already.
2015-01-11 20:12:29 -08:00
Andrew Nicols 80eec75b85 Merge branch 'MDL-38142-28' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2015-01-12 11:56:30 +08:00
Andrew Nicols 270c4a7fa3 Merge branch 'MDL-47692_m28' of git://github.com/markn86/moodle into MOODLE_28_STABLE 2015-01-12 11:30:00 +08:00
Jean-Michel Vedrine db63d99dbf MDL-31774 mod_lesson: Wrong jumps in lessons with mutiple clusters 2015-01-10 18:41:00 +01:00
AMOS bot 362834051b Automatically generated installer lang files 2015-01-11 00:04:06 +08:00
Eloy Lafuente (stronk7) f2c730fecf Moodle release 2.8.2 2015-01-10 13:12:58 +01:00
Stephen Bourget 26879477ce MDL-36824 Lesson: Media File should be displayed as a block 2015-01-09 18:17:15 -05:00
David Balch aed75e9597 MDL-48574 assign: Test workflow_state_updated fired on batch and single. 2015-01-09 15:24:25 +00:00
Jean-Michel Vedrine 6d4858392b MDL-14730 mod_lesson: allow linking to pages inside a lesson 2015-01-09 11:39:40 +01:00
Dave Cooper 19f78c1c84 MDL-47935 Atto: Moved atto notification message position 2015-01-09 15:55:18 +08:00
Zachary Durber b79691baea MDL-47425 mod_assign: Allow sorting by state without submissions.
Special thanks to Antton Rodriguez for the suggested patch.
2015-01-09 14:49:45 +08:00
Frederic Massart fec61db075 MDL-38142 mod_forum: Allow viewing of student posts in hidden courses 2015-01-09 11:38:12 +08:00
Andrew Nicols dde9be79c3 MDL-47166 atto_indent: Swap Outdent and Indent 2015-01-09 09:21:59 +08:00
Tim Hunt c38eb4e6e6 MDL-48474 qtype_shortanswer: answers were not being trimmed.
This fix is based on Oleg Sychev's suggestion. Thanks.
2015-01-08 17:43:18 +00:00
AMOS bot 812779dfa2 Automatically generated installer lang files 2015-01-09 00:04:08 +08:00
Dan Poltawski ed46f0deb1 weekly release 2.8.1+ 2015-01-08 10:00:28 +00:00
Dan Poltawski 9c1f1cda90 Merge branch 'install_28_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_28_STABLE 2015-01-08 10:00:26 +00:00
Frederic Massart 2981fb45a0 MDL-44907 admin: Better styling of admin settings validation errors
Conflicts:
	theme/bootstrapbase/style/moodle.css
2015-01-08 16:23:34 +08:00
Dan Poltawski fa01f2b45a MDL-35155 dml: add unit test which exposes substr problem
Previously, when using parameters, substring broke on mssql.
2015-01-08 08:14:10 +00:00
Simon Coggins 48ddb7968f MDL-35155: Fix MSSQL bug in sql_substr() 2015-01-08 08:14:09 +00:00
John Okely fd648fd5f0 MDL-45784 lesson: Remove preview link for students viewing lesson
Credit to Pete Jones for the fix.
2015-01-08 13:28:48 +08:00
Eloy Lafuente (stronk7) b78438abc0 Merge branch 'MDL-37584-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2015-01-08 00:46:41 +01:00
Eloy Lafuente (stronk7) 19389fc511 Merge branch '37680-28' of git://github.com/samhemelryk/moodle into MOODLE_28_STABLE 2015-01-08 00:40:52 +01:00
Zachary Durber 63ed941a93 MDL-48546 filters: Split on all tags for multimedia filter check. 2015-01-07 18:56:49 +01:00
Eloy Lafuente (stronk7) 2d90c646be Merge branch 'MDL-48748-28-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_28_STABLE 2015-01-07 17:23:19 +01:00
AMOS bot 324dfc764c Automatically generated installer lang files 2015-01-08 00:03:59 +08:00
David Balch 0697df81aa MDL-48574 assign: Fire workflow_state_updated event on batch and single.
This change adds the workflow_state_updated event when changing workflow
state using the single grading page and the quick grading mechanisms.
Previously, it only fired for batch updates using
process_set_batch_marking_workflow_state().
2015-01-07 14:47:22 +00:00
Ankit Agarwal f517d1c20b MDL-48688: inbound: remove spaces from exception 2015-01-07 13:44:25 +08:00
Mark Nelson f7f477a65d MDL-46498 mod_assign: fixed failing behat test due to GS 2015-01-07 13:30:12 +08:00
Zachary Durber 01da07a42b MDL-48546 filters: ReDoS protection for multimedia links. 2015-01-07 12:28:22 +08:00
Andrew Nicols 5cb84b5ba4 Merge branch 'MDL-45930-28' of git://github.com/danpoltawski/moodle into MOODLE_28_STABLE 2015-01-07 12:08:16 +08:00
David Monllao fb270fd5de Merge branch 'MDL-48549_m28' of git://github.com/markn86/moodle into MOODLE_28_STABLE 2015-01-07 09:40:22 +08:00
David Monllao 2111c597ac Merge branch 'wip-MDL-48523-28' of git://github.com/abgreeve/moodle into MOODLE_28_STABLE 2015-01-07 09:21:53 +08:00
Eloy Lafuente (stronk7) cd663df1ad Merge branch 'MDL-32088-28' of git://github.com/danpoltawski/moodle into MOODLE_28_STABLE 2015-01-07 02:11:48 +01:00
David Monllao b68c14c98d Merge branch 'MDL-48697-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2015-01-07 09:07:13 +08:00
David Monllao 2fe7bf0585 Merge branch 'MDL-48688-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2015-01-07 08:48:05 +08:00
Mark Nelson 7cadfa8e86 MDL-47692 mod_quiz: added additional question_manually_graded trigger 2015-01-06 15:13:28 -08:00
Helen Foster 59ea75fd37 MDL-48748 lang: Merge English strings from the en_fix language pack 2015-01-06 21:57:11 +01:00
Jean-Michel Vedrine c80603ddc4 MDL-48034 mod_lesson: grade capability missing RISK_XSS 2015-01-06 12:52:21 +00:00
Dan Poltawski 8b7e92206c Merge branch 'MDL-44393-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2015-01-06 12:21:04 +00:00
Dan Poltawski 787d05f3d3 Merge branch 'MDL-46015_28' of git://github.com/jmvedrine/moodle into MOODLE_28_STABLE 2015-01-06 12:04:09 +00:00
Dan Poltawski acb579245a Merge branch 'MDL-48372-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2015-01-06 11:24:30 +00:00
Dan Poltawski f704c30f8a Merge branch 'MDL-48442-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2015-01-06 11:19:33 +00:00
Dan Poltawski e54fe38e2b Merge branch 'MDL-48534_m28' of https://github.com/markn86/moodle into MOODLE_28_STABLE 2015-01-06 11:11:43 +00:00
Dan Poltawski 921e63c880 Merge branch 'MDL-48655-28' of git://github.com/merrill-oakland/moodle into MOODLE_28_STABLE 2015-01-06 11:09:43 +00:00
Simey Lameze 693918c30e MDL-47964 auth_shibboleth: Fix DOS on the shibboleth logout 2015-01-06 11:05:25 +00:00
Marco Rougeth 6bb02c27d5 MDL-48640 report_configchanges: Remove duplicated code 2015-01-06 15:52:57 +08:00
John Okely 502a403b43 MDL-39103 lesson: Fix lesson administration block
Credit to Joseph Rézeau for the fix
2015-01-06 14:53:29 +08:00
David Monllao 63a07d3a21 Merge branch 'MDL-38222_28' of git://github.com/jmvedrine/moodle into MOODLE_28_STABLE 2015-01-06 12:27:20 +08:00
Andrew Nicols ac1c429ebd Merge branch 'MDL-48701-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2015-01-06 12:06:01 +08:00
Andrew Nicols 42f3477091 Merge branch 'MDL-48704-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2015-01-06 11:59:15 +08:00
Andrew Nicols 9b2438597a Merge branch 'MDL-48707_28' of git://github.com/jmvedrine/moodle into MOODLE_28_STABLE 2015-01-06 11:51:14 +08:00
Andrew Nicols 7a5e665072 Merge branch '28067-28' of git://github.com/samhemelryk/moodle into MOODLE_28_STABLE 2015-01-06 10:53:50 +08:00
Andrew Nicols 2c908ec30b MDL-20304 lesson: Uncomment tests following MDL-48631 2015-01-06 10:37:42 +08:00
Andrew Nicols f595e3cbae Merge branch 'MDL-20304-28' of git://github.com/danpoltawski/moodle into MOODLE_28_STABLE 2015-01-06 10:37:37 +08:00
David Monllao 1bacd164c3 Merge branch 'MDL-35078-28' of git://github.com/danpoltawski/moodle into MOODLE_28_STABLE 2015-01-06 10:34:50 +08:00
David Monllao 76dd58bb4f Merge branch 'MDL-48631_28' of git://github.com/jmvedrine/moodle into MOODLE_28_STABLE 2015-01-06 09:09:24 +08:00
Dan Poltawski 8e293f17cf Merge branch 'MDL-48441_profile_guest_28' of https://github.com/andyjdavis/moodle into MOODLE_28_STABLE 2015-01-05 18:30:25 +00:00
Dan Poltawski 4afd408b55 Merge branch 'MDL-46498_m28' of https://github.com/markn86/moodle into MOODLE_28_STABLE 2015-01-05 17:48:39 +00:00
Andrew Nicols 8d9a3b3b62 MDL-48104 mod_assign: Strip out use of eval() for string parsing
I've also replaced other  occurrences of M.str with the correct use of
M.util.get_string() instead.
2015-01-05 17:21:14 +00:00
Dan Poltawski 0aee829cd3 Merge branch 'MDL-43679-28' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2015-01-05 15:49:26 +00:00
Simey Lameze 88929ca824 MDL-48017 core_calendar: add context validation to get_calendar_events 2015-01-05 14:13:48 +00:00
Andrew Nicols 5770e51478 MDL-48106 mod_glossary: Add missing sesskey checks 2015-01-05 13:38:01 +00:00
David Monllao e72516ccde MDL-48329 core_message: Checking that messaging system is enabled 2015-01-05 13:14:03 +00:00
Simey Lameze 38ca8793b6 MDL-48368 course: fix xss on course request pending page 2015-01-05 12:58:53 +00:00
Jetha Chan faf0cd9098 MDL-47920 mod_lti: add capability checks, http headers 2015-01-05 12:50:18 +00:00
Andrew Nicols f7714bb67b Merge branch 'MDL-42519_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2015-01-05 16:18:13 +08:00
Andrew Nicols 764247be6b Merge branch 'MDL-48582-28' of git://github.com/merrill-oakland/moodle into MOODLE_28_STABLE 2015-01-05 15:27:44 +08:00
Andrew Nicols 289ac435d1 Merge branch 'MDL-48644_restoreLegacyLogs28' of https://github.com/moodlerooms/moodle into MOODLE_28_STABLE 2015-01-05 14:32:28 +08:00
Andrew Nicols dcfe7694d4 Merge branch 'MDL-46183-28' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2015-01-05 13:58:12 +08:00
Andrew Nicols 34d16a7737 Merge branch 'wip-MDL-40097-28' of git://github.com/abgreeve/moodle into MOODLE_28_STABLE 2015-01-05 13:41:28 +08:00
Andrew Nicols 863ffc884f Merge branch 'MDL-48700-28' of git://github.com/merrill-oakland/moodle into MOODLE_28_STABLE 2015-01-05 13:31:42 +08:00
Aaron Barnes f8bebe363d MDL-40097 completion: Apply robust role detection to samesite restores. 2015-01-05 10:34:49 +08:00
Adrian Greeve 45151248c4 MDL-40097 completion: Update of code to meet guidlines. 2015-01-05 10:34:38 +08:00
Aaron Barnes 39ed46b158 MDL-40097 completion: Make restoring grade criteria more robust 2015-01-05 10:34:27 +08:00
Russell Smith 6e8d598cff MDL-43421 logging: Ignore race condition in access update. 2015-01-03 20:42:09 +11:00
PJ King 39afb9e4b3 MDL-46671 availability: DEBUG when course_module does not exist.
There was a fatal error when calendar event linked to non-extant activities.

Now, instead of throwing an exception when a course_module does not exist, is_user_visible() will print a debug statement.
2015-01-02 10:32:30 -05:00
Ankit Agarwal de290738c9 MDL-48442 tasks: Make sure first run is as per schedule 2015-01-02 14:55:22 +05:30
Ankit Agarwal 004ec71505 MDL-44393 tasks: Add unit tests for cron field validations 2015-01-02 11:03:03 +05:30
Ankit Agarwal 045b5235f2 MDL-44393 tasks: Validate cron fields 2015-01-02 11:03:03 +05:30
Ankit Agarwal 2d066f19ba MDL-48372 mod_data: Add http to urls without it during import 2015-01-02 10:47:34 +05:30
Frederic Massart b4e7dcaa8a MDL-43679 core: Handle Meridio user agents with MS Word 2015-01-02 11:24:00 +08:00
Frederic Massart e618263437 MDL-43679 core: Never use HTTP redirect when the user agent is MS Word 2015-01-02 11:24:00 +08:00
Paul Nicholls 04a2fc7427 MDL-43679 core_useragent: add test cases for MS Word
The new is_msword() check should always return false for regular browsers.
It should return true for known MS Word, but false for known MS Outlook.
2015-01-02 11:24:00 +08:00
Paul Nicholls 7ed6f826ad MDL-43679 core_useragent: add basic MS Word detection
Basic detection for MS Word's internal link checker.  This is not perfect,
as older versions use IE6/7 user agent string with no identifying marks,
and newer versions don't necessarily identify themselves as Word (just as
Office).  Version information is not reliably available, even when there
is sufficient other information to identify it as Word's link checker.
This is also based on a small sample of Word / OS version pairings, so
there may be some which are identifiable but not currently covered.
2015-01-02 11:23:59 +08:00
Jean-Michel Vedrine 986cc05789 MDL-40326 mod_lesson: progress bar is not reset by course reset 2015-01-01 13:22:28 +01:00
Lloyd Powell 7f15ca3eab MDL-43898 lesson: Fix for positioning of blocks on continue.php 2014-12-31 09:09:44 +00:00
Ankit Agarwal 07a06264dc MDL-37584 tasks: Use a senisible maximum time window for the task 2014-12-31 14:03:09 +05:30
Dan Poltawski 15252c8803 MDL-41166 assign: don't display portfolio button when no permissions
Thanks to Katja Krüger for the basis of the patch.
2014-12-30 16:48:44 +00:00
Dan Poltawski 73416d1b9a MDL-45930 filemanager: Don't display filesize when unknown
Thanks to Marina Glancy for the patch

Conflicts:
	theme/bootstrapbase/style/moodle.css
2014-12-30 14:24:29 +00:00
Vishal Raheja f70a6d3245 MDL-32088 user: Correct the Moodle docs link
This patch links the moodle docs link to user profile Moodle doc when
the user sees the user profile for a particular course. The page is set
to course view type to load course specific blocks. So, we use
set_docs_path to change the Moodle docs link instead of changing the
pagetype.
2014-12-30 13:47:41 +00:00
Mark Nielsen 2d18472382 MDL-48644 backup tool_log: Fixing coding style
Wrap long function definition
to next line.
2014-12-29 11:26:37 -08:00
Dan Poltawski 04babc675b MDL-43198 folder: respect ignorefilesizelimits permission
Thanks to Miryan Salas for the patch.
2014-12-29 12:13:37 +00:00
Jean-Michel Vedrine eeae1784c6 MDL-48631 mod_lesson: tables 'grade' item have incorrect precision
Conflicts:
	mod/lesson/db/upgrade.php
	mod/lesson/version.php
2014-12-29 10:54:01 +01:00
Ankit Agarwal 112e95f6b4 MDL-48704 inbound: Fix notices in pickup task 2014-12-29 14:40:41 +05:30
Eugene Venter 3e061bf55d MDL-46015 lesson: Optimise report - use recordsets
Change-Id: I61f3ed30c6dbd8f88d1dfb1adfe2fc291853e0e1
2014-12-28 11:09:38 +01:00
AMOS bot deb3e69e37 Automatically generated installer lang files 2014-12-28 00:04:15 +08:00
Mark Nelson 0532dad71b MDL-48549 mod_assign: added upgrade to clean the tables 2014-12-26 18:55:53 -08:00
Mark Nelson a0102708b6 MDL-48549 mod_assign: delete entries from the flags/mapping tables 2014-12-26 18:54:51 -08:00
Mark Nelson a12afaf7dd MDL-46498 mod_assign: added behat tests 2014-12-26 17:49:58 -08:00
Mark Nelson 57897685c0 MDL-46498 mod_assign: display correct grading status 2014-12-26 17:17:25 -08:00
Jean-Michel Vedrine 216655b54d MDL-48707 mod_lesson: ignore plugins question types during import 2014-12-26 08:29:33 +01:00
Jean-Michel Vedrine 899d7c1bb2 MDL-38222 mod_lesson: Error in Lesson Cluster for Unseen Questions 2014-12-25 21:19:33 +01:00
Dan Poltawski 440085ecf8 weekly release 2.8.1+ 2014-12-24 13:22:29 +00:00
Dan Poltawski a5e8cb4aea Merge branch 'install_28_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_28_STABLE 2014-12-24 13:22:26 +00:00
Mark Nelson d8d912443f MDL-48534 mod_assign: display correct workflow state and marker 2014-12-23 22:58:32 -08:00
Ankit Agarwal e3effa63fd MDL-48701 inbound: Use correct method in invalid email handler
Invalid email handler doesn't allow alteration in validate sender config. Make sure this is reflected in the UI as well
2014-12-24 10:20:43 +05:30
Ankit Agarwal 870e0fb822 MDL-48697 libraries: Use proper path for core_completion 2014-12-24 08:10:36 +05:30
Eric Merrill 4e8c1f2681 MDL-48700 gradereport_history: Don't limit downloads by pages. 2014-12-23 16:11:23 -05:00
Dan Poltawski 12f025749a MDL-20304 lesson: add behat test for practice lessons 2014-12-23 17:05:36 +00:00
Dan Poltawski 29006301ed MDL-20304 lesson: do not display gradebook link when in practice mode
Practice mode means the grades do not go to the gradebook, so do not
display the gradebook link at the end of the lesson
2014-12-23 17:05:35 +00:00
Atanas Atanasov c1eb2c3ddf MDL-20304 lesson: do not send practice lesson grades to gradebook 2014-12-23 17:05:35 +00:00
Dan Poltawski 7783fcd76f Merge branch 'MDL-48213-m28-master' of https://github.com/dthies/moodle into MOODLE_28_STABLE 2014-12-23 16:13:14 +00:00
AMOS bot 4dbc9b18b4 Automatically generated installer lang files 2014-12-24 00:04:15 +08:00
Eloy Lafuente (stronk7) e9b36ac653 MDL-45699 behat: Don't use behat/lib.php functions in core.
behat/lib.php script should not be usually included, neither any of its functions
used within mooodle code at all. It's for exclusive use of behat and
moodle setup.php. For places requiring a different/special behavior
needing to check if are being run  as part of behat tests, use:
    if (defined('BEHAT_SITE_RUNNING')) { ...
2014-12-23 13:28:46 +01:00
Dan Poltawski db5fb4ce76 Revert "Merge branch 'MDL-48534_m28' of https://github.com/markn86/moodle into MOODLE_28_STABLE"
This reverts commit 7c4b6a84dd, reversing
changes made to 03d3dfbfc5.
2014-12-23 10:46:30 +00:00
Dan Poltawski 008e28478d Revert "Merge branch 'MDL-48591_m28' of https://github.com/jrchamp/moodle into MOODLE_28_STABLE"
This reverts commit a6af290ea4, reversing
changes made to 267ac74ef3.
2014-12-23 10:43:37 +00:00
Frederic Massart 510fafed8a MDL-46183 theme_more: Background is seen through the activity chooser 2014-12-23 17:16:58 +08:00
Eloy Lafuente (stronk7) 7e911af220 Merge branch '45699-28' of git://github.com/samhemelryk/moodle into MOODLE_28_STABLE
Conflicts:
	cache/upgrade.txt
2014-12-23 02:04:12 +01:00
Eloy Lafuente (stronk7) d25a7f21a3 MDL-48568 cache: make tests aware of default application store
When an alternative cache configuration is used, aka:

define('TEST_CACHE_USING_ALT_CACHE_CONFIG_PATH', true);
$CFG->altcacheconfigpath = '/tmp/xxxxx.php';

the get_expected_application_cache_store() method was not able of
retroffiting the default application store being used.

This commit just implements that functionality so, when
executing unit tests using alternative configuration, assertions
looking for that will pass without a problem.
2014-12-23 02:03:06 +01:00
Eloy Lafuente (stronk7) 3c6dac879f Merge branch '48568-28' of git://github.com/samhemelryk/moodle into MOODLE_28_STABLE 2014-12-23 02:02:47 +01:00
Eloy Lafuente (stronk7) d81cdaaf13 Merge branch 'MDL-48593-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2014-12-22 21:51:20 +01:00
Tim Hunt 4a057abc11 MDL-42519 qformat_xml: Correctly export questions containing ]]> 2014-12-22 19:47:10 +00:00
Eloy Lafuente (stronk7) d102926592 Merge branch 'MDL-48639_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2014-12-22 19:09:52 +01:00
Dan Poltawski 05ea4e002d Merge branch 'MDL28-48421' of https://github.com/timpricecatalyst/moodle into MOODLE_28_STABLE 2014-12-22 17:01:06 +00:00
Dan Poltawski c6c1b3596f MDL-48638 course: update unit test to new message 2014-12-22 16:25:47 +00:00
Dan Poltawski bf671547ab Merge branch 'MDL-48638-28' of git://github.com/merrill-oakland/moodle into MOODLE_28_STABLE 2014-12-22 15:25:35 +00:00
Dan Poltawski 1b78a209a0 Merge branch 'MDL-48643-28' of git://github.com/merrill-oakland/moodle into MOODLE_28_STABLE 2014-12-22 15:22:33 +00:00
Dan Poltawski 42486cac98 MDL-43004 blog: fix upgrade.txt typo 2014-12-22 15:14:05 +00:00
Dan Poltawski 9b27f063c8 Merge branch 'MDL-48062-m28-master' of https://github.com/dthies/moodle into MOODLE_28_STABLE 2014-12-22 14:36:42 +00:00
Brian Barnes 83a36ad89b MDL-48423 messages: improved accessibility of contacts list 2014-12-22 14:16:31 +00:00
Dan Poltawski 61040870bb Merge branch 'MDL-48224-28' of git://github.com/xow/moodle into MOODLE_28_STABLE 2014-12-22 14:04:23 +00:00
Josh Marshall 999f4ac9fa MDL-48445 report_loguser: Include logstore parameter for pagination 2014-12-22 13:56:59 +00:00
Dan Poltawski 7c4b6a84dd Merge branch 'MDL-48534_m28' of https://github.com/markn86/moodle into MOODLE_28_STABLE 2014-12-22 13:52:41 +00:00
Dan Poltawski 03d3dfbfc5 Merge branch 'm28_MDL-48483' of https://github.com/totara/moodle into MOODLE_28_STABLE 2014-12-22 13:44:29 +00:00
Dan Poltawski cf447b8c0f Merge branch 'MDL-48580-28' of git://github.com/lameze/moodle into MOODLE_28_STABLE 2014-12-22 13:41:13 +00:00
Dan Poltawski a6af290ea4 Merge branch 'MDL-48591_m28' of https://github.com/jrchamp/moodle into MOODLE_28_STABLE 2014-12-22 13:38:06 +00:00
Dan Poltawski 267ac74ef3 MDL-48653 behat: fix incorrect phpdoc 2014-12-22 13:13:51 +00:00
Dan Poltawski a4b06536fb Merge branch 'MDL-48653_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2014-12-22 13:10:46 +00:00
Dan Poltawski 6303e895e4 Merge branch 'MDL-48088-28' of git://github.com/jethac/moodle into MOODLE_28_STABLE 2014-12-22 13:07:46 +00:00
Dan Poltawski db6bbcbc16 Merge branch 'MDL-48666_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2014-12-22 12:09:18 +00:00
Andrew Davis 55f1261257 MDL-48441 core_user: profile.php, view.php now handle guests the same 2014-12-22 09:56:04 +01:00
Ankit Agarwal 6227a1f3e7 MDL-48688 inbound: Fix incorrect class names 2014-12-22 13:50:43 +05:30
Adrian Greeve 0f60d011dc MDL-48523 gradebook: Fix for incorrect behat steps. 2014-12-22 15:05:18 +08:00
Eric Merrill 21fa68e52f MDL-48643 Javascript: Create modals hidden, then show, to prevent scroll
Modal dialogs need to be created with visible: false and then call
.show() on it to make it visible. This prevents the page from jumping to
the top.
2014-12-21 22:58:59 -05:00
AMOS bot 085df3ed05 Automatically generated installer lang files 2014-12-22 00:04:10 +08:00
AMOS bot 4645ff7ddc Automatically generated installer lang files 2014-12-20 00:04:14 +08:00
Tim Hunt 2a6e070cd4 MDL-48666 quiz: let JS to get a Qs slot number on the summary page 2014-12-19 14:39:40 +00:00
Tim Hunt 3e8e8641b3 MDL-48639 behat upload: support absolute paths & better errors
In a custom step I needed to be able to upload a file I had previously
saved to $CFG->dataroot/temp, but that was not possible.

Also, the failure was not at all obvious. I have made it throw a clear
exception if the file you are trying to upload does not exist.
2014-12-19 12:00:17 +00:00
Brian Barnes 6f1e7d2db2 MDL-48483 admin: attached color label to input control 2014-12-19 14:19:39 +13:00
Daniel Thies 330ac09e0d MDL-48062 atto_image: Add image select on single click 2014-12-18 18:29:46 -06:00
Daniel Thies 37e2d30c84 MDL-48213 filter_algebra,filter_tex: Require sesskey for debug actions 2014-12-18 16:40:46 -06:00
Tim Price 4105c6c329 MDL-48421 navigation: accounting for potential regression 2014-12-19 09:18:35 +11:00
Tim Price 07bd586492 MDL-48421 navigation: correctly load child categories if parent is loaded 2014-12-19 09:18:35 +11:00
Eric Merrill ada9b1ed77 MDL-48655 gradebook: Don't treat a scale with a gradepass of 0 as passed 2014-12-18 16:18:28 -05:00
Mark Nielsen 60c034fe27 MDL-48644 backup: Preserve log IP and time during restore 2014-12-18 11:36:47 -08:00
Tim Hunt 8850deb74d MDL-48653 behat: Steps to click and dismiss a dialogue.
We already had the corresponding
    I click on "Home" "link" confirming the dialogue
but I needed the opposite
    I click on "Home" "link" dismissing the dialogue
2014-12-18 19:31:27 +00:00
Eric Merrill 4077b738a0 MDL-48582 gradereport_grader: Adding back grade pass/fail CSS 2014-12-18 14:13:21 -05:00
Eric Merrill 0ab4c9d029 MDL-48638 database SQL: Fix typo in exception constructor 2014-12-18 13:34:20 -05:00
jrchamp 3925c74634 MDL-48591 calendar: Mini Cal Display DST Events 2014-12-18 09:28:09 -05:00
Dan Poltawski 2c48f2ed4c weekly release 2.8.1+ 2014-12-18 11:25:09 +00:00
Dan Poltawski 88d1474104 Merge branch 'install_28_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_28_STABLE 2014-12-18 11:25:07 +00:00
Mark Nelson b621820ea1 MDL-45324 mod_assign: always notify students when requested 2014-12-18 14:09:23 +08:00
Mark Nelson a2a8653aa2 MDL-48534 mod_assign: display correct workflow state and marker 2014-12-17 20:43:27 -08:00
David Monllao bfa4e840d8 Merge branch 'MDL-48235-28-fixes' of git://github.com/xow/moodle into MOODLE_28_STABLE 2014-12-18 12:37:01 +08:00
Zachary Durber dda30b1906 MDL-47442 mod_assign: Notify student when quick-grading grade 2014-12-18 12:15:41 +08:00
Marina Glancy c0070d8d88 MDL-48452 Completion: js correction to behat test 2014-12-18 11:28:31 +08:00
John Okely 582ab13d73 MDL-48235 mod_assign: Fix grade of 0 not showing on feedback page in oracle 2014-12-18 10:25:39 +08:00
Wiktor Wandachowicz f826599632 MDL-35078 enrol: allow times to be chose on bulk enrolment forms
Previously only a date was available, which made it ambigious whether
the the enrolment was inclusive of the date. Now we use a time to make
it less ambigious.

This matches changes done in other forms in MDL-41173.
2014-12-17 12:02:30 +00:00
Dan Poltawski cf7167cbae Merge branch 'MDL-44829_MOODLE_28_STABLE' of git://github.com/BenKelada/moodle into MOODLE_28_STABLE 2014-12-17 10:11:41 +00:00
BKelada 999f2b3aea MDL-44829 libraries: Update android user agent detection 2014-12-17 16:37:03 +11:00
David Monllao 5ef46dad4b Merge branch 'MDL-48243_M28' of git://github.com/lazydaisy/moodle into MOODLE_28_STABLE 2014-12-17 11:49:15 +08:00
Andrew Nicols 724b6446d1 MDL-48593 messageinbound: Correct header retrieval from IMAP server
Header retrieval should only be performed on the base message, and not each
part of the message as is currently performed.

This came to light because Google changed their IMAP server such that, if
you inform the data query that you wish to retrieve the headerText for a
part which does not contain a MIME header, then no message is retrieved in
the search causing a general failure of the IMAP fetch.

In normal circumstances, headers should only be a part of the base message
part.
2014-12-17 09:35:38 +08:00
Dan Poltawski 535a794f90 Merge branch 'MDL-43462_landscape_pdf_28' of git://github.com/davosmith/moodle into MOODLE_28_STABLE 2014-12-16 19:20:23 +00:00
Dan Poltawski fa59a794f6 Merge branch 'MDL-42501-28' of git://github.com/lameze/moodle into MOODLE_28_STABLE 2014-12-16 19:18:03 +00:00
Eloy Lafuente (stronk7) f48a890017 Merge branch 'MDL-48452-m28' of https://github.com/sammarshallou/moodle into MOODLE_28_STABLE 2014-12-16 19:09:18 +01:00
sam marshall 78d8dc13c8 MDL-48452 Completion: Expected date doesn't save when form is locked
The completion fields are locked when a user has already completed the
task, to prevent you accidentally causing it to recalculate the data.

This lock doesn't apply to the expected date field, as this doesn't
affect user completion. However, changes to the field in this
situation were incorrectly not saved.
2014-12-16 17:31:36 +00:00
Dan Poltawski e42056413c Merge branch 'MDL-48587-28' of git://github.com/xow/moodle into MOODLE_28_STABLE 2014-12-16 17:05:04 +00:00
Eloy Lafuente (stronk7) e61ab464f3 Merge branch 'm28_MDL-48532' of https://github.com/totara/moodle into MOODLE_28_STABLE 2014-12-16 15:47:29 +01:00
Dan Poltawski f0066ff80c Merge branch 'MDL-46442-28' of git://github.com/zbdd/moodle into MOODLE_28_STABLE 2014-12-16 13:54:12 +00:00
Dan Poltawski 5ef5c6c1e2 Merge branch 'MDL-47610-28' of git://github.com/zbdd/moodle into MOODLE_28_STABLE 2014-12-16 13:00:02 +00:00
Davo Smith a4c72b69e8 MDL-43462 assignfeedback_editpdf: fix display of landscape PDFs
The size of the drawing canvas is now set from the size of the generated page image, with automatic
scrolling if it is too wide to display
Absolutely-positioned nodes (comments + stamps) are repositioned as the drawing canvas is scrolled
2014-12-16 12:01:42 +00:00
Dan Poltawski a95cd718f9 Merge branch 'MDL-46651-MOODLE_28_STABLE-restore-course-completion-duplicate-key' of https://github.com/Trii/moodle into MOODLE_28_STABLE 2014-12-16 11:58:47 +00:00
Zachary Durber df91b1d861 MDL-47694 mod_assign: Grades require a grade to show as graded
Special thanks to Howard Miller.
2014-12-16 11:20:09 +01:00
Frederic Massart f34fc42d9b MDL-48495 curl: Limit usage of curl to HTTP and HTTPS protocols 2014-12-16 10:08:47 +00:00
David Monllao 43c3b0ec7b Merge branch 'MDL-48318-28' of git://github.com/lameze/moodle into MOODLE_28_STABLE 2014-12-16 16:41:21 +08:00
Zachary Durber 2a841b12fd MDL-46442 mod_assign: Notify users when grades are changed 2014-12-16 14:49:53 +08:00
David Monllao 73c991dd3f Merge branch 'MDL-48547-28' of git://github.com/danpoltawski/moodle into MOODLE_28_STABLE 2014-12-16 14:13:54 +08:00
David Monllao ecc60ffeb7 Merge branch 'm28_MDL-48567' of git://github.com/totara/moodle into MOODLE_28_STABLE 2014-12-16 13:34:41 +08:00
Brian Barnes 83ef244a83 MDL-48286 core_files: Improved accessibility of file management 2014-12-16 13:26:30 +08:00
Simey Lameze f6c149226f MDL-48580 report_log: fix site errors dropdown
Thanks Renaat Debleu for pointing this bug and share a solution.
2014-12-16 12:39:17 +08:00
David Monllao c0c2921586 Merge branch 'wip-MDL-48569-m28' of git://github.com/marinaglancy/moodle into MOODLE_28_STABLE 2014-12-16 12:27:02 +08:00
David Monllao 2abcbc0251 Merge branch 'MDL-48164-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2014-12-16 12:03:35 +08:00
Andrew Nicols 270705c279 Merge branch 'MDL-46472_28' of git://github.com/dmonllao/moodle into MOODLE_28_STABLE 2014-12-16 10:39:56 +08:00
Andrew Nicols 26156e72d9 MDL-48164 messageinbound: Attempt to detect autoreplies
Any message which includes:
* Precedence: bulk
* X-Autoreply: !no
* X-Autoresponse: !no
* Auto-Submitted: !no

Will not be detected as a bulk message and therefore ignored.
2014-12-16 09:35:58 +08:00
Andrew Nicols 7a56557c45 MDL-48164 mod_forum: Add additional headers to prevent OOF replies
This adds the X-Auto-Response-Suppress header to outbound messages.
2014-12-16 09:35:58 +08:00
Zachary Durber 4c23fb82ab MDL-47610 gradebook: Show extra credit icon in grades column 2014-12-16 09:17:00 +08:00
Eloy Lafuente (stronk7) 30fbe29595 Merge branch 'MDL-47037-28' of git://github.com/jethac/moodle into MOODLE_28_STABLE 2014-12-16 01:42:39 +01:00
Eloy Lafuente (stronk7) 5e425cc89b Merge branch 'MDL-46491-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2014-12-16 00:36:18 +01:00
Eloy Lafuente (stronk7) b2a786539e Merge branch 'MDL-48556-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2014-12-15 17:54:04 +01:00
Dan Poltawski 744dc6e647 Merge branch 'MDL-38128_28' of https://github.com/dmonllao/moodle into MOODLE_28_STABLE 2014-12-15 16:10:17 +00:00
Dan Poltawski 0e956b0452 Merge branch 'MDL-45324_28' of git://github.com/jonof/moodle into MOODLE_28_STABLE 2014-12-15 14:59:37 +00:00
Dan Poltawski 82dd025984 Merge branch 'MDL-47176_MOODLE_28_STABLE' of https://github.com/crazyserver/moodle into MOODLE_28_STABLE 2014-12-15 14:14:24 +00:00
Dan Poltawski b2e9074f3c Merge branch 'MDL-48169-28' of git://github.com/jethac/moodle into MOODLE_28_STABLE 2014-12-15 12:32:13 +00:00
Dan Poltawski 73ed5ce9fb Merge branch 'MDL-47475-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2014-12-15 12:21:11 +00:00
Joseph Rezeau cd16f43ba1 MDL-36673 mod_lesson: slideshow mode not working 2014-12-15 11:55:34 +00:00
David Monllao 49b881c876 Merge branch 'MDL-48235-assign-reopen-until-pass-28_STABLE' of git://github.com/mpetrowi/moodle into MOODLE_28_STABLE 2014-12-15 17:33:09 +08:00
John Okely ef19d61d4d MDL-48587 core: Fix error in getremoteaddr for unsupported php versions 2014-12-15 16:56:44 +08:00
Simey Lameze a54229b629 MDL-42501 course: add help icon on delete gradebook options 2014-12-15 16:23:11 +08:00
David Monllao 373fd13876 Merge branch 'wip-MDL-48347-28' of git://github.com/abgreeve/moodle into MOODLE_28_STABLE 2014-12-15 13:45:22 +08:00
Jetha Chan 244c69709e MDL-48088 calendar: normalize DTEND, add romance standard time
Thanks to Cedric Mortiers (cmortiers@stjohns.be) for providing the patch.
2014-12-15 12:10:29 +08:00
Andrew Nicols 675564277d MDL-47475 mod_assign: Copy files to other group members for editpdf 2014-12-15 08:50:48 +08:00
AMOS bot 3e7b053221 Automatically generated installer lang files 2014-12-13 00:03:57 +08:00
Pau Ferrer Ocaña abcec0fe9a MDL-47176 qtype_match: Avoid sql_compare to solve problems with Oracle 2014-12-12 16:04:24 +01:00
David Monllao fa0a765c20 MDL-38128 mod_assign: Counts and groups unit tests 2014-12-12 15:07:57 +08:00
David Monllao 5ad9e84664 MDL-46472 theme: Removing standard as an uninstallable theme 2014-12-12 13:33:46 +08:00
David Monllao 79a143130b MDL-38128 mod_assign: Fixing count teams and submissions with status
We should restrict the groups to the activity active group. Also
improving performance caching get_submission_group() results.
2014-12-12 13:28:14 +08:00
David Monllao 08b7d0bacc MDL-38128 mod_assign: Adding group selector to grading summary page
Thanks to Pau Ferrer Ocaña and Avi Levy for
their work on this issue.
2014-12-12 13:28:14 +08:00
Andrew Nicols b1a381ffcf MDL-48224 cron: Buffer SMTP connections around tasks 2014-12-12 10:39:19 +08:00
Marina Glancy 3719994057 MDL-48569 profile: behat test for user full profile access 2014-12-12 10:29:22 +08:00
Marina Glancy be2641dc8c MDL-48569 profile: show link to full profile if anybody can see it 2014-12-12 10:29:22 +08:00
Daniel Thies 3c726433cc MDL-48213 filter_algebra: Allow cookies in debug script 2014-12-11 20:00:45 -06:00
Sam Hemelryk 78a4b45ffc MDL-28067 navigation: my private files in profile only 2014-12-12 13:48:10 +13:00
Sam Hemelryk 3900f28e28 MDL-37680 repositories: added blocks to manage page 2014-12-12 13:37:01 +13:00
Joshua Johnston 48d0e75068 MDL-46651 Backup: Handle duplicate course completions during restore
Cron can cause duplicate completion records if triggered during a long
running restore process. If this is the case, replace the new record
with the record from the backup file
2014-12-11 15:58:00 -05:00
Sam Hemelryk c7a0fb64a0 MDL-48568 cache: stores now determine testing
Cache stores are now responsible for deciding if they are suitable
for use as the primary cache store during unit and acceptance tests

Changes are as follows:
* New method: cache_store::ready_to_be_used_for_testing
* Core cache store have been updated to override this method as
  required.
* MongoDB usesafe default changed to true to match actual default
  behaviour.
2014-12-12 09:34:25 +13:00
Dan Poltawski 8542d1875f weekly release 2.8.1+ 2014-12-11 09:55:19 +00:00
Dan Poltawski 087fd13442 Merge branch 'install_28_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_28_STABLE 2014-12-11 09:55:17 +00:00
Ankit Agarwal dd96737556 MDL-48556 backup: Use correct conditions before checking dir permissions 2014-12-11 14:34:10 +05:30
Andrew Nicols fde7c5f003 MDL-46491 course: Correct activity visibility on section show 2014-12-11 14:50:50 +08:00
Brian Barnes 4afb72f2de MDL-48567 core_badges: fixed display of badge created date 2014-12-11 14:50:33 +13:00
Avi Levy 23f751ee38 MDL-47037 grader_gradereport: Enable sort in other language then English 2014-12-11 07:39:42 +08:00
Frederic Massart 79fc19f5d7 MDL-48496 block_rss_client: Do not display curl error messages 2014-12-11 00:26:30 +01:00
AMOS bot f89ee726b4 Automatically generated installer lang files 2014-12-11 00:04:05 +08:00
Jonathon Fowler 9592c8e99c MDL-45324 assign: notify when workflow is Off, or if state is Released
When marking workflow is enabled, students will be notified only when
the workflow state transitions to 'Released'. Until that happens,
sending of messages will be held and the 'Notify students' grading
form option will be locked.

Additionally, the batch set marking workflow state facility gains
the 'Notify students' option.

Credit to Steve Upton and David Balch for the basis of this patch.
2014-12-10 22:28:20 +10:00
Sam Hemelryk 18453fec76 MDL-48430 customment: improved exception handling 2014-12-10 13:26:11 +01:00
pau.ferrer-ocana 4656c6ab53 MDL-48430 custom_menu: Malformed url in custom menu cannot break the platform 2014-12-10 13:26:11 +01:00
Dan Poltawski 36700a125e MDL-48547 thirdparty: remove incorrect entry 2014-12-09 23:12:36 +00:00
Dan Poltawski 80154bd033 Merge branch 'MDL-47323-enrol-plugin-backup-28_STABLE' of https://github.com/mpetrowi/moodle into MOODLE_28_STABLE 2014-12-09 22:30:01 +00:00
Dan Poltawski fd37fba94b Merge branch 'MDL-45430-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2014-12-09 21:22:18 +00:00
Sam Hemelryk f3586f59c4 Merge branch 'm28_MDL-48389' of https://github.com/totara/moodle into MOODLE_28_STABLE 2014-12-10 09:27:28 +13:00
Matt Petro 384f71b42c MDL-48235 mod_assign: Fix reopen until pass behavior 2014-12-09 10:45:23 -05:00
Eloy Lafuente (stronk7) 55f47d94f7 Merge branch 'MDL-31822_28' of https://github.com/dmonllao/moodle into MOODLE_28_STABLE 2014-12-09 16:12:24 +01:00
Dan Poltawski 673d38078c MDL-45679 mod_lesson: do not overqualify styles 2014-12-09 12:35:18 +00:00
Dan Poltawski e732d0d9ca Merge branch 'MDL-45679_28' of git://github.com/jmvedrine/moodle into MOODLE_28_STABLE 2014-12-09 12:34:20 +00:00
Dan Poltawski 28e38410c5 Merge branch 'MDL-48394-28' of git://github.com/jethac/moodle into MOODLE_28_STABLE 2014-12-09 10:53:38 +00:00
Dan Poltawski b16b0a61a4 Merge branch 'MDL-41846-28' of git://github.com/xow/moodle into MOODLE_28_STABLE 2014-12-09 10:35:10 +00:00
Sam Hemelryk 19f5623bf6 Merge branch 'wip_MDL-36499_M28' of git://github.com/gjb2048/moodle into MOODLE_28_STABLE 2014-12-09 16:57:11 +13:00
David Monllao 6967547062 MDL-31822 course: Formatting the section name 2014-12-09 11:52:30 +08:00
David Balch 519413892e MDL-31822 course: Show custom Section name on Front page. 2014-12-09 11:52:28 +08:00
Sam Hemelryk ceee447066 Merge branch 'wip-MDL-46486-m28' of git://github.com/marinaglancy/moodle into MOODLE_28_STABLE 2014-12-09 16:20:50 +13:00
Dan Poltawski 934c72979b MDL-40552 course: fixup unit test
Previously there was an assertion which was never used, now
we ensure to test the course themes functionality each time.
2014-12-09 16:14:23 +13:00
Sam Hemelryk bf42737370 Merge branch 'MDL-34437-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2014-12-09 15:58:56 +13:00
Sam Hemelryk 6966842459 Merge branch 'm28_MDL-46172' of https://github.com/greg-or/moodle-mod_assign into MOODLE_28_STABLE 2014-12-09 15:38:51 +13:00
Brian Barnes 9e06074bbe MDL-48389 forms: added page title to help text 2014-12-09 15:18:54 +13:00
Sam Hemelryk 41ea5affc4 Merge branch 'mdl48517_28' of https://github.com/tlevi/moodle into MOODLE_28_STABLE 2014-12-09 15:16:00 +13:00
Brian Barnes 8e0c012bbb MDL-48532 core_roles: Set correct heading on user roles page 2014-12-09 14:24:42 +13:00
Sam Hemelryk f071a177b0 Merge branch 'wip-MDL-48366-m28' of git://github.com/marinaglancy/moodle into MOODLE_28_STABLE 2014-12-09 13:43:38 +13:00
Sam Hemelryk e0b7f5492a Merge branch 'wip-mdl-48426-m28' of https://github.com/rajeshtaneja/moodle into MOODLE_28_STABLE 2014-12-09 12:13:36 +13:00
Sam Hemelryk 664d834cd1 MDL-45699 cache: renamed cache_config_phpunittest
Renamed cache_config_phpunittest to cache_config_testing
2014-12-09 10:51:20 +13:00
Sam Hemelryk faa3b4022f MDL-45699 cache: acceptance test improvements
We now use the unit test cache config class when running
acceptance tests so that the same defines are applicable there.
2014-12-09 10:51:17 +13:00
Eloy Lafuente (stronk7) 2d16c385d7 Merge branch 'MDL-48255-28' of git://github.com/lameze/moodle into MOODLE_28_STABLE 2014-12-08 19:15:12 +01:00
Eloy Lafuente (stronk7) b2959dbe9b Merge branch 'wip-MDL-48390-m28' of git://github.com/marinaglancy/moodle into MOODLE_28_STABLE 2014-12-08 18:49:09 +01:00
Dan Poltawski 5eb62533cd Merge branch 'MDL-48410_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2014-12-08 15:19:11 +00:00
Dan Poltawski 7e5947b986 Merge branch 'MDL-48373_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2014-12-08 15:15:41 +00:00
Dongsheng Cai 592f05a064 MDL-35983 Try to use real file name from EQUELLA 2014-12-08 14:24:09 +00:00
Dan Poltawski 4f2e496184 Merge branch 'MDL-47246_28' of git://github.com/dmonllao/moodle into MOODLE_28_STABLE 2014-12-08 13:34:03 +00:00
Dan Poltawski 793e74fef3 Merge branch 'MDL-14908-28' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2014-12-08 13:22:17 +00:00
Dan Poltawski bc11b6c138 MDL-48273 upgrade.txt version fix 2014-12-08 11:23:11 +00:00
Simey Lameze 788727862d MDL-48273 singleview: unit tests of load_user method 2014-12-08 11:22:38 +00:00
Simey Lameze adbbc7bd9e MDL-48273 singleview: add load_user method and other group validations
All credits goes to Damyon, thanks!
2014-12-08 11:22:38 +00:00
David Monllao 18450eab27 MDL-47246 mod_forum: Limit last post restriction to Q and A 2014-12-08 14:50:42 +08:00
Adrian Greeve aef3679316 MDL-48347 gradebook: More behat tests for single view. 2014-12-08 14:25:39 +08:00
Adrian Greeve fe32471819 MDL-48347 gradebook: Single view shows all grade items.
Manual grade items, course totals, and categroy totals
were not being displayed in the single view.
2014-12-08 14:24:39 +08:00
Jetha Chan c8316e2894 MDL-48169 themes: extra upgrade notes 2014-12-08 14:08:05 +08:00
Tony Levi 13dfdb0b5f MDL-48517: behat: Fix reset ordering reversal (MDL-48302) 2014-12-08 13:08:31 +10:30
Sam Hemelryk 36814aaec6 Merge branch 'MDL-37704-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2014-12-08 14:51:01 +13:00
Sam Hemelryk fef242fa65 Merge branch 'MDL-48058-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2014-12-08 13:58:24 +13:00
Gareth J Barnard 422d1c4625 MDL-36499 javascript: Expand height of the file element in embedded view. 2014-12-06 12:11:56 +00:00
Sam Hemelryk 0bd78bb334 MDL-45699 behat: can now use alt cache config 2014-12-06 12:09:49 +13:00
Gregory Faller 14cd37913c MDL-46172 mod/assign: Stop suspended users getting assign group emails 2014-12-06 08:29:08 +10:30
AMOS bot 3cca19d176 Automatically generated installer lang files 2014-12-06 00:03:54 +08:00
Jean-Michel Vedrine 468efb3171 MDL-45679 mod_lesson: Essay grading page has no mark for essay status 2014-12-05 15:04:58 +01:00
Tim Hunt b56a1518ad MDL-48410 behat, quiz: step for efficiently adding questions 2014-12-05 12:18:06 +00:00
Tim Hunt fed2e156e2 MDL-48373 behat, questions: convert tests to use the new steps
The new steps make it more efficient to create questions.

While making the changes, I took the opportunity to alter the tests to
follow Behat best practices, and only test one thing per scenario.
2014-12-05 12:18:05 +00:00
Tim Hunt 51a0c7cda7 MDL-48373 behat: generators for questions and categories 2014-12-05 12:18:05 +00:00
Tim Hunt 6292878644 MDL-48373 behat: find table columns better.
It was not possible to select the question bank 'Created by'
or 'Modified by' columns without this change.
2014-12-05 12:18:04 +00:00
Tim Hunt 201e19d7b6 MDL-48373 behat: new container selector for list items. 2014-12-05 12:18:04 +00:00
Eloy Lafuente (stronk7) ae2a9c0e66 weekly release 2.8.1+ 2014-12-05 11:05:30 +01:00
Eloy Lafuente (stronk7) dc2dd0cf72 Merge branch 'install_28_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_28_STABLE 2014-12-05 11:05:24 +01:00
Mark Nielsen 9c08bf4a6a MDL-48058 core_message: Default message outputs: Maintain Forced status 2014-12-05 14:43:57 +08:00
Ankit Agarwal ba1f0fbd39 MDL-45430 mod_book: Automate MDLQA-2428
This test verifies that an admin can generate and view all the book log entries
2014-12-05 09:26:32 +05:30
Rajesh Taneja e784850b5a MDL-48318 behat: Fixed JS Exception
M is not created on all pages, like cron and
Steps which check for exported data. So we need
to ensure M is defined, before using it in
behat_hooks::wait_for_pending_js()
2014-12-05 11:47:49 +08:00
John Okely 6ae671b784 MDL-41846 repository_url: Escape > < ' " in input url
And throw an exception when a url is incorrectly formatted
2014-12-05 11:23:42 +08:00
John Okely dbe6a4d188 MDL-41846 repository_url: Convert spaces to %20 in input url 2014-12-05 11:23:42 +08:00
Andrew Nicols 9427be40aa MDL-48309 mod_forum: Do not escape ampersands in plain text email 2014-12-04 12:59:08 +01:00
Eloy Lafuente (stronk7) acfbe693b2 Merge branch '48425-48374-28' of git://github.com/samhemelryk/moodle into MOODLE_28_STABLE 2014-12-04 12:59:07 +01:00
Eloy Lafuente (stronk7) 760c41ca09 MDL-48374 behat: Added missing $session 2014-12-04 12:59:07 +01:00
Rajesh Taneja 8d7e6ecfc8 MDL-48374 behat: Check flag before searching for span on page 2014-12-04 12:59:07 +01:00
Andrew Nicols aa39908cef MDL-48374 behat: improved page load detection
Check that page load detection was correctly started before testing that a
new page was loaded.

Without this, it is possible to have mutliple subsequent cases of:
    And a new page should have loaded since I started watching

Without first starting the page load detection.
2014-12-04 12:59:06 +01:00
Sam Hemelryk fba1d33198 Merge branch 'M28_MDL46116_IMSCP_container_items' of https://github.com/Dave-B/moodle into MOODLE_28_STABLE 2014-12-04 12:59:05 +01:00
Dan Poltawski f304fd2e6c Merge branch 'wip-mdl-48290-m28' of https://github.com/rajeshtaneja/moodle into MOODLE_28_STABLE 2014-12-04 12:59:05 +01:00
Dan Poltawski c538b47443 Merge branch 'MDL-34627_28' of https://github.com/dmonllao/moodle into MOODLE_28_STABLE 2014-12-04 12:59:04 +01:00
Eloy Lafuente (stronk7) ea2a48fb4a Merge branch '48374-28' of git://github.com/samhemelryk/moodle into MOODLE_28_STABLE 2014-12-04 12:59:04 +01:00
Sam Hemelryk f40124002b Merge branch 'MDL-40419-28-2nd' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2014-12-04 12:59:03 +01:00
Dan Poltawski 8f8ace5cdd Merge branch 'wip_MDL-48420_m28_lasttypo' of https://github.com/skodak/moodle into MOODLE_28_STABLE 2014-12-04 12:59:03 +01:00
Dan Poltawski efc6ed5e34 Merge branch 'MDL-48342_28' of git://github.com/jmvedrine/moodle into MOODLE_28_STABLE 2014-12-04 12:59:02 +01:00
Dan Poltawski 7a1b7e41d9 Merge branch 'MDL-40241_28' of https://github.com/dmonllao/moodle into MOODLE_28_STABLE 2014-12-04 12:59:02 +01:00
Marina Glancy f8b446f399 MDL-48366 blocks: always display custom regions in dropdown 2014-12-04 16:08:28 +08:00
AMOS bot 708cabea4d Automatically generated installer lang files 2014-12-04 00:04:36 +08:00
Matt Petro 9f4662b228 MDL-47323 backup: added enrol plugin backup structure and annotation 2014-12-02 22:03:43 -05:00
David Balch 186f4563cb MDL-46116 mod_imscp: Fix some jshint issues. 2014-12-02 11:17:40 +00:00
Simey Lameze 53e96ae4e1 MDL-48255 auth_ldap: make ldap cookie check more robust
Thanks to Baptiste Desprez for spotting this and provide a solution.
2014-12-02 15:32:33 +08:00
Ankit Agarwal 39ab2e44d0 MDL-37704 user_profile: Make sure description field can be locked
Thanks JD for the initial patch.
2014-12-02 09:43:55 +05:30
Rajesh Taneja 5367656ae8 MDL-48290 behat: Add log out after checking exported file
If the download step is the last in the scenario then we
can sometimes run into the situation where the download page
causes a http redirect but behat has already conducted its
reset (generating an error). By putting a logout step we avoid
behat doing the reset until we are off that page.
2014-12-02 09:39:27 +08:00
Sam Hemelryk 2fca03ec2a MDL-48425 course: management behat tests improved 2014-12-02 11:45:16 +13:00
Sam Hemelryk f2ebd53dba MDL-48374 behat: improved page load exceptions
The following improvements have been made to the page load watching:
* Improved the exceptions when a page load expectation fails.
* Added an exception if start watching happens twice without a page load.
* Improved the page load span and xpath to make it faster and less likely
  to interfer in the future.
2014-12-02 11:44:02 +13:00
Tim Hunt 886bc21b8b MDL-48374 behat: new steps for detecting page loads. 2014-12-02 08:58:11 +13:00
Mary Evans 5b1efbcab4 MDL-48243 theme_bootstrapbase: Fixed inconsistancy between LTR/RTL LESS 2014-12-01 17:32:46 +00:00
Didier Raboud 9dfc203245 MDL-34437 shibboleth: Correct the shibboleth wiki links. 2014-12-01 14:57:37 +05:30
Frederic Massart 278642a380 MDL-14908 user: Parents are not restricted when separated groups is used 2014-12-01 15:16:15 +08:00
David Monllao 1101fd22f2 MDL-40241 core_completion: Minor fixes to provided patch
Thanks to Aaron Barnes and Jon Sharp for working on this issue.
2014-12-01 15:01:14 +08:00
Marina Glancy db956269fe MDL-46486 coursecat: remove function forgotten in MDL-38147 2014-12-01 13:22:38 +08:00
Rajesh Taneja 1538a20679 MDL-48426 behat: soft-reset mink session before scenario 2014-12-01 12:40:18 +08:00
Rajesh Taneja 4eac169974 MDL-48426 behat: Wait for redirection after save
After saving wiki comment, page is redirected
Make sure to wait for redirection after save
to avoid random fails
2014-12-01 11:25:26 +08:00
Charles Fulton 5445d98144 MDL-34627 feedback: Convert default format value during restore 2014-12-01 10:58:38 +08:00
Aaron Barnes 258c0449b6 MDL-40241 blocks_completionstatus: Fix notices 2014-12-01 10:05:50 +08:00
Aaron Barnes 0a39d64927 MDL-40241 completion: Default roles unable to manually complete course
Thanks to Jon Sharp for authoring the original patch!
2014-12-01 10:05:48 +08:00
Sam Hemelryk c40f1f184f Merge branch 'wip-MDL-48377-m28' of git://github.com/marinaglancy/moodle into MOODLE_28_STABLE 2014-12-01 14:02:15 +13:00
Sam Hemelryk fc7ab00709 Merge branch 'MDL-48382_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2014-12-01 13:58:20 +13:00
Sam Hemelryk a76c20c20e Merge branch 'MDL-46618_m28' of git://github.com/kordan/moodle into MOODLE_28_STABLE 2014-12-01 11:59:36 +13:00
Sam Hemelryk 824c31e592 Merge branch 'MDL-14402-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2014-12-01 11:35:53 +13:00
Sam Hemelryk cba386b636 Merge branch 'MDL-48384-28' of git://github.com/danpoltawski/moodle into MOODLE_28_STABLE 2014-12-01 11:31:36 +13:00
Sam Hemelryk 438b185951 Merge branch 'MDL-48309-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2014-12-01 11:10:29 +13:00
Sam Hemelryk 3f1b091aa2 MDL-47133 editor_atto: fixed lint errors 2014-12-01 10:36:38 +13:00
Sam Hemelryk 0fec60deea Merge branch 'MDL-47133-28' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2014-12-01 10:19:31 +13:00
Petr Skoda 9e28b040df MDL-48420 test: fix lasttnamephonetic typo 2014-12-01 09:26:22 +13:00
Sam Hemelryk f7e646a5c1 Merge branch 'MDL-48227-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2014-12-01 09:14:50 +13:00
Ankit Agarwal d2b8475e3e MDL-42717 backups: set correct backup status and add logs
Set a correct backup status of ERROR when we fail to copy a file to an external directory given the backup configs demand it.
Also a lot of logs are added around this area to let admins easily find the problem if backup fails because of directory permissions.
2014-12-01 09:11:06 +13:00
Sam Hemelryk af9e696b79 Merge branch 'wip-mdl-48192-m28' of https://github.com/rajeshtaneja/moodle into MOODLE_28_STABLE 2014-12-01 08:33:57 +13:00
AMOS bot aa29beabe8 Automatically generated installer lang files 2014-11-29 00:04:01 +08:00
Jean-Michel Vedrine 71a673cc3b MDL-48342 Question: qformat_default::readquestion is broken 2014-11-28 15:38:21 +01:00
Tim Hunt 105dbe93d5 MDL-48382 quiz behat: make add question step more robust. 2014-11-28 13:43:31 +00:00
Ankit Agarwal d141109dc2 MDL-48227 forum: Update the message shown in emails
AMOS BEGIN
 CPY [deleteoriginalonreply,mod_forum],[replytopostbyemail,mod_forum]
AMOS END
2014-11-28 15:31:25 +05:30
Dan Poltawski 97cf440401 weekly release 2.8.1+ 2014-11-28 08:04:49 +00:00
Dan Poltawski bb2f54224c Merge branch 'install_28_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_28_STABLE 2014-11-28 08:04:47 +00:00
Damyon Wiese 6c20557845 Revert "Merge branch 'MDL-38128_28' of https://github.com/dmonllao/moodle into MOODLE_28_STABLE"
This reverts commit 349c877872.

This reverts commit f67638b05f, reversing
changes made to c604a8079a.
2014-11-28 15:12:30 +08:00
David Monllao 349c877872 MDL-38128 mod_assign: Changes in grading summary page using team submissions
If there is an active group and (groupmode != NOGROUPS)
the displayed info is related with that single group.
2014-11-28 05:49:22 +08:00
Dan Poltawski 5ae74cad15 Revert "Merge branch 'MDL-43127-28' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE"
This reverts commit d758f054b9, reversing
changes made to f67638b05f.
2014-11-27 09:35:00 +00:00
Dan Poltawski e393866a36 Revert "Merge branch 'MDL-43127-28-fixup' of https://github.com/FMCorz/moodle into MOODLE_28_STABLE"
This reverts commit f603096c47, reversing
changes made to 5169661ee2.
2014-11-27 09:34:58 +00:00
Rajesh Taneja 99c0919993 MDL-48192 tool_monitor: check output buffer and not ignore it.
Check what is thrown in output buffer and
make sure output is expected output.
2014-11-27 17:03:54 +08:00
Frederic Massart c83dc49d3c MDL-40419 backup: Advanced comparison when restoring blocks in course 2014-11-27 16:20:11 +08:00
Frederic Massart 9a59701f0f MDL-40419 blocks: Function to get page type patterns from pattern 2014-11-27 16:20:11 +08:00
Jetha Chan 1cd8f3c645 MDL-48394 core_renderers: remove role=presentation on user picture links 2014-11-27 15:34:10 +08:00
David Monllao c3e67edfac MDL-22309 enrol_self: Fixing get_role_users usage 2014-11-27 11:34:01 +08:00
Marina Glancy 92b71540b3 MDL-48390 cohorts: do not limit number of cohorts in dropdowns 2014-11-27 11:15:09 +08:00
Eloy Lafuente (stronk7) bba645d102 Merge branch 'wip-mdl-48190-m28' of https://github.com/rajeshtaneja/moodle into MOODLE_28_STABLE 2014-11-26 13:25:41 +01:00
Dan Poltawski 7cc923f443 MDL-48384 thirdpartylibs: correct location of yui 2014-11-26 12:13:04 +00:00
Frederic Massart da53c524f1 MDL-47133 editor_atto: Use strict validation of keyboard shortcuts 2014-11-26 17:40:50 +08:00
Dan Poltawski f603096c47 Merge branch 'MDL-43127-28-fixup' of https://github.com/FMCorz/moodle into MOODLE_28_STABLE 2014-11-26 09:23:08 +00:00
Frederic Massart 480c254ac1 MDL-43127 tool_uploadcourse: Empty enrolment method is acceptable
Without the patch a course would not be created if it contained
an enrolment method column with an empty value. e.g.:

shortname,fullname,category,enrolment_1,enrolment_1_disable
courserestored,Course restored,1,,
courserestored2,Course restored 2,manual,1
2014-11-26 17:14:50 +08:00
Andrew Nicols 5169661ee2 MDL-48148 mod_forum: Use correct original subject when handling replies 2014-11-26 08:56:24 +00:00
Dan Poltawski a76630d700 Merge branch 'MDL-48210-28-checker-caching' of git://github.com/mudrd8mz/moodle into MOODLE_28_STABLE 2014-11-26 08:20:42 +00:00
David Mudrák 475f4a6272 MDL-48210 updates checker: Fix empty return type
Credit goes to Marina Glancy for catching during the testing.
2014-11-26 09:07:50 +01:00
Marina Glancy 9e74aef0a9 MDL-48377 forum: do not swallow spaces in notification emails 2014-11-26 12:17:40 +08:00
Sam Hemelryk 58aabfcedd Merge branch 'MDL-22309_28' of git://github.com/dmonllao/moodle into MOODLE_28_STABLE 2014-11-26 09:06:11 +13:00
Sam Hemelryk eccf806ad0 Merge branch 'MDL-48191-28' of git://github.com/jethac/moodle into MOODLE_28_STABLE
Conflicts:
	grade/report/grader/yui/build/moodle-gradereport_grader-gradereporttable/moodle-gradereport_grader-gradereporttable-min.js
2014-11-26 08:59:13 +13:00
Sam Hemelryk 1198f5ae01 Merge branch 'MDL-47329-28' of git://github.com/jethac/moodle into MOODLE_28_STABLE 2014-11-26 08:43:36 +13:00
Eloy Lafuente (stronk7) cc9161bebc Merge branch 'MDL-48276-28' of git://github.com/danpoltawski/moodle into MOODLE_28_STABLE 2014-11-25 18:45:31 +01:00
Eloy Lafuente (stronk7) bea43ad49a Merge branch 'MDL-48277-28' of git://github.com/danpoltawski/moodle into MOODLE_28_STABLE 2014-11-25 18:42:12 +01:00
Heiko Schach 9c41fd2377 MDL-48036 course: change multilang cache key 2014-11-25 14:35:14 +00:00
Dan Poltawski b0b7c2d808 Merge branch 'MDL-41155-28' of git://github.com/gurgus/moodle into MOODLE_28_STABLE 2014-11-25 13:18:14 +00:00
Eloy Lafuente (stronk7) 3ca610e89a Merge branch 'MDL-48210-28-checker-caching' of git://github.com/mudrd8mz/moodle into MOODLE_28_STABLE 2014-11-25 13:22:14 +01:00
Dan Poltawski 71d7788366 Merge branch 'MDL-46416-28' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2014-11-25 11:21:21 +00:00
Dan Poltawski d758f054b9 Merge branch 'MDL-43127-28' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2014-11-25 11:18:52 +00:00
Dan Poltawski f67638b05f Merge branch 'MDL-38128_28' of https://github.com/dmonllao/moodle into MOODLE_28_STABLE 2014-11-25 11:07:53 +00:00
Eloy Lafuente (stronk7) c604a8079a Merge branch '48189-28' of git://github.com/samhemelryk/moodle into MOODLE_28_STABLE 2014-11-25 11:23:34 +01:00
Dave Cooper 9b36c64056 MDL-41155 Lesson: Fixed multiple question attempts logic
Thanks to Rajneel Totaram for providing this patch.
2014-11-25 14:16:37 +08:00
Dave Cooper b110dd77a4 MDL-41155 Lesson: Added behat tests for multiple question attempts 2014-11-25 14:16:37 +08:00
Frederic Massart 086199c4e9 MDL-43127 tool_uploadcourse: Add support for more enrolment methods 2014-11-25 11:01:30 +08:00
Sam Hemelryk b42123f38c Merge branch 'MDL-22043-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2014-11-25 15:54:20 +13:00
David Monllao c440b9947e MDL-38128 mod_assign: Adding group selector to grading summary page
Thanks to Pau Ferrer Ocaña and Avi Levy for
their work on this issue.
2014-11-25 10:52:29 +08:00
Rajesh Taneja b64a526dba MDL-48190 behat: Fixed visit background in MoodleScenarioTester 2014-11-25 09:42:38 +08:00
Sam Hemelryk b9bfc5f15a MDL-23839 navigation: fixed php5.5ism 2014-11-25 14:35:47 +13:00
Andrew Nicols 94ae0d9f3b MDL-48309 mod_forum: Handle discussion subscriptions correctly 2014-11-25 09:29:39 +08:00
Andrew Nicols da9d46b5c0 MDL-48309 mod_forum: Add discussion subscription to the navigation 2014-11-25 09:29:38 +08:00
Sam Hemelryk b3351c0133 Merge branch 'MDL-23839-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2014-11-25 14:07:24 +13:00
Sam Hemelryk e8ffea7bd5 Merge branch 'MDL-23912-28' of git://github.com/jethac/moodle into MOODLE_28_STABLE 2014-11-25 12:29:04 +13:00
Eloy Lafuente (stronk7) 25e135af74 Merge branch '38343-28' of git://github.com/samhemelryk/moodle into MOODLE_28_STABLE 2014-11-25 00:28:18 +01:00
Eloy Lafuente (stronk7) e4e04cdb84 Merge branch '48304-28' of git://github.com/samhemelryk/moodle into MOODLE_28_STABLE 2014-11-25 00:23:49 +01:00
Sam Hemelryk 222f015381 Merge branch 'MDL-48246-M28' of git://github.com/lazydaisy/moodle into MOODLE_28_STABLE
Conflicts:
	theme/bootstrapbase/style/moodle.css
2014-11-25 10:52:59 +13:00
Sam Hemelryk 5a9e656628 Merge branch 'm28_MDL-48265' of https://github.com/totara/moodle into MOODLE_28_STABLE 2014-11-25 09:42:56 +13:00
Dan Poltawski 5ff9df857e Merge branch '47832-28-removed' of git://github.com/samhemelryk/moodle into MOODLE_28_STABLE 2014-11-24 17:30:20 +00:00
Dan Poltawski c97952e6af Merge branch 'MDL-45867-m28-master' of https://github.com/dthies/moodle into MOODLE_28_STABLE 2014-11-24 17:11:15 +00:00
Mark Nelson e2e8a3e859 MDL-47601 core_backup: ensure removal of automated backups 2014-11-24 17:03:04 +00:00
Dan Poltawski edfb84865a Merge branch 'wip-MDL-48252-28' of git://github.com/abgreeve/moodle into MOODLE_28_STABLE 2014-11-24 16:29:27 +00:00
AMOS bot 78d7e090b2 Automatically generated installer lang files 2014-11-25 00:04:11 +08:00
Dan Poltawski 774522ff7e Merge branch 'MDL-48274-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2014-11-24 15:37:53 +00:00
Dan Poltawski 3a9daf6f9a Merge branch 'wip-mdl-48302-m28' of https://github.com/rajeshtaneja/moodle into MOODLE_28_STABLE 2014-11-24 11:57:11 +00:00
Dan Poltawski 1913d60133 Merge branch 'MDL-48180-28' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2014-11-24 11:53:55 +00:00
David Monllao 3aeec06364 MDL-22309 report_singleview: Fixing wrong uses of get_role_users() 2014-11-24 10:59:02 +08:00
David Monllao de64c655e2 MDL-22309 accesslib: Preventing incorrect get_role_users() uses 2014-11-24 10:59:02 +08:00
David Monllao 7d3f51c262 MDL-22309 accesslib: Adding unit test to expose the issue 2014-11-24 10:59:02 +08:00
Sam Hemelryk b4d7288e94 Merge branch 'MDL-48148-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2014-11-24 15:58:03 +13:00
Sam Hemelryk 43e413f93f Merge branch 'MDL-48064-m28-master' of https://github.com/dthies/moodle into MOODLE_28_STABLE 2014-11-24 14:54:25 +13:00
Andrew Nicols afcae55712 MDL-48148 mod_forum: Use the standard forum reply subject as default
When a user replies by e-mail, the course name has been included in the
original e-mail. As a result, the reply subject becomes longer and longer.

In cases whether either:
* the discussion name; or
* the replied-to-post subject

is present in the mail subject, the standard reply subject is instead used.
2014-11-24 09:11:22 +08:00
Mark Nelson 65e2d354aa MDL-35494 core_backup: fixed activity restoration issue 2014-11-24 10:33:50 +13:00
Sam Hemelryk c19e95c871 Merge branch 'MDL-48288-28' of git://github.com/jethac/moodle into MOODLE_28_STABLE 2014-11-24 10:02:47 +13:00
David Mudrák 6237bb2f2f MDL-48210 updates checker: Improve cron notifications processing
These are cosmetic improvements spotted while working on the issue.

1. Do not waste time if there are no changes to notify about.
2. Fix the legacy plugin manager's get_plugins() call.
2014-11-21 12:07:55 +01:00
David Mudrák 87082d0f1c MDL-48210 plugin_manager: Invalidate caches after fetching updates info 2014-11-21 12:07:55 +01:00
Jetha Chan 229171be1a MDL-48288 gradebook: fix floating footer exception when averages disabled
The code we use to update styles on floating elements did not account for
situations where those floating elements don't exist. This was discovered
when a test site didn't have column averages enabled, resulting in no
floating footer element being created, so when _handleScrollEvent was
fired the first time, a null reference exception was thrown trying to
apply styles to a non-existent element.
2014-11-21 10:56:47 +08:00
Rajesh Taneja 62a703b655 MDL-48302 behat: Reverted temp fix added by MDL-48251 2014-11-21 10:41:09 +08:00
Rajesh Taneja c4c810491a MDL-48302 behat: Reset all data, before starting behat suite 2014-11-21 10:41:03 +08:00
Rajesh Taneja 46388b5e48 MDL-48302 behat: Make sure to clear php file cache 2014-11-21 10:40:56 +08:00
Rajesh Taneja 54bd82d4ae MDL-48302 behat: Reset cache before scenario 2014-11-21 10:40:49 +08:00
Jetha Chan ffd5282986 MDL-47329 mod_book: missing RTL styles, added page body selectors 2014-11-21 10:24:45 +08:00
Jetha Chan 07bff34437 MDL-47329 mod_book: use embedded pagetype instead of hardcoded HTML 2014-11-21 10:04:50 +08:00
Kordan 66649405b5 MDL-46618 tool_xmldb: added styles_bootstrapbase.css 2014-11-20 10:42:10 +01:00
Dan Poltawski 702e65c9ed weekly release 2.8.1+ 2014-11-20 08:38:26 +00:00
Dan Poltawski 81c559d05e Merge branch 'install_28_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_28_STABLE 2014-11-20 08:38:24 +00:00
Sam Hemelryk fa23afbe30 MDL-48304 moodle_url: compare now considers anchor 2014-11-20 15:38:48 +13:00
Adrian Greeve 6d5f68a832 MDL-48252 scheduled tasks: file_temp_cleanup_task does full delete.
This scheduled task was previously only doing a partial delete
due to the fact that the directory modification time would be
updated when a child file was deleted. It would then have to
wait another week before that directory could be deleted.
2014-11-20 10:34:33 +08:00
Adrian Greeve 88690b92e4 MDL-48252 scheduled tasks: Unit test for file_temp_cleanup_task. 2014-11-20 10:28:18 +08:00
Sam Hemelryk 472b438486 MDL-47832 cache: removed data source aggregate functionality
Cache data source aggregate functionality was found to be broken
and unused, because of this the decision was made to remove it
rather than fix it.
As it was broken we did not follow typical deprecation methods and
instead the code was removed outright with only structure
remaining and left deprecated.
2014-11-20 11:25:04 +13:00
Sam Hemelryk 04c92d672f MDL-43628 mod_assign: fixed formatting of statement 2014-11-20 10:18:42 +13:00
Eloy Lafuente (stronk7) 57ebd7b1b1 Merge branch '48206-28' of git://github.com/samhemelryk/moodle into MOODLE_28_STABLE 2014-11-19 21:19:41 +01:00
Rajesh Taneja 1cda99f39b MDL-48251 behat: Shuffling activity creation fix quiz behat 2014-11-19 20:06:54 +01:00
Dan Poltawski 93d5459125 MDL-29585 wiki: fix unit test fails 2014-11-19 11:40:37 +00:00
Frederic Massart 62845bce83 MDL-29585 mod_wiki: Prevent broken links in editable sections
When a section name ended with a URL, the '<a' part of [edit] link
that is appended to the section was considered as part of the URL
in the section, thus causing the [edit] link to be broken.
2014-11-19 10:34:36 +00:00
Dan Poltawski d9eedd1a68 MDL-48277 css: initial csslint config file 2014-11-19 09:20:50 +00:00
Rajesh Taneja 3dfecf93cc MDL-46865 report_log: Fixed site name in behat step 2014-11-19 06:41:13 +00:00
Mario Wehr 0858e593e6 MDL-48274 mod_forum: Add missing context to has_capability call 2014-11-19 14:06:36 +08:00
Dan Poltawski ddf83f51d4 MDL-48276 qformat_xhtml: avoid uncessary html in .css file
In order to help automated tools move the html out of the css
file.
2014-11-19 05:56:41 +00:00
Andrew Nicols ba8ca6604d MDL-22043 mod_forum: Fix toggle subscription editing button behaviour
Update the user session property before generating the button which relies
upon it.
2014-11-19 13:32:23 +08:00
Andrew Nicols f8da8ae382 MDL-14402 blocks: Do not show assign roles on my home 2014-11-19 11:18:49 +08:00
Andrew Nicols 5c86569096 MDL-23839 navigation: Check for assignable course category roles 2014-11-19 08:55:56 +08:00
Sam Hemelryk 921d045174 MDL-33606 tests: fixed broken unit test 2014-11-19 11:30:42 +13:00
Sam Hemelryk c81ae06997 Merge branch 'MDL-33606_28' of git://github.com/dmonllao/moodle into MOODLE_28_STABLE 2014-11-19 09:37:24 +13:00
Daniel Thies 3228da2e5c MDL-45867 atto_equation: Change preview update to asynchronous 2014-11-18 13:30:33 -06:00
Mary Evans 236351fdc3 MDL-47915 mod/scorm: Added JS fallback for themes using copied layouts. 2014-11-18 17:49:08 +00:00
AMOS bot 752fdd2479 Automatically generated installer lang files 2014-11-19 00:05:40 +08:00
Dan Poltawski 29a036aa59 Merge branch 'MDL-48146_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2014-11-18 12:07:10 +00:00
Sam Hemelryk 299f1bcdbd Merge branch 'wip-mdl-48250-m28' of https://github.com/rajeshtaneja/moodle into MOODLE_28_STABLE 2014-11-18 17:38:08 +13:00
Sam Hemelryk 09de24667f Merge branch 'MDL-29585-28' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2014-11-18 16:47:30 +13:00
Brian Barnes a7d7354c85 MDL-48265 feedback: Added alt text to ghostscript test image 2014-11-18 16:46:00 +13:00
Jetha Chan 31830a539d MDL-23912 core_comment: update count after deletion 2014-11-18 09:35:23 +08:00
Sam Hemelryk 67ccf63800 MDL-38343 cache: better test server strings 2014-11-18 12:34:30 +13:00
Sam Hemelryk 292e991b86 Merge branch 'MDL-47618_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2014-11-18 11:12:32 +13:00
Daniel Thies 65e345c3f4 MDL-48064 atto_editor: Expand event subscription for saving selection 2014-11-17 11:36:43 -06:00
Mark Nelson 554f0bd206 MDL-30619 mod_data: fixed deletion of files on reset 2014-11-17 16:49:00 +00:00
Dan Poltawski 38d6b6eb17 Merge branch 'MDL-48199_M28' of git://github.com/lazydaisy/moodle into MOODLE_28_STABLE
Conflicts:
	theme/bootstrapbase/style/moodle.css
2014-11-17 16:42:44 +00:00
AMOS bot 931d7216cc Automatically generated installer lang files 2014-11-18 00:05:48 +08:00
Dan Poltawski 6dfc37accf Merge branch 'MDL-47648_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2014-11-17 15:41:38 +00:00
Rajesh Taneja 9e273e7556 MDL-46865 report_log: Fixed showuser and showcourse in report log 2014-11-17 15:34:16 +00:00
Dan Poltawski 2d747884c6 Merge branch 'm28_MDL-48023_Theme_Setting_Files_Cacheable_By_Both_Browsers_And_Proxies' of https://github.com/scara/moodle into MOODLE_28_STABLE 2014-11-17 15:20:17 +00:00
Dan Poltawski af2c296364 Merge branch 'MDL-48042_28' of git://github.com/ppichet/moodle into MOODLE_28_STABLE 2014-11-17 15:13:19 +00:00
Mary Evans ec1a6a6996 MDL-48246 theme: Fixed typo in 'hidepanelicon' 2014-11-17 15:06:34 +00:00
Dan Poltawski 3b8a871233 Merge branch 'MDL-42756_28' of git://github.com/aolley/moodle into MOODLE_28_STABLE 2014-11-17 13:52:49 +00:00
Adrian Greeve ccfd014d42 MDL-36240 backup: Activity calendar events backed up.
Activity calendar events can now be backed up and restored
when no user data is selected.
2014-11-17 13:31:19 +00:00
Dan Poltawski 0c0714ae3b Merge branch 'MDL-43987-28' of git://github.com/xow/moodle into MOODLE_28_STABLE 2014-11-17 13:17:40 +00:00
Dan Poltawski 4d7f88d55c Merge branch 'MDL-46640-28' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2014-11-17 12:52:36 +00:00
Dan Poltawski d5f6d962e2 Merge branch 'MDL-48150-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2014-11-17 11:44:15 +00:00
Andrew Nicols 97f5b7b8a2 MDL-48150 mod_forum: Generate message inbound keys for all posts
This code was previously misplaced so that only posts in discussion which
had not yet been processed in the current cron run would have keys
generated. If two posts were generated in the same discussion and sent out
on the same cron cycle, only the first post to be processed would have a
key generated.
2014-11-17 15:48:12 +08:00
Frederic Massart 410d8eda9a MDL-48180 mod_assign: By default do not count 'new' submissions 2014-11-17 15:14:59 +08:00
Rajesh Taneja c42974048a MDL-48250 enrol_ldap: set default category
As in other enrol plugins (database), set default
category to 1 (pointing to Miscellaneous)
2014-11-17 14:42:27 +08:00
Frederic Massart fce8127ff0 MDL-46640 navigation: Handle block contexts within a category 2014-11-17 12:42:09 +08:00
Frederic Massart 864e404348 MDL-29585 mod_wiki: Handle special characters in headings/sections 2014-11-17 10:39:26 +08:00
Jetha Chan cfbc7d903f MDL-48191 gradebook: fixed floating headers when emails not displayed 2014-11-17 10:17:53 +08:00
Sam Hemelryk 0b9dc284e8 MDL-48196 phpunit: fixed the fail after this change 2014-11-17 15:07:39 +13:00
John Okely e92d84244c MDL-43987 core: Remove port numbers in cleanremoteaddr 2014-11-17 09:48:32 +08:00
Sam Hemelryk e9f7276481 Merge branch 'MDL-48115_28' of https://github.com/totara/openbadges into MOODLE_28_STABLE 2014-11-17 14:37:58 +13:00
Sam Hemelryk b1dd1c8656 Merge branch 'MDL-48194-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2014-11-17 13:39:17 +13:00
Sam Hemelryk 6b5f44b214 Merge branch 'MDL-48171-28' of git://github.com/ankitagarwal/moodle into MOODLE_28_STABLE 2014-11-17 13:21:05 +13:00
Mary Evans 068c7a8706 MDL-48199 theme_bootstrapbase: Page padding left is wrong when in RTL 2014-11-17 00:02:13 +00:00
Sam Hemelryk e3adeba886 Merge branch 'MDL-48179-m28' of https://github.com/sammarshallou/moodle into MOODLE_28_STABLE 2014-11-17 12:48:12 +13:00
Sam Hemelryk 666ac939d5 Merge branch 'MDL-48196-28' of git://github.com/andrewnicols/moodle into MOODLE_28_STABLE 2014-11-17 12:34:16 +13:00
Sam Hemelryk d2fe097e20 Merge branch 'm28_MDL-47993' of https://github.com/totara/moodle into MOODLE_28_STABLE 2014-11-17 12:21:37 +13:00
Sam Hemelryk b1298c7690 Merge branch 'MDL-43628_v28' of https://github.com/scyrma/moodle into MOODLE_28_STABLE 2014-11-17 11:45:01 +13:00
Ankit Agarwal 6748b5ee5c MDL-35638 backup: Do not print headers during redirects 2014-11-17 10:38:50 +13:00
Sam Hemelryk 583cf99ebd Merge branch 'MDL-47590_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2014-11-17 10:38:49 +13:00
Sam Hemelryk c1ca23afa3 Merge branch 'MDL-44657-28' of git://github.com/FMCorz/moodle into MOODLE_28_STABLE 2014-11-17 10:38:49 +13:00
Sam Hemelryk 0c96741ef7 MDL-48189 grade: letters now covered by behat 2014-11-17 08:54:30 +13:00
Matteo Scaramuccia b73158d3d0 MDL-48023 Files API: Theme files must be cache-able by shared proxies.
The profile image AKA user icon will be cache-able by shared proxies too,
under its specific accessibility constraints/conditions.
2014-11-16 09:59:22 +01:00
Pierre Pichet f6fd6787d1 MDL-48042 Questions: Reset Calculated qtype comments on datasets
Reset back the modifications of Calculated qtype comments on datasets
    done by MDL-47224

Signed-off-by: Pierre Pichet <pichet.pierre@uqam.ca>
2014-11-15 16:54:27 -05:00
sam marshall 60fef215f6 MDL-48179 Backup progress: Can time out when compressing large backup 2014-11-14 18:30:17 +00:00
Daniel Thies 4587188ad9 MDL-48064 atto_editor: Check if activeElement is child node in isActive 2014-11-14 12:15:22 -06:00
Tim Hunt bc575d2bea MDL-47590 question backup: include response file only with userdata 2014-11-14 16:21:38 +00:00
Ankit Agarwal 806f6f642c MDL-48171 gradebook: Use proper apis to get item name 2014-11-14 14:05:52 +05:30
Sam Hemelryk acad969077 MDL-48206 block_comments: textarea width 100% 2014-11-14 11:40:32 +13:00
Oleg Demeshev 066751547d MDL-47993 calendar: Fix ical import Microsoft calendar issue 2014-11-14 10:39:34 +13:00
Eloy Lafuente (stronk7) 296b602f2c Moodle release 2.8.1 2014-11-13 12:22:51 +01:00
Eloy Lafuente (stronk7) 76db660264 Merge branch 'MDL-48214-28-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_28_STABLE 2014-11-13 12:05:17 +01:00
Helen Foster e5381b67e9 MDL-48214 Merge English strings from the en_fix language pack 2014-11-13 11:32:24 +01:00
Paul Holden 309a919074 MDL-44657 forms: Form identifiers should only contain basic characters 2014-11-13 16:25:12 +08:00
Andrew Nicols 367a26d088 MDL-48196 phpunit: Set e-mail address for admin user at installation 2014-11-13 08:58:55 +08:00
Eugene Venter 8d4e07d86d MDL-48204 mod_wiki: admin.php - fix syntax error 2014-11-13 00:47:16 +01:00
Tim Hunt 89eb7cf302 MDL-48146 quiz settings: fix non-percent feedback boundaries 2014-11-12 15:46:55 +00:00
Dan Poltawski b37f9889d0 weekly release 2.8+ 2014-11-12 11:33:31 +00:00
Dan Poltawski c8900a5152 MDL-48174 tool_langimport: info about skipped update
So admins can work out why the task might not be having an effect.
2014-11-12 11:22:45 +00:00
Rajesh Taneja 4c4d53ebaf MDL-48174 core_lang: support for ->skiplangupgrade in lang cron task
Similar to upgrade_language_pack(), update_langpacks_task should
respect skiplangupgrade config. Also, this should be added to behat
whitelist, so it can be disabled during on-sync period, when lang
pack for master is not available.
2014-11-12 11:03:55 +00:00
David Monllao a26ce935c7 MDL-30968 mod_forum: No picture link to group when no groups mode 2014-11-12 07:43:08 +00:00
David Monllao 2a3e89465c MDL-33606 course: Adding section info to course_viewed log 2014-11-12 13:58:35 +08:00
Andrew Nicols 6d8019438f MDL-48194 testing: Adjust naming of testsuites in phpunit.xml
This will make it easier to run phpunit for a specific component by making
all testsuite names consistent, guessable, and in-line with the naming of
the parameter (testsuite vs. test suite).
2014-11-12 12:06:45 +08:00
Adam Olley b19e9ae457 MDL-42756 dock: Trigger actionmenu enhance when showing dock panel
Additionally fixes the styling for the actionmenu icon size in
bootstrapbase'd themes.
2014-11-12 14:11:33 +10:30
Frederic Massart c6a1e9bed3 MDL-46416 group: Use a revision number for group pictures 2014-11-12 11:29:22 +08:00
James Ballard 0df5893423 MDL-47391 Update pagelayout for default profile configuration 2014-11-12 12:34:27 +13:00
Frederic Massart dd818fdb44 MDL-39692 grade: Little code clean up of letter boundary deletion 2014-11-12 12:19:31 +13:00
Huy Hoang 1fd2bc4810 MDL-39692 grade: Ability to delete letter boundary 2014-11-12 12:19:31 +13:00
Yuliya Bozhko 3f3f7ce52a MDL-48115 badges: Fix strtoupper() output in badges
Signed-off-by: Yuliya Bozhko <yuliya.bozhko@totaralms.com>
2014-11-12 09:30:29 +13:00
Amanda Doughty 088c4fb280 MDL-30968 mod/forum Fixed group link 2014-11-12 09:00:16 +13:00
Dan Poltawski 0ed92e6a37 MDL-47502 statslib tests: improve test
While integrating I noticed some problems which already existed in this
test:
* The enrolment data generator was not used
* The student roleid was hardocded
* The role assignment was at site level..
2014-11-11 19:26:03 +00:00
Eugene Venter afc8bd9672 MDL-47502 test_statslib_cron_daily: fix provider
Fiddling with the database in the data provider causes "out of sync"
errors when running suite tests.
2014-11-11 19:12:46 +00:00
Damyon Wiese c2dd91bfef MDL-47975 assign: Stop gap fix for random time fails. 2014-11-11 19:06:38 +00:00
sam marshall b0ac83b82b MDL-48093 HTML 5 video: Firefox now supports .mp4 2014-11-11 19:00:12 +00:00
Dan Poltawski 272ad5b577 Merge branch 'MDL-48168_28' of git://github.com/timhunt/moodle into MOODLE_28_STABLE 2014-11-11 18:48:36 +00:00
David Balch 7805d03a9e MDL-46116 mod_imscp: Display first item with content on load. 2014-11-11 18:42:29 +00:00
Tim Hunt ecb40b963d MDL-47618 quiz statistics: fatal error with groups.
The problem was that the names of query placeholders were changing. The
fix was to do things ourself, rather than using get_in_or_equal.
2014-11-11 18:29:31 +00:00
David Balch b45e110c3a MDL-46116 mod_imscp: Don't create links on items without content. 2014-11-11 18:16:39 +00:00
Darko Miletic 928497310e MDL-39376 enrol: Optimized setting for ldap and database 2014-11-11 17:23:01 +00:00
David Mudrák 5755d70f2e MDL-48156 task: Skip the scheduled task only for really disabled plugins 2014-11-11 17:18:03 +00:00
Tim Hunt ff8aaa2dd4 MDL-47648 admin unit tests: fix file perms on mimetex.exe
This was causing the
core_admintree_testcase::test_admin_setting_configexecutable unit test
to fail.
2014-11-11 14:04:20 +00:00
Mathieu Petit-Clair 5ebde631c0 MDL-43628 assign: make submissionagreement usable on multilingual sites 2014-11-10 16:53:49 -05:00
Tim Hunt 21c633a8c6 MDL-48168 quiz editing: max grade should be editable after attempts
Note that there was a lot of legacy code left from Moodle 2.7 which is
no longer required, and I took this opportunity to delete it.
2014-11-10 19:00:33 +00:00
Eloy Lafuente (stronk7) 25fe23f5f5 MDL-48144 upgrade: add v2.8.0 sep lines 2014-11-10 18:09:20 +01:00
Eloy Lafuente (stronk7) 21db825b19 Moodle release 2.8 2014-11-08 23:30:59 +01:00
Eloy Lafuente (stronk7) 3789b47f16 Merge branch 'install_master' of https://git.in.moodle.com/amosbot/moodle-install 2014-11-08 23:30:53 +01:00
AMOS bot 7a6b9b1e90 Automatically generated installer lang files 2014-11-09 00:05:33 +08:00
Eloy Lafuente (stronk7) bea7509414 Merge branch 'MDL-48107_master' of https://github.com/markn86/moodle 2014-11-08 11:19:59 +01:00
Mark Nelson 8145ab3372 MDL-48107 tool_monitor: extended automated tests
Also adjusted them so they will pass with these changes.
2014-11-08 00:50:51 -08:00
Mark Nelson 884652378a MDL-48107 tool_monitor: prevent site rule removal when deleting a course 2014-11-08 00:49:00 -08:00
Mark Nelson cbc4ecc7f9 MDL-48107 tool_monitor: added total subs to the delete rule string
Also made some minor language string changes.
2014-11-08 00:26:56 -08:00
Eloy Lafuente (stronk7) 17cc9fcd84 Moodle release 2.8rc2 2014-11-07 16:59:39 +01:00
Damyon Wiese f2e5a435a6 MDL-47900 Event monitor: Fix name of cache lang string for event monitor
AMOS BEGIN
 MOV [cachedef_rules, tool_monitor],[cachedef_eventsubscriptions, tool_monitor]
AMOS END
2014-11-07 17:40:21 +08:00
Damyon Wiese d04803595c Merge branch 'MDL-47900_master' of https://github.com/markn86/moodle 2014-11-07 16:58:52 +08:00
Eloy Lafuente (stronk7) d79af819c6 Merge branch 'wip-mdl-48035' of https://github.com/rajeshtaneja/moodle 2014-11-07 09:37:32 +01:00
Damyon Wiese 3d4de122f2 Merge branch 'MDL-46986-master' of https://github.com/lameze/moodle 2014-11-07 16:08:20 +08:00
Simey Lameze 8c674e80ec MDL-46986 mod_assign: Change the asserting to false 2014-11-07 15:54:14 +08:00
John Okely a481e32f02 MDL-47949 mod_wiki: Validate parameters for page deletion 2014-11-07 15:29:40 +08:00
Marina Glancy 293f1b4d85 Merge branch 'MDL-47869-master' of git://github.com/lameze/moodle 2014-11-07 15:03:32 +08:00
Rajesh Taneja ea2b511d9a MDL-48035 mod_forum: Reverted string change in step to keep correct functionality 2014-11-07 13:43:19 +08:00
Marina Glancy 2f1d0ea663 Merge branch 'MDL-46986-master' of git://github.com/lameze/moodle 2014-11-07 11:54:13 +08:00
Mark Nelson c490ede369 MDL-47900 tool_monitor: expanded unit tests
Expanded the unit tests to ensure unnecessary events are not
saved in the DB and altered existing tests so they pass with
the introduction of this feature.
2014-11-06 18:46:45 -08:00
Mark Nelson 475635f52d MDL-47900 tool_monitor: created list of rules MUC 2014-11-06 18:46:44 -08:00
Damyon Wiese 419d1abdad MDL-48091 users: Revert "MDL-42875 users: Show only profile visible..."
This reverts commit a09a837f20.
2014-11-07 09:30:42 +08:00
Simey Lameze 274962a1e7 MDL-46986 mod_assign: Remove duplicate column identifier 2014-11-07 09:19:18 +08:00
Eloy Lafuente (stronk7) 415fc3d2f9 Merge branch 'MDL-47943-master' of https://github.com/dthies/moodle 2014-11-06 18:44:38 +01:00
Eloy Lafuente (stronk7) ed34ab47e1 Merge branch 'MDL-48035-master-enfix' of git://github.com/mudrd8mz/moodle 2014-11-06 17:40:50 +01:00
David Mudrák f7dd19f01d MDL-48035 Fix more Behat tests regressions after merging en_fix strings 2014-11-06 16:19:11 +01:00
Andrew Nicols a211c54388 MDL-48090 mod_forum: Optimise subquery out of discussion subs list 2014-11-06 13:39:44 +00:00
Eloy Lafuente (stronk7) 6fdd4633a7 Merge branch 'MDL-48035-master-enfix' of git://github.com/mudrd8mz/moodle 2014-11-06 11:14:52 +01:00
David Mudrák 6887e2e53e MDL-48035 Fix Behat tests regressions after merging en_fix strings 2014-11-06 10:54:27 +01:00
Dan Poltawski e323635e1b Merge branch 'MDL-47390-master-fixes' of git://github.com/andrewnicols/moodle 2014-11-06 09:14:48 +00:00
Dan Poltawski 4c37593dcd Merge branch 'MDL-47980-master-fixup' of https://github.com/jethac/moodle 2014-11-06 08:58:27 +00:00
Dan Poltawski 4aeebe34b4 Merge branch 'MDL-47922-master' of git://github.com/ankitagarwal/moodle 2014-11-06 08:53:55 +00:00
Andrew Nicols 2b0a7419c6 MDL-47390 mod_forum: Provide ID and Discussion ID for discussion unsub 2014-11-06 16:50:36 +08:00
Jetha Chan b7ee86966b MDL-47980 gradebook: fixed label for bulk insert select box 2014-11-06 16:37:23 +08:00
Marina Glancy f2db391f59 Merge branch 'MDL-47980-master' of git://github.com/jethac/moodle 2014-11-06 15:14:05 +08:00
Simey Lameze 7c2a2e1a93 MDL-47869 tool_monitor: Add sorting on event monitor pages 2014-11-06 14:53:10 +08:00
Damyon Wiese 527464a618 MDL-43430 ldap: whitespace fix 2014-11-06 12:05:32 +08:00
Damyon Wiese bd6ee5c58a Merge branch 'wip_master_mdl-43430' of https://github.com/iarenaza/moodle 2014-11-06 12:00:12 +08:00
Marina Glancy 253b93f720 Merge branch 'wip_MDL-48083_m28_rollback' of git://github.com/skodak/moodle 2014-11-06 11:42:10 +08:00
Damyon Wiese ce1b8779df Merge branch 'MDL-48061-master-fixes' of https://github.com/andrewnicols/moodle 2014-11-06 11:30:42 +08:00
Andrew Nicols 4ee412613b MDL-48061 mod_forum: posttext should concat 2014-11-06 11:29:25 +08:00
Damyon Wiese b0637c57ad Merge branch 'MDL-48061-master-fixes' of https://github.com/andrewnicols/moodle 2014-11-06 11:22:42 +08:00
Andrew Nicols a41cff4e23 MDL-48061 mod_forum: Correct variable name in HTML warning message 2014-11-06 11:05:44 +08:00
Petr Skoda 5cf50f96e7 MDL-48083 dml: Empty buffers on forced rollback 2014-11-06 15:52:37 +13:00
Andrew Nicols ddb4a31d54 MDL-48029 mod_forum: Check for subscription before enrolling 2014-11-06 10:42:09 +08:00
Jetha Chan dd01789b4f MDL-47980 gradebook: add labels and legends missing from single view 2014-11-06 10:40:36 +08:00
Ankit Agarwal e53a4b88d6 MDL-47922 tool_monitor: Update strings 2014-11-06 07:42:24 +05:30
Eloy Lafuente (stronk7) dc3fab74ae Merge branch 'wip-MDL-47174-master' of git://github.com/marinaglancy/moodle 2014-11-06 02:15:44 +01:00
Marina Glancy 8f94164df3 MDL-47174 events: new calendar event may have 0 timestart 2014-11-06 08:57:29 +08:00
Eloy Lafuente (stronk7) a376c72a05 Merge branch 'wip-mdl-45416' of https://github.com/rajeshtaneja/moodle 2014-11-06 00:57:45 +01:00
Eloy Lafuente (stronk7) ec070d2cf7 Merge branch '48026-28' of git://github.com/samhemelryk/moodle 2014-11-06 00:33:46 +01:00
John Okely 9aa9a1c70a MDL-47862 tool_monitor: Fix tool monitor navigation tree
Added event monitor rules link to the frontpage navigation tree, when
editing the frontpage rules. Added hack so that when viewing the site
context subscriptions, the link in navigation is correct, allowing the
breadcrumbs to appear
2014-11-06 12:27:51 +13:00
John Okely 8f6b6982fa MDL-47862 event_monitor: Fix context for capability check on subscription page 2014-11-06 12:27:51 +13:00
Eloy Lafuente (stronk7) 4723da1bff Merge branch 'MDL-47990' of git://github.com/timhunt/moodle 2014-11-06 00:22:32 +01:00
Eloy Lafuente (stronk7) 862b76f39b Merge branch 'MDL-48050-master' of git://github.com/damyon/moodle 2014-11-06 00:01:26 +01:00
Sam Hemelryk 12a312ac6a Merge branch 'MDL-48044-master' of git://github.com/andrewnicols/moodle 2014-11-06 11:55:46 +13:00
Eloy Lafuente (stronk7) 97100bea54 Merge branch 'MDL-48054-master' of git://github.com/andrewnicols/moodle 2014-11-05 21:34:37 +01:00
Dan Poltawski 62e965c9b8 Merge branch 'MDL-47466-master' of https://github.com/tehanuyor/moodle 2014-11-05 16:24:14 +00:00
Daniel Thies 8160d004ce MDL-47943 editor_atto: Save selection on mouseleave for Chrome 2014-11-05 09:34:20 -06:00
Dan Poltawski c293eb004b Merge branch 'MDL-47874' of git://github.com/stronk7/moodle 2014-11-05 14:27:12 +00:00
Dan Poltawski 5a6c9f1cfb Merge branch 'MDL-48021' of git://github.com/stronk7/moodle
Conflicts:
	admin/tool/monitor/version.php
	mod/lesson/version.php
2014-11-05 12:11:16 +00:00
Dan Poltawski 35d236c1ea Merge branch 'MDL-48047-master' of git://github.com/lameze/moodle 2014-11-05 12:05:58 +00:00
Dan Poltawski 90de57db26 Merge branch 'MDL-48068-master' of git://github.com/FMCorz/moodle 2014-11-05 12:03:48 +00:00
Dan Poltawski f3fd919187 Merge branch 'MDL-47981-master' of git://github.com/damyon/moodle 2014-11-05 12:00:19 +00:00
Dan Poltawski 7aedf52716 MDL-47922 tool_monitor: bump version 2014-11-05 11:42:37 +00:00
Dan Poltawski 7ea14bb819 Merge branch 'MDL-47922-master' of git://github.com/ankitagarwal/moodle 2014-11-05 11:18:22 +00:00
Dan Poltawski a0cba367bd Merge branch 'MDL-47982-master' of git://github.com/gurgus/moodle 2014-11-05 11:03:57 +00:00
Andrew Nicols 7a311adbba MDL-48019 mod_forum: Add sesskey checks when setting tracking prefs
This also removes set_url() and changes require_course_login to
require_login as guests cannot set tracking.
2014-11-05 10:35:12 +00:00
Dan Poltawski fb3e9ea25d Merge branch 'MDL-48067-master' of git://github.com/jethac/moodle 2014-11-05 10:15:41 +00:00
Damyon Wiese a75cc21442 Merge branch 'MDL-48061-master' of git://github.com/andrewnicols/moodle 2014-11-05 16:54:32 +08:00
Damyon Wiese ec57e8b3f4 Merge branch 'MDL-46500_master' of https://github.com/dmonllao/moodle 2014-11-05 16:52:07 +08:00
Marina Glancy 93a4f8b5fc Merge branch 'MDL-47390-master' of git://github.com/andrewnicols/moodle 2014-11-05 16:35:05 +08:00
Iñaki Arenaza cc22032502 MDL-43430 enrol_ldap: Enrolment lost if member of group with parenthesis
While testing the fix, it was found that ldap_stripslashes() was broken and
using a deprecated PCRE patter modifier, so it's also been fixed.

Thanks to Damyon Wiese, some units tests have been added to cover
ldap_addslashes() and ldap_stripslashes().
2014-11-05 09:01:27 +01:00
Iñaki Arenaza 21302343ee MDL-43430 enrol_ldap: Enrolment lost if member of group with parenthesis
The group names we get from ldap_find_user_groups() can contain invalid LDAP
filter characters. So we need to escape them for LDAP filter usage.
2014-11-05 09:00:17 +01:00
Iñaki Arenaza 9807737734 MDL-43430 enrol_ldap: Enrolment lost if member of group with parenthesis
As part of fixing MDL-43430, a typo has been detected in the
quoted alphanumeric characters (the '=' and '>' were transposed).
2014-11-05 09:00:17 +01:00
Damyon Wiese 2f1637f09b Merge branch '48025-28' of git://github.com/samhemelryk/moodle 2014-11-05 15:39:27 +08:00
Simey Lameze b52b1ee9a4 MDL-48047 gradebook: change the missing ID number to checkbox on XML export 2014-11-05 15:24:09 +08:00
Damyon Wiese b729370ebe Merge branch 'MDL-47893-master-fix' of https://github.com/zbdd/moodle 2014-11-05 15:22:55 +08:00
Damyon Wiese 086e5b7b9e Merge branch 'MDL-47360-master' of git://github.com/lameze/moodle 2014-11-05 15:12:56 +08:00
Frederic Massart 00d03b0b8a MDL-48068 tool_monitor: Link to course points to the right course 2014-11-05 15:06:27 +08:00
Simey Lameze 0194d87ec5 MDL-47360 tool_monitor: add more help link and default template message 2014-11-05 14:57:53 +08:00
Andrew Nicols 7122e1543a MDL-48054 mod_forum: Fix unit test failures
These sporadic unit test failures were happening because the post time and
subscription time sometimes differ depending on the amount of time it takes
to complete the different components of the test.

To reliably address these issues, the post creation, and the discussion
subscription times are manually updated by different factors to ensure a
more realistic state of affairs.
2014-11-05 14:49:02 +08:00
Zachary Durber 4fb6b62c42 MDL-47893 gradebook: Fix for bulk updating single view. 2014-11-05 14:44:15 +08:00
Damyon Wiese 5ab68de8f0 Merge branch 'wip-MDL-46262-master' of git://github.com/marinaglancy/moodle 2014-11-05 14:38:11 +08:00
Jetha Chan 088fcf90ca MDL-48067 user_menu: allow empty customusermenuitems setting 2014-11-05 14:37:33 +08:00
Damyon Wiese 225fa27fc2 MDL-47793 assign: trivial fix for inconsistent use of get_instance() 2014-11-05 14:27:58 +08:00
Damyon Wiese 43db479d51 Merge branch 'MDL-47793-m' of https://github.com/micaherne/moodle 2014-11-05 14:25:22 +08:00
Damyon Wiese 686150130e Merge branch 'MDL-47930-master' of git://github.com/andrewnicols/moodle 2014-11-05 14:18:07 +08:00
Damyon Wiese c5d4633fed Merge branch 'MDL-47902_scorm_inappropriate_default_values' of https://github.com/MorrisR2/moodle 2014-11-05 14:05:32 +08:00
Damyon Wiese 8a9fd2d4cf MDL-27930 lesson: Remove custom styling from timer 2014-11-05 13:58:38 +08:00
Damyon Wiese c86477aa88 Merge branch 'MDL-27930' of git://github.com/jmvedrine/moodle 2014-11-05 13:34:07 +08:00
Zachary Durber 5467cc051c MDL-48031 gradebook: Fix for bulk updating users in single view. 2014-11-05 13:20:40 +08:00
Ankit Agarwal f63c5b0413 MDL-47922 behat: Add a behat test 2014-11-05 10:19:45 +05:30
Ankit Agarwal 236a1f8d31 MDL-47922 tests: Enable tool monitor in various tests 2014-11-05 10:19:45 +05:30
Ankit Agarwal 5ff867362a MDL-47922 tool_monitor: Add a config to disable the tool 2014-11-05 10:19:44 +05:30
Andrew Nicols 6a5b087163 MDL-48061 mod_forum: Tidy up reply-by-email information in emails
* Add a reminder to remove the original message; and
* Remove the reply-to address from the text.
2014-11-05 11:20:59 +08:00
Rajesh Taneja e790a3ecc7 MDL-45416 enrol_ldap: Use null_progress_trace while running phpunit 2014-11-05 10:43:16 +08:00
Eloy Lafuente (stronk7) 8d3c518bd5 Merge branch 'MDL-48035-master-enfix' of git://github.com/mudrd8mz/moodle 2014-11-05 01:16:05 +01:00
Helen Foster ba033b861e MDL-48035 Merge English strings from the en_fix language pack 2014-11-04 21:55:26 +01:00
Eloy Lafuente (stronk7) de881693f7 MDL-48021 bump: Bump all versions to planned release
This bumps all versions to planned 2.8 release
(2014111000) version and all the dependencies to
current 2.8rc1 (2014110400)
2014-11-04 17:52:35 +01:00
Dan Poltawski f61619597b Merge branch 'MDL-47893-master' of git://github.com/zbdd/moodle 2014-11-04 16:50:47 +00:00
Dan Poltawski f820acf01e Merge branch 'MDL-47944-master' of git://github.com/andrewnicols/moodle 2014-11-04 16:30:17 +00:00
Jean-Michel Vedrine 50d70c5caf MDL-27930 Lesson: the count-down timer does not work 2014-11-04 15:12:42 +01:00
Eloy Lafuente (stronk7) 6ce4b8ea30 Moodle release 2.8rc1 2014-11-04 11:45:59 +01:00
Damyon Wiese 12938e894d MDL-48050 Libraries - fake HTTPS detection needs the correct port 2014-11-04 16:50:25 +08:00
Andrew Nicols 1008dd8ef0 MDL-47390 mod_forum: Correct check for groups when subscribing 2014-11-04 16:35:47 +08:00
Andrew Nicols da30d04408 MDL-47390 mod_forum: Add discussion unsub to email footer 2014-11-04 16:35:47 +08:00
Mark Nelson 4e86f45a3e MDL-47361 tool_monitor: added missing column
Also reworded a string as the fields have been renamed.
2014-11-04 00:15:41 -08:00
Andrew Nicols 548453ecde MDL-48044 mod_forum: Preload icons for discussion subscription toggles 2014-11-04 16:09:19 +08:00
Andrew Nicols a35ce611cf MDL-47944 mod_forum: Improve discussion subscription icon/link
* make the link text clickable
* changes the link text when unsubscribed to the action text "Subscribe"
2014-11-04 15:46:05 +08:00
Damyon Wiese 888d0822bd Merge branch 'MDL-47806' of github.com:mr-russ/moodle 2014-11-04 14:34:43 +08:00
Damyon Wiese 0c4a7f96cc Merge branch 'MDL-47810_master-fix-MDL-47758-changes' of git://github.com/dmonllao/moodle 2014-11-04 14:17:46 +08:00
Zachary Durber 50e30bd4e3 MDL-47893 gradebook: Progress bar and continues for grade saving.
When you save a grade you are notified of how many grades have
been updated and any warnings.
2014-11-04 13:57:03 +08:00
Damyon Wiese 7a056947e3 Merge branch 'MDL-45636-course_master' of https://github.com/eSrem/moodle 2014-11-04 13:47:51 +08:00
David Monllao 0907f49b4e MDL-47810 tool_monitor: Updating behat scenarios introduced in MDL-47758 2014-11-04 12:23:42 +08:00
Marina Glancy 1d9155872f Merge branch 'MDL-48006-master' of git://github.com/damyon/moodle 2014-11-04 10:47:09 +08:00
Eloy Lafuente (stronk7) 990ebf08c7 Merge branch 'MDL-47883-master-foundlangfile' of git://github.com/mudrd8mz/moodle 2014-11-04 02:03:11 +01:00
Eloy Lafuente (stronk7) b53c2a92d0 Merge branch 'wip-MDL-47976-master' of git://github.com/marinaglancy/moodle 2014-11-04 01:59:23 +01:00
Eloy Lafuente (stronk7) ddb5bc5fcd Merge branch '47969-28' of git://github.com/samhemelryk/moodle 2014-11-04 01:56:59 +01:00
Eloy Lafuente (stronk7) 882f915922 Merge branch '47968-28' of git://github.com/samhemelryk/moodle 2014-11-04 01:55:08 +01:00
Petr Skoda 76ae1f6068 MDL-47868 ws: verify upload areas 2014-11-04 01:48:17 +01:00
Petr Skoda 7ee4642bcb MDL-48013 calendar: force download of user files 2014-11-04 01:40:52 +01:00
Eloy Lafuente (stronk7) bebd3ce8fc Merge branch 'MDL-47207_master' of git://github.com/dmonllao/moodle 2014-11-04 01:20:51 +01:00
Eloy Lafuente (stronk7) 1ebcb0080b Merge branch '47917-28' of git://github.com/samhemelryk/moodle 2014-11-04 00:03:42 +01:00
Damyon Wiese edc89dfecb MDL-47927 LTI: Use PARAM_TEXT and p() for returned messages and errors 2014-11-04 11:46:57 +13:00
Frederic Massart 5d0b3b21d6 MDL-47965 tag: Enforcing security of tag auto completion 2014-11-04 11:28:17 +13:00
David Monllao babaf596e1 MDL-47924 mod_lti: Fixing missing sesskey checkings
Also fixing a missing capability checking.
2014-11-04 11:00:51 +13:00
Yuliya Bozhko d0053d29ed MDL-47190 Ensure badges cannot be awarded without a role
Signed-off-by: Yuliya Bozhko <yuliya.bozhko@totaralms.com>
2014-11-04 10:16:45 +13:00
Frederic Massart eb46bf2f4e MDL-47321 iplookup: Prevent guest users from using iplookup 2014-11-04 10:01:43 +13:00
Adrian Greeve c4a6c65c1b MDL-47697 mod_data: Fix group id change when editing.
When a teacher edits an entry in the database module
it would change the group ID to the one that the teacher
currently had selected.

Thanks to Steve Bond for providing a patch.
2014-11-04 09:58:11 +13:00
Juan Leyva 40afeb4044 MDL-45303 Web Services: forum_discussions not checking groups 2014-11-03 21:55:03 +01:00
Juan Leyva a0095e5a89 MDL-47766 web services: get_grades exposes hidden grades to students 2014-11-04 09:13:46 +13:00
John Okely c844af2569 MDL-47921 mod_lti: Add access control to mod/lti/launch.php 2014-11-04 09:09:26 +13:00
Dave Cooper 40a0465823 MDL-47050 core_wordlist: Updated wordlist to include only animals. 2014-11-04 09:03:08 +13:00
Dan Poltawski 712b72c0f0 Merge branch 'MDL-47864_master' of git://github.com/dmonllao/moodle 2014-11-03 15:20:58 +00:00
Dan Poltawski 971163afaa Merge branch 'MDL-47810_master' of git://github.com/dmonllao/moodle 2014-11-03 15:03:51 +00:00
Dan Poltawski a46b057572 Merge branch 'MDL-47983_master' of git://github.com/dmonllao/moodle 2014-11-03 15:01:59 +00:00
Dan Poltawski 5904a6abe3 MDL-47361 tool_monitor: exit after printing footer 2014-11-03 14:21:50 +00:00
Dan Poltawski e3d86c322b Merge branch 'MDL-47361_master' of https://github.com/markn86/moodle
Conflicts:
	admin/tool/monitor/edit.php
	admin/tool/monitor/lang/en/tool_monitor.php
2014-11-03 13:55:31 +00:00
Dan Poltawski 1a27142afe Merge branch 'MDL-47903-master' of git://github.com/andrewnicols/moodle
Conflicts:
	mod/forum/version.php
    mod/forum/db/upgrade.php
2014-11-03 12:28:33 +00:00
Andrew Nicols a6d7a81271 MDL-48020 mod_forum: Add missing sesskey check in AJAX subscription 2014-11-03 11:02:41 +00:00
Marina Glancy 8bd6b270b2 Merge branch 'MDL-47987-master' of git://github.com/andrewnicols/moodle 2014-11-03 17:21:55 +08:00
Damyon Wiese ac87cab989 Merge branch 'MDL-48010' of git://github.com/timhunt/moodle 2014-11-03 17:15:25 +08:00
Petr Skoda 1993cc02b6 MDL-47287 prevent web access to phpunit boostrap 2014-11-03 17:10:33 +08:00
Marina Glancy d9fb78c981 Merge branch 'wip-mdl-45204-m' of git://github.com/rajeshtaneja/moodle 2014-11-03 17:03:57 +08:00
David Monllao 88f64b5111 MDL-47810 tool_monitor: action_link when there is only 1 option
When the rule plugin is not a module you can subscribe
to it without having to select to which module instance
you want to subscribe, so there is no need to display
a drop down menu.
2014-11-03 15:22:24 +08:00
Andreas Grabs b7f75a9c05 MDL-47865 mod_feedback - XSS through $searchstring in mod/feedback/mapcourse.php 2014-11-03 14:56:10 +08:00
Damyon Wiese c3a0452a5b MDL-47926 LTI: Fix missing sesskey checks and add content type headers to redirect 2014-11-03 14:43:54 +08:00
Damyon Wiese 219ebf9bb4 Merge branch 'wip-MDL-45538-master' of git://github.com/marinaglancy/moodle
Conflicts:
	version.php
2014-11-03 14:10:43 +08:00
Damyon Wiese f6b7d7322a Merge branch 'MDL-26447_master' of https://github.com/crazyserver/moodle 2014-11-03 13:50:38 +08:00
David Monllao 5cfaaf2d7a MDL-47983 tool_monitor: Removing only-for-admins restriction 2014-11-03 13:22:19 +08:00
Mark Nelson 8ad2de40b1 MDL-47361 tool_monitor: altered behat tests so they pass 2014-11-02 20:50:16 -08:00
Damyon Wiese 520a32c3d4 Merge branch 'wip_MDL-47966_m28_defaultheaders' of https://github.com/skodak/moodle 2014-11-03 12:20:58 +08:00
Damyon Wiese c942fddf93 MDL-48006 Atto autosave: Never restore text that is empty. 2014-11-03 11:30:30 +08:00
Mark Nelson 7293e97162 MDL-47361 tooL_monitor: string and UI changes 2014-11-02 19:05:29 -08:00
Sam Hemelryk cf03313342 Merge branch 'MDL-47465-master' of git://github.com/ankitagarwal/moodle 2014-11-03 15:30:08 +13:00
Ankit Agarwal c4e3e12884 MDL-47465 tool_monitor: Ignore used events
An event that has already contributed to a notification should not contribute to another notification for the same subscription.
This needs to be done so we do not overwhelm the user.
2014-11-03 07:18:13 +05:30
Ankit Agarwal 1af956998e MDL-47465 tool_monitor: add a new column to subs 2014-11-03 07:18:13 +05:30
Sam Hemelryk 1b5b97fac5 MDL-47917 cachestore_memcached: fixed get_many ordering 2014-11-03 14:08:25 +13:00
Sam Hemelryk 84d5a89c84 MDL-48026 usermenu: convert menu nowrap from CSS to method 2014-11-03 13:44:58 +13:00
Sam Hemelryk 8a375d27f2 MDL-48026 mod_quiz: convert menu nowrap from CSS to method 2014-11-03 13:35:29 +13:00
Sam Hemelryk a2a9468f01 MDL-48026 output: action_menu no wrap improvement
Action menu output component has a new method set_nowrap_on_items
that sets a property to toggle nowrap on menu items.
That can be used to avoid problems when the menu appears within
an absolutely positioned or floated element.
2014-11-03 13:34:02 +13:00
Sam Hemelryk ac4ed127de MDL-47978 mod_quiz: more explicit selector for action menu change 2014-11-03 11:39:30 +13:00
Sam Hemelryk 968cc37437 Merge branch 'MDL-47978' of git://github.com/timhunt/moodle 2014-11-03 11:27:55 +13:00
Sam Hemelryk f836166a8a MDL-48025 user: fixed typo in user_search HTML 2014-11-03 10:08:03 +13:00
Sam Hemelryk 70739e6e30 MDL-47969 mod_survey: fixed HTML5 validation of index.php 2014-11-03 08:55:12 +13:00
Sam Hemelryk e014b6f2c4 MDL-47968 mod_forum: fixed search form HTML5 validation 2014-11-03 08:54:56 +13:00
Eloy Lafuente (stronk7) bacbb4e279 MDL-47874 dml: add support for replace_all_text to oracle
And, at the same time, fix the implementation so all databases
will be using sql_substr() instead of harcoded "SUBSTRING".
2014-11-02 18:26:18 +01:00
Marina Glancy 41107173e4 MDL-46262 availability: validation of fields without value
Thanks to Tomasz Pawlik | CKO USl for the patch
2014-11-01 16:58:14 +08:00
Tim Hunt f9476f4d0e MDL-48010 grade import from URL: don't corrupt the URL. 2014-10-31 19:52:33 +00:00
Tim Hunt b4a40e451d MDL-48008 gradeimport_xml: report errors usefully 2014-10-31 19:52:31 +00:00
Tim Hunt 262105faf9 MDL-47978 quiz editing: fix display of last add menu 2014-10-31 18:23:45 +00:00
Eloy Lafuente (stronk7) 6863c0de49 Merge branch 'MDL-47892-master' of git://github.com/lameze/moodle 2014-10-31 18:57:30 +01:00
Tim Hunt 58413f613e MDL-47963 quiz editing: fix failing unit tests
The unit tests were initialising the structure class in a different way
from real use. That was clearly silly, so I got rid of create_for,
leaving just the real create_for_quiz.
2014-10-31 17:22:38 +00:00
Dan Poltawski 1de9b5072a Merge branch 'MDL-47797' of git://github.com/timhunt/moodle 2014-10-31 16:48:30 +00:00
Tim Hunt 234c5337f7 MDL-47797 quesion preview: improve the behat script
Tests a few more buttons, and also verify more of the UI.
2014-10-31 15:52:55 +00:00
Tim Hunt 40459677a0 MDL-47797 question preview: show more technical info
It is helpful for developers creating question types (at least) to be
able to see this.
2014-10-31 15:52:54 +00:00
Dan Poltawski b4eaafd744 Merge branch 'MDL-47963' of git://github.com/timhunt/moodle 2014-10-31 13:14:59 +00:00
David Mudrák fb1f2b9b27 MDL-47883 admin: Fix missing string in the plugin validation 2014-10-31 12:54:22 +01:00
Dan Poltawski 9ebee5df8e on-demand release 2.8beta+ 2014-10-31 09:09:03 +00:00
Mark Nelson eb0aabde73 MDL-47758 tool_monitor: altered behat tests so they pass 2014-10-31 01:16:10 -07:00
Mark Nelson c4701daa75 MDL-47758 tool_monitor: prevent DB error when revisiting a delete URL 2014-10-31 01:16:10 -07:00
Rajesh Taneja 54957bdbf7 MDL-45204 phpunit: Fixed test_localcachedir test
make_localcache_directory is the first call to make
localcache, which is already created by reset. So deleting
existing localcache directory will pass this test
2014-10-31 16:07:47 +08:00
Dave Cooper c7ef2c4c63 MDL-47982 gradebook: Remove tabindex from all elements. 2014-10-31 16:06:46 +08:00
Mark Nelson a724ceb99f MDL-47919 tool_monitor: only use set_label() on valid object 2014-10-31 00:56:47 -07:00
Marina Glancy 2e7eca137c MDL-47976 tool_monitor: fix ordering in unittest 2014-10-31 15:25:54 +08:00
Simey Lameze ed9084f70b MDL-47892 tool_monitor: add count_rule_subscriptions method and unit tests 2014-10-31 15:10:19 +08:00
Simey Lameze 107b55bd74 MDL-47892 tool_monitor: disable plugin and event fields if theres subscriptions for the rule 2014-10-31 14:41:24 +08:00
Damyon Wiese d61dc26e12 MDL-47981 Grade single view: Prevent nasty scroll jumping. 2014-10-31 14:07:58 +08:00
David Monllao 0151ef57f5 MDL-47864 tool_monitor: Change edulevels
Considering that the most common use case
to manage rules is an admin CRUDing them.
2014-10-31 14:01:31 +08:00
David Monllao f5d3d0f498 MDL-47864 grade_report: Edulevels according to default user permissions 2014-10-31 14:01:30 +08:00
Andrew Nicols 2a9f525bcf MDL-47390 mod_forum: Correct check for groups when subscribing 2014-10-31 08:54:02 +08:00
Sam Hemelryk 1a14f8a6de MDL-47959 mod_quiz: fixed 0 questions bug 2014-10-31 13:35:25 +13:00
Andrew Nicols 4c34089889 MDL-47987 mod_forum: Users subscribe to discussions not forums
Correct language string which describes users subscribing to a discussion,
and use it when subscribing on post.
2014-10-31 07:51:48 +08:00
Sam Hemelryk 323ed3bbf0 Merge branch 'MDL-47875_master' of https://github.com/crazyserver/moodle 2014-10-31 11:15:12 +13:00
pau.ferrer-ocana 5ea0d026b0 MDL-47875 choice: chat module strings not required from Choice anymore
AMOS BEGIN
 CPY [chatintro,mod_chat],[description,mod_choice]
AMOS END
2014-10-30 22:41:23 +01:00
Sam Hemelryk 3ea5ff8941 Merge branch 'MDL-42875_master' of https://github.com/crazyserver/moodle 2014-10-31 10:27:46 +13:00
Tim Hunt 749606288e MDL-47990 qtype_multichoice: fix test response import/export 2014-10-30 18:19:45 +00:00
Dan Poltawski fca969b9bb Merge branch 'MDL-47972' of git://github.com/timhunt/moodle 2014-10-30 17:31:12 +00:00
Colin Chambers 77dca4d0a8 MDL-47972 mod_quiz: Fix new quiz on themes based on base. 2014-10-30 17:11:23 +00:00
David Monllao f31d564133 MDL-47950 course: Adding sesskey confirmation when duplicating activities 2014-10-30 16:58:45 +00:00
Dan Poltawski 0a92904c47 MDL-47918 forum: Coding style fix 2014-10-30 16:46:46 +00:00
Tim Hunt 6870a6b8d0 MDL-47963 quiz editing: block ajax edits once there are attempts 2014-10-30 16:24:55 +00:00
Dan Poltawski ebbf039d07 Merge branch 'MDL-47746-master' of git://github.com/zbdd/moodle 2014-10-30 15:39:46 +00:00
Dan Poltawski 665611454d Merge branch 'MDL-47896-master' of git://github.com/zbdd/moodle 2014-10-30 15:15:28 +00:00
Dan Poltawski fb9604d67c Merge branch 'MDL-47918-master' of git://github.com/andrewnicols/moodle 2014-10-30 14:31:38 +00:00
Dan Poltawski f976c8e468 Merge branch 'MDL-47959' of git://github.com/colchambers/moodle 2014-10-30 14:24:35 +00:00
Marina Glancy 08674d83c1 Merge branch 'MDL-25057-master' of git://github.com/andrewnicols/moodle 2014-10-30 17:14:09 +08:00
pau.ferrer-ocana afa0968d5d MDL-26447 gradebook: Default gradedisplaytype fixed for all locales 2014-10-30 09:43:43 +01:00
Dan Poltawski fe5c340197 Merge branch 'wip-MDL-47919-master2' of https://github.com/marinaglancy/moodle 2014-10-30 08:30:43 +00:00
Marina Glancy 89da9fa67b Merge branch 'MDL-47569_CC_Errors' of git://github.com/moodlerooms/moodle 2014-10-30 16:15:51 +08:00
Marina Glancy 61138e352d Merge branch '47970-28' of git://github.com/samhemelryk/moodle 2014-10-30 16:15:38 +08:00
Marina Glancy 9e432c22cd Merge branch 'MDL-47909-master' of git://github.com/andrewnicols/moodle 2014-10-30 16:15:10 +08:00
David Monllao 57a69e7151 MDL-46500 mod_data: Removing duplicate filemanager initialisations 2014-10-30 16:10:15 +08:00
Marina Glancy f1d3d8ccb3 Merge branch 'MDL-47310-master' of git://github.com/jethac/moodle 2014-10-30 14:22:48 +08:00
Marina Glancy 3dc7afc186 Merge branch 'MDL-47349-master' of git://github.com/andrewnicols/moodle 2014-10-30 14:19:52 +08:00
Marina Glancy 2f28c71186 Merge branch 'MDL-29873' of git://github.com/jmvedrine/moodle 2014-10-30 14:17:32 +08:00
Ben Kelada 848e04183f MDL-46500 filepicker: prevent error when element does not exist 2014-10-30 14:14:15 +08:00
Marina Glancy 376d0317f1 MDL-47919 tool_monitor: refer to fields by labels in behat 2014-10-30 14:03:10 +08:00
Zachary Durber 7c5721f915 MDL-47746 gradebook: Visual bug fix for Scales in Singleview. 2014-10-30 14:00:44 +08:00
Andrew Nicols 02cf3958d2 MDL-47909 mod_forum: Respect user autosubscribe setting on post
Re-appropriate the forum autosubscribe setting as a discussion
autosubscribe setting.

The setting was no longer used after the per-discussion changes. The
original plan had been to remove this setting, but there is some benefit to
respecting it for discussion subscriptions instead.
2014-10-30 13:36:06 +08:00
Jetha Chan 43cd76e848 MDL-47310 gradebook: accessibility improvements 2014-10-30 13:28:15 +08:00
Zachary Durber 70d0de18d6 MDL-47896 gradebook: Fix for non-overridden grades. 2014-10-30 13:26:44 +08:00
Andrew Nicols 611a5ef714 MDL-25057 mod_forum: Stop duplicating forum_read posts from cron
This also includes an upgrade script to delete the existing duplicates.
2014-10-30 13:23:29 +08:00
David Monllao b2b70eea49 MDL-47207 mod_forum: Unifying criteria 2014-10-30 12:50:17 +08:00
Andrew Nicols a54702b234 MDL-47903 mod_forum: Correct test fails related to caching and time
This adds a reset of the discussion and forum cache when running the mail
and maildigest tests.

These test fails were highlighted by the addition of new tests which
add similar post ids.
2014-10-30 12:02:35 +08:00
Andrew Nicols eb451c7981 MDL-47903 mod_forum: Add discussion subscription time
This helps us to only send notifications for messages the user should have
already seen.
2014-10-30 12:02:34 +08:00
Rajesh Taneja b7ff40301d MDL-47960 behat: Fixed message node navigation
in i_send_message_to_user, we should use navigation node
step, as there might be multiple links with same name.
2014-10-30 10:56:56 +08:00
Dan Poltawski 490d009a57 MDL-47960 messages: behat failures caused by user menu 2014-10-30 10:56:17 +08:00
Dan Poltawski e0a1801e27 MDL-47960 badges: behat failures caused by usermenu 2014-10-30 10:56:16 +08:00
Dan Poltawski 6469803f68 MDL-47960 behat: fix my private files navigation
Caused by the my private files link being in user menu too..
2014-10-30 10:56:16 +08:00
Sam Hemelryk 0025296f19 MDL-47970 mod_scorm: fixed HTML5 validation error 2014-10-30 14:56:15 +13:00
Andrew Nicols 41e62a9093 MDL-47349 gradereport: Use category title on report 2014-10-30 09:53:36 +08:00
Andrew Nicols 4e3af3cf42 MDL-47390 mod_forum: Add discussion unsub to email footer 2014-10-30 09:07:36 +08:00
Petr Skoda 3c98b7a5ad MDL-47966 Add default content type and encoding 2014-10-30 11:38:07 +13:00
Colin Chambers 6375e98cbb MDL-47959 Number of questions not updated dynamically in new quiz edit page 2014-10-29 16:26:49 +00:00
Dan Poltawski 4f82670250 Merge branch 'wip_MDL-40949_m28_pathsettings' of https://github.com/skodak/moodle 2014-10-29 13:04:46 +00:00
Dan Poltawski 5d5e545fc7 Merge branch 'MDL-47945-master' of git://github.com/jethac/moodle 2014-10-29 12:56:03 +00:00
Dan Poltawski b373c35071 Merge branch 'wip-MDL-47919-master' of git://github.com/marinaglancy/moodle 2014-10-29 12:42:55 +00:00
Dan Poltawski 290bcd3476 MDL-47368 fix trailing whitespace 2014-10-29 11:20:29 +00:00
Dan Poltawski 0af29b0383 Merge branch 'MDL-47368' of git://github.com/timhunt/moodle 2014-10-29 11:18:15 +00:00
Michael Aherne 48242bf33f MDL-47793 assign: Reset reveal identities 2014-10-29 11:18:06 +00:00
pau.ferrer-ocana a09a837f20 MDL-42875 users: Show only profile visible roles on participants list 2014-10-29 11:24:19 +01:00
Julien Boulen 9b45b74e8f MDL-47584 database SQL: add debug info on connection error notices 2014-10-29 16:59:56 +08:00
Damyon Wiese 60c1108c30 Merge branch 'wip-MDL-47647-master' of git://github.com/abgreeve/moodle 2014-10-29 16:18:03 +08:00
Marina Glancy 72dbe74e7e Merge branch 'MDL-47916-master' of git://github.com/jleyva/moodle 2014-10-29 16:15:07 +08:00
Damyon Wiese 520bcbb9ab Merge branch 'MDL-47946-master' of git://github.com/andrewnicols/moodle 2014-10-29 15:53:17 +08:00
Damyon Wiese e562a1b25b Merge branch 'MDL-46219' of https://github.com/dkns/moodle 2014-10-29 15:37:47 +08:00
Damyon Wiese 7154f954c7 Merge branch 'MDL-47755_master' of https://github.com/totara/openbadges 2014-10-29 15:31:58 +08:00
Marina Glancy 941de29601 MDL-45538 files: restore missing records in draft areas 2014-10-29 15:26:54 +08:00
Damyon Wiese 3c459b6300 Merge branch 'wip-MDL-47796-master' of git://github.com/abgreeve/moodle 2014-10-29 15:15:14 +08:00
Damyon Wiese 412430c392 Merge branch 'MDL-47805-master' of git://github.com/ankitagarwal/moodle 2014-10-29 14:46:06 +08:00
Damyon Wiese cf63799155 Merge branch 'MDL-47227_master' of https://github.com/crazyserver/moodle 2014-10-29 14:44:08 +08:00
Damyon Wiese 857c7b4986 Merge branch 'MDL-47201-master' of git://github.com/xow/moodle 2014-10-29 14:24:28 +08:00
Adrian Greeve 7e7715fb6b MDL-47796 mod_data: Fix display of group records.
When viewing entries as a teacher in separate group
mode, changing the group would result in random
entries being shown.
2014-10-29 13:52:29 +08:00
Jetha Chan 8744529ff6 MDL-47945 mod_forum: neighbour links at bottom of discussion 2014-10-29 13:46:46 +08:00
Damyon Wiese cf13ece570 Merge branch 'MDL-47898-master' of git://github.com/andrewnicols/moodle 2014-10-29 13:36:17 +08:00
Damyon Wiese e30a684a4b Merge branch 'master_MDL-33939' of https://github.com/danmarsden/moodle 2014-10-29 13:23:28 +08:00
Damyon Wiese 5bfca73e5d Merge branch 'wip-MDL-46517-master' of git://github.com/marinaglancy/moodle 2014-10-29 13:01:35 +08:00
Damyon Wiese d7c1945472 Merge branch 'wip-MDL-40343-master' of git://github.com/ds125v/moodle
Conflicts:
	mod/forum/styles.css
2014-10-29 12:53:21 +08:00
Andrea Bicciolo 087be6ca90 MDL-47201 Reports: Read from multiple log stores in outline report 2014-10-29 12:49:12 +08:00
Andrew Nicols 8271c89a94 MDL-47946 mod_forum: Correct strings in behat features
These are a regression from MDL-46215.
2014-10-29 12:01:41 +08:00
Andrew Nicols 0d7cb0f805 MDL-47930 mod_forum: Display all forum statuses correctly
It is possible for users with the mod/forum:managesubscriptions to
subscribe to forums with subscription disabled. This is handled by
forum_get_subscribe_link() already and should have been handled here all
along.
2014-10-29 11:52:54 +08:00
Damyon Wiese d9033c0e6d Merge branch 'MDL-47835_master' of git://github.com/dmonllao/moodle 2014-10-29 11:19:46 +08:00
David Monllao 3c26a30799 MDL-47835 block_recent_activity: Same entry keys order
insert_records() is sensitive to the order of the keys
assigned to the inserted objects (inserted as arrays in
this case). Now keys are assigned using the same order.
2014-10-29 10:54:11 +08:00
Marina Glancy a0ef87de1f MDL-46517 calendar: adjust display for DST
Thanks to Jo Matthews for providing a patch
2014-10-29 10:31:28 +08:00
Corey Wallis 91465b5095 MDL-46517 calendar: adjust dates for DST
Change-Id: I269382031e4ffa714396f3d9ce2315a5c96d929c
2014-10-29 10:31:28 +08:00
Damyon Wiese 4d0fe0ec94 Merge branch 'wip-MDL-36987-master' of git://github.com/marinaglancy/moodle 2014-10-29 10:20:47 +08:00
Petr Skoda 5aaac8b2d6 MDL-40949 admin: Fix $CFG->preventexecpath hints
This setting restricts all local paths, not just
executables.
2014-10-29 10:45:44 +13:00
Tim Hunt e3d3e1e652 MDL-47368 quiz editing: fix icon url generation. 2014-10-28 18:45:17 +00:00
Dan Poltawski 32a69a7d7a on-demand release 2.8beta+ 2014-10-28 12:32:50 +00:00
Dan Poltawski 3f80a7edce Merge branch 'install_master' of https://git.in.moodle.com/amosbot/moodle-install 2014-10-28 12:32:48 +00:00
Dan Poltawski ac3d43b6ec Merge branch 'MDL-47877-master' of git://github.com/andrewnicols/moodle 2014-10-28 12:25:27 +00:00
Dan Poltawski 08f289c617 MDL-47703 fix trailing whitespace 2014-10-28 12:21:30 +00:00
Dan Poltawski 31d6d2ae41 Merge branch 'MDL-47703-master' of git://github.com/FMCorz/moodle 2014-10-28 11:40:27 +00:00
Tim Hunt 08ab7a3c10 MDL-47368 core JS: dragdrop click move fills the dom with divs
Every time you click the move icon, it builds a new dialogue with a list
of drop targets, but it never discards the old ones. Not only does this
fill the DOM with junk, but it also causes Behat tests to fail, since
the old dialogues come first, and are hidden, but contain links with the
same text that you are trying to click.
2014-10-28 11:32:44 +00:00
Colin Chambers a69f81f0d3 MDL-47368 Edit quiz: page should not reload so often
The approach is that we have a new JavaScript function
M.mod_quiz.resource_toolbox.reorganise_edit_page which, after a ajax
action, fixes up everything like page breaks, page and question numbers,
that might now be wrong.

We call that function instead of reloading the page.

Also, there are a lot more Behat tests to verify this works correctly.

AMOS BEGIN
 MOV [joinpages,mod_quiz],[removepagebreak,mod_quiz]
 MOV [splitpages,mod_quiz],[addpagebreak,mod_quiz]
AMOS END
2014-10-28 11:32:42 +00:00
Marina Glancy b5478757c6 Merge branch 'MDL-47889-master' of git://github.com/FMCorz/moodle 2014-10-28 17:55:06 +08:00
Marina Glancy 001652d743 Merge branch 'wip-mdl-47850-m' of git://github.com/rajeshtaneja/moodle 2014-10-28 17:26:57 +08:00
Marina Glancy cc37a58d06 MDL-47919 tool_monitor: adjustments to behat tests 2014-10-28 17:17:00 +08:00
Andrew Nicols 7545e84661 MDL-47877 mod_forum: Correct subscription options for forums
Test was the wrong way around when checking subscription state.
2014-10-28 15:57:12 +08:00
Marina Glancy 45b7a397bb Merge branch 'MDL-46215-master-fixes' of git://github.com/andrewnicols/moodle 2014-10-28 15:37:05 +08:00
Pau Ferrer Ocaña 912296ad30 MDL-47227 admin: Fix user bulk selection over 1000 2014-10-28 08:34:01 +01:00
Andrew Nicols 79b4fb1282 MDL-46215 mod_forum: Only add text on discussion view
Do not show the status text in the thread list.
2014-10-28 14:27:05 +08:00
Frederic Massart d9e879e5d1 MDL-47889 tool_monitor: Test handles random DB ordering
On Oracle, the subscriptions are not ordered in the same way
than in other DB engines, so we do not rely on that ordering
any more in the test.
2014-10-28 13:52:45 +08:00
Andrew Nicols 1d8e8494bf MDL-47918 mod_forum: Unsubscribe all - remove discussion subscriptions 2014-10-28 13:29:51 +08:00
Rajesh Taneja b159589d9b MDL-47850 message_airnotifier: Fixed airnotifier web service url 2014-10-28 13:24:03 +08:00
Sam Hemelryk db310f7737 Merge branch 'MDL-47870-master2' of git://github.com/ankitagarwal/moodle 2014-10-28 17:27:09 +13:00
Marina Glancy 7d79115f3d Merge branch '47914-28' of git://github.com/samhemelryk/moodle 2014-10-28 12:23:33 +08:00
Marina Glancy f173ae2014 Merge branch 'MDL-814-master' of git://github.com/danpoltawski/moodle 2014-10-28 12:23:23 +08:00
Ankit Agarwal d71e42d7e8 MDL-47870 tool_monitor: Fix event select dropdown 2014-10-28 09:49:08 +05:30
Damyon Wiese c5258dfa04 MDL-47559 User menu: version bump for new settings 2014-10-28 11:06:40 +08:00
Sam Hemelryk 45ad1693cd MDL-47183 post-integration fixes
* Fixed typo with context_module::instance
* Fixed use of $mod->get_context()
2014-10-28 15:59:59 +13:00
Damyon Wiese 5baf74a327 Merge branch 'MDL-47559-master' of git://github.com/jethac/moodle 2014-10-28 09:59:04 +08:00
Sam Hemelryk 77b31ba2ce Merge branch 'MDL-47183-master' of git://github.com/andrewnicols/moodle 2014-10-28 14:02:19 +13:00
Sam Hemelryk fc8977fbca MDL-47914 report_stats: better handling of user and mode 2014-10-28 11:52:41 +13:00
Juan Leyva f47eeafdfd MDL-47916 web services: Fixed invalid returned value type 2014-10-27 23:14:13 +01:00
Marina Glancy 960bb64a2e MDL-47585 stats: fixed incorrect user dropdown 2014-10-28 10:51:02 +13:00
Ray Morris 9f56cc3794 MDL-47902 mod_scorm: Inappropriate default values for SCORM 1.3 variables 2014-10-27 15:06:42 -05:00
Dan Poltawski f3206dfc36 MDL-814 forum: provide cancel button when posting
This is the way to clear atto drafts
2014-10-27 16:44:47 +00:00
AMOS bot 86bd173927 Automatically generated installer lang files 2014-10-28 00:05:34 +08:00
Dan Poltawski b5780fbd18 Merge branch 'MDL-46215-master' of git://github.com/andrewnicols/moodle 2014-10-27 14:51:04 +00:00
Jetha Chan b865a3e2d1 MDL-47559 user_menu: customusermenu setting 2014-10-27 20:04:45 +08:00
Andrew Nicols d5653c6968 MDL-47898 mod_quiz: Correct path when checking content_editable
Addresses a number of issues when using the text editor in a quiz using
secure mode.
2014-10-27 19:23:56 +08:00
Adrian Greeve afc3431413 MDL-47647 lib: Fix message unit test failure.
Messaging unit tests on Windows were failing because
of a comparison between two file paths. Part of the
path would have a forward slash instead of a backslash
and so would fail.
2014-10-27 16:35:06 +08:00
Dan Poltawski 7c636855e2 Merge branch 'MDL-47839-master' of git://github.com/FMCorz/moodle 2014-10-27 08:01:33 +00:00
Frederic Massart f2823ec4bc MDL-47839 core_grades: Minor styling improvements to setup/user report 2014-10-27 15:59:21 +08:00
Dan Poltawski 77733e6b89 Merge branch 'wip-mdl-47676-m' of https://github.com/rajeshtaneja/moodle 2014-10-27 07:47:07 +00:00
Dan Poltawski a1ac634692 Merge branch 'MDL-47734-master-fixes' of git://github.com/andrewnicols/moodle 2014-10-27 07:40:06 +00:00
Rajesh Taneja d6040f0366 MDL-47676 core_grades: reset is hidden in menu, using proper step 2014-10-27 15:21:11 +08:00
Damyon Wiese 837862579e Merge branch 'm28_MDL-47210_IIS_PATH_INFO_Ignored_In_Required_Login_Pluginfile_Redirect' of https://github.com/scara/moodle 2014-10-27 13:58:15 +08:00
Frederic Massart 37fc69a019 MDL-47703 core_grades: Behat test for (non) aggregated scales 2014-10-27 13:00:58 +08:00
Andrew Nicols 517e17826b MDL-46215 mod_forum: Improve style of subscription state
With the implementation of per-discussion subscription, the current
discussion's subscription state must be shown.

Since this state belongs to the discussion rather than the forum, it
should be shown accordingly.  This change therefore includes the addition
of the discussion name as a heading on the page.
2014-10-27 12:37:05 +08:00
Dave Cooper d7f9acc46a MDL-47833 core: Change default expiry for message inbound handlers 2014-10-27 11:53:33 +08:00
Marina Glancy f2bec5d9ba Merge branch 'MDL-47850-master' of git://github.com/jleyva/moodle 2014-10-27 11:52:35 +08:00
Marina Glancy a8668e161a Merge branch 'MDL-47882_scorm_loadsco_invalid_html' of git://github.com/MorrisR2/moodle 2014-10-27 11:52:18 +08:00
Damyon Wiese ae0711d861 MDL-47690 Course: Remove unused variable from unit tests. 2014-10-27 11:26:35 +08:00
Frederic Massart 8b5c454562 MDL-47703 core_grades: Prevent use of weights with non-aggregated scales 2014-10-27 11:23:54 +08:00
Andrew Nicols 2af57bdbc5 MDL-47734 core: Do not set scrolltop on fixed dialogues
Fixed position dialogues use a different xy positioning than standard
dialogues so cannot use the scrollTop positioning method.
2014-10-27 11:22:30 +08:00
Damyon Wiese d2dbc373f8 Merge branch 'MDL-47690-master' of git://github.com/jleyva/moodle 2014-10-27 11:11:53 +08:00
Damyon Wiese 2b97417296 Merge branch 'wip-MDL-30358-master' of git://github.com/marinaglancy/moodle 2014-10-27 10:30:44 +08:00
Matteo Scaramuccia ce1cc198bb MDL-47210 Files API: IIS, PATH_INFO ignored in required login redirect. 2014-10-26 08:03:27 +01:00
Ray Morris a53bf3a031 MDL-47882 SCORM: invalid HTML in loadSCO.php 2014-10-24 16:45:32 -05:00
Dan Poltawski 42b6b39136 Merge branch 'MDL-46088-master' of git://github.com/timhunt/moodle 2014-10-24 17:10:56 +01:00
Dan Poltawski 8d1c5eceb3 Merge branch 'MDL-47545-master' of git://github.com/jleyva/moodle 2014-10-24 16:40:06 +01:00
Juan Leyva 3ca3d259e5 MDL-47545 web services: Allow cross origin requests for file downloads 2014-10-24 17:10:44 +02:00
Dan Poltawski cb1bc5eb6b Merge branch 'MDL-46712-master' of git://github.com/jethac/moodle 2014-10-24 15:37:26 +01:00
Dan Poltawski f6dbc2bb9c Merge branch 'MDL-47782-master' of git://github.com/lameze/moodle
Conflicts:
	admin/tool/monitor/lang/en/tool_monitor.php
2014-10-24 15:25:42 +01:00
Dan Poltawski 22ef599c5d Merge branch 'MDL-47780_master' of https://github.com/markn86/moodle 2014-10-24 15:19:48 +01:00
Dan Poltawski 519fd3dd4c Merge branch 'wip-MDL-47760-master' of git://github.com/marinaglancy/moodle 2014-10-24 15:18:32 +01:00
Dan Poltawski d6eff32be0 Merge branch '46518-28' of git://github.com/samhemelryk/moodle 2014-10-24 15:16:55 +01:00
Dan Poltawski 0b03353433 Merge branch 'MDL-47804' of git://github.com/aolley/moodle 2014-10-24 15:14:53 +01:00
Dan Poltawski 7638a4366f Merge branch '47608-28' of git://github.com/samhemelryk/moodle 2014-10-24 15:12:59 +01:00
Frederic Massart 20942dd702 MDL-47397 assignfeedback_editpdf: Copy stamps to other students in team
During a team submission the stamps were attached to the user that
was graded and not to the other users. This could lead to errors when
generating the PDF for each user.
2014-10-24 15:09:06 +01:00
Frederic Massart 47ff1cd93b MDL-47397 assignfeedback_editpdf: Tests use reliable way to annotate PDF
The drag and drop step did not work, so we moved to using the stamps
to annotate the PDF. They do not rely on drag&drop and produce the same
effects.
2014-10-24 15:09:06 +01:00
Frederic Massart aad194b19a MDL-47397 editor_atto: Properly close confirm dialogue in Behat test 2014-10-24 15:09:06 +01:00
Dan Poltawski e29ec53238 Merge branch 'MDL-47778_master' of https://github.com/markn86/moodle 2014-10-24 14:53:21 +01:00
Andrew Nicols 71bc139d63 MDL-47802 mod_forum: Check for required subscription capabilities
Users must be able to both view, and manage their subscription in order to
subscribe or be subscribed to a discussion.
2014-10-24 14:44:21 +01:00
Andrew Nicols 0603df04da MDL-47802 mod_forum: Include discussion subscriptions when moving
Check for both forum, and discussion subscriptions when moving a discussion
to a different forum.
2014-10-24 14:44:21 +01:00
Zachary Durber 5b2571547f MDL-47873 gradebook: Fix for missing override checkboxes. 2014-10-24 14:39:20 +01:00
Dan Poltawski 6c6375e438 Merge branch 'MDL-47866-master' of git://github.com/andrewnicols/moodle
Conflicts:
	version.php
2014-10-24 14:34:09 +01:00
Dan Poltawski 7dc62ed3cb Merge branch 'wip-MDL-47676-master' of git://github.com/abgreeve/moodle 2014-10-24 14:30:44 +01:00
Dan Poltawski 1429a25cd8 Merge branch 'MDL-47734-master' of git://github.com/andrewnicols/moodle 2014-10-24 14:13:59 +01:00
Dan Poltawski d63a81c507 on-demand release 2.8beta+ 2014-10-24 11:15:32 +01:00
Damyon Wiese 4bb46504ee Merge branch 'wip-MDL-47542-master' of git://github.com/marinaglancy/moodle 2014-10-24 11:49:19 +02:00
Marina Glancy 079b2e5202 MDL-47542 core_grades: action menu for grade setup 2014-10-24 11:49:19 +02:00
Marina Glancy 4ea3258af9 Merge branch 'MDL-47813-master' of git://github.com/xow/moodle 2014-10-24 11:49:18 +02:00
John Okely 4809376f13 MDL-47813 tool_monitor: Fix rule manager unit tests in oracle 2014-10-24 11:49:18 +02:00
Damyon Wiese 996de187a5 MDL-47704 Grades: Behat fix - dropped items have no contribution
We see "-" instead of "0.00 %"
2014-10-24 11:49:17 +02:00
Damyon Wiese d8e98c3178 Merge branch 'MDL-47637-master-fixup' of https://github.com/FMCorz/moodle 2014-10-24 11:49:17 +02:00
Marina Glancy 681276aad2 Merge branch 'MDL-47838-master-fix3' of https://github.com/damyon/moodle 2014-10-24 11:49:16 +02:00
Frederic Massart 2eb60f110d MDL-47637 core_grades: Remove extra credit field in outcome test 2014-10-24 11:49:16 +02:00
Andrew Nicols 504d0a1821 MDL-47513 theme_base: Fix grader report when blocks are docked 2014-10-24 11:49:15 +02:00
Damyon Wiese 0ce4642864 MDL-47838 gradereport_singleview: Reuse get_element_header instead of rolling our own.
This means the grade.php / index.php is kept in one place.
2014-10-24 11:49:15 +02:00
Marina Glancy c785cc9893 Merge branch 'MDL-47340-master' of git://github.com/jethac/moodle 2014-10-24 11:49:11 +02:00
Damyon Wiese d700fa463e Merge branch 'MDL-47838-master' of git://github.com/zbdd/moodle 2014-10-24 11:48:25 +02:00
Damyon Wiese 0b9635cba4 Merge branch '46499-28' of git://github.com/samhemelryk/moodle 2014-10-24 11:48:24 +02:00
Zachary Durber 237f76ce14 MDL-47838 gradebook: Singleview fix for invalid links. 2014-10-24 11:48:24 +02:00
Sam Hemelryk fad1a02d21 MDL-46332 fixed whitespace 2014-10-24 11:48:23 +02:00
Sam Hemelryk a1428d4be6 Merge branch 'MDL-46332-grouping-remove-button-master' of git://github.com/DanBennettUK/moodle 2014-10-24 11:48:23 +02:00
Sam Hemelryk 065448834c Merge branch 'wip-MDL-47757-master' of git://github.com/abgreeve/moodle 2014-10-24 11:48:22 +02:00
Sam Hemelryk fc91acc813 Merge branch 'MDL-47738-master' of git://github.com/FMCorz/moodle 2014-10-24 11:48:22 +02:00
Sam Hemelryk 614820522f Merge branch 'm28_MDL-47632' of https://github.com/totara/moodle 2014-10-24 11:48:21 +02:00
Sam Hemelryk 7117571c34 Merge branch 'MDL-47555' of https://github.com/rlorenzo/moodle 2014-10-24 11:48:21 +02:00
Sam Hemelryk 1e97569713 Merge branch 'wip_MDL-47795_master' of git://github.com/gjb2048/moodle 2014-10-24 11:48:20 +02:00
gdharris ee19ae694a MDL-46853 calendar: fix import of no duration events 2014-10-24 11:48:20 +02:00
Dan Poltawski 0255780b9c Merge branch 'MDL-47791' of git://github.com/timhunt/moodle 2014-10-24 11:48:19 +02:00
Dan Poltawski a5f9fc6be3 Merge branch 'MDL-47815-master' of git://github.com/damyon/moodle 2014-10-24 11:48:19 +02:00
Damyon Wiese 8112670d62 MDL-47815 assign: Fix random unit test fails
This test was failing when it was run really slowly (looking at you oracle).
2014-10-24 11:48:18 +02:00
Dan Poltawski ad968a36d6 Merge branch 'MDL-47847-master' of git://github.com/jleyva/moodle 2014-10-24 11:48:17 +02:00
Juan Leyva 938728739b MDL-47847 Web Services: Add messaging functions to the mobile service 2014-10-24 11:48:17 +02:00
Dan Poltawski 0ca7a4b75b Merge branch '47752-28' of git://github.com/samhemelryk/moodle 2014-10-24 11:48:16 +02:00
Dan Poltawski 3456ac3ba0 Merge branch '47684-28' of git://github.com/samhemelryk/moodle 2014-10-24 11:48:16 +02:00
Dan Poltawski 276af2a44d Merge branch 'MDL-47513-master' of git://github.com/andrewnicols/moodle 2014-10-24 11:48:15 +02:00
Dan Poltawski f335c9a1f1 Merge branch 'MDL-47637-master' of git://github.com/FMCorz/moodle 2014-10-24 11:48:15 +02:00
Dan Poltawski 4ade5b11b2 Merge branch 'MDL-47814-master' of git://github.com/FMCorz/moodle 2014-10-24 11:48:14 +02:00
Frederic Massart 3e5a4c9047 MDL-47814 core_grades: Improved coverage of user_graded event tests
The tests needed to use the API in order to trigger the user_graded
event that occurs when the course final grade has changed.
2014-10-24 11:48:14 +02:00
Dan Poltawski 4fdd69373b Merge branch 'MDL-47767-master' of git://github.com/xow/moodle 2014-10-24 11:48:13 +02:00
John Okely 6a6dd57c90 MDL-47767 tool_monitor: Use renderers for links between subscription and rule managers 2014-10-24 11:48:13 +02:00
Dan Poltawski fc533908b0 Merge branch 'MDL-20367-master' of git://github.com/damyon/moodle 2014-10-24 11:48:12 +02:00
John Okely 220602b7f0 MDL-47767 tool_monitor: Add links between subscribe and rule manager 2014-10-24 11:48:12 +02:00
Dan Poltawski 1153177851 Merge branch 'MDL-47499-master' of git://github.com/damyon/moodle 2014-10-24 11:48:11 +02:00
Marina Glancy 2a9bc5909d Merge branch 'MDL-47808-master' of git://github.com/andrewnicols/moodle 2014-10-24 11:48:11 +02:00
Marina Glancy bb030ebc2a Merge branch 'MDL-47689-master' of git://github.com/gurgus/moodle 2014-10-24 11:48:10 +02:00
Dave Cooper 368f0bf8f6 MDL-47689 user: Add duplicate field check to avoid oracle db error. 2014-10-24 11:48:10 +02:00
Marina Glancy c3b545a92a Merge branch 'wip-MDL-47675-master' of git://github.com/abgreeve/moodle 2014-10-24 11:48:09 +02:00
Marina Glancy 13c9e9c043 Merge branch 'MDL-47759-master' of git://github.com/ankitagarwal/moodle 2014-10-24 11:48:08 +02:00
Damyon Wiese 578d905ec0 Merge branch '47077-28' of git://github.com/samhemelryk/moodle 2014-10-24 11:48:08 +02:00
Frederic Massart 5dd0cb7bce MDL-47762 gradereport_user: Hide contribution and weights when relevant
The contribution and weight columns should be hidden when the course
total is because they can be used to compute the hidden course total.
2014-10-24 11:48:07 +02:00
Damyon Wiese 444ff60526 Merge branch 'MDL-47153_master' of https://github.com/markn86/moodle 2014-10-24 11:48:07 +02:00
Marina Glancy 3824556c9a Merge branch 'MDL-47704-master' of git://github.com/damyon/moodle 2014-10-24 11:48:06 +02:00
Marina Glancy 65504187d8 Merge branch 'MDL-47763-master' of git://github.com/damyon/moodle 2014-10-24 11:48:06 +02:00
Damyon Wiese 2c89eeeb8e Merge branch 'wip-MDL-43245-master-lang' of git://github.com/abgreeve/moodle 2014-10-24 11:48:05 +02:00
Damyon Wiese edffadfd1c MDL-47763 Grades: Handle the case when a grade category is hidden.
This was breaking the contribution column, which needs to know the
weights of all the categories up the tree, whether they are visible or
not.
2014-10-24 11:48:05 +02:00
Marina Glancy 1e3dc6ed9c Merge branch 'MDL-47836-master' of git://github.com/damyon/moodle 2014-10-24 11:48:04 +02:00
Adrian Greeve 780ff300a8 MDL-43245 mod_lesson: Add string for essay grading permission. 2014-10-24 11:48:04 +02:00
Marina Glancy b7840d4783 Merge branch 'MDL-47819-master' of git://github.com/jethac/moodle 2014-10-24 11:48:03 +02:00
Damyon Wiese f01972d95e MDL-47836 Grades: Fix the url for the upgraded grades warning page url. 2014-10-24 11:48:03 +02:00
Dan Poltawski ea4361b3a5 Merge branch 'MDL-47713-master-fix1' of http://github.com/damyon/moodle 2014-10-24 11:48:02 +02:00
Jetha Chan edcca18f8d MDL-47819 user_menu: fixed showing up in popups 2014-10-24 11:48:02 +02:00
Damyon Wiese bdb319a5b1 Merge branch 'MDL-47740' of git://github.com/timhunt/moodle 2014-10-24 11:48:01 +02:00
Damyon Wiese a7c37934cc MDL-47713 Grades: Fix new behat test after conversion from points to %
The contribution to course total column was changed from points to % but
this new test was submitted using points. It just needs the numbers converted
to %.
2014-10-24 11:48:01 +02:00
Damyon Wiese 721c6d397c Merge branch 'MDL-43245' of git://github.com/jmvedrine/moodle 2014-10-24 11:48:00 +02:00
Jean-Michel Vedrine 5fc6a9e77b MDL-43245 Lesson: non editing teacher cannot grade lesson essay 2014-10-24 11:48:00 +02:00
Dan Poltawski 7a811fb63a Merge branch 'MDL-47713-master' of git://github.com/damyon/moodle 2014-10-24 11:47:59 +02:00
Damyon Wiese 96ef037856 Merge branch 'MDL-32616' of git://github.com/timhunt/moodle 2014-10-24 11:47:59 +02:00
Eloy Lafuente (stronk7) e739fbcf27 Merge branch 'wip-MDL-47812-master2' of git://github.com/marinaglancy/moodle 2014-10-24 11:05:54 +02:00
Juan Leyva a7b572e29d MDL-47850 message_airnotifier: Incorrect Airnotifier Web Service URL 2014-10-24 10:40:06 +02:00
Juan Leyva e13c152e82 MDL-47690 web services: Fixed invalid return parameter type in mod_url 2014-10-24 09:54:35 +02:00
Simey Lameze 7bd88b0039 MDL-47782 tool_monitor: Added context column on rule management page.
AMOS BEGIN
CPY [context,message],[context,tool_monitor]
AMOS END
2014-10-24 15:41:45 +08:00
Marina Glancy d4a9e66130 MDL-47812 mod_lti: execute upgrade script for all DBs 2014-10-24 14:00:30 +08:00
Ankit Agarwal a8ea7cccce MDL-47805 tool_monitor: More info in adhoc task 2014-10-24 11:24:53 +05:30
Adam Olley 4ac478a3ed MDL-47804 events: calendar_event_updated needs to accept a timestart == 0 2014-10-24 15:34:30 +10:30
Andrew Nicols 107e82f6a6 MDL-47866 gradereport_grader: Remove border radius from cells 2014-10-24 11:54:56 +08:00
Mark Nelson 5e83b20527 MDL-47778 tool_monitor: changes made to get_user_courses_select()
The changes -

1) Ensure courses exist before we loop to avoid PHP warning.
2) Checked that the number of courses to display do not exceed the max setting.
3) Used format_string() instead of format_text().
4) Used the course context instead of system context.
2014-10-23 20:20:41 -07:00
Sam Hemelryk 00b568bd09 MDL-46332 fixed whitespace 2014-10-24 14:34:36 +13:00
Adrian Greeve 65e274d76f MDL-47676 core_grades: Behat test for negative weights. 2014-10-24 08:43:16 +08:00
Adrian Greeve cd5c7965e0 MDL-47676 core_grades: Negative positive weight combo working.
The combination of negative and positive weights was not normalising
properly.
2014-10-24 08:43:16 +08:00
Sam Hemelryk 68085f2bd5 Merge branch 'MDL-46332-grouping-remove-button-master' of git://github.com/DanBennettUK/moodle 2014-10-24 12:02:14 +13:00
Sam Hemelryk 29a3060265 Merge branch 'wip-MDL-47757-master' of git://github.com/abgreeve/moodle 2014-10-24 11:58:36 +13:00
Sam Hemelryk 124932d223 Merge branch 'MDL-47738-master' of git://github.com/FMCorz/moodle 2014-10-24 11:23:04 +13:00
Sam Hemelryk ef54717024 Merge branch 'm28_MDL-47632' of https://github.com/totara/moodle 2014-10-24 11:19:43 +13:00
Sam Hemelryk ec998f7487 Merge branch 'MDL-47555' of https://github.com/rlorenzo/moodle 2014-10-24 11:17:00 +13:00
Sam Hemelryk 18f1797517 Merge branch 'wip_MDL-47795_master' of git://github.com/gjb2048/moodle 2014-10-24 09:58:53 +13:00
gdharris 04f7dcebe4 MDL-46853 calendar: fix import of no duration events 2014-10-24 09:55:11 +13:00
Dan Poltawski 89df18c73d Merge branch 'MDL-47791' of git://github.com/timhunt/moodle 2014-10-23 17:30:28 +01:00
Dan Poltawski f01242a3b4 Merge branch 'MDL-47815-master' of git://github.com/damyon/moodle 2014-10-23 17:28:36 +01:00
Dan Poltawski a92008ed25 Merge branch 'MDL-47847-master' of git://github.com/jleyva/moodle 2014-10-23 16:35:50 +01:00
Dan Poltawski aed3a3430f Merge branch '47752-28' of git://github.com/samhemelryk/moodle 2014-10-23 16:31:24 +01:00
Dan Poltawski 9a3385cb2d Merge branch '47684-28' of git://github.com/samhemelryk/moodle 2014-10-23 16:31:08 +01:00
Dan Poltawski 25bd390b4b Merge branch 'MDL-47513-master' of git://github.com/andrewnicols/moodle 2014-10-23 16:17:49 +01:00
Dan Poltawski 7b57a751ae Merge branch 'MDL-47637-master' of git://github.com/FMCorz/moodle 2014-10-23 16:16:07 +01:00
Dan Poltawski 98122f9ad4 Merge branch 'MDL-47814-master' of git://github.com/FMCorz/moodle 2014-10-23 16:13:11 +01:00
Juan Leyva 0c5481e43d MDL-47847 Web Services: Add messaging functions to the mobile service 2014-10-23 15:24:07 +02:00
Dan Poltawski cd9f037e04 Merge branch 'MDL-47767-master' of git://github.com/xow/moodle 2014-10-23 10:50:01 +01:00
Dan Poltawski 7ea782ab3c Merge branch 'MDL-20367-master' of git://github.com/damyon/moodle 2014-10-23 10:41:58 +01:00
Dan Poltawski ec007900c0 Merge branch 'MDL-47499-master' of git://github.com/damyon/moodle 2014-10-23 10:19:53 +01:00
Juan Leyva 5e28991e78 MDL-47545 web services: Allow cross origin requests 2014-10-23 11:17:41 +02:00
Marina Glancy 36594faebb Merge branch 'MDL-47808-master' of git://github.com/andrewnicols/moodle 2014-10-23 17:16:44 +08:00
Marina Glancy aeeccb1697 Merge branch 'MDL-47689-master' of git://github.com/gurgus/moodle 2014-10-23 17:09:32 +08:00
Marina Glancy d129a0ffe9 Merge branch 'wip-MDL-47675-master' of git://github.com/abgreeve/moodle 2014-10-23 16:57:56 +08:00
Marina Glancy d3312bb6ac Merge branch 'MDL-47759-master' of git://github.com/ankitagarwal/moodle 2014-10-23 16:35:59 +08:00
Damyon Wiese 99cc87e913 Merge branch '47077-28' of git://github.com/samhemelryk/moodle 2014-10-23 16:09:29 +08:00
Frederic Massart 67ba66e1d2 MDL-47762 gradereport_user: Hide contribution and weights when relevant
The contribution and weight columns should be hidden when the course
total is because they can be used to compute the hidden course total.
2014-10-23 16:04:11 +08:00
Damyon Wiese 2fd07711e9 Merge branch 'MDL-47153_master' of https://github.com/markn86/moodle 2014-10-23 15:47:10 +08:00
Marina Glancy 05599c47cb Merge branch 'MDL-47704-master' of git://github.com/damyon/moodle 2014-10-23 15:45:54 +08:00
Marina Glancy 41d58f6f4c Merge branch 'MDL-47763-master' of git://github.com/damyon/moodle 2014-10-23 15:42:46 +08:00
Damyon Wiese 3a3fe4bf37 Merge branch 'wip-MDL-43245-master-lang' of git://github.com/abgreeve/moodle 2014-10-23 15:38:35 +08:00
Marina Glancy 653f6c23cb Merge branch 'MDL-47836-master' of git://github.com/damyon/moodle 2014-10-23 15:23:52 +08:00
Marina Glancy 18ebeed5e9 Merge branch 'MDL-47819-master' of git://github.com/jethac/moodle 2014-10-23 15:21:28 +08:00
Dan Poltawski bcd015bea6 Merge branch 'MDL-47713-master-fix1' of http://github.com/damyon/moodle 2014-10-23 08:18:31 +01:00
Dave Cooper 17472f57b9 MDL-47689 user: Add duplicate field check to avoid oracle db error. 2014-10-23 15:10:31 +08:00
Adrian Greeve 1785e49f26 MDL-43245 mod_lesson: Add string for essay grading permission. 2014-10-23 15:05:32 +08:00
Andrew Nicols d247a50113 MDL-47734 core: Prevent jumping of YUI dialogues
When a YUI dialogue was opened, it was focusing on the boundingBox, with
the browser moving the scroll position to focus on the top of the
boundingBox. This caused a jump. This only happens when the dialogue is
modal and consequentially has a maskNode present as it changes the initial
positioning behaviour of the boundingBox.

To avoid this, when the maskNode is shown, the dialogue is position at 0,0
in the current viewport. For centered dialogues, the dialogue is
automatically re-positioned after the window has shown. For non-centered
dialogues, the original position is stored and the dialogue is restored to
that position after it has been displayed.

This should not interfere with use of the align function as this will be
called later in the proceedings, after the show has run.
2014-10-23 14:44:14 +08:00
Damyon Wiese 99e455c7ea Merge branch 'MDL-47740' of git://github.com/timhunt/moodle 2014-10-23 14:24:47 +08:00
Damyon Wiese 54420a98b1 Merge branch 'MDL-43245' of git://github.com/jmvedrine/moodle 2014-10-23 13:52:15 +08:00
Damyon Wiese ed60e0eac5 MDL-47713 Grades: Fix new behat test after conversion from points to %
The contribution to course total column was changed from points to % but
this new test was submitted using points. It just needs the numbers converted
to %.
2014-10-23 13:37:24 +08:00
Damyon Wiese f9c90d8751 MDL-47763 Grades: Handle the case when a grade category is hidden.
This was breaking the contribution column, which needs to know the
weights of all the categories up the tree, whether they are visible or
not.
2014-10-23 13:26:40 +08:00
Damyon Wiese 79bf093ee2 Merge branch 'MDL-32616' of git://github.com/timhunt/moodle 2014-10-23 12:02:22 +08:00
Jetha Chan beb7456e3e MDL-47819 user_menu: fixed showing up in popups 2014-10-23 11:58:11 +08:00
Damyon Wiese f3d7cdffda MDL-47836 Grades: Fix the url for the upgraded grades warning page url. 2014-10-23 11:31:55 +08:00
Andrew Nicols 4a8c380abb MDL-47513 Fix RTL issues with grade report 2014-10-23 11:15:35 +08:00
John Okely 66f5e82b66 MDL-47767 tool_monitor: Use renderers for links between subscription and rule managers 2014-10-23 10:33:15 +08:00
John Okely 0cafac69f2 MDL-47767 tool_monitor: Add links between subscribe and rule manager 2014-10-23 10:33:15 +08:00
Andrew Nicols 555837c5d4 MDL-47808 mod_forum: Correct maxeditingtime for unit tests
The maxeditingtime needs to be a negative value for unit tests to ensure
that the messages are actually sent out.

Whilst fixing this I also discovered that the create_discussion part of the
generator also creates the first post.
2014-10-23 08:43:29 +08:00
Jean-Michel Vedrine d3c4d50f1f MDL-43245 Lesson: non editing teacher cannot grade lesson essay 2014-10-22 18:00:49 +02:00
Dan Poltawski e6afd45f96 Merge branch 'MDL-47713-master' of git://github.com/damyon/moodle 2014-10-22 10:49:07 +01:00
Frederic Massart 40a603c79d MDL-47814 core_grades: Improved coverage of user_graded event tests
The tests needed to use the API in order to trigger the user_graded
event that occurs when the course final grade has changed.
2014-10-22 16:53:16 +08:00
Damyon Wiese d1020cd5d4 MDL-47815 assign: Fix random unit test fails
This test was failing when it was run really slowly (looking at you oracle).
2014-10-22 16:49:00 +08:00
Damyon Wiese b0c5a9c491 MDL-47713 Grades: Update all the behat tests to use % in contribution column 2014-10-22 16:20:15 +08:00
Damyon Wiese 8950e7f535 on-demand release 2.8beta+ 2014-10-22 15:06:37 +08:00
Damyon Wiese 6a196cf14d NOBUG: Fixed file access permissions 2014-10-22 15:06:36 +08:00
Damyon Wiese 2746fbe47c Merge branch 'install_master' of https://git.in.moodle.com/amosbot/moodle-install 2014-10-22 15:06:33 +08:00
Frederic Massart 6aeebc259a MDL-47637 core_grades: Outcomes must not be weighted when non aggregated 2014-10-22 14:58:17 +08:00
Damyon Wiese 718f179c22 Merge branch 'MDL-47706-master' of git://github.com/andrewnicols/moodle 2014-10-22 14:50:53 +08:00
Marina Glancy fca97cbec4 MDL-47673 grades: unittest change caused by generator change
Unit test was introduced in MDL-40697 when the generator for quiz activity was setting grade=0
2014-10-22 14:14:49 +08:00
Andrew Nicols bedcf338dc MDL-47706 gradebook: Update pageload time between changes
Since MDL-38732 we reject changes if another change has been made more
recently. As a result, if process_data is called, and then we roll into the
next millisecond period before process_data is called again, the change is
rejected.

Different errors were seen because the millisecond rollover occurred at
different time within the test.

Different error conditions were seen because not all of the tests check for
an error from the call to process_data(), instead just checking that the
value had been updated correctly.
2014-10-22 12:56:07 +08:00
Russell Smith 34f5a2bc4f MDL-47806: Add footer function for command line output. 2014-10-22 14:32:15 +11:00
Damyon Wiese 7a61e645c3 MDL-46527 Grades: Webservice only returns first activity grade. 2014-10-22 11:21:51 +08:00
Damyon Wiese 53f26095c6 Merge branch 'MDL-46527-master' of git://github.com/jleyva/moodle 2014-10-22 10:45:57 +08:00
Mark Nelson 8a0c649637 MDL-47153 tool_monitor: altered unit tests to pass 2014-10-21 16:00:26 -07:00
Mark Nelson 11c2bf3f73 MDL-47153 tool_monitor: added subscription_criteria_met event 2014-10-21 16:00:18 -07:00
Mark Nelson 1adb0031c0 MDL-47153 tool_monitor: added subscription_deleted event 2014-10-21 15:48:10 -07:00
Mark Nelson 229f841907 MDL-47153 tool_monitor: added subscription_created event 2014-10-21 15:48:10 -07:00
Mark Nelson 91df5f7e37 MDL-47153 tool_monitor: added rule_deleted event 2014-10-21 15:48:09 -07:00
Mark Nelson 12b9969ef9 MDL-47153 tool_monitor: added rule_updated event 2014-10-21 15:48:09 -07:00
Mark Nelson e9da23369f MDL-47153 tool_monitor: added rule_created event 2014-10-21 14:19:16 -07:00
AMOS bot e15766c19c Automatically generated installer lang files 2014-10-22 00:07:37 +08:00
Gareth J Barnard a024eaa5fc MDL-47795 SCORM: SCORM report not a report. 2014-10-21 15:37:31 +01:00
Tim Hunt cda62a3829 MDL-47791 question editing: remove permission info from above the form
This information is not really meaningful for users, and takes up prime
real-estate, so we are removing it.
2014-10-21 15:03:20 +01:00
Tim Hunt a8de866712 MDL-47740 question engine: let qs update variant later if appropriate
Variant has two purposes. First to determine which version of the
question the student will see. Hence it is used to set up the state
of the quetsion when the question is started. Then the internal state of
the question is saved in the first step.

Once that has been done, the variant number is purely informative, and
just used to break down the statistics.

In some cases (the one I have in mind is qtype_opaque) then there is a
complex randomisation process, which may lead to several inital variant
numbers acutally giving the same version of the question. In this case
it is nice if the question can update the stored variant number, to make
the statistics more meaningful.
2014-10-21 11:43:57 +01:00
Juan Leyva a7888487f0 MDL-46527 grades: grade_get_grades external function rewritten 2014-10-21 12:10:01 +02:00
Mark Nelson 6c271ab5e6 MDL-47780 core: corrected docs for get_user_capability_course() 2014-10-21 00:52:54 -07:00
Marina Glancy b1b66a3d12 Merge branch 'MDL-47736_master_fix2' of git://github.com/markn86/moodle 2014-10-21 15:49:10 +08:00
Mark Nelson 7b62567e85 MDL-47736 editor_atto: added fix for IE 9 and 10 2014-10-21 00:46:35 -07:00
Marina Glancy fb32a64efc Merge branch 'MDL-47736_master_fix' of git://github.com/markn86/moodle 2014-10-21 14:34:05 +08:00
Mark Nelson 3c15d25bcf MDL-47736 editor_atto: exclude <br> from being restored 2014-10-20 23:24:08 -07:00
Damyon Wiese fc9150cb0e MDL-47713 Grades: Change contribution column to a percent of grademax 2014-10-21 13:50:18 +08:00
Damyon Wiese a6396272f8 Merge branch 'wip_MDL-41593_m28_preventexecdefault' of https://github.com/skodak/moodle 2014-10-21 13:11:27 +08:00
Marina Glancy e94925ddd2 Merge branch 'MDL-47728_master' of git://github.com/markn86/moodle 2014-10-21 11:56:31 +08:00
Yuliya Bozhko 1f258cd8ce MDL-47755 badges: Fix internal message output
Signed-off-by: Yuliya Bozhko <yuliya.bozhko@totaralms.com>
2014-10-21 16:25:13 +13:00
Damyon Wiese a9a02e9170 MDL-20367 Grades: Allow real numbers as grade boundaries
Patch by Huy Hoang (I just git-ified it).
2014-10-21 11:15:39 +08:00
Marina Glancy 8b2d85406a Merge branch 'MDL-47400-master-2' of git://github.com/andrewnicols/moodle 2014-10-21 10:55:54 +08:00
Andrew Nicols 82e3440aec MDL-47400 gradereport_history: Fix string notempty test for Oracle 2014-10-21 10:48:28 +08:00
Sam Hemelryk 56f9e921f4 MDL-46133 tool_monitor: version bump for events 2014-10-21 15:22:10 +13:00
Sam Hemelryk 258d9af845 Merge branch 'm28_MDL-36669_UFO_references_in_filelib' of https://github.com/scara/moodle 2014-10-21 15:17:53 +13:00
Sam Hemelryk 7a126c94a4 Merge branch 'MDL-47739-master' of git://github.com/FMCorz/moodle 2014-10-21 14:44:01 +13:00
Sam Hemelryk 28f1bd0106 Merge branch 'MDL-47695' of git://github.com/timhunt/moodle 2014-10-21 14:42:36 +13:00
Sam Hemelryk 263f8cff7e Merge branch 'MDL-46133_master' of https://github.com/markn86/moodle 2014-10-21 14:39:34 +13:00
Matteo Scaramuccia 8045696b37 MDL-36669 Filters: Remove the last ref to the UFO library. 2014-10-20 23:17:50 +02:00
Dan Poltawski 96b1223387 Merge branch 'MDL-38172' of git://github.com/jmvedrine/moodle 2014-10-20 18:28:44 +01:00
Dan Poltawski 83b49754d3 Merge branch 'MDL-47400-master' of git://github.com/andrewnicols/moodle 2014-10-20 18:12:38 +01:00
Dan Poltawski cf3fbf8a0e Merge branch 'MDL-47664-master' of git://github.com/andrewnicols/moodle 2014-10-20 17:49:02 +01:00
Dan Poltawski 6c75bcb5d6 Merge branch 'MDL-47651' of git://github.com/timhunt/moodle 2014-10-20 17:44:33 +01:00
Dan Poltawski fb45249754 Merge branch 'MDL-47666' of git://github.com/timhunt/moodle 2014-10-20 17:31:20 +01:00
Dan Poltawski 6366cc0774 Merge branch 'MDL-47711' of git://github.com/timhunt/moodle 2014-10-20 17:28:50 +01:00
Dan Poltawski 30fac84578 Merge branch 'MDL-47726' of git://github.com/timhunt/moodle 2014-10-20 17:26:36 +01:00
Dan Poltawski 670b0d0283 Merge branch 'MDL-47691' of git://github.com/timhunt/moodle 2014-10-20 17:24:22 +01:00
Dan Poltawski 22c4db3ede Merge branch 'MDL-47673' of git://github.com/timhunt/moodle 2014-10-20 17:20:26 +01:00
Tim Hunt a3d5068083 MDL-47726 availability: fix tests when there is a text custom field
This unit tests assumed that on a fresh install, there were no custom
user-profile fields. Given some third-party plugins, that assumption is
false.
2014-10-20 16:15:34 +01:00
Tim Hunt 97ef7ea2ce MDL-47695 quiz editing: descritions don't have a max mark!
So don't show the UI for editing it.

Also, don't show non-functional page split/join icons after the quiz has
been attempted.
2014-10-20 15:30:35 +01:00
Dan Poltawski 11c6debb0a Merge branch 'MDL-47588' of git://github.com/timhunt/moodle 2014-10-20 14:30:46 +01:00
Tim Hunt d69a6ad965 MDL-47711 behat: make it easier to copy the init.php command. 2014-10-20 12:11:28 +01:00
Tim Hunt 1c2e05c060 MDL-47691 quiz: only warn re overdue attempts if a Q has been answered
If a quiz is set to have a grace period when time has expired, we only
email studnets to warn them about their overdue attempt if they have put
in an answer to at least one question that is worth some marks.
2014-10-20 12:11:10 +01:00
Tim Hunt 0233e2a973 MDL-47673 quiz generator: default grade 100 & fix review options
The review option defaults need to be like what you get from the editing
form, no what is stored in the database, or they don't work!
2014-10-20 12:11:01 +01:00
Tim Hunt a20d675250 MDL-47666 DB auth & enrol: unit tests fail with custom DB drivers
Changed to used $DB->get_db_family, rather than hard-coding the list of
class names.
2014-10-20 12:10:52 +01:00
Tim Hunt a40eaaa28f MDL-47651 quiz responses: allow for qtypes without responses 2014-10-20 12:10:43 +01:00
Tim Hunt 6f336f3602 MDL-47588 question behat tests: don't close the preview window.
If you do. Chrome + Selenium2 gets stuck (on Windows at least). Selenium
must be trying to send commands ot a window that does not exist any
more.
2014-10-20 12:10:15 +01:00
Tim Hunt a92105fd3f MDL-47588 behat: fix switching back to the main window in Chrome
This fix is mostly based on what Colin Chambers found out. This commit
is a simplification of his work.

The problem is that the Chrome / Selenium 2 integration cannot swich to
a window with a blank name. The work-around applied here is, when we
switch away from an unnamed window, we set a name on it. Then we can use
that name to switch back.
2014-10-20 12:10:14 +01:00
Tim Hunt cf256c05d8 MDL-32616 question engine: set_max_mark_in_attempts MySQL perf
The MySQL (& Maria DB) query 'optimizer' was failing to handle this
query, so for that DB only, we give it an equivalent query that it can
get right.

With unit test.
2014-10-20 12:06:39 +01:00
Tim Hunt 7ad0e2e654 MDL-32616 question engine: move unit test to better name 2014-10-20 12:06:38 +01:00
Jetha Chan 6287692843 MDL-47340 action_menu: selector, RTL, consistency fixes 2014-10-20 17:09:16 +08:00
Marina Glancy 2d2661e3d7 Merge branch 'MDL-47503-master' of git://github.com/damyon/moodle 2014-10-20 17:08:20 +08:00
Marina Glancy 24c11785b3 Merge branch 'wip_MDL-47754_m28_installredir' of git://github.com/skodak/moodle 2014-10-20 17:02:28 +08:00
Dan Bennett f181e4ac45 MDL-46332 : Display of 'Remove' button in Add/Remove Groups in Grouping
Fixed styling of Add/Remove Groups in Grouping to now use the same
layout as the Group Members page.
This fixes the issue with buttons being unaligned and introduces
consistency between pages.
2014-10-20 09:48:50 +01:00
Ankit Agarwal 5875e287a5 MDL-47759 tool_monitor: Fix permissions issue 2014-10-20 13:45:51 +05:30
Damyon Wiese eafab79941 MDL-47503 Grades: Display the notice about upgraded grades on all grade report pages.
Moved this to the print_grade_page_head function and added an access check so it only
displays for teachers.
2014-10-20 16:15:51 +08:00
Andrew Nicols a07ec4565f MDL-47400 gradereport_history: Ensure float precision is enforced
Format floats according to the grade item config.
2014-10-20 15:42:31 +08:00
Marina Glancy f75f2ecdf4 Merge branch 'MDL-47489-master' of git://github.com/FMCorz/moodle 2014-10-20 15:19:57 +08:00
Marina Glancy d90f0cab6d Merge branch 'MDL-47736_master' of git://github.com/markn86/moodle 2014-10-20 15:06:43 +08:00
Marina Glancy 1d67a8f209 Merge branch 'MDL-47725-master' of git://github.com/FMCorz/moodle 2014-10-20 15:06:29 +08:00
Adrian Greeve c42d18183a MDL-47675 phpunit: Update unit tests to pass on MSSQL
Unit tests were failing on MSSQL. gc_collect_cycles() was
removed from the phpunit utils.php file to save time in running
the tests, but MSSQL doesn't clean up open files as well as
other databases.

This patch includes the garbage collection for the unit tests
that require it.
2014-10-20 14:26:11 +08:00
Frederic Massart 263bf1a10f MDL-47725 gradereport_user: Only hide grades when they were altered
The method blank_hidden_total_and_adjust_bounds() now checks for more
than just a grade change, and in that cause would hide the grade. We
added a condition to only hide the grade when it effectively changed,
not when its other properties have.
2014-10-20 14:19:02 +08:00
Marina Glancy b3729c99aa Merge branch 'MDL-38065-fix-master' of git://github.com/jmarthaler/moodle 2014-10-20 14:08:06 +08:00
Marina Glancy 82c662d347 MDL-47760 grades: dim category name if hidden 2014-10-20 14:02:25 +08:00
Frederic Massart 40f874ce29 MDL-47489 core_grades: Behat tests covering contributions with extra credit 2014-10-20 13:52:18 +08:00
Frederic Massart 8427dc3a23 MDL-47489 core_grades: Adjust weights of extra credit items for Simple 2014-10-20 13:52:18 +08:00
Frederic Massart e8ac04c191 MDL-47489 core_grades: Adjust weights of extra credit items for Mean 2014-10-20 13:52:17 +08:00
Mark Nelson e924e1b33a MDL-47736 editor_atto: only save/restore draft when necessary 2014-10-19 22:14:15 -07:00
Marina Glancy c57681ed49 Merge branch 'MDL-47737-master' of git://github.com/FMCorz/moodle 2014-10-20 12:43:52 +08:00
Damyon Wiese 47d6e6a7d3 MDL-47503 Grades: Completely remove aggregationsubcats
This setting is not compatible with combinations of aggregation methods
and the ways in which it does and does not work are not documented. It
was voted to remove it completely by the gradebook workshop, so I have
completely removed it and added a warning for all affected courses + restored
backups.
2014-10-20 12:03:18 +08:00
Frederic Massart 86974893c8 MDL-47489 core_grades: Adjust weights of extra credit items for Natural 2014-10-20 11:50:43 +08:00
Frederic Massart 74d0ca1543 MDL-47739 form: Calendar widget causes unintentional focus and scroll 2014-10-20 10:55:49 +08:00
Adrian Greeve 3275892c03 MDL-47757 events: Fixed doc block and missing string.
The language events were missing the @since tag and
the grade single view report was missing a language
string.
2014-10-20 09:55:09 +08:00
Mark Nelson 4afd26a618 MDL-47735 mod_forum: added 'My profile' -> 'Forum posts' behat test 2014-10-19 18:44:22 -07:00
Petr Skoda f1cac3d515 MDL-47754 install: fix redirect loop 2014-10-20 12:52:35 +13:00
Sam Hemelryk 5c28d15985 MDL-46518 navigation: site glossaries now expand properly 2014-10-20 11:18:36 +13:00
Sam Hemelryk c1db791e98 MDL-47608 cachestore_mongo: fixed unit test error
If you configured your site to run mongo unit tests and had
the mongo extension and backend installed but did not have the
mongo service running you would get a fatal error when running
the unit tests.
That problem has been fixed by checking the mongo test instance
is ready before returning it.
2014-10-20 11:03:57 +13:00
Sam Hemelryk d5ae34a5a7 MDL-47077 report_participation: fixed pagination in groups 2014-10-20 11:01:04 +13:00
Sam Hemelryk 30aca4a74b MDL-46499 navigation: better enrolled course limit
We now user $CFG->navcourselimit to limit the number of
courses shown in the navigation when browsing another users
full profile. Previously it showed all courses which caused
some slowdown.
2014-10-20 10:58:40 +13:00
Sam Hemelryk ed7605f481 MDL-47752 grading: fixed bugs with the modgrade element 2014-10-20 10:32:13 +13:00
Sam Hemelryk d28e0a2f76 MDL-47684 mod: better validation of rating options 2014-10-20 08:44:35 +13:00
Mark Nelson 0b0a08e7b0 MDL-47728 tool_monitor: added capability check before displaying link 2014-10-18 20:15:35 -07:00
Jean-Michel Vedrine 814e381a47 MDL-29873 Lesson: Essays not shown on grade page with SQL server 2014-10-18 19:40:20 +02:00
Mark Nelson c62ba9b8ca MDL-47735 core: prevented iteration of 'groupmembersonly'
The course module variable 'groupmembersonly' was removed in 2.8.
2014-10-17 18:23:35 -07:00
Jean-Michel Vedrine 28928667a0 MDL-38172 Lesson: Additional Info not displayed at end of lesson 2014-10-17 17:04:57 +02:00
Dan Poltawski b49de5d930 on-demand release 2.8beta+ 2014-10-17 16:02:28 +01:00
Dan Poltawski cd2cfb5783 Merge branch 'MDL-47363' of git://github.com/marinaglancy/moodle 2014-10-17 14:46:30 +01:00
Dan Poltawski 9f67037a5f on-demand release 2.8beta+ 2014-10-17 14:32:19 +01:00
Dan Poltawski 624926e42c NOBUG: Fixed file access permissions 2014-10-17 14:32:19 +01:00
Dan Poltawski f6aaa184ab Revert "MDL-47684 mod: better validation of rating options"
This reverts commit 8028df293a.
2014-10-17 14:27:49 +01:00
Frederic Massart 53cca2274e MDL-47737 editor_atto: Prevent false negative when saving draft on IE9 2014-10-17 20:48:43 +08:00
Frederic Massart 2ccbcf0169 MDL-47738 gradereport_history: User selector handles broke with 0 user
It was impossible to reopen the dialogue when the last search result
did not return any user.
2014-10-17 19:34:16 +08:00
Dan Poltawski 9b4a87f7e6 Merge branch 'MDL-47733-master' of git://github.com/FMCorz/moodle 2014-10-17 11:44:58 +01:00
Frederic Massart 5aafc6f425 MDL-47733 editor_atto: Do not prompt error when draft is empty 2014-10-17 18:19:11 +08:00
Dan Poltawski bef6e88b5d Merge branch 'MDL-45843-master-fix1' of http://github.com/damyon/moodle 2014-10-17 09:34:39 +01:00
Dan Poltawski e435f174d3 Revert "MDL-44548 mod_scorm: force an external sync to check for updated files."
This reverts commit 2d9a4a5f93.
2014-10-17 09:30:38 +01:00
Damyon Wiese 7c2977bc5b MDL-45843 LTI: Fixes for sloppy form handling 2014-10-17 16:24:26 +08:00
Eloy Lafuente (stronk7) d8e909dc10 Merge branch 'MDL-47655-master-fix1' of git://github.com/damyon/moodle 2014-10-17 09:37:55 +02:00
Marina Glancy a96ca70064 MDL-47290 Grades: added bold for course total 2014-10-17 15:22:32 +08:00
Barbara Ramiro 0947172dba MDL-47290 Grades: Minified CSS and applied coding style standards 2014-10-17 15:03:53 +08:00
Barbara Ramiro 601af6666d MDL-47290 Grades: Style for the Single view table 2014-10-17 15:01:20 +08:00
Barbara Ramiro d70e86b1bd MDL-47363 Grades: Style for the Setup grades 2014-10-17 14:59:09 +08:00
Barbara Ramiro 2c7a86eb7f MDL-47363 Grades: Style for the User report 2014-10-17 14:56:31 +08:00
Andrew Nicols 3fa0daa90f MDL-47664 phpunit: Do not use sequence number changes for Oracle
When resetting a sequence number, we call change_database_structure()
which in turns clears the MUC cache for databasemeta. This cache contains
information about the table, columns, etc.

After the cache is cleared, it must be re-filled, and it was discovered
that the get_columns() code which fills this cache can take a particularly
long time. Given that this is called for every table in Moodle, this can
add up to a significant period, and this is done on a per-testsuite basis.

On my SSD install this was taking approximately 40 seconds on each re-fill
of the cache.
2014-10-17 13:28:46 +08:00
Marina Glancy 3279fe928f MDL-18229 gradebook: missing 'use' in singleview 2014-10-17 12:25:44 +08:00
Zachary Durber f86233a41e MDL-18229 gradebook: Fixes for Singleview behat tests. 2014-10-17 11:56:39 +08:00
Mark Nelson 154423f6fb MDL-46133 tool_monitor: added unit tests 2014-10-16 20:42:38 -07:00
Mark Nelson ad6f25cd8e MDL-46133 tool_monitor: added event cleanup task 2014-10-16 20:42:25 -07:00
Jon Marthaler a4bd536688 MDL-38065 gradebook: Fix issue with hidden categories breaking rowspan.
Hidden subcategories break the rowspan in the gradebook; this fix corrects
the calculation of the rowspan.
2014-10-16 22:27:52 -05:00
Zachary Durber f548d49f01 MDL-18229 gradebook: Sesskey required for all actions. 2014-10-17 10:51:45 +08:00
Damyon Wiese 821ce4d63b MDL-47655 assign: Fix unit tests triggering debugging
Test was triggering notifications - so needs to use a message sink.
2014-10-17 09:45:02 +08:00
Zachary Durber 900944385d MDL-18229 gradebook: Fix for min/max grades and large numbers. 2014-10-17 09:40:01 +08:00
Dan Poltawski e2270952c5 Merge branch 'MDL-46599-master' of git://github.com/lameze/moodle 2014-10-16 17:30:27 +01:00
Dan Poltawski f931c9245e Merge branch 'MDL-47681-master' of git://github.com/FMCorz/moodle 2014-10-16 15:14:20 +01:00
Dan Poltawski 5763316186 Merge branch '47631-28' of git://github.com/samhemelryk/moodle 2014-10-16 15:02:24 +01:00
Dan Poltawski 73f94e88ff MDL-18229 gradereport_singleview: missing MOODLE_INTERNAL 2014-10-16 13:58:37 +01:00
Dan Poltawski 992159f450 MDL-18229 grade report: coding style fixes
global definitions must be at the top of functions.
2014-10-16 13:49:44 +01:00
Dan Poltawski d65eefdbf1 Merge branch 'MDL-18229-master' of git://github.com/zbdd/moodle 2014-10-16 13:44:48 +01:00
Dan Poltawski 01c3b4c50b Merge branch 'MDL-47564-master' of https://github.com/sammarshallou/moodle 2014-10-16 11:50:38 +01:00
Dan Poltawski afb5161f37 Merge branch 'master_MDL-44548' of https://github.com/danmarsden/moodle 2014-10-16 11:45:22 +01:00
Frederic Massart f8c8f980c7 MDL-47681 core_grades: Ignore weights of grade items 'none' or 'text'
It can happen that some grade items with the type 'None' have a max
grade different than 0, in which case we would have set a weight for
them which is wrong as they must not have any. This patch always
ignores the grade items 'None' and 'Text' when calculating the
weights and locks the weight UI fields for those items too.
2014-10-16 18:42:27 +08:00
Dan Poltawski 799190cd2d Merge branch 'MDL-47710' of git://github.com/timhunt/moodle 2014-10-16 11:35:19 +01:00
Marina Glancy c74ec3e619 MDL-36987 auth_manual: fix config for field locking
Thanks to Sergey for the patch
2014-10-16 18:16:50 +08:00
Dan Poltawski 7829a6d1ca Merge branch 'MDL-47392-master' of git://github.com/xow/moodle 2014-10-16 11:12:01 +01:00
Dan Poltawski 50c4e8e8b6 Merge branch 'MDL-47696' of https://github.com/willylee/moodle 2014-10-16 11:07:27 +01:00
Dan Poltawski 3370412306 Merge branch '47684-28' of git://github.com/samhemelryk/moodle 2014-10-16 11:02:03 +01:00
Tim Hunt 9abf2d1417 MDL-47710 qformat_gift: fix bahat fails due to different ids in exports 2014-10-16 11:00:32 +01:00
Dan Poltawski 5708376927 Merge branch 'MDL-47655-master' of git://github.com/damyon/moodle 2014-10-16 10:57:06 +01:00
Dan Poltawski 62b5979cb1 Merge branch 'MDL-47657-master' of git://github.com/gurgus/moodle 2014-10-16 10:52:40 +01:00
Dan Poltawski 42da111dbe Merge branch 'MDL-47707-master' of git://github.com/gurgus/moodle 2014-10-16 10:43:52 +01:00
Dan Poltawski bb48e33fda Merge branch 'MDL-47686-master' of git://github.com/damyon/moodle 2014-10-16 10:39:12 +01:00
Damyon Wiese ba0d27735a MDL-47704 Grades: Fix for set_usedinaggregation
Used in aggregation was not resetting previously set values
when recalculating an aggregation. This meant that items no longer
in the aggregation, were displayed with stale weights in the user report.
2014-10-16 17:14:02 +08:00
Dan Poltawski 387cb9586e Merge branch 'MDL-47576-master-fixup' of https://github.com/jethac/moodle 2014-10-16 10:03:08 +01:00
Dave Cooper b0001c15f2 MDL-47707 tool_monitor: Changed navigation position of event monitor.
This issue is part of the MDL-45758 epic.
2014-10-16 16:50:11 +08:00
Jetha Chan 8ef43cfde6 MDL-47576 user_menu: theme_base fixes 2014-10-16 16:18:38 +08:00
John Okely 044a298e6f MDL-47392 core_grades: Consolidate grade item weight setting location 2014-10-16 15:21:53 +08:00
Damyon Wiese 973840f7d5 MDL-47575 Whitespace fix. 2014-10-16 15:20:07 +08:00
Damyon Wiese 3fa81fabc3 Merge branch 'MDL-47575-master' of git://github.com/zbdd/moodle 2014-10-16 14:49:49 +08:00
Damyon Wiese bd71cb83df MDL-45758 Event monitor: Improve the help string. 2014-10-16 14:34:52 +08:00
Damyon Wiese 9e035dae1b MDL-47655 assign: Treat 'new' status as never submitted.
This fixes the recent activity callbacks to ignore submissions with a 'new' status.

The unit tests for recent activity were modified, because they were relying on the old behaviour of 'submitted' being the default status.

AMOS BEGIN
     CPY [submissionstatus_,mod_assign],[submissionstatus_new,mod_assign]
AMOS END
2014-10-16 13:56:07 +08:00
Damyon Wiese b8bd29da41 Merge branch 'event_monitor' of git://github.com/ankitagarwal/moodle 2014-10-16 13:20:45 +08:00
Zachary Durber 6deb0344c5 MDL-47575 gradebook: Show weights and contribution by default. 2014-10-16 13:11:47 +08:00
Damyon Wiese 8ae6df3798 Merge branch 'MDL-47667' of git://github.com/timhunt/moodle 2014-10-16 13:00:22 +08:00
Adrian Greeve b9cafe3b40 MDL-46599 gradebook: Added a time exported column to grade export via csv.
This will be useful for checking if a csv import is trying to overwrite
new grade updates.
2014-10-16 10:31:10 +08:00
Simey Lameze a5240a82a6 MDL-46599 gradebook: Add force import option on CSV file and direct importing 2014-10-16 10:22:45 +08:00
Simey Lameze ce8f9c9b87 MDL-46599 gradebook: Add last exported date column on ODS and XLS export formats 2014-10-16 10:22:20 +08:00
Sam Hemelryk 8028df293a MDL-47684 mod: better validation of rating options 2014-10-16 14:50:56 +13:00
Sam Hemelryk 2fdb4c6b00 Merge branch 'MDL-47594_master' of git://github.com/kordan/moodle 2014-10-16 11:04:53 +13:00
Sam Hemelryk edfeca582e Merge branch 'wip-MDL-47629-master' of https://github.com/kwiliarty/moodle 2014-10-16 10:31:20 +13:00
Sam Hemelryk b1b2999206 MDL-45843 mod_lti: bumped ltiservice dependency versions 2014-10-16 09:59:06 +13:00
spvickers e3f69b58a2 MDL-45843 mod_lti: introduced support to LTI 2.0
This commit introduces support to the LTI module for LTI 2.0.
As well as the initial commit the following changes were made
and then squashed into the single commit for integration:

* Fixed bug in services
  Fixed bug which limited characters allowed in values of template
  variables (e.g. vendor ID) in service endpoints.
  Changed language file to refer to tool registrations rather than
  tool proxies.

* Refactored service classes
  Moved classes relating to services into areas where Moodle will
  autoload them

* Ran code through code checker
  Removed all errors reported by the Code checker module
  excluding third-party OAuth.php file.

* UI improvements
  Mainly when adding an external tool to a course - fields which
  should not be changed for a selected tool are either hidden or
  disabled. Admin settings page now shows the Tool Registration
  name against a tool rather than the launch URL, and the
  registration URL replaces the GUID on the tool registrations
  page.

* Updated tool proxy registration
  Added check of tool proxy to ensure only offered capabilities
  and services are included.  Also check tool proxy when processing
  a service request.

* Code review changes
  Some fixes based on code review by Mark Nielsen and addition of
  some PHPDocs comments.

* Updates from code/PHPdocs checks
  Removed use of eval and corrected invalid PHPdocs for new
  functions/classes

* Corrected namespace error and incorrect string terminator

* Updates based on forum feedback
  Added dependencies and backup, restore and uninstall methods for
  ltiservice subplugins.
  Changed most uses of is_null to empty

* Updated custom parameters test
  Updated test_split_custom_parameters to include new function
  parameters.
  Corrected PHPdoc entry for lti_split_custom_parameters
  Fixed incorrect line separators in ltiservice.php

* Added require_capability to registrationreturn.php

* SQL and EOL updates
  Moved PHP variable in SQL into a named parameter
  Improved checks for end-of-line characters to include CR and LF
  on their own or together

* Check for semicolon separators
  Semicolon separators in custom parameters are changed to EOL
  characters when upgrading to the 2014100100 version.

* Remove unused file
  basiclti.js file not being used so removed.

* Adjust line lengths
  Split long lines in upgrade.php

* Added savepoint to upgrade.php
  savepoint omitted from earlier update to upgrade.php

* Updated namespaces and upgrade
  Service and resource classes moved into .../local/...
  Upgrade SQL moved into a function and unit test created

* Updated lti_tool_proxies table
  Added indices and foreign keys to lti_tool_proxies table

* Fixed formatting and documentation issues

* ltiservice class moved into local

* Replaced lti_scale_used comments
  Put back commented out code for lti_scale_used

* Removed redundant sesskey code

* Fixed namespace and path check
  Updated ltiservice namespace for move into local
  Added check for existence of $_SERVER['PATH_INFO']

* Updated upgrade code
  Added indices and keys to lti_tool_settings table when upgrading
  Fixed errors in upgradelib_test.php (thanks to jleyva)
  Update SQL to use Moodle functions

* Use of empty with class method
  PHP 5.4 does not like the use of empty with a class method so saved the
  value to a variable first.  PHP 5.5 seems to accept the use of a method
  with empty.

* Removed redundant indices
  Removed creation of indices for foreign keys on lti_tool_settings table
  from install.xml and upgrade.php

* Fixes based on feedback
  Minor changes and corrections based on review in JIRA

* Fixed bug in toolproxy service
  Corrected bug which failed to respond properly to an invalid request
  Also updated upgrade.txt file

* Improved admin navigation
  Added the manage tool registrations page as a separate entry on the
  admin menu (within a folder named LTI).  Made this entry the current
  position for the related pages.

* Updated PHPdocs with class names
  Added class names with namespaces to PHPdocs to replace generic
  references to "object"

* Changed object to iframe
  Use of object tag in register.php changed to use an iframe tag in line
  with the similar update made to view.php.

* Improved registration process
  A message is now displayed if the registration page has not been loaded
  in the iframe within 20 seconds.  If a user is returned to Moodle
  without a tool proxy being sent, the registration is moved back from
  pending to configured.

* Fixes for integration
  Removed comment - the template is the default path unless overridden, so
  get_path and get_template should both be defined.
  Added comment and intval to fix the issue with obtaining an error
  reason.
2014-10-16 09:33:33 +13:00
Dan Poltawski 529e38d141 Merge branch 'MDL-47576-master' of git://github.com/jethac/moodle
Conflicts:
	theme/bootstrapbase/style/moodle.css
2014-10-15 16:59:06 +01:00
Dan Poltawski 33ccfc1f13 Merge branch 'MDL-47560-master' of git://github.com/gurgus/moodle 2014-10-15 16:56:43 +01:00
Willy Lee 8f16523082 MDL-47696 assign: allow 'not submitted' filter to get all other submission statuses 2014-10-15 08:16:37 -07:00
Dan Poltawski 560b04b408 Merge branch 'MDL-47243-master' of git://github.com/xow/moodle 2014-10-15 16:14:39 +01:00
Damyon Wiese b065b569af Merge branch 'wip-MDL-47613-master' of git://github.com/marinaglancy/moodle 2014-10-15 16:59:57 +08:00
Ankit Agarwal d6e0e275dd MDL-45758 tool_monitor: Update behat tests 2014-10-15 13:59:19 +05:30
Ankit Agarwal ffe9ed541c MDL-45758 tool_monitor: Update subscriptions management UI 2014-10-15 13:59:18 +05:30
Damyon Wiese 127b3915df MDL-47686 assign: Fix restoring from a mod_assignment backup.
This was only working for admins.
2014-10-15 15:56:30 +08:00
Dan Poltawski 22caa080f9 Merge branch 'MDL-38732-master-2nd' of git://github.com/FMCorz/moodle 2014-10-15 08:41:23 +01:00
Damyon Wiese 87ea3e7e37 Merge branch 'master_MDL-47431' of https://github.com/danmarsden/moodle 2014-10-15 14:52:42 +08:00
Dave Cooper d0d59df939 MDL-47657 mod_glossary: Fixed wrong error message on edit timeout. 2014-10-15 14:48:18 +08:00
John Okely 3087835ae3 MDL-47243 core_grades: Add behat tests for outcomes in Natural 2014-10-15 14:33:31 +08:00
John Okely 5e18456631 MDL-47243 core_grades: Allow extra credit on outcome grade items 2014-10-15 14:33:31 +08:00
John Okely c53708d9c0 MDL-47243 core_grades: Add weight settings to outcome edit page 2014-10-15 14:33:31 +08:00
John Okely cfa91962d1 MDL-47243 behat: Add data generators for gradeitems scales and outcomes 2014-10-15 14:33:26 +08:00
Damyon Wiese 1a847ddaf8 Merge branch 'MDL-47646' of git://github.com/timhunt/moodle 2014-10-15 14:26:49 +08:00
Ankit Agarwal 067e9599ac MDL-45758 tool_monitor: Update navigation nodes 2014-10-15 11:33:31 +05:30
Damyon Wiese b51c2c4f8c Merge branch 'wip-MDL-47572-master' of git://github.com/marinaglancy/moodle 2014-10-15 13:58:32 +08:00
Damyon Wiese 5d70f2303a Merge branch 'wip-MDL-47583-master' of git://github.com/marinaglancy/moodle 2014-10-15 13:46:28 +08:00
Frederic Massart e813b7286e MDL-38732 gradereport_grader: Undefined variable in unit tests 2014-10-15 12:22:35 +08:00
Marina Glancy bf8542ce3a MDL-30358 forms: strict validation is too strict 2014-10-15 11:57:01 +08:00
Dave Cooper c8eb1fae64 MDL-47560 Grades: Unset config when gradebook upgrade acknowledged. 2014-10-15 11:00:57 +08:00
Damyon Wiese e9e3c0dcfd Merge branch 'MDL-47575-master' of git://github.com/zbdd/moodle 2014-10-15 10:19:05 +08:00
Ankit Agarwal b9ba26b222 MDL-45758 tool_monitor: Update navigation to add callbacks
User settings node now checks for callbacks in various admin tools
2014-10-15 07:41:06 +05:30
Ankit Agarwal e8a925a60e MDL-45758 tool_monitor: Update js to get around chrome bug 2014-10-15 07:41:06 +05:30
Ankit Agarwal 75cae53b7b MDL-45758 tool_monitor: Peer review changes 2014-10-15 07:41:06 +05:30
Ankit Agarwal 758793d889 MDL-45758 tool_monitor: Fix lang strings for caps 2014-10-15 07:41:06 +05:30
Simey Lameze 77098e6dc1 MDL-45758 tool_monitor: Add behat tests to subscription management
Original issue - MDL-47148
2014-10-15 07:41:06 +05:30
Simey Lameze 9031b34da3 MDL-45758 tool_monitor: Behat tests for rule management
Original issue - MDL-47148
2014-10-15 07:41:06 +05:30
Ankit Agarwal 2161de73d8 MDL-45758 tool_monitor: Add tests for the observers
Original issue - MDL-47376
2014-10-15 07:41:06 +05:30
Ankit Agarwal e24e0d24b9 MDL-45758 tool_monitor: Add observers to handle user and module deletion
Original issue - MDL-47376
2014-10-15 07:41:06 +05:30
Ankit Agarwal 5833307eab MDL-45758 tool_monitor: Add unit tests for the universal observer
Original issue - MDL-46132
2014-10-15 07:41:06 +05:30
Ankit Agarwal bb550efc0d MDL-45758 tool_monitor: Add a universal event observer
This observer does the following task:-
1) It monitors all events and stores relevant data in a temporary table
2) It doesn't write the events straight away, it buffers them, so there is only one db write per request
3) It calculates and sees if there are subscriptions related to those events who need to be notified
4) If there are such cases, it schedules a adhoc task for the same

Original issue - MDL-46132
2014-10-15 07:41:06 +05:30
Ankit Agarwal 1ebfdaec04 MDL-45758 tool_monitor: Add a adhock task to send notifications
Original issue - MDL-46132
2014-10-15 07:41:05 +05:30
Ankit Agarwal 01d070e74b MDL-45758 tool_monitor: Modifiy manager classes to return instances
Original issue - MDL-46132
2014-10-15 07:41:05 +05:30
Ankit Agarwal d18c425d51 MDL-45758 tool_monitor: Add a new message provider
Original issue - MDL-46132
2014-10-15 07:41:05 +05:30
Simey Lameze 84be4f6af4 MDL-45758 tool_monitor: add missing alt on manage icons
Original issue - MDL-47460
2014-10-15 07:41:05 +05:30
Mark Nelson c47eb61a48 MDL-45758 tool_monitor: added help icon for rules
Original issue - MDL-47152
2014-10-15 07:41:05 +05:30
Mark Nelson 4e18940f83 MDL-45758 tool_monitor: added help icon for subscriptions
Original issue - MDL-47152
2014-10-15 07:41:05 +05:30
Mark Nelson d55f3e03b1 MDL-45758 tool_monitor: added help icon renderer
Original issue - MDL-47152
2014-10-15 07:41:05 +05:30
Mark Nelson 27b6839fe2 MDL-45758 core: edited get_formatted_help_string
Edited the api to accept string parameters

Original issue - MDL-47152
2014-10-15 07:41:05 +05:30
Mark Nelson 5b8aa8f700 MDL-45758 tool_monitor: fixed typo
Original issue - MDL-47152
2014-10-15 07:41:05 +05:30
Ankit Agarwal e1a6022802 MDL-45758 tool_monitor: Add unit tests for the course deleted observer
Original issue - MDL-46510
2014-10-15 07:41:05 +05:30
Ankit Agarwal 6a7de0d243 MDL-45758 tool_monitor: Add a course delete observer
Original issue - MDL-46510
2014-10-15 07:41:05 +05:30
Ankit Agarwal 044503e33d MDL-45758 tool_monitor: Add a UI page to manage subscriptions
Original issue - MDL-46111
2014-10-15 07:41:05 +05:30
Ankit Agarwal ac0e4dad7f MDL-45758 tool_monitor: Update subscription manager class
Update the class to support the subs renderable

Original issue - MDL-461111
2014-10-15 07:41:05 +05:30
Ankit Agarwal 58dcafb05a MDL-45758 tool_monitor: Add renderables for the subscription page
Original issue - MDL-46111
2014-10-15 07:41:05 +05:30
Ankit Agarwal 76b7ce41ab MDL-45758 tool_monitor: Add a renderer for the subscription page
Original issue - MDL-46111
2014-10-15 07:41:05 +05:30
Ankit Agarwal 3432c96d3a MDL-45758 tool_monitor: Create a subscription instance class
Original issue - MDL-46241
2014-10-15 07:41:04 +05:30
Ankit Agarwal 3870ad7a2f MDL-45758 tool_monitor: Handle rule managment
Original issue - MDL-46130
2014-10-15 07:41:04 +05:30
Ankit Agarwal 22f4231631 MDL-45758 tool_monitor: Display a rule managment interface
Original issue - MDL-46110
2014-10-15 07:41:04 +05:30
Ankit Agarwal 371d5e0b66 MDL-45758 tool_monitor: Create rendering code for manage rules page
Original issue - MDL-46110
2014-10-15 07:41:04 +05:30
Ankit Agarwal 58097ddf9b MDL-45758 tool_monitor: Add support for editing/creating a rule
Original issue - MDL-45938
2014-10-15 07:41:04 +05:30
Ankit Agarwal 2fd010b886 MDL-45758 tool_monitor: YUI module to handle event selection dropdown
Original issue - MDL-45938
2014-10-15 07:41:04 +05:30
Simey Lameze 48cc3a8d4d MDL-45758 tool_monitor: Initial version of rule form.
Original issue - MDL-45938
2014-10-15 07:41:04 +05:30
Ankit Agarwal 3d27d680a8 MDL-45758 tool_monitor: Polish the code for rule manager and unit tests
Original issue - MDL-45918
2014-10-15 07:41:04 +05:30
Simey Lameze 7bdbb4dc2d MDL-45758 tool_monitor: Rule manager class and data generators
This issue introduces rule manager class, data generators and unit tests
associated with them.

Original issue - MDL-45918
2014-10-15 07:41:04 +05:30
Ankit Agarwal c8a081cc6b MDL-45758 tool_monitor: Add a subscription manager class
Original issue - MDL-45919
2014-10-15 07:41:04 +05:30
Ankit Agarwal 3883eee06b MDL-45758 tool_monitor: Build the navigation tree for the tool
Original issue - MDL-46131
2014-10-15 07:41:04 +05:30
Ankit Agarwal eccf301acf MDL-45758 navigation: updates to navigation
This patch does the following:-
Start using proper key for course report node
Allow admin tools to hook into course navigation

Original issue - MDL-46131
2014-10-15 07:41:04 +05:30
Ankit Agarwal 5f68d9ee2b MDL-45758 tool_monitor: Implement a rule instance class
Original issue - MDL-45939
2014-10-15 07:41:04 +05:30
Ankit Agarwal f235cae41f MDL-45758 tool_monitor: Implement a class to generate list of events
Original issue - MDL-46109
2014-10-15 07:41:04 +05:30
Ankit Agarwal d0d6c72de2 MDL-45758 tool_monitor: Adding xml file defining the db tables
Original issue - MDL-45916
2014-10-15 07:41:03 +05:30
Ankit Agarwal 92b40de9de MDL-45758 tool_monitor: Add basic file structure of the report
Original issue - MDL-45916
2014-10-15 07:41:03 +05:30
Brian Barnes a87c17d14f MDL-47632 calendar: Fixed iCal link going blue after visiting it 2014-10-15 08:46:07 +13:00
Kevin Wiliarty 3d1c2898c1 MDL-47629 quiz review: display cloze feedback on top of "Check" button 2014-10-14 15:36:34 -04:00
Dan Poltawski 4f639ec86b Merge branch 'MDL-47463-master' of git://github.com/FMCorz/moodle 2014-10-14 19:11:57 +01:00
Dan Poltawski 1b07195b28 Merge branch 'MDL-38732-master-2nd' of git://github.com/FMCorz/moodle 2014-10-14 19:00:28 +01:00
Dan Poltawski 5a94eeb56d Merge branch 'MDL-47614-master' of git://github.com/andrewnicols/moodle 2014-10-14 18:47:30 +01:00
Dan Poltawski 050b930fa7 on-demand release 2.8beta+ 2014-10-14 18:00:47 +01:00
Dan Poltawski f47265d3a0 Merge branch 'install_master' of https://git.in.moodle.com/amosbot/moodle-install 2014-10-14 18:00:44 +01:00
Dan Poltawski df11019a82 MDL-46235/MDL-46971 mysql_compress_rows: fix typo 2014-10-14 16:36:47 +01:00
Yolanda Ordóñez Rufat c3f51a3c79 MDL-47466 calendar: fixed error ORA-01795 in calendar_get_events 2014-10-14 14:58:05 +02:00
Dan Poltawski 8a7b6d292d Merge branch 'wip-MDL-47617-master' of git://github.com/abgreeve/moodle 2014-10-14 13:17:36 +01:00
Dan Poltawski 3be2f6ac0b Merge branch 'MDL-47649' of git://github.com/timhunt/moodle 2014-10-14 13:14:19 +01:00
Helen Foster a1b152f5db MDL-47140 atto: improved wording of error message 2014-10-14 12:20:58 +01:00
Tim Hunt 01e7c3bf4e MDL-47667 profile unit tests: don't assume none by default.
E.g. if an add-on creates a user profile field on install, the test was
failing.
2014-10-14 12:09:51 +01:00
Marina Glancy acab649e06 Merge branch 'MDL-47189-master-2nd' of git://github.com/FMCorz/moodle 2014-10-14 18:34:14 +08:00
Tim Hunt a866538b9b MDL-47649 csvlib: must not leave files open
I added a destructor to csv_import_reader ensure the file is closed.

I also ensured that the gradeimport_csv unit tests did not hold onto a
reference to the csv_import_reader object while the phpunit framework
tries to tidy up moodledata.

Finally, to stop CiBoT complaining, I fixed up the PHP4-style
declarations in the CSV import class.
2014-10-14 10:36:25 +01:00
Frederic Massart da45dc0497 MDL-47189 my: Update test to check that existing blocks remain after add
Specifically checking for strings in the blocks because the tests
passed when looking for the string anywhere.
2014-10-14 16:03:12 +08:00
Frederic Massart 00fd3c1aad MDL-47189 my: Fix the addition of default blocks to my/ page
Fixing the upgrade script so that they attach the new blocks
to the right my_pages entry. An upgrade script has also been
added to fix the existing bad data.
2014-10-14 16:03:12 +08:00
Andrew Nicols 906de1b640 MDL-47614 gradereport: Apply a background colour
Apply the page background colour to the table for all bootstrap base
themes.

Whis will ensure that the table does not stand out strangely on a non-white
background.
2014-10-14 15:41:21 +08:00
Damyon Wiese f50395b402 Merge branch '46151-28' of git://github.com/samhemelryk/moodle 2014-10-14 15:34:25 +08:00
Jetha Chan f89a85f81c MDL-47576 user_menu: improved dropdown styles, added JS-less styles 2014-10-14 14:59:42 +08:00
Damyon Wiese 852ff0372f MDL-47499 tasks: Scheduled tasks custom schedule is reset on upgrade.
Add a unit test for reset_scheduled_tasks_for_component and make sure it doesn't clear
customised schedules for existing tasks.
2014-10-14 14:59:24 +08:00
Zachary Durber f4278326c0 MDL-47575 gradebook: Show weights and contribution by default. 2014-10-14 14:22:08 +08:00
Frederic Massart 09171b955e MDL-38732 gradereport_grader: Handle simultaneous graders 2014-10-14 13:52:42 +08:00
Zachary Durber 1b2c1ccb4c MDL-18229 gradebook: Fixes for bulk insert and checkboxes. 2014-10-14 13:18:45 +08:00
Adrian Greeve c1a27029fe MDL-47617 behat: Fixed behat sorting failure
Postgres and MySQL treat values that are null differently
when sorting. MySQL will sort null values above fields with
values and Postgres will be vice versa. I removed the checks
against the Admin User.

Oracle treats lower case values different to upper case values
and so I have modified the test so that all Names start with
an Uppercase letter.
2014-10-14 11:30:01 +08:00
Damyon Wiese 57fac09a40 MDL-18229 Grades: singleview report mega cleanup.
Fix all the things, including:
* Fix $PAGE->url
* Fix coding style.
* Add event for reportviewed
* Removed broken callback  gradereport_singleview_profilereport
* Removed vertical-align-middle
* Changed prefixes in css
* phpcs fixes
* moodlecheck fixes including phpdocs
* Move classes to use autoloading
* Remove all smelly code tricks like func_get_args, scandir etc (lots).
2014-10-14 10:26:46 +08:00
Zachary Durber 5f3decb5cb MDL-18229 gradebook: Additional fixes.
Random foo left in options. (test code)
Allowed editing link for Course total.
Fixes based on Apu's review.
2014-10-14 10:26:46 +08:00
Aparup Banerjee 0a55da571a MDL-18229 gradereport: updated index.php test to calculate navigation based on new class name 'gradereport_selectable_items' 2014-10-14 10:26:46 +08:00
Zachary Durber 8ec7b088ef MDL-18229 gradereport: Fixes and improvements from review.
Added pagination back in with some general fixes.

AMOS BEGIN
 CPY [override,mod_quiz],[override,gradereport_singleview]
AMOS END
2014-10-14 10:26:46 +08:00
Zachary Durber 2fd9718d8b MDL-18229 gradereport: Behat tests added. 2014-10-14 10:26:46 +08:00
Zachary Durber 7bd3932e76 MDL-18229 gradereport: Labels for table items added. 2014-10-14 10:26:46 +08:00
Zachary Durber 65c134f98a MDL-18229 gradebook: Updating code to Moodle standard. 2014-10-14 10:26:46 +08:00
Zachary Durber 92c61fee64 MDL-18229 gradebook: Links to Single view via icons on Grade Report. 2014-10-14 10:26:45 +08:00
Zachary Durber d124a60b33 MDL-18229 gradebook: Renaming of Single_view to Single view 2014-10-14 10:26:45 +08:00
Zachary Durber edd8b27923 MDL-18229 gradebook: Fix for loading activities.
Was using local variable iteminstance rather than cmid.
2014-10-14 10:26:45 +08:00
Zachary Durber 6a555b99f7 MDL-18229 gradebook: Linking activities and usernames correctly.
Activities to their course page and usernames to their
profile page as per standard.
2014-10-14 10:26:45 +08:00
Aparup Banerjee 7cdbf79dd9 MDL-47347 added basic navigation to top and bottom of gradereport_singleview
Part of MDL-18229
2014-10-14 10:26:45 +08:00
Zachary Durber 508f23f1e5 MDL-18229 gradebook: Single view navigation corrected.
Usernames link to user profiles.
Activities to their activity page.
2014-10-14 10:26:45 +08:00
Zachary Durber 4229e9fa8d MDL-18229 gradebook: Added filter icons for activities and users.
Corrected CSS for grades column, was far too large.
2014-10-14 10:26:45 +08:00
Zachary Durber 7bd4a361b3 MDL-18229 gradebook: Initial commit of LSUs Quick Edit Plugin
Renamed to Single View in MDL-47289.
2014-10-14 10:26:45 +08:00
Simey Lameze 372997907f MDL-46599 gradebook: Unit tests for last exported date and force import option 2014-10-14 09:30:04 +08:00
Dan Marsden 711910ec0d MDL-33939 gradingform_guide: use correct max grade for scales. 2014-10-14 08:42:30 +13:00
Sam Hemelryk c1fb8f6d2e MDL-46151 cachestore_memcache: now checks extension version for support 2014-10-14 08:27:45 +13:00
AMOS bot ad7f22c055 Automatically generated installer lang files 2014-10-14 00:05:32 +08:00
Tim Hunt 90048c7cfa MDL-47646 CURL redirect unit test: handle broken servers 2014-10-13 15:52:04 +01:00
Dan Poltawski ec72585d64 Merge branch 'MDL-47603' of git://github.com/timhunt/moodle 2014-10-13 13:33:56 +01:00
Frederic Massart 1d65db8b39 MDL-47463 core_grades: Behat checks the contribution of single item scales 2014-10-13 18:23:03 +08:00
Dan Poltawski bb29fe900e Merge branch 'wip-MDL-46819-master' of git://github.com/abgreeve/moodle 2014-10-13 11:02:59 +01:00
Dan Poltawski 42b0ce301d Merge branch 'wip-MDL-46546-master' of git://github.com/abgreeve/moodle 2014-10-13 10:57:17 +01:00
Dan Poltawski 7c50998039 Merge branch 'MDL-47140-master' of git://github.com/gurgus/moodle 2014-10-13 09:54:02 +01:00
Frederic Massart 21dd684207 MDL-47463 core_grades: Behat checks the contribution of scales 2014-10-13 16:01:32 +08:00
Frederic Massart 87e1e53c97 MDL-47463 core_grades: Handle course contribution of scales 2014-10-13 15:54:58 +08:00
Dave Cooper b6da971b4a MDL-47140 editor_atto: Improved error handling 2014-10-13 10:51:17 +08:00
Adrian Greeve a2809ae2c9 MDL-46546 core_grades: Notice display for bad import.
If the initial import of csv data is bad, a notification
will be displayed to the user.
2014-10-13 10:36:38 +08:00
Adrian Greeve 0cf122171b MDL-46819 core_grades: Negative weights are changed to 0
Negative weights in the natural aggregation are not currently permitted.
Any figure below zero is changed to a zero.
2014-10-13 08:19:24 +08:00
Sam Hemelryk 0e6d8ed261 MDL-47631 report_participation: fixed filtering by letter 2014-10-13 12:27:48 +13:00
Rex Lorenzo 6fa877e243 MDL-47555 core_availability: Issue with page layout & grade restriction
* Set pagelayout before getting section info, otherwise conditional activity renderers will default to the default 'base' layout.
2014-10-10 14:57:21 -07:00
Tim Hunt 84b45a24a1 MDL-47603 quiz edit: qbank popup preview icon needs new window
Also, ensure that clicking the + icon adds the question on the right
page.

Bit of this fix are a bit hacky, but we have to deal with the fact there
is not a good general solution to MDL-47604.
2014-10-10 13:40:16 +01:00
Marina Glancy d8773d64fc MDL-47613 wiki: allow searching several words
Thanks to Sandeep B for suggested solution
2014-10-10 16:35:13 +08:00
Dan Marsden 2d9a4a5f93 MDL-44548 mod_scorm: force an external sync to check for updated files.
also remove some globals no longer needed (not used in function or in required files.
2014-10-10 15:10:08 +13:00
Dan Marsden 6cdfe1a824 MDL-47431 advanced grading: correct use of frankenstyle names for consistency 2014-10-10 14:57:29 +13:00
Kordan f656df787f MDL-47594 core_accesslib: removed three useless lines of code 2014-10-09 11:04:36 +02:00
Marina Glancy 8c2fc797a0 MDL-47583 atto_managefiles: correctly decode filename 2014-10-09 10:59:33 +08:00
Marina Glancy c84d8cc452 MDL-47583 tinymce_managefiles: correctly decode filename 2014-10-09 10:59:21 +08:00
Marina Glancy 54f7d2d7f4 MDL-47572 libraries: modify unittest to avoid random timing fail
Thanks to Nigel Cunningham
2014-10-08 11:32:10 +08:00
Mark Nielsen 292f663581 MDL-47569 backup: Do not close questions tag if never opened
This can happen when restoring quizzes that
do not have any questions.
2014-10-07 11:48:35 -07:00
Mark Nielsen 95dc1e42d5 MDL-47569 backup: Escape section summary for XML
This was causing the parsing of the XML
to fail because things like & were not
escaped.
2014-10-07 11:47:40 -07:00
sam marshall c0d92241f1 MDL-47564 Availability: incorrect use of defined('PHP_UNIT') 2014-10-07 14:47:29 +01:00
Petr Skoda 41186f4f80 MDL-41593 admin: use default setting if preventexecpath active
This resolves problems when installing Moodle
and addons when preventexecpath active.

Please note the admin_setting_configfile is still
incorrectly restricted - this will be resolved by
MDL-40949.
2014-10-07 11:30:08 +13:00
Gregory Faller 452beca98d MDL-46712: Center EditPDF window on browser resize / zoom 2014-10-06 14:44:51 +08:00
Andrew Nicols f67b5c995e MDL-47183: viewhiddenactivities should use the module context
Thanks to Paulo Matos for the forum part of this change.
2014-10-06 12:21:49 +08:00
Yolanda Ordóñez Rufat a2ed10a5e7 MDL-47466 calendar: use get_in_or_equal() in function calendar_get_events to fix problem with ORA-01795 2014-09-30 13:23:33 +02:00
Tim Hunt dc37223bff MDL-46088 quiz secure window: further Atto JS fixes. 2014-09-19 22:03:24 +01:00
Damyon Wiese d250083e03 MDL-46088 Quiz: Prevent alert when clicking in editor in secure popup 2014-09-19 22:03:24 +01:00
Tim Hunt 339554aa21 MDL-46088 Impossible to click on Atto in a Quiz in 'Secure' mode. 2014-09-19 22:03:23 +01:00
Virgil Ashruf 118a9b4308 MDL-45636 course_rest: changed modcontext to coursecontext 2014-09-01 12:36:04 +02:00
Daniel Kosinski 43fb9ced67 MDL-46219 assignment: delete files when resetting assign activities 2014-08-05 23:31:20 +02:00
David Scotson fbfc7d252c MDL-40343 forum: indent less when mobile, nested
Changes the indenting of forum replies to be relative to the width of
the parent container, so the indent decreases as threads get nested
deeper. Also reduces the indent size automatically for smaller screen
sizes.
2014-02-04 16:34:49 +00:00
1336 changed files with 36172 additions and 7093 deletions
+3
View File
@@ -0,0 +1,3 @@
--errors=errors,duplicate-properties
--warnings=known-properties,display-property-grouping,empty-rules,important
--exclude-list=vendor/,lib/editor/tinymce/,lib/yuilib/,theme/bootstrapbase/style/
+1 -2
View File
@@ -67,7 +67,6 @@ if ($data = data_submitted() and confirm_sesskey()) {
$errormsg = get_string('errorwithsettings', 'admin');
$firsterror = reset($adminroot->errors);
}
$adminroot = admin_get_root(true); //reload tree
$settingspage = $adminroot->locate($category, true);
}
@@ -156,4 +155,4 @@ echo $outputhtml;
echo html_writer::end_tag('fieldset');
echo html_writer::end_tag('form');
echo $OUTPUT->footer();
echo $OUTPUT->footer();
+1 -1
View File
@@ -52,7 +52,7 @@ $help =
By default InnoDB storage table is using legacy Antelope file format
which has major restriction on database row size.
Use this script to detect and fix database tables with potentail data
Use this script to detect and fix database tables with potential data
overflow problems.
Options:
+14 -5
View File
@@ -41,15 +41,24 @@ class core_role_existing_role_holders extends core_role_assign_user_selector_bas
list($sort, $sortparams) = users_order_by_sql('u', $search, $this->accesscontext);
$params = array_merge($params, $sortparams);
$sql = "SELECT ra.id AS raid," . $this->required_fields_sql('u') . ",ra.contextid,ra.component
FROM {role_assignments} ra
$fields = "SELECT ra.id AS raid," . $this->required_fields_sql('u') . ",ra.contextid,ra.component ";
$countfields = "SELECT COUNT(1) ";
$sql = "FROM {role_assignments} ra
JOIN {user} u ON u.id = ra.userid
JOIN {context} ctx ON ra.contextid = ctx.id
WHERE $wherecondition
AND ctx.id $ctxcondition
AND ra.roleid = :roleid
ORDER BY ctx.depth DESC, ra.component, $sort";
$contextusers = $DB->get_records_sql($sql, $params);
AND ra.roleid = :roleid";
$order = " ORDER BY ctx.depth DESC, ra.component, $sort";
if (!$this->is_validating()) {
$existinguserscount = $DB->count_records_sql($countfields . $sql, $params);
if ($existinguserscount > $this->maxusersperpage) {
return $this->too_many_results($search, $existinguserscount);
}
}
$contextusers = $DB->get_records_sql($fields . $sql . $order, $params);
// No users at all.
if (empty($contextusers)) {
+1 -1
View File
@@ -132,7 +132,7 @@ if ($courseid == SITEID) {
$PAGE->set_heading($course->fullname.': '.$fullname);
}
echo $OUTPUT->header();
echo $OUTPUT->heading($title, 3);
echo $OUTPUT->heading($title);
echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthnormal');
// Display them.
+1 -3
View File
@@ -22,7 +22,6 @@ if ($data = data_submitted() and confirm_sesskey()) {
if (admin_write_settings($data)) {
$statusmsg = get_string('changessaved');
}
$adminroot = admin_get_root(true); //reload tree
if (!empty($adminroot->errors)) {
$errormsg = get_string('errorwithsettings', 'admin');
@@ -44,10 +43,9 @@ if ($errormsg !== '') {
$resultshtml = admin_search_settings_html($query); // case insensitive search only
echo '<form action="search.php" method="post" id="adminsettings">';
echo '<form action="' . $PAGE->url->out(true) . '" method="post" id="adminsettings">';
echo '<div>';
echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
echo '<input type="hidden" name="query" value="'.s($query).'" />';
echo '</div>';
echo '<fieldset>';
echo '<div class="clearer"><!-- --></div>';
-1
View File
@@ -48,7 +48,6 @@ if ($data = data_submitted() and confirm_sesskey()) {
$errormsg = get_string('errorwithsettings', 'admin');
$firsterror = reset($adminroot->errors);
}
$adminroot = admin_get_root(true); //reload tree
$settingspage = $adminroot->locate($section, true);
}
+11
View File
@@ -23,6 +23,17 @@ if ($hassiteconfig or has_any_capability($capabilities, $systemcontext)) { // sp
$temp->add(new admin_setting_configcheckbox('allowuserblockhiding', new lang_string('allowuserblockhiding', 'admin'), new lang_string('configallowuserblockhiding', 'admin'), 1));
$temp->add(new admin_setting_configcheckbox('allowblockstodock', new lang_string('allowblockstodock', 'admin'), new lang_string('configallowblockstodock', 'admin'), 1));
$temp->add(new admin_setting_configtextarea('custommenuitems', new lang_string('custommenuitems', 'admin'), new lang_string('configcustommenuitems', 'admin'), '', PARAM_TEXT, '50', '10'));
$temp->add(new admin_setting_configtextarea(
'customusermenuitems',
new lang_string('customusermenuitems', 'admin'),
new lang_string('configcustomusermenuitems', 'admin'),
'messages,message|/message/index.php|message
myfiles,moodle|/user/files.php|download
mybadges,badges|/badges/mybadges.php|award',
PARAM_TEXT,
'50',
'10'
));
$temp->add(new admin_setting_configcheckbox('enabledevicedetection', new lang_string('enabledevicedetection', 'admin'), new lang_string('configenabledevicedetection', 'admin'), 1));
$temp->add(new admin_setting_devicedetectregex('devicedetectregex', new lang_string('devicedetectregex', 'admin'), new lang_string('devicedetectregex_desc', 'admin'), ''));
$ADMIN->add('themes', $temp);
-2
View File
@@ -112,8 +112,6 @@ if (has_capability('moodle/grade:manage', $systemcontext)
$defaults = array('value'=>0, 'forced'=>false, 'adv'=>true);
$temp->add(new admin_setting_gradecat_combo('grade_aggregateoutcomes', new lang_string('aggregateoutcomes', 'grades'),
new lang_string('aggregateoutcomes_help', 'grades'), $defaults, $options));
$temp->add(new admin_setting_gradecat_combo('grade_aggregatesubcats', new lang_string('aggregatesubcats', 'grades'),
new lang_string('aggregatesubcats_help', 'grades'), $defaults, $options));
$options = array(0 => new lang_string('none'));
for ($i=1; $i<=20; $i++) {
+3 -3
View 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);
@@ -24,6 +24,6 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2014051200;
$plugin->requires = 2014050800;
$plugin->version = 2014111000;
$plugin->requires = 2014110400;
$plugin->component = 'tool_availabilityconditions';
@@ -185,6 +185,12 @@ Feature: Set up contextual data for tests
| url | Test url name | Test url description | C1 | url1 |
| wiki | Test wiki name | Test wiki description | C1 | wiki1 |
| workshop | Test workshop name | Test workshop description | C1 | workshop1 |
And the following "scales" exist:
| name | scale |
| Test Scale 1 | Disappointing, Good, Very good, Excellent |
And the following "activities" exist:
| activity | name | intro | course | idnumber | grade |
| assign | Test assignment name with scale | Test assignment description | C1 | assign1 | Test Scale 1 |
When I log in as "admin"
And I follow "Course 1"
Then I should see "Test assignment name"
@@ -214,6 +220,10 @@ Feature: Set up contextual data for tests
And I should see "Test workshop name"
And I follow "Test assignment name"
And I should see "Test assignment description"
And I follow "C1"
And I follow "Test assignment name with scale"
And I follow "Edit settings"
And the field "Type" matches value "Scale"
@javascript
Scenario: Add relations between users and groups
@@ -297,13 +307,124 @@ Feature: Set up contextual data for tests
| Course 1 | C1 |
And the following "grade categories" exist:
| fullname | course |
| Grade category 1 | C1|
| Grade category 1 | C1 |
And the following "grade categories" exist:
| fullname | course | gradecategory |
| Grade sub category 2 | C1 | Grade category 1|
| Grade sub category 2 | C1 | Grade category 1 |
When I log in as "admin"
And I follow "Courses"
And I follow "Course 1"
And I navigate to "Grades" node in "Course administration"
Then I should see "Grade category 1"
And I should see "Grade sub category 2"
Scenario: Add a bunch of grade items
Given the following "courses" exist:
| fullname | shortname |
| Course 1 | C1 |
And the following "grade categories" exist:
| fullname | course |
| Grade category 1 | C1 |
And the following "grade categories" exist:
| fullname | course | gradecategory |
| Grade sub category 2 | C1 | Grade category 1 |
And the following "grade items" exist:
| itemname | course |
| Test Grade Item 1 | C1 |
And the following "grade items" exist:
| itemname | course | gradecategory |
| Test Grade Item 2 | C1 | Grade category 1 |
| Test Grade Item 3 | C1 | Grade sub category 2 |
When I log in as "admin"
And I follow "Course 1"
And I follow "Grades"
And I expand "Setup" node
And I follow "Categories and items"
Then I should see "Test Grade Item 1"
And I follow "Edit Test Grade Item 1"
And I expand all fieldsets
And I should see "Course 1"
And I press "Cancel"
And I should see "Grade category 1"
And I should see "Test Grade Item 2"
And I follow "Edit Test Grade Item 2"
And I expand all fieldsets
And I should see "Grade category 1"
And I press "Cancel"
And I should see "Grade sub category 2"
And I should see "Test Grade Item 3"
And I follow "Edit Test Grade Item 3"
And I expand all fieldsets
And I should see "Grade sub category 2"
And I press "Cancel"
Scenario: Add a bunch of scales
Given the following "courses" exist:
| fullname | shortname |
| Course 1 | C1 |
And the following "scales" exist:
| name | scale |
| Test Scale 1 | Disappointing, Good, Very good, Excellent |
When I log in as "admin"
And I follow "Course 1"
And I follow "Grades"
And I follow "Scales"
Then I should see "Test Scale 1"
And I should see "Disappointing, Good, Very good, Excellent"
Scenario: Add a bunch of outcomes
Given the following "courses" exist:
| fullname | shortname |
| Course 1 | C1 |
And the following "scales" exist:
| name | scale |
| Test Scale 1 | Disappointing, Good, Very good, Excellent |
And the following "grade outcomes" exist:
| fullname | shortname | scale |
| Grade outcome 1 | OT1 | Test Scale 1 |
And the following "grade outcomes" exist:
| fullname | shortname | course | scale |
| Grade outcome 2 | OT2 | C1 | Test Scale 1 |
When I log in as "admin"
And I set the following administration settings values:
| Enable outcomes | 1 |
And I follow "Home"
And I follow "Course 1"
And I follow "Outcomes"
Then I should see "Grade outcome 1" in the "#addoutcomes" "css_element"
And I should see "Grade outcome 2" in the "#removeoutcomes" "css_element"
And I follow "Edit outcomes"
And the following should exist in the "generaltable" table:
| Full name | Short name | Scale |
| Grade outcome 2 | OT2 | Test Scale 1 |
Scenario: Add a bunch of outcome grade items
Given the following "courses" exist:
| fullname | shortname |
| Course 1 | C1 |
And the following "scales" exist:
| name | scale |
| Test Scale 1 | Disappointing, Good, Very good, Excellent |
And the following "grade outcomes" exist:
| fullname | shortname | course | scale |
| Grade outcome 1 | OT1 | C1 | Test Scale 1 |
And the following "grade categories" exist:
| fullname | course |
| Grade category 1 | C1 |
And the following "grade items" exist:
| itemname | course | outcome | gradecategory |
| Test Outcome Grade Item 1 | C1 | OT1 | Grade category 1 |
When I log in as "admin"
And I set the following administration settings values:
| Enable outcomes | 1 |
And I follow "Home"
And I follow "Course 1"
And I follow "Grades"
And I expand "Setup" node
And I follow "Categories and items"
Then I should see "Test Outcome Grade Item 1"
And I follow "Edit Test Outcome Grade Item 1"
And the field "Outcome" matches value "Grade outcome 1"
And I expand all fieldsets
And "//div[contains(@class, 'fitem')]/div[contains(@class, 'fitemtitle')]/div[contains(@class, fstaticlabel) and contains(., 'Grade category')]/../../div[contains(@class, 'felement') and contains(., 'Grade category 1')]" "xpath_element" should exist
And I press "Cancel"
+2 -2
View 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)
+2 -2
View 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).
+3
View File
@@ -48,5 +48,8 @@ function xmldb_tool_customlang_upgrade($oldversion) {
// Moodle v2.7.0 release upgrade line.
// Put any upgrade step following this.
// Moodle v2.8.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+2 -2
View 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)
+2 -2
View 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).
+2 -2
View 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';
+2 -2
View 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
+2 -2
View 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)
@@ -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';
+2 -2
View 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;
@@ -36,6 +36,7 @@ defined('MOODLE_INTERNAL') || die();
* }
*
* @package tool_langimport
* @since Moodle 2.8
* @copyright 2014 Dan Poltawski <dan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -36,6 +36,7 @@ defined('MOODLE_INTERNAL') || die();
* }
*
* @package tool_langimport
* @since Moodle 2.8
* @copyright 2014 Dan Poltawski <dan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -36,6 +36,7 @@ defined('MOODLE_INTERNAL') || die();
* }
*
* @package tool_langimport
* @since Moodle 2.8
* @copyright 2014 Dan Poltawski <dan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -45,6 +45,14 @@ class update_langpacks_task extends \core\task\scheduled_task {
* Run langpack update
*/
public function execute() {
global $CFG;
if (!empty($CFG->skiplangupgrade)) {
mtrace('Langpack update skipped. ($CFG->skiplangupgrade set)');
return;
}
$controller = new \tool_langimport\controller();
if ($controller->update_all_installed_languages()) {
foreach ($controller->info as $message) {
+2 -2
View 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)
+5 -2
View File
@@ -213,11 +213,14 @@ class manager implements \core\log\manager {
* @param string $info Additional description information
* @param int $cm The course_module->id if there is one
* @param int|\stdClass $user If log regards $user other than $USER
* @param string $ip Override the IP, should only be used for restore.
* @param int $time Override the log time, should only be used for restore.
*/
public function legacy_add_to_log($courseid, $module, $action, $url = '', $info = '', $cm = 0, $user = 0) {
public function legacy_add_to_log($courseid, $module, $action, $url = '', $info = '',
$cm = 0, $user = 0, $ip = null, $time = null) {
$this->init();
if (isset($this->stores['logstore_legacy'])) {
$this->stores['logstore_legacy']->legacy_add_to_log($courseid, $module, $action, $url, $info, $cm, $user);
$this->stores['logstore_legacy']->legacy_add_to_log($courseid, $module, $action, $url, $info, $cm, $user, $ip, $time);
}
}
}
+3
View File
@@ -46,5 +46,8 @@ function xmldb_tool_log_upgrade($oldversion) {
// Moodle v2.7.0 release upgrade line.
// Put any upgrade step following this.
// Moodle v2.8.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
@@ -36,5 +36,8 @@ function xmldb_logstore_database_upgrade($oldversion) {
// Moodle v2.7.0 release upgrade line.
// Put any upgrade step following this.
// Moodle v2.8.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+2 -2
View 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).
@@ -143,8 +143,10 @@ class store implements \tool_log\log\store, \core\log\sql_select_reader {
* @param string $info Additional description information
* @param int $cm The course_module->id if there is one
* @param int|\stdClass $user If log regards $user other than $USER
* @param string $ip Override the IP, should only be used for restore.
* @param int $time Override the log time, should only be used for restore.
*/
public function legacy_add_to_log($courseid, $module, $action, $url, $info, $cm, $user) {
public function legacy_add_to_log($courseid, $module, $action, $url, $info, $cm, $user, $ip = null, $time = null) {
// Note that this function intentionally does not follow the normal Moodle DB access idioms.
// This is for a good reason: it is the most frequently used DB update function,
// so it has been optimised for speed.
@@ -172,9 +174,9 @@ class store implements \tool_log\log\store, \core\log\sql_select_reader {
}
}
$remoteaddr = getremoteaddr();
$remoteaddr = (is_null($ip)) ? getremoteaddr() : $ip;
$timenow = time();
$timenow = (is_null($time)) ? time() : $time;
if (!empty($url)) { // Could break doing html_entity_decode on an empty var.
$url = html_entity_decode($url, ENT_QUOTES, 'UTF-8');
} else {
+2 -2
View 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).
@@ -114,5 +114,8 @@ function xmldb_logstore_standard_upgrade($oldversion) {
// Moodle v2.7.0 release upgrade line.
// Put any upgrade step following this.
// Moodle v2.8.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+2 -2
View 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).
+2 -2
View 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).
@@ -62,15 +62,24 @@ class tool_messageinbound_edit_handler_form extends moodleform {
// Items which can be configured.
$mform->addElement('header', 'configuration', get_string('configuration'));
$options = array(
HOURSECS => get_string('onehour', 'tool_messageinbound'),
DAYSECS => get_string('oneday', 'tool_messageinbound'),
WEEKSECS => get_string('oneweek', 'tool_messageinbound'),
YEARSECS => get_string('oneyear', 'tool_messageinbound'),
'' => get_string('noexpiry', 'tool_messageinbound'),
);
$mform->addElement('select', 'defaultexpiration', get_string('defaultexpiration', 'tool_messageinbound'), $options);
$mform->addHelpButton('defaultexpiration', 'defaultexpiration', 'tool_messageinbound');
if ($handler->can_change_defaultexpiration()) {
// Show option to change expiry only if the handler supports it.
$options = array(
HOURSECS => get_string('onehour', 'tool_messageinbound'),
DAYSECS => get_string('oneday', 'tool_messageinbound'),
WEEKSECS => get_string('oneweek', 'tool_messageinbound'),
YEARSECS => get_string('oneyear', 'tool_messageinbound'),
0 => get_string('noexpiry', 'tool_messageinbound'),
);
$mform->addElement('select', 'defaultexpiration', get_string('defaultexpiration', 'tool_messageinbound'), $options);
$mform->addHelpButton('defaultexpiration', 'defaultexpiration', 'tool_messageinbound');
} else {
$text = $this->get_defaultexpiration_text($handler);
$mform->addElement('static', 'defaultexpiration_fake', get_string('defaultexpiration', 'tool_messageinbound'), $text);
$mform->addElement('hidden', 'defaultexpiration');
$mform->addHelpButton('defaultexpiration_fake', 'defaultexpiration', 'tool_messageinbound');
$mform->setType('defaultexpiration', PARAM_INT);
}
if ($handler->can_change_validateaddress()) {
$mform->addElement('checkbox', 'validateaddress', get_string('requirevalidation', 'tool_messageinbound'));
@@ -103,4 +112,28 @@ class tool_messageinbound_edit_handler_form extends moodleform {
$this->add_action_buttons(true, get_string('savechanges'));
}
/**
* Return a text string representing the selected default expiration for the handler.
*
* @param \core\message\inbound\handler $handler handler instance.
*
* @return string localised text string.
*/
protected function get_defaultexpiration_text(\core\message\inbound\handler $handler) {
switch($handler->defaultexpiration) {
case HOURSECS :
return get_string('onehour', 'tool_messageinbound');
case DAYSECS :
return get_string('oneday', 'tool_messageinbound');
case WEEKSECS :
return get_string('oneweek', 'tool_messageinbound');
case YEARSECS :
return get_string('oneyear', 'tool_messageinbound');
case 0:
return get_string('noexpiry', 'tool_messageinbound');
default:
return ''; // Should never happen.
}
}
}
+62 -26
View File
@@ -291,6 +291,11 @@ class manager {
// First flag this message to prevent another running hitting this message while we look at the headers.
$this->add_flag_to_message($messageid, self::MESSAGE_FLAGGED);
if ($this->is_bulk_message($message, $messageid)) {
mtrace("- The message has a bulk header set. This is likely an auto-generated reply - discarding.");
return;
}
// Record the user that this script is currently being run as. This is important when re-processing existing
// messages, as cron_setup_user is called multiple times.
$originaluser = $USER;
@@ -363,7 +368,10 @@ class manager {
// Process and retrieve the message data for this message.
// This includes fetching the full content, as well as all headers, and attachments.
$this->process_message_data($envelope, $messagedata, $messageid);
if (!$this->process_message_data($envelope, $messagedata, $messageid)) {
mtrace("--- Message could not be found on the server. Is another process removing messages?");
return;
}
// When processing validation replies, we need to skip the sender verification phase as this has been
// manually completed.
@@ -403,7 +411,7 @@ class manager {
mtrace("-- Returning to the original user.");
cron_setup_user($originaluser);
return;
} catch (Exception $e) {
} catch (\Exception $e) {
// An unknown error occurred. The user is not informed, but the administrator is.
mtrace("-- Message processing failed. An unexpected exception was thrown. Details follow.");
mtrace($e->getMessage());
@@ -457,36 +465,25 @@ class manager {
$query = new \Horde_Imap_Client_Fetch_Query();
$query->imapDate();
// Fetch all of the message parts too.
$typemap = $structure->contentTypeMap();
foreach ($typemap as $part => $type) {
// The header.
$query->headerText(array(
'id' => $part,
));
}
// Fetch the message header.
$query->headerText();
// Retrieve the message with the above components.
$messagedata = $this->client->fetch($mailbox, $query, array('ids' => $messageid))->first();
// Store the data for this message.
$headers = '';
foreach ($typemap as $part => $type) {
// Grab all of the header data into a string.
$headers .= $messagedata->getHeaderText($part);
// We don't handle any of the other MIME content at this stage.
if (!$messagedata) {
// Message was not found! Somehow it has been removed or is no longer returned.
return null;
}
$data = new \stdClass();
// The message ID should always be in the first part.
$data = new \stdClass();
$data->messageid = $messagedata->getHeaderText(0, \Horde_Imap_Client_Data_Fetch::HEADER_PARSE)->getValue('Message-ID');
$data->subject = $envelope->subject;
$data->timestamp = $messagedata->getImapDate()->__toString();
$data->envelope = $envelope;
$data->data = $this->addressmanager->get_data();
$data->headers = $headers;
$data->headers = $messagedata->getHeaderText();
$this->currentmessagedata = $data;
@@ -496,9 +493,8 @@ class manager {
/**
* Process a message again to add body and attachment data.
*
* @param Horde_Imap_Client_Data_Envelope $envelope The Envelope of the message
* @param Horde_Imap_Client_Data_Fetch $basemessagedata The structure and part of the message body
* @param string|Horde_Imap_Client_Ids $messageid The Hore message Uid
* @param \Horde_Imap_Client_Data_Fetch $basemessagedata The structure and part of the message body
* @param string|\Horde_Imap_Client_Ids $messageid The Hore message Uid
* @return \stdClass The current value of the messagedata
*/
private function process_message_data_body(
@@ -616,6 +612,9 @@ class manager {
private function process_message_part_attachment($messagedata, $partdata, $part, $filename) {
global $CFG;
// For Antivirus, the repository/lib.php must be included as it is not autoloaded.
require_once($CFG->dirroot . '/repository/lib.php');
// If a filename is present, assume that this part is an attachment.
$attachment = new \stdClass();
$attachment->filename = $filename;
@@ -647,7 +646,7 @@ class manager {
// Perform a virus scan now.
try {
\repository::antivir_scan_file($filepath, $attachment->filename, true);
} catch (moodle_exception $e) {
} catch (\moodle_exception $e) {
mtrace("--> A virus was found in the attachment '{$attachment->filename}'.");
$this->inform_attachment_virus();
return;
@@ -736,6 +735,43 @@ class manager {
return in_array($flag, $flags);
}
/**
* Attempt to determine whether this message is a bulk message (e.g. automated reply).
*
* @param \Horde_Imap_Client_Data_Fetch $message The message to process
* @param string|\Horde_Imap_Client_Ids $messageid The Hore message Uid
* @return boolean
*/
private function is_bulk_message(
\Horde_Imap_Client_Data_Fetch $message,
$messageid) {
$query = new \Horde_Imap_Client_Fetch_Query();
$query->headerText(array('peek' => true));
$messagedata = $this->client->fetch($this->get_mailbox(), $query, array('ids' => $messageid))->first();
// Assume that this message is not bulk to begin with.
$isbulk = false;
// An auto-reply may itself include the Bulk Precedence.
$precedence = $messagedata->getHeaderText(0, \Horde_Imap_Client_Data_Fetch::HEADER_PARSE)->getValue('Precedence');
$isbulk = $isbulk || strtolower($precedence) == 'bulk';
// If the X-Autoreply header is set, and not 'no', then this is an automatic reply.
$autoreply = $messagedata->getHeaderText(0, \Horde_Imap_Client_Data_Fetch::HEADER_PARSE)->getValue('X-Autoreply');
$isbulk = $isbulk || ($autoreply && $autoreply != 'no');
// If the X-Autorespond header is set, and not 'no', then this is an automatic response.
$autorespond = $messagedata->getHeaderText(0, \Horde_Imap_Client_Data_Fetch::HEADER_PARSE)->getValue('X-Autorespond');
$isbulk = $isbulk || ($autorespond && $autorespond != 'no');
// If the Auto-Submitted header is set, and not 'no', then this is a non-human response.
$autosubmitted = $messagedata->getHeaderText(0, \Horde_Imap_Client_Data_Fetch::HEADER_PARSE)->getValue('Auto-Submitted');
$isbulk = $isbulk || ($autosubmitted && $autosubmitted != 'no');
return $isbulk;
}
/**
* Send the message to the appropriate handler.
*
@@ -758,7 +794,7 @@ class manager {
$error->message = $e->getMessage();
throw new \core\message\inbound\processing_failed_exception('messageprocessingfailed', 'tool_messageinbound', $error);
} catch (Exception $e) {
} catch (\Exception $e) {
mtrace("-> The Inbound Message handler threw an exception. Unable to process this message. User informed.");
mtrace("--> " . $e->getMessage());
// An unknown error occurred. Still inform the user but, this time do not include the specific
@@ -46,7 +46,7 @@ class invalid_recipient_handler extends \core\message\inbound\handler {
/**
* Do not allow changes to the address validation setting.
*/
public function allow_validateaddress_change() {
public function can_change_validateaddress() {
return false;
}
+4 -1
View File
@@ -58,8 +58,11 @@ if (empty($classname)) {
if ($mform->is_cancelled()) {
redirect($PAGE->url);
} else if ($data = $mform->get_data()) {
// Update the record from the form.
$record->defaultexpiration = (int) $data->defaultexpiration;
if ($handler->can_change_defaultexpiration()) {
$record->defaultexpiration = (int) $data->defaultexpiration;
}
if ($handler->can_change_validateaddress()) {
$record->validateaddress = !empty($data->validateaddress);
@@ -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';
+2 -2
View 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';
@@ -0,0 +1,77 @@
<?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 tool_monitor rule created event.
*
* @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\event;
defined('MOODLE_INTERNAL') || die();
/**
* The tool_monitor rule created event class.
*
* @package tool_monitor
* @since Moodle 2.8
* @copyright 2014 Mark Nelson <markn@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class rule_created extends \core\event\base {
/**
* Init method.
*
* @return void
*/
protected function init() {
$this->data['objecttable'] = 'tool_monitor_rules';
$this->data['crud'] = 'c';
$this->data['edulevel'] = self::LEVEL_OTHER;
}
/**
* Return localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventrulecreated', 'tool_monitor');
}
/**
* Returns description of what happened.
*
* @return string
*/
public function get_description() {
return "The user with id '$this->userid' created the event monitor rule with id '$this->objectid'.";
}
/**
* Get URL related to the action
*
* @return \moodle_url
*/
public function get_url() {
return new \moodle_url('/admin/tool/monitor/edit.php', array('ruleid' => $this->objectid,
'courseid' => $this->courseid));
}
}
@@ -0,0 +1,76 @@
<?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 tool_monitor rule deleted event.
*
* @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\event;
defined('MOODLE_INTERNAL') || die();
/**
* The tool_monitor rule deleted event class.
*
* @package tool_monitor
* @since Moodle 2.8
* @copyright 2014 Mark Nelson <markn@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class rule_deleted extends \core\event\base {
/**
* Init method.
*
* @return void
*/
protected function init() {
$this->data['objecttable'] = 'tool_monitor_rules';
$this->data['crud'] = 'd';
$this->data['edulevel'] = self::LEVEL_OTHER;
}
/**
* Return localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventruledeleted', 'tool_monitor');
}
/**
* Returns description of what happened.
*
* @return string
*/
public function get_description() {
return "The user with id '$this->userid' deleted the event monitor rule with id '$this->objectid'.";
}
/**
* Get URL related to the action
*
* @return \moodle_url
*/
public function get_url() {
return new \moodle_url('/admin/tool/monitor/managerules.php', array('courseid' => $this->courseid));
}
}
@@ -0,0 +1,77 @@
<?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 tool_monitor rule updated event.
*
* @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\event;
defined('MOODLE_INTERNAL') || die();
/**
* The tool_monitor rule updated event class.
*
* @package tool_monitor
* @since Moodle 2.8
* @copyright 2014 Mark Nelson <markn@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class rule_updated extends \core\event\base {
/**
* Init method.
*
* @return void
*/
protected function init() {
$this->data['objecttable'] = 'tool_monitor_rules';
$this->data['crud'] = 'u';
$this->data['edulevel'] = self::LEVEL_OTHER;
}
/**
* Return localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventruleupdated', 'tool_monitor');
}
/**
* Returns description of what happened.
*
* @return string
*/
public function get_description() {
return "The user with id '$this->userid' updated the event monitor rule with id '$this->objectid'.";
}
/**
* Get URL related to the action
*
* @return \moodle_url
*/
public function get_url() {
return new \moodle_url('/admin/tool/monitor/edit.php', array('ruleid' => $this->objectid,
'courseid' => $this->courseid));
}
}
@@ -0,0 +1,67 @@
<?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 tool_monitor subscription created event.
*
* @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\event;
defined('MOODLE_INTERNAL') || die();
/**
* The tool_monitor subscription created event class.
*
* @package tool_monitor
* @since Moodle 2.8
* @copyright 2014 Mark Nelson <markn@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class subscription_created extends \core\event\base {
/**
* Init method.
*
* @return void
*/
protected function init() {
$this->data['objecttable'] = 'tool_monitor_subscriptions';
$this->data['crud'] = 'c';
$this->data['edulevel'] = self::LEVEL_TEACHING;
}
/**
* Return localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventsubcreated', 'tool_monitor');
}
/**
* Returns description of what happened.
*
* @return string
*/
public function get_description() {
return "The user with id '$this->userid' created the event monitor subscription with id '$this->objectid'.";
}
}
@@ -0,0 +1,86 @@
<?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 tool_monitor subscription criteria met event.
*
* @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\event;
defined('MOODLE_INTERNAL') || die();
/**
* The tool_monitor subscription criteria met event class.
*
* @property-read array $other {
* Extra information about event.
*
* - string subscriptionid: id of the subscription.
* }
*
* @package tool_monitor
* @since Moodle 2.8
* @copyright 2014 Mark Nelson <markn@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class subscription_criteria_met extends \core\event\base {
/**
* Init method.
*
* @return void
*/
protected function init() {
$this->data['crud'] = 'c';
$this->data['edulevel'] = self::LEVEL_TEACHING;
}
/**
* Return localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventsubcriteriamet', 'tool_monitor');
}
/**
* Returns description of what happened.
*
* @return string
*/
public function get_description() {
return "The criteria for the subscription with id '{$this->other['subscriptionid']}' was met.";
}
/**
* Custom validation.
*
* @throws \coding_exception
* @return void
*/
protected function validate_data() {
parent::validate_data();
if (!isset($this->other['subscriptionid'])) {
throw new \coding_exception('The \'subscriptionid\' value must be set in other.');
}
}
}
@@ -0,0 +1,67 @@
<?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 tool_monitor subscription deleted event.
*
* @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\event;
defined('MOODLE_INTERNAL') || die();
/**
* The tool_monitor subscription deleted event class.
*
* @package tool_monitor
* @since Moodle 2.8
* @copyright 2014 Mark Nelson <markn@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class subscription_deleted extends \core\event\base {
/**
* Init method.
*
* @return void
*/
protected function init() {
$this->data['objecttable'] = 'tool_monitor_subscriptions';
$this->data['crud'] = 'd';
$this->data['edulevel'] = self::LEVEL_TEACHING;
}
/**
* Return localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventsubdeleted', 'tool_monitor');
}
/**
* Returns description of what happened.
*
* @return string
*/
public function get_description() {
return "The user with id '$this->userid' deleted the event monitor subscription with id '$this->objectid'.";
}
}
+221
View File
@@ -0,0 +1,221 @@
<?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/>.
/**
* Event documentation
*
* @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
*/
namespace tool_monitor;
defined('MOODLE_INTERNAL') || die();
/**
* Class for returning event information.
*
* @since Moodle 2.8
* @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
*/
class eventlist {
/**
* Return all of the core event files.
*
* @return array Core events.
*/
protected static function get_core_eventlist() {
global $CFG;
// Disable developer debugging as deprecated events will fire warnings.
// Setup backup variables to restore the following settings back to what they were when we are finished.
$debuglevel = $CFG->debug;
$debugdisplay = $CFG->debugdisplay;
$debugdeveloper = $CFG->debugdeveloper;
$CFG->debug = 0;
$CFG->debugdisplay = false;
$CFG->debugdeveloper = false;
$eventinformation = array();
$directory = $CFG->libdir . '/classes/event';
$files = self::get_file_list($directory);
// Remove exceptional events that will cause problems being displayed.
if (isset($files['unknown_logged'])) {
unset($files['unknown_logged']);
}
foreach ($files as $file => $location) {
$classname = '\\core\\event\\' . $file;
// Check to see if this is actually a valid event.
if (method_exists($classname, 'get_static_info')) {
$ref = new \ReflectionClass($classname);
// Ignore abstracts.
if (!$ref->isAbstract() && $file != 'manager') {
$eventinformation[$classname] = $classname::get_name();
}
}
}
// Now enable developer debugging as event information has been retrieved.
$CFG->debug = $debuglevel;
$CFG->debugdisplay = $debugdisplay;
$CFG->debugdeveloper = $debugdeveloper;
return $eventinformation;
}
/**
* This function returns an array of all events for the plugins of the system.
*
* @param bool $withoutcomponent Return an eventlist without associated components.
*
* @return array A list of events from all plug-ins.
*/
protected static function get_non_core_eventlist($withoutcomponent = false) {
global $CFG;
// Disable developer debugging as deprecated events will fire warnings.
// Setup backup variables to restore the following settings back to what they were when we are finished.
$debuglevel = $CFG->debug;
$debugdisplay = $CFG->debugdisplay;
$debugdeveloper = $CFG->debugdeveloper;
$CFG->debug = 0;
$CFG->debugdisplay = false;
$CFG->debugdeveloper = false;
$noncorepluginlist = array();
$plugintypes = \core_component::get_plugin_types();
foreach ($plugintypes as $plugintype => $notused) {
$pluginlist = \core_component::get_plugin_list($plugintype);
foreach ($pluginlist as $plugin => $directory) {
$plugindirectory = $directory . '/classes/event';
foreach (self::get_file_list($plugindirectory) as $eventname => $notused) {
$plugineventname = '\\' . $plugintype . '_' . $plugin . '\\event\\' . $eventname;
// Check that this is actually an event.
if (method_exists($plugineventname, 'get_static_info') && $plugin != 'monitor') { // No selfie here.
$ref = new \ReflectionClass($plugineventname);
if (!$ref->isAbstract() && $plugin != 'legacy') {
if ($withoutcomponent) {
$noncorepluginlist[$plugineventname] = $plugineventname::get_name();
} else {
$noncorepluginlist[$plugintype . '_' . $plugin][$plugineventname] = $plugineventname::get_name();
}
}
}
}
}
}
// Now enable developer debugging as event information has been retrieved.
$CFG->debug = $debuglevel;
$CFG->debugdisplay = $debugdisplay;
$CFG->debugdeveloper = $debugdeveloper;
return $noncorepluginlist;
}
/**
* Returns a list of files with a full directory path in a specified directory.
*
* @param string $directory location of files.
* @return array full location of files from the specified directory.
*/
protected static function get_file_list($directory) {
global $CFG;
$directoryroot = $CFG->dirroot;
$finalfiles = array();
if (is_dir($directory)) {
if ($handle = opendir($directory)) {
$files = scandir($directory);
foreach ($files as $file) {
if ($file != '.' && $file != '..') {
// Ignore the file if it is external to the system.
if (strrpos($directory, $directoryroot) !== false) {
$location = substr($directory, strlen($directoryroot));
$name = substr($file, 0, -4);
$finalfiles[$name] = $location . '/' . $file;
}
}
}
}
}
return $finalfiles;
}
/**
* Get a list of events present in the system.
*
* @param bool $withoutcomponent Return an eventlist without associated components.
*
* @return array list of events present in the system.
*/
public static function get_all_eventlist($withoutcomponent = false) {
if ($withoutcomponent) {
$return = array_merge(self::get_core_eventlist(), self::get_non_core_eventlist($withoutcomponent));
array_multisort($return, SORT_NATURAL);
} else {
$return = array_merge(array('core' => self::get_core_eventlist()),
self::get_non_core_eventlist($withoutcomponent = false));
}
return $return;
}
/**
* Return list of plugins that have events.
*
* @param array $eventlist a list of events present in the system {@link eventlist::get_all_eventlist}.
*
* @return array list of plugins with human readable name.
*/
public static function get_plugin_list($eventlist = array()) {
if (empty($eventlist)) {
$eventlist = self::get_all_eventlist();
}
$plugins = array_keys($eventlist);
$return = array();
foreach ($plugins as $plugin) {
if ($plugin === 'core') {
$return[$plugin] = get_string('core', 'tool_monitor');
} else if (get_string_manager()->string_exists('pluginname', $plugin)) {
$return[$plugin] = get_string('pluginname', $plugin);
} else {
$return[$plugin] = $plugin;
}
}
return $return;
}
/**
* validate if the given event belongs to the given plugin.
*
* @param string $plugin Frankenstyle name of the plugin.
* @param string $eventname Full qualified event name.
* @param array $eventlist List of events generated by {@link eventlist::get_all_eventlist}
*
* @return bool Returns true if the selected event belongs to the selected plugin, false otherwise.
*/
public static function validate_event_plugin($plugin, $eventname, $eventlist = array()) {
if (empty($eventlist)) {
$eventlist = self::get_all_eventlist();
}
if (isset($eventlist[$plugin][$eventname])) {
return true;
}
return false;
}
}
@@ -0,0 +1,253 @@
<?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/>.
/**
* Observer class containing methods monitoring various events.
*
* @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
*/
namespace tool_monitor;
defined('MOODLE_INTERNAL') || die();
/**
* Observer class containing methods monitoring various events.
*
* @since Moodle 2.8
* @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
*/
class eventobservers {
/** @var array $buffer buffer of events. */
protected $buffer = array();
/** @var int Number of entries in the buffer. */
protected $count = 0;
/** @var eventobservers a reference to a self instance. */
protected static $instance;
/**
* Course delete event observer.
* This observer monitors course delete event, and when a course is deleted it deletes any rules and subscriptions associated
* with it, so no orphan data is left behind.
*
* @param \core\event\course_deleted $event The course deleted event.
*/
public static function course_deleted(\core\event\course_deleted $event) {
$rules = rule_manager::get_rules_by_courseid($event->courseid, 0, 0, false);
foreach ($rules as $rule) {
rule_manager::delete_rule($rule->id, $event->get_context());
}
}
/**
* The observer monitoring all the events.
*
* This observers puts small event objects in buffer for later writing to the database. At the end of the request the buffer
* is cleaned up and all data dumped into the tool_monitor_events table.
*
* @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();
// Register shutdown handler - this is useful for buffering, processing events, etc.
\core_shutdown_manager::register_function(array(self::$instance, 'process_buffer'));
}
self::$instance->buffer_event($event);
if (PHPUNIT_TEST) {
// Process buffer after every event when unit testing.
self::$instance->process_buffer();
}
}
/**
* Api to buffer events to store, to reduce db queries.
*
* @param \core\event\base $event
*/
protected function buffer_event(\core\event\base $event) {
// If there are no subscriptions for this event do not buffer it.
if (!\tool_monitor\subscription_manager::event_has_subscriptions($event->eventname, $event->courseid)) {
return;
}
$eventdata = $event->get_data();
$eventobj = new \stdClass();
$eventobj->eventname = $eventdata['eventname'];
$eventobj->contextid = $eventdata['contextid'];
$eventobj->contextlevel = $eventdata['contextlevel'];
$eventobj->contextinstanceid = $eventdata['contextinstanceid'];
if ($event->get_url()) {
// Get link url if exists.
$eventobj->link = $event->get_url()->out();
} else {
$eventobj->link = '';
}
$eventobj->courseid = $eventdata['courseid'];
$eventobj->timecreated = $eventdata['timecreated'];
$this->buffer[] = $eventobj;
$this->count++;
}
/**
* This method process all events stored in the buffer.
*
* This is a multi purpose api. It does the following:-
* 1. Write event data to tool_monitor_events
* 2. Find out users that need to be notified about rule completion and schedule a task to send them messages.
*/
public function process_buffer() {
global $DB;
$events = $this->flush(); // Flush data.
$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) {
$subscriptions = subscription_manager::get_subscriptions_by_event($eventobj);
$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";
$params = array('eventname' => $eventobj->eventname, 'starttime' => $starttime);
} else {
// Course level subscription.
if ($subscription->cmid == 0) {
// All modules.
$where = "eventname = :eventname AND courseid = :courseid AND timecreated > :starttime";
$params = array('eventname' => $eventobj->eventname, 'courseid' => $eventobj->courseid,
'starttime' => $starttime);
} else {
// Specific module.
$where = "eventname = :eventname AND courseid = :courseid AND contextinstanceid = :cmid
AND timecreated > :starttime";
$params = array('eventname' => $eventobj->eventname, 'courseid' => $eventobj->courseid,
'cmid' => $eventobj->contextinstanceid, 'starttime' => $starttime);
}
}
$sql = $select . "WHERE " . $where;
$count = $DB->count_records_sql($sql, $params);
if (!empty($count) && $count >= $subscription->frequency) {
$idstosend[] = $subscription->id;
// Trigger a subscription_criteria_met event.
// It's possible that the course has been deleted since the criteria was met, so in that case use
// the system context. Set it here and change later if needed.
$context = \context_system::instance();
// We can't perform if (!empty($subscription->courseid)) below as it uses the magic method
// __get to return the variable, which will always result in being empty.
$courseid = $subscription->courseid;
if (!empty($courseid)) {
if ($coursecontext = \context_course::instance($courseid, IGNORE_MISSING)) {
$context = $coursecontext;
}
}
$params = array(
'userid' => $subscription->userid,
'courseid' => $subscription->courseid,
'context' => $context,
'other' => array(
'subscriptionid' => $subscription->id
)
);
$event = \tool_monitor\event\subscription_criteria_met::create($params);
$event->trigger();
}
}
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();
$adhocktask->set_custom_data($messagestosend);
$adhocktask->set_component('tool_monitor');
\core\task\manager::queue_adhoc_task($adhocktask);
}
}
/**
* Protected method that flushes the buffer of events and writes them to the database.
*
* @return array a copy of the events buffer.
*/
protected function flush() {
global $DB;
// Flush the buffer to the db.
$events = $this->buffer;
$DB->insert_records('tool_monitor_events', $events); // Insert the whole chunk into the database.
$this->buffer = array();
$this->count = 0;
return $events;
}
/**
* Observer that monitors user deleted event and delete user subscriptions.
*
* @param \core\event\user_deleted $event the event object.
*/
public static function user_deleted(\core\event\user_deleted $event) {
$userid = $event->objectid;
subscription_manager::delete_user_subscriptions($userid);
}
/**
* Observer that monitors course module deleted event and delete user subscriptions.
*
* @param \core\event\course_module_deleted $event the event object.
*/
public static function course_module_deleted(\core\event\course_module_deleted $event) {
$cmid = $event->contextinstanceid;
subscription_manager::delete_cm_subscriptions($cmid);
}
}
@@ -0,0 +1,124 @@
<?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/>.
/**
* This file defines an adhoc task to send notifications.
*
* @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
*/
namespace tool_monitor;
defined('MOODLE_INTERNAL') || die();
/**
* Adhock class, used to send notifications to users.
*
* @since Moodle 2.8
* @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
*/
class notification_task extends \core\task\adhoc_task {
/**
* Send out messages.
*/
public function execute() {
foreach ($this->get_custom_data() as $data) {
$eventobj = $data->event;
$subscriptionids = $data->subscriptionids;
foreach ($subscriptionids as $id) {
if ($message = $this->generate_message($id, $eventobj)) {
mtrace("Sending message to the user with id " . $message->userto->id . " for the subscription with id $id...");
message_send($message);
mtrace("Sent.");
}
}
}
}
/**
* Generates the message object for a give subscription and event.
*
* @param int $subscriptionid Subscription instance
* @param \stdClass $eventobj Event data
*
* @return false|\stdClass message object
*/
protected function generate_message($subscriptionid, \stdClass $eventobj) {
try {
$subscription = subscription_manager::get_subscription($subscriptionid);
} catch (\dml_exception $e) {
// Race condition, someone deleted the subscription.
return false;
}
$user = \core_user::get_user($subscription->userid);
if (empty($user)) {
// User doesn't exist. Should never happen, nothing to do return.
return false;
}
$context = \context_user::instance($user->id, IGNORE_MISSING);
if ($context === false) {
// User context doesn't exist. Should never happen, nothing to do return.
return false;
}
$template = $subscription->template;
$template = $this->replace_placeholders($template, $subscription, $eventobj, $context);
$msgdata = new \stdClass();
$msgdata->component = 'tool_monitor'; // Your component name.
$msgdata->name = 'notification'; // This is the message name from messages.php.
$msgdata->userfrom = \core_user::get_noreply_user();
$msgdata->userto = $user;
$msgdata->subject = $subscription->get_name($context);
$msgdata->fullmessage = format_text($template, $subscription->templateformat, array('context' => $context));
$msgdata->fullmessageformat = $subscription->templateformat;
$msgdata->fullmessagehtml = format_text($template, $subscription->templateformat, array('context' => $context));
$msgdata->smallmessage = '';
$msgdata->notification = 1; // This is only set to 0 for personal messages between users.
return $msgdata;
}
/**
* Replace place holders in the template with respective content.
*
* @param string $template Message template.
* @param subscription $subscription subscription instance
* @param \stdclass $eventobj Event data
* @param \context $context context object
*
* @return mixed final template string.
*/
protected function replace_placeholders($template, subscription $subscription, $eventobj, $context) {
$template = str_replace('{link}', $eventobj->link, $template);
if ($eventobj->contextlevel == CONTEXT_MODULE && !empty($eventobj->contextinstanceid)
&& (strpos($template, '{modulelink}') !== false)) {
$cm = get_fast_modinfo($eventobj->courseid)->get_cm($eventobj->contextinstanceid);
$modulelink = $cm->url;
$template = str_replace('{modulelink}', $modulelink, $template);
}
$template = str_replace('{rulename}', $subscription->get_name($context), $template);
$template = str_replace('{description}', $subscription->get_description($context), $template);
$template = str_replace('{eventname}', $subscription->get_event_name(), $template);
return $template;
}
}
@@ -0,0 +1,214 @@
<?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/>.
/**
* Renderable class for manage rules page.
*
* @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
*/
namespace tool_monitor\output\managerules;
defined('MOODLE_INTERNAL') || die;
require_once($CFG->libdir . '/tablelib.php');
/**
* Renderable class for manage rules page.
*
* @since Moodle 2.8
* @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
*/
class renderable extends \table_sql implements \renderable {
/**
* @var int course id.
*/
public $courseid;
/**
* @var \context_course|\context_system context of the page to be rendered.
*/
protected $context;
/**
* @var bool Does the user have capability to manage rules at site context.
*/
protected $hassystemcap;
/**
* Sets up the table_log parameters.
*
* @param string $uniqueid unique id of form.
* @param \moodle_url $url url where this table is displayed.
* @param int $courseid course id.
* @param int $perpage Number of rules to display per page.
*/
public function __construct($uniqueid, \moodle_url $url, $courseid = 0, $perpage = 100) {
parent::__construct($uniqueid);
$this->set_attribute('id', 'toolmonitorrules_table');
$this->set_attribute('class', 'toolmonitor managerules generaltable generalbox');
$this->define_columns(array('name', 'description', 'course', 'plugin', 'eventname', 'filters', 'manage'));
$this->define_headers(array(
get_string('rulename', 'tool_monitor'),
get_string('description'),
get_string('course'),
get_string('area', 'tool_monitor'),
get_string('event', 'tool_monitor'),
get_string('frequency', 'tool_monitor'),
get_string('manage', 'tool_monitor'),
)
);
$this->courseid = $courseid;
$this->pagesize = $perpage;
$systemcontext = \context_system::instance();
$this->context = empty($courseid) ? $systemcontext : \context_course::instance($courseid);
$this->hassystemcap = has_capability('tool/monitor:managerules', $systemcontext);
$this->collapsible(false);
$this->sortable(false);
$this->pageable(true);
$this->is_downloadable(false);
$this->define_baseurl($url);
}
/**
* 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) {
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.
*/
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 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) {
return $rule->get_plugin_name();
}
/**
* 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) {
return $rule->get_event_name();
}
/**
* 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) {
return $rule->get_filters_description();
}
/**
* 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) {
global $OUTPUT, $CFG;
$manage = '';
// Do not allow the user to edit the rule unless they have the system capability, or we are viewing the rules
// for a course, and not the site. Note - we don't need to check for the capability at a course level since
// the user is never shown this page otherwise.
if ($this->hassystemcap || ($rule->courseid != 0)) {
$editurl = new \moodle_url($CFG->wwwroot. '/admin/tool/monitor/edit.php', array('ruleid' => $rule->id,
'courseid' => $rule->courseid, 'sesskey' => sesskey()));
$icon = $OUTPUT->render(new \pix_icon('t/edit', get_string('editrule', 'tool_monitor')));
$manage .= \html_writer::link($editurl, $icon, array('class' => 'action-icon'));
}
// The user should always be able to copy the rule if they are able to view the page.
$copyurl = new \moodle_url($CFG->wwwroot. '/admin/tool/monitor/managerules.php',
array('ruleid' => $rule->id, 'action' => 'copy', 'courseid' => $this->courseid, 'sesskey' => sesskey()));
$icon = $OUTPUT->render(new \pix_icon('t/copy', get_string('duplicaterule', 'tool_monitor')));
$manage .= \html_writer::link($copyurl, $icon, array('class' => 'action-icon'));
if ($this->hassystemcap || ($rule->courseid != 0)) {
$deleteurl = new \moodle_url($CFG->wwwroot. '/admin/tool/monitor/managerules.php', array('ruleid' => $rule->id,
'action' => 'delete', 'courseid' => $rule->courseid, 'sesskey' => sesskey()));
$icon = $OUTPUT->render(new \pix_icon('t/delete', get_string('deleterule', 'tool_monitor')));
$manage .= \html_writer::link($deleteurl, $icon, array('class' => 'action-icon'));
}
return $manage;
}
/**
* Query the reader. Store results in the object for use by build_table.
*
* @param int $pagesize size of page for paginated displayed table.
* @param bool $useinitialsbar do you want to use the initials bar.
*/
public function query_db($pagesize, $useinitialsbar = true) {
$total = \tool_monitor\rule_manager::count_rules_by_courseid($this->courseid);
$this->pagesize($pagesize, $total);
$rules = \tool_monitor\rule_manager::get_rules_by_courseid($this->courseid, $this->get_page_start(),
$this->get_page_size());
$this->rawdata = $rules;
// Set initial bars.
if ($useinitialsbar) {
$this->initialbars($total > $pagesize);
}
}
}
@@ -0,0 +1,99 @@
<?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/>.
/**
* Renderer class for manage rules page.
*
* @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
*/
namespace tool_monitor\output\managerules;
defined('MOODLE_INTERNAL') || die;
/**
* Renderer class for manage rules page.
*
* @since Moodle 2.8
* @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
*/
class renderer extends \plugin_renderer_base {
/**
* Get html to display on the page.
*
* @param renderable $renderable renderable widget
*
* @return string to display on the mangerules page.
*/
protected function render_renderable(renderable $renderable) {
$o = $this->render_table($renderable);
$o .= $this->render_add_button($renderable->courseid);
return $o;
}
/**
* Get html to display on the page.
*
* @param renderable $renderable renderable widget
*
* @return string to display on the mangerules page.
*/
protected function render_table(renderable $renderable) {
$o = '';
ob_start();
$renderable->out($renderable->pagesize, true);
$o = ob_get_contents();
ob_end_clean();
return $o;
}
/**
* Html to add a button for adding a new rule.
*
* @param int $courseid course id.
*
* @return string html for the button.
*/
protected function render_add_button($courseid) {
global $CFG;
$button = \html_writer::tag('button', get_string('addrule', 'tool_monitor'));
$addurl = new \moodle_url($CFG->wwwroot. '/admin/tool/monitor/edit.php', array('courseid' => $courseid));
return \html_writer::link($addurl, $button);
}
/**
* Html to add a link to go to the subscription page.
*
* @param moodle_url $manageurl The url of the subscription page.
*
* @return string html for the link to the subscription page.
*/
public function render_subscriptions_link($manageurl) {
echo \html_writer::start_div();
$a = \html_writer::link($manageurl, get_string('managesubscriptions', 'tool_monitor'));
$link = \html_writer::tag('span', get_string('managesubscriptionslink', 'tool_monitor', $a));
echo $link;
echo \html_writer::end_div();
}
}
@@ -0,0 +1,110 @@
<?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/>.
/**
* Renderer class for manage subscriptions page.
*
* @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
*/
namespace tool_monitor\output\managesubs;
defined('MOODLE_INTERNAL') || die;
/**
* Renderer class for manage subscriptions page.
*
* @since Moodle 2.8
* @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
*/
class renderer extends \plugin_renderer_base {
/**
* Get html to display on the page.
*
* @param subs $renderable renderable widget
*
* @return string to display on the mangesubs page.
*/
protected function render_subs(subs $renderable) {
$o = $this->render_table($renderable);
return $o;
}
/**
* Get html to display on the page.
*
* @param rules $renderable renderable widget
*
* @return string to display on the mangesubs page.
*/
protected function render_rules(rules $renderable) {
$o = $this->render_course_select($renderable);
if (!empty($renderable->totalcount)) {
$o .= $this->render_table($renderable);
}
return $o;
}
/**
* Get html to display on the page for select dropdown..
*
* @param rules $renderable renderable widget
*
* @return string to display on the mangesubs page.
*/
protected function render_course_select(rules $renderable) {
if ($select = $renderable->get_user_courses_select()) {
return $this->render($select);
}
}
/**
* Get html to display on the page.
*
* @param rules|subs $renderable renderable widget
*
* @return string to display on the mangesubs page.
*/
protected function render_table($renderable) {
$o = '';
ob_start();
$renderable->out($renderable->pagesize, true);
$o = ob_get_contents();
ob_end_clean();
return $o;
}
/**
* Html to add a link to go to the rule manager page.
*
* @param moodle_url $ruleurl The url of the rule manager page.
*
* @return string html for the link to the rule manager page.
*/
public function render_rules_link($ruleurl) {
echo \html_writer::start_div();
$a = \html_writer::link($ruleurl, get_string('managerules', 'tool_monitor'));
$link = \html_writer::tag('span', get_string('manageruleslink', 'tool_monitor', $a));
echo $link;
echo \html_writer::end_div();
}
}
@@ -0,0 +1,230 @@
<?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/>.
/**
* Renderable class to display a set of rules in the manage subscriptions page.
*
* @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
*/
namespace tool_monitor\output\managesubs;
defined('MOODLE_INTERNAL') || die;
require_once($CFG->libdir . '/tablelib.php');
/**
* Renderable class to display a set of rules in the manage subscriptions page.
*
* @since Moodle 2.8
* @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
*/
class rules extends \table_sql implements \renderable {
/**
* @var int course id.
*/
public $courseid;
/**
* @var int total rules present.
*/
public $totalcount = 0;
/**
* @var \context_course|\context_system context of the page to be rendered.
*/
protected $context;
/**
* Sets up the table_log parameters.
*
* @param string $uniqueid unique id of form.
* @param \moodle_url $url url where this table is displayed.
* @param int $courseid course id.
* @param int $perpage Number of rules to display per page.
*/
public function __construct($uniqueid, \moodle_url $url, $courseid = 0, $perpage = 100) {
parent::__construct($uniqueid);
$this->set_attribute('class', 'toolmonitor subscriberules generaltable generalbox');
$this->define_columns(array('name', 'description', 'course', 'plugin', 'eventname', 'filters', 'select'));
$this->define_headers(array(
get_string('rulename', 'tool_monitor'),
get_string('description'),
get_string('course'),
get_string('area', 'tool_monitor'),
get_string('event', 'tool_monitor'),
get_string('frequency', 'tool_monitor'),
''
)
);
$this->courseid = $courseid;
$this->pagesize = $perpage;
$systemcontext = \context_system::instance();
$this->context = empty($courseid) ? $systemcontext : \context_course::instance($courseid);
$this->collapsible(false);
$this->sortable(false);
$this->pageable(true);
$this->is_downloadable(false);
$this->define_baseurl($url);
$total = \tool_monitor\rule_manager::count_rules_by_courseid($this->courseid);
$this->totalcount = $total;
}
/**
* Generate content for name column.
*
* @param \tool_monitor\rule $rule rule object
* @return string html used to display the rule name.
*/
public function col_name(\tool_monitor\rule $rule) {
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 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.
*
* @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;
$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 $options;
}
}
/**
* Query the reader. Store results in the object for use by build_table.
*
* @param int $pagesize size of page for paginated displayed table.
* @param bool $useinitialsbar do you want to use the initials bar.
*/
public function query_db($pagesize, $useinitialsbar = true) {
$total = \tool_monitor\rule_manager::count_rules_by_courseid($this->courseid);
$this->pagesize($pagesize, $total);
$rules = \tool_monitor\rule_manager::get_rules_by_courseid($this->courseid, $this->get_page_start(),
$this->get_page_size());
$this->rawdata = $rules;
// Set initial bars.
if ($useinitialsbar) {
$this->initialbars($total > $pagesize);
}
}
/**
* Gets a list of courses where the current user can subscribe to rules as a dropdown.
*
* @return \single_select|bool returns the list of courses, or false if the select box
* should not be displayed.
*/
public function get_user_courses_select() {
global $DB;
// If the number of courses on the site exceed the maximum drop down limit do not display the select box.
$numcourses = $DB->count_records('course');
if ($numcourses > COURSE_MAX_COURSES_PER_DROPDOWN) {
return false;
}
$orderby = 'visible DESC, sortorder ASC';
$options = array(0 => get_string('site'));
if ($courses = get_user_capability_course('tool/monitor:subscribe', null, true, 'fullname', $orderby)) {
foreach ($courses as $course) {
$options[$course->id] = format_string($course->fullname, true,
array('context' => \context_course::instance($course->id)));
}
}
$url = new \moodle_url('/admin/tool/monitor/index.php');
$select = new \single_select($url, 'courseid', $options, $this->courseid);
$select->set_label(get_string('selectacourse', 'tool_monitor'));
return $select;
}
}
@@ -0,0 +1,197 @@
<?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/>.
/**
* Renderable class to display a set of subscriptions in the manage subscriptions page.
*
* @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
*/
namespace tool_monitor\output\managesubs;
defined('MOODLE_INTERNAL') || die;
require_once($CFG->libdir . '/tablelib.php');
/**
* Renderable class to display a set of subscriptions in the manage subscriptions page.
*
* @since Moodle 2.8
* @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
*/
class subs extends \table_sql implements \renderable {
/**
* @var int course id.
*/
public $courseid;
/**
* @var \context_course|\context_system context of the page to be rendered.
*/
protected $context;
/**
* Sets up the table_log parameters.
*
* @param string $uniqueid unique id of form.
* @param \moodle_url $url url where this table is displayed.
* @param int $courseid course id.
* @param int $perpage Number of rules to display per page.
*/
public function __construct($uniqueid, \moodle_url $url, $courseid = 0, $perpage = 100) {
parent::__construct($uniqueid);
$this->set_attribute('class', 'toolmonitor subscriptions generaltable generalbox');
$this->define_columns(array('name', 'description', 'course', 'plugin', 'instance', 'eventname',
'filters', 'unsubscribe'));
$this->define_headers(array(
get_string('rulename', 'tool_monitor'),
get_string('description'),
get_string('course'),
get_string('area', 'tool_monitor'),
get_string('moduleinstance', 'tool_monitor'),
get_string('event', 'tool_monitor'),
get_string('frequency', 'tool_monitor'),
get_string('unsubscribe', 'tool_monitor')
)
);
$this->courseid = $courseid;
$this->pagesize = $perpage;
$systemcontext = \context_system::instance();
$this->context = empty($courseid) ? $systemcontext : \context_course::instance($courseid);
$this->collapsible(false);
$this->sortable(false);
$this->pageable(true);
$this->is_downloadable(false);
$this->define_baseurl($url);
}
/**
* Generate content for name column.
*
* @param \tool_monitor\subscription $sub subscription object
* @return string html used to display the rule name.
*/
public function col_name(\tool_monitor\subscription $sub) {
return $sub->get_name($this->context);
}
/**
* 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 course name.
*/
public function col_course(\tool_monitor\subscription $sub) {
$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 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.
*
* @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 eventname column.
*
* @param \tool_monitor\subscription $sub subscription object
* @return string html used to display the event name.
*/
public function col_eventname(\tool_monitor\subscription $sub) {
return $sub->get_event_name();
}
/**
* 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.
*
* @param \tool_monitor\subscription $sub subscription object
* @return string html used to display the unsubscribe field.
*/
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'));
}
/**
* Query the reader. Store results in the object for use by build_table.
*
* @param int $pagesize size of page for paginated displayed table.
* @param bool $useinitialsbar do you want to use the initials bar.
*/
public function query_db($pagesize, $useinitialsbar = true) {
$total = \tool_monitor\subscription_manager::count_user_subscriptions();
$this->pagesize($pagesize, $total);
$subs = \tool_monitor\subscription_manager::get_user_subscriptions($this->get_page_start(), $this->get_page_size());
$this->rawdata = $subs;
// Set initial bars.
if ($useinitialsbar) {
$this->initialbars($total > $pagesize);
}
}
}
+274
View File
@@ -0,0 +1,274 @@
<?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/>.
/**
* Class represents a single rule.
*
* @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
*/
namespace tool_monitor;
defined('MOODLE_INTERNAL') || die();
/**
* Class represents a single rule.
*
* @since Moodle 2.8
* @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
*/
class rule {
/**
* @var \stdClass The rule object form database.
*/
protected $rule;
/**
* Constructor.
*
* @param \stdClass $rule A rule object from database.
*/
public function __construct($rule) {
$this->rule = $rule;
}
/**
* Can the current user manage this rule?
*
* @return bool true if the current user can manage this rule, else false.
*/
public function can_manage_rule() {
$courseid = $this->courseid;
$context = empty($courseid) ? \context_system::instance() : \context_course::instance($this->courseid);
return has_capability('tool/monitor:managerules', $context);
}
/**
* Api to duplicate a rule in a given courseid.
*
* @param int $finalcourseid Final course id.
*/
public function duplicate_rule($finalcourseid) {
$rule = fullclone($this->rule);
unset($rule->id);
$rule->courseid = $finalcourseid;
$time = time();
$rule->timecreated = $time;
$rule->timemodified = $time;
rule_manager::add_rule($rule);
}
/**
* Delete this rule.
*
* Note: It also removes all associated subscriptions.
*/
public function delete_rule() {
rule_manager::delete_rule($this->id);
}
/**
* 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|\moodle_url|string
* @throws \coding_exception
*/
public function get_subscribe_options($courseid) {
global $CFG;
$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 {
// 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));
foreach ($instances as $cminfo) {
// Don't list instances that are not visible or available to the user.
if ($cminfo->uservisible && $cminfo->available) {
$options[$cminfo->id] = $cminfo->get_formatted_name();
}
}
return new \single_select($url, 'cmid', $options);
}
}
/**
* Subscribe an user to this rule.
*
* @param int $courseid Course id.
* @param int $cmid Course module id.
* @param int $userid User id.
*
* @throws \coding_exception
*/
public function subscribe_user($courseid, $cmid, $userid = 0) {
global $USER;
if ($this->courseid != $courseid && $this->courseid != 0) {
// Trying to subscribe to a rule that belongs to a different course. Should never happen.
throw new \coding_exception('Can not subscribe to rules from a different course');
}
if ($cmid !== 0) {
$cms = get_fast_modinfo($courseid);
$cminfo = $cms->get_cm($cmid);
if (!$cminfo->uservisible || !$cminfo->available) {
// Trying to subscribe to a hidden or restricted cm. Should never happen.
throw new \coding_exception('You cannot do that');
}
}
$userid = empty($userid) ? $USER->id : $userid;
subscription_manager::create_subscription($this->id, $courseid, $cmid, $userid);
}
/**
* Magic get method.
*
* @param string $prop property to get.
*
* @return mixed
* @throws \coding_exception
*/
public function __get($prop) {
if (property_exists($this->rule, $prop)) {
return $this->rule->$prop;
}
throw new \coding_exception('Property "' . $prop . '" doesn\'t exist');
}
/**
* Return the rule data to be used while setting mform.
*
* @throws \coding_exception
*/
public function get_mform_set_data() {
if (!empty($this->rule)) {
$rule = fullclone($this->rule);
$rule->description = array('text' => $rule->description, 'format' => $rule->descriptionformat);
$rule->template = array('text' => $rule->template, 'format' => $rule->templateformat);
return $rule;
}
throw new \coding_exception('Invalid call to get_mform_set_data.');
}
/**
* Method to get event name.
*
* @return string
* @throws \coding_exception
*/
public function get_event_name() {
$eventclass = $this->eventname;
if (class_exists($eventclass)) {
return $eventclass::get_name();
}
return get_string('eventnotfound', 'tool_monitor');
}
/**
* Get filter description.
*
* @return string
*/
public function get_filters_description() {
$a = new \stdClass();
$a->freq = $this->frequency;
$mins = $this->timewindow / MINSECS; // Convert seconds to minutes.
$a->mins = $mins;
return get_string('freqdesc', 'tool_monitor', $a);
}
/**
* 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) {
return format_text($this->name, FORMAT_HTML, array('context' => $context));
}
/**
* 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) {
return format_text($this->description, $this->descriptionformat, array('context' => $context));
}
/**
* Get name of the plugin associated with this rule
*
* @return string Plugin name.
*/
public function get_plugin_name() {
if ($this->plugin === 'core') {
$string = get_string('core', 'tool_monitor');
} else if (get_string_manager()->string_exists('pluginname', $this->plugin)) {
$string = get_string('pluginname', $this->plugin);
} else {
$string = $this->plugin;
}
return $string;
}
}
+152
View File
@@ -0,0 +1,152 @@
<?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 mform for creating and editing a rule.
*
* @copyright 2014 onwards Simey Lameze <lameze@gmail.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @package tool_monitor
*/
namespace tool_monitor;
require_once($CFG->dirroot.'/lib/formslib.php');
/**
* The mform for creating and editing a rule.
*
* @since Moodle 2.8
* @copyright 2014 onwards Simey Lameze <lameze@gmail.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @package tool_monitor
*/
class rule_form extends \moodleform {
/**
* Mform class definition
*
*/
public function definition () {
$mform = $this->_form;
$eventlist = $this->_customdata['eventlist'];
$pluginlist = $this->_customdata['pluginlist'];
$rule = $this->_customdata['rule'];
$courseid = $this->_customdata['courseid'];
$subscriptioncount = $this->_customdata['subscriptioncount'];
// General section header.
$mform->addElement('header', 'general', get_string('general'));
// Hidden course ID.
$mform->addElement('hidden', 'courseid');
$mform->setType('courseid', PARAM_INT);
// We are editing a existing rule.
if (!empty($rule->id)) {
// Hidden rule id.
$mform->addElement('hidden', 'ruleid');
$mform->setType('ruleid', PARAM_INT);
$mform->setConstant('ruleid', $rule->id);
// Force course id.
$courseid = $rule->courseid;
}
// Make course id a constant.
$mform->setConstant('courseid', $courseid);
if (empty($courseid)) {
$context = \context_system::instance();
} else {
$context = \context_course::instance($courseid);
}
$editoroptions = array(
'subdirs' => 0,
'maxbytes' => 0,
'maxfiles' => 0,
'changeformat' => 0,
'context' => $context,
'noclean' => 0,
'trusttext' => 0
);
// Name field.
$mform->addElement('text', 'name', get_string('rulename', 'tool_monitor'), 'size="50"');
$mform->addRule('name', get_string('required'), 'required');
$mform->setType('name', PARAM_TEXT);
// Plugin field.
$mform->addElement('select', 'plugin', get_string('areatomonitor', 'tool_monitor'), $pluginlist);
$mform->addRule('plugin', get_string('required'), 'required');
// Event field.
$mform->addElement('select', 'eventname', get_string('event', 'tool_monitor'), $eventlist);
$mform->addRule('eventname', get_string('required'), 'required');
// Freeze plugin and event fields for editing if there's a subscription for this rule.
if ($subscriptioncount > 0) {
$mform->freeze('plugin');
$mform->setConstant('plugin', $rule->plugin);
$mform->freeze('eventname');
$mform->setConstant('eventname', $rule->eventname);
}
// Description field.
$mform->addElement('editor', 'description', get_string('description'), $editoroptions);
// Filters.
$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('frequency', 'tool_monitor'), $freq);
$mform->addRule('frequency', get_string('required'), 'required');
$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('inminutes', 'tool_monitor'), $mins);
$mform->addRule('minutes', get_string('required'), 'required');
// Message template.
$mform->addElement('editor', 'template', get_string('messagetemplate', 'tool_monitor'), $editoroptions);
$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(true, get_string('savechanges'));
}
/**
* Form validation
*
* @param array $data data from the form.
* @param array $files files uploaded.
*
* @return array of errors.
*/
public function validation($data, $files) {
$errors = parent::validation($data, $files);
if (!eventlist::validate_event_plugin($data['plugin'], $data['eventname'])) {
$errors['eventname'] = get_string('errorincorrectevent', 'tool_monitor');
}
return $errors;
}
}
+290
View File
@@ -0,0 +1,290 @@
<?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/>.
/**
* Rule manager class.
*
* @package tool_monitor
* @copyright 2014 onwards Simey Lameze <lameze@gmail.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_monitor;
defined('MOODLE_INTERNAL') || die();
/**
* Rule manager class.
*
* @package tool_monitor
* @copyright 2014 onwards Simey Lameze <lameze@gmail.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class rule_manager {
/**
* Create a new rule.
*
* @param \stdClass $ruledata data to insert as new rule entry.
*
* @return rule An instance of rule class.
*/
public static function add_rule($ruledata) {
global $DB;
$now = time();
$ruledata->timecreated = $now;
$ruledata->timemodified = $now;
$ruledata->id = $DB->insert_record('tool_monitor_rules', $ruledata);
// Trigger a rule created event.
if ($ruledata->id) {
if (!empty($ruledata->courseid)) {
$courseid = $ruledata->courseid;
$context = \context_course::instance($ruledata->courseid);
} else {
$courseid = 0;
$context = \context_system::instance();
}
$params = array(
'objectid' => $ruledata->id,
'courseid' => $courseid,
'context' => $context
);
$event = \tool_monitor\event\rule_created::create($params);
$event->trigger();
}
return new rule($ruledata);
}
/**
* Clean data submitted by mform.
*
* @param \stdClass $mformdata data to insert as new rule entry.
*
* @return \stdClass Cleaned rule data.
*/
public static function clean_ruledata_form($mformdata) {
global $USER;
$rule = new \stdClass();
if (!empty($mformdata->ruleid)) {
$rule->id = $mformdata->ruleid;
}
$rule->userid = empty($mformdata->userid) ? $USER->id : $mformdata->userid;
$rule->courseid = $mformdata->courseid;
$rule->name = $mformdata->name;
$rule->plugin = $mformdata->plugin;
$rule->eventname = $mformdata->eventname;
$rule->description = $mformdata->description['text'];
$rule->descriptionformat = $mformdata->description['format'];
$rule->frequency = $mformdata->frequency;
$rule->timewindow = $mformdata->minutes * MINSECS;
$rule->template = $mformdata->template['text'];
$rule->templateformat = $mformdata->template['format'];
return $rule;
}
/**
* Delete a rule and associated subscriptions, by rule id.
*
* @param int $ruleid id of rule to be deleted.
* @param \context|null $coursecontext the context of the course - this is passed when we
* can not get the context via \context_course as the course has been deleted.
*
* @return bool
*/
public static function delete_rule($ruleid, $coursecontext = null) {
global $DB;
subscription_manager::remove_all_subscriptions_for_rule($ruleid, $coursecontext);
// Retrieve the rule from the DB before we delete it, so we have a record when we trigger a rule deleted event.
$rule = $DB->get_record('tool_monitor_rules', array('id' => $ruleid));
$success = $DB->delete_records('tool_monitor_rules', array('id' => $ruleid));
// If successful trigger a rule deleted event.
if ($success) {
// It is possible that we are deleting rules associated with a deleted course, so we should be
// passing the context as the second parameter.
if (!is_null($coursecontext)) {
$context = $coursecontext;
$courseid = $rule->courseid;
} else if (!empty($rule->courseid) && ($context = \context_course::instance($rule->courseid,
IGNORE_MISSING))) {
$courseid = $rule->courseid;
} else {
$courseid = 0;
$context = \context_system::instance();
}
$params = array(
'objectid' => $rule->id,
'courseid' => $courseid,
'context' => $context
);
$event = \tool_monitor\event\rule_deleted::create($params);
$event->add_record_snapshot('tool_monitor_rules', $rule);
$event->trigger();
}
return $success;
}
/**
* Get an instance of rule class.
*
* @param \stdClass|int $ruleorid A rule object from database or rule id.
*
* @return rule object with rule id.
*/
public static function get_rule($ruleorid) {
global $DB;
if (!is_object($ruleorid)) {
$rule = $DB->get_record('tool_monitor_rules', array('id' => $ruleorid), '*', MUST_EXIST);
} else {
$rule = $ruleorid;
}
return new rule($rule);
}
/**
* Update rule data.
*
* @throws \coding_exception if $record->ruleid is invalid.
* @param object $ruledata rule data to be updated.
*
* @return bool
*/
public static function update_rule($ruledata) {
global $DB;
if (!self::get_rule($ruledata->id)) {
throw new \coding_exception('Invalid rule ID.');
}
$ruledata->timemodified = time();
$success = $DB->update_record('tool_monitor_rules', $ruledata);
// If successful trigger a rule updated event.
if ($success) {
// If we do not have the course id we need to retrieve it.
if (!isset($ruledata->courseid)) {
$courseid = $DB->get_field('tool_monitor_rules', 'courseid', array('id' => $ruledata->id), MUST_EXIST);
} else {
$courseid = $ruledata->courseid;
}
if (!empty($courseid)) {
$context = \context_course::instance($courseid);
} else {
$context = \context_system::instance();
}
$params = array(
'objectid' => $ruledata->id,
'courseid' => $courseid,
'context' => $context
);
$event = \tool_monitor\event\rule_updated::create($params);
$event->trigger();
}
return $success;
}
/**
* Get rules by course id.
*
* @param int $courseid course id of the rule.
* @param int $limitfrom Limit from which to fetch rules.
* @param int $limitto Limit to which rules need to be fetched.
* @param bool $includesite Determines whether we return site wide rules or not.
*
* @return array List of rules for the given course id, if specified will also include site rules.
*/
public static function get_rules_by_courseid($courseid, $limitfrom = 0, $limitto = 0, $includesite = true) {
global $DB;
$select = 'courseid = ?';
$params = array();
$params[] = $courseid;
if ($includesite) {
$select .= ' OR courseid = ?';
$params[] = 0;
}
$orderby = 'courseid DESC, name ASC';
return self::get_instances($DB->get_records_select('tool_monitor_rules', $select, $params, $orderby,
'*', $limitfrom, $limitto));
}
/**
* Get rule count by course id.
*
* @param int $courseid course id of the rule.
*
* @return int count of rules present in system visible in the given course id.
*/
public static function count_rules_by_courseid($courseid) {
global $DB;
$select = "courseid = ? OR courseid = ?";
return $DB->count_records_select('tool_monitor_rules', $select, array(0, $courseid));
}
/**
* Get rules by plugin name.
*
* @param string $plugin plugin name of the rule.
*
* @return array List of rules for the given plugin name.
*/
public static function get_rules_by_plugin($plugin) {
global $DB;
return self::get_instances($DB->get_records('tool_monitor_rules', array('plugin' => $plugin)));
}
/**
* Get rules by event name.
*
* @param string $eventname event name of the rule.
*
* @return array List of rules for the given event.
*/
public static function get_rules_by_event($eventname) {
global $DB;
return self::get_instances($DB->get_records('tool_monitor_rules', array('eventname' => $eventname)));
}
/**
* Helper method to convert db records to instances.
*
* @param array $arr of rules.
*
* @return array of rules as instances.
*/
protected static function get_instances($arr) {
$result = array();
foreach ($arr as $key => $sub) {
$result[$key] = new rule($sub);
}
return $result;
}
}
+185
View File
@@ -0,0 +1,185 @@
<?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/>.
/**
* Class represents a single subscription.
*
* @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
*/
namespace tool_monitor;
defined('MOODLE_INTERNAL') || die();
/**
* Class represents a single subscription instance (i.e with all the subscription info).
*
* @since Moodle 2.8
* @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
*/
class subscription {
/**
* @var \stdClass
*/
protected $subscription;
/**
* Constructor.
*
* use {@link \tool_monitor\subscription_manager::get_subscription} to get an instance instead of directly calling this method.
*
* @param \stdClass $subscription
*/
public function __construct($subscription) {
$this->subscription = $subscription;
}
/**
* Magic get method.
*
* @param string $prop property to get.
*
* @return mixed
* @throws \coding_exception
*/
public function __get($prop) {
if (property_exists($this->subscription, $prop)) {
return $this->subscription->$prop;
}
throw new \coding_exception('Property "' . $prop . '" doesn\'t exist');
}
/**
* Get a human readable name for instances associated with this subscription.
*
* @return string
* @throws \coding_exception
*/
public function get_instance_name() {
if ($this->plugin === 'core') {
$string = get_string('allevents', 'tool_monitor');
} else {
if ($this->cmid == 0) {
$string = get_string('allmodules', 'tool_monitor');
} else {
$cms = get_fast_modinfo($this->courseid);
$cms = $cms->get_cms();
if (isset($cms[$this->cmid])) {
$string = $cms[$this->cmid]->get_formatted_name(); // Instance name.
} else {
// Something is wrong, instance is not present anymore.
$string = get_string('invalidmodule', 'tool_monitor');
}
}
}
return $string;
}
/**
* Method to get event name.
*
* @return string
* @throws \coding_exception
*/
public function get_event_name() {
$eventclass = $this->eventname;
if (class_exists($eventclass)) {
return $eventclass::get_name();
}
return get_string('eventnotfound', 'tool_monitor');
}
/**
* Get filter description.
*
* @return string
*/
public function get_filters_description() {
$a = new \stdClass();
$a->freq = $this->frequency;
$mins = $this->timewindow / MINSECS; // Convert seconds to minutes.
$a->mins = $mins;
return get_string('freqdesc', 'tool_monitor', $a);
}
/**
* 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) {
return format_text($this->name, FORMAT_HTML, array('context' => $context));
}
/**
* 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) {
return format_text($this->description, $this->descriptionformat, array('context' => $context));
}
/**
* Get name of the plugin associated with this rule
*
* @return string Plugin name.
*/
public function get_plugin_name() {
if ($this->plugin === 'core') {
$string = get_string('core', 'tool_monitor');
} else if (get_string_manager()->string_exists('pluginname', $this->plugin)) {
$string = get_string('pluginname', $this->plugin);
} else {
$string = $this->plugin;
}
return $string;
}
/**
* 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) {
$courseid = $this->courseid;
if (empty($courseid)) {
return get_string('site');
} else {
$course = get_course($courseid);
return format_string($course->fullname, true, array('context' => $context));
}
}
/**
* Can the current user manage the rule associate with this subscription?
*
* @return bool true if the current user can manage this rule, else false.
*/
public function can_manage_rule() {
$courseid = $this->rulecourseid;
$context = empty($courseid) ? \context_system::instance() : \context_course::instance($courseid);
return has_capability('tool/monitor:managerules', $context);
}
}
@@ -0,0 +1,459 @@
<?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/>.
/**
* Class to manage subscriptions.
*
* @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
*/
namespace tool_monitor;
defined('MOODLE_INTERNAL') || die();
/**
* Class to manage subscriptions.
*
* @since Moodle 2.8
* @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
*/
class subscription_manager {
/**
* Subscribe a user to a given rule.
*
* @param int $ruleid Rule id.
* @param int $courseid Course id.
* @param int $cmid Course module id.
* @param int $userid User who is subscribing, defaults to $USER.
*
* @return bool|int returns id of the created subscription.
*/
public static function create_subscription($ruleid, $courseid, $cmid, $userid = 0) {
global $DB, $USER;
$subscription = new \stdClass();
$subscription->ruleid = $ruleid;
$subscription->courseid = $courseid;
$subscription->cmid = $cmid;
$subscription->userid = empty($userid) ? $USER->id : $userid;
if ($DB->record_exists('tool_monitor_subscriptions', (array)$subscription)) {
// Subscription already exists.
return false;
}
$subscription->timecreated = time();
$subscription->id = $DB->insert_record('tool_monitor_subscriptions', $subscription);
// Trigger a subscription created event.
if ($subscription->id) {
if (!empty($subscription->courseid)) {
$courseid = $subscription->courseid;
$context = \context_course::instance($subscription->courseid);
} else {
$courseid = 0;
$context = \context_system::instance();
}
$params = array(
'objectid' => $subscription->id,
'courseid' => $courseid,
'context' => $context
);
$event = \tool_monitor\event\subscription_created::create($params);
$event->trigger();
// Let's invalidate the cache.
$cache = \cache::make('tool_monitor', 'eventsubscriptions');
$cache->delete($courseid);
}
return $subscription->id;
}
/**
* Delete a subscription.
*
* @param subscription|int $subscriptionorid an instance of subscription class or id.
* @param bool $checkuser Check if the subscription belongs to current user before deleting.
*
* @return bool
* @throws \coding_exception if $checkuser is true and the subscription doesn't belong to the current user.
*/
public static function delete_subscription($subscriptionorid, $checkuser = true) {
global $DB, $USER;
if (is_object($subscriptionorid)) {
$subscription = $subscriptionorid;
} else {
$subscription = self::get_subscription($subscriptionorid);
}
if ($checkuser && $subscription->userid != $USER->id) {
throw new \coding_exception('Invalid subscription supplied');
}
// Store the subscription before we delete it.
$subscription = $DB->get_record('tool_monitor_subscriptions', array('id' => $subscription->id));
$success = $DB->delete_records('tool_monitor_subscriptions', array('id' => $subscription->id));
// If successful trigger a subscription_deleted event.
if ($success) {
if (!empty($subscription->courseid)) {
$courseid = $subscription->courseid;
$context = \context_course::instance($subscription->courseid);
} else {
$courseid = 0;
$context = \context_system::instance();
}
$params = array(
'objectid' => $subscription->id,
'courseid' => $courseid,
'context' => $context
);
$event = \tool_monitor\event\subscription_deleted::create($params);
$event->add_record_snapshot('tool_monitor_subscriptions', $subscription);
$event->trigger();
// Let's invalidate the cache.
$cache = \cache::make('tool_monitor', 'eventsubscriptions');
$cache->delete($courseid);
}
return $success;
}
/**
* Delete all subscriptions for a user.
*
* @param int $userid user id.
*
* @return mixed
*/
public static function delete_user_subscriptions($userid) {
global $DB;
return $DB->delete_records('tool_monitor_subscriptions', array('userid' => $userid));
}
/**
* Delete all subscriptions for a course module.
*
* @param int $cmid cm id.
*
* @return mixed
*/
public static function delete_cm_subscriptions($cmid) {
global $DB;
return $DB->delete_records('tool_monitor_subscriptions', array('cmid' => $cmid));
}
/**
* Delete all subscribers for a given rule.
*
* @param int $ruleid rule id.
* @param \context|null $coursecontext the context of the course - this is passed when we
* can not get the context via \context_course as the course has been deleted.
*
* @return bool
*/
public static function remove_all_subscriptions_for_rule($ruleid, $coursecontext = null) {
global $DB;
// Store all the subscriptions we have to delete.
$subscriptions = $DB->get_recordset('tool_monitor_subscriptions', array('ruleid' => $ruleid));
// Now delete them.
$success = $DB->delete_records('tool_monitor_subscriptions', array('ruleid' => $ruleid));
// If successful and there were subscriptions that were deleted trigger a subscription deleted event.
if ($success && $subscriptions) {
foreach ($subscriptions as $subscription) {
// It is possible that we are deleting rules associated with a deleted course, so we should be
// passing the context as the second parameter.
if (!is_null($coursecontext)) {
$context = $coursecontext;
$courseid = $subscription->courseid;
} else if (!empty($subscription->courseid) && ($coursecontext =
\context_course::instance($subscription->courseid, IGNORE_MISSING))) {
$courseid = $subscription->courseid;
$context = $coursecontext;
} else {
$courseid = 0;
$context = \context_system::instance();
}
$params = array(
'objectid' => $subscription->id,
'courseid' => $courseid,
'context' => $context
);
$event = \tool_monitor\event\subscription_deleted::create($params);
$event->add_record_snapshot('tool_monitor_subscriptions', $subscription);
$event->trigger();
// Let's invalidate the cache.
$cache = \cache::make('tool_monitor', 'eventsubscriptions');
$cache->delete($courseid);
}
}
$subscriptions->close();
return $success;
}
/**
* Get a subscription instance for an given subscription id.
*
* @param subscription|int $subscriptionorid an instance of subscription class or id.
*
* @return subscription returns a instance of subscription class.
*/
public static function get_subscription($subscriptionorid) {
global $DB;
if (is_object($subscriptionorid)) {
return new subscription($subscriptionorid);
}
$sql = self::get_subscription_join_rule_sql();
$sql .= "WHERE s.id = :id";
$sub = $DB->get_record_sql($sql, array('id' => $subscriptionorid), MUST_EXIST);
return new subscription($sub);
}
/**
* Get an array of subscriptions for a given user in a given course.
*
* @param int $courseid course id.
* @param int $limitfrom Limit from which to fetch rules.
* @param int $limitto Limit to which rules need to be fetched.
* @param int $userid Id of the user for which the subscription needs to be fetched. Defaults to $USER;
* @param string $order Order to sort the subscriptions.
*
* @return array list of subscriptions
*/
public static function get_user_subscriptions_for_course($courseid, $limitfrom = 0, $limitto = 0, $userid = 0,
$order = 's.timecreated DESC' ) {
global $DB, $USER;
if ($userid == 0) {
$userid = $USER->id;
}
$sql = self::get_subscription_join_rule_sql();
$sql .= "WHERE s.courseid = :courseid AND s.userid = :userid ORDER BY $order";
return self::get_instances($DB->get_records_sql($sql, array('courseid' => $courseid, 'userid' => $userid), $limitfrom,
$limitto));
}
/**
* Get count of subscriptions for a given user in a given course.
*
* @param int $courseid course id.
* @param int $userid Id of the user for which the subscription needs to be fetched. Defaults to $USER;
*
* @return int number of subscriptions
*/
public static function count_user_subscriptions_for_course($courseid, $userid = 0) {
global $DB, $USER;
if ($userid == 0) {
$userid = $USER->id;
}
$sql = self::get_subscription_join_rule_sql(true);
$sql .= "WHERE s.courseid = :courseid AND s.userid = :userid";
return $DB->count_records_sql($sql, array('courseid' => $courseid, 'userid' => $userid));
}
/**
* Get an array of subscriptions for a given user.
*
* @param int $limitfrom Limit from which to fetch rules.
* @param int $limitto Limit to which rules need to be fetched.
* @param int $userid Id of the user for which the subscription needs to be fetched. Defaults to $USER;
* @param string $order Order to sort the subscriptions.
*
* @return array list of subscriptions
*/
public static function get_user_subscriptions($limitfrom = 0, $limitto = 0, $userid = 0,
$order = 's.courseid ASC, r.name' ) {
global $DB, $USER;
if ($userid == 0) {
$userid = $USER->id;
}
$sql = self::get_subscription_join_rule_sql();
$sql .= "WHERE s.userid = :userid ORDER BY $order";
return self::get_instances($DB->get_records_sql($sql, array('userid' => $userid), $limitfrom, $limitto));
}
/**
* Get count of subscriptions for a given user.
*
* @param int $userid Id of the user for which the subscription needs to be fetched. Defaults to $USER;
*
* @return int number of subscriptions
*/
public static function count_user_subscriptions($userid = 0) {
global $DB, $USER;;
if ($userid == 0) {
$userid = $USER->id;
}
$sql = self::get_subscription_join_rule_sql(true);
$sql .= "WHERE s.userid = :userid";
return $DB->count_records_sql($sql, array('userid' => $userid));
}
/**
* Return a list of subscriptions for a given event.
*
* @param \stdClass $event the event object.
*
* @return array
*/
public static function get_subscriptions_by_event(\stdClass $event) {
global $DB;
$sql = self::get_subscription_join_rule_sql();
if ($event->contextlevel == CONTEXT_MODULE && $event->contextinstanceid != 0) {
$sql .= "WHERE r.eventname = :eventname AND s.courseid = :courseid AND (s.cmid = :cmid OR s.cmid = 0)";
$params = array('eventname' => $event->eventname, 'courseid' => $event->courseid, 'cmid' => $event->contextinstanceid);
} else {
$sql .= "WHERE r.eventname = :eventname AND (s.courseid = :courseid OR s.courseid = 0)";
$params = array('eventname' => $event->eventname, 'courseid' => $event->courseid);
}
return self::get_instances($DB->get_records_sql($sql, $params));
}
/**
* Return sql to join rule and subscription table.
*
* @param bool $count Weather if this is a count query or not.
*
* @return string the sql.
*/
protected static function get_subscription_join_rule_sql($count = false) {
if ($count) {
$select = "SELECT COUNT(s.id) ";
} else {
$select = "SELECT s.*, r.description, r.descriptionformat, r.name, r.userid as ruleuserid, r.courseid as rulecourseid,
r.plugin, r.eventname, r.template, r.templateformat, r.frequency, r.timewindow";
}
$sql = $select . "
FROM {tool_monitor_rules} r
JOIN {tool_monitor_subscriptions} s
ON r.id = s.ruleid ";
return $sql;
}
/**
* Helper method to convert db records to instances.
*
* @param array $arr of subscriptions.
*
* @return array of subscriptions as instances.
*/
protected static function get_instances($arr) {
$result = array();
foreach ($arr as $key => $sub) {
$result[$key] = new subscription($sub);
}
return $result;
}
/**
* Get count of subscriptions for a given rule.
*
* @param int $ruleid rule id of the subscription.
*
* @return int number of subscriptions
*/
public static function count_rule_subscriptions($ruleid) {
global $DB;
$sql = self::get_subscription_join_rule_sql(true);
$sql .= "WHERE s.ruleid = :ruleid";
return $DB->count_records_sql($sql, array('ruleid' => $ruleid));
}
/**
* Returns true if an event in a particular course has a subscription.
*
* @param string $eventname the name of the event
* @param int $courseid the course id
* @return bool returns true if the event has subscriptions in a given course, false otherwise.
*/
public static function event_has_subscriptions($eventname, $courseid) {
global $DB;
// Check if we can return these from cache.
$cache = \cache::make('tool_monitor', 'eventsubscriptions');
// The SQL we will be using to fill the cache if it is empty.
$sql = "SELECT DISTINCT(r.eventname)
FROM {tool_monitor_subscriptions} s
INNER JOIN {tool_monitor_rules} r
ON s.ruleid = r.id
WHERE s.courseid = :courseid";
$sitesubscriptions = $cache->get(0);
// If we do not have the site subscriptions in the cache then return them from the DB.
if ($sitesubscriptions === false) {
// Set the array for the cache.
$sitesubscriptions = array();
if ($subscriptions = $DB->get_records_sql($sql, array('courseid' => 0))) {
foreach ($subscriptions as $subscription) {
$sitesubscriptions[$subscription->eventname] = true;
}
}
$cache->set(0, $sitesubscriptions);
}
// Check if a subscription exists for this event site wide.
if (isset($sitesubscriptions[$eventname])) {
return true;
}
// If the course id is for the site, and we reached here then there is no site wide subscription for this event.
if (empty($courseid)) {
return false;
}
$coursesubscriptions = $cache->get($courseid);
// If we do not have the course subscriptions in the cache then return them from the DB.
if ($coursesubscriptions === false) {
// Set the array for the cache.
$coursesubscriptions = array();
if ($subscriptions = $DB->get_records_sql($sql, array('courseid' => $courseid))) {
foreach ($subscriptions as $subscription) {
$coursesubscriptions[$subscription->eventname] = true;
}
}
$cache->set($courseid, $coursesubscriptions);
}
// Check if a subscription exists for this event in this course.
if (isset($coursesubscriptions[$eventname])) {
return true;
}
return false;
}
}
@@ -0,0 +1,146 @@
<?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/>.
/**
* Clean the tool_monitor_events table.
*
* @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\task;
/**
* Simple task to clean the tool_monitor_events table.
*/
class clean_events extends \core\task\scheduled_task {
/**
* Get a descriptive name for this task.
*
* @return string
*/
public function get_name() {
return get_string('taskcleanevents', 'tool_monitor');
}
/**
* Performs the cleaning of events.
*/
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();
// Firstly, let's go through the site wide rules. There may be multiple rules for the site that rely on
// the same event being triggered, so we only remove the events when they reach the max timewindow.
if ($siterules = $DB->get_recordset('tool_monitor_rules', array('courseid' => 0), 'timewindow DESC')) {
// Go through each rule and check if there are any events we can remove.
foreach ($siterules as $rule) {
// Check if we have already processed this event.
if (isset($courses[$rule->courseid][$rule->eventname])) {
continue;
}
// Store the timewindow for this event.
$courses[$rule->courseid][$rule->eventname] = $rule->timewindow;
// Delete any events that may exist that have exceeded the timewindow.
$DB->delete_records_select('tool_monitor_events', 'eventname = :eventname AND
courseid = :courseid AND timecreated <= :timewindow',
array('eventname' => $rule->eventname, 'courseid' => $rule->courseid,
'timewindow' => time() - $rule->timewindow));
}
// Free resources.
$siterules->close();
}
// Now, get the course rules. The same applies here - there may be multiple rules for the course that rely on
// the same event being triggered, so we only remove the events when they reach the max timewindow.
if ($rules = $DB->get_recordset_select('tool_monitor_rules', 'courseid != 0', array(), 'timewindow DESC')) {
// Go through each rule and check if there are any events we can remove.
foreach ($rules as $rule) {
// Check if we have already processed this event for this particular course.
if (isset($courses[$rule->courseid][$rule->eventname])) {
continue;
}
// Add the course and event to the list.
$courses[$rule->courseid][$rule->eventname] = $rule->timewindow;
// If there is a site wide rule listening for this event do not remove it unless the maximum
// timewindow between the two has exceeded.
$timewindow = $rule->timewindow;
if (isset($courses[0][$rule->eventname]) && ($courses[0][$rule->eventname] > $timewindow)) {
$timewindow = $courses[0][$rule->eventname];
}
// Delete any events that may exist that have exceeded the timewindow.
$DB->delete_records_select('tool_monitor_events', 'eventname = :eventname AND
courseid = :courseid AND timecreated <= :timewindow',
array('eventname' => $rule->eventname, 'courseid' => $rule->courseid,
'timewindow' => time() - $timewindow));
}
// Free resources.
$rules->close();
}
if ($siterules || $rules) { // Check that there are rules present.
// Get a list of all the events we have been through.
$allevents = array();
foreach ($courses as $key => $value) {
foreach ($courses[$key] as $event => $notused) {
$allevents[] = $event;
}
}
// Remove all the events in the table that are not applicable to any rule. There may be a rule in one course
// listening for a certain event, but not in another course, so we can delete the event from the course
// where there is no rule. We also have to consider site wide rules. We may have an event that is triggered
// in a course we can't remove because there is a site wide rule for this event.
if ($events = $DB->get_recordset('tool_monitor_events')) {
// Array to store which events we need to remove.
$eventstodelete = array();
// Store the current time.
$now = time();
foreach ($events as $event) {
// If the event is not required for a course rule and there is no site wide rule for it, or
// it has extended past or equal to the timewindow for the site rule - it can be deleted.
if (!isset($courses[$event->courseid][$event->eventname]) && (!isset($courses[0][$event->eventname])
|| $courses[0][$event->eventname] <= ($now - $event->timecreated))) {
$eventstodelete[] = $event->id;
}
}
// Free resources.
$events->close();
// Remove the events.
if (!empty($eventstodelete)) {
list($eventidsql, $params) = $DB->get_in_or_equal($eventstodelete);
$DB->delete_records_select('tool_monitor_events', "id $eventidsql", $params);
}
}
// Remove all the events in the table that are not used by any rule.
if (!empty($allevents)) {
list($eventnamesql, $params) = $DB->get_in_or_equal($allevents, SQL_PARAMS_QM, 'param', false);
$DB->delete_records_select('tool_monitor_events', "eventname $eventnamesql", $params);
}
} else { // No rules, just remove everything.
$DB->delete_records('tool_monitor_events');
}
}
}
+61
View File
@@ -0,0 +1,61 @@
<?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/>.
/**
* Capabilities.
*
* This files lists capabilities related to 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();
$capabilities = array(
'tool/monitor:subscribe' => array(
'riskbitmask' => RISK_PERSONAL,
'captype' => 'read',
'contextlevel' => CONTEXT_COURSE,
'archetypes' => array(
'teacher' => CAP_ALLOW,
'editingteacher' => CAP_ALLOW,
'manager' => CAP_ALLOW
),
),
'tool/monitor:managerules' => array(
'riskbitmask' => RISK_XSS,
'captype' => 'write',
'contextlevel' => CONTEXT_COURSE,
'archetypes' => array(
'teacher' => CAP_ALLOW,
'editingteacher' => CAP_ALLOW,
'manager' => CAP_ALLOW
),
),
'tool/monitor:managetool' => array(
'riskbitmask' => RISK_XSS, RISK_CONFIG,
'captype' => 'write',
'contextlevel' => CONTEXT_SYSTEM,
'archetypes' => array(
'manager' => CAP_ALLOW
),
),
);
+35
View File
@@ -0,0 +1,35 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Event monitor cache definitions.
*
* @package tool_monitor
* @copyright 2014 Mark Nelson <markn@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die;
$definitions = array(
'eventsubscriptions' => array(
'mode' => cache_store::MODE_APPLICATION,
'simplekeys' => true,
'simpledata' => true,
'staticacceleration' => true,
'staticaccelerationsize' => 10
)
);
+44
View File
@@ -0,0 +1,44 @@
<?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/>.
/**
* This file definies observers needed by the tool.
*
* @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
*/
// List of observers.
$observers = array(
array(
'eventname' => '\core\event\course_deleted',
'priority' => 1,
'callback' => '\tool_monitor\eventobservers::course_deleted',
),
array(
'eventname' => '*',
'callback' => '\tool_monitor\eventobservers::process_event',
),
array(
'eventname' => '\core\event\user_deleted',
'callback' => '\tool_monitor\eventobservers::user_deleted',
),
array(
'eventname' => '\core\event\course_module_deleted',
'callback' => '\tool_monitor\eventobservers::course_module_deleted',
)
);
+81
View File
@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8" ?>
<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"
>
<TABLES>
<TABLE NAME="tool_monitor_rules" COMMENT="Table to store rules">
<FIELDS>
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
<FIELD NAME="description" TYPE="text" NOTNULL="false" SEQUENCE="false" COMMENT="Description of the rule"/>
<FIELD NAME="descriptionformat" TYPE="int" LENGTH="1" NOTNULL="true" SEQUENCE="false" COMMENT="Description format"/>
<FIELD NAME="name" TYPE="char" LENGTH="254" NOTNULL="true" SEQUENCE="false" COMMENT="Name of the rule"/>
<FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Id of user who created the rule"/>
<FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Id of course to which this rule belongs."/>
<FIELD NAME="plugin" TYPE="char" LENGTH="254" NOTNULL="true" SEQUENCE="false" COMMENT="Frankenstlye name of the plguin"/>
<FIELD NAME="eventname" TYPE="char" LENGTH="254" NOTNULL="true" SEQUENCE="false" COMMENT="Fully qualified name of the event"/>
<FIELD NAME="template" TYPE="text" NOTNULL="true" SEQUENCE="false" COMMENT="Message template"/>
<FIELD NAME="templateformat" TYPE="int" LENGTH="1" NOTNULL="true" SEQUENCE="false" COMMENT="Template format"/>
<FIELD NAME="frequency" TYPE="int" LENGTH="4" NOTNULL="true" SEQUENCE="false" COMMENT="Frequency"/>
<FIELD NAME="timewindow" TYPE="int" LENGTH="5" NOTNULL="true" SEQUENCE="false" COMMENT="Time window in seconds"/>
<FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Timestamp when this rule was last modified"/>
<FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Time stamp of when this rule was created"/>
</FIELDS>
<KEYS>
<KEY NAME="primary" TYPE="primary" FIELDS="id"/>
</KEYS>
<INDEXES>
<INDEX NAME="courseanduser" UNIQUE="false" FIELDS="courseid, userid" COMMENT="Index on courseid and userid"/>
<INDEX NAME="eventname" UNIQUE="false" FIELDS="eventname" COMMENT="eventname"/>
</INDEXES>
</TABLE>
<TABLE NAME="tool_monitor_subscriptions" COMMENT="Table to store user subscriptions to various rules">
<FIELDS>
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
<FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Course id of the subscription"/>
<FIELD NAME="ruleid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Rule id"/>
<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"/>
<KEY NAME="rulekey" TYPE="foreign" FIELDS="ruleid" REFTABLE="tool_monitor_rules" REFFIELDS="id" COMMENT="Foreign key"/>
</KEYS>
<INDEXES>
<INDEX NAME="courseanduser" UNIQUE="false" FIELDS="courseid, userid" COMMENT="Course and user"/>
</INDEXES>
</TABLE>
<TABLE NAME="tool_monitor_history" COMMENT="Table to store history of message notifications sent">
<FIELDS>
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
<FIELD NAME="sid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Subscription id"/>
<FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="User to whom this notification was sent"/>
<FIELD NAME="timesent" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Timestamp of when the message was sent."/>
</FIELDS>
<KEYS>
<KEY NAME="primary" TYPE="primary" FIELDS="id"/>
<KEY NAME="subscrptionid" TYPE="foreign" FIELDS="sid" REFTABLE="tool_monitor_subscriptions" REFFIELDS="id"/>
</KEYS>
<INDEXES>
<INDEX NAME="sid_userid_timesent" UNIQUE="true" FIELDS="sid, userid, timesent"/>
</INDEXES>
</TABLE>
<TABLE NAME="tool_monitor_events" COMMENT="A table that keeps a log of events related to subscriptions">
<FIELDS>
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
<FIELD NAME="eventname" TYPE="char" LENGTH="254" NOTNULL="true" SEQUENCE="false" COMMENT="Event name"/>
<FIELD NAME="contextid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Context id"/>
<FIELD NAME="contextlevel" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Context level"/>
<FIELD NAME="contextinstanceid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Context instance id"/>
<FIELD NAME="link" TYPE="char" LENGTH="254" NOTNULL="true" SEQUENCE="false" COMMENT="Link to the event location"/>
<FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="course id"/>
<FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Time created"/>
</FIELDS>
<KEYS>
<KEY NAME="primary" TYPE="primary" FIELDS="id"/>
</KEYS>
</TABLE>
</TABLES>
</XMLDB>
+32
View File
@@ -0,0 +1,32 @@
<?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/>.
/**
* Message providers list.
*
* @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();
$messageproviders = array (
// Notify a user that a rule has happened.
'notification' => array (
'capability' => 'tool/monitor:subscribe'
)
);
+36
View File
@@ -0,0 +1,36 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* This file defines tasks performed by the tool.
*
* @package tool_monitor
* @copyright 2014 Mark Nelson <markn@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
// List of tasks.
$tasks = array(
array(
'classname' => 'tool_monitor\task\clean_events',
'blocking' => 0,
'minute' => '*',
'hour' => '*',
'day' => '*',
'dayofweek' => '*',
'month' => '*'
)
);
+57
View File
@@ -0,0 +1,57 @@
<?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');
}
// Moodle v2.8.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+120
View File
@@ -0,0 +1,120 @@
<?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/>.
/**
* This file gives an overview of the monitors present in site.
*
* @package tool_monitor
* @copyright 2014 onwards Simey Lameze <simey@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require(__DIR__ . '/../../../config.php');
require_once($CFG->libdir.'/adminlib.php');
$ruleid = optional_param('ruleid', 0, PARAM_INT);
$courseid = optional_param('courseid', 0, PARAM_INT);
// Validate course id.
if (empty($courseid)) {
require_login();
$context = context_system::instance();
$coursename = format_string($SITE->fullname, true, array('context' => $context));
$PAGE->set_context($context);
} else {
$course = get_course($courseid);
require_login($course);
$context = context_course::instance($course->id);
$coursename = format_string($course->fullname, true, array('context' => $context));
}
// Check for caps.
require_capability('tool/monitor:managerules', $context);
// Set up the page.
$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($coursename);
$PAGE->set_heading($coursename);
// Get data ready for mform.
$eventlist = tool_monitor\eventlist::get_all_eventlist(true);
$pluginlist = tool_monitor\eventlist::get_plugin_list();
$eventlist = array_merge(array('' => get_string('choosedots')), $eventlist);
$pluginlist = array_merge(array('' => get_string('choosedots')), $pluginlist);
// Set up the yui module.
$PAGE->requires->yui_module('moodle-tool_monitor-dropdown', 'Y.M.tool_monitor.DropDown.init',
array(array('eventlist' => $eventlist)));
// Site level report.
if (empty($courseid)) {
admin_externalpage_setup('toolmonitorrules', '', null, '', array('pagelayout' => 'report'));
} else {
// Course level report.
$PAGE->navigation->override_active_url($manageurl);
}
// Mform setup.
if (!empty($ruleid)) {
$rule = \tool_monitor\rule_manager::get_rule($ruleid)->get_mform_set_data();
$rule->minutes = $rule->timewindow / MINSECS;
$subscriptioncount = \tool_monitor\subscription_manager::count_rule_subscriptions($ruleid);
} else {
$rule = new stdClass();
$subscriptioncount = 0;
}
$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);
if (empty($rule->id)) {
\tool_monitor\rule_manager::add_rule($rule);
} else {
\tool_monitor\rule_manager::update_rule($rule);
}
redirect($manageurl);
} else {
echo $OUTPUT->header();
$mform->set_data($rule);
// If there's any subscription for this rule, display an information message.
if ($subscriptioncount > 0) {
echo $OUTPUT->notification(get_string('disablefieldswarning', 'tool_monitor'), 'notifyproblem');
}
$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();
+144
View File
@@ -0,0 +1,144 @@
<?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/>.
/**
* This page lets users to manage rules for a given course.
*
* @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
*/
require_once(__DIR__ . '/../../../config.php');
require_once($CFG->libdir.'/adminlib.php');
$courseid = optional_param('courseid', 0, PARAM_INT);
$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)) {
require_login();
} else {
// They might want to see rules for this course.
$course = get_course($courseid);
require_login($course);
$coursecontext = context_course::instance($course->id);
// Check for caps.
require_capability('tool/monitor:subscribe', $coursecontext);
$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.
$indexurl = new moodle_url('/admin/tool/monitor/index.php', array('courseid' => $courseid));
$PAGE->set_url($indexurl);
$PAGE->set_pagelayout('report');
$PAGE->set_title($sitename);
$PAGE->set_heading($sitename);
// Create/delete subscription if needed.
if (!empty($action)) {
require_sesskey();
switch ($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' :
// 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.
$totalsubs = \tool_monitor\subscription_manager::count_user_subscriptions();
$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'), 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'), 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 ($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;";
$link .= html_writer::tag('span', get_string('manageruleslink', 'tool_monitor', $a));
echo $link;
}
echo html_writer::end_div();
} else if ($canmanagerules) {
$manageurl = new moodle_url("/admin/tool/monitor/managerules.php", array('courseid' => $courseid));
echo $renderer->render_rules_link($manageurl);
}
echo $OUTPUT->footer();
+102
View File
@@ -0,0 +1,102 @@
<?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/>.
/**
* Lang strings.
*
* This files lists lang strings related to 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
*/
$string['addrule'] = 'Add a new rule';
$string['allevents'] = 'All events';
$string['allmodules'] = 'All instances';
$string['area'] = 'Area';
$string['areatomonitor'] = 'Area to monitor';
$string['cachedef_eventsubscriptions'] = 'This stores the list of event subscriptions for individual courses';
$string['contactadmin'] = 'Contact your administrator to enable it.';
$string['core'] = 'Core';
$string['currentsubscriptions'] = 'Your current subscriptions';
$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'] = '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 you can create and subscribe to rules. Note that enabling Event monitoring may affect the performance of your site.';
$string['event'] = 'Event';
$string['eventnotfound'] = 'Event not found';
$string['eventrulecreated'] = 'Rule created';
$string['eventruledeleted'] = 'Rule deleted';
$string['eventruleupdated'] = 'Rule updated';
$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} 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['manageruleslink'] = 'You can manage rules from the {$a} page.';
$string['managesubscriptionslink'] = 'You can subscribe to rules from the {$a} page.';
$string['manage'] = 'Manage';
$string['managesubscriptions'] = 'Event monitoring';
$string['managerules'] = 'Event monitoring rules';
$string['messageprovider:notification'] = 'Notifications of rule subscriptions';
$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 the rule "{$a}"?';
$string['ruleareyousureextra'] = 'There are {$a} subscription(s) to this rule that will also be deleted.';
$string['rulecopysuccess'] = 'Rule successfully duplicated';
$string['ruledeletesuccess'] = 'Rule successfully deleted';
$string['rulehelp'] = 'Rule details';
$string['rulehelp_help'] = 'This rule listens for when the event \'{$a->eventname}\' in \'{$a->eventcomponent}\' has been triggered {$a->frequency} time(s) in {$a->minutes} minute(s).';
$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['subareyousure'] = 'Are you sure you want to delete the subscription to 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['taskcleanevents'] = 'Removes any unnecessary event monitor events';
$string['unsubscribe'] = 'Unsubscribe';
+96
View File
@@ -0,0 +1,96 @@
<?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/>.
/**
* This page lists public api for tool_monitor plugin.
*
* @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;
/**
* 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_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('frontpagereports');
if (isset($settingsnode) && !empty($reportnode)) {
$reportnode->add_node($settingsnode);
}
}
}
/**
* This function extends the navigation with the tool items for user settings node.
*
* @param navigation_node $navigation The navigation node to extend
* @param stdClass $user The user object
* @param context $usercontext The context of the user
* @param stdClass $course The course to object for the tool
* @param context $coursecontext The context of the course
*/
function tool_monitor_extend_navigation_user_settings($navigation, $user, $usercontext, $course, $coursecontext) {
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', ''));
if (isset($subsnode) && !empty($navigation)) {
$navigation->add_node($subsnode);
}
}
}
+154
View File
@@ -0,0 +1,154 @@
<?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/>.
/**
* This page lets users to manage rules for a given course.
*
* @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
*/
require_once(__DIR__ . '/../../../config.php');
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)) {
require_login();
$context = context_system::instance();
$coursename = format_string($SITE->fullname, true, array('context' => $context));
$PAGE->set_context($context);
} else {
$course = get_course($courseid);
require_login($course);
$context = context_course::instance($course->id);
$coursename = format_string($course->fullname, true, array('context' => $context));
}
// Check for caps.
require_capability('tool/monitor:managerules', $context);
// Set up the page.
$manageurl = new moodle_url("/admin/tool/monitor/managerules.php", array('courseid' => $courseid));
$PAGE->set_url($manageurl);
$PAGE->set_pagelayout('report');
$PAGE->set_title($coursename);
$PAGE->set_heading($coursename);
// Site level report.
if (empty($courseid)) {
admin_externalpage_setup('toolmonitorrules', '', null, '', array('pagelayout' => 'report'));
}
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();
// 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);
switch ($action) {
case 'copy':
// No need to check for capability here as it is done at the start of the page.
$rule->duplicate_rule($courseid);
echo $OUTPUT->notification(get_string('rulecopysuccess', 'tool_monitor'), 'notifysuccess');
break;
case 'delete':
if ($rule->can_manage_rule()) {
$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 {
$strconfirm = get_string('ruleareyousure', 'tool_monitor', $rule->get_name($context));
if ($numberofsubs = $DB->count_records('tool_monitor_subscriptions', array('ruleid' => $ruleid))) {
$strconfirm .= '<br />';
$strconfirm .= get_string('ruleareyousureextra', 'tool_monitor', $numberofsubs);
}
echo $OUTPUT->confirm($strconfirm, $confirmurl, $cancelurl);
echo $OUTPUT->footer();
exit();
}
} else {
// User doesn't have permissions. Should never happen for real users.
throw new moodle_exception('rulenopermissions', 'tool_monitor', $manageurl, $action);
}
break;
default:
}
} 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.
$renderable = new \tool_monitor\output\managerules\renderable('toolmonitorrules', $manageurl, $courseid);
$renderer = $PAGE->get_renderer('tool_monitor', 'managerules');
echo $renderer->render($renderable);
if (has_capability('tool/monitor:subscribe', $context)) {
$manageurl = new moodle_url("/admin/tool/monitor/index.php", array('courseid' => $courseid));
echo $renderer->render_subscriptions_link($manageurl);
}
echo $OUTPUT->footer();
+35
View File
@@ -0,0 +1,35 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Links and settings
*
* This file contains links and settings used by 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;
// 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);
@@ -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"
+165
View File
@@ -0,0 +1,165 @@
@javascript @tool @tool_monitor @tool_monitor_rules
Feature: tool_monitor_rule
In order to manage rules
As an admin
I need to create a rule, edit a rule, duplicate a rule and delete a rule
Background:
Given the following "courses" exist:
| fullname | shortname |
| Course 1 | C1 |
And the following "users" exist:
| username | firstname | lastname | email |
| teacher1 | Teacher | 1 | teacher1@asd.com |
And the following "course enrolments" exist:
| user | course | role |
| teacher1 | C1 | 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 | 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 |
| 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 the 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 |
| 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" in the "New rule course level" "table_row"
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 |
| 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 the 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 |
| 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 "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" in the "New rule site level" "table_row"
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)"
@@ -0,0 +1,179 @@
@javascript @tool @tool_monitor @tool_monitor_subscriptions
Feature: tool_monitor_subscriptions
In order to monitor events and receive notifications
As an user
I need to create a new rule, subscribe to it, receive notification and delete subscription
Background:
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 |
| 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 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 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 the subscription to 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 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 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 the subscription to 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 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 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"
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."
@@ -0,0 +1,620 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Unit tests for event observers.
*
* @package tool_monitor
* @category test
* @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();
global $CFG;
require_once($CFG->dirroot . '/blog/locallib.php');
require_once($CFG->dirroot . '/blog/lib.php');
/**
* Class tool_monitor_eventobservers_testcase
*
* 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.
*/
public function test_course_deleted() {
global $DB;
$this->setAdminUser();
$this->resetAfterTest(true);
$user = $this->getDataGenerator()->create_user();
$course1 = $this->getDataGenerator()->create_course();
$course2 = $this->getDataGenerator()->create_course();
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
$rule = new stdClass();
$rule->userid = $user->id;
$rule->courseid = $course1->id;
$rule->plugin = 'test';
$sub = new stdClass();
$sub->courseid = $course1->id;
$sub->userid = $user->id;
// Add 10 rules for this course with subscriptions.
for ($i = 0; $i < 10; $i++) {
$createdrule = $monitorgenerator->create_rule($rule);
$sub->ruleid = $createdrule->id;
$monitorgenerator->create_subscription($sub);
}
// Add 10 random rules for course 2.
$rule->courseid = $course2->id;
for ($i = 0; $i < 10; $i++) {
$createdrule = $monitorgenerator->create_rule($rule);
$sub->courseid = $rule->courseid;
$sub->ruleid = $createdrule->id;
$monitorgenerator->create_subscription($sub);
}
// Add a site rule.
$rule = new stdClass();
$rule->userid = $user->id;
$rule->courseid = 0;
$rule->plugin = 'core';
$monitorgenerator->create_rule($rule);
// Verify that if we do not specify that we do not want the site rules, they are returned.
$courserules = \tool_monitor\rule_manager::get_rules_by_courseid($course1->id);
$this->assertCount(11, $courserules);
// Verify data before course delete.
$totalrules = \tool_monitor\rule_manager::get_rules_by_plugin('test');
$this->assertCount(20, $totalrules);
$courserules = \tool_monitor\rule_manager::get_rules_by_courseid($course1->id, 0, 0, false);
$this->assertCount(10, $courserules);
$this->assertEquals(20, $DB->count_records('tool_monitor_subscriptions'));
$coursesubs = \tool_monitor\subscription_manager::get_user_subscriptions_for_course($course1->id, 0, 0, $user->id);
$this->assertCount(10, $coursesubs);
// Let us delete the course now.
delete_course($course1->id, false);
// Confirm the site rule still exists.
$this->assertEquals(1, $DB->count_records('tool_monitor_rules', array('courseid' => 0)));
// Verify data after course delete.
$totalrules = \tool_monitor\rule_manager::get_rules_by_plugin('test');
$this->assertCount(10, $totalrules);
$courserules = \tool_monitor\rule_manager::get_rules_by_courseid($course1->id, 0, 0, false);
$this->assertCount(0, $courserules); // Making sure all rules are deleted.
$this->assertEquals(10, $DB->count_records('tool_monitor_subscriptions'));
$coursesubs = \tool_monitor\subscription_manager::get_user_subscriptions_for_course($course1->id, 0, 0, $user->id);
$this->assertCount(0, $coursesubs); // Making sure all subscriptions are deleted.
}
/**
* This tests if writing of the events to the table tool_monitor_events is working fine.
*/
public function test_flush() {
global $DB;
$this->resetAfterTest();
// Create the necessary items for testing.
$user = $this->getDataGenerator()->create_user();
$course = $this->getDataGenerator()->create_course();
$course2 = $this->getDataGenerator()->create_course();
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
// Fire a bunch of events.
// Trigger a bunch of other events.
$eventparams = array(
'context' => context_course::instance($course->id)
);
for ($i = 0; $i < 5; $i++) {
\core\event\course_viewed::create($eventparams)->trigger();
\mod_quiz\event\course_module_instance_list_viewed::create($eventparams)->trigger();
\mod_scorm\event\course_module_instance_list_viewed::create($eventparams)->trigger();
}
// Confirm that nothing was stored in the tool_monitor_events table
// as we do not have any subscriptions associated for the above events.
$this->assertEquals(0, $DB->count_records('tool_monitor_events'));
// Now, let's create a rule so an event can be stored.
$rule = new stdClass();
$rule->courseid = $course->id;
$rule->plugin = 'mod_book';
$rule->eventname = '\mod_book\event\course_module_instance_list_viewed';
$rule = $monitorgenerator->create_rule($rule);
// Let's subscribe to this rule.
$sub = new stdClass;
$sub->courseid = $course->id;
$sub->ruleid = $rule->id;
$sub->userid = $user->id;
$monitorgenerator->create_subscription($sub);
// Again, let's just fire more events to make sure they still aren't stored.
for ($i = 0; $i < 5; $i++) {
\core\event\course_viewed::create($eventparams)->trigger();
\mod_quiz\event\course_module_instance_list_viewed::create($eventparams)->trigger();
\mod_scorm\event\course_module_instance_list_viewed::create($eventparams)->trigger();
}
// Fire the event we want to capture.
$event = \mod_book\event\course_module_instance_list_viewed::create_from_course($course);
$event->trigger();
// Check that the event data is valid.
$events = $DB->get_records('tool_monitor_events');
$this->assertEquals(1, count($events));
$monitorevent = array_pop($events);
$this->assertEquals($event->eventname, $monitorevent->eventname);
$this->assertEquals($event->contextid, $monitorevent->contextid);
$this->assertEquals($event->contextlevel, $monitorevent->contextlevel);
$this->assertEquals($event->get_url()->out(), $monitorevent->link);
$this->assertEquals($event->courseid, $monitorevent->courseid);
$this->assertEquals($event->timecreated, $monitorevent->timecreated);
// Remove the stored events.
$DB->delete_records('tool_monitor_events');
// Now, let's create a site wide rule.
$rule = new stdClass();
$rule->courseid = 0;
$rule->plugin = 'mod_book';
$rule->eventname = '\mod_book\event\course_module_instance_list_viewed';
$rule = $monitorgenerator->create_rule($rule);
// Let's subscribe to this rule.
$sub = new stdClass;
$sub->courseid = 0;
$sub->ruleid = $rule->id;
$sub->userid = $user->id;
$monitorgenerator->create_subscription($sub);
// Fire the event we want to capture - but in a different course.
$event = \mod_book\event\course_module_instance_list_viewed::create_from_course($course2);
$event->trigger();
// Check that the event data is valid.
$events = $DB->get_records('tool_monitor_events');
$this->assertEquals(1, count($events));
$monitorevent = array_pop($events);
$this->assertEquals($event->eventname, $monitorevent->eventname);
$this->assertEquals($event->contextid, $monitorevent->contextid);
$this->assertEquals($event->contextlevel, $monitorevent->contextlevel);
$this->assertEquals($event->get_url()->out(), $monitorevent->link);
$this->assertEquals($event->courseid, $monitorevent->courseid);
$this->assertEquals($event->timecreated, $monitorevent->timecreated);
}
/**
* Test the notification sending features.
*/
public function test_process_event() {
global $DB, $USER;
$this->resetAfterTest();
$this->setAdminUser();
$msgsink = $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 = 1;
$rule = $toolgenerator->create_rule($rulerecord);
$subrecord = new stdClass();
$subrecord->courseid = $course->id;
$subrecord->ruleid = $rule->id;
$subrecord->userid = $USER->id;
$toolgenerator->create_subscription($subrecord);
$recordexists = $DB->record_exists('task_adhoc', array('component' => 'tool_monitor'));
$this->assertFalse($recordexists);
// Now let us trigger the event.
$event = \mod_book\event\course_module_instance_list_viewed::create_from_course($course);
$event->trigger();
$this->verify_processed_data($msgsink);
// Clean up.
\tool_monitor\rule_manager::delete_rule($rule->id);
$DB->delete_records('tool_monitor_events');
// Let us create a rule with more than 1 frequency.
$rulerecord->frequency = 5;
$rule = $toolgenerator->create_rule($rulerecord);
$subrecord->ruleid = $rule->id;
$toolgenerator->create_subscription($subrecord);
// Let us trigger events.
for ($i = 0; $i < 5; $i++) {
$event = \mod_book\event\course_module_instance_list_viewed::create_from_course($course);
$event->trigger();
if ($i != 4) {
$this->verify_message_not_sent_yet($msgsink);
}
}
$this->verify_processed_data($msgsink);
// Clean up.
\tool_monitor\rule_manager::delete_rule($rule->id);
$DB->delete_records('tool_monitor_events');
// Now let us create a rule specific to a module instance.
$cm = new stdClass();
$cm->course = $course->id;
$book = $this->getDataGenerator()->create_module('book', $cm);
$rulerecord->eventname = '\mod_book\event\course_module_viewed';
$rulerecord->cmid = $book->cmid;
$rule = $toolgenerator->create_rule($rulerecord);
$subrecord->ruleid = $rule->id;
$toolgenerator->create_subscription($subrecord);
// Let us trigger events.
$params = array(
'context' => context_module::instance($book->cmid),
'objectid' => $book->id
);
for ($i = 0; $i < 5; $i++) {
$event = \mod_book\event\course_module_viewed::create($params);
$event->trigger();
if ($i != 4) {
$this->verify_message_not_sent_yet($msgsink);
}
}
$this->verify_processed_data($msgsink);
// Clean up.
\tool_monitor\rule_manager::delete_rule($rule->id);
$DB->delete_records('tool_monitor_events');
// Now let us create a rule for event that happens in category context events.
$rulerecord->eventname = '\core\event\course_category_created';
$rulerecord->courseid = 0;
$rule = $toolgenerator->create_rule($rulerecord);
$subrecord->courseid = 0;
$subrecord->ruleid = $rule->id;
$toolgenerator->create_subscription($subrecord);
// Let us trigger events.
for ($i = 0; $i < 5; $i++) {
$this->getDataGenerator()->create_category();
if ($i != 4) {
$this->verify_message_not_sent_yet($msgsink);
}
}
$this->verify_processed_data($msgsink);
// Clean up.
\tool_monitor\rule_manager::delete_rule($rule->id);
$DB->delete_records('tool_monitor_events');
// Now let us create a rule at site level.
$rulerecord->eventname = '\core\event\blog_entry_created';
$rulerecord->courseid = 0;
$rule = $toolgenerator->create_rule($rulerecord);
$subrecord->courseid = 0;
$subrecord->ruleid = $rule->id;
$toolgenerator->create_subscription($subrecord);
// Let us trigger events.
$blog = new blog_entry();
$blog->subject = "Subject of blog";
$blog->userid = $USER->id;
$states = blog_entry::get_applicable_publish_states();
$blog->publishstate = reset($states);
for ($i = 0; $i < 5; $i++) {
$newblog = fullclone($blog);
$newblog->add();
if ($i != 4) {
$this->verify_message_not_sent_yet($msgsink);
}
}
$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.
*/
protected function run_adhock_tasks() {
while ($task = \core\task\manager::get_next_adhoc_task(time())) {
$task->execute();
\core\task\manager::adhoc_task_complete($task);
}
$this->expectOutputRegex("/^Sending message to the user with id \d+ for the subscription with id \d+\.\.\..Sent./ms");
}
/**
* Verify that task was scheduled and a message was sent as expected.
*
* @param phpunit_message_sink $msgsink Message sink
*/
protected function verify_processed_data(phpunit_message_sink $msgsink) {
global $DB, $USER;
$recordexists = $DB->count_records('task_adhoc', array('component' => 'tool_monitor'));
$this->assertEquals(1, $recordexists); // We should have an adhock task now to send notifications.
$this->run_adhock_tasks();
$this->assertEquals(1, $msgsink->count());
$msgs = $msgsink->get_messages();
$msg = array_pop($msgs);
$this->assertEquals($USER->id, $msg->useridto);
$this->assertEquals(1, $msg->notification);
$msgsink->clear();
}
/**
* Verify that a message was not sent.
*
* @param phpunit_message_sink $msgsink Message sink
*/
protected function verify_message_not_sent_yet(phpunit_message_sink $msgsink) {
$msgs = $msgsink->get_messages();
$this->assertCount(0, $msgs);
$msgsink->clear();
}
/**
* Tests for replace_placeholders method.
*/
public function test_replace_placeholders() {
global $USER;
$this->resetAfterTest();
$this->setAdminUser();
$msgsink = $this->redirectMessages();
// Generate data.
$course = $this->getDataGenerator()->create_course();
$toolgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
$context = \context_user::instance($USER->id, IGNORE_MISSING);
// Creating book.
$cm = new stdClass();
$cm->course = $course->id;
$book = $this->getDataGenerator()->create_module('book', $cm);
// Creating rule.
$rulerecord = new stdClass();
$rulerecord->courseid = $course->id;
$rulerecord->eventname = '\mod_book\event\course_module_viewed';
$rulerecord->cmid = $book->cmid;
$rulerecord->frequency = 1;
$rulerecord->template = '{link} {modulelink} {rulename} {description} {eventname}';
$rule = $toolgenerator->create_rule($rulerecord);
// Creating subscription.
$subrecord = new stdClass();
$subrecord->courseid = $course->id;
$subrecord->ruleid = $rule->id;
$subrecord->userid = $USER->id;
$toolgenerator->create_subscription($subrecord);
// Now let us trigger the event.
$params = array(
'context' => context_module::instance($book->cmid),
'objectid' => $book->id
);
$event = \mod_book\event\course_module_viewed::create($params);
$event->trigger();
$this->run_adhock_tasks();
$msgs = $msgsink->get_messages();
$msg = array_pop($msgs);
$modurl = new moodle_url('/mod/book/view.php', array('id' => $book->cmid));
$expectedmsg = $event->get_url()->out() . ' ' .
$modurl->out() . ' ' .
$rule->get_name($context) . ' ' .
$rule->get_description($context) . ' ' .
$rule->get_event_name();
$this->assertEquals($expectedmsg, $msg->fullmessage);
}
/**
* Test observer for user delete event.
*/
public function test_user_deleted() {
global $DB;
$this->setAdminUser();
$this->resetAfterTest(true);
$user = $this->getDataGenerator()->create_user();
$course1 = $this->getDataGenerator()->create_course();
$course2 = $this->getDataGenerator()->create_course();
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
$rule = new stdClass();
$rule->userid = $user->id;
$rule->courseid = $course1->id;
$rule->plugin = 'test';
$sub = new stdClass();
$sub->courseid = $course1->id;
$sub->userid = $user->id;
// Add 10 rules for this course with subscriptions.
for ($i = 0; $i < 10; $i++) {
$createdrule = $monitorgenerator->create_rule($rule);
$sub->ruleid = $createdrule->id;
$monitorgenerator->create_subscription($sub);
}
// Add 10 random rules for course 2.
$rule->courseid = $course2->id;
for ($i = 0; $i < 10; $i++) {
$createdrule = $monitorgenerator->create_rule($rule);
$sub->courseid = $rule->courseid;
$sub->ruleid = $createdrule->id;
$monitorgenerator->create_subscription($sub);
}
// Verify data before user delete.
$totalrules = \tool_monitor\rule_manager::get_rules_by_plugin('test');
$this->assertCount(20, $totalrules);
$totalsubs = $DB->get_records('tool_monitor_subscriptions');
$this->assertCount(20, $totalsubs);
// Let us delete the user now.
delete_user($user);
// Verify data after course delete.
$totalrules = \tool_monitor\rule_manager::get_rules_by_plugin('test');
$this->assertCount(20, $totalrules);
$totalsubs = $DB->get_records('tool_monitor_subscriptions');
$this->assertCount(0, $totalsubs); // Make sure all subscriptions are deleted.
}
/**
* Test observer for course module delete event.
*/
public function test_course_module_deleted() {
global $DB;
$this->setAdminUser();
$this->resetAfterTest(true);
$user = $this->getDataGenerator()->create_user();
$course1 = $this->getDataGenerator()->create_course();
$course2 = $this->getDataGenerator()->create_course();
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
// Now let us create a rule specific to a module instance.
$cm = new stdClass();
$cm->course = $course1->id;
$book = $this->getDataGenerator()->create_module('book', $cm);
$rule = new stdClass();
$rule->userid = $user->id;
$rule->courseid = $course1->id;
$rule->plugin = 'test';
$sub = new stdClass();
$sub->courseid = $course1->id;
$sub->userid = $user->id;
$sub->cmid = $book->cmid;
// Add 10 rules for this course with subscriptions for this module.
for ($i = 0; $i < 10; $i++) {
$createdrule = $monitorgenerator->create_rule($rule);
$sub->ruleid = $createdrule->id;
$monitorgenerator->create_subscription($sub);
}
// Add 10 random rules for course 2.
$rule->courseid = $course2->id;
for ($i = 0; $i < 10; $i++) {
$createdrule = $monitorgenerator->create_rule($rule);
$sub->courseid = $rule->courseid;
$sub->ruleid = $createdrule->id;
$sub->cmid = 0;
$monitorgenerator->create_subscription($sub);
}
// Verify data before module delete.
$totalrules = \tool_monitor\rule_manager::get_rules_by_plugin('test');
$this->assertCount(20, $totalrules);
$totalsubs = $DB->get_records('tool_monitor_subscriptions');
$this->assertCount(20, $totalsubs);
// Let us delete the user now.
course_delete_module($book->cmid);
// Verify data after course delete.
$totalrules = \tool_monitor\rule_manager::get_rules_by_plugin('test');
$this->assertCount(20, $totalrules);
$totalsubs = $DB->get_records('tool_monitor_subscriptions');
$this->assertCount(10, $totalsubs); // Make sure only relevant subscriptions are deleted.
}
}
+344
View File
@@ -0,0 +1,344 @@
<?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/>.
/**
* Events tests.
*
* @package tool_monitor
* @category test
* @copyright 2014 Mark Nelson <markn@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Tests that the tool_monitor events are valid and triggered correctly.
*/
class tool_monitor_events_testcase extends advanced_testcase {
/**
* Tests set up.
*/
public function setUp() {
set_config('enablemonitor', 1, 'tool_monitor');
$this->resetAfterTest();
}
/**
* Test the rule created event.
*/
public function test_rule_created() {
// Create the items we need to create a rule.
$course = $this->getDataGenerator()->create_course();
$user = $this->getDataGenerator()->create_user();
// Create the variables for the rule we want to create.
$ruledata = new stdClass();
$ruledata->userid = $user->id;
$ruledata->courseid = $course->id;
$ruledata->plugin = 'mod_assign';
$ruledata->eventname = '\mod_assign\event\submission_viewed';
$ruledata->description = 'Rule description';
$ruledata->descriptionformat = FORMAT_HTML;
$ruledata->template = 'A message template';
$ruledata->templateformat = FORMAT_HTML;
$ruledata->frequency = 1;
$ruledata->timewindow = 60;
// Trigger and capture the event.
$sink = $this->redirectEvents();
$rule = \tool_monitor\rule_manager::add_rule($ruledata);
$events = $sink->get_events();
$this->assertCount(1, $events);
$event = reset($events);
// Confirm that the event contains the expected values.
$this->assertInstanceOf('\tool_monitor\event\rule_created', $event);
$this->assertEquals(context_course::instance($course->id), $event->get_context());
$this->assertEquals($rule->id, $event->objectid);
$this->assertEventContextNotUsed($event);
// Now let's add a system rule (courseid = 0).
$ruledata->courseid = 0;
// Trigger and capture the event.
$sink = $this->redirectEvents();
\tool_monitor\rule_manager::add_rule($ruledata);
$events = $sink->get_events();
$this->assertCount(1, $events);
$event = reset($events);
// Confirm that the event uses the system context.
$this->assertInstanceOf('\tool_monitor\event\rule_created', $event);
$this->assertEquals(context_system::instance(), $event->get_context());
}
/**
* Test the rule updated event.
*/
public function test_rule_updated() {
// Create the items we need.
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
$course = $this->getDataGenerator()->create_course();
// Create the rule we are going to update.
$createrule = new stdClass();
$createrule->courseid = $course->id;
$rule = $monitorgenerator->create_rule($createrule);
// Trigger and capture the event.
$sink = $this->redirectEvents();
$updaterule = new stdClass();
$updaterule->id = $rule->id;
\tool_monitor\rule_manager::update_rule($updaterule);
$events = $sink->get_events();
$this->assertCount(1, $events);
$event = reset($events);
// Confirm that the event contains the expected values.
$this->assertInstanceOf('\tool_monitor\event\rule_updated', $event);
$this->assertEquals(context_course::instance($course->id), $event->get_context());
$this->assertEquals($rule->id, $event->objectid);
$this->assertEventContextNotUsed($event);
// Now let's update a system rule (courseid = 0).
$createrule->courseid = 0;
$rule = $monitorgenerator->create_rule($createrule);
// Trigger and capture the event.
$sink = $this->redirectEvents();
$updaterule = new stdClass();
$updaterule->id = $rule->id;
\tool_monitor\rule_manager::update_rule($updaterule);
$events = $sink->get_events();
$this->assertCount(1, $events);
$event = reset($events);
// Confirm that the event uses the system context.
$this->assertInstanceOf('\tool_monitor\event\rule_updated', $event);
$this->assertEquals(context_system::instance(), $event->get_context());
}
/**
* Test the rule deleted event.
*/
public function test_rule_deleted() {
// Create the items we need.
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
$course = $this->getDataGenerator()->create_course();
// Create the rule we are going to delete.
$createrule = new stdClass();
$createrule->courseid = $course->id;
$rule = $monitorgenerator->create_rule($createrule);
// Trigger and capture the event.
$sink = $this->redirectEvents();
\tool_monitor\rule_manager::delete_rule($rule->id);
$events = $sink->get_events();
$this->assertCount(1, $events);
$event = reset($events);
// Confirm that the event contains the expected values.
$this->assertInstanceOf('\tool_monitor\event\rule_deleted', $event);
$this->assertEquals(context_course::instance($course->id), $event->get_context());
$this->assertEquals($rule->id, $event->objectid);
$this->assertEventContextNotUsed($event);
// Now let's delete a system rule (courseid = 0).
$createrule = new stdClass();
$createrule->courseid = 0;
$rule = $monitorgenerator->create_rule($createrule);
// Trigger and capture the event.
$sink = $this->redirectEvents();
\tool_monitor\rule_manager::delete_rule($rule->id);
$events = $sink->get_events();
$this->assertCount(1, $events);
$event = reset($events);
// Confirm that the event uses the system context.
$this->assertInstanceOf('\tool_monitor\event\rule_deleted', $event);
$this->assertEquals(context_system::instance(), $event->get_context());
}
/**
* Test the subscription created event.
*/
public function test_subscription_created() {
// Create the items we need to test this.
$user = $this->getDataGenerator()->create_user();
$course = $this->getDataGenerator()->create_course();
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
// Create a rule to subscribe to.
$rule = $monitorgenerator->create_rule();
// Trigger and capture the event.
$sink = $this->redirectEvents();
$subscriptionid = \tool_monitor\subscription_manager::create_subscription($rule->id, $course->id, 0, $user->id);
$events = $sink->get_events();
$this->assertCount(1, $events);
$event = reset($events);
// Confirm that the event contains the expected values.
$this->assertInstanceOf('\tool_monitor\event\subscription_created', $event);
$this->assertEquals(context_course::instance($course->id), $event->get_context());
$this->assertEquals($subscriptionid, $event->objectid);
$this->assertEventContextNotUsed($event);
// Create a system subscription - trigger and capture the event.
$sink = $this->redirectEvents();
\tool_monitor\subscription_manager::create_subscription($rule->id, 0, 0, $user->id);
$events = $sink->get_events();
$this->assertCount(1, $events);
$event = reset($events);
// Confirm that the event uses the system context.
$this->assertInstanceOf('\tool_monitor\event\subscription_created', $event);
$this->assertEquals(context_system::instance(), $event->get_context());
}
/**
* Test the subscription deleted event.
*/
public function test_subscription_deleted() {
// Create the items we need to test this.
$user = $this->getDataGenerator()->create_user();
$course = $this->getDataGenerator()->create_course();
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
// Create a rule to subscribe to.
$rule = $monitorgenerator->create_rule();
$sub = new stdClass();
$sub->courseid = $course->id;
$sub->userid = $user->id;
$sub->ruleid = $rule->id;
// Create the subscription we are going to delete.
$subscription = $monitorgenerator->create_subscription($sub);
// Trigger and capture the event.
$sink = $this->redirectEvents();
\tool_monitor\subscription_manager::delete_subscription($subscription->id, false);
$events = $sink->get_events();
$this->assertCount(1, $events);
$event = reset($events);
// Confirm that the event contains the expected values.
$this->assertInstanceOf('\tool_monitor\event\subscription_deleted', $event);
$this->assertEquals(context_course::instance($course->id), $event->get_context());
$this->assertEquals($subscription->id, $event->objectid);
$this->assertEventContextNotUsed($event);
// Now let's delete a system subscription.
$sub = new stdClass();
$sub->courseid = 0;
$sub->userid = $user->id;
$sub->ruleid = $rule->id;
// Create the subscription we are going to delete.
$subscription = $monitorgenerator->create_subscription($sub);
// Trigger and capture the event.
$sink = $this->redirectEvents();
\tool_monitor\subscription_manager::delete_subscription($subscription->id, false);
$events = $sink->get_events();
$this->assertCount(1, $events);
$event = reset($events);
// Confirm that the event uses the system context.
$this->assertInstanceOf('\tool_monitor\event\subscription_deleted', $event);
$this->assertEquals(context_system::instance(), $event->get_context());
// Now, create a bunch of subscriptions for the rule we created.
$subids = array();
$sub->courseid = $course->id;
for ($i = 1; $i <= 10; $i++) {
$sub->userid = $i;
$subscription = $monitorgenerator->create_subscription($sub);
$subids[$subscription->id] = $subscription;
}
// Trigger and capture the events.
$sink = $this->redirectEvents();
\tool_monitor\subscription_manager::remove_all_subscriptions_for_rule($rule->id);
$events = $sink->get_events();
// Check that there were 10 events in total.
$this->assertCount(10, $events);
// Get all the events and ensure they are valid.
foreach ($events as $event) {
$this->assertInstanceOf('\tool_monitor\event\subscription_deleted', $event);
$this->assertEquals(context_course::instance($course->id), $event->get_context());
$this->assertEventContextNotUsed($event);
$this->assertArrayHasKey($event->objectid, $subids);
unset($subids[$event->objectid]);
}
// We should have found all the subscriptions.
$this->assertEmpty($subids);
}
/**
* Test the subscription criteria met event.
*/
public function test_subscription_criteria_met() {
// Create the items we need to test this.
$user = $this->getDataGenerator()->create_user();
$course = $this->getDataGenerator()->create_course();
$book = $this->getDataGenerator()->create_module('book', array('course' => $course->id));
$bookgenerator = $this->getDataGenerator()->get_plugin_generator('mod_book');
$chapter = $bookgenerator->create_chapter(array('bookid' => $book->id));
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
// Create a rule we want to subscribe to.
$rule = new stdClass();
$rule->userid = $user->id;
$rule->courseid = $course->id;
$rule->plugin = 'mod_book';
$rule->eventname = '\mod_book\event\chapter_viewed';
$rule->frequency = 1;
$rule->timewindow = 60;
$rule = $monitorgenerator->create_rule($rule);
// Create the subscription.
$sub = new stdClass();
$sub->courseid = $course->id;
$sub->userid = $user->id;
$sub->ruleid = $rule->id;
$monitorgenerator->create_subscription($sub);
// Now create the \mod_book\event\chapter_viewed event we are listening for.
$context = context_module::instance($book->cmid);
$event = \mod_book\event\chapter_viewed::create_from_chapter($book, $context, $chapter);
// Trigger and capture the event.
$sink = $this->redirectEvents();
\tool_monitor\eventobservers::process_event($event);
$events = $sink->get_events();
$this->assertCount(1, $events);
$event = reset($events);
// Confirm that the event contains the expected values.
$this->assertInstanceOf('\tool_monitor\event\subscription_criteria_met', $event);
$this->assertEquals(context_course::instance($course->id), $event->get_context());
$this->assertEventContextNotUsed($event);
}
}
+200
View File
@@ -0,0 +1,200 @@
<?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/>.
/**
* Event monitor data generator
*
* @package tool_monitor
* @category test
* @copyright 2014 onwards Simey Lameze <simey@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Event monitor data generator class
*
* @since Moodle 2.8
* @package tool_monitor
* @category test
* @copyright 2014 onwards Simey Lameze <simey@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class tool_monitor_generator extends testing_module_generator {
/**
* @var int keep track of how many rules have been created.
*/
protected $rulecount;
/**
* Function to generate rule data.
*
* @param \stdClass|array $record data to insert as rule entry.
*
* @return \tool_monitor\rule An instance of rule class.
*/
public function create_rule($record = null) {
global $USER;
$this->rulecount++;
$i = $this->rulecount;
$now = time();
$record = (object)(array)$record;
if (!isset($record->userid)) {
$record->userid = $USER->id;
}
if (!isset($record->courseid)) {
$record->courseid = 0;
}
if (!isset($record->name)) {
$record->name = 'Test rule ' . $i;
}
if (!isset($record->description)) {
$record->description = 'Rule description ' . $i;
}
if (!isset($record->descriptionformat)) {
$record->descriptionformat = FORMAT_HTML;
}
if (!isset($record->frequency)) {
$record->frequency = 5;
}
if (!isset($record->minutes)) {
$record->minutes = 5;
}
if (!isset($record->template)) {
$record->template = 'Rule message template ' . $i;
}
if (!isset($record->templateformat)) {
$record->templateformat = FORMAT_HTML;
}
if (!isset($record->timewindow)) {
$record->timewindow = $record->minutes * 60;
}
if (!isset($record->timecreated)) {
$record->timecreated = $now;
}
if (!isset($record->timemodified)) {
$record->timemodified = $now;
}
if (!isset($record->plugin)) {
$record->plugin = 'core';
}
if (!isset($record->eventname)) {
$record->eventname = '\core\event\blog_entry_created';
}
unset($record->minutes); // Remove the minutes shortcut to the timewindow.
return \tool_monitor\rule_manager::add_rule($record);
}
/**
* Function to generate subscription data.
*
* @throws coding_exception if $record->ruleid or $record->userid not present.
* @param \stdClass|array $record data to insert as subscription entry.
*
* @return \tool_monitor\subscription An instance of the subscription class.
*/
public function create_subscription($record = null) {
if (!isset($record->timecreated)) {
$record->timecreated = time();
}
if (!isset($record->courseid)) {
$record->courseid = 0;
}
if (!isset($record->ruleid)) {
throw new coding_exception('$record->ruleid must be present in tool_monitor_generator::create_subscription()');
}
if (!isset($record->cmid)) {
$record->cmid = 0;
}
if (!isset($record->userid)) {
throw new coding_exception('$record->userid must be present in tool_monitor_generator::create_subscription()');
}
$sid = \tool_monitor\subscription_manager::create_subscription($record->ruleid, $record->courseid,
$record->cmid, $record->userid);
return \tool_monitor\subscription_manager::get_subscription($sid);
}
/**
* Function to generate event entries.
*
* @param \stdClass|array $record data to insert as event entry.
*
* @return \stdClass $record An object representing the newly created event entry.
*/
public function create_event_entries($record = null) {
global $DB, $CFG;
$record = (object)(array)$record;
$context = \context_system::instance();
if (!isset($record->eventname)) {
$record->eventname = '\core\event\user_loggedin';
}
if (!isset($record->contextid)) {
$record->contextid = $context->id;
}
if (!isset($record->contextlevel)) {
$record->contextlevel = $context->contextlevel;
}
if (!isset($record->contextinstanceid)) {
$record->contextinstanceid = $context->instanceid;
}
if (!isset($record->link)) {
$record->link = $CFG->wwwroot . '/user/profile.php';
}
if (!isset($record->courseid)) {
$record->courseid = 0;
}
if (!isset($record->timecreated)) {
$record->timecreated = time();
}
$record->id = $DB->insert_record('tool_monitor_events', $record, true);
return $record;
}
/**
* Function to generate history data.
*
* @throws coding_exception if $record->sid or $record->userid not present.
* @param \stdClass|array $record data to insert as history entry.
*
* @return \stdClass $record An object representing the newly created history entry.
*/
public function create_history($record = null) {
global $DB;
$record = (object)(array)$record;
if (!isset($record->sid)) {
throw new coding_exception('subscription ID must be present in tool_monitor_generator::create_history() $record');
}
if (!isset($record->userid)) {
throw new coding_exception('user ID must be present in tool_monitor_generator::create_history() $record');
}
if (!isset($record->timesent)) {
$record->timesent = time();
}
$record->id = $DB->insert_record('tool_monitor_history', $record, true);
return $record;
}
}
+141
View File
@@ -0,0 +1,141 @@
<?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/>.
/**
* PHPUnit data generator tests.
*
* @package tool_monitor
* @category test
* @copyright 2014 onwards Simey Lameze <simey@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* PHPUnit data generator test case.
*
* @since Moodle 2.8
* @package tool_monitor
* @category test
* @copyright 2014 onwards Simey Lameze <simey@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
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.
*/
public function test_create_rule() {
$this->setAdminUser();
$this->resetAfterTest(true);
$course = $this->getDataGenerator()->create_course();
$user = $this->getDataGenerator()->create_user();
$rulegenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
$record = new stdClass();
$record->courseid = $course->id;
$record->userid = $user->id;
$rule = $rulegenerator->create_rule($record);
$this->assertInstanceOf('tool_monitor\rule', $rule);
$this->assertEquals($rule->userid, $record->userid);
$this->assertEquals($rule->courseid, $record->courseid);
}
/**
* Test create_subscription data generator.
*/
public function test_create_subscription() {
$this->setAdminUser();
$this->resetAfterTest(true);
$user = $this->getDataGenerator()->create_user();
$course = $this->getDataGenerator()->create_course();
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
$rule = $monitorgenerator->create_rule();
$record = new stdClass();
$record->courseid = $course->id;
$record->userid = $user->id;
$record->ruleid = $rule->id;
$subscription = $monitorgenerator->create_subscription($record);
$this->assertEquals($record->courseid, $subscription->courseid);
$this->assertEquals($record->ruleid, $subscription->ruleid);
$this->assertEquals($record->userid, $subscription->userid);
$this->assertEquals(0, $subscription->cmid);
// Make sure rule id is always required.
$this->setExpectedException('coding_exception');
unset($record->ruleid);
$monitorgenerator->create_subscription($record);
}
/**
* Test create_event data generator.
*/
public function test_create_event_entries() {
$this->setAdminUser();
$this->resetAfterTest(true);
$context = \context_system::instance();
// Default data generator values.
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
// First create and assertdata using default values.
$eventdata = $monitorgenerator->create_event_entries();
$this->assertEquals('\core\event\user_loggedin', $eventdata->eventname);
$this->assertEquals($context->id, $eventdata->contextid);
$this->assertEquals($context->contextlevel, $eventdata->contextlevel);
}
/**
* Test create_history data generator.
*/
public function test_create_history() {
$this->setAdminUser();
$this->resetAfterTest(true);
$user = $this->getDataGenerator()->create_user();
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
$rule = $monitorgenerator->create_rule();
$record = new \stdClass();
$record->userid = $user->id;
$record->ruleid = $rule->id;
$sid = $monitorgenerator->create_subscription($record)->id;
$record->sid = $sid;
$historydata = $monitorgenerator->create_history($record);
$this->assertEquals($record->userid, $historydata->userid);
$this->assertEquals($record->sid, $historydata->sid);
// Test using default values.
$record->userid = 1;
$record->sid = 1;
$historydata = $monitorgenerator->create_history($record);
$this->assertEquals(1, $historydata->userid);
$this->assertEquals(1, $historydata->sid);
}
}
@@ -0,0 +1,195 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Unit tests for rule manager api.
*
* @package tool_monitor
* @category test
* @copyright 2014 onwards Simey Lameze <simey@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
global $CFG;
/**
* Tests for rule manager.
*
* Class tool_monitor_rule_manager_testcase
*/
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.
*/
public function test_add_rule() {
$this->setAdminUser();
$this->resetAfterTest(true);
$user = $this->getDataGenerator()->create_user();
$course = $this->getDataGenerator()->create_course();
$now = time();
$rule = new stdClass();
$rule->userid = $user->id;
$rule->courseid = $course->id;
$rule->name = 'test rule 1';
$rule->plugin = 'core';
$rule->eventname = '\core\event\course_updated';
$rule->description = 'test description 1';
$rule->descriptionformat = FORMAT_HTML;
$rule->frequency = 15;
$rule->template = 'test template message';
$rule->templateformat = FORMAT_HTML;
$rule->timewindow = 300;
$rule->timecreated = $now;
$rule->timemodified = $now;
$ruledata = \tool_monitor\rule_manager::add_rule($rule);
foreach ($rule as $prop => $value) {
$this->assertEquals($ruledata->$prop, $value);
}
}
/**
* Test get_rule method.
*/
public function test_get_rule() {
$this->setAdminUser();
$this->resetAfterTest(true);
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
$rule = $monitorgenerator->create_rule();
$rules1 = \tool_monitor\rule_manager::get_rule($rule->id);
$this->assertInstanceOf('tool_monitor\rule', $rules1);
$this->assertEquals($rules1, $rule);
}
/**
* Test update_rule method.
*/
public function test_update_rule() {
$this->setAdminUser();
$this->resetAfterTest(true);
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
$rule = $monitorgenerator->create_rule();
$ruledata = new stdClass;
$ruledata->id = $rule->id;
$ruledata->frequency = 25;
\tool_monitor\rule_manager::update_rule($ruledata);
$this->assertEquals(25, $ruledata->frequency);
}
/**
* Test get_rules_by_courseid method.
*/
public function test_get_rules_by_courseid() {
$this->setAdminUser();
$this->resetAfterTest(true);
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
$course1 = $this->getDataGenerator()->create_course();
$course2 = $this->getDataGenerator()->create_course();
$record = new stdClass();
$record->courseid = $course1->id;
$record2 = new stdClass();
$record2->courseid = $course2->id;
$ruleids = array();
for ($i = 0; $i < 10; $i++) {
$rule = $monitorgenerator->create_rule($record);
$ruleids[] = $rule->id;
$rule = $monitorgenerator->create_rule(); // Create some site level rules.
$ruleids[] = $rule->id;
$rule = $monitorgenerator->create_rule($record2); // Create rules in a different course.
}
$ruledata = \tool_monitor\rule_manager::get_rules_by_courseid($course1->id);
$this->assertEmpty(array_merge(array_diff(array_keys($ruledata), $ruleids), array_diff($ruleids, array_keys($ruledata))));
$this->assertCount(20, $ruledata);
}
/**
* Test get_rules_by_plugin method.
*/
public function test_get_rules_by_plugin() {
$this->setAdminUser();
$this->resetAfterTest(true);
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
$record = new stdClass();
$record->plugin = 'core';
$record2 = new stdClass();
$record2->plugin = 'mod_assign';
$ruleids = array();
for ($i = 0; $i < 10; $i++) {
$rule = $monitorgenerator->create_rule($record);
$ruleids[] = $rule->id;
$rule = $monitorgenerator->create_rule($record2); // Create rules in a different plugin.
}
$ruledata = \tool_monitor\rule_manager::get_rules_by_plugin('core');
$this->assertEmpty(array_merge(array_diff(array_keys($ruledata), $ruleids), array_diff($ruleids, array_keys($ruledata))));
$this->assertCount(10, $ruledata);
}
/**
* Test get_rules_by_event method.
*/
public function test_get_rules_by_event() {
$this->setAdminUser();
$this->resetAfterTest(true);
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
$rule = $monitorgenerator->create_rule();
$record = new stdClass();
$record->eventname = '\core\event\calendar_event_created';
$record2 = new stdClass();
$record2->eventname = '\core\event\calendar_event_updated';
$ruleids = array();
for ($i = 0; $i < 10; $i++) {
$rule = $monitorgenerator->create_rule($record);
$ruleids[] = $rule->id;
$rule = $monitorgenerator->create_rule($record2); // Create rules in a different plugin.
}
$ruledata = \tool_monitor\rule_manager::get_rules_by_event('\core\event\calendar_event_created');
$this->assertEmpty(array_diff(array_keys($ruledata), $ruleids));
$this->assertCount(10, $ruledata);
}
}
@@ -0,0 +1,78 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Unit tests for subscription manager api.
*
* @package tool_monitor
* @category test
* @copyright 2014 onwards Simey Lameze <simey@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
global $CFG;
/**
* Tests for subscription manager.
*
* Class tool_monitor_subscription_manager_testcase.
*/
class tool_monitor_subscription_manager_testcase extends advanced_testcase {
/**
* Test count_rule_subscriptions method.
*/
public function test_count_rule_subscriptions() {
$this->setAdminUser();
$this->resetAfterTest(true);
// Create users.
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
// Create few rules.
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
$rule1 = $monitorgenerator->create_rule();
$rule2 = $monitorgenerator->create_rule();
$subs = \tool_monitor\subscription_manager::count_rule_subscriptions($rule1->id);
// No subscriptions at this point.
$this->assertEquals(0, $subs);
// Subscribe user 1 to rule 1.
$record = new stdClass;
$record->ruleid = $rule1->id;
$record->userid = $user1->id;
$monitorgenerator->create_subscription($record);
// Subscribe user 2 to rule 1.
$record->userid = $user2->id;
$monitorgenerator->create_subscription($record);
// Subscribe user 2 to rule 2.
$record->ruleid = $rule2->id;
$monitorgenerator->create_subscription($record);
// Should have 2 subscriptions for rule 1 and 1 subscription for rule 2
$subs1 = \tool_monitor\subscription_manager::count_rule_subscriptions($rule1->id);
$subs2 = \tool_monitor\subscription_manager::count_rule_subscriptions($rule2->id);
$this->assertEquals(2, $subs1);
$this->assertEquals(1, $subs2);
}
}
@@ -0,0 +1,245 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Unit tests for the tool_monitor clean events task.
*
* @package tool_monitor
* @category test
* @copyright 2014 Mark Nelson <markn@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
global $CFG;
/**
* Class used to test the tool_monitor clean events task.
*/
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);
}
/**
* Tests the cleaning up of events.
*/
public function test_clean_events() {
global $DB;
// Create the necessary items for testing.
$user = $this->getDataGenerator()->create_user();
$course = $this->getDataGenerator()->create_course();
$bookgenerator = $this->getDataGenerator()->get_plugin_generator('mod_book');
$book = $this->getDataGenerator()->create_module('book', array('course' => $course->id));
$bookcontext = context_module::instance($book->cmid);
$bookchapter = $bookgenerator->create_chapter(array('bookid' => $book->id));
$course2 = $this->getDataGenerator()->create_course();
$book2 = $this->getDataGenerator()->create_module('book', array('course' => $course2->id));
$book2context = context_module::instance($book2->cmid);
$book2chapter = $bookgenerator->create_chapter(array('bookid' => $book2->id));
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
// Let's set some data for the rules we need before we can generate them.
$rule = new stdClass();
$rule->userid = $user->id;
$rule->courseid = $course->id;
$rule->plugin = 'mod_book';
$rule->eventname = '\mod_book\event\course_module_viewed';
$rule->timewindow = 500;
// Let's add a few rules we want to monitor.
$rule1 = $monitorgenerator->create_rule($rule);
$rule->eventname = '\mod_book\event\course_module_instance_list_viewed';
$rule2 = $monitorgenerator->create_rule($rule);
// Add the same rules for the same course, but this time with a lower timewindow (used to test that we do not
// remove an event for a course if there is still a rule where the maximum timewindow has not been reached).
$rule->eventname = '\mod_book\event\course_module_viewed';
$rule->timewindow = 200;
$rule3 = $monitorgenerator->create_rule($rule);
$rule->eventname = '\mod_book\event\course_module_instance_list_viewed';
$rule4 = $monitorgenerator->create_rule($rule);
// Add another rule in a different course.
$rule->courseid = $course2->id;
$rule->eventname = '\mod_book\event\chapter_viewed';
$rule->timewindow = 200;
$rule5 = $monitorgenerator->create_rule($rule);
// Add a site wide rule.
$rule->courseid = 0;
$rule->eventname = '\mod_book\event\chapter_viewed';
$rule->timewindow = 500;
$rule6 = $monitorgenerator->create_rule($rule);
// Let's subscribe to these rules.
$sub = new stdClass;
$sub->courseid = $course->id;
$sub->ruleid = $rule1->id;
$sub->userid = $user->id;
$monitorgenerator->create_subscription($sub);
$sub->ruleid = $rule2->id;
$monitorgenerator->create_subscription($sub);
$sub->ruleid = $rule3->id;
$monitorgenerator->create_subscription($sub);
$sub->ruleid = $rule4->id;
$monitorgenerator->create_subscription($sub);
$sub->ruleid = $rule5->id;
$sub->courseid = $course2->id;
$monitorgenerator->create_subscription($sub);
$sub->ruleid = $rule6->id;
$sub->courseid = 0;
$monitorgenerator->create_subscription($sub);
// Now let's populate the tool_monitor table with the events associated with those rules.
\mod_book\event\course_module_viewed::create_from_book($book, $bookcontext)->trigger();
\mod_book\event\course_module_instance_list_viewed::create_from_course($course)->trigger();
\mod_book\event\chapter_viewed::create_from_chapter($book, $bookcontext, $bookchapter)->trigger();
// Let's trigger the viewed events again, but in another course. The rules created for these events are
// associated with another course, so these events should get deleted when we trigger the cleanup task.
\mod_book\event\course_module_viewed::create_from_book($book2, $book2context)->trigger();
\mod_book\event\course_module_instance_list_viewed::create_from_course($course2)->trigger();
// Trigger a chapter_viewed event in this course - this should not get deleted as the rule is site wide.
\mod_book\event\chapter_viewed::create_from_chapter($book2, $book2context, $book2chapter)->trigger();
// Trigger a bunch of other events.
$eventparams = array(
'context' => context_course::instance($course->id)
);
for ($i = 0; $i < 5; $i++) {
\mod_quiz\event\course_module_instance_list_viewed::create($eventparams)->trigger();
\mod_scorm\event\course_module_instance_list_viewed::create($eventparams)->trigger();
}
// We do not store events that have no subscriptions - so there will be only 4 events.
$this->assertEquals(4, $DB->count_records('tool_monitor_events'));
// Run the task and check that all the quiz, scorm and rule events are removed as well as the course_module_*
// viewed events in the second course.
$task = new \tool_monitor\task\clean_events();
$task->execute();
$events = $DB->get_records('tool_monitor_events', array(), 'id');
$this->assertEquals(4, count($events));
$event1 = array_shift($events);
$event2 = array_shift($events);
$event3 = array_shift($events);
$event4 = array_shift($events);
$this->assertEquals('\mod_book\event\course_module_viewed', $event1->eventname);
$this->assertEquals($course->id, $event1->courseid);
$this->assertEquals('\mod_book\event\course_module_instance_list_viewed', $event2->eventname);
$this->assertEquals($course->id, $event2->courseid);
$this->assertEquals('\mod_book\event\chapter_viewed', $event3->eventname);
$this->assertEquals($course->id, $event3->courseid);
$this->assertEquals('\mod_book\event\chapter_viewed', $event4->eventname);
$this->assertEquals($course2->id, $event4->courseid);
// Update the timewindow for two of the rules.
$updaterule = new stdClass();
$updaterule->id = $rule1->id;
$updaterule->timewindow = 0;
\tool_monitor\rule_manager::update_rule($updaterule);
$updaterule->id = $rule2->id;
\tool_monitor\rule_manager::update_rule($updaterule);
// Run the task and check that the events remain as we still have not reached the maximum timewindow.
$task = new \tool_monitor\task\clean_events();
$task->execute();
$this->assertEquals(4, $DB->count_records('tool_monitor_events'));
// Now, remove the rules associated with course_module_* events so they get deleted.
\tool_monitor\rule_manager::delete_rule($rule1->id);
\tool_monitor\rule_manager::delete_rule($rule2->id);
\tool_monitor\rule_manager::delete_rule($rule3->id);
\tool_monitor\rule_manager::delete_rule($rule4->id);
// Run the task and check all the course_module_* events are gone.
$task = new \tool_monitor\task\clean_events();
$task->execute();
// We now should only have the chapter_viewed events.
$events = $DB->get_records('tool_monitor_events', array(), 'id');
$this->assertEquals(2, count($events));
$event1 = array_shift($events);
$event2 = array_shift($events);
$this->assertEquals('\mod_book\event\chapter_viewed', $event1->eventname);
$this->assertEquals($course->id, $event1->courseid);
$this->assertEquals('\mod_book\event\chapter_viewed', $event2->eventname);
$this->assertEquals($course2->id, $event2->courseid);
// Set the timewindow of the rule for the event chapter_viewed in the second course to 0.
$updaterule->id = $rule5->id;
\tool_monitor\rule_manager::update_rule($updaterule);
// Run the task.
$task = new \tool_monitor\task\clean_events();
$task->execute();
// Check that nothing was deleted as we still have a site wide rule for the chapter_viewed event.
$this->assertEquals(2, $DB->count_records('tool_monitor_events'));
// Set the timewindow back to 500.
$updaterule->id = $rule5->id;
$updaterule->timewindow = 500;
\tool_monitor\rule_manager::update_rule($updaterule);
// Set the site rule timewindow to 0.
$updaterule->id = $rule6->id;
$updaterule->timewindow = 0;
\tool_monitor\rule_manager::update_rule($updaterule);
// Run the task.
$task = new \tool_monitor\task\clean_events();
$task->execute();
// We now should only have one chapter_viewed event for the second course.
$events = $DB->get_records('tool_monitor_events');
$this->assertEquals(1, count($events));
$event1 = array_shift($events);
$this->assertEquals('\mod_book\event\chapter_viewed', $event1->eventname);
$this->assertEquals($course2->id, $event1->courseid);
// Remove the site rule.
\tool_monitor\rule_manager::delete_rule($rule6->id);
// Remove the last remaining rule.
\tool_monitor\rule_manager::delete_rule($rule5->id);
// Run the task.
$task = new \tool_monitor\task\clean_events();
$task->execute();
// There should be no events left.
$this->assertEquals(0, $DB->count_records('tool_monitor_events'));
}
}
+31
View File
@@ -0,0 +1,31 @@
<?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/>.
/**
* Version info
*
* This file contains version information about 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;
$plugin->version = 2014111001; // 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).
@@ -0,0 +1,125 @@
YUI.add('moodle-tool_monitor-dropdown', function (Y, NAME) {
/**
* A module to manage dropdowns on the rule add/edit form.
*
* @module moodle-tool_monitor-dropdown
*/
/**
* A module to manage dependent selects on the edit page.
*
* @since Moodle 2.8
* @class moodle-tool_monitor.dropdown
* @extends Base
* @constructor
*/
function DropDown() {
DropDown.superclass.constructor.apply(this, arguments);
}
var SELECTORS = {
PLUGIN: '#id_plugin',
EVENTNAME: '#id_eventname',
OPTION: 'option',
CHOOSE: 'option[value=""]'
};
Y.extend(DropDown, Y.Base, {
/**
* Reference to the plugin node.
*
* @property plugin
* @type Object
* @default null
* @protected
*/
plugin: null,
/**
* Reference to the plugin node.
*
* @property eventname
* @type Object
* @default null
* @protected
*/
eventname: null,
/**
* Initializer.
* Basic setup and delegations.
*
* @method initializer
*/
initializer: function() {
this.plugin = Y.one(SELECTORS.PLUGIN);
this.eventname = Y.one(SELECTORS.EVENTNAME);
var selection = this.eventname.get('value'); // Get selected event name.
this.updateEventsList();
this.updateSelection(selection);
this.plugin.on('change', this.updateEventsList, this);
},
/**
* Method to update the events list drop down when plugin list drop down is changed.
*
* @method updateEventsList
*/
updateEventsList: function() {
var node, options, choosenode;
var plugin = this.plugin.get('value'); // Get component name.
var namespace = '\\' + plugin + '\\';
this.eventname.all(SELECTORS.OPTION).remove(true); // Delete all nodes.
options = this.get('eventlist');
// Mark the default choose node as visible and selected.
choosenode = Y.Node.create('<option value="">' + options[''] + '</option>');
choosenode.set('selected', 'selected');
this.eventname.appendChild(choosenode);
Y.Object.each(options, function(value, key) {
// Make sure we highlight only nodes with correct namespace.
if (key.substring(0, namespace.length) === namespace) {
node = Y.Node.create('<option value="' + key + '">' + value + '</option>');
this.eventname.appendChild(node);
}
}, this);
},
/**
* Method to update the selected node from the options list.
*
* @method updateSelection
* @param {string} selection The options node value that should be selected.
*/
updateSelection: function(selection) {
this.eventname.get('options').each(function(opt) {
if (opt.get('value') === selection) {
opt.set('selected', 'selected');
}
}, this);
}
}, {
NAME: 'dropDown',
ATTRS: {
/**
* A list of events with components.
*
* @attribute eventlist
* @default null
* @type Object
*/
eventlist: null
}
});
Y.namespace('M.tool_monitor.DropDown').init = function(config) {
return new DropDown(config);
};
}, '@VERSION@', {"requires": ["base", "event", "node"]});
@@ -0,0 +1 @@
YUI.add("moodle-tool_monitor-dropdown",function(e,t){function n(){n.superclass.constructor.apply(this,arguments)}var r={PLUGIN:"#id_plugin",EVENTNAME:"#id_eventname",OPTION:"option",CHOOSE:'option[value=""]'};e.extend(n,e.Base,{plugin:null,eventname:null,initializer:function(){this.plugin=e.one(r.PLUGIN),this.eventname=e.one(r.EVENTNAME);var t=this.eventname.get("value");this.updateEventsList(),this.updateSelection(t),this.plugin.on("change",this.updateEventsList,this)},updateEventsList:function(){var t,n,i,s=this.plugin.get("value"),o="\\"+s+"\\";this.eventname.all(r.OPTION).remove(!0),n=this.get("eventlist"),i=e.Node.create('<option value="">'+n[""]+"</option>"),i.set("selected","selected"),this.eventname.appendChild(i),e.Object.each(n,function(n,r){r.substring(0,o.length)===o&&(t=e.Node.create('<option value="'+r+'">'+n+"</option>"),this.eventname.appendChild(t))},this)},updateSelection:function(e){this.eventname.get("options").each(function(t){t.get("value")===e&&t.set("selected","selected")},this)}},{NAME:"dropDown",ATTRS:{eventlist:null}}),e.namespace("M.tool_monitor.DropDown").init=function(e){return new n(e)}},"@VERSION@",{requires:["base","event","node"]});
@@ -0,0 +1,125 @@
YUI.add('moodle-tool_monitor-dropdown', function (Y, NAME) {
/**
* A module to manage dropdowns on the rule add/edit form.
*
* @module moodle-tool_monitor-dropdown
*/
/**
* A module to manage dependent selects on the edit page.
*
* @since Moodle 2.8
* @class moodle-tool_monitor.dropdown
* @extends Base
* @constructor
*/
function DropDown() {
DropDown.superclass.constructor.apply(this, arguments);
}
var SELECTORS = {
PLUGIN: '#id_plugin',
EVENTNAME: '#id_eventname',
OPTION: 'option',
CHOOSE: 'option[value=""]'
};
Y.extend(DropDown, Y.Base, {
/**
* Reference to the plugin node.
*
* @property plugin
* @type Object
* @default null
* @protected
*/
plugin: null,
/**
* Reference to the plugin node.
*
* @property eventname
* @type Object
* @default null
* @protected
*/
eventname: null,
/**
* Initializer.
* Basic setup and delegations.
*
* @method initializer
*/
initializer: function() {
this.plugin = Y.one(SELECTORS.PLUGIN);
this.eventname = Y.one(SELECTORS.EVENTNAME);
var selection = this.eventname.get('value'); // Get selected event name.
this.updateEventsList();
this.updateSelection(selection);
this.plugin.on('change', this.updateEventsList, this);
},
/**
* Method to update the events list drop down when plugin list drop down is changed.
*
* @method updateEventsList
*/
updateEventsList: function() {
var node, options, choosenode;
var plugin = this.plugin.get('value'); // Get component name.
var namespace = '\\' + plugin + '\\';
this.eventname.all(SELECTORS.OPTION).remove(true); // Delete all nodes.
options = this.get('eventlist');
// Mark the default choose node as visible and selected.
choosenode = Y.Node.create('<option value="">' + options[''] + '</option>');
choosenode.set('selected', 'selected');
this.eventname.appendChild(choosenode);
Y.Object.each(options, function(value, key) {
// Make sure we highlight only nodes with correct namespace.
if (key.substring(0, namespace.length) === namespace) {
node = Y.Node.create('<option value="' + key + '">' + value + '</option>');
this.eventname.appendChild(node);
}
}, this);
},
/**
* Method to update the selected node from the options list.
*
* @method updateSelection
* @param {string} selection The options node value that should be selected.
*/
updateSelection: function(selection) {
this.eventname.get('options').each(function(opt) {
if (opt.get('value') === selection) {
opt.set('selected', 'selected');
}
}, this);
}
}, {
NAME: 'dropDown',
ATTRS: {
/**
* A list of events with components.
*
* @attribute eventlist
* @default null
* @type Object
*/
eventlist: null
}
});
Y.namespace('M.tool_monitor.DropDown').init = function(config) {
return new DropDown(config);
};
}, '@VERSION@', {"requires": ["base", "event", "node"]});
@@ -0,0 +1,10 @@
{
"name": "moodle-tool_monitor-dropdown",
"builds": {
"moodle-tool_monitor-dropdown": {
"jsfiles": [
"dropdown.js"
]
}
}
}
+120
View File
@@ -0,0 +1,120 @@
/**
* A module to manage dropdowns on the rule add/edit form.
*
* @module moodle-tool_monitor-dropdown
*/
/**
* A module to manage dependent selects on the edit page.
*
* @since Moodle 2.8
* @class moodle-tool_monitor.dropdown
* @extends Base
* @constructor
*/
function DropDown() {
DropDown.superclass.constructor.apply(this, arguments);
}
var SELECTORS = {
PLUGIN: '#id_plugin',
EVENTNAME: '#id_eventname',
OPTION: 'option',
CHOOSE: 'option[value=""]'
};
Y.extend(DropDown, Y.Base, {
/**
* Reference to the plugin node.
*
* @property plugin
* @type Object
* @default null
* @protected
*/
plugin: null,
/**
* Reference to the plugin node.
*
* @property eventname
* @type Object
* @default null
* @protected
*/
eventname: null,
/**
* Initializer.
* Basic setup and delegations.
*
* @method initializer
*/
initializer: function() {
this.plugin = Y.one(SELECTORS.PLUGIN);
this.eventname = Y.one(SELECTORS.EVENTNAME);
var selection = this.eventname.get('value'); // Get selected event name.
this.updateEventsList();
this.updateSelection(selection);
this.plugin.on('change', this.updateEventsList, this);
},
/**
* Method to update the events list drop down when plugin list drop down is changed.
*
* @method updateEventsList
*/
updateEventsList: function() {
var node, options, choosenode;
var plugin = this.plugin.get('value'); // Get component name.
var namespace = '\\' + plugin + '\\';
this.eventname.all(SELECTORS.OPTION).remove(true); // Delete all nodes.
options = this.get('eventlist');
// Mark the default choose node as visible and selected.
choosenode = Y.Node.create('<option value="">' + options[''] + '</option>');
choosenode.set('selected', 'selected');
this.eventname.appendChild(choosenode);
Y.Object.each(options, function(value, key) {
// Make sure we highlight only nodes with correct namespace.
if (key.substring(0, namespace.length) === namespace) {
node = Y.Node.create('<option value="' + key + '">' + value + '</option>');
this.eventname.appendChild(node);
}
}, this);
},
/**
* Method to update the selected node from the options list.
*
* @method updateSelection
* @param {string} selection The options node value that should be selected.
*/
updateSelection: function(selection) {
this.eventname.get('options').each(function(opt) {
if (opt.get('value') === selection) {
opt.set('selected', 'selected');
}
}, this);
}
}, {
NAME: 'dropDown',
ATTRS: {
/**
* A list of events with components.
*
* @attribute eventlist
* @default null
* @type Object
*/
eventlist: null
}
});
Y.namespace('M.tool_monitor.DropDown').init = function(config) {
return new DropDown(config);
};
@@ -0,0 +1,9 @@
{
"moodle-tool_monitor-dropdown": {
"requires": [
"base",
"event",
"node"
]
}
}
+2 -2
View 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)
+2 -2
View 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)
+2 -2
View 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)
+1 -1
View File
@@ -26,7 +26,7 @@
$string['cannotfit'] = 'The replacement is longer than original and shortening is not allow, cannot continue.';
$string['disclaimer'] = 'I understand the risks of this operation';
$string['doit'] = 'Yes, do it!';
$string['excludedtables'] = 'Several tables are not updated as part of the text replacement. This include configuration, log, events, and session tables.';
$string['excludedtables'] = 'Several tables are not updated as part of the text replacement. These include configuration, log, events, and session tables.';
$string['pageheader'] = 'Search and replace text throughout the whole database';
$string['notifyfinished'] = '...finished';
$string['notifyrebuilding'] = 'Rebuilding course cache...';
+2 -2
View 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
+2 -2
View 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)
@@ -38,10 +38,15 @@ class tool_task_edit_scheduled_task_form extends moodleform {
/** @var \core\task\scheduled_task $task */
$task = $this->_customdata;
$plugininfo = core_plugin_manager::instance()->get_plugin_info($task->get_component());
$plugindisabled = $plugininfo && $plugininfo->is_enabled() === false && !$task->get_run_if_component_disabled();
$lastrun = $task->get_last_run_time() ? userdate($task->get_last_run_time()) : get_string('never');
$nextrun = $task->get_next_run_time();
if ($task->get_disabled()) {
$nextrun = get_string('disabled', 'tool_task');
if ($plugindisabled) {
$nextrun = get_string('plugindisabled', 'tool_task');
} else if ($task->get_disabled()) {
$nextrun = get_string('taskdisabled', 'tool_task');
} else if ($nextrun > time()) {
$nextrun = userdate($nextrun);
} else {
@@ -53,22 +58,27 @@ class tool_task_edit_scheduled_task_form extends moodleform {
$mform->addElement('text', 'minute', get_string('taskscheduleminute', 'tool_task'));
$mform->setType('minute', PARAM_RAW);
$mform->addHelpButton('minute', 'taskscheduleminute', 'tool_task');
$mform->addRule('minute', get_string('required'), 'required');
$mform->addElement('text', 'hour', get_string('taskschedulehour', 'tool_task'));
$mform->setType('hour', PARAM_RAW);
$mform->addHelpButton('hour', 'taskschedulehour', 'tool_task');
$mform->addRule('hour', get_string('required'), 'required');
$mform->addElement('text', 'day', get_string('taskscheduleday', 'tool_task'));
$mform->setType('day', PARAM_RAW);
$mform->addHelpButton('day', 'taskscheduleday', 'tool_task');
$mform->addRule('day', get_string('required'), 'required');
$mform->addElement('text', 'month', get_string('taskschedulemonth', 'tool_task'));
$mform->setType('month', PARAM_RAW);
$mform->addHelpButton('month', 'taskschedulemonth', 'tool_task');
$mform->addRule('month', get_string('required'), 'required');
$mform->addElement('text', 'dayofweek', get_string('taskscheduledayofweek', 'tool_task'));
$mform->setType('dayofweek', PARAM_RAW);
$mform->addHelpButton('dayofweek', 'taskscheduledayofweek', 'tool_task');
$mform->addRule('dayofweek', get_string('required'), 'required');
$mform->addElement('advcheckbox', 'disabled', get_string('disabled', 'tool_task'));
$mform->addHelpButton('disabled', 'disabled', 'tool_task');
@@ -92,5 +102,63 @@ class tool_task_edit_scheduled_task_form extends moodleform {
// Do not use defaults for existing values, the set_data() is the correct way.
$this->set_data(\core\task\manager::record_from_scheduled_task($task));
}
/**
* Custom validations.
*
* @param array $data
* @param array $files
*
* @return array
*/
public function validation($data, $files) {
$error = parent::validation($data, $files);
$fields = array('minute', 'hour', 'day', 'month', 'dayofweek');
foreach ($fields as $field) {
if (!self::validate_fields($field, $data[$field])) {
$error[$field] = get_string('invaliddata', 'core_error');
}
}
return $error;
}
/**
* Helper function that validates the submitted data.
*
* Explanation of the regex:-
*
* \A\*\z - matches *
* \A[0-5]?[0-9]\z - matches entries like 23
* \A\*\/[0-5]?[0-9]\z - matches entries like * / 5
* \A[0-5]?[0-9](,[0-5]?[0-9])*\z - matches entries like 1,2,3
* \A[0-5]?[0-9]-[0-5]?[0-9]\z - matches entries like 2-10
*
* @param string $field field to validate
* @param string $value value
*
* @return bool true if validation passes, false other wise.
*/
public static function validate_fields($field, $value) {
switch ($field) {
case 'minute' :
case 'hour' :
$regex = "/\A\*\z|\A[0-5]?[0-9]\z|\A\*\/[0-5]?[0-9]\z|\A[0-5]?[0-9](,[0-5]?[0-9])*\z|\A[0-5]?[0-9]-[0-5]?[0-9]\z/";
break;
case 'day':
$regex = "/\A\*\z|\A([1-2]?[0-9]|3[0-1])\z|\A\*\/([1-2]?[0-9]|3[0-1])\z|";
$regex .= "\A([1-2]?[0-9]|3[0-1])(,([1-2]?[0-9]|3[0-1]))*\z|\A([1-2]?[0-9]|3[0-1])-([1-2]?[0-9]|3[0-1])\z/";
break;
case 'month':
$regex = "/\A\*\z|\A([0-9]|1[0-2])\z|\A\*\/([0-9]|1[0-2])\z|\A([0-9]|1[0-2])(,([0-9]|1[0-2]))*\z|";
$regex .= "\A([0-9]|1[0-2])-([0-9]|1[0-2])\z/";
break;
case 'dayofweek':
$regex = "/\A\*\z|\A[0-6]\z|\A\*\/[0-6]\z|\A[0-6](,[0-6])*\z|\A[0-6]-[0-6]\z/";
break;
default:
return false;
}
return (bool)preg_match($regex, $value);
}
}
+10 -2
View File
@@ -72,8 +72,13 @@ if ($options['list']) {
. $task->get_day_of_week();
$nextrun = $task->get_next_run_time();
if ($task->get_disabled()) {
$nextrun = get_string('disabled', 'tool_task');
$plugininfo = core_plugin_manager::instance()->get_plugin_info($task->get_component());
$plugindisabled = $plugininfo && $plugininfo->is_enabled() === false && !$task->get_run_if_component_disabled();
if ($plugindisabled) {
$nextrun = get_string('plugindisabled', 'tool_task');
} else if ($task->get_disabled()) {
$nextrun = get_string('taskdisabled', 'tool_task');
} else if ($nextrun > time()) {
$nextrun = userdate($nextrun);
} else {
@@ -123,6 +128,7 @@ if ($execute = $options['execute']) {
} else {
$task->set_cron_lock($cronlock);
}
get_mailer('buffer');
$task->execute();
if (isset($predbqueries)) {
mtrace("... used " . ($DB->perf_get_queries() - $predbqueries) . " dbqueries");
@@ -130,6 +136,7 @@ if ($execute = $options['execute']) {
}
mtrace("Task completed.");
\core\task\manager::scheduled_task_complete($task);
get_mailer('close');
exit(0);
} catch (Exception $e) {
if ($DB->is_transaction_started()) {
@@ -139,6 +146,7 @@ if ($execute = $options['execute']) {
mtrace("... used " . (microtime(true) - $pretime) . " seconds");
mtrace("Task failed: " . $e->getMessage());
\core\task\manager::scheduled_task_failed($task);
get_mailer('close');
exit(1);
}
}

Some files were not shown because too many files have changed in this diff Show More