Compare commits

..

834 Commits

Author SHA1 Message Date
Jun Pataleta f6e37fe195 Moodle release 3.7.8 2020-09-11 10:41:50 +08:00
Sara Arjona b7a2955827 weekly release 3.7.7+ 2020-09-10 08:52:16 +02:00
Michael Hawkins 18e85de97f MDL-69340 tag: Correct the filter input HTML in the tag manager 2020-09-03 17:17:41 +02:00
Mihail Geshoski afe7dff644 MDL-69048 book: Sanitize previous chapter value in add new chapter page 2020-09-03 17:17:41 +02:00
Andrew Nicols 7b3fdc47b2 MDL-68974 calendar: Use page context for block check 2020-09-03 17:17:41 +02:00
Andrew Nicols e0b4a480d1 MDL-68974 blocks: Check permission before generating content 2020-09-03 17:17:41 +02:00
Mihail Geshoski b1157ac005 MDL-65115 repository: Prevent unzipping if it will exceed allowed quota 2020-09-03 17:17:41 +02:00
Mihail Geshoski 7e2020be12 MDL-65115 core_files: Add get_total_content_size() in stored_file class
New function get_total_content_size() is introduced in the stored_file
class. The puprose of this function is to calculate and return the
total size (in bytes) of the content of an archive file.
2020-09-03 17:17:41 +02:00
Andrew Nicols 4b20cc2226 MDL-68974 admin: Unit tests for context parent/child test 2020-09-03 17:17:41 +02:00
Andrew Nicols 8f6eaceba6 MDL-68974 admin: Unit tests for loginas 2020-09-03 17:17:41 +02:00
Andrew Nicols 18f46fb5bd MDL-68974 admin: Prevent login as outside of the desired context 2020-09-03 17:17:41 +02:00
Sara Arjona 2704b00da2 weekly release 3.7.7+ 2020-09-03 17:09:35 +02:00
Andrew Nicols 8f3bc4ffed Merge branch 'MDL-69360-37' of git://github.com/NoelDeMartin/moodle into MOODLE_37_STABLE 2020-09-03 10:52:40 +08:00
Noel De Martin ad8c864c47 MDL-69360 behat: Fix js ready checks for non-moodle sites 2020-09-02 10:21:27 +02:00
Sara Arjona 539edb15d3 weekly release 3.7.7+ 2020-08-27 17:36:42 +02:00
Sara Arjona 6eb8296209 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-08-27 17:36:40 +02:00
AMOS bot a494390972 Automatically generated installer lang files 2020-08-27 00:07:19 +00:00
Adrian Greeve 2ad9e68222 Merge branch 'MDL-69419-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-08-27 08:05:38 +08:00
Andrew Nicols 32a4a98b71 MDL-69419 core: Task reset tests cannot use random test times
If a scheduled task which uses a 'R' field is picked, then the reset of
updated task times will not necessarily be correctly determined as the
randomisation is picked during reset.

This can lead to some random test failures.

Actively specifying a test which does not make use of the 'R' random
field time addresses this issue.
2020-08-26 09:59:01 +08:00
AMOS bot 7755a09fe4 Automatically generated installer lang files 2020-08-26 00:07:38 +00:00
AMOS bot 006269aef3 Automatically generated installer lang files 2020-08-22 00:08:05 +00:00
Eloy Lafuente (stronk7) a67a0c2900 weekly release 3.7.7+ 2020-08-21 20:43:10 +02:00
Andrew Nicols 39bc7a84fd Merge branch 'MDL-67415_37' of https://github.com/stronk7/moodle into MOODLE_37_STABLE 2020-08-20 08:32:08 +08:00
Andrew Nicols 90bd99dc73 Merge branch 'MDL-69271_37' of https://github.com/stronk7/moodle into MOODLE_37_STABLE 2020-08-20 07:37:06 +08:00
Eloy Lafuente (stronk7) 793a86aef9 Merge branch 'MDL-69273-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-08-18 11:00:02 +02:00
Andrew Nicols 6d8999eb13 MDL-69273 travis: Use exttests for https too 2020-08-18 07:50:48 +08:00
Andrew Nicols 4f36e9dd4c MDL-69273 travis: Move exttests check to after_script
The result of the final command `script` phase determines the build
result.

The cleanup belongs in the `after_script` phase.
2020-08-18 07:40:14 +08:00
Eloy Lafuente (stronk7) 4000d27650 MDL-69271 auth_ldap: Don't assume any ordering, just verify matches
Both ldap or the DB can return information in a non-consistent
ordering leading to events to be generated in different order.

And current tests are, right now, assuming a given order.

Note this is a rare random, but it's happening, so better
fix it, see the issue for some more details.

So we just do the tests ordering immune, verifying that all the
expected events have been triggered and done. Irrespectively of their order.
2020-08-14 13:40:16 +02:00
Andrew Nicols 76c1d96592 weekly release 3.7.7+ 2020-08-14 14:42:25 +08:00
Andrew Nicols 63630ffcc8 Merge branch 'MDL-69421-37' of git://github.com/noeldemartin/moodle into MOODLE_37_STABLE 2020-08-13 09:36:35 +08:00
Eloy Lafuente (stronk7) 4d77f72c1d MDL-67415 environment: change requirements
- mysql requirement up to 5.7
- postgres requirement up to 9.6
2020-08-13 01:30:55 +02:00
Eloy Lafuente (stronk7) a1f8dfefab MDL-67415 environment: 3.10 base information
This is a direct copy of the 3.9 branch to have
changes under control easier for next commits.
2020-08-13 01:30:54 +02:00
Noel De Martin 3d8e0c0d19 MDL-69421 behat: Revert app behat navigation to call session visit 2020-08-06 12:25:50 +02:00
Victor Deniz Falcon 59541a9635 weekly release 3.7.7+ 2020-07-30 12:53:57 +01:00
Eloy Lafuente (stronk7) 87a907b1ec Merge branch 'MDL-69319-37' of https://github.com/snake/moodle into MOODLE_37_STABLE 2020-07-29 01:22:47 +02:00
Eloy Lafuente (stronk7) 32b7cd8e47 weekly release 3.7.7+ 2020-07-29 01:05:14 +02:00
Eloy Lafuente (stronk7) df876c1c6a Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-07-29 01:05:12 +02:00
AMOS bot b7b1ac5b07 Automatically generated installer lang files 2020-07-27 00:07:44 +00:00
AMOS bot 13b390428b Automatically generated installer lang files 2020-07-27 00:07:43 +00:00
AMOS bot 9ca0ab9812 Automatically generated installer lang files 2020-07-25 00:08:09 +00:00
AMOS bot 014e2b48eb Automatically generated installer lang files 2020-07-23 00:08:03 +00:00
Andrew Nicols 5d3dece47f MDL-69138 behat: Update session->visit() to use visit step 2020-07-22 16:50:55 +08:00
Andrew Nicols 97abfe31cc MDL-69138 behat: Add "I visit :localurl" step 2020-07-22 16:50:55 +08:00
Eloy Lafuente (stronk7) d1c2a39f16 Merge branch 'MDL-69160-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-07-21 23:29:58 +02:00
Adrian Greeve 242a321edd Merge branch 'MDL-67657-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-07-21 14:50:08 +08:00
Jake Dallimore 661f51493c MDL-69319 mod_lti: style and docs changes in external tests 2020-07-20 15:07:42 +08:00
Jake Dallimore 54748014f7 MDL-69319 mod_lti: replace try/catch with expectException in ext tests 2020-07-20 15:07:41 +08:00
Jake Dallimore 6baabaf790 MDL-69319 mod_lti: remove unused vars from externallib_test 2020-07-20 15:07:40 +08:00
Jake Dallimore fb0b9f8c33 MDL-69319 mod_lti: move test data generation out of common setup 2020-07-20 15:07:39 +08:00
Jake Dallimore 5ddf2ae179 MDL-69319 mod_lti: call clean_returnvalue in external tests 2020-07-20 15:07:38 +08:00
Eloy Lafuente (stronk7) 6778871f87 Merge branch 'MDL-69278-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-07-18 11:56:33 +02:00
Sara Arjona 6e19a4fa78 weekly release 3.7.7+ 2020-07-16 21:28:25 +02:00
Andrew Nicols 34e1460651 MDL-67657 behat: Open course with editing using URL
This is a huge performance improvement for behat.

The current set of steps loads the page
It then looks for the Classic/Clean version of the settings menu
If it fails to find it looks for the Boost Cog
Then it clicks the "Turn editing on" button

This can take a substantial period.

We do not actually need to run these steps as we are able to jump
straight to the URL. We already have access to the sesskey value
required to do this.

There is not loss in testing functionality because the actual testing of
the Turn editing functionality is tested in other places sufficiently.
2020-07-16 11:06:43 +08:00
Andrew Nicols b08c0ded45 MDL-67657 behat: Convert existing uses of executeScript 2020-07-16 11:06:31 +08:00
Andrew Nicols 7760f0c847 MDL-67657 behat: Add wrapper for JS execution 2020-07-16 11:05:32 +08:00
Andrew Nicols 12a2903b6f MDL-69278 behat: Correct variable name 2020-07-16 08:30:29 +08:00
Andrew Nicols df3048f55c MDL-69278 behat: Mark tests as failed when unable to start Session 2020-07-16 08:30:28 +08:00
Charles Fulton 61bf4f7c18 MDL-69074 admin: ensure consistent default for getremoteaddrconf 2020-07-15 19:06:17 +02:00
Sara Arjona 9a9ea3f8fc Merge branch 'MDL-69068-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-07-15 12:20:48 +02:00
Andrew Nicols f7ac933d2a MDL-69068 behat: Allow singular, pivotted data generators 2020-07-15 15:27:31 +08:00
Andrew Nicols f3936438ca MDL-69068 behat: New step to support singular generators 2020-07-15 15:25:27 +08:00
Andrew Nicols 4068dd161d MDL-69160 workshop: Ensure steps are chained 2020-07-13 14:22:31 +08:00
Andrew Nicols 352c921492 MDL-69160 behat: Add form field setter step 2020-07-13 14:22:31 +08:00
Eloy Lafuente (stronk7) 952a894a97 Moodle release 3.7.7 2020-07-12 12:12:45 +02:00
AMOS bot 058e70e9a2 Automatically generated installer lang files 2020-07-10 19:53:04 +00:00
Eloy Lafuente (stronk7) 4144ba4ee6 weekly release 3.7.6+ 2020-07-10 20:22:04 +02:00
Eloy Lafuente (stronk7) 9a37320726 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-07-10 20:21:59 +02:00
Jake Dallimore 647b675ee6 Merge branch 'MDL-69232-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-07-10 15:11:54 +08:00
Andrew Nicols eec91baff9 MDL-69232 behat: Simplify hooks
The behat hooks were needlessly complicated which made them much harder
to read, and understand, leading to bugs during development.

These have been significantly simplified to favour clarity over
overloading.
2020-07-10 08:40:30 +08:00
Andrew Nicols 775b9a363e MDL-69232 behat: Make selenium start more fault tolerant
The session was previously only started once, but has now been moved to
restart between each test. Because of this the `$session->start()` is
now called more frequently which exposes a pre-existing issue whereby
Selenium will periodically fail to start.

When the session was only started at the beginning of the test, and at
occasional other times, it made sense to always stop the test runner
because it signified an issue with obtaining the session at all.

Since the session is restarted more frequently, and now between every
test, it no longer makes sense to do this. The test should only be
_stopped_ if the first attempt to obtain the Session fails. Once a
Session has been retrieved at least once it no longer makes sense to
assume that the failure was a configuration failure, but a connection
failure. Therefore subsequent tests should be attempted.
2020-07-10 08:40:30 +08:00
Jake Dallimore 87f67eccef Merge branch 'MDL-69135-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-07-09 10:39:23 +08:00
Michael Hawkins 0442cf991c MDL-68426 theme: Set a limit on paths length in yui_combo
The maximum paths length is now consistent with the YUI loader.
This fix also removes any duplicate paths, so each file is only ever
fetched once.
2020-07-09 10:24:10 +08:00
Andrew Nicols f216c901e1 MDL-69232 behat: Add debugging information to Selenium fails 2020-07-09 09:47:15 +08:00
Andrew Nicols cc3e741801 MDL-69232 behat: Move suite tests to BeforeSuite hook 2020-07-09 09:47:15 +08:00
Eloy Lafuente (stronk7) 8d44fd1950 Merge branch 'MDL-69134-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-07-08 20:53:41 +02:00
Andrew Nicols 84388a2e30 Merge branch 'm37_MDL-66322_Travis_Run_Using_Docker_ExtTests' of https://github.com/scara/moodle into MOODLE_37_STABLE 2020-07-08 12:22:37 +08:00
Andrew Nicols 23a8270d36 MDL-69134 competencies: Behat fails randomly opening dialogues 2020-07-08 09:22:09 +08:00
Matteo Scaramuccia a4d4a0b280 MDL-66322 travis: Configure a local copy of 'exttests' 2020-07-07 21:59:58 +02:00
Eloy Lafuente (stronk7) 07ade46473 Merge branch 'MDL-69086-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-07-07 19:17:38 +02:00
Víctor Déniz Falcón 19fa09219f MDL-69093 enrol_manual: added check for allowed roles a user can assign 2020-07-06 04:47:34 +02:00
Jake Dallimore cb51c8aeea Merge branch 'MDL-69136-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-07-06 10:45:17 +08:00
Michael Hawkins 9c882617dd MDL-69128 admin: Convert HTML entities when populating tasklogs filter 2020-07-06 10:05:14 +08:00
AMOS bot a9140d703a Automatically generated installer lang files 2020-07-06 00:08:44 +00:00
Eloy Lafuente (stronk7) 118a1e784e weekly release 3.7.6+ 2020-07-03 18:41:21 +02:00
Eloy Lafuente (stronk7) 30983313d5 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-07-03 18:41:15 +02:00
Jake Dallimore e92d72531d Merge branch 'MDL-69149-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-07-02 11:57:51 +08:00
AMOS bot 31ea6dee4b Automatically generated installer lang files 2020-07-02 00:08:23 +00:00
Eloy Lafuente (stronk7) 83e9f358ec Merge branch 'MDL-69072-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-07-01 23:24:34 +02:00
Andrew Nicols ea5dfe6569 MDL-69136 behat: Improve reliability of navigation steps 2020-06-29 11:36:36 +08:00
Andrew Nicols 1dd4007796 MDL-69136 behat: Support find on a NodeElement 2020-06-29 11:36:30 +08:00
Andrew Nicols 6032981688 MDL-69072 behat: Remove restart_browser_after feature
This is no longer required as the Mink session is restarted after every
test regardless.
2020-06-29 11:05:53 +08:00
Andrew Nicols f39dc20d43 MDL-69072 mod_scorm: Stop mink reset after tests
This is now done for all scenarios. It is no longer necessary to do so
specifically for mod_scorm.
2020-06-26 21:17:23 +08:00
Andrew Nicols 462e37413f MDL-69072 behat: Relaunch browser session between scenarios 2020-06-26 21:17:22 +08:00
Andrew Nicols 3fe3913c54 MDL-69149 core_grade: Correct xpath attribute selector 2020-06-26 19:59:56 +08:00
Andrew Nicols be58ae7572 MDL-69135 core_calendar: PendingJS for event filtering 2020-06-26 07:58:36 +08:00
Eloy Lafuente (stronk7) 67753d625e weekly release 3.7.6+ 2020-06-25 18:06:18 +02:00
Eloy Lafuente (stronk7) bb05910a30 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-06-25 18:06:13 +02:00
Eloy Lafuente (stronk7) 7ff28ff941 Merge branch 'MDL-66568-37-2' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-06-23 17:57:46 +02:00
AMOS bot da736374e9 Automatically generated installer lang files 2020-06-21 00:07:35 +00:00
Andrew Nicols c2724bce31 MDL-69086 theme_boost: Improve pendingJs checks for bootstrap
Where an element, like an `alert`, is closed it is removed from the DOM
before the event fires (this is a correct behaviour).

This means that the final event confirming that the action happened
(i.e. close => closed) fires, but does not bubble up the DOM to the
document.body.

This change moves the end event listener to only be added after a start
event has been fired, and to attach directly to the HTMLElement where it
will be fired. This means that the Event handler will still be called,
even though it has been removed from the DOM, because it does not need
to bubble up to the body.
2020-06-19 08:17:45 +08:00
Sara Arjona 4762e10fb0 weekly release 3.7.6+ 2020-06-18 14:13:51 +02:00
Sara Arjona 334bee3de7 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-06-18 14:13:48 +02:00
Andrew Nicols c11fbc518c MDL-66568 behat: Reset theme CSS between scenarios 2020-06-17 07:52:24 +08:00
Andrew Nicols 42197e952d MDL-66568 behat: Support building of themes for behat 2020-06-17 07:52:23 +08:00
Andrew Nicols 65adf66a24 MDL-66568 core_output: Return built theme CSS 2020-06-17 07:52:23 +08:00
Víctor Déniz Falcón bb3d73727f Merge branch 'MDL-69049-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2020-06-16 17:49:04 +01:00
Jun Pataleta 3ab30c7f20 MDL-69049 tool_dataprivacy: Add possibly missing comment format columns
The earlier CONTRIB plugin versions of the tool (<33.2.0, <34.2.0) were
missing the following columns in the data requests table:
* commentsformat
* dpocommentformat
And the upgrade scripts for the merged tool failed in
Moodle 3.3.8+/3.3.0+ failed to add these columns.
So a site which uses the CONTRIB plugin and eventually upgrading to 3.9
will encounter an error during upgrade because of the missing
dpocommentformat column.
2020-06-15 23:41:19 +08:00
AMOS bot 56c40e0b40 Automatically generated installer lang files 2020-06-14 00:07:33 +00:00
Sara Arjona 980ae98809 weekly release 3.7.6+ 2020-06-11 18:04:06 +02:00
Sara Arjona 2d6f00d381 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-06-11 18:04:02 +02:00
Andrew Nicols ebdf85d638 Merge branch 'MDL-69002-37' of git://github.com/sarjona/moodle into MOODLE_37_STABLE 2020-06-11 11:27:09 +08:00
Sara Arjona 048d7eec36 MDL-69002 core_badges: move backpack validation to a separate page
Instead of running the site backpack validation every time badges/backpacks.php
page is loaded, an action button has been added to the backpacks with OB set
to 2.0 to let admins running manually this verification when needed.
2020-06-10 13:09:53 +02:00
Sara Arjona fa1eab6447 MDL-69002 core_badges: add methods to support backpack validation
A more generic method has been added to the API to validate the
backpack connection (for now, there was only one method for
validating current backpack).
Besides, a renderer has been added to display this information
depending on the backpackid.
2020-06-10 13:09:52 +02:00
Sara Arjona 657f0381d8 MDL-69002 core_badges: remove site backpack verification from settings
This site backpack verification is not required so, instead of
running it always here, it will be moved to a separate page to let
admins decide when to check it.
2020-06-10 13:09:51 +02:00
Jun Pataleta 617df25335 Merge branch 'MDL-68864-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2020-06-10 11:26:33 +08:00
Bas Brands 5611585eec MDL-68864 qtype_multichoice: clearchoice
- Reverted changes from MDL-67901
2020-06-09 10:50:36 +02:00
AMOS bot 5df5711bd0 Automatically generated installer lang files 2020-06-06 00:07:34 +00:00
AMOS bot 7a82a0e426 Automatically generated installer lang files 2020-05-30 00:07:30 +00:00
Sara Arjona 868f9fa5bd weekly release 3.7.6+ 2020-05-29 12:52:40 +02:00
Sara Arjona 894d847d9d Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-05-29 12:52:37 +02:00
AMOS bot 304fa6defe Automatically generated installer lang files 2020-05-29 00:07:57 +00:00
Adrian Greeve 22665452a3 Merge branch 'MDL-68847-37' of https://github.com/snake/moodle into MOODLE_37_STABLE 2020-05-28 16:31:43 +08:00
Jake Dallimore 7ca59eba57 MDL-68847 mod_url: fix bug when using dnd to handle urls
This generates a notice, which wasn't seen because the feature works
asynchronously.
2020-05-28 15:53:07 +08:00
Jun Pataleta ad06a6f7df Merge branch 'MDL-68750-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-05-27 11:24:44 +08:00
Andrew Nicols f2fcb75384 MDL-68750 tool_dataprivacy: Correct behat test modal checks 2020-05-27 10:40:30 +08:00
Eloy Lafuente (stronk7) 3d1f43126e weekly release 3.7.6+ 2020-05-26 22:52:16 +02:00
Andrew Nicols ddd2f21247 MDL-68750 core_tag: Add missing confirmation dialogue title 2020-05-26 12:57:02 +08:00
Andrew Nicols bf2f4704c9 MDL-68750 behat: Correct dialogue selector 2020-05-26 12:57:02 +08:00
Andrew Nicols bff7ea0435 Merge branch 'MDL-68658_37' of https://github.com/stronk7/moodle into MOODLE_37_STABLE 2020-05-25 15:49:58 +08:00
Eloy Lafuente (stronk7) 267c26d6d7 MDL-68658 phpunit: Ensure that the configured proxy is applied always
Previously, if the RSS feed (extests) was being served locally,
CFG->proxybypass was applied and causing the test to fail (proxy
ignored).

In that exact test we need the configured proxy to be applied
always, because the test is exaclty about detecting the problem
when a wrong proxy is used.
2020-05-22 17:07:14 +02:00
Victor Deniz Falcon 591c98d71c weekly release 3.7.6+ 2020-05-22 14:22:15 +01:00
Victor Deniz Falcon c9a94cbc9a Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-05-22 14:22:11 +01:00
Adrian Greeve 392741bd32 Merge branch 'MDL-68733_37' of https://github.com/timhunt/moodle into MOODLE_37_STABLE 2020-05-21 08:34:49 +08:00
AMOS bot 97f2f72902 Automatically generated installer lang files 2020-05-21 00:07:30 +00:00
AMOS bot 065c5a1c2f Automatically generated installer lang files 2020-05-20 00:07:39 +00:00
Sara Arjona f6e0e09f20 weekly release 3.7.6+ 2020-05-19 17:54:43 +02:00
Sara Arjona 3c3e5a5f71 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-05-19 17:54:40 +02:00
Tim Hunt 82258882da MDL-68733 quiz editing: behat test for altering random question tags 2020-05-19 11:17:32 +01:00
Bence Molnar 3d9e7a3071 MDL-68733 quiz editing: be more careful deleting random question tags 2020-05-19 11:17:32 +01:00
Tim Hunt db233ce7e2 MDL-68733 question behat: question tag generator and use in quiz test 2020-05-19 11:17:28 +01:00
AMOS bot 6e7fdac8f0 Automatically generated installer lang files 2020-05-19 00:07:32 +00:00
Sara Arjona 0393dc3357 Merge branch 'MDL-68760_37' of https://github.com/timhunt/moodle into MOODLE_37_STABLE 2020-05-18 20:33:31 +02:00
Sara Arjona 727ba5d9c0 Merge branch 'MDL-68728-37-2' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-05-18 20:23:32 +02:00
Tim Hunt 045d650ae3 MDL-68760 timezones: add string for new timezone America/Nuuk 2020-05-18 17:32:29 +01:00
Tim Hunt 890e60c709 MDL-68760 string tests: make test_timezone_lang_strings message helpful 2020-05-18 17:32:29 +01:00
Andrew Nicols 7738116fd5 Merge branch 'MDL-68503_37_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_37_STABLE 2020-05-18 20:33:30 +08:00
Andrew Nicols 183b8f556b MDL-68728 calendar: Pending promises for event summary 2020-05-18 13:38:28 +08:00
AMOS bot c696b5e6b4 Automatically generated installer lang files 2020-05-18 00:07:54 +00:00
AMOS bot 22c276dd00 Automatically generated installer lang files 2020-05-17 00:07:24 +00:00
Eloy Lafuente (stronk7) ae1f2982ff weekly release 3.7.6+ 2020-05-15 11:06:52 +02:00
Andrew Nicols 4e2dd1a3a8 Merge branch 'MDL-66917-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-05-15 10:55:22 +08:00
Eloy Lafuente (stronk7) bce5596ff8 Merge branch 'MDL-68084-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-05-15 01:31:05 +02:00
Jake Dallimore ce6735fb29 Merge branch 'MDL-68631_37' of https://github.com/jonof/moodle into MOODLE_37_STABLE 2020-05-13 09:31:34 +08:00
Paul Holden f77412b119 MDL-68084 blocks: check capability before getting content.
Some blocks (e.g. Calendar) load additional JS modules when returning
content. We need to make sure they aren't asked to generate content
unless the user can actually view the block, or the expected content
required by the JS will not exist in the DOM and can cause exceptions.
2020-05-12 19:21:43 +01:00
Sara Arjona ed69fa429f weekly release 3.7.6+ 2020-05-12 14:16:57 +02:00
Jun Pataleta 99f889d2af Merge branch 'MDL-66109-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-05-12 00:03:03 +08:00
Andrew Nicols ef8de2333b MDL-66109 js: Built file changes from new Node version 2020-05-11 10:54:05 +08:00
Andrew Nicols 7a2a464728 MDL-66109 js: Fix circular dependency in Shifter dependency
Shifter is using an ancient and no-longer supported of Istanbul. That
version contains a circular dependency whereby it fetches the version
from the index that included the file in the first place.  This throws a
warning on newer versions of Node.

The fix here is simple and intended to be the bare minimum to remove
these warnings anad resolve the issue.

We have forked the istanbul project and created a v0.1.37_moodle branch
at the root version of the Istanbul version that Shifter uses (v0.1.37
tag). The circular dependency is then addressed and a new tag created.

I have then forked Shifter, pointing its package.json at the tar.gz
download of that new tag and pushed a new branch and tag for that fix.

Following this our own package.json is updated to point to the tar.gz
version of the new Shifter tag.
2020-05-11 10:54:05 +08:00
Andrew Nicols a3e94bc0e8 MDL-66109 js: Upgrade to latest stable version of NodeJS
Version 14.0.0 has just been released as stable, and will make its way
to an LTS release which will be supported until 30th April 2023.

At time of writing it is the "Current stable" release and will remain in
this phase until 20th October 2020, at whciih point it will transition
to LTS status.
2020-05-11 10:54:05 +08:00
Eloy Lafuente (stronk7) cf687f4357 Moodle release 3.7.6 2020-05-09 20:05:35 +02:00
Eloy Lafuente (stronk7) e32ae38439 weekly release 3.7.5+ 2020-05-08 13:29:56 +02:00
Eloy Lafuente (stronk7) 4e09dc64b7 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-05-08 13:29:53 +02:00
Jake Dallimore fcefa38092 Merge branch 'MDL-51694-37' of https://github.com/MartinGauk/moodle into MOODLE_37_STABLE 2020-05-08 11:23:23 +08:00
Eloy Lafuente (stronk7) 61f218ae47 Merge branch 'MDL-68443-xmldb-path-validation-MOODLE_37_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_37_STABLE 2020-05-07 19:17:11 +02:00
Paul Holden 6bafc320c0 MDL-68415 core: test attachments in email_to_user from allowed paths. 2020-05-07 18:41:18 +02:00
fujiwara a22a46a689 MDL-68415 email: Fix attachment in email_to_user() 2020-05-07 18:41:12 +02:00
Jake Dallimore 9e6f90f1cf Merge branch 'MDL-62403-37' of git://github.com/lameze/moodle into MOODLE_37_STABLE 2020-05-07 14:20:12 +08:00
Simey Lameze 62ed52fdc4 MDL-62403 portfolio: add upgrade notes for google docs 2020-05-07 13:05:44 +08:00
Ryan Wyllie ad45df4dc2 MDL-62403 portfolio: create directories for google drive export
I've modified the Google Drive portfolio export so that it creates a
root directory in Drive for all of the files in the export. This allows
each export to be contained from each other to help with clashing file
names.

Additionally, the paths for the exported files will now be created in
Drive so that exported files are in the correct directory structure.
This is important for forum posts exports which assume a certain
directory structure in the export.
2020-05-07 12:43:15 +08:00
Jonathon Fowler 1d8729004a MDL-68631 cron: ensure the cron user is reset between scheduled tasks 2020-05-07 13:30:50 +10:00
Andrew Nicols c65e8a5900 Merge branch 'MDL-68556-37-pluginscheckcss' of git://github.com/mudrd8mz/moodle into MOODLE_37_STABLE 2020-05-07 09:17:03 +08:00
Paul Holden 796a7ea458 MDL-68410 mod_scorm: safer status operator comparison. 2020-05-07 09:03:24 +08:00
Ferran Recio 3c5d8d6602 MDL-68430 filter_mathjaxloader: update default CDN to 2.7.8 2020-05-06 11:13:42 +02:00
Jun Pataleta 2ad366c869 Merge branch 'MDL-68402_37' of https://github.com/timhunt/moodle into MOODLE_37_STABLE 2020-05-06 17:04:44 +08:00
Tim Hunt 55ba3eece2 MDL-68402 accesslib: fix coding style of loops 2020-05-06 09:58:54 +01:00
Tim Hunt fb990d26d4 MDL-68402 accesslib: Modernise coding style in the functions changed 2020-05-06 09:58:54 +01:00
Tim Hunt 96dbdc2ad9 MDL-68402 accesslib: fix get_with_capability_join logic
In fact, rather than fix the old logic, I noticed that the correct
logic was already implemented in get_users_by_capability. So, I
refactored to extract the working version into a function, which it
turns out can have exactly the same API as get_with_capability_join,
which was convenient.
2020-05-06 09:58:53 +01:00
Jake Dallimore d976ae38f5 Merge branch 'MDL-68293-37' of git://github.com/jleyva/moodle into MOODLE_37_STABLE 2020-05-06 12:54:08 +08:00
Jun Pataleta 675c0451f9 Merge branch 'MDL-68301-37' of git://github.com/bmbrands/moodle into MOODLE_37_STABLE 2020-05-06 10:33:01 +08:00
Andrew Nicols f5e8e0b08a Merge branch 'MDL-63609-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-05-06 08:52:19 +08:00
AMOS bot c9da87aa50 Automatically generated installer lang files 2020-05-06 00:13:21 +00:00
Eloy Lafuente (stronk7) c070acd2eb weekly release 3.7.5+ 2020-05-05 19:05:35 +02:00
Eloy Lafuente (stronk7) 647aa0625f Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-05-05 19:05:33 +02:00
Bas Brands a4e65c3276 MDL-68266 core_message: disable custom switches for behat testing 2020-05-05 14:23:53 +02:00
Jun Pataleta 225e176962 Merge branch 'MDL-68266-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-05-05 09:26:18 +08:00
Bas Brands 75b5301c9a MDL-68266 theme_boost: behat enable custom switches 2020-05-05 09:12:50 +08:00
AMOS bot 6d780ff6d5 Automatically generated installer lang files 2020-05-05 00:11:41 +00:00
Eloy Lafuente (stronk7) 5ed7751049 Merge branch 'MDL-52904-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2020-05-04 22:32:25 +02:00
Martin Gauk 8d21ca65d4 MDL-51694 core_grades: use transactions when deleting 2020-05-04 12:47:39 +00:00
Jun Pataleta 20644f8c6a Merge branch 'MDL-68266-37' of git://github.com/bmbrands/moodle into MOODLE_37_STABLE 2020-05-04 17:24:43 +08:00
Bas Brands 22c36cd1b6 MDL-68266 core_course: accessibility improvements for course management
- added commit of Moodle 3.7 hardcoding the highlight border width
that was not calculated because of a scssphp bug
2020-05-04 10:57:57 +02:00
Sara Arjona 014fd48298 Merge branch 'MDL-68315-MOODLE_37_STABLE' of https://github.com/kabalin/moodle into MOODLE_37_STABLE 2020-05-04 10:37:36 +02:00
Andrew Nicols 6006347f62 Merge branch 'MDL-68266-37' of git://github.com/bmbrands/moodle into MOODLE_37_STABLE 2020-05-04 15:33:49 +08:00
Bas Brands fc1d54365e MDL-68266 core_course: accessibility improvements for course managent
colour contrast improvements
use custom checkboxes
use accessible colour for text-muted
2020-05-04 09:12:22 +02:00
David Saylor 41536c1586 MDL-52904 completion: reference context in cron query
Co-authored-by: Barbara Lawrence <blawrence@harlow-college.ac.uk>
2020-05-04 09:58:16 +08:00
Jun Pataleta 5b52f17db3 MDL-52904 completion: Unit tests for daily completion task 2020-05-04 09:58:16 +08:00
Andrew Nicols a44b5cbd84 Merge branch 'MDL-68509-37' of https://github.com/Dagefoerde/moodle into MOODLE_37_STABLE 2020-05-03 19:56:25 +08:00
Eloy Lafuente (stronk7) 3eca8fedf0 weekly release 3.7.5+ 2020-05-02 16:36:34 +02:00
Eloy Lafuente (stronk7) 6136ba0221 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-05-02 16:36:32 +02:00
Andrew Nicols 9a6874fee7 Merge branch 'MDL-68492-m37' of https://github.com/sammarshallou/moodle into MOODLE_37_STABLE 2020-05-01 12:08:02 +08:00
Andrew Nicols d5483a9d21 Merge branch 'MOODLE_37_MDL-67540' of https://github.com/golenkovm/moodle into MOODLE_37_STABLE 2020-05-01 11:21:39 +08:00
Andrew Nicols e4079005ef Merge branch 'MDL-57680_37' of https://github.com/timhunt/moodle into MOODLE_37_STABLE 2020-05-01 11:07:39 +08:00
Eloy Lafuente (stronk7) 9c077351e5 Merge branch 'MDL-68427-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-04-30 23:35:42 +02:00
Jun Pataleta abe082493e Merge branch 'MDL-68404-37' of git://github.com/lucaboesch/moodle into MOODLE_37_STABLE 2020-04-30 13:32:43 +08:00
Jun Pataleta 5ea56fd371 Merge branch 'MDL-68309-37' of https://github.com/snake/moodle into MOODLE_37_STABLE 2020-04-30 09:56:30 +08:00
AMOS bot 2cd1ef8c97 Automatically generated installer lang files 2020-04-30 00:12:04 +00:00
Eloy Lafuente (stronk7) 35cf368176 Merge branch 'MDL-68434-37-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_37_STABLE 2020-04-29 22:53:01 +02:00
David Mudrák ed3a03b439 MDL-68434 lang: Use the updated terminology in the tests 2020-04-29 17:48:28 +02:00
David Mudrák 0b7412e092 MDL-68556 admin: Fix some minor styling issues on the plugins check page
The patch fixes missing space around elements and some other minor
visual issues detected. This was a good opportunity to get rid of custom
CSS rules and use the native bootstrap classes and utilities.
2020-04-29 14:53:15 +02:00
Helen Foster 3f19c3cfb4 MDL-68434 lang: Import fixed English strings (en_fix)
Significant string changes:

* pluginnamesummary,qtype_ddimageortext and
  pluginnamesummary,qtype_ddmarker - Note about the question type not
  being accessible to visually impaired users
2020-04-28 15:52:21 +02:00
Andrew Nicols 2c2232ce23 Merge branch 'MDL66035' of https://github.com/jwalits/moodle into MOODLE_37_STABLE 2020-04-28 20:04:56 +08:00
Luca Bösch 1bd4817843 MDL-68404 gradingform_rubric: Style "Add level" button. 2020-04-28 14:01:45 +02:00
Andrew Nicols 5673b3b48a Merge branch 'MDL-68445_37' of https://github.com/stronk7/moodle into MOODLE_37_STABLE 2020-04-28 18:31:34 +08:00
Eloy Lafuente (stronk7) 686468bae6 weekly release 3.7.5+ 2020-04-28 11:15:24 +02:00
Eloy Lafuente (stronk7) 30d3dad3bb Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-04-28 11:15:22 +02:00
Andrew Nicols 4fa12efce0 Merge branch 'MDL-68525-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-04-28 10:23:51 +02:00
Eloy Lafuente (stronk7) 38f595a0df MDL-68525 behat: chrome/switches caps not allowed in Chrome > 81
Now we need to use extra_capabilities/chromeOptions/args instead

The former was deprecated long ago, it seems that Chrome 81 has
stopped accepting it. The later seems to be working at very least
since Chrome 76 (haven't gone further back).
2020-04-28 12:32:18 +08:00
Eloy Lafuente (stronk7) cdaae17f19 Merge branch 'MDL-68393-37-availableupdateui' of git://github.com/mudrd8mz/moodle into MOODLE_37_STABLE 2020-04-27 18:09:59 +02:00
Eloy Lafuente (stronk7) 6a0f3a8736 Merge branch 'MDL-65967-37' of https://github.com/danielneis/moodle into MOODLE_37_STABLE 2020-04-27 17:31:38 +02:00
AMOS bot 201946c82c Automatically generated installer lang files 2020-04-27 00:11:37 +00:00
Jwalit Shah 9950de034a MDL-66035 message: Restore missing message preferences files 2020-04-27 09:49:06 +10:00
Tim Hunt e43a539e10 MDL-57680 form autocomplete: extend Behat tests 2020-04-26 15:12:12 +01:00
Tim Hunt 80474ee9e8 MDL-57680 form autocomplete: fix triggering change event 2020-04-26 14:33:55 +01:00
Tim Hunt cce1fe41a6 MDL-57680 form autocomplete: let singleselects be cleared.
This was already working after ajax had refreshed the choices, it was just
broken on first page load.
2020-04-26 14:30:19 +01:00
Mikhail Golenkov ae0d7f7089 MDL-67540 quiz: Start transaction before selecting existing slots.
Co-authored-by: Conn <conn@cmrwarwicker.com>
2020-04-26 10:56:03 +10:00
Thiagolivramento 77d5634729 MDL-65967 tool_recyclebin: add recycle bin link to category edit menu 2020-04-24 17:09:12 -03:00
Eloy Lafuente (stronk7) f2d2912241 MDL-68445 behat: Bump to 3.6.x
composer.lock generated with PHP 7.1, following:

https://docs.moodle.org/dev/Composer#How_to_prepare_and_submit_composer_changes

Also, ensure Symfony/Process > 4.0 compatibility
(needed for parallel runs)
2020-04-24 15:57:17 +02:00
sam marshall 28de453200 MDL-68492 Behat: Use faster direct link steps in lib/tests/behat 2020-04-24 12:07:15 +01:00
sam marshall d571624920 MDL-68492 Behat: Direct URL links for courses, activities 2020-04-24 12:07:15 +01:00
Shamim Rezaie 12659cd7f1 MDL-68509 core_ddl: Keep databasemeta cache after dropping temptables
Backport of MDL-58584 (934c2ee + 94e2509)
2020-04-24 11:06:37 +02:00
Jun Pataleta 84e737e3dd weekly release 3.7.5+ 2020-04-24 09:41:07 +08:00
Jun Pataleta 64f54e0dc4 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-04-24 09:41:05 +08:00
Mark Johnson e6568e5a31 MDL-68503 user profile: Make sortorders relative to existing records 2020-04-23 15:57:21 +01:00
Eloy Lafuente (stronk7) 06188c7eb6 Merge branch 'MDL-67886_37' of https://github.com/stronk7/moodle into MOODLE_37_STABLE 2020-04-23 16:06:35 +02:00
Eloy Lafuente (stronk7) c40fde2eae MDL-67886 phpunit: Make tests cross-db
The suggested SQL in some of the assertions was not cross-db
but db-dependent. Now we just keep that part out from the
assertions, because it's not important to verify the
errors that are being asserted.
2020-04-23 12:35:30 +02:00
AMOS bot 22ec8c83b5 Automatically generated installer lang files 2020-04-23 00:14:44 +00:00
Eloy Lafuente (stronk7) b2507972df Merge branch 'MDL-67886_37' of git://github.com/mdjnelson/moodle into MOODLE_37_STABLE 2020-04-23 01:37:35 +02:00
Mark Nelson f524ec2aaa MDL-67886 core: check_database_schema() checks for missing indexes 2020-04-22 23:20:18 +02:00
Jun Pataleta 050cede6d8 Merge branch 'MDL-68392_37' of https://github.com/stronk7/moodle into MOODLE_37_STABLE 2020-04-22 11:09:20 +08:00
Paul Holden ac1fc5575a MDL-63609 media_videojs: support Youtube URL start time. 2020-04-21 14:45:37 +01:00
Paul Holden 536c771a3f MDL-66917 admin: validate uploaded plugin version.
Prevent overwriting current plugins with older versions of themselves.
2020-04-21 14:36:26 +01:00
Jun Pataleta 3870922e61 Merge branch 'MDL-68339_37' of https://github.com/stronk7/moodle into MOODLE_37_STABLE 2020-04-20 21:52:40 +08:00
AMOS bot 9673018068 Automatically generated installer lang files 2020-04-19 00:13:25 +00:00
Brendan Heywood f98f08c00a MDL-68443 xmldb: Improve path validation on view_xml action 2020-04-18 20:51:56 +10:00
Eloy Lafuente (stronk7) 22120a505a MDL-68339 message: move array_key_exists() to property_exists()
Towards PHP 7.4 compliance:

array_key_exists(): Using array_key_exists() on objects is
deprecated. Use isset() or property_exists() instead
2020-04-16 20:28:37 +02:00
Eloy Lafuente (stronk7) 5466990ffc weekly release 3.7.5+ 2020-04-16 19:34:19 +02:00
Eloy Lafuente (stronk7) ae77ba7af5 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-04-16 19:34:13 +02:00
Juan Leyva 3291f83c81 MDL-68293 mobile: Update language strings to mention new app plans
We need to update different language strings to let our site admins know about the new app restrictions
(for both features and user devices able to receive notifications)
2020-04-16 12:54:11 +02:00
Andrew Nicols 5963365517 MDL-68427 core: Correct previous/next page in paging bar 2020-04-16 14:41:59 +08:00
Adrian Greeve 3f7b3abaa9 Merge branch 'MDL-68196-37' of git://github.com/rezaies/moodle into MOODLE_37_STABLE 2020-04-16 10:58:06 +08:00
Shamim Rezaie a1d6d0ceb2 MDL-68196 core: not expand autocomplete elements too soon on IE 2020-04-16 12:23:49 +10:00
Eloy Lafuente (stronk7) 78f3ac2a67 Merge branch 'MDL-66849-M37' of https://github.com/ised-isde-canada/moodle into MOODLE_37_STABLE 2020-04-16 01:03:02 +02:00
Eloy Lafuente (stronk7) 9ff01f7cb5 Merge branch 'MDL-68323-37' of git://github.com/marinaglancy/moodle into MOODLE_37_STABLE 2020-04-16 00:54:07 +02:00
Eloy Lafuente (stronk7) a4c62ac8c1 Merge branch 'MDL-68279-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-04-16 00:33:32 +02:00
Eloy Lafuente (stronk7) fa07a148ef Merge branch 'MDL-68189-m37' of https://github.com/NeillM/moodle into MOODLE_37_STABLE 2020-04-16 00:19:04 +02:00
Eloy Lafuente (stronk7) 4c94e4947a Merge branch 'MDL-68280-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-04-16 00:10:56 +02:00
Sara Arjona 8484ab9ec9 Merge branch 'MDL-67751-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-04-15 17:57:23 +02:00
Jun Pataleta 56e572a73e Merge branch 'MDL-66200-MOODLE_37_STABLE_gradebook_csv_import' of https://github.com/jwalits/moodle into MOODLE_37_STABLE 2020-04-15 23:18:09 +08:00
Paul Holden 94de68f9b8 MDL-67751 course: include inline folders in list of resources. 2020-04-15 13:59:36 +01:00
Eloy Lafuente (stronk7) 89d61861a6 Merge branch 'MDL-67499-37' of git://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-04-15 12:49:57 +02:00
Bas Brands f8f1a2dd86 MDL-68301 theme_boost: move course format css
this reduces duplication of css in format_topic
and format_weeks
2020-04-15 09:53:14 +02:00
Michael Milette 8039c06800 MDL-66849 output: Remove custom menu title when not specified 2020-04-14 22:20:48 -04:00
Jun Pataleta b59c6dbd51 Merge branch 'MDL-68405-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-04-14 16:08:58 +08:00
Andrew Nicols 7ab1221629 MDL-68405 js: Ensure correct exit code for gherkinlint 2020-04-14 15:09:48 +08:00
AMOS bot 9818289b15 Automatically generated installer lang files 2020-04-11 00:12:01 +00:00
AMOS bot 274e050ab4 Automatically generated installer lang files 2020-04-11 00:12:01 +00:00
David Mudrák f9aa942b2c MDL-68393 admin: Fix some minor styling issues on the notifications page
The patch makes the available update information elements more
distinguishable, the Download button more prominent, and the Check for
available update button better aligned. It reduces the space between
multiple available Moodle updates, too.
2020-04-10 14:41:36 +02:00
Eloy Lafuente (stronk7) d4b9e6613f Merge branch 'MDL-67919-37' of git://github.com/sarjona/moodle into MOODLE_37_STABLE 2020-04-10 11:58:49 +02:00
Eloy Lafuente (stronk7) 7098d7cb9f Merge branch 'MDL-67910-37' of git://github.com/sarjona/moodle into MOODLE_37_STABLE 2020-04-10 11:46:18 +02:00
Luca Bösch 945469f0e1 MDL-68392 travis: Fix validation warnings and infos
Can verify that this file passes the validation @
https://config.travis-ci.com/explore
2020-04-10 00:14:47 +02:00
Jwalit Shah 0470c9cc4e MDL-66200 gradebook: check selected feedback option when importing data 2020-04-09 10:59:46 +10:00
Sara Arjona 1ea8b348dd weekly release 3.7.5+ 2020-04-08 16:24:43 +02:00
Sara Arjona a65a5570a3 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-04-08 16:24:40 +02:00
Andrew Nicols da15ac0233 Merge branch 'MDL-68148-37' of git://github.com/rezaies/moodle into MOODLE_37_STABLE 2020-04-08 11:24:29 +08:00
Shamim Rezaie 07091e866d MDL-68148 user: remove the noscript tag
The submit button remains deactive if js is disabled. So having a
noscript tag to output a submit button here does not make sense.
2020-04-08 11:55:11 +10:00
Shamim Rezaie 37d34c2aa4 MDL-68148 user: fixed stray end tag (input) 2020-04-08 11:44:46 +10:00
Shamim Rezaie 4934b00dca MDL-68148 core_user: avoid multiple enrol buttons with the same id 2020-04-08 11:44:45 +10:00
Shamim Rezaie 0f4e00f527 MDL-68148 core_user: set the fullname column as the header column
ref: https://www.w3.org/WAI/tutorials/tables/
2020-04-08 11:44:45 +10:00
Shamim Rezaie d8ba1a5db5 MDL-68148 output: type attribute is unnecessary for javascript resources 2020-04-08 11:44:44 +10:00
Shamim Rezaie 1a5c2aea69 MDL-68148 core: remove cellspacing
The cellspacing attribute of <table> is not supported in HTML5.
So the removed line did not have any effect since ages ago.
2020-04-08 11:44:43 +10:00
AMOS bot e2df259a6a Automatically generated installer lang files 2020-04-08 00:11:20 +00:00
AMOS bot c7c4882929 Automatically generated installer lang files 2020-04-08 00:11:19 +00:00
Sara Arjona bd3600a28e Merge branch 'MDL-40081-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-04-07 15:10:25 +02:00
Sara Arjona 88955a1984 Merge branch 'MOODLE_37_MDL-68223' of https://github.com/golenkovm/moodle into MOODLE_37_STABLE 2020-04-07 13:43:17 +02:00
Sara Arjona 795069eb94 Merge branch 'MOODLE_37_MDL-65700' of https://github.com/golenkovm/moodle into MOODLE_37_STABLE 2020-04-07 13:34:35 +02:00
Mikhail Golenkov e061d00010 MDL-65700 javascript: Add MDN and URL polyfills. 2020-04-07 20:57:46 +10:00
Sara Arjona b6e8c88f0b Merge branch 'MDL-65539-m37' of https://github.com/NeillM/moodle into MOODLE_37_STABLE 2020-04-06 16:42:24 +02:00
Paul Holden c96e66a40a MDL-40081 completion: clean up criteria records for deleted courses. 2020-04-06 12:22:03 +01:00
Paul Holden 23e71ce7a5 MDL-67499 restore: account for deleted user truncated email/username. 2020-04-06 12:10:00 +01:00
Eloy Lafuente (stronk7) a7c8680ec3 MDL-67499 restore: add 100% cov. to restore_dbops::precheck_user()
Supports multiple mails to be tested.

So we can perform changes to it and also some related stuff,
like delete_user() with confidence.
2020-04-06 11:48:44 +01:00
Paul Holden 2c6df5b7f0 MDL-67499 user: truncate long username/email during user deletion. 2020-04-06 11:48:44 +01:00
Paul Holden 316575d3b3 MDL-68280 user: fix PHP notice for unknown user invalid login token. 2020-04-06 11:46:26 +01:00
Paul Holden 9a856f83fe MDL-68279 admin: filter site fullname when sending test email. 2020-04-06 11:41:34 +01:00
Sara Arjona c7c98440cf Merge branch 'MDL-68239-37' of https://github.com/NinaHerrmann/moodle into MOODLE_37_STABLE 2020-04-06 10:19:32 +02:00
Jake Dallimore 1674e5f87c MDL-68309 overrides: clarify inactive overrides help string 2020-04-06 07:41:36 +08:00
Sara Arjona 98af061024 MDL-67919 dataprivacy: Fix behat error when contacting DPO 2020-04-03 19:49:00 +02:00
Ruslan Kabalin b71d42cfb4 MDL-68315 formslib: Fix completion attribute in course form element.
This fixes 'onlywithcompletion' attribute in course form element.
2020-04-03 16:12:44 +01:00
n_herr03 337d0eb9e8 MDL-68239 mod_data: make required icon in multimenu visible 2020-04-03 12:20:24 +02:00
Neill Magill 316d6c9de5 MDL-65539 dragdrop: Ignore drag proxy in keyboard menu
Before this change the node that is displayed during a the last mouse
drag and drop would be listed in a keyboard drag and drop if it was
the container node of one of the types of node being moved in this action.

If a node is inside a node with the .yui3-dd-proxy class then it is
one of the proxy elements used to display the dragged content during
mouse drag and drop so we will start ignoring it.
2020-04-03 08:39:31 +01:00
Neill Magill 3e32822706 MDL-65539 dragdrop: Allow sections and blocks to move to the top
Before this change sections and blocks could not be moved to be the
top item when using keyboard drag and drop.

They can now be moved to the top in one action.

The way they move using keyboard drag and drop has changed when they
are below the item they are dropped on, not instead of appearing
below it they will be placed above it.
2020-04-03 08:39:31 +01:00
Neill Magill 8314f2e9a2 MDL-65539 dragdrop: Allow direction detection when using keyboard
Before this change keyboard drag and drop could not detect the
direction of movement, this meant that an item would only be placed
below an item or at the top of a container item.

This change means that extending modules can declare
detectkeyboarddirection to true. This will mean that when an item is
moved it's position will be determined by the direction of travel as
it would be when dragging using the mouse.

If detectkeyboarddirection is true then:

* If you move an item upwards it will be placed before the item
  selected in the drop menu
* If you move a item downwards it will be placed after the item
  selected in the drop menu
* The item above the one being dragged will now be displayed on
  the drop menu

If detectkeyboarddirection is false there will be no change in
behaviour.
2020-04-03 08:39:31 +01:00
Neill Magill ffe5f336d3 MDL-65539 course: Keyboad drag and drop should not break page
Before this change keyboard drag and drop of sections would alter
the structure of the page.

This occured because in this case the dragnode was the original node
2020-04-03 08:39:30 +01:00
Neill Magill 1c45c9200a MDL-65539 formats: Section labels not updated during move
Before this change when moving a section via drag and drop the
aria-label for the section was not being updated neither was the
title on the drag handle.

The result was the the drop menu on keyboard drag and drop displayed
the wrong information after a section was moved.
2020-04-03 08:39:30 +01:00
Neill Magill 6c8328eb4e MDL-68189 course: Section name change should display in DD menu
Before this patch if a section was renamed inline the old name was
still displayed in the keyboard drag and drop menu until the page
was refreshed.

This change ensures that the two places that section names were not
updated in get changed after an inline update to the name.
2020-04-03 08:38:51 +01:00
Sara Arjona 08a62243c5 weekly release 3.7.5+ 2020-04-02 16:51:11 +02:00
Sara Arjona 4feb95d263 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-04-02 16:51:09 +02:00
Marina Glancy e3e5bdfbe4 MDL-68323 core: add --max-lint-warnings option to grunt 2020-04-02 13:56:25 +02:00
Luca Bösch c074850dc4 MDL-67672 user: Display name in user menu as elsewhere. 2020-04-02 00:17:57 +02:00
Eloy Lafuente (stronk7) 5bfbbb34be Merge branch 'MDL-68265-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-04-01 23:29:31 +02:00
Eloy Lafuente (stronk7) da231a51e0 Merge branch 'MDL-68193_37' of git://github.com/mdjnelson/moodle into MOODLE_37_STABLE 2020-04-01 23:22:43 +02:00
Mark Nelson 47fe981b8e MDL-68193 core: added new database_text_field_content_replaced event 2020-04-01 20:44:33 +02:00
Eloy Lafuente (stronk7) a4087a6cab Merge branch 'MDL-67995-37' of git://github.com/cescobedo/moodle into MOODLE_37_STABLE 2020-04-01 19:11:58 +02:00
Jake Dallimore 965a8fdfc4 Merge branch 'MDL-67672-37' of git://github.com/lucaboesch/moodle into MOODLE_37_STABLE 2020-04-01 16:43:52 +08:00
Sara Arjona ac3c2ec5ba Merge branch 'MDL-68281_37' of https://github.com/stronk7/moodle into MOODLE_37_STABLE 2020-04-01 09:25:38 +02:00
Sara Arjona 68a72085f2 Merge branch 'MDL-68277_37' of https://github.com/timhunt/moodle into MOODLE_37_STABLE 2020-04-01 09:14:57 +02:00
Luca Bösch 1131d828f2 MDL-67672 user: Display name in user menu as elsewhere. 2020-04-01 09:03:30 +02:00
Sara Arjona a7b6456475 Merge branch 'MDL-58964-37' of git://github.com/abias/moodle into MOODLE_37_STABLE 2020-03-31 19:14:05 +02:00
Eloy Lafuente (stronk7) b9a527603d Merge branch 'MDL-64494-37' of git://github.com/bmbrands/moodle into MOODLE_37_STABLE 2020-03-31 18:59:40 +02:00
Bas Brands 1e66dd6de0 MDL-64494 theme_boost: accessible theme colours 2020-03-31 18:55:08 +02:00
Sara Arjona 74b8e6a751 Merge branch 'MDL-66245-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2020-03-31 15:09:22 +02:00
Sara Arjona c137a7d306 MDL-67910 behat: PendingJS improvements for deleteevent modal 2020-03-31 08:43:20 +02:00
Jake Dallimore 7051341ba6 Merge branch 'MDL-68144-37' of git://github.com/lucaboesch/moodle into MOODLE_37_STABLE 2020-03-31 13:59:59 +08:00
Luca Bösch 1db8e1bab4 MDL-68144 mod_folder: make top margins less dominant for folder content 2020-03-31 07:39:17 +02:00
Eloy Lafuente (stronk7) 1da6538756 Merge branch 'MDL-68269-37' of git://github.com/rezaies/moodle into MOODLE_37_STABLE 2020-03-30 22:54:26 +02:00
Eloy Lafuente (stronk7) 5d580ac95c Merge branch 'MDL-68049-37' of https://github.com/spvickers/moodle into MOODLE_37_STABLE 2020-03-30 16:24:15 +02:00
Andrew Nicols f76355db90 Merge branch 'MDL-52319-37-environmentxml' of git://github.com/mudrd8mz/moodle into MOODLE_37_STABLE 2020-03-30 16:55:01 +08:00
Shamim Rezaie 1cdf348ac5 MDL-68269 form: fieldset in group elements should be full width 2020-03-30 18:34:35 +11:00
cescobedo 91e4d8f3d8 MDL-67995 format_singleactivity: Fix dropwdown type of activity 2020-03-30 08:27:10 +02:00
Mikhail Golenkov f8c7167b5d MDL-68223 assign: Fix selection of comment text. 2020-03-30 15:00:36 +11:00
Andrew Nicols 94ec80ae18 MDL-68265 core_question: Switch question import to request dir 2020-03-30 08:14:46 +08:00
Andrew Nicols 6e1a330c81 MDL-68265 mod_lesson: Switch question import to request dir 2020-03-30 08:14:46 +08:00
AMOS bot 752bd12fd4 Automatically generated installer lang files 2020-03-29 00:11:53 +00:00
Eloy Lafuente (stronk7) 6d7e1cfecb MDL-68281 unit test: Include required class
Also, add missing line break, that I did not see 1 week ago.
2020-03-28 16:27:48 +01:00
AMOS bot daa86448e9 Automatically generated installer lang files 2020-03-28 00:11:46 +00:00
Tim Hunt 6536a3ff9b MDL-68277 qtype_essay: answer area in reviews should be right size
The answer box size is set by teachers and provides a useful
visual cue how long a response was expected. Therefore, it is
useful to keep the space at least that size in quiz reviews, etc.
2020-03-27 14:11:45 +00:00
Jake Dallimore 604b2a3b58 weekly release 3.7.5+ 2020-03-27 09:18:33 +08:00
Jake Dallimore 4e3837eda1 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-03-27 09:18:32 +08:00
Eloy Lafuente (stronk7) 3b7037656e Merge branch 'MDL-64429-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-03-26 18:38:57 +01:00
Paul Holden fb6cdb3a9f MDL-64429 tool_usertours: upgrade step to fix existing tours sortorder. 2020-03-26 16:48:51 +00:00
Eloy Lafuente (stronk7) 3e718aff10 Merge branch 'MDL-68183-37-mysqlpwdresetsql' of git://github.com/mudrd8mz/moodle into MOODLE_37_STABLE 2020-03-26 01:18:34 +01:00
Eloy Lafuente (stronk7) 95fce73f16 Merge branch 'MDL-63865-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-03-26 00:32:15 +01:00
Eloy Lafuente (stronk7) 07dbce000c Merge branch 'MDL-67442_37' of https://github.com/jonof/moodle into MOODLE_37_STABLE 2020-03-26 00:08:10 +01:00
Jun Pataleta 9b82b174d0 Merge branch 'MDL-68149_37' of https://github.com/timhunt/moodle into MOODLE_37_STABLE 2020-03-26 00:09:28 +08:00
Jun Pataleta 5d117508d8 Merge branch 'MDL-67024-37' of git://github.com/farhan6318/moodle into MOODLE_37_STABLE 2020-03-25 08:34:12 +08:00
Eloy Lafuente (stronk7) 02d491fe99 Merge branch 'MDL-67731-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-03-25 00:06:22 +01:00
Jake Dallimore 72c744dd22 Merge branch 'MDL-68135-37' of git://github.com/rezaies/moodle into MOODLE_37_STABLE 2020-03-24 12:11:13 +08:00
AMOS bot 58fe4d2cbd Automatically generated installer lang files 2020-03-24 00:11:12 +00:00
Alexander Bias 49361f9a24 MDL-58964 navigation: Reindex array when element is removed 2020-03-23 21:37:00 +01:00
David Mudrák 129c9d4093 MDL-52319 upgrade: Better report the environment checks in CLI scripts
Before we did not display the source of the environment check failure
(whether it was a core check or a plugin) and there was a missing space
before the "Error" status.
2020-03-23 11:27:38 +01:00
Tim Hunt 8475b74d0c MDL-52319 install: Fix some coding style issues 2020-03-23 11:27:38 +01:00
Tim Hunt f246d30831 MDL-52319 upgrade: Also run environment checks if plugins need upgrades
Also perform the environment checks if a plugin triggers the upgrade.
Core upgrade and CLI upgrade was doing this already.
2020-03-23 11:27:38 +01:00
AMOS bot 50f32f791b Automatically generated installer lang files 2020-03-23 00:12:19 +00:00
Paul Holden 88779cc689 MDL-64429 tool_usertours: ensure tour sortorder can't move out of range. 2020-03-22 20:04:08 +00:00
Paul Holden f8f3286267 MDL-63865 tool_dataprivacy: unit test for plugin privacy provider. 2020-03-22 20:00:00 +00:00
Paul Holden b167974308 MDL-67731 backup: fix async restores in progress table listing. 2020-03-22 19:57:46 +00:00
Farhan Karmali 20ecbc885f MDL-67024 Lib: Check if user->mnethostid is set before using it 2020-03-20 11:59:29 +05:30
Adrian Greeve 4980533b75 weekly release 3.7.5+ 2020-03-20 13:35:46 +08:00
Alexander Bias b6d5a6c619 MDL-58964 navigation: Add class attributes to Boost flat navigation 2020-03-19 20:49:45 +01:00
Stephen Vickers 50e3ae359b MDL-68049 mod_lti: Fix link-level memberships service
Fix cause of 404 error
Ensure personal name and email fields are included
Add ext_user_username field when being passed in LTI messages
2020-03-19 11:26:06 +00:00
Adrian Greeve cf65056e46 Merge branch 'MDL-68081-MOODLE_37_STABLE' of https://github.com/kritisingh1/moodle into MOODLE_37_STABLE 2020-03-19 11:29:03 +08:00
Adrian Greeve 6c47187329 Merge branch 'MDL-68014-37' of git://github.com/peterRd/moodle into MOODLE_37_STABLE 2020-03-19 11:06:09 +08:00
Jun Pataleta a471a106c4 Merge branch 'MDL-68108-37' of git://github.com/crazyserver/moodle into MOODLE_37_STABLE 2020-03-18 22:59:34 +08:00
Pau Ferrer Ocaña 5ce5abcd67 MDL-68108 formslib: Add element password inline template 2020-03-18 08:46:04 +01:00
Adrian Greeve 73aac2ea23 Merge branch 'MDL-67901-37' of git://github.com/bmbrands/moodle into MOODLE_37_STABLE 2020-03-18 10:01:16 +08:00
David Mudrák e8ae8a8a76 MDL-68183 auth: Fix the performance of get_complete_user_data search
When searching for the user by a case-insensitive field (email address
is the only one supported now), the performance may be very poor as the
DB cannot use the index due to the LOWER() operation and the full
sequential scan of all the user records is performed. On some DBs such
as MySQL, this can be significantly improved by pre-filtering the users
with accent-insensitive search.

So we first perform accent-insensitive search for potential candidates
in a subselect, which can use the index. Only then we perform the
additional accent-sensitive search on this limited set or records.
2020-03-17 14:52:25 +01:00
David Mudrák 39901e1577 MDL-68183 auth: Fix the performance of signup_validate_data search query
When searching for other users with the same email address, we perform
the case-insensitive and accent-sensitive search. That may be expensive
as some DBs such as MySQL cannot use the index in that case. Instead,
sequential scan of all the user records is performed and the comparison
uses the LOWER function to filter the matching records. This leads to
significant performance heavy queries which in turn represent a surface
for DoS attacks.

For that reason, we first perform accent-insensitive search for
potential candidates in a subselect, which can use the index. Only then
we perform the additional accent-sensitive search on this limited set or
records.
2020-03-17 14:52:25 +01:00
David Mudrák 7a87e8a911 MDL-68183 auth: Fix the performance of forgotten password user search
When searching for the user matching the given email address, we perform
the case-insensitive and accent-sensitive search. That may be expensive
as some DBs such as MySQL cannot use the index in that case. Instead,
sequential scan of all the user records is performed and the comparison
uses the LOWER function to filter the matching records. This leads to
significant performance heavy queries which in turn represent a surface
for DoS attacks.

For that reason, we first perform accent-insensitive search for
potential candidates, which can use the index. Only then we perform the
additional accent-sensitive search on this limited set or records.
2020-03-17 14:52:24 +01:00
Adrian Greeve 5fd324e17e Merge branch 'MDL-67970-37' of git://github.com/rezaies/moodle into MOODLE_37_STABLE 2020-03-17 15:26:10 +08:00
Shamim Rezaie 50889d5519 MDL-67970 output: use fieldset in core/chooser instead of label 2020-03-17 18:20:43 +11:00
Shamim Rezaie 1cc8177b73 MDL-67970 core: remove unnecessary roles
- The navigation role is unnecessary for element nav
- The textbox role is unnecessary for element textarea
2020-03-17 18:20:43 +11:00
Shamim Rezaie 8b33494324 MDL-67970 output: replace new-sections attribute with data-new-sections
new-sections is not a valid attribute name for the a element.
Replaced that with data-new-sections
2020-03-17 18:20:43 +11:00
Shamim Rezaie 8e2494b4b2 MDL-67970 output: fixed duplicate id attribute
action_menu::export_for_template generates the id attributes and send it
to core/action_menu_trigger template as part of the attributes variable.
2020-03-17 18:20:43 +11:00
Shamim Rezaie 941a4c10cd MDL-67970 search: fixed stray end tag (input) 2020-03-17 18:20:43 +11:00
Adrian Greeve 853fc48867 Merge branch 'MDL-67981_37' of https://github.com/timhunt/moodle into MOODLE_37_STABLE 2020-03-17 11:33:40 +08:00
Jonathon Fowler 4ca4651f20 MDL-67442 assign: expand/contract text works in all browsers now 2020-03-16 08:59:49 +10:00
kritisingh1 36223fbee8 MDL-68081 Groups: Fixes string error in member removal function 2020-03-14 23:19:53 +05:30
Victor Deniz Falcon 9d08ae36e9 weekly release 3.7.5+ 2020-03-12 14:22:14 +00:00
Victor Deniz Falcon ed34ac0a7c Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-03-12 14:22:09 +00:00
Eloy Lafuente (stronk7) ea02bf99d7 Merge branch 'MDL-66607-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-03-12 10:10:58 +01:00
Eloy Lafuente (stronk7) 52491c6cc7 Merge branch 'MDL-68125-regression-MOODLE_37_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_37_STABLE 2020-03-12 01:19:51 +01:00
Brendan Heywood 5c39f8969d MDL-68125 core: Fixed $CFG->reverseproxyignore install regression 2020-03-12 09:54:35 +11:00
Eloy Lafuente (stronk7) c86fa207a2 Merge branch 'MDL-68061-37' of git://github.com/mickhawkins/moodle into MOODLE_37_STABLE 2020-03-11 22:56:39 +01:00
Tim Hunt 631b1f77f0 MDL-68149 qtype_match: correctly distinguish 0 and 0.0 answers
Also added a test for backup & restore (which was working).
2020-03-11 13:45:15 +00:00
Tim Hunt ec67d8b676 MDL-68149 qtype_match: Updatey tests to follow make_question() pattern 2020-03-11 13:45:13 +00:00
Andrew Nicols 9ceb49dca0 MDL-66607 message: Add pendingJS checks 2020-03-11 20:46:00 +08:00
Andrew Nicols 147087cdd2 MDL-66607 message: Resolve race conditions in message deletion process
This commit makes several changes:
1) Explicitly stop polling for messages when a conversation is deleted;
2) Check for deleted conversations when displaying new messages;
3) Do not add a new empty conversation; and
4) Introduce pendingJS checks to ensure that Behat waits for messags to finish rendering.
2020-03-11 20:43:25 +08:00
Andrew Nicols 9800e5ca6f Merge branch 'MDL-68146_37' of https://github.com/stronk7/moodle into MOODLE_37_STABLE 2020-03-11 11:52:26 +08:00
Eloy Lafuente (stronk7) ab0f20b63b MDL-68146 forms: remove duped help and advanced icons in checkboxes
They are exceptionally shown later, after the checkbox text already.

This is a fix for the regression introduced by MDL-63424.
2020-03-10 23:04:50 +01:00
Eloy Lafuente (stronk7) 739a18df53 Merge branch 'MDL-65724-37-3' of git://github.com/peterRd/moodle into MOODLE_37_STABLE 2020-03-10 13:51:36 +01:00
Eloy Lafuente (stronk7) bb66bd562f Merge branch 'MDL-67189-37' of git://github.com/dpalou/moodle into MOODLE_37_STABLE 2020-03-10 11:30:49 +01:00
Shamim Rezaie 3aba5ed0ce MDL-68135 output: remove the presentation role from user pic
"presentation" is not a valid role for the img element.
Moreover, it doesn't make sense to have both role="presentation" and
aria-hidden="true" for an element at the same time.
For more info please see:
https://timwright.org/blog/2016/11/19/difference-rolepresentation-aria-hiddentrue/
2020-03-10 19:06:18 +11:00
Dani Palou 3ec126df58 MDL-67189 external: Add test to catch PHP exceptions 2020-03-10 08:32:24 +01:00
Dani Palou 59964c5c95 MDL-67189 external: Catch Throwable in call_external_function 2020-03-10 08:32:24 +01:00
Eloy Lafuente (stronk7) 61e4180191 Merge branch 'MDL-67827-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-03-09 20:36:29 +01:00
Sara Arjona 23739a476a Merge branch 'MDL-66671-m37-master' of https://github.com/dthies/moodle into MOODLE_37_STABLE 2020-03-09 18:49:25 +01:00
Sara Arjona 8f39f26b9e Merge branch 'MDL-67968-37' of git://github.com/rezaies/moodle into MOODLE_37_STABLE 2020-03-09 18:17:14 +01:00
Sara Arjona 012dde7fe7 Merge branch 'MDL-67902-37' of git://github.com/rezaies/moodle into MOODLE_37_STABLE 2020-03-09 15:06:58 +01:00
Andrew Nicols 1d77fbd497 MDL-67827 behat: Pending JS improvements for dialogues 2020-03-09 08:31:21 +08:00
Andrew Nicols d3ce732601 MDL-67827 behat: Add missing exception use 2020-03-09 08:31:21 +08:00
AMOS bot 838193097d Automatically generated installer lang files 2020-03-09 00:12:02 +00:00
Tim Hunt 0c90bc8cd3 MDL-67981 questions: avoid errors deleting contextless questions 2020-03-06 18:05:33 +00:00
Shamim Rezaie 80011bdf57 MDL-67968 calendar: use aria-label instead of the abbr tag 2020-03-07 04:19:54 +11:00
Shamim Rezaie 17c23edcd1 MDL-67968 calendar: explain weekday abbreviations 2020-03-07 04:19:09 +11:00
Shamim Rezaie 6f0b92e97c MDL-67968 form: not to put empty label when no label is available 2020-03-07 04:19:09 +11:00
Shamim Rezaie e0f6182508 MDL-67968 question: do not display sr-only legends
.accesshide was removed because:
 1. It was only kept in case it's still used somewhere, in a custom form
 field for instance.
 2. It was broken since 3.5 where we integrated
 https://github.com/bmbrands/moodle/compare/ab65b87f3d...MDL-62419-master
 So it's been ages that the reason mentioned on point 1 was not being
 satisfied
2020-03-07 04:19:09 +11:00
Shamim Rezaie d1084b4c26 MDL-67968 form: grouped element label fix 2020-03-07 04:19:09 +11:00
Sara Arjona 805361d871 Moodle release 3.7.5 2020-03-06 12:34:06 +01:00
Peter 2e3d05e591 MDL-65724 core: Force restore to use the settings from the plan
When importing use the import settings.
2020-03-06 14:20:43 +08:00
AMOS bot 8d68b0b251 Automatically generated installer lang files 2020-03-06 00:10:59 +00:00
Peter Dias 5b8b45410c MDL-68014 lti: Remove alt text for image 2020-03-06 07:56:55 +08:00
Sara Arjona efc431ba0d weekly release 3.7.4+ 2020-03-05 17:31:24 +01:00
Sara Arjona 9df4aa7210 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-03-05 17:31:20 +01:00
Michael Hawkins 8481609ba4 MDL-67861 core: Fix getremoteaddr unit test to match new proxy setup 2020-03-05 14:39:55 +08:00
Brendan Heywood 194406e923 MDL-67861 core: Added $CFG->reverseproxyignore IP subnet list
If your server is behind multiple reverse proxies that append to the
X-Forwarded-For header then you will need to specify a comma separated
list of ip addresses or subnets of the reverse proxies to be ignored
in order to find the users correct IP address.
2020-03-05 01:27:48 +01:00
Brendan Heywood c4665bcf95 MDL-67861 libraries: Refactor is_ip_in_subnet_list in ip_utils 2020-03-05 01:27:48 +01:00
Brendan Heywood c70d7d0386 MDL-67861 admin: Default $CFG->getremoteaddrconf to only use REMOTE_ADDR 2020-03-05 01:27:48 +01:00
Brendan Heywood 4a3a673d1e MDL-67861 core: Use last ip in X-Forwarded-For list 2020-03-05 01:27:48 +01:00
Andrew Nicols 31260f8667 MDL-65106 theme_classic: Remove unused variable 2020-03-05 08:17:03 +08:00
Andrew Nicols cb3deb89c1 Merge branch 'MDL-65106-37' of git://github.com/bmbrands/moodle into MOODLE_37_STABLE 2020-03-05 08:16:45 +08:00
Eloy Lafuente (stronk7) b21aad0837 Merge branch 'MDL-62768-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-03-04 18:37:28 +01:00
Bas Brands 43b11cfc9e MDL-67901 type_multichoice: clear my choice accessibility
Improve the accessibility for the clear my choice option. The
extra radio input controlling the reset feature was removed and
resetting the choice is now controlled by JavaScript.
This fixes the missing label reported in Accessibility audit and W3C
validation of the reset link

By this change this issue also fixes MDL-67280
2020-03-04 17:04:18 +01:00
Sara Arjona 8ba10c6666 Merge branch 'MDL-67767-37' of git://github.com/dpalou/moodle into MOODLE_37_STABLE 2020-03-04 15:05:07 +01:00
Dani Palou b7b45f8c0b MDL-67767 tool_mobile: Allow using more characters in forcedurlscheme 2020-03-04 14:25:25 +01:00
Sara Arjona a2ff87ba44 Merge branch 'MDL-67863-37' of git://github.com/bmbrands/moodle into MOODLE_37_STABLE 2020-03-04 14:06:34 +01:00
Sara Arjona 53a3991927 Merge branch 'MDL-67969-37' of git://github.com/rezaies/moodle into MOODLE_37_STABLE 2020-03-04 12:58:27 +01:00
Marina Glancy 6b502fbc2b MDL-56287 gradereport_history: Separate groups queries improved 2020-03-04 11:47:33 +01:00
Jun Pataleta 8509f1feb4 MDL-56287 gradereport_history: Show users from groups that can be viewed 2020-03-04 11:47:33 +01:00
Eloy Lafuente (stronk7) b692832347 Merge branch 'MDL-67641-37' of git://github.com/dpalou/moodle into MOODLE_37_STABLE 2020-03-04 10:48:05 +01:00
Sara Arjona a5a6a9c91c Merge branch 'MDL-68008-37' of git://github.com/ferranrecio/moodle into MOODLE_37_STABLE 2020-03-04 08:41:43 +01:00
Dani Palou 25c09b1b1d MDL-67641 auth: Fix shortname type in get_signup_settings WS 2020-03-04 08:12:13 +01:00
AMOS bot f00ddea3fc Automatically generated installer lang files 2020-03-04 00:11:19 +00:00
Eloy Lafuente (stronk7) 4caf331102 Merge branch 'MDL-67728-37' of git://github.com/crazyserver/moodle into MOODLE_37_STABLE 2020-03-03 19:50:26 +01:00
Eloy Lafuente (stronk7) 0705bb0c07 Merge branch 'MDL-67971-37' of git://github.com/sarjona/moodle into MOODLE_37_STABLE 2020-03-03 19:02:38 +01:00
Sara Arjona 4748f89945 Merge branch 'MDL-67993-37' of git://github.com/lameze/moodle into MOODLE_37_STABLE 2020-03-03 18:06:50 +01:00
Ferran Recio f0abaec208 MDL-68008 tool_capability: shows multiple contexts when overrides exists 2020-03-03 17:54:26 +01:00
Sara Arjona 2933c4e061 Merge branch 'MDL-68048-37-behatnotfound' of git://github.com/mudrd8mz/moodle into MOODLE_37_STABLE 2020-03-03 17:02:11 +01:00
Sara Arjona b808efac50 Merge branch 'MDL-68060-37-huburlcompare' of git://github.com/mudrd8mz/moodle into MOODLE_37_STABLE 2020-03-03 13:10:24 +01:00
Sara Arjona 0df30e445f Merge branch 'MDL-67891-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-03-03 12:48:35 +01:00
Bas Brands d4f03eb0b1 MDL-65106 theme_classic: set custom navigationitem icon 2020-03-03 11:53:48 +01:00
Sara Arjona 635b4db751 Merge branch 'MDL-63316-37' of https://github.com/azito122/moodle into MOODLE_37_STABLE 2020-03-03 11:11:05 +01:00
Sara Arjona 1821997b7c Merge branch 'MDL-67945-37' of git://github.com/ferranrecio/moodle into MOODLE_37_STABLE 2020-03-03 10:10:58 +01:00
Sara Arjona a97fde462d Merge branch 'MDL-67749-37' of git://github.com/dpalou/moodle into MOODLE_37_STABLE 2020-03-03 09:30:50 +01:00
Adrian Hutchinson 9bcfb74256 MDL-67988 mod_lti: remove padding from JWS base64url encoding 2020-03-02 14:01:36 +01:00
Paul Holden c0fdc91ea3 MDL-67891 tool_cohortroles: move upgrade step inside plugin.
The step added in MDL-67458 was added to core, which broke the upgrade
process if this plugin had been uninstalled prior.
2020-03-02 08:50:27 +00:00
Sara Arjona da1d1af843 MDL-67971 core_badges: review issuer URL 2020-03-02 08:02:40 +01:00
Andrew Zito 85d5216840 MDL-63316 participants: lastname sort for participants table 2020-02-28 14:33:27 -05:00
Daniel Thies 2337123e89 MDL-66671 enrol_lti: Skip grade sync when cm deleted 2020-02-28 09:29:32 -06:00
Eloy Lafuente (stronk7) 95eb7d8343 weekly release 3.7.4+ 2020-02-28 12:22:35 +01:00
Bas Brands 720a26266a MDL-67863 theme_boost: change keyboard tab order
Move navdrawer up in the dom for a more logical tab order
Hide navdrawer links for tab / screenreader when navdrawer is closed
2020-02-27 17:12:47 +01:00
Michael Hawkins 1187f828b7 MDL-68061 gradereport_history: Restrict per page config value to int 2020-02-27 15:44:49 +08:00
Eloy Lafuente (stronk7) 37906d63f9 Merge branch 'MDL-67865-37' of git://github.com/rezaies/moodle into MOODLE_37_STABLE 2020-02-26 23:37:10 +01:00
Eloy Lafuente (stronk7) 870e202546 Merge branch 'MDL-64686-37' of git://github.com/lucaboesch/moodle into MOODLE_37_STABLE 2020-02-26 23:27:44 +01:00
Eloy Lafuente (stronk7) 50a72fbcd6 Merge branch 'MDL-67758-37' of git://github.com/dpalou/moodle into MOODLE_37_STABLE 2020-02-26 17:36:07 +01:00
Claude Vervoort b3172cc0fd MDL-67132 mod_lti: document new param
(amended to move the upgrade.txt info to correct 3.7.5)
2020-02-26 17:29:21 +01:00
Claude Vervoort dc39cee4f9 MDL-67132 mod_lti: call grade api to trigger course total computation 2020-02-26 17:27:33 +01:00
Eloy Lafuente (stronk7) f05ff7a66d Merge branch 'MDL-67979-37-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_37_STABLE 2020-02-26 17:13:47 +01:00
Anthony Forth cb2a49009c MDL-67945 enrol: missing $DB in edit_instance_form 2020-02-26 16:37:14 +01:00
David Mudrák b541ee20fb MDL-68060 registration: Improve the sites directory location check
This allows to define the custom HUB_MOODLEORGHUBURL with HTTP Basic
Auth credentials so that the registration features can be tested against
our staging site.
2020-02-26 10:59:27 +01:00
Jun Pataleta c975694cf5 Merge branch 'MOODLE_37_MDL-67980' of https://github.com/golenkovm/moodle into MOODLE_37_STABLE 2020-02-26 14:30:30 +08:00
Shamim Rezaie 8c39267d92 MDL-67969 lib: Fix duplicate blockinstanceid for fake blocks 2020-02-26 16:38:52 +11:00
Shamim Rezaie 45f1ddae59 MDL-67902 calendar: keyboard users should be able to toggle day popover 2020-02-26 16:35:59 +11:00
Shamim Rezaie a45fa24362 MDL-67902 calendar: informative aria label for event days in mini cals 2020-02-26 16:35:59 +11:00
Shamim Rezaie e127e819e6 MDL-67902 calendar: informative aria label for event days in calendar 2020-02-26 16:35:59 +11:00
Shamim Rezaie ce5337c902 MDL-67902 calendar: Fix label of the course filter in calendar 2020-02-26 16:35:59 +11:00
David Balch b74030550e MDL-67993 roles: Fix pix_icon() calls. 2020-02-26 12:15:42 +08:00
Eloy Lafuente (stronk7) 2cfcae67a0 Merge branch 'MDL-67644-37' of git://github.com/dpalou/moodle into MOODLE_37_STABLE 2020-02-26 00:10:24 +01:00
Eloy Lafuente (stronk7) dbb784d1ab Merge branch 'MDL-67806-37' of git://github.com/dpalou/moodle into MOODLE_37_STABLE 2020-02-25 23:58:17 +01:00
Paul Holden be941e5a05 MDL-62768 tool_policy: add page title & breadcrumb navigation. 2020-02-25 22:06:04 +00:00
Paul Holden 87080161e0 MDL-62768 tool_dataprivacy: add page breadcrumbs to navigation. 2020-02-25 21:36:46 +00:00
Helen Foster 62931543fb MDL-67979 lang: Import fixed English strings (en_fix)
Significant string changes:

* configcustommenuitems,core_admin - corrected example
* custommenuitems_desc,tool_mobile - fallback behaviour of custom menu
  items in the app
2020-02-25 12:24:44 +01:00
Eloy Lafuente (stronk7) 3cb6a5a3b2 Merge branch 'MDL-67862-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2020-02-25 12:09:58 +01:00
Eloy Lafuente (stronk7) 765aef276c Merge branch 'MDL-67364-37' of git://github.com/mickhawkins/moodle into MOODLE_37_STABLE 2020-02-25 12:05:57 +01:00
David Mudrák 2da65dae97 MDL-68048 behat: Fix the ElementNotFoundException message wording
The exception class itself adds the "not found" to the error message.
2020-02-25 11:55:59 +01:00
Mikhail Golenkov 4be6148785 MDL-67980 tasks: Sort ad-hoc tasks by nextruntime. 2020-02-24 09:36:57 +11:00
Pau Ferrer Ocaña 5e4ffd0559 MDL-67728 behat: Increase app start timeout 2020-02-21 12:45:58 +01:00
Pau Ferrer Ocaña 99d5aff09b MDL-67728 behat: Improve behat app selectors 2020-02-21 12:45:58 +01:00
Luca Bösch ae31e9dfa8 MDL-64686 theme: align course search form for small screens sizes. 2020-02-21 06:35:11 +01:00
Jun Pataleta d077ffd3a5 weekly release 3.7.4+ 2020-02-21 11:03:08 +08:00
Jun Pataleta c61f9a4484 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-02-21 11:02:29 +08:00
Eloy Lafuente (stronk7) 37ef74572d Merge branch 'MDL-67727-37' of git://github.com/crazyserver/moodle into MOODLE_37_STABLE 2020-02-20 16:13:02 +01:00
Luke Tucker d08e7b7e8a MDL-50455: tool_capability: Use static cache when loading context data 2020-02-20 00:30:16 +01:00
Eloy Lafuente (stronk7) 4441cfe9ce Merge branch 'MDL-67942-37' of https://github.com/HuongNV13/moodle into MOODLE_37_STABLE 2020-02-19 19:18:58 +01:00
Eloy Lafuente (stronk7) 9dd7ac3bc3 Merge branch 'MDL-67947_37' of https://github.com/timhunt/moodle into MOODLE_37_STABLE 2020-02-19 17:48:50 +01:00
Tim Hunt 2a912052bc MDL-67947 questions: questions_in_use should ask all components
Previously it was only checking mods.
2020-02-19 11:56:31 +00:00
Dani Palou addc07be5a MDL-67749 ws: Set private token when reset or manual create token 2020-02-19 12:05:05 +01:00
Huong Nguyen 6aaa78f044 MDL-67942 Quiz: Quiz attempt report delete_selected_attempts issue 2020-02-19 15:36:38 +07:00
Eloy Lafuente (stronk7) 6ffe3ecc9f Merge branch 'MDL-67471_37' of https://github.com/t-schroeder/moodle into MOODLE_37_STABLE 2020-02-18 23:54:55 +01:00
Eloy Lafuente (stronk7) c4b472700b Merge branch 'MDL-61390-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2020-02-18 19:06:39 +01:00
Eloy Lafuente (stronk7) 414a461e41 Merge branch 'MDL-67953-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-02-18 18:07:45 +01:00
Shamim Rezaie 952d572921 MDL-67865 output: Fix id of the dropdown trigger 2020-02-18 16:20:15 +11:00
Andrew Nicols fc01f863d3 MDL-67953 grunt: Spawn new process for gherkinlint
Gherkinlint stores the list of processed features for duplicate
detection in an Object which is statically defined.
This causes it to bleed between runs.

To alleviate this we must spawn a new process.

Prior to this patchset we were calling a new Gherkinlint process which
had the same effect anyway.
2020-02-18 08:24:13 +08:00
Eloy Lafuente (stronk7) 1b43f6b06d Merge branch 'MDL-61389-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2020-02-17 23:30:17 +01:00
Eloy Lafuente (stronk7) 86f297c7c2 Merge branch 'MDL-67817-m37-master' of https://github.com/dthies/moodle into MOODLE_37_STABLE 2020-02-17 22:09:39 +01:00
Tim Schroeder 21bac71bef MDL-67471 message: fixed mark_notification_read with messaging disabled 2020-02-17 09:16:57 +01:00
Jun Pataleta b400040cff MDL-61390 mod_forum: Create template for forum search results 2020-02-17 15:58:16 +08:00
Jun Pataleta 0846b4af08 MDL-61389 mod_forum: Descriptive aria-label for "Discuss this topic" 2020-02-17 15:52:20 +08:00
AMOS bot d927703799 Automatically generated installer lang files 2020-02-16 00:11:18 +00:00
Daniel Thies 8fedcb49a5 MDL-67817 core_date: Add test for timezone localization strings 2020-02-14 11:54:55 -06:00
Daniel Thies 0c9fe38643 MDL-67817 core_lang: Update timezone strings 2020-02-14 11:54:55 -06:00
Sara Arjona 5c7966eacf weekly release 3.7.4+ 2020-02-14 12:12:07 +01:00
Sara Arjona 0ee03dd15a Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-02-14 12:12:05 +01:00
Jun Pataleta 6dbf1dee71 Merge branch 'MDL-67965-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-02-14 13:25:01 +08:00
Andrew Nicols a884eea913 MDL-67965 behat: Get theme-specific context classes correctly 2020-02-14 10:15:49 +08:00
Michael Hawkins b41b74aacb MDL-67364 output: Add unit testing for editor_scss_to_css 2020-02-13 22:53:31 +08:00
Michael Hawkins fa0e63f9da MDL-67364 output: Allow child themes to use parent editor_scss config
This still allows child themes to override editor_scss, but will fall
back to what the parent is using if they do not specify it. This
negates the need for every child them to have the config duplicated
in order to utilise it.
2020-02-13 22:53:31 +08:00
Pau Ferrer Ocaña 306eaa606f MDL-67727 behat: Reset ionic app properly 2020-02-13 08:37:22 +01:00
Andrew Nicols 9ff79ab562 MDL-67953 grunt: Work around spawn length limits 2020-02-13 14:21:49 +08:00
Eloy Lafuente (stronk7) 4011bfc71f Merge branch 'MDL-67876_37' of https://github.com/timhunt/moodle into MOODLE_37_STABLE 2020-02-12 15:49:47 +01:00
Dani Palou dedb1592cb MDL-67644 tool_mobile: Add OAuth 2 providers in disabled features 2020-02-12 14:13:19 +01:00
Tim Hunt 603e31b820 MDL-67876 forms: not all field types need validation JS 2020-02-12 10:04:20 +00:00
Eloy Lafuente (stronk7) 3dab17b872 Merge branch 'MDL-67532-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-02-11 23:08:18 +01:00
Sara Arjona e81b6194e6 Merge branch 'MDL-59303-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-02-11 13:52:41 +01:00
Sara Arjona b54c18392f Merge branch 'MDL-66847-37' of git://github.com/lucaboesch/moodle into MOODLE_37_STABLE 2020-02-11 12:28:56 +01:00
Sara Arjona 7960af6567 Merge branch 'MDL-66834-MOODLE_37_STABLE' of https://github.com/kepeter/moodle into MOODLE_37_STABLE 2020-02-11 11:54:31 +01:00
Sara Arjona f24cc998f0 Merge branch 'mdl67142-moodle37' of https://github.com/AngadSethi/moodle into MOODLE_37_STABLE 2020-02-11 10:19:10 +01:00
Sara Arjona 07265da01c Merge branch 'MDL-67894-37' of https://github.com/grabs/moodle into MOODLE_37_STABLE 2020-02-11 08:20:49 +01:00
Dani Palou 6b2bbcbb0e MDL-67758 airnotifier: Send wwwroot to airnotifier 2020-02-10 11:55:52 +01:00
Dani Palou c1bc5df576 MDL-67806 tool_mobile: Add Dark mode option in disabled features
We must allow site admins to remotely disable that feature in the app
2020-02-10 11:53:52 +01:00
Jun Pataleta 750218868a MDL-66245 privacy: Encode each part of the data URL instead of the whole 2020-02-10 16:57:10 +08:00
Jun Pataleta 18aabbd5d5 MDL-67862 message: Render dialogue header only when necessary 2020-02-10 13:16:19 +08:00
Angad Sethi 4f5e2fc266 MDL-67142 quiz: fixed error when deleting saved questions long-name-quiz
An error was showing up while deleting questions
(in the question_save_from_deletion method) which had been saved
and which belonged to a quiz with a super long name, not exceeding 255
characters, as the 'name' field in 'question_categories' table had a
max size of 255 characters. The shorten_text function was used to
shorten the string to 255 characters and a unit test was added with
the name test_question_save_from_deletion_quiz_with_long_name to test
the patch.
2020-02-08 19:49:57 +05:30
AMOS bot ba801e68d7 Automatically generated installer lang files 2020-02-08 00:12:03 +00:00
Andreas Grabs fbd65fabb2 MDL-67894 mod_feedback: database error on show responses 2020-02-07 18:48:24 +01:00
Paul Holden ee0f61cde4 MDL-59303 auth_shibboleth: consistent readme URL. 2020-02-07 14:25:35 +00:00
Luca Bösch 5779862ee7 MDL-66847 webservice: Correct breadcrumb + title for ws documentation. 2020-02-07 14:38:35 +01:00
Paul Holden 9a49f51b15 MDL-67532 badges: better default for new badge language. 2020-02-07 09:47:13 +00:00
Sara Arjona 59f947667a weekly release 3.7.4+ 2020-02-07 09:44:52 +01:00
Sara Arjona 6733f41ed1 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-02-07 09:44:49 +01:00
Brendan Heywood 867d9497f3 MDL-67726 tool_phpunit: add missing input escaping 2020-02-06 19:45:50 +01:00
Andrew Nicols a9895627a4 Merge branch 'MDL-67175-37' of git://github.com/ferranrecio/moodle into MOODLE_37_STABLE 2020-02-06 10:21:33 +08:00
Eloy Lafuente (stronk7) 1a75be0645 Merge branch 'MDL-67832_37' of https://github.com/timhunt/moodle into MOODLE_37_STABLE
(fixed a couple of typos in the merge commit)
2020-02-06 00:03:16 +01:00
Eloy Lafuente (stronk7) 53c3b1bacc Merge branch 'MDL-67732-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-02-05 20:05:58 +01:00
Eloy Lafuente (stronk7) 730714bc78 Merge branch 'MDL-67830_37' of https://github.com/timhunt/moodle into MOODLE_37_STABLE 2020-02-05 19:08:25 +01:00
Tim Hunt 4a0abc17d4 MDL-67876 forms: scroll to any invalid element if form cannot submit 2020-02-05 12:22:12 +00:00
Andrew Nicols 7eaadb4bdb Merge branch 'MDL-49103-37' of git://github.com/sarjona/moodle into MOODLE_37_STABLE 2020-02-05 13:52:36 +08:00
Eloy Lafuente (stronk7) 2f88edd0c9 Merge branch 'MDL-67842_37' of https://github.com/timhunt/moodle into MOODLE_37_STABLE 2020-02-04 22:46:37 +01:00
Eloy Lafuente (stronk7) 03721f06fb Merge branch 'MDL-63424-37' of git://github.com/lucaboesch/moodle into MOODLE_37_STABLE 2020-02-04 19:28:53 +01:00
Eloy Lafuente (stronk7) c0b25af986 Merge branch 'MDL-66875-37' of git://github.com/lucaboesch/moodle into MOODLE_37_STABLE 2020-02-04 19:02:41 +01:00
Sara Arjona d869324747 MDL-49103 badges: bake badges with iTXt chunk instead of tEXt
The final OB 1.0 specification changed the baking badges method
from tEXt to iTXt. Besides, the iTXt chunk should be a signed
assertion or the raw JSON (instead of the assertion URL).
This has been changed in order to make Moodle OB compliant.

Yuliya Bozhko, thanks for the patch! :-)
2020-02-04 18:49:55 +01:00
Ferran Recio 1b1cf1b950 MDL-67175 mod_scorm: fixing js eslint errors 2020-02-04 12:37:31 +01:00
Sam Hemelryk d66d85a4d7 MDL-67175 mod_scorm: sync XHR requests use sendBeacon when available
Totara reference TL-22621 (original code by Sam Hemelryk)
https://github.com/moodle/moodle/commit/2add402f8183c50bc1238ef2da5ea9cd06cb1dd9
2020-02-04 12:37:31 +01:00
Brendan Cox 67d4f4ea65 MDL-67175 session: set SameSite=None for Chrome 78 and above
Totara reference TL-22311 (original code by Brendan Cox and Sam Hemelryk)
https://github.com/moodle/moodle/commit/a3f4de2b7efe66de6617a67ce7c87f2862e76ac6
2020-02-04 12:37:15 +01:00
Andrew Nicols fe1b4bee20 Merge branch 'MDL-60126-37-3' of git://github.com/mihailges/moodle into MOODLE_37_STABLE 2020-02-04 14:40:48 +08:00
Peter 6292c6299b MDL-60126 competency: Unit tests 2020-02-04 08:55:51 +08:00
Simey Lameze 22177c5c3e MDL-60126 core: upgrade step to clean user comp 2020-02-04 08:55:42 +08:00
Simey Lameze 9f2e264fd8 MDL-60126 competency: delete content upon user delete 2020-02-04 08:40:31 +08:00
AMOS bot e1b1a447b5 Automatically generated installer lang files 2020-02-04 00:11:23 +00:00
Peter Eliyahu Kornfeld eaf2d6a809 MDL-66834 Questions: add transaction, move trigger 2020-02-03 12:26:36 +02:00
Tim Hunt a8e2b5cea1 MDL-67842 questions: Cannot remove the idnumber from a question 2020-02-03 09:49:50 +00:00
Tim Hunt 7fda2e9bac MDL-67832 quiz: fix lots of PHPdoc in attemptlib.php 2020-01-31 19:09:44 +00:00
Paul Holden ea01c38f2c MDL-67732 group: observe viewfullnames capability.
Backport from MDL-67245.
2020-01-31 16:48:15 +00:00
Eloy Lafuente (stronk7) ee0a8161dd weekly release 3.7.4+ 2020-01-30 16:11:20 +01:00
Eloy Lafuente (stronk7) 8adff28414 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-01-30 16:11:17 +01:00
Jun Pataleta 020810aea0 Merge branch 'MDL-67353_reset_37' of https://github.com/stronk7/moodle into MOODLE_37_STABLE 2020-01-30 12:35:00 +08:00
Eloy Lafuente (stronk7) 56930d1d67 MDL-67353 course: move form tearDown() to reset_all_data()
We are already cleaning all sort of caches, statics, singletons
there and it's better to ensure they are always reset to avoid
myterious failures @ distance.
2020-01-30 00:02:03 +01:00
Michelle Melton 2ec76277dc MDL-64169 course: fix padding when display on one section per page
(amended to keep the $o.= consistent with surrounding code)
2020-01-29 22:36:16 +01:00
Tim Hunt bfff57b297 MDL-67830 quiz: notice in grade details redirect script 2020-01-29 18:35:17 +00:00
Jun Pataleta 5e7c5b9cec Merge branch 'MDL-67626_37' of git://github.com/adpe/moodle into MOODLE_37_STABLE 2020-01-29 21:36:41 +08:00
Adrian Greeve caa236c415 Merge branch 'MDL-67768-37-componentdirs' of git://github.com/mudrd8mz/moodle into MOODLE_37_STABLE 2020-01-29 10:04:13 +08:00
Eloy Lafuente (stronk7) 52a77683aa Merge branch 'MDL-67472-37' of git://github.com/bmbrands/moodle into MOODLE_37_STABLE 2020-01-28 22:59:36 +01:00
Eloy Lafuente (stronk7) 6afb3736f8 Merge branch 'MDL-52189_37' of https://github.com/jonof/moodle into MOODLE_37_STABLE 2020-01-28 22:45:34 +01:00
Eloy Lafuente (stronk7) 96582b63db Merge branch 'MDL-67447-37-autocomplete' of git://github.com/mudrd8mz/moodle into MOODLE_37_STABLE 2020-01-28 22:24:43 +01:00
Eloy Lafuente (stronk7) a5e149a1b7 Merge branch 'MDL-67722-37' of git://github.com/mickhawkins/moodle into MOODLE_37_STABLE 2020-01-28 20:13:52 +01:00
Eloy Lafuente (stronk7) 7cf3a406ff Merge branch 'MDL-57755_37' of https://github.com/t-schroeder/moodle into MOODLE_37_STABLE 2020-01-28 10:35:07 +01:00
David Mudrák 25d1533b27 MDL-67768 core: Add some common dirs to core_component::$ignoreddirs
The core_component::$ignoreddirs lists all directories that are reserved
and cannot be used as valid plugin names. This is particularly important
for some plugin types such as 'webservice' that share the same root
location as the core subsystem of the same name.
2020-01-28 10:34:38 +01:00
Adrian Greeve 462c6e9e2c Merge branch 'MDL-67740-37-behatstepsfilter' of git://github.com/mudrd8mz/moodle into MOODLE_37_STABLE 2020-01-28 15:08:59 +08:00
Adrian Greeve 1db5a1205e Merge branch 'MOODLE_37_MDL-67746' of https://github.com/golenkovm/moodle into MOODLE_37_STABLE 2020-01-28 13:14:55 +08:00
AMOS bot c3c7b02867 Automatically generated installer lang files 2020-01-28 00:11:49 +00:00
Adrian Greeve 7d1af3ec1d Merge branch 'MDL-67691_37' of https://github.com/stronk7/moodle into MOODLE_37_STABLE 2020-01-28 07:54:31 +08:00
Eloy Lafuente (stronk7) 5efefd458e Merge branch 'MDL-64531-37-questiondeletejson' of git://github.com/mudrd8mz/moodle into MOODLE_37_STABLE 2020-01-27 17:08:20 +01:00
Eloy Lafuente (stronk7) ebc198cfb8 Merge branch 'MDL-67577-37' of git://github.com/bmbrands/moodle into MOODLE_37_STABLE 2020-01-27 16:20:26 +01:00
Eloy Lafuente (stronk7) 1c348b2e8d Merge branch 'm37_MDL-67414_Add_PostgreSQL_12x_Support' of https://github.com/scara/moodle into MOODLE_37_STABLE 2020-01-27 12:16:27 +01:00
Bas Brands f18444a5d1 MDL-67577 core_message: navbar_output order
* moved the logic from core_message_popup_render_navbar_output to
message_popup_render_navbar_output in message/output/popup/lib.php

* using float: left instead of float: right in theme
2020-01-27 12:15:26 +01:00
Tim Schroeder 6fd48eff30 MDL-57755 message: fix notificaiton read status when messaging disabled 2020-01-27 09:17:31 +01:00
Matteo Scaramuccia 68082ac364 MDL-67414 adodb: Backport upstream fix for PostgreSQL 12.x
Upstream: https://github.com/ADOdb/ADOdb/commit/a4876f100602c2ce4760bb72d3050f73387adcca
          pgsql: stop using obsolete pg_attrdef.adsrc column
2020-01-26 09:42:24 +01:00
Matteo Scaramuccia 9edebd4951 MDL-67414 database: Fixed PostgreSQL 12.x support 2020-01-26 09:42:24 +01:00
David Mudrák adfe298af8 MDL-67447 form: Fix the duplicate autocomplete selection node
When the autocomplete selection is updated, the content of the selection
wrapper is replaced with the new list of selected items. We must replace
only the content of the selection wrapper and not to nest it into
itself.
2020-01-25 05:45:39 +01:00
AMOS bot cd6c7e0068 Automatically generated installer lang files 2020-01-25 00:11:49 +00:00
Luca Bösch d11806d957 MDL-66875 calendar: allow the use of day, mon and year again. 2020-01-25 01:01:45 +01:00
Luca Bösch 6a5c1ab6f8 MDL-63424 form: allow checkboxes to have req icon. 2020-01-24 17:38:11 +01:00
Eloy Lafuente (stronk7) e453665f7d MDL-67353 filters: fix filterlib tests
- move resetAfterTest() to test units.
- remove setUp(), moving code to remove_all_filters_from_config().
- remove class properties, moving to return values of own setup_xxx() methods.
2020-01-24 11:27:05 +01:00
Eloy Lafuente (stronk7) 3f73b4f487 MDL-67353 favourites: Random DB id matching solved
Depending on the tests executed it was possible to arrive
to favourites tests with 2 "concepts" (say userid and contextid,
or userid and itemid) having the same ID.

Then, the array_diff() operations used by some mock stuff in the
tests wrongly was returning matches by value, ultimately causing
the test to fail.

Now, the matching is performed using array_diff_assoc() that takes
keys into considation when performing the match.
2020-01-24 11:27:05 +01:00
Andrew Nicols 4dbc8e7655 MDL-67353 course: Fix more broken unit tests 2020-01-24 11:27:05 +01:00
Andrew Nicols 1fb38c5cf6 MDL-67353 course: Fix broken unit test 2020-01-24 11:27:05 +01:00
David Mudrák 71b452912a MDL-67740 behat: Show info as collapsed at the acceptance testing page
The static information with the links to Behat documentation is quite
long an irrelevant for experienced developers returning to this page. No
need to waste the prominent screen place with it - better to offer it
only when needed via collapsible form section.
2020-01-24 10:44:40 +01:00
David Mudrák 1c9edf3920 MDL-67740 behat: Improve the layout of the acceptance testing page
- The CSS contains more specific selectors.
- Make use of the whole screen width for the list of found steps.
- Visually distinguish found steps from each other.
- Make it look less like a unicorn rainbow.
2020-01-24 10:44:39 +01:00
David Mudrák c4f7a4bc62 MDL-67740 behat: Fix the name of the class in the inline documentation
The said class is provided by the moodlehq/behat-extension composer
package and was renamed as a part of upgrade to Behat 3.0.x (MDL-46891).
2020-01-24 10:44:39 +01:00
David Mudrák 9d72d1a9e6 MDL-67740 behat: Allow multiple words filter at acceptance testing page
Because of the too strict input param type, the form did not allow to
search for Behat steps containing the given phrase. The patch sets the
param type to match the one in the form definition, and makes sure that
the submitted value can be safely used as a CLI script argument.
2020-01-24 10:44:38 +01:00
Mikhail Golenkov 198b653bf7 MDL-67746 Tasks: Cleanup task logs in chunks. 2020-01-24 13:59:04 +11:00
Adrian Greeve 77a359ca7b weekly release 3.7.4+ 2020-01-24 10:17:27 +08:00
Adrian Greeve bf1e44117b Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-01-24 10:17:18 +08:00
Eloy Lafuente (stronk7) f8df624e37 Merge branch 'MDL-51225-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2020-01-23 11:14:27 +01:00
Jun Pataleta 704c30b1fb MDL-51225 mod_forum: Revert @javascript tag removal
Put back the removed  @javascript tag to prevent random goutte
fails.
2020-01-23 15:32:59 +08:00
Jun Pataleta a178e09bfb Merge branch 'MDL-65952_m37' of https://github.com/fabiendallet/moodle into MOODLE_37_STABLE 2020-01-23 10:43:32 +08:00
Jun Pataleta 48096011e3 Merge branch 'MDL-66897-37-1' of git://github.com/mihailges/moodle into MOODLE_37_STABLE 2020-01-22 23:16:56 +08:00
Mihail Geshoski 7ef572d39e MDL-66897 mod_assign: Properly display error messages in quick grading 2020-01-22 13:52:08 +08:00
Adrian Greeve 75ab679716 Merge branch 'MDL-67653_37' of https://github.com/timhunt/moodle into MOODLE_37_STABLE 2020-01-22 11:05:17 +08:00
Adrian Greeve 2dc1afe547 Merge branch 'MDL-67660-37-v2' of https://github.com/TobiGa/moodle into MOODLE_37_STABLE 2020-01-22 10:43:24 +08:00
Jun Pataleta 115f4461ce Merge branch 'MDL-67684-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-01-22 10:37:34 +08:00
Colin Campbell c0cf6abf34 MDL-52189 file: skip deleting temp files that appear during cleanup 2020-01-22 12:07:57 +10:00
Adrian Greeve ff6ea1e369 Merge branch 'MDL-67656-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-01-22 09:47:01 +08:00
Eloy Lafuente (stronk7) c5c42e96d2 Merge branch 'MDL-66858_37' of https://github.com/stronk7/moodle into MOODLE_37_STABLE 2020-01-22 01:57:39 +01:00
Michael Milette 39fd21e4ff MDL-66858 master: Enable <header> tags in Atto editor.
(amended to add the src/editor/js/clean.js
file that was originally missing)
2020-01-22 00:12:55 +01:00
Eloy Lafuente (stronk7) 49f70858e9 Merge branch 'MDL-51225-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2020-01-21 23:40:32 +01:00
Adrian Greeve 64d75c9a1a Merge branch 'MDL-66237-37' of git://github.com/mickhawkins/moodle into MOODLE_37_STABLE 2020-01-21 11:24:01 +08:00
Jun Pataleta 695499c681 Merge branch 'MDL-66108-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-01-21 09:50:47 +08:00
Eloy Lafuente (stronk7) d8c3b7e662 Merge branch 'MDL-66024-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-01-20 22:48:42 +01:00
Eloy Lafuente (stronk7) 6adc5e89b0 Merge branch 'MDL-66220-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2020-01-20 22:34:34 +01:00
Eloy Lafuente (stronk7) c9eeb1a7c1 Merge branch 'MDL-66712-37-selfautounenrol' of git://github.com/mudrd8mz/moodle into MOODLE_37_STABLE 2020-01-20 22:29:11 +01:00
Eloy Lafuente (stronk7) 68e4a7dac8 Merge branch 'MDL-65884-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-01-20 20:37:00 +01:00
David Mudrák 73bbb3e7a8 MDL-64531 course: Add Behat test for deleting a quiz with own questions
Teachers can delete Quiz activities that have a question in their own
context via AJAX request with the course recycle bin disabled. This used
to lead to "Unexpected token < in JSON" because of the extra HTML in the
output.
2020-01-20 18:19:45 +01:00
Tim Hunt d00045e8f5 MDL-64531 course: course_delete_module shouldn't output during AJAX
Committer's note: This change was originally part of a bigger patchset
submitted by the author. This is a stripped-down version that does not
use phpunit tests for the new behaviour.
2020-01-20 18:07:25 +01:00
Eloy Lafuente (stronk7) 7a8b3702e3 Merge branch 'MDL-67724-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2020-01-20 10:53:37 +01:00
Sara Arjona 887f9c3fc6 Merge branch 'MDL-67312-37' of git://github.com/lameze/moodle into MOODLE_37_STABLE 2020-01-20 08:05:16 +01:00
Adrian Greeve 28b0d9256f Merge branch 'MDL-67583-37' of https://github.com/KietChan/moodle into MOODLE_37_STABLE 2020-01-20 13:40:27 +08:00
Simey Lameze 2e6729e923 MDL-67312 core_user: clean subs events on user deletion 2020-01-20 08:54:32 +08:00
Simey Lameze d3a2788437 MDL-67312 calendar: upgrade step to delete orphaned events 2020-01-20 08:54:30 +08:00
Simey Lameze c04559ccb6 MDL-67312 core: change db upgrade step to use get_fieldset_sql 2020-01-20 08:52:59 +08:00
Eloy Lafuente (stronk7) a6e4fbe122 MDL-67691 behat: inform about the_following_exist() removal
behat_data_generators::the_following_exist() has been removed, please use
behat_data_generators::the_following_entities_exist() instead.

See MDL-67691 for more info.
2020-01-20 00:13:01 +01:00
Adrian Perez c1ed11df7a MDL-67626 assign: fix view full/view summary control in IE 2020-01-18 14:16:30 +01:00
AMOS bot 1edd36e905 Automatically generated installer lang files 2020-01-18 00:10:56 +00:00
fdallet 91aee9939b MDL-65952 mod_scorm: Fix unwanted changes to require status 2020-01-17 17:25:03 +01:00
Paul Holden a585ee9432 MDL-66108 course: fix false positives when bulk moving categories. 2020-01-17 16:19:26 +00:00
Jun Pataleta bb0acb3e9c MDL-67724 mod_glossary: Improve Behat test
Improve the "Glossary entries are not always editable" scenario by:
* No need to use the @javascript tag
* The maxediting time can be set to a lower value to
reduce the overall wait time.
2020-01-17 17:48:06 +08:00
Tobias Garske 02f08b16c5 MDL-67660 core_message: Messages search change input focus 2020-01-17 09:39:11 +01:00
Michael Hawkins e206c3b8f2 MDL-67722 mod_forum: Reduce wait time on time limit expires behat test 2020-01-17 15:46:56 +08:00
Jun Pataleta 3246d41cb2 MDL-51225 mod_forum: Use can_view_post to determine whether to show post
Use \mod_forum\local\managers\capability::can_view_post() to
consistently determine whether a forum post will be rendered in the
recent activity block.
This helps the recent activity block to provide a more consistent
behaviour with the forum's discussion view itself.
2020-01-17 14:51:47 +08:00
Jun Pataleta 8594f5e8ae MDL-51225 mod_forum: Create behat tests for forum recent activity 2020-01-17 14:45:36 +08:00
Jun Pataleta c0842ca500 MDL-51225 mod_forum: New behat step for creating question discussion 2020-01-17 14:45:36 +08:00
AMOS bot c670210a1d Automatically generated installer lang files 2020-01-17 00:12:28 +00:00
Sara Arjona fd908d09fd weekly release 3.7.4+ 2020-01-16 17:19:15 +01:00
Sara Arjona d859e8774c Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-01-16 17:19:13 +01:00
David Mudrák a86318bd92 MDL-66712 enrol: Fix the reported days of inactivity on unenrolment
There were two problems here. Firstly, the $days was not correctly
calculated due to missing parentheses. Secondly, the sentence had
grammar issues.
2020-01-16 13:44:31 +01:00
Jun Pataleta 77b19b828b MDL-66220 mod_forum: Prevent from replying to a post the user can't see 2020-01-16 15:06:25 +08:00
Jun Pataleta d046109d4d MDL-66220 mod_forum: Cache result of forum_user_can_see_post()
* Cache the result of this function to avoid doing multiple DB calls
for the same post when loading posts in a discussion.
2020-01-16 15:06:25 +08:00
Jun Pataleta bc8d03c68d MDL-66220 mod_forum: Additional unit test for can_reply_to_post 2020-01-16 15:06:25 +08:00
Andrew Nicols f394d9efae Merge branch 'wip-MDL-66918-37stable' of https://github.com/Beedell/moodle into MOODLE_37_STABLE 2020-01-16 11:44:38 +08:00
Eloy Lafuente (stronk7) b67c73c86b Merge branch 'MDL-67625-37' of git://github.com/lucaboesch/moodle into MOODLE_37_STABLE 2020-01-16 00:27:06 +01:00
Sara Arjona 9941fbdae4 Merge branch 'MDL-67617-37' of git://github.com/lucaboesch/moodle into MOODLE_37_STABLE 2020-01-15 12:43:19 +01:00
Sara Arjona aa23048889 Merge branch 'MDL-67638-37' of https://github.com/nguyenphuctien/moodle into MOODLE_37_STABLE 2020-01-15 12:20:00 +01:00
Andrew Nicols c4b8e4ca14 Merge branch 'MDL-67486-swap-cron-lock-MOODLE_37_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_37_STABLE 2020-01-15 13:54:26 +08:00
Mark Johnson e5ec4988b6 MDL-67674 Cache: Lock rebuilding of the course category tree cache 2020-01-15 00:02:22 +01:00
Sara Arjona 35ce17025a Merge branch 'MDL-65573-37-2' of git://github.com/peterRd/moodle into MOODLE_37_STABLE 2020-01-14 12:20:59 +01:00
Andrew Nicols fc1ddb3289 Merge branch 'MDL-66721-37' of git://github.com/bmbrands/moodle into MOODLE_37_STABLE 2020-01-14 14:10:39 +08:00
Andrew Nicols 85b9cf9ce4 MDL-67684 core: Add missing li tag 2020-01-14 08:47:20 +08:00
Andrew Nicols 05bb501b4f Merge branch 'MDL-35971-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2020-01-14 08:33:48 +08:00
AMOS bot 116d41cdfd Automatically generated installer lang files 2020-01-14 00:10:31 +00:00
Peter a5cff8a55b MDL-65573 mod_forum: Set userid properly after split
* Set the discussion's userid properly when splitting a discussion.
* Update step to correct existing incorrect records.
2020-01-14 07:42:19 +08:00
Eloy Lafuente (stronk7) 06e0263936 Merge branch 'MDL-65649-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-01-13 18:57:02 +01:00
Eloy Lafuente (stronk7) de98c397f3 Merge branch 'MDL-65987-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-01-13 18:42:26 +01:00
Sara Arjona f091f67f81 Merge branch 'MDL-59817-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-01-13 14:27:01 +01:00
Kiet Chan 7cfbdd0422 MDL-67583 themes: Popover placement should react to scroll event 2020-01-13 17:27:31 +07:00
Bas Brands 089100fdb3 MDL-67472 theme_boost: configurable sass variable for drawer bgcolour 2020-01-13 09:16:44 +01:00
Tien Nguyen Phuc 68e85534a8 MDL-67638 Course: update course timemodified on bulk category move 2020-01-13 10:41:36 +07:00
Andrew Nicols 0f41a0280d Merge branch 'MDL-67204-37' of https://github.com/mwehr/moodle into MOODLE_37_STABLE 2020-01-13 08:54:46 +08:00
Brendan Heywood fd9466fceb MDL-67486 cron: Improve throughput by holding cron lock for less time 2020-01-12 00:48:25 +11:00
Tim Hunt 6cb1f99459 MDL-67653 questions: prevent the flag flickering as the page loads 2020-01-10 14:28:34 +00:00
Andrew Nicols 8bc3576bb3 MDL-59817 atto_accessibilitychecker: Handle transparency properly
Some browsers, notably Firefox, do not return the computed style for
background colour in a computed RGB format. Instead they return the RGBA
where the alpha channel is set to fully transparent.

To solve this we need to work up the hierarchy and compute the
background colour for each parent node until we reach full alpha (1).

We can use a standard calculation to approximate the value for the
resultant element background by multiplying the alpha of the current
transparent (or semi-transparent) node with the R, G, or B channel in
question, and that of the parent node's background colour.

There are cases where this will not be 100% accurate - notably where
there is some additional content in addition to the parent background,
but this gives us a reasoable approximation for the majority of cases.
Additionally the code has never considered the full set of node content
when calculating this information.
2020-01-10 15:26:51 +08:00
Andrew Nicols 4158b39809 MDL-67656 behat: Removed nested spin 2020-01-10 13:40:32 +08:00
Andrew Nicols c7afe02401 MDL-67656 behat: Fix usleep call in spin 2020-01-10 13:40:31 +08:00
Andrew Nicols 86a19e4910 Moodle release 3.7.4 2020-01-10 13:03:39 +08:00
Andrew Nicols a9534a6ba7 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-01-10 13:03:37 +08:00
AMOS bot 1ba12b9b57 Automatically generated installer lang files 2020-01-10 00:12:21 +00:00
Luca Bösch 37524fa1e6 MDL-67625 quiz: only section titles should be large when editing. 2020-01-09 17:23:02 +01:00
Luca Bösch 44c7386d16 MDL-67617 gradereport_singleview: Style the form element with bs classes 2020-01-09 17:22:09 +01:00
Mario Wehr c3f4abed6f MDL-67204 assign task: Use lastruntime from task_scheduled 2020-01-09 17:12:34 +01:00
John Beedell 2acb24d84e MDL-66918 behat: Behat app step failing 2020-01-09 15:59:25 +00:00
Sara Arjona bcc1f8154f weekly release 3.7.3+ 2020-01-09 15:42:49 +01:00
Jun Pataleta 59a4c1dfbc MDL-67544 mod_forum: Remove unnecessary 'scope' in <td> 2020-01-09 16:35:48 +08:00
Andrew Nicols 709e07dd58 MDL-67544 mod_forum: Add missing label for discussion move 2020-01-09 16:32:15 +08:00
Andrew Nicols 7653711479 Merge branch 'MOODLE_37_MDL-67485' of https://github.com/golenkovm/moodle into MOODLE_37_STABLE 2020-01-09 12:40:40 +08:00
Mikhail Golenkov b3e0d3edec MDL-67485 task: Release the task runner lock before throwing exception. 2020-01-09 15:09:33 +11:00
Andrew Nicols b570a8012b Merge branch 'MDL-67596-cron-ramp-up-MOODLE_37_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_37_STABLE 2020-01-09 09:33:08 +08:00
Brendan Heywood e9ce085117 MDL-67596 cron: Allow runners to ramp up instantly 2020-01-09 11:04:18 +11:00
Eloy Lafuente (stronk7) 3484f61505 Merge branch 'MDL-67544-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2020-01-08 16:33:52 +01:00
Eloy Lafuente (stronk7) b8c1bd07ef Merge branch 'MDL-65920_37' of https://github.com/dvdcastro/moodle into MOODLE_37_STABLE 2020-01-08 10:20:13 +01:00
Jun Pataleta 6783597dc0 MDL-35971 mod_forum: Add proper discussion list table description 2020-01-08 15:45:47 +08:00
Sara Arjona 23f9fc2c08 Merge branch 'MDL-67417-37' of https://github.com/KietChan/moodle into MOODLE_37_STABLE 2020-01-08 08:26:55 +01:00
Sara Arjona 552a926d9e Merge branch 'MDL-67510-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2020-01-08 08:11:09 +01:00
Andrew Nicols feeb49d71d MDL-67544 form: Ensure that form errors have a unique id 2020-01-08 11:17:47 +08:00
Andrew Nicols 2f08c6d636 MDL-67544 mod_forum: Add missing menuitem roles 2020-01-08 11:17:47 +08:00
Andrew Nicols 7eb2fadd0a MDL-67544 mod_forum: Correct aria-labelledby node 2020-01-08 11:17:47 +08:00
Andrew Nicols 472aac0cec MDL-67544 core: Ensure unique IDs for YUI dialogues 2020-01-08 11:17:47 +08:00
Andrew Nicols 67eb2cbae4 MDL-67544 theme: Ensure that search box is in valid li 2020-01-08 11:17:46 +08:00
Andrew Nicols 3f416dde23 MDL-67544 mod_forum: Add default role for favourite toggle 2020-01-08 11:17:46 +08:00
Andrew Nicols b395834704 MDL-67544 mod_forum: Add missing aria label for discussion actions 2020-01-08 11:17:46 +08:00
Andrew Nicols f342750a6f Merge branch 'MDL-64764-37' of git://github.com/paulholden/moodle into MOODLE_37_STABLE 2020-01-08 08:31:30 +08:00
Eloy Lafuente (stronk7) 9f056a5684 Merge branch 'MDL-67469-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2020-01-07 23:00:04 +01:00
Marina Glancy 9b157ea0e6 MDL-64764 core_admin: allow to submit empty list of allowed roles.
Co-authored-by: Paul Holden <paulh@moodle.com>
2020-01-07 10:01:39 +00:00
Andrew Nicols 8dc5eab31e Merge branch 'MDL-65849-37' of git://github.com/rezaies/moodle into MOODLE_37_STABLE 2020-01-07 13:27:30 +08:00
Andrew Nicols 515ebc9727 Merge branch 'MDL-66938-37' of https://github.com/grabs/moodle into MOODLE_37_STABLE 2020-01-07 12:49:59 +08:00
Paul Holden 8c3f81aa69 MDL-66237 message_popup: Get redirecturl from notification contexturl 2020-01-07 11:24:37 +08:00
Andrew Nicols 0b71664990 Merge branch 'MDL-66871-37-v2' of git://github.com/lameze/moodle into MOODLE_37_STABLE 2020-01-07 08:54:57 +08:00
Bas Brands 3dd509b06b MDL-66721 core_chooser: height correction for chooser modal 2020-01-06 10:13:19 +01:00
Jun Pataleta 63078beeed MDL-67510 tool_dataprivacy: Fix the reply-to name of the privacy officer 2020-01-06 11:37:02 +08:00
Simey Lameze 72e7743c2f MDL-66871 calendar: fix deprecated parameter in the phpDoc 2020-01-06 10:42:34 +08:00
Simey Lameze 197be84cc7 MDL-66871 calendar: add unit test coverage for ics importing 2020-01-06 10:42:33 +08:00
Simey Lameze 546c737981 MDL-66871 calendar: fix ics importing logic 2020-01-06 10:42:33 +08:00
Luca Bösch da1a4189e1 MDL-65987 mod_forum: Add string 'Advanced' for the advanced editor.
AMOS BEGIN
    CPY [advanced,moodle],[showadvancededitor,moodle]
   AMOS END
2020-01-06 09:41:23 +08:00
Jake Dallimore c520f8a8c5 Merge branch 'MDL-67336-37' of https://github.com/roland04/moodle into MOODLE_37_STABLE 2020-01-06 09:37:10 +08:00
Andreas Grabs c32c55b482 MDL-66938 mod_feedback: Export includes unwanted html in field names 2020-01-05 19:33:20 +01:00
Jake Dallimore b2c0237ae8 weekly release 3.7.3+ 2020-01-03 11:25:02 +08:00
Jake Dallimore 0b16f6e9d8 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2020-01-03 11:24:59 +08:00
AMOS bot c2b9324c95 Automatically generated installer lang files 2020-01-03 00:12:18 +00:00
Adrian Greeve 3ca4f0705b Merge branch 'MDL-67599-37' of https://github.com/snake/moodle into MOODLE_37_STABLE 2020-01-02 15:17:11 +08:00
Jake Dallimore dc238e45bb MDL-67599 behat: fix behat tests assuming Jan 2020 is a future date 2020-01-02 13:52:55 +08:00
AMOS bot 1120aefa6a Automatically generated installer lang files 2020-01-02 00:10:30 +00:00
Eloy Lafuente (stronk7) 188dddc077 Merge branch 'MDL-67593-37' of https://github.com/snake/moodle into MOODLE_37_STABLE 2019-12-31 10:51:09 +01:00
Jake Dallimore b257dc6a1c MDL-67593 core_iplookup: update lang string describing download process
Let users know they need to register on maxmind before granted download
access.
2019-12-31 15:57:11 +08:00
Jake Dallimore 079cab5158 MDL-67593 core_iplookup: use MaxMind test database in unit tests
Instead of downloading a live database (now not available publicly)
use a local test database.
2019-12-31 15:57:03 +08:00
Jun Pataleta d3c0160f3b Merge branch 'MDL-63996-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2019-12-31 15:18:57 +08:00
Jun Pataleta 6b6874b4b0 Merge branch 'MDL-67487-37' of git://github.com/lucaboesch/moodle into MOODLE_37_STABLE 2019-12-31 11:55:48 +08:00
Jun Pataleta e330c9e4df Merge branch 'MDL-67470-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2019-12-31 11:29:45 +08:00
Bas Brands 4e14f91bfa MDL-67470 theme_boost: settings_menu_proxy correct background
the .region_main_settings_proxy was introduced in MDL-56582 using the
wrong bootstrap variable for the background color
2019-12-31 10:00:03 +08:00
Adrian Greeve fc48d5e39e Merge branch 'MDL-67233-37' of git://github.com/peterRd/moodle into MOODLE_37_STABLE 2019-12-30 12:58:07 +08:00
Jun Pataleta aadb383458 Merge branch 'MDL-67491-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2019-12-30 12:40:53 +08:00
Didier 'OdyX' Raboud b7540acee3 MDL-67491 core_message: Primary'fy the contact request counts 2019-12-30 11:47:47 +08:00
Eloy Lafuente (stronk7) aa5d6d1075 Merge branch 'MDL-67527-37-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_37_STABLE 2019-12-29 23:27:22 +01:00
Adrian Greeve c671e56277 Merge branch 'MDL-63107-37' of git://github.com/bmbrands/moodle into MOODLE_37_STABLE 2019-12-27 16:35:14 +08:00
Adrian Greeve d30ee1def7 Merge branch 'MDL-65809-37-onlyenv' of git://github.com/sarjona/moodle into MOODLE_37_STABLE 2019-12-24 14:56:16 +08:00
Adrian Greeve fc7a699cef Merge branch 'MOODLE_37_STABLE-MDL-67524' of https://github.com/yao9394/moodle into MOODLE_37_STABLE 2019-12-23 10:31:32 +08:00
John Yao b0f9bb4a2c MDL-67524 book: fixing view hidden chapter issue
* Users who have permission should be able to view hidden chapters after turning editing off
2019-12-23 09:38:07 +11:00
AMOS bot 5ca8ff038b Automatically generated installer lang files 2019-12-21 00:11:05 +00:00
Luca Bösch 129e5848e0 MDL-67487 forms: align "Custom" checkbox for course section name. 2019-12-20 13:47:09 +01:00
Eloy Lafuente (stronk7) 6e8eb9c0b2 weekly release 3.7.3+ 2019-12-20 11:02:03 +01:00
Eloy Lafuente (stronk7) 8628068fd0 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2019-12-20 11:02:00 +01:00
Eloy Lafuente (stronk7) 310f5f818b Merge branch 'MDL-67151-37' of git://github.com/rezaies/moodle into MOODLE_37_STABLE 2019-12-19 23:01:45 +01:00
Shamim Rezaie 550af41514 MDL-67151 qtype_numerical: convert the tolerance to string before saving
Fix the sqlserver issue when saving a number into a text field
2019-12-20 01:22:36 +11:00
Jun Pataleta 6a5e6dbbee Merge branch 'MOODLE_37_STABLE_MDL-63795_core_setting_defaults' of https://github.com/mattporritt/moodle into MOODLE_37_STABLE 2019-12-19 11:17:31 +08:00
Matt Porritt 83aae3d6b3 MDL-63795 Administration: CLI upgrade apply all settings
This patch fixes a regression caused by MDL-62777.  MDL-62777 added output to inform
administrators of new default settings.  However, the recursion in the code did not
handle new settings made available as the result of the defaults of other settings
being set.
This patch fixes the issue, now all defaults are correctly set, even those exposed
after other defaults are set.
2019-12-19 12:20:19 +11:00
Eloy Lafuente (stronk7) 55d62d8983 Merge branch 'MDL-67151-37' of git://github.com/rezaies/moodle into MOODLE_37_STABLE 2019-12-18 23:06:42 +01:00
Eloy Lafuente (stronk7) 150f94c8a1 Merge branch 'MDL-64695-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2019-12-18 19:56:26 +01:00
David Mudrák 9ef1745639 MDL-67527 lang: Propagate the string fixes to Behat and other places 2019-12-18 09:29:16 +01:00
Helen Foster b42864b044 MDL-67527 lang: Import fixed English strings (en_fix) 2019-12-18 09:28:45 +01:00
Andrew Nicols 93a4ff940c MDL-63996 core/tags: Pending JS for all tag code 2019-12-18 12:02:40 +08:00
Eloy Lafuente (stronk7) 6bc6e9fb4f Merge branch 'MDL-67185-37' of git://github.com/bmbrands/moodle into MOODLE_37_STABLE 2019-12-17 23:07:44 +01:00
Mikel Martín 094a5cddd6 MDL-67336 mod_forum: Fixing forum inline reply filtering before saving 2019-12-17 16:51:22 +01:00
Jake Dallimore 02fcc52917 Merge branch 'MDL-65735-37' of https://github.com/paulholden/moodle into MOODLE_37_STABLE 2019-12-17 13:25:43 +08:00
Eloy Lafuente (stronk7) 73f5b11a3d Merge branch 'MDL-67522-37' of git://github.com/marinaglancy/moodle into MOODLE_37_STABLE 2019-12-17 00:22:50 +01:00
Eloy Lafuente (stronk7) 78923a9379 Merge branch 'MDL-67410-37' of https://github.com/felicemcc/moodle into MOODLE_37_STABLE 2019-12-16 19:18:51 +01:00
Bas Brands 362134292e MDL-63107 mod_book: rewrite styles for book chapter block
* using flexbox to position titles
* fix for title overlap on edit mode
* show correct bullets, number or indent
2019-12-16 13:30:36 +01:00
Andrew Nicols 72d4e3141c MDL-63996 behat: Fix multi-tag autocomplete usage 2019-12-16 14:00:53 +08:00
Jake Dallimore ed06e68a2b Merge branch 'MDL-66503-37' of git://github.com/abgreeve/moodle into MOODLE_37_STABLE 2019-12-16 09:11:47 +08:00
Marina Glancy 4b45a0fb43 MDL-67522 core_lock: fix mistype in config-dist 2019-12-14 19:31:17 +01:00
AMOS bot 97f2efaf90 Automatically generated installer lang files 2019-12-14 00:11:00 +00:00
Jun Pataleta bfde26e64c MDL-67469 tool_dataprivacy: Put back missing test code
This patch simply brings back the missing test code for
\tool_dataprivacy_api_testcase::test_approve_data_request_non_dpo_user()
2019-12-13 10:05:12 +08:00
AMOS bot 9213c261eb Automatically generated installer lang files 2019-12-13 00:11:17 +00:00
Felice Candilio ad27019f63 MDL-67410 Enrolments: Cast the perpage parameter to integer in JS
The parameter called "perpage" on the call is treated as a string,
therefore, It could have a value 15001 resulting from a "+" operation
of the "1500" string and the number 1. That big number makes
the AJAX call extremely slow.

The proposed solution is to parse the number as an integer
when performing the addition.
2019-12-12 22:28:17 +01:00
Paul Holden 73242585f4 MDL-65735 report_progress: reset URL start parameter in initials bars. 2019-12-12 18:24:21 +00:00
Paul Holden bc25db6a64 MDL-64695 tool_dataprivacy: filter site fullname in outgoing messages. 2019-12-12 18:20:35 +00:00
Paul Holden 8b6d7e876d MDL-64695 privacy: filter site fullname in data export. 2019-12-12 18:20:35 +00:00
Eloy Lafuente (stronk7) 85e21dd300 weekly release 3.7.3+ 2019-12-12 13:26:23 +01:00
Eloy Lafuente (stronk7) 1c4af632f9 Merge branch 'install_37_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_37_STABLE 2019-12-12 13:26:20 +01:00
Jake Dallimore 8223ff7c7e Merge branch 'MDL-67154-37' of git://github.com/ferranrecio/moodle into MOODLE_37_STABLE 2019-12-12 09:05:28 +08:00
Ferran Recio 190216f8a9 MDL-67154 theme_classic: fixing firefox printing 2019-12-11 16:56:57 +01:00
AMOS bot f48346ab9d Automatically generated installer lang files 2019-12-11 13:50:16 +00:00
Kiet.Chan 7473f63a3d MDL-67417 theme_boost: Tooltip icon stop working after closing using ESC 2019-12-11 14:55:32 +07:00
Andrew Nicols c0e6d385c7 Merge branch 'MDL-67458-37' of https://github.com/snake/moodle into MOODLE_37_STABLE 2019-12-11 10:27:41 +08:00
Adrian Greeve 50dd06be9f MDL-66503 themes: Set the embed page to display block. 2019-12-11 09:39:01 +08:00
Jake Dallimore 2e9dd5864e MDL-67458 core: removing stale cohortroles and role assignments 2019-12-11 09:38:59 +08:00
Jake Dallimore c309ace4a9 MDL-67458 tool_cohortroles: remove role mapping for deleted roles
Before syncing anything, clean up records pointing to deleted roles.
2019-12-11 09:38:38 +08:00
Jake Dallimore cf6f67c615 Merge branch 'MDL-66936-37' of git://github.com/marinaglancy/moodle into MOODLE_37_STABLE 2019-12-10 15:28:18 +08:00
Jake Dallimore 32312d16a4 Merge branch 'MDL-67154-37' of git://github.com/ferranrecio/moodle into MOODLE_37_STABLE 2019-12-10 11:58:07 +08:00
Jake Dallimore acd644b49b Merge branch 'MDL-67451-37' of git://github.com/sarjona/moodle into MOODLE_37_STABLE 2019-12-10 10:37:31 +08:00
Jake Dallimore e57486369f Merge branch 'MDL-66708-MOODLE_37_KeyGenCache' of https://github.com/Cengage/moodle into MOODLE_37_STABLE 2019-12-10 09:14:49 +08:00
Paul Holden 213abaaf97 MDL-65649 backup: ensure valid course URL for async mode. 2019-12-09 23:34:37 +00:00
Sara Arjona 5d69fd7796 MDL-67451 badges: use the site OB version as default 2019-12-09 08:21:50 +01:00
Andrew Nicols f77bddbe41 Merge branch 'MDL-60975-37' of https://github.com/Kathrin84/moodle into MOODLE_37_STABLE 2019-12-09 13:10:44 +08:00
AMOS bot 6245343fee Automatically generated installer lang files 2019-12-06 00:09:50 +00:00
Paul Holden 9e9c0912e3 MDL-66024 tool_uploadcourse: validate shortname/fullname field length. 2019-12-05 23:11:14 +00:00
Kathrin Osswald c7083ccfab MDL-60975 behat tests: Added search for admin setting filepickers 2019-12-05 14:59:32 +01:00
Sara Arjona 7bda7e786b MDL-65809 environment: mbstring extension required 2019-12-05 14:01:54 +01:00
Sara Arjona 0334ede088 MDL-65809 environment: PHP 7.2 required 2019-12-05 14:01:54 +01:00
Sara Arjona c81c6c7062 MDL-65809 environment: postgres requirement up to 9.5 2019-12-05 14:01:54 +01:00
Sara Arjona c13e90b418 MDL-65809 environment: mariadb requirement up to 10.2 2019-12-05 14:01:54 +01:00
Sara Arjona 34edb73d59 MDL-65809 environment: 3.5 (LTS) required 2019-12-05 14:01:54 +01:00
Sara Arjona 0bdb308dad MDL-65809 environment: 3.9 base information
This is a direct copy of the 3.8 branch to have changes
under control easier in next commits.
2019-12-05 14:01:54 +01:00
Eloy Lafuente (stronk7) fcc93935be weekly release 3.7.3+ 2019-12-05 13:24:09 +01:00
Adrian Greeve 66860a607c Merge branch 'MDL-65620-37' of git://github.com/aanabit/moodle into MOODLE_37_STABLE 2019-12-05 09:27:51 +08:00
Amaia Anabitarte a4af12139e MDL-65620 core_message: User preference generator 2019-12-04 11:03:14 +01:00
Amaia Anabitarte 610fde313f MDL-65620 core_message: Notification preferences behat tests 2019-12-04 11:03:14 +01:00
Amaia Anabitarte ba2599ce05 MDL-65620 core_message: Default notification preferences 2019-12-04 10:56:04 +01:00
Ferran Recio 91ff19fc50 MDL-67154 theme_boost: fixing firefox printing 2019-12-04 10:41:50 +01:00
Adrian Greeve a9acc2ee16 Merge branch 'MDL-40360-37' of git://github.com/lucaboesch/moodle into MOODLE_37_STABLE 2019-12-04 11:52:21 +08:00
Claude Vervoort 7a81ee607f MDL-66708 lti adv: fix check for key in config 2019-12-03 09:44:05 -05:00
Marina Glancy 07ab601ced MDL-66936 mod_url: revert MDL-65024 adding fullurl to modinfo
This reverts commit cc56e409c3, reversing
changes made to 01cdf16c0e.
2019-12-03 12:25:40 +01:00
Jonathon Fowler 6b822a40e0 MDL-66936 url: fix error when modinfo cache is rebuilt non-interactively 2019-12-03 12:25:39 +01:00
Adrian Perez 5b5b171b75 MDL-67185 progressbar: use bootstrap component to fix invert colors 2019-12-03 11:26:15 +01:00
Shamim Rezaie c683b6465d MDL-67151 qtype_calculatedsimple: Support for the scientific format 2019-12-03 16:59:23 +11:00
Shamim Rezaie 98f8cc5c57 MDL-67151 qtype_calculated: Support for the scientific format 2019-12-03 16:59:23 +11:00
Shamim Rezaie ff7d589d0c MDL-67151 qtype_numerical: Support for the scientific format 2019-12-03 16:59:22 +11:00
Shamim Rezaie 01f880752e MDL-67151 core_question: Support scientific format at question preview 2019-12-03 16:59:22 +11:00
Shamim Rezaie f24f82e202 MDL-67151 forms: Support for the scientific format in the float element 2019-12-03 16:59:21 +11:00
Shamim Rezaie 9726641b87 MDL-67151 core: format_float can auto detect number of decimal points 2019-12-03 16:59:17 +11:00
Sara Arjona 13b6be4cda Merge branch 'wip-MDL-67339-37stable' of https://github.com/Beedell/moodle into MOODLE_37_STABLE 2019-12-02 18:06:38 +01:00
John Beedell 54eb7cecbb MDL-67339 behat: Enhance Behat exception message 2019-12-02 09:57:18 +00:00
Jake Dallimore ee03a07837 Merge branch 'MDL-66581-37' of git://github.com/junpataleta/moodle into MOODLE_37_STABLE 2019-12-02 16:13:10 +08:00
Jun Pataleta 2fff16d0dd MDL-66581 auth: Properly assign the link attribute 2019-12-02 15:29:13 +08:00
Iñigo Zendegi ba011cd3a3 MDL-66581 auth: Do string concatenation for the password change URL
This reverts the change introduced by MDL-59298 where the password
change URL data is being assigned with a moodle_url object instead
of concatenating it.
2019-12-02 15:29:13 +08:00
Jake Dallimore 3e88752969 Merge branch 'MDL-66877-37' of git://github.com/jleyva/moodle into MOODLE_37_STABLE 2019-12-02 10:04:37 +08:00
Luca Bösch cd47a90307 MDL-40360 gradingform_rubric: remove unused class 'label' for a label. 2019-11-30 10:06:00 +01:00
Shamim Rezaie 43536c4490 MDL-65849 mod_forum: Add course param to the author's profile url 2019-11-29 21:02:04 +11:00
Eloy Lafuente (stronk7) 26a1bee863 weekly release 3.7.3+ 2019-11-29 00:45:47 +01:00
Juan Leyva 0d588f2275 MDL-66877 mod: Fix unfiltered activity names in page headings 2019-11-28 17:19:33 +01:00
Juan Leyva a44b2f35d0 MDL-66877 mod: Fix WebServices returning unfiltered activity names 2019-11-28 17:19:33 +01:00
Eloy Lafuente (stronk7) 7ed4575962 Merge branch 'MDL-67300-m37' of https://github.com/sammarshallou/moodle into MOODLE_37_STABLE
(fix trailing whitespace case)
2019-11-26 22:28:54 +01:00
Jun Pataleta 42717369cb Merge branch 'MOODLE_37_MDL-56886' of https://github.com/golenkovm/moodle into MOODLE_37_STABLE 2019-11-26 22:32:30 +08:00
Luca Bösch 6c4fda0250 MDL-67210 tool_uploadcourse: Allow only 0 and 1 for visible value. 2019-11-26 08:30:55 +01:00
Peter 6acdb674c5 MDL-67233 mod_timeline: Allow events with only open dates in the future 2019-11-26 11:29:04 +08:00
Mikhail Golenkov 0b40ec7c6c MDL-56886 navigation: Allow local plugins to modify navigation via AJAX. 2019-11-26 13:20:25 +11:00
Jake Dallimore 5f0db00a75 Merge branch 'MDL-67222-37' of git://github.com/bmbrands/moodle into MOODLE_37_STABLE 2019-11-26 10:13:26 +08:00
Bas Brands 1fd190f06f MDL-67222 tool_lp: update css classes for Bootstrap 4.3 2019-11-25 15:00:09 +01:00
Jun Pataleta d7e5e56e1e Merge branch 'MDL-67217_37' of git://github.com/dmonllao/moodle into MOODLE_37_STABLE 2019-11-25 16:14:02 +08:00
Sara Arjona 6bc8d857b9 Merge branch 'MDL-67168-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2019-11-25 08:56:59 +01:00
Jun Pataleta 2f4b206ac0 Merge branch 'MDL-65956-37-1' of git://github.com/mihailges/moodle into MOODLE_37_STABLE 2019-11-25 14:22:43 +08:00
Mihail Geshoski d522d06f07 MDL-65956 mod_assign: Add behat tests 2019-11-25 10:50:32 +08:00
Mihail Geshoski 49953fd4ca MDL-65956 mod_assign: Add proper capability checks and error handling 2019-11-25 10:50:32 +08:00
David Monllaó 2adc0dbe96 MDL-67217 unittest: usleep and windows don't get along well 2019-11-22 07:42:24 +08:00
Eloy Lafuente (stronk7) 52eb2da844 weekly release 3.7.3+ 2019-11-22 00:17:10 +01:00
sam marshall 0ce15c819d MDL-67300 Calendar: Inconsistent behaviour of managegroupentries
When calling the calendar_get_allowed_event_types function with
no course id, it is supposed to return true if you have the
relevant permissions in any course.

For users who have the managegroupentries permission, this was not
the case - even though it works correctly if you call the function
with a supplied course id.

This change makes behaviour with and without a supplied course id
consistent.
2019-11-21 10:53:03 +00:00
Andrew Nicols b530dd8136 MDL-67168 forum: Correct behaviour of viewfullnames 2019-11-21 15:43:12 +08:00
Tim Hunt 265296a26e MDL-48024 behat: allow plugins to have data generators
This extends the step
Given the following "users" exist:
to also support things like
Given the following "mod_quiz > user overrides" exist:

Instructions are on the behat_data_generators and
behat_generator_base classes.
2019-11-21 09:35:39 +08:00
Jake Dallimore cb14826719 Merge branch 'MDL-67274-m37' of https://github.com/sammarshallou/moodle into MOODLE_37_STABLE 2019-11-19 10:51:50 +08:00
Eloy Lafuente (stronk7) 219d5e9c1d Merge branch 'MDL-65913_37' of https://github.com/jonof/moodle into MOODLE_37_STABLE 2019-11-18 23:19:53 +01:00
Jun Pataleta 23865aefdd MDL-67148 tool_mobile: Set auth_cas|auth_name config value in unit test
Thanks to Renaat Debleu for the fix suggestion!
2019-11-18 18:54:30 +01:00
Jun Pataleta 8a6a3bd633 Merge branch 'MDL-67073-37' of git://github.com/marinaglancy/moodle into MOODLE_37_STABLE 2019-11-18 16:03:08 +08:00
sam marshall 7eb02fed62 MDL-67274 Tasks: Log display fails with memory errors 2019-11-15 13:56:56 +00:00
Eloy Lafuente (stronk7) 87b11eb4a0 weekly release 3.7.3+ 2019-11-15 12:30:25 +01:00
Jun Pataleta b6a6a6740f Merge branch 'MDL-67218-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE 2019-11-13 11:00:12 +08:00
Andrew Nicols 61f4facb74 MDL-67218 form: Do not clear grade when rescaling not enabled 2019-11-12 13:18:44 +08:00
Jonathon Fowler 61016f21df MDL-65913 block_recentlyaccessedcourses: add category | name separator 2019-11-01 16:42:14 +10:00
Marina Glancy ff55f6b21d MDL-67073 core_course: fix capability context 2019-10-30 18:42:02 +01:00
David Castro 41eb6e8372 MDL-65920 adodb: PHP 7.2 fixes for adodb library. 2019-07-05 09:52:50 -05:00
Paul Holden ad7d0f05de MDL-65884 filters: update exclusive separator characters for tags.
The previous characters mangled the output of filtered text, exhibited
in the activity names filter for activities named '-' (single hyphen).
2019-06-12 17:10:21 +01:00
663 changed files with 15895 additions and 5960 deletions
+1
View File
@@ -65,6 +65,7 @@ lib/validateurlsyntax.php
lib/amd/src/popper.js
lib/geopattern-php/
lib/php-jwt/
lib/mdn-polyfills/
media/player/videojs/amd/src/video-lazy.js
media/player/videojs/amd/src/Youtube-lazy.js
media/player/videojs/videojs/
+1 -1
View File
@@ -1 +1 @@
v8.16.1
v14.0.0
+1
View File
@@ -66,6 +66,7 @@ lib/validateurlsyntax.php
lib/amd/src/popper.js
lib/geopattern-php/
lib/php-jwt/
lib/mdn-polyfills/
media/player/videojs/amd/src/video-lazy.js
media/player/videojs/amd/src/Youtube-lazy.js
media/player/videojs/videojs/
+20 -4
View File
@@ -2,8 +2,6 @@
# process (which uses our internal CI system) this file is here for the benefit
# of community developers git clones - see MDL-51458.
sudo: required
# We currently disable Travis notifications entirely until https://github.com/travis-ci/travis-ci/issues/4976
# is fixed.
notifications:
@@ -11,10 +9,13 @@ notifications:
language: php
os: linux
dist: xenial
services:
- mysql
- docker
php:
# We only run the highest and lowest supported versions to reduce the load on travis-ci.org.
@@ -41,7 +42,7 @@ env:
# Perform an upgrade test too.
- DB=pgsql TASK=UPGRADE
matrix:
jobs:
# Enable fast finish.
# This will fail the build if a single job fails (except those in allow_failures).
# It will not stop the jobs from running.
@@ -61,8 +62,9 @@ cache:
- $HOME/.npm
before_install:
- docker run -d -p 127.0.0.1:8080:80 --name exttests moodlehq/moodle-exttests
# Avoid IPv6 default binding as service (causes redis not to start).
sudo service redis-server start --bind 127.0.0.1
- sudo service redis-server start --bind 127.0.0.1
install:
- >
@@ -169,6 +171,12 @@ before_script:
-e "/require_once/i \\\$CFG->phpunit_dataroot = '\/home\/travis\/roots\/phpunit';" \
-e "/require_once/i \\\$CFG->phpunit_prefix = 'p_';" \
config.php ;
# Enable test external resources
sed -i \
-e "/require_once/i \\define('TEST_EXTERNAL_FILES_HTTP_URL', 'http://127.0.0.1:8080');" \
-e "/require_once/i \\define('TEST_EXTERNAL_FILES_HTTPS_URL', 'http://127.0.0.1:8080');" \
config.php ;
# Redis cache store tests
sed -i \
-e "/require_once/i \\define('TEST_CACHESTORE_REDIS_TESTSERVERS', '127.0.0.1');" \
@@ -284,3 +292,11 @@ script:
exit 1 ;
fi
fi
after_script:
- >
if [ "$TASK" = 'PHPUNIT' ];
then
EXTTESTS_HITS=$(docker logs exttests 2>&1 | grep -Fv -e 'AH00558' -e '[pid 1]' | wc -l)
echo -e "\nTest local resources number of hits: ${EXTTESTS_HITS}.\n"
fi
+30 -13
View File
@@ -112,7 +112,13 @@ module.exports = function(grunt) {
eslint: {
// Even though warnings dont stop the build we don't display warnings by default because
// at this moment we've got too many core warnings.
options: {quiet: !grunt.option('show-lint-warnings')},
// To display warnings call: grunt eslint --show-lint-warnings
// To fail on warnings call: grunt eslint --max-lint-warnings=0
// Also --max-lint-warnings=-1 can be used to display warnings but not fail.
options: {
quiet: (!grunt.option('show-lint-warnings')) && (typeof grunt.option('max-lint-warnings') === 'undefined'),
maxWarnings: ((typeof grunt.option('max-lint-warnings') !== 'undefined') ? grunt.option('max-lint-warnings') : -1)
},
amd: {src: amdSrc},
// Check YUI module source files.
yui: {src: ['**/yui/src/**/*.js', '!*/**/yui/src/*/meta/*.js']}
@@ -151,6 +157,9 @@ module.exports = function(grunt) {
tasks: ['yui']
},
gherkinlint: {
options: {
nospawn: false,
},
files: ['**/tests/behat/*.feature'],
tasks: ['gherkinlint']
}
@@ -293,19 +302,27 @@ module.exports = function(grunt) {
};
tasks.gherkinlint = function() {
var done = this.async(),
options = grunt.config('gherkinlint.options');
const done = this.async();
const options = grunt.config('gherkinlint.options');
var args = grunt.file.expand(options.files);
args.unshift(path.normalize(__dirname + '/node_modules/.bin/gherkin-lint'));
grunt.util.spawn({
cmd: 'node',
args: args,
opts: {stdio: 'inherit', env: process.env}
}, function(error, result, code) {
// Propagate the exit code.
done(code === 0);
});
// Grab the gherkin-lint linter and required scaffolding.
const linter = require('gherkin-lint/src/linter.js');
const featureFinder = require('gherkin-lint/src/feature-finder.js');
const configParser = require('gherkin-lint/src/config-parser.js');
const formatter = require('gherkin-lint/src/formatters/stylish.js');
// Run the linter.
const results = linter.lint(
featureFinder.getFeatureFiles(grunt.file.expand(options.files)),
configParser.getConfiguration(configParser.defaultConfigFileName)
);
// Print the results out uncondtionally.
formatter.printResults(results);
// Report on the results.
// The done function takes a bool whereby a falsey statement causes the task to fail.
done(results.every(result => result.errors.length === 0));
};
tasks.startup = function() {
+2 -1
View File
@@ -131,7 +131,8 @@ class task_log_table extends \table_sql {
}
$sql = "SELECT
tl.*,
tl.id, tl.type, tl.component, tl.classname, tl.userid, tl.timestart, tl.timeend,
tl.dbreads, tl.dbwrites, tl.result,
tl.dbreads + tl.dbwrites AS db,
tl.timeend - tl.timestart AS duration,
{$userfields}
+362
View File
@@ -2982,4 +2982,366 @@
</CUSTOM_CHECK>
</CUSTOM_CHECKS>
</MOODLE>
<MOODLE version="3.9" requires="3.5">
<UNICODE level="required">
<FEEDBACK>
<ON_ERROR message="unicoderequired" />
</FEEDBACK>
</UNICODE>
<DATABASE level="required">
<VENDOR name="mariadb" version="10.2.29" />
<VENDOR name="mysql" version="5.6" />
<VENDOR name="postgres" version="9.5" />
<VENDOR name="mssql" version="11.0" />
<VENDOR name="oracle" version="11.2" />
</DATABASE>
<PHP version="7.2.0" level="required">
</PHP>
<PCREUNICODE level="optional">
<FEEDBACK>
<ON_CHECK message="pcreunicodewarning" />
</FEEDBACK>
</PCREUNICODE>
<PHP_EXTENSIONS>
<PHP_EXTENSION name="iconv" level="required">
<FEEDBACK>
<ON_ERROR message="iconvrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="mbstring" level="required">
<FEEDBACK>
<ON_ERROR message="mbstringrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="curl" level="required">
<FEEDBACK>
<ON_ERROR message="curlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="openssl" level="required">
<FEEDBACK>
<ON_ERROR message="opensslrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="tokenizer" level="optional">
<FEEDBACK>
<ON_CHECK message="tokenizerrecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="xmlrpc" level="optional">
<FEEDBACK>
<ON_CHECK message="xmlrpcrecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="soap" level="optional">
<FEEDBACK>
<ON_CHECK message="soaprecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="ctype" level="required">
<FEEDBACK>
<ON_ERROR message="ctyperequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="zip" level="required">
<FEEDBACK>
<ON_ERROR message="ziprequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="zlib" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="gd" level="required">
<FEEDBACK>
<ON_ERROR message="gdrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="simplexml" level="required">
<FEEDBACK>
<ON_ERROR message="simplexmlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="spl" level="required">
<FEEDBACK>
<ON_ERROR message="splrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="pcre" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="dom" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="xml" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="xmlreader" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="intl" level="required">
<FEEDBACK>
<ON_ERROR message="intlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="json" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="hash" level="required"/>
<PHP_EXTENSION name="fileinfo" level="required"/>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="96M" level="required">
<FEEDBACK>
<ON_ERROR message="settingmemorylimit" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="file_uploads" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="settingfileuploads" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="opcache.enable" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="opcacherecommended" />
</FEEDBACK>
</PHP_SETTING>
</PHP_SETTINGS>
<CUSTOM_CHECKS>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_storage_engine" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbstorageengine" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="question/engine/upgrade/upgradelib.php" function="quiz_attempts_upgraded" level="required">
<FEEDBACK>
<ON_ERROR message="quizattemptsupgradedmessage" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_slasharguments" level="optional">
<FEEDBACK>
<ON_CHECK message="slashargumentswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_tables_row_format" level="optional">
<FEEDBACK>
<ON_CHECK message="unsupporteddbtablerowformat" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_unoconv_version" level="optional">
<FEEDBACK>
<ON_CHECK message="unoconvwarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_libcurl_version" level="optional">
<FEEDBACK>
<ON_CHECK message="libcurlwarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_file_format" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbfileformat" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_file_per_table" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbfilepertable" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_large_prefix" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddblargeprefix" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_is_https" level="optional">
<FEEDBACK>
<ON_CHECK message="ishttpswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_incomplete_unicode_support" level="optional">
<FEEDBACK>
<ON_CHECK message="incompleteunicodesupport" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_sixtyfour_bits" level="optional">
<FEEDBACK>
<ON_CHECK message="sixtyfourbitswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
</CUSTOM_CHECKS>
</MOODLE>
<MOODLE version="3.10" requires="3.5">
<UNICODE level="required">
<FEEDBACK>
<ON_ERROR message="unicoderequired" />
</FEEDBACK>
</UNICODE>
<DATABASE level="required">
<VENDOR name="mariadb" version="10.2.29" />
<VENDOR name="mysql" version="5.7" />
<VENDOR name="postgres" version="9.6" />
<VENDOR name="mssql" version="11.0" />
<VENDOR name="oracle" version="11.2" />
</DATABASE>
<PHP version="7.2.0" level="required">
</PHP>
<PCREUNICODE level="optional">
<FEEDBACK>
<ON_CHECK message="pcreunicodewarning" />
</FEEDBACK>
</PCREUNICODE>
<PHP_EXTENSIONS>
<PHP_EXTENSION name="iconv" level="required">
<FEEDBACK>
<ON_ERROR message="iconvrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="mbstring" level="required">
<FEEDBACK>
<ON_ERROR message="mbstringrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="curl" level="required">
<FEEDBACK>
<ON_ERROR message="curlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="openssl" level="required">
<FEEDBACK>
<ON_ERROR message="opensslrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="tokenizer" level="optional">
<FEEDBACK>
<ON_CHECK message="tokenizerrecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="xmlrpc" level="optional">
<FEEDBACK>
<ON_CHECK message="xmlrpcrecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="soap" level="optional">
<FEEDBACK>
<ON_CHECK message="soaprecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="ctype" level="required">
<FEEDBACK>
<ON_ERROR message="ctyperequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="zip" level="required">
<FEEDBACK>
<ON_ERROR message="ziprequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="zlib" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="gd" level="required">
<FEEDBACK>
<ON_ERROR message="gdrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="simplexml" level="required">
<FEEDBACK>
<ON_ERROR message="simplexmlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="spl" level="required">
<FEEDBACK>
<ON_ERROR message="splrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="pcre" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="dom" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="xml" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="xmlreader" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="intl" level="required">
<FEEDBACK>
<ON_ERROR message="intlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="json" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="hash" level="required"/>
<PHP_EXTENSION name="fileinfo" level="required"/>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="96M" level="required">
<FEEDBACK>
<ON_ERROR message="settingmemorylimit" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="file_uploads" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="settingfileuploads" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="opcache.enable" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="opcacherecommended" />
</FEEDBACK>
</PHP_SETTING>
</PHP_SETTINGS>
<CUSTOM_CHECKS>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_storage_engine" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbstorageengine" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="question/engine/upgrade/upgradelib.php" function="quiz_attempts_upgraded" level="required">
<FEEDBACK>
<ON_ERROR message="quizattemptsupgradedmessage" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_slasharguments" level="optional">
<FEEDBACK>
<ON_CHECK message="slashargumentswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_tables_row_format" level="optional">
<FEEDBACK>
<ON_CHECK message="unsupporteddbtablerowformat" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_unoconv_version" level="optional">
<FEEDBACK>
<ON_CHECK message="unoconvwarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_libcurl_version" level="optional">
<FEEDBACK>
<ON_CHECK message="libcurlwarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_file_format" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbfileformat" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_file_per_table" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbfilepertable" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_large_prefix" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddblargeprefix" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_is_https" level="optional">
<FEEDBACK>
<ON_CHECK message="ishttpswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_incomplete_unicode_support" level="optional">
<FEEDBACK>
<ON_CHECK message="incompleteunicodesupport" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_sixtyfour_bits" level="optional">
<FEEDBACK>
<ON_CHECK message="sixtyfourbitswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
</CUSTOM_CHECKS>
</MOODLE>
</COMPATIBILITY_MATRIX>
+25 -8
View File
@@ -226,7 +226,7 @@ if (!core_tables_exist()) {
}
if (empty($confirmrelease)) {
require_once($CFG->libdir.'/environmentlib.php');
list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE);
list($envstatus, $environmentresults) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE);
$strcurrentrelease = get_string('currentrelease');
$PAGE->navbar->add($strcurrentrelease);
@@ -235,7 +235,7 @@ if (!core_tables_exist()) {
$PAGE->set_cacheable(false);
$output = $PAGE->get_renderer('core', 'admin');
echo $output->install_environment_page($maturity, $envstatus, $environment_results, $release);
echo $output->install_environment_page($maturity, $envstatus, $environmentresults, $release);
die();
}
@@ -358,9 +358,9 @@ if (!$cache and $version > $CFG->version) { // upgrade
echo $output->upgrade_confirm_page($a->newversion, $maturity, $testsite);
die();
} else if (empty($confirmrelease)){
} else if (empty($confirmrelease)) {
require_once($CFG->libdir.'/environmentlib.php');
list($envstatus, $environment_results) = check_moodle_environment($release, ENV_SELECT_RELEASE);
list($envstatus, $environmentresults) = check_moodle_environment($release, ENV_SELECT_RELEASE);
$strcurrentrelease = get_string('currentrelease');
$PAGE->navbar->add($strcurrentrelease);
@@ -368,7 +368,7 @@ if (!$cache and $version > $CFG->version) { // upgrade
$PAGE->set_heading($strcurrentrelease);
$PAGE->set_cacheable(false);
echo $output->upgrade_environment_page($release, $envstatus, $environment_results);
echo $output->upgrade_environment_page($release, $envstatus, $environmentresults);
die();
} else if (empty($confirmplugins)) {
@@ -533,7 +533,10 @@ if (!$cache and $branch <> $CFG->branch) { // Update the branch
if (!$cache and moodle_needs_upgrading()) {
$PAGE->set_url(new moodle_url($PAGE->url, array('confirmplugincheck' => $confirmplugins)));
$PAGE->set_url(new moodle_url($PAGE->url, array(
'confirmrelease' => $confirmrelease,
'confirmplugincheck' => $confirmplugins,
)));
check_upgrade_key($upgradekeyhash);
@@ -543,7 +546,21 @@ if (!$cache and moodle_needs_upgrading()) {
$pluginman = core_plugin_manager::instance();
$output = $PAGE->get_renderer('core', 'admin');
if (!$confirmplugins) {
if (empty($confirmrelease)) {
require_once($CFG->libdir . '/environmentlib.php');
list($envstatus, $environmentresults) = check_moodle_environment($release, ENV_SELECT_RELEASE);
$strcurrentrelease = get_string('currentrelease');
$PAGE->navbar->add($strcurrentrelease);
$PAGE->set_title($strcurrentrelease);
$PAGE->set_heading($strcurrentrelease);
$PAGE->set_cacheable(false);
echo $output->upgrade_environment_page($release, $envstatus, $environmentresults);
die();
} else if (!$confirmplugins) {
$strplugincheck = get_string('plugincheck');
$PAGE->navbar->add($strplugincheck);
@@ -802,7 +819,7 @@ $SESSION->admin_critical_warning = ($insecuredataroot==INSECURE_DATAROOT_ERROR);
$adminroot = admin_get_root();
// Check if there are any new admin settings which have still yet to be set
if (any_new_admin_settings($adminroot)){
if (any_new_admin_settings($adminroot)) {
redirect('upgradesettings.php');
}
+31 -11
View File
@@ -33,13 +33,17 @@ $allprocessors = get_message_processors();
$processors = array_filter($allprocessors, function($processor) {
return $processor->enabled;
});
$disabledprocessors = array_filter($allprocessors, function($processor) {
return !$processor->enabled;
});
// Fetch message providers.
$providers = get_message_providers();
// Fetch the manage message outputs interface.
$preferences = get_message_output_default_preferences();
if (($form = data_submitted()) && confirm_sesskey()) {
$preferences = array();
$newpreferences = array();
// Prepare default message outputs settings.
foreach ($providers as $provider) {
$componentproviderbase = $provider->component.'_'.$provider->name;
@@ -47,9 +51,9 @@ if (($form = data_submitted()) && confirm_sesskey()) {
$providerdisabled = false;
if (!isset($form->$disableprovidersetting)) {
$providerdisabled = true;
$preferences[$disableprovidersetting] = 1;
$newpreferences[$disableprovidersetting] = 1;
} else {
$preferences[$disableprovidersetting] = 0;
$newpreferences[$disableprovidersetting] = 0;
}
foreach (array('permitted', 'loggedin', 'loggedoff') as $setting) {
@@ -75,20 +79,36 @@ if (($form = data_submitted()) && confirm_sesskey()) {
$form->{$componentproviderbase.'_loggedoff'}[$processor->name] = 1;
}
// Record the site preference.
$preferences[$processor->name.'_provider_'.$componentprovidersetting] = $value;
$newpreferences[$processor->name.'_provider_'.$componentprovidersetting] = $value;
}
} else if (array_key_exists($componentprovidersetting, $form)) {
// We must be processing loggedin or loggedoff checkboxes. Store
// defained comma-separated processors as setting value.
// Using array_filter eliminates elements set to 0 above.
$value = join(',', array_keys(array_filter($form->{$componentprovidersetting})));
} else {
$newsettings = array();
if (property_exists($form, $componentprovidersetting)) {
// We must be processing loggedin or loggedoff checkboxes.
// Store defained comma-separated processors as setting value.
// Using array_filter eliminates elements set to 0 above.
$newsettings = array_keys(array_filter($form->{$componentprovidersetting}));
}
// Let's join existing setting values for disabled processors.
$property = 'message_provider_'.$componentprovidersetting;
if (property_exists($preferences, $property)) {
$existingsetting = $preferences->$property;
foreach ($disabledprocessors as $disable) {
if (strpos($existingsetting, $disable->name) > -1) {
$newsettings[] = $disable->name;
}
}
}
$value = join(',', $newsettings);
if (empty($value)) {
$value = null;
}
}
if ($setting != 'permitted') {
// We have already recoded site preferences for 'permitted' type.
$preferences['message_provider_'.$componentprovidersetting] = $value;
$newpreferences['message_provider_'.$componentprovidersetting] = $value;
}
}
}
@@ -102,7 +122,7 @@ if (($form = data_submitted()) && confirm_sesskey()) {
\core_message\api::update_processor_status($processor, $enabled);
}
foreach ($preferences as $name => $value) {
foreach ($newpreferences as $name => $value) {
set_config($name, $value, 'message');
}
$transaction->allow_commit();
+1 -1
View File
@@ -45,7 +45,7 @@ $error = optional_param('error', '', PARAM_ALPHANUM);
admin_externalpage_setup('registrationmoodleorg');
if ($url !== HUB_MOODLEORGHUBURL) {
if (parse_url($url, PHP_URL_HOST) !== parse_url(HUB_MOODLEORGHUBURL, PHP_URL_HOST)) {
// Allow other plugins to confirm registration on custom hubs. Plugins implementing this
// callback need to redirect or exit. See https://docs.moodle.org/en/Hub_registration .
$callbacks = get_plugins_with_function('hub_registration');
+1 -1
View File
@@ -39,7 +39,7 @@ $token = optional_param('token', '', PARAM_TEXT);
admin_externalpage_setup('registrationmoodleorg');
if ($url !== HUB_MOODLEORGHUBURL) {
if (parse_url($url, PHP_URL_HOST) !== parse_url(HUB_MOODLEORGHUBURL, PHP_URL_HOST)) {
// Allow other plugins to renew registration on custom hubs. Plugins implementing this
// callback need to redirect or exit. See https://docs.moodle.org/en/Hub_registration .
$callbacks = get_plugins_with_function('hub_registration');
+49 -40
View File
@@ -361,14 +361,15 @@ class core_admin_renderer extends plugin_renderer_base {
$output = '';
if ($checker->enabled()) {
$output .= $this->container_start('checkforupdates');
$output .= $this->container_start('checkforupdates mb-4');
$output .= $this->single_button(
new moodle_url($reloadurl, array('fetchupdates' => 1)),
get_string('checkforupdates', 'core_plugin')
);
if ($timefetched = $checker->get_last_timefetched()) {
$timefetched = userdate($timefetched, get_string('strftimedatetime', 'core_langconfig'));
$output .= $this->container(get_string('checkforupdateslast', 'core_plugin', $timefetched), 'lasttimefetched');
$output .= $this->container(get_string('checkforupdateslast', 'core_plugin', $timefetched),
'lasttimefetched small text-muted mt-1');
}
$output .= $this->container_end();
}
@@ -823,7 +824,7 @@ class core_admin_renderer extends plugin_renderer_base {
}
}
$updateinfo .= $this->container_start('checkforupdates');
$updateinfo .= $this->container_start('checkforupdates mt-1');
$fetchurl = new moodle_url('/admin/index.php', array('fetchupdates' => 1, 'sesskey' => sesskey(), 'cache' => 0));
$updateinfo .= $this->single_button($fetchurl, get_string('checkforupdates', 'core_plugin'));
if ($fetch) {
@@ -912,7 +913,7 @@ class core_admin_renderer extends plugin_renderer_base {
*/
protected function moodle_available_update_info(\core\update\info $updateinfo) {
$boxclasses = 'moodleupdateinfo';
$boxclasses = 'moodleupdateinfo mb-2';
$info = array();
if (isset($updateinfo->release)) {
@@ -932,7 +933,8 @@ class core_admin_renderer extends plugin_renderer_base {
}
if (isset($updateinfo->download)) {
$info[] = html_writer::link($updateinfo->download, get_string('download'), array('class' => 'info download'));
$info[] = html_writer::link($updateinfo->download, get_string('download'),
array('class' => 'info download btn btn-secondary'));
}
if (isset($updateinfo->url)) {
@@ -940,9 +942,9 @@ class core_admin_renderer extends plugin_renderer_base {
array('class' => 'info more'));
}
$box = $this->output->box_start($boxclasses);
$box .= $this->output->box(implode(html_writer::tag('span', ' ', array('class' => 'separator')), $info), '');
$box .= $this->output->box_end();
$box = $this->output->container_start($boxclasses);
$box .= $this->output->container(implode(html_writer::tag('span', ' | ', array('class' => 'separator')), $info), '');
$box .= $this->output->container_end();
return $box;
}
@@ -1054,7 +1056,7 @@ class core_admin_renderer extends plugin_renderer_base {
$displayname = new html_table_cell(
$icon.
html_writer::span($plugin->displayname, 'pluginname').
html_writer::div($plugin->get_dir(), 'plugindir')
html_writer::div($plugin->get_dir(), 'plugindir text-muted small')
);
$versiondb = new html_table_cell($plugin->versiondb);
@@ -1089,7 +1091,7 @@ class core_admin_renderer extends plugin_renderer_base {
break;
case core_plugin_manager::PLUGIN_STATUS_NODB:
case core_plugin_manager::PLUGIN_STATUS_UPTODATE:
$statusclass .= $dependenciesok ? '' : 'badge-warning';
$statusclass .= $dependenciesok ? 'badge-light' : 'badge-warning';
break;
}
$status = html_writer::span(get_string('status_' . $statuscode, 'core_plugin'), $statusclass);
@@ -1099,7 +1101,7 @@ class core_admin_renderer extends plugin_renderer_base {
new moodle_url($this->page->url, array('abortinstall' => $plugin->component)),
get_string('cancelinstallone', 'core_plugin'),
'post',
array('class' => 'actionbutton cancelinstallone')
array('class' => 'actionbutton cancelinstallone d-block mt-1')
);
}
@@ -1108,7 +1110,7 @@ class core_admin_renderer extends plugin_renderer_base {
new moodle_url($this->page->url, array('abortupgrade' => $plugin->component)),
get_string('cancelupgradeone', 'core_plugin'),
'post',
array('class' => 'actionbutton cancelupgradeone')
array('class' => 'actionbutton cancelupgradeone d-block mt-1')
);
}
@@ -1178,7 +1180,7 @@ class core_admin_renderer extends plugin_renderer_base {
}
}
$out .= $this->output->container_start('actions');
$out .= $this->output->container_start('actions mb-2');
$installableupdates = $pluginman->filter_installable($pluginman->available_updates());
if ($installableupdates) {
@@ -1186,7 +1188,7 @@ class core_admin_renderer extends plugin_renderer_base {
new moodle_url($this->page->url, array('installupdatex' => 1)),
get_string('updateavailableinstallall', 'core_admin', count($installableupdates)),
'post',
array('class' => 'singlebutton updateavailableinstallall')
array('class' => 'singlebutton updateavailableinstallall mr-1')
);
}
@@ -1195,7 +1197,7 @@ class core_admin_renderer extends plugin_renderer_base {
new moodle_url($this->page->url, array('abortinstallx' => 1)),
get_string('cancelinstallall', 'core_plugin', count($installabortable)),
'post',
array('class' => 'singlebutton cancelinstallall')
array('class' => 'singlebutton cancelinstallall mr-1')
);
}
@@ -1204,15 +1206,17 @@ class core_admin_renderer extends plugin_renderer_base {
new moodle_url($this->page->url, array('abortupgradex' => 1)),
get_string('cancelupgradeall', 'core_plugin', count($upgradeabortable)),
'post',
array('class' => 'singlebutton cancelupgradeall')
array('class' => 'singlebutton cancelupgradeall mr-1')
);
}
$out .= html_writer::div(html_writer::link(new moodle_url($this->page->url, array('showallplugins' => 0)),
get_string('plugincheckattention', 'core_plugin')).' '.html_writer::span($sumattention, 'badge'));
get_string('plugincheckattention', 'core_plugin')).' '.html_writer::span($sumattention, 'badge badge-light'),
'btn btn-link mr-1');
$out .= html_writer::div(html_writer::link(new moodle_url($this->page->url, array('showallplugins' => 1)),
get_string('plugincheckall', 'core_plugin')).' '.html_writer::span($sumtotal, 'badge'));
get_string('plugincheckall', 'core_plugin')).' '.html_writer::span($sumtotal, 'badge badge-light'),
'btn btn-link mr-1');
$out .= $this->output->container_end(); // End of .actions container.
$out .= $this->output->container_end(); // End of #plugins-check-info container.
@@ -1280,12 +1284,13 @@ class core_admin_renderer extends plugin_renderer_base {
}
}
$out = $this->output->container_start('plugins-check-dependencies');
$out = $this->output->container_start('plugins-check-dependencies mb-4');
if ($unavailable or $unknown) {
$out .= $this->output->heading(get_string('misdepsunavail', 'core_plugin'));
if ($unknown) {
$out .= $this->output->notification(get_string('misdepsunknownlist', 'core_plugin', implode($unknown, ', ')));
$out .= $this->output->render((new \core\output\notification(get_string('misdepsunknownlist', 'core_plugin',
implode(', ', $unknown))))->set_show_closebutton(false));
}
if ($unavailable) {
$unavailablelist = array();
@@ -1299,18 +1304,18 @@ class core_admin_renderer extends plugin_renderer_base {
}
$unavailablelist[] = $unavailablelistitem;
}
$out .= $this->output->notification(get_string('misdepsunavaillist', 'core_plugin',
implode($unavailablelist, ', ')));
$out .= $this->output->render((new \core\output\notification(get_string('misdepsunavaillist', 'core_plugin',
implode(', ', $unavailablelist))))->set_show_closebutton(false));
}
$out .= $this->output->container_start('plugins-check-dependencies-actions');
$out .= $this->output->container_start('plugins-check-dependencies-actions mb-4');
$out .= ' '.html_writer::link(new moodle_url('/admin/tool/installaddon/'),
get_string('dependencyuploadmissing', 'core_plugin'));
get_string('dependencyuploadmissing', 'core_plugin'), array('class' => 'btn btn-secondary'));
$out .= $this->output->container_end(); // End of .plugins-check-dependencies-actions container.
}
if ($available) {
$out .= $this->output->heading(get_string('misdepsavail', 'core_plugin'));
$out .= $this->output->container_start('plugins-check-dependencies-actions');
$out .= $this->output->container_start('plugins-check-dependencies-actions mb-2');
$installable = $pluginman->filter_installable($available);
if ($installable) {
@@ -1318,12 +1323,13 @@ class core_admin_renderer extends plugin_renderer_base {
new moodle_url($this->page->url, array('installdepx' => 1)),
get_string('dependencyinstallmissing', 'core_plugin', count($installable)),
'post',
array('class' => 'singlebutton dependencyinstallmissing')
array('class' => 'singlebutton dependencyinstallmissing d-inline-block mr-1')
);
}
$out .= html_writer::div(html_writer::link(new moodle_url('/admin/tool/installaddon/'),
get_string('dependencyuploadmissing', 'core_plugin')), 'dependencyuploadmissing');
get_string('dependencyuploadmissing', 'core_plugin'), array('class' => 'btn btn-link')),
'dependencyuploadmissing d-inline-block mr-1');
$out .= $this->output->container_end(); // End of .plugins-check-dependencies-actions container.
@@ -1364,7 +1370,7 @@ class core_admin_renderer extends plugin_renderer_base {
if ($CFG->branch == str_replace('.', '', $moodle->release)) {
$supportedmoodles[] = html_writer::span($moodle->release, 'badge badge-success');
} else {
$supportedmoodles[] = html_writer::span($moodle->release, 'label');
$supportedmoodles[] = html_writer::span($moodle->release, 'badge badge-light');
}
}
@@ -1378,7 +1384,7 @@ class core_admin_renderer extends plugin_renderer_base {
}
$info = html_writer::div(
get_string('requiredby', 'core_plugin', implode(', ', $requriedby)),
'requiredby'
'requiredby mb-1'
);
} else {
$info = '';
@@ -1389,35 +1395,36 @@ class core_admin_renderer extends plugin_renderer_base {
$info .= html_writer::div(
html_writer::link('https://moodle.org/plugins/view.php?plugin='.$plugin->component,
get_string('misdepinfoplugin', 'core_plugin')),
'misdepinfoplugin'
'misdepinfoplugin d-inline-block mr-3 mb-1'
);
$info .= html_writer::div(
html_writer::link('https://moodle.org/plugins/pluginversion.php?id='.$plugin->version->id,
get_string('misdepinfoversion', 'core_plugin')),
'misdepinfoversion'
'misdepinfoversion d-inline-block mr-3 mb-1'
);
$info .= html_writer::div(html_writer::link($plugin->version->downloadurl, get_string('download')), 'misdepdownload');
$info .= html_writer::div(html_writer::link($plugin->version->downloadurl, get_string('download')),
'misdepdownload d-inline-block mr-3 mb-1');
if ($pluginman->is_remote_plugin_installable($plugin->component, $plugin->version->version, $reason)) {
$info .= $this->output->single_button(
new moodle_url($this->page->url, array('installdep' => $plugin->component)),
get_string('dependencyinstall', 'core_plugin'),
'post',
array('class' => 'singlebutton dependencyinstall')
array('class' => 'singlebutton dependencyinstall mr-3 mb-1')
);
} else {
$reasonhelp = $this->info_remote_plugin_not_installable($reason);
if ($reasonhelp) {
$info .= html_writer::div($reasonhelp, 'reasonhelp dependencyinstall');
$info .= html_writer::div($reasonhelp, 'reasonhelp dependencyinstall d-inline-block mr-3 mb-1');
}
}
$info .= $this->output->container_end(); // End of .actions container.
$table->data[] = array(
html_writer::div($plugin->name, 'name').' '.html_writer::div($plugin->component, 'component'),
html_writer::div($plugin->name, 'name').' '.html_writer::div($plugin->component, 'component text-muted small'),
$plugin->version->release,
$plugin->version->version,
implode($supportedmoodles, ' '),
@@ -1463,7 +1470,7 @@ class core_admin_renderer extends plugin_renderer_base {
foreach ($pluginman->resolve_requirements($plugin, $version) as $reqname => $reqinfo) {
if ($reqname === 'core') {
if ($reqinfo->status == $pluginman::REQUIREMENT_STATUS_OK) {
$class = 'requires-ok';
$class = 'requires-ok text-muted';
$label = '';
} else {
$class = 'requires-failed';
@@ -1480,7 +1487,7 @@ class core_admin_renderer extends plugin_renderer_base {
if ($reqinfo->status == $pluginman::REQUIREMENT_STATUS_OK) {
$label = '';
$class = 'requires-ok';
$class = 'requires-ok text-muted';
} else if ($reqinfo->status == $pluginman::REQUIREMENT_STATUS_MISSING) {
if ($reqinfo->availability == $pluginman::REQUIREMENT_AVAILABLE) {
@@ -1534,13 +1541,14 @@ class core_admin_renderer extends plugin_renderer_base {
return '';
}
$out = html_writer::tag('ul', implode("\n", $requires));
$out = html_writer::tag('ul', implode("\n", $requires), array('class' => 'm-0'));
if ($displayuploadlink) {
$out .= html_writer::div(
html_writer::link(
new moodle_url('/admin/tool/installaddon/'),
get_string('dependencyuploadmissing', 'core_plugin')
get_string('dependencyuploadmissing', 'core_plugin'),
array('class' => 'btn btn-secondary btn-sm m-1')
),
'dependencyuploadmissing'
);
@@ -1550,7 +1558,8 @@ class core_admin_renderer extends plugin_renderer_base {
$out .= html_writer::div(
html_writer::link(
new moodle_url($this->page->url, array('sesskey' => sesskey(), 'fetchupdates' => 1)),
get_string('checkforupdates', 'core_plugin')
get_string('checkforupdates', 'core_plugin'),
array('class' => 'btn btn-secondary btn-sm m-1')
),
'checkforupdates'
);
@@ -157,19 +157,19 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
// Allowed roles.
$allow = optional_param_array('allowassign', null, PARAM_INT);
if (!is_null($allow)) {
$this->allowassign = $allow;
$this->allowassign = array_filter($allow);
}
$allow = optional_param_array('allowoverride', null, PARAM_INT);
if (!is_null($allow)) {
$this->allowoverride = $allow;
$this->allowoverride = array_filter($allow);
}
$allow = optional_param_array('allowswitch', null, PARAM_INT);
if (!is_null($allow)) {
$this->allowswitch = $allow;
$this->allowswitch = array_filter($allow);
}
$allow = optional_param_array('allowview', null, PARAM_INT);
if (!is_null($allow)) {
$this->allowview = $allow;
$this->allowview = array_filter($allow);
}
// Now read the permissions for each capability.
@@ -589,7 +589,9 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
if ($this->roleid == 0) {
$options[-1] = get_string('thisnewrole', 'core_role');
}
return html_writer::select($options, 'allow'.$type.'[]', $selected, false, array('multiple' => 'multiple',
return
html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'allow'.$type.'[]', 'value' => "")) .
html_writer::select($options, 'allow'.$type.'[]', $selected, false, array('multiple' => 'multiple',
'size' => 10, 'class' => 'form-control'));
}
-7
View File
@@ -105,13 +105,6 @@ if (($hassiteconfig || has_any_capability(array(
new lang_string('sitebackpack_help', 'badges'),
1, $choices));
$warning = badges_verify_site_backpack();
if (!empty($warning)) {
$backpacksettings->add(new admin_setting_description('badges_site_backpack_verify',
new lang_string('sitebackpackverify', 'badges'),
$warning));
}
$ADMIN->add('badges', $backpacksettings);
$ADMIN->add('badges',
+4 -1
View File
@@ -97,7 +97,10 @@ $options = array(
GETREMOTEADDR_SKIP_HTTP_CLIENT_IP => 'HTTP_X_FORWARDED_FOR, REMOTE_ADDR',
GETREMOTEADDR_SKIP_HTTP_X_FORWARDED_FOR => 'HTTP_CLIENT, REMOTE_ADDR',
GETREMOTEADDR_SKIP_HTTP_X_FORWARDED_FOR|GETREMOTEADDR_SKIP_HTTP_CLIENT_IP => 'REMOTE_ADDR');
$temp->add(new admin_setting_configselect('getremoteaddrconf', new lang_string('getremoteaddrconf', 'admin'), new lang_string('configgetremoteaddrconf', 'admin'), 0, $options));
$temp->add(new admin_setting_configselect('getremoteaddrconf', new lang_string('getremoteaddrconf', 'admin'),
new lang_string('configgetremoteaddrconf', 'admin'),
GETREMOTEADDR_SKIP_DEFAULT, $options));
$temp->add(new admin_setting_configtext('reverseproxyignore', new lang_string('reverseproxyignore', 'admin'), new lang_string('configreverseproxyignore', 'admin'), ''));
$temp->add(new admin_setting_heading('webproxy', new lang_string('webproxy', 'admin'), new lang_string('webproxyinfo', 'admin')));
$temp->add(new admin_setting_configtext('proxyhost', new lang_string('proxyhost', 'admin'), new lang_string('configproxyhost', 'admin'), '', PARAM_HOST));
+3 -1
View File
@@ -49,6 +49,8 @@ $logid = optional_param('logid', null, PARAM_INT);
$download = optional_param('download', false, PARAM_BOOL);
if (null !== $logid) {
// Raise memory limit in case the log is large.
raise_memory_limit(MEMORY_HUGE);
$log = $DB->get_record('task_log', ['id' => $logid], '*', MUST_EXIST);
if ($download) {
@@ -65,7 +67,7 @@ $renderer = $PAGE->get_renderer('tool_task');
echo $OUTPUT->header();
echo $OUTPUT->render_from_template('core_admin/tasklogs', (object) [
'action' => $pageurl->out(),
'filter' => $filter,
'filter' => htmlentities($filter),
'resultfilteroptions' => [
(object) [
'value' => -1,
+2 -1
View File
@@ -46,7 +46,8 @@ if ($data) {
$emailuser->email = $data->recipient;
$emailuser->id = -99;
$subject = get_string('testoutgoingmailconf_subject', 'admin', $SITE->fullname);
$subject = get_string('testoutgoingmailconf_subject', 'admin',
format_string($SITE->fullname, true, ['context' => context_system::instance()]));
$messagetext = get_string('testoutgoingmailconf_message', 'admin');
// Manage Moodle debugging options.
+6
View File
@@ -164,6 +164,8 @@ if ($options['install']) {
mtrace("Acceptance tests site installed");
}
// Note: Do not build the themes here. This is done during the 'enable' stage.
} else if ($options['drop']) {
// Ensure no tests are running.
test_lock::acquire('behat');
@@ -182,6 +184,10 @@ if ($options['install']) {
// Enable test mode.
behat_util::start_test_mode($options['add-core-features-to-theme'], $options['optimize-runs'], $parallel, $run);
// Themes are only built in the 'enable' command.
behat_util::build_themes();
mtrace("Testing environment themes built");
// This is only displayed once for parallel install.
if (empty($run)) {
// Notify user that 2.5 profile has been converted to 3.5.
+1 -1
View File
@@ -32,7 +32,7 @@ require_once($CFG->libdir . '/behat/classes/behat_config_manager.php');
// systems, but let's allow room for expansion.
core_php_time_limit::raise(300);
$filter = optional_param('filter', '', PARAM_ALPHANUMEXT);
$filter = optional_param('filter', '', PARAM_NOTAGS);
$type = optional_param('type', false, PARAM_ALPHAEXT);
$component = optional_param('component', '', PARAM_ALPHAEXT);
+2 -2
View File
@@ -55,13 +55,13 @@ class tool_behat {
// The loaded steps depends on the component specified.
behat_config_manager::update_config_file($component, false);
// The Moodle\BehatExtension\HelpPrinter\MoodleDefinitionsPrinter will parse this search format.
// The Moodle\BehatExtension\Definition\Printer\ConsoleDefinitionInformationPrinter will parse this search format.
if ($type) {
$filter .= '&&' . $type;
}
if ($filter) {
$filteroption = ' -d "' . $filter . '"';
$filteroption = ' -d ' . escapeshellarg($filter);
} else {
$filteroption = ' -di';
}
+8 -17
View File
@@ -44,13 +44,9 @@ class tool_behat_renderer extends plugin_renderer_base {
global $CFG;
require_once($CFG->libdir . '/behat/classes/behat_selectors.php');
$html = $this->generic_info();
// Form.
ob_start();
$form->display();
$html .= ob_get_contents();
ob_end_clean();
$html = $this->output->header();
$html .= $this->output->heading(get_string('pluginname', 'tool_behat'));
$html .= $form->render();
if (empty($stepsdefinitions)) {
$stepsdefinitions = get_string('nostepsdefinitions', 'tool_behat');
@@ -128,7 +124,9 @@ class tool_behat_renderer extends plugin_renderer_base {
*/
public function render_error($msg) {
$html = $this->generic_info();
$html = $this->output->header();
$html .= $this->output->heading(get_string('pluginname', 'tool_behat'));
$html .= $this->generic_info();
$a = new stdClass();
$a->errormsg = $msg;
@@ -153,13 +151,7 @@ class tool_behat_renderer extends plugin_renderer_base {
*
* @return string
*/
protected function generic_info() {
$title = get_string('pluginname', 'tool_behat');
// Header.
$html = $this->output->header();
$html .= $this->output->heading($title);
public function generic_info() {
// Info.
$installurl = behat_command::DOCS_URL;
@@ -175,8 +167,7 @@ class tool_behat_renderer extends plugin_renderer_base {
);
// List of steps.
$html .= $this->output->box_start();
$html .= html_writer::tag('h3', get_string('infoheading', 'tool_behat'));
$html = $this->output->box_start();
$html .= html_writer::tag('div', get_string('aim', 'tool_behat'));
$html .= html_writer::start_tag('div');
$html .= html_writer::start_tag('ul');
@@ -40,8 +40,14 @@ class steps_definitions_form extends moodleform {
* @return void
*/
public function definition() {
global $PAGE;
$mform = $this->_form;
$output = $PAGE->get_renderer('tool_behat');
$mform->addElement('header', 'info', get_string('infoheading', 'tool_behat'));
$mform->setExpanded('info', false);
$mform->addElement('html', $output->generic_info());
$mform->addElement('header', 'filters', get_string('stepsdefinitionsfilters', 'tool_behat'));
+20 -14
View File
@@ -1,25 +1,31 @@
.steps-definitions {
border-style: solid;
border-width: 1px;
border-color: #bbb;
padding: 5px;
margin: auto;
width: 50%;
#page-admin-tool-behat-index .steps-definitions {
margin: 1rem auto;
}
.steps-definitions .step {
margin: 10px 0 10px 0;
#page-admin-tool-behat-index .steps-definitions .step {
margin: 1rem 0 0 0;
border: 1px solid #eee;
padding: 1rem;
}
.steps-definitions .stepdescription {
color: #bf8c12;
#page-admin-tool-behat-index .steps-definitions .stepdescription {
font-style: italic;
}
.steps-definitions .steptype {
#page-admin-tool-behat-index .steps-definitions .stepcontent {
margin: 1rem 0;
}
#page-admin-tool-behat-index .steps-definitions .steptype {
color: #1467a6;
margin-right: 5px;
margin-right: 1ex;
}
.steps-definitions .stepregex {
#page-admin-tool-behat-index .steps-definitions .stepapipath {
font-family: monospace;
font-size: smaller;
}
#page-admin-tool-behat-index .steps-definitions .stepregex {
color: #060;
}
@@ -26,3 +26,11 @@ Feature: List the system steps definitions
Given I set the field "Contains" to "homepage"
When I press "Filter"
Then I should see "Opens Moodle homepage."
@javascript
Scenario: Filtering by the multiple words pattern
Given I set the field "Contains" to "should exist"
When I press "Filter"
Then I should not see "There aren't steps definitions matching this filter"
And I should see "Checks the provided element and selector type exists in the current page."
And I should see "Checks that an element and selector type exists in another element and selector type on the current page."
+14 -4
View File
@@ -75,6 +75,7 @@ class tool_capability_renderer extends plugin_renderer_base {
* @return string
*/
public function capability_comparison_table(array $capabilities, $contextid, array $roles) {
static $capabilitycontexts = array();
$strpermissions = $this->get_permission_strings();
$permissionclasses = $this->get_permission_classes();
@@ -92,8 +93,13 @@ class tool_capability_renderer extends plugin_renderer_base {
}
$table->data = array();
$childcontextsids = [];
foreach ($capabilities as $capability) {
$contexts = tool_capability_calculate_role_data($capability, $roles);
if (empty($capabilitycontexts[$capability])) {
$capabilitycontexts[$capability] = tool_capability_calculate_role_data($capability, $roles);
}
$contexts = $capabilitycontexts[$capability];
$captitle = new html_table_cell(get_capability_string($capability) . html_writer::span($capability));
$captitle->header = true;
@@ -111,6 +117,10 @@ class tool_capability_renderer extends plugin_renderer_base {
}
$table->data[] = $row;
if (!empty($contexts[$contextid]->children)) {
$childcontextsids = array_merge($childcontextsids, $contexts[$contextid]->children);
$childcontextsids = array_unique($childcontextsids);
}
}
// Start the list item, and print the context name as a link to the place to make changes.
@@ -127,9 +137,9 @@ class tool_capability_renderer extends plugin_renderer_base {
$html = $this->output->heading(html_writer::link($url, $context->get_context_name(), ['title' => $title]), 3);
$html .= html_writer::table($table);
// If there are any child contexts, print them recursively.
if (!empty($contexts[$contextid]->children)) {
foreach ($contexts[$contextid]->children as $childcontextid) {
$html .= $this->capability_comparison_table($capabilities, $childcontextid, $roles, true);
if (!empty($childcontextsids)) {
foreach ($childcontextsids as $childcontextid) {
$html .= $this->capability_comparison_table($capabilities, $childcontextid, $roles);
}
}
return $html;
@@ -0,0 +1,97 @@
@tool @tool_capability
Feature: Show capabilities for multiple contexts
In order to check roles capabilities
As an admin
I need to be able to see capability overrides on several contexts
Background:
And the following "courses" exist:
| fullname | shortname | category |
| Course 1 | C1 | 0 |
| Course 2 | C2 | 0 |
And the following "permission overrides" exist:
| capability | permission | role | contextlevel | reference |
| enrol/category:config | Allow | student | Course | C1 |
| enrol/cohort:unenrol | Allow | student | Course | C2 |
And I log in as "admin"
And I navigate to "Users > Permissions > Capability overview" in site administration
Scenario: Show capabilities table with one capability with overrides
When I set the following fields to these values:
| Capability: | enrol/category:config |
| Roles: | Student |
And I click on "Get the overview" "button"
Then I should see "System"
And I should see "Category: Miscellaneous"
And I should see "Course: Course 1"
And I should not see "Course: Course 2"
Scenario: Show capabilities table with one capability without overrides
When I set the following fields to these values:
| Capability: | enrol/cohort:config |
| Roles: | Student |
And I click on "Get the overview" "button"
Then I should see "System"
And I should not see "Category: Miscellaneous"
And I should not see "Course: Course 1"
And I should not see "Course: Course 2"
Scenario: Show capabilities table with two capabilities, 1st without overrides and 2nd with
When I set the following fields to these values:
| Capability: | enrol/category:synchronised, enrol/category:config |
| Roles: | Student |
And I click on "Get the overview" "button"
Then I should see "System"
And I should see "Category: Miscellaneous"
And I should see "Course: Course 1"
And I should not see "Course: Course 2"
Scenario: Show capabilities table with two capabilities, 1st with overrides and 2nd without
When I set the following fields to these values:
| Capability: | enrol/category:config, enrol/cohort:config |
| Roles: | Student |
And I click on "Get the overview" "button"
Then I should see "System"
And I should see "Category: Miscellaneous"
And I should see "Course: Course 1"
And I should not see "Course: Course 2"
Scenario: Show capabilities table with two capabilities, none with overrides
When I set the following fields to these values:
| Capability: | enrol/category:synchronised, enrol/cohort:config |
| Roles: | Student |
And I click on "Get the overview" "button"
Then I should see "System"
And I should not see "Category: Miscellaneous"
And I should not see "Course: Course 1"
And I should not see "Course: Course 2"
Scenario: Show capabilities table with capability with override and no role selected
When I set the following fields to these values:
| Capability: | enrol/category:config |
| Roles: | |
And I click on "Get the overview" "button"
Then I should see "System"
And I should see "Category: Miscellaneous"
And I should see "Course: Course 1"
And I should not see "Course: Course 2"
Scenario: Show capabilities table with capability without override and no role selected
When I set the following fields to these values:
| Capability: | enrol/cohort:config |
| Roles: | |
And I click on "Get the overview" "button"
Then I should see "System"
And I should not see "Category: Miscellaneous"
And I should not see "Course: Course 1"
And I should not see "Course: Course 2"
Scenario: Show capabilities table with capability with two overrides on different contexts
When I set the following fields to these values:
| Capability: | enrol/category:config, enrol/cohort:unenrol |
| Roles: | |
And I click on "Get the overview" "button"
Then I should see "System"
And I should see "Category: Miscellaneous"
And I should see "Course: Course 1"
And I should see "Course: Course 2"
+4
View File
@@ -144,6 +144,10 @@ class api {
$rolesadded = array();
$rolesremoved = array();
// Remove any cohort role mappings for roles which have been deleted.
// The role assignments are not a consideration because these will have been removed when the role was.
$DB->delete_records_select('tool_cohortroles', "roleid NOT IN (SELECT id FROM {role})");
// Get all cohort role assignments and group them by user and role.
$all = cohort_role_assignment::get_records(array(), 'userid, roleid');
// We build an better structure to loop on.
+45
View File
@@ -0,0 +1,45 @@
<?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/>.
/**
* Plugin upgrade code
*
* @package tool_cohortroles
* @copyright 2020 Paul Holden <paulh@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Function to upgrade tool_cohortroles.
*
* @param int $oldversion the version we are upgrading from
* @return bool result
*/
function xmldb_tool_cohortroles_upgrade($oldversion) {
global $DB;
if ($oldversion < 2019052001) {
// Delete any tool_cohortroles mappings for roles which no longer exist.
$DB->delete_records_select('tool_cohortroles', 'roleid NOT IN (SELECT id FROM {role})');
// Cohortroles savepoint reached.
upgrade_plugin_savepoint(true, 2019052001, 'tool', 'cohortroles');
}
return true;
}
+1 -1
View File
@@ -25,7 +25,7 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
$plugin->version = 2019052001; // The current plugin version (Date: YYYYMMDDXX).
$plugin->requires = 2019051100; // Requires this Moodle version.
$plugin->component = 'tool_cohortroles'; // Full name of the plugin (used for diagnostics).
+1 -1
View File
@@ -1 +1 @@
define(["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events","core/templates"],function(a,b,c,d,e,f,g){function h(a){var e={methodname:"tool_dataprivacy_contact_dpo",args:{message:a}},f="success";b.call([e])[0].then(function(a){return a.result?d.get_string("requestsubmitted","tool_dataprivacy"):(f="error",a.warnings.join("<br>"))}).done(function(a){c.addNotification({message:a,type:f})}).fail(c.exception)}var i={CANCEL_REQUEST:'[data-action="cancel"]',CONTACT_DPO:'[data-action="contactdpo"]'},j=function(){this.registerEvents()};return j.prototype.registerEvents=function(){a(i.CANCEL_REQUEST).click(function(g){g.preventDefault();var h=a(this).data("requestid"),i=[{key:"cancelrequest",component:"tool_dataprivacy"},{key:"cancelrequestconfirmation",component:"tool_dataprivacy"}];d.get_strings(i).then(function(a){var d=a[0],g=a[1];return e.create({title:d,body:g,type:e.types.SAVE_CANCEL}).then(function(a){return a.setSaveButtonText(d),a.getRoot().on(f.save,function(){var a={requestid:h},d={methodname:"tool_dataprivacy_cancel_data_request",args:a};b.call([d])[0].done(function(a){a.result?window.location.reload():c.addNotification({message:a.warnings[0].message,type:"error"})}).fail(c.exception)}),a.getRoot().on(f.hidden,function(){a.destroy()}),a})}).done(function(a){a.show()}).fail(c.exception)}),a(i.CONTACT_DPO).click(function(b){b.preventDefault();var i=a(this).data("replytoemail"),j=[{key:"contactdataprotectionofficer",component:"tool_dataprivacy"},{key:"send",component:"tool_dataprivacy"}],k="";d.get_strings(j).then(function(a){var b=a[0];k=a[1];var c={replytoemail:i};return e.create({title:b,body:g.render("tool_dataprivacy/contact_dpo",c),type:e.types.SAVE_CANCEL,large:!0})}).done(function(b){b.setSaveButtonText(k),b.getRoot().on(f.save,function(b){var c=a("#message").val().trim();0===c.length?(b.preventDefault(),a('[data-region="messageinput"]').addClass("has-danger notifyproblem"),a("#id_error_message").removeAttr("hidden")):h(c)}),b.getRoot().on(f.hidden,function(){b.destroy()}),b.show()}).fail(c.exception)})},{init:function(){return new j}}});
define(["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events","core/templates","core/pending"],function(a,b,c,d,e,f,g,h){function i(a){var e={methodname:"tool_dataprivacy_contact_dpo",args:{message:a}},f="success";b.call([e])[0].then(function(a){return a.result?d.get_string("requestsubmitted","tool_dataprivacy"):(f="error",a.warnings.join("<br>"))}).done(function(a){c.addNotification({message:a,type:f})}).fail(c.exception)}var j={CANCEL_REQUEST:'[data-action="cancel"]',CONTACT_DPO:'[data-action="contactdpo"]'},k=function(){this.registerEvents()};return k.prototype.registerEvents=function(){a(j.CANCEL_REQUEST).click(function(g){g.preventDefault();var h=a(this).data("requestid"),i=[{key:"cancelrequest",component:"tool_dataprivacy"},{key:"cancelrequestconfirmation",component:"tool_dataprivacy"}];d.get_strings(i).then(function(a){var d=a[0],g=a[1];return e.create({title:d,body:g,type:e.types.SAVE_CANCEL}).then(function(a){return a.setSaveButtonText(d),a.getRoot().on(f.save,function(){var a={requestid:h},d={methodname:"tool_dataprivacy_cancel_data_request",args:a};b.call([d])[0].done(function(a){a.result?window.location.reload():c.addNotification({message:a.warnings[0].message,type:"error"})}).fail(c.exception)}),a.getRoot().on(f.hidden,function(){a.destroy()}),a})}).done(function(a){a.show()}).fail(c.exception)}),a(j.CONTACT_DPO).click(function(b){var j=new h("dataprivacy/crud:initModal:contactdpo");b.preventDefault();var k=a(this).data("replytoemail"),l=[{key:"contactdataprotectionofficer",component:"tool_dataprivacy"},{key:"send",component:"tool_dataprivacy"}],m="";d.get_strings(l).then(function(a){var b=a[0];m=a[1];var c={replytoemail:k};return e.create({title:b,body:g.render("tool_dataprivacy/contact_dpo",c),type:e.types.SAVE_CANCEL,large:!0})}).then(function(b){b.setSaveButtonText(m),b.show(),b.getRoot().on(f.save,function(b){var c=a("#message").val().trim();0===c.length?(b.preventDefault(),a('[data-region="messageinput"]').addClass("has-danger notifyproblem"),a("#id_error_message").removeAttr("hidden")):i(c)}),b.getRoot().on(f.hidden,function(){b.destroy()})}).then(j.resolve)["catch"](c.exception)})},{init:function(){return new k}}});
@@ -28,8 +28,9 @@ define([
'core/str',
'core/modal_factory',
'core/modal_events',
'core/templates'],
function($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates) {
'core/templates',
'core/pending'],
function($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates, Pending) {
/**
* List of action selectors.
@@ -118,6 +119,7 @@ function($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates) {
});
$(ACTIONS.CONTACT_DPO).click(function(e) {
var pendingPromise = new Pending('dataprivacy/crud:initModal:contactdpo');
e.preventDefault();
var replyToEmail = $(this).data('replytoemail');
@@ -146,9 +148,12 @@ function($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates) {
type: ModalFactory.types.SAVE_CANCEL,
large: true
});
}).done(function(modal) {
}).then(function(modal) {
modal.setSaveButtonText(sendButtonText);
// Show the modal!
modal.show();
// Handle send event.
modal.getRoot().on(ModalEvents.save, function(e) {
var message = $('#message').val().trim();
@@ -169,9 +174,9 @@ function($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates) {
modal.destroy();
});
// Show the modal!
modal.show();
}).fail(Notification.exception);
return;
}).then(pendingPromise.resolve)
.catch(Notification.exception);
});
};
+1 -1
View File
@@ -712,7 +712,7 @@ class api {
'requestedby' => $requestedby->fullname,
'requesttype' => $typetext,
'requestdate' => userdate($requestdata->timecreated),
'requestorigin' => $SITE->fullname,
'requestorigin' => format_string($SITE->fullname, true, ['context' => context_system::instance()]),
'requestoriginurl' => new moodle_url('/'),
'requestcomments' => $requestdata->messagehtml,
'datarequestsurl' => $datarequestsurl
@@ -26,6 +26,7 @@ namespace tool_dataprivacy\task;
use action_link;
use coding_exception;
use context_system;
use core\message\message;
use core\task\adhoc_task;
use core_user;
@@ -152,7 +153,7 @@ class process_data_request_task extends adhoc_task {
$message->name = 'datarequestprocessingresults';
$message->userfrom = $dpo;
$message->replyto = $dpo->email;
$message->replytoname = fullname($dpo->email);
$message->replytoname = fullname($dpo);
$typetext = null;
// Prepare the context data for the email message body.
@@ -180,7 +181,8 @@ class process_data_request_task extends adhoc_task {
$message->contexturl = $datarequestsurl;
$message->contexturlname = get_string('datarequests', 'tool_dataprivacy');
// Message to the recipient.
$messagetextdata['message'] = get_string('resultdownloadready', 'tool_dataprivacy', $SITE->fullname);
$messagetextdata['message'] = get_string('resultdownloadready', 'tool_dataprivacy',
format_string($SITE->fullname, true, ['context' => context_system::instance()]));
// Prepare download link.
$downloadurl = moodle_url::make_pluginfile_url($usercontext->id, 'tool_dataprivacy', 'export', $thing->get_itemid(),
$thing->get_filepath(), $thing->get_filename(), true);
@@ -192,7 +194,8 @@ class process_data_request_task extends adhoc_task {
// No point notifying a deleted user in Moodle.
$message->notification = 0;
// Message to the recipient.
$messagetextdata['message'] = get_string('resultdeleted', 'tool_dataprivacy', $SITE->fullname);
$messagetextdata['message'] = get_string('resultdeleted', 'tool_dataprivacy',
format_string($SITE->fullname, true, ['context' => context_system::instance()]));
// Message will be sent to the deleted user via email only.
$emailonly = true;
break;
+9 -1
View File
@@ -45,13 +45,22 @@ if ($manage) {
$context = context_system::instance();
// Make sure the user has the proper capability.
require_capability('tool/dataprivacy:managedatarequests', $context);
navigation_node::override_active_url($returnurl);
} else {
// For the case where a user makes request for themselves (or for their children if they are the parent).
$returnurl = new moodle_url($CFG->wwwroot . '/admin/tool/dataprivacy/mydatarequests.php');
$context = context_user::instance($USER->id);
}
$PAGE->set_context($context);
if (!$manage && $profilenode = $PAGE->settingsnav->find('myprofile', null)) {
$profilenode->make_active();
}
$title = get_string('createnewdatarequest', 'tool_dataprivacy');
$PAGE->navbar->add($title);
// If contactdataprotectionofficer is disabled, send the user back to the profile page, or the privacy policy page.
// That is, unless you have sufficient capabilities to perform this on behalf of a user.
if (!$manage && !\tool_dataprivacy\api::can_contact_dpo()) {
@@ -100,7 +109,6 @@ if ($data = $mform->get_data()) {
redirect($returnurl, $redirectmessage);
}
$title = get_string('createnewdatarequest', 'tool_dataprivacy');
$PAGE->set_heading($SITE->fullname);
$PAGE->set_title($title);
echo $OUTPUT->header();
+23
View File
@@ -319,5 +319,28 @@ function xmldb_tool_dataprivacy_upgrade($oldversion) {
// Automatically generated Moodle v3.7.0 release upgrade line.
// Put any upgrade step following this.
if ($oldversion < 2019052001) {
// Define field commentsformat to be added to tool_dataprivacy_request.
$table = new xmldb_table('tool_dataprivacy_request');
$field = new xmldb_field('commentsformat', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0', 'comments');
// Conditionally launch add field commentsformat.
if (!$dbman->field_exists($table, $field)) {
$dbman->add_field($table, $field);
}
// Define field dpocommentformat to be added to tool_dataprivacy_request.
$field = new xmldb_field('dpocommentformat', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0', 'dpocomment');
// Conditionally launch add field dpocommentformat.
if (!$dbman->field_exists($table, $field)) {
$dbman->add_field($table, $field);
}
// Dataprivacy savepoint reached.
upgrade_plugin_savepoint(true, 2019052001, 'tool', 'dataprivacy');
}
return true;
}
+7 -1
View File
@@ -42,6 +42,13 @@ if (isguestuser()) {
$usercontext = context_user::instance($USER->id);
$PAGE->set_context($usercontext);
if ($profilenode = $PAGE->settingsnav->find('myprofile', null)) {
$profilenode->make_active();
}
$title = get_string('datarequests', 'tool_dataprivacy');
$PAGE->navbar->add($title);
// Return URL.
$params = ['id' => $USER->id];
if ($courseid) {
@@ -49,7 +56,6 @@ if ($courseid) {
}
$returnurl = new moodle_url('/user/profile.php', $params);
$title = get_string('datarequests', 'tool_dataprivacy');
$PAGE->set_heading($title);
$PAGE->set_title($title);
echo $OUTPUT->header();
+3 -9
View File
@@ -27,12 +27,10 @@ require_once('../../../config.php');
$requestid = required_param('requestid', PARAM_INT);
$confirm = optional_param('confirm', null, PARAM_INT);
$PAGE->set_url(new moodle_url('/admin/tool/dataprivacy/resubmitrequest.php', ['requestid' => $requestid]));
$url = new moodle_url('/admin/tool/dataprivacy/resubmitrequest.php', ['requestid' => $requestid]);
$title = get_string('resubmitrequestasnew', 'tool_dataprivacy');
require_login();
$PAGE->set_context(\context_system::instance());
require_capability('tool/dataprivacy:managedatarequests', $PAGE->context);
\tool_dataprivacy\page_helper::setup($url, $title, 'datarequests', 'tool/dataprivacy:managedatarequests');
$manageurl = new moodle_url('/admin/tool/dataprivacy/datarequests.php');
@@ -53,10 +51,6 @@ if (null !== $confirm && confirm_sesskey()) {
redirect($manageurl, get_string('resubmittedrequest', 'tool_dataprivacy', $stringparams));
}
$heading = get_string('resubmitrequest', 'tool_dataprivacy', $stringparams);
$PAGE->set_title($heading);
$PAGE->set_heading($heading);
echo $OUTPUT->header();
$confirmstring = get_string('confirmrequestresubmit', 'tool_dataprivacy', $stringparams);
+7
View File
@@ -34,6 +34,13 @@ $PAGE->set_context($context);
$PAGE->set_title($title);
$PAGE->set_heading($SITE->fullname);
// If user is logged in, then use profile navigation in breadcrumbs.
if ($profilenode = $PAGE->settingsnav->find('myprofile', null)) {
$profilenode->make_active();
}
$PAGE->navbar->add($title);
$output = $PAGE->get_renderer('tool_dataprivacy');
echo $output->header();
$summarypage = new \tool_dataprivacy\output\summary_page();
@@ -301,6 +301,11 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
$datarequest = api::create_data_request($student->id, api::DATAREQUEST_TYPE_EXPORT);
$requestid = $datarequest->get('id');
// Login as a user without DPO role.
$this->setUser($teacher);
$this->expectException(required_capability_exception::class);
api::approve_data_request($requestid);
}
/**
@@ -12,7 +12,7 @@ Feature: Manage data categories
And I press "Add category"
And I set the field "Name" to "Category 1"
And I set the field "Description" to "Category 1 description"
When I click on "Save" "button" in the "Delete category" "dialogue"
When I click on "Save" "button" in the "Add category" "dialogue"
Then I should see "Category 1" in the "List of data categories" "table"
And I should see "Category 1 description" in the "Category 1" "table_row"
@@ -30,5 +30,5 @@ Feature: Manage data categories
And I choose "Delete" in the open action menu
And I should see "Delete category"
And I should see "Are you sure you want to delete the category 'Category 1'?"
When I click on "Delete" "button" in the "Confirm" "dialogue"
When I click on "Delete" "button" in the "Delete category" "dialogue"
Then I should not see "Category 1" in the "List of data categories" "table"
@@ -52,5 +52,5 @@ Feature: Manage data storage purposes
And I choose "Delete" in the open action menu
And I should see "Delete purpose"
And I should see "Are you sure you want to delete the purpose 'Purpose 1'?"
When I click on "Delete" "button" in the "Confirm" "dialogue"
When I click on "Delete" "button" in the "Delete purpose" "dialogue"
Then I should not see "Purpose 1" in the "List of data purposes" "table"
@@ -0,0 +1,187 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Tests for the plugin privacy provider
*
* @package tool_dataprivacy
* @copyright 2020 Paul Holden <paulh@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
use core_privacy\local\request\userlist;
use core_privacy\local\request\writer;
use core_privacy\tests\provider_testcase;
use tool_dataprivacy\api;
use tool_dataprivacy\local\helper;
use tool_dataprivacy\privacy\provider;
/**
* Privacy provider tests
*
* @package tool_dataprivacy
* @copyright 2020 Paul Holden <paulh@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class tool_dataprivacy_privacy_provider_testcase extends provider_testcase {
/**
* Test provider get_contexts_for_userid method
*
* @return void
*/
public function test_get_contexts_for_userid() {
$this->resetAfterTest();
$user = $this->getDataGenerator()->create_user();
$context = context_user::instance($user->id);
// Returned context list should contain a single item.
$contextlist = $this->get_contexts_for_userid($user->id, 'tool_dataprivacy');
$this->assertCount(1, $contextlist);
// We should have the user context of our test user.
$this->assertSame($context, $contextlist->current());
}
/**
* Test provider get_users_in_context method
*
* @return void
*/
public function test_get_users_in_context() {
$this->resetAfterTest();
$user = $this->getDataGenerator()->create_user();
$context = context_user::instance($user->id);
$userlist = new userlist($context, 'tool_dataprivacy');
provider::get_users_in_context($userlist);
$this->assertEquals([$user->id], $userlist->get_userids());
}
/**
* Test provider get_users_in_context method for a non-user context
*
* @return void
*/
public function test_get_users_in_context_non_user_context() {
$context = context_system::instance();
$userlist = new userlist($context, 'tool_dataprivacy');
provider::get_users_in_context($userlist);
$this->assertEmpty($userlist);
}
/**
* Test provider export_user_data method
*
* @return void
*/
public function test_export_user_data() {
$this->resetAfterTest();
$user = $this->getDataGenerator()->create_user();
$context = context_user::instance($user->id);
$this->setUser($user);
// Create an export request, approve it.
$requestexport = api::create_data_request($user->id, api::DATAREQUEST_TYPE_EXPORT,
'Please export my stuff');
api::update_request_status($requestexport->get('id'), api::DATAREQUEST_STATUS_APPROVED);
// Create a deletion request, reject it.
$requestdelete = api::create_data_request($user->id, api::DATAREQUEST_TYPE_DELETE);
api::update_request_status($requestdelete->get('id'), api::DATAREQUEST_STATUS_REJECTED, 0, 'Nope');
$this->export_context_data_for_user($user->id, $context, 'tool_dataprivacy');
/** @var \core_privacy\tests\request\content_writer $writer */
$writer = writer::with_context($context);
$this->assertTrue($writer->has_any_data());
/** @var stdClass[] $data */
$data = (array) $writer->get_data([
get_string('privacyandpolicies', 'admin'),
get_string('datarequests', 'tool_dataprivacy'),
]);
$this->assertCount(2, $data);
$strs = get_strings(['requesttypeexportshort', 'requesttypedeleteshort',
'statusapproved', 'statusrejected', 'creationmanual'], 'tool_dataprivacy');
// First item is the approved export request.
$this->assertEquals($strs->requesttypeexportshort, $data[0]->type);
$this->assertEquals($strs->statusapproved, $data[0]->status);
$this->assertEquals($strs->creationmanual, $data[0]->creationmethod);
$this->assertEquals($requestexport->get('comments'), $data[0]->comments);
$this->assertEmpty($data[0]->dpocomment);
$this->assertNotEmpty($data[0]->timecreated);
// Next is the rejected deletion request.
$this->assertEquals($strs->requesttypedeleteshort, $data[1]->type);
$this->assertEquals($strs->statusrejected, $data[1]->status);
$this->assertEquals($strs->creationmanual, $data[1]->creationmethod);
$this->assertEmpty($data[1]->comments);
$this->assertContains('Nope', $data[1]->dpocomment);
$this->assertNotEmpty($data[1]->timecreated);
}
/**
* Test class export_user_preferences method
*
* @return void
*/
public function test_export_user_preferences() {
$this->resetAfterTest();
$user = $this->getDataGenerator()->create_user();
$this->setUser($user);
// Set filters preference.
$filters = [
helper::FILTER_TYPE . ':' . api::DATAREQUEST_TYPE_EXPORT,
helper::FILTER_STATUS . ':' . api::DATAREQUEST_STATUS_PENDING,
];
set_user_preference(helper::PREF_REQUEST_FILTERS, json_encode($filters), $user);
// Set paging preference.
set_user_preference(helper::PREF_REQUEST_PERPAGE, 6, $user);
provider::export_user_preferences($user->id);
/** @var \core_privacy\tests\request\content_writer $writer */
$writer = writer::with_context(context_system::instance());
$this->assertTrue($writer->has_any_data());
/** @var stdClass[] $preferences */
$preferences = (array) $writer->get_user_preferences('tool_dataprivacy');
$this->assertCount(2, $preferences);
$this->assertEquals((object) [
'value' => '1:1, 2:0',
'description' => 'Type: Export, Status: Pending',
], $preferences[helper::PREF_REQUEST_FILTERS]);
$this->assertEquals(6, $preferences[helper::PREF_REQUEST_PERPAGE]->value);
}
}
+1 -1
View File
@@ -24,6 +24,6 @@
defined('MOODLE_INTERNAL') || die;
$plugin->version = 2019052000;
$plugin->version = 2019052001;
$plugin->requires = 2019051100; // Moodle 3.5dev (Build 2018031600) and upwards.
$plugin->component = 'tool_dataprivacy';
+1 -1
View File
@@ -1 +1 @@
define(["core/yui"],function(a){var b=function(b,c,d,e,f){this.yuiDialogue=null;var g=this;"undefined"==typeof f&&(f=!1),a.use("moodle-core-notification","timers",function(){var h="480px";f&&(h="800px"),g.yuiDialogue=new M.core.dialogue({headerContent:b,bodyContent:c,draggable:!0,visible:!1,center:!0,modal:!0,width:h}),g.yuiDialogue.after("visibleChange",function(b){b.newVal?"undefined"!=typeof d&&a.soon(function(){d(g),g.yuiDialogue.centerDialogue()}):"undefined"!=typeof e&&a.soon(function(){e(g)})}),g.yuiDialogue.show()})};return b.prototype.close=function(){this.yuiDialogue.hide(),this.yuiDialogue.destroy()},b.prototype.getContent=function(){return this.yuiDialogue.bodyNode.getDOMNode()},b});
define(["core/yui"],function(a){var b=function(b,c,d,e,f){M.util.js_pending("tool_lp/dialogue:dialogue"),this.yuiDialogue=null;var g=this;"undefined"==typeof f&&(f=!1),a.use("moodle-core-notification","timers",function(){var h="480px";f&&(h="800px"),g.yuiDialogue=new M.core.dialogue({headerContent:b,bodyContent:c,draggable:!0,visible:!1,center:!0,modal:!0,width:h}),g.yuiDialogue.before("visibleChange",function(){M.util.js_pending("tool_lp/dialogue:before:visibleChange")}),g.yuiDialogue.after("visibleChange",function(b){b.newVal?"undefined"!=typeof d?a.soon(function(){d(g),g.yuiDialogue.centerDialogue(),M.util.js_complete("tool_lp/dialogue:before:visibleChange")}):M.util.js_complete("tool_lp/dialogue:before:visibleChange"):"undefined"!=typeof e?a.soon(function(){e(g),M.util.js_complete("tool_lp/dialogue:before:visibleChange")}):M.util.js_complete("tool_lp/dialogue:before:visibleChange")}),g.yuiDialogue.show(),M.util.js_complete("tool_lp/dialogue:dialogue")})};return b.prototype.close=function(){this.yuiDialogue.hide(),this.yuiDialogue.destroy()},b.prototype.getContent=function(){return this.yuiDialogue.bodyNode.getDOMNode()},b});
+1 -1
View File
@@ -1 +1 @@
define(["jquery","core/notification","core/templates","tool_lp/dialogue","tool_lp/event_base","core/str"],function(a,b,c,d,e,f){var g=function(a){e.prototype.constructor.apply(this,[]),this._ratingOptions=a};return g.prototype=Object.create(e.prototype),g.prototype._popup=null,g.prototype._ratingOptions=null,g.prototype._afterRender=function(){var b=this._find('[data-action="rate"]'),c=this._find('[name="rating"]'),d=this._find('[name="comment"]');this._find('[data-action="cancel"]').click(function(a){a.preventDefault(),this._trigger("cancelled"),this.close()}.bind(this)),c.change(function(){var c=a(this);c.val()?b.prop("disabled",!1):b.prop("disabled",!0)}).change(),b.click(function(a){a.preventDefault();var b=c.val();b&&(this._trigger("rated",{rating:b,note:d.val()}),this.close())}.bind(this))},g.prototype.close=function(){this._popup.close(),this._popup=null},g.prototype.display=function(){return a.when(f.get_string("rate","tool_lp"),this._render()).then(function(a,b){return this._popup=new d(a,b[0],this._afterRender.bind(this)),this._popup}.bind(this))["catch"](b.exception)},g.prototype._find=function(b){return a(this._popup.getContent()).find(b)},g.prototype._render=function(){var a={cangrade:this._canGrade,ratings:this._ratingOptions};return c.render("tool_lp/competency_grader",a)},g});
define(["jquery","core/notification","core/templates","tool_lp/dialogue","tool_lp/event_base","core/str"],function(a,b,c,d,e,f){var g=function(a){e.prototype.constructor.apply(this,[]),this._ratingOptions=a};return g.prototype=Object.create(e.prototype),g.prototype._popup=null,g.prototype._ratingOptions=null,g.prototype._afterRender=function(){var b=this._find('[data-action="rate"]'),c=this._find('[name="rating"]'),d=this._find('[name="comment"]');this._find('[data-action="cancel"]').click(function(a){a.preventDefault(),this._trigger("cancelled"),this.close()}.bind(this)),c.change(function(){var c=a(this);c.val()?b.prop("disabled",!1):b.prop("disabled",!0)}).change(),b.click(function(a){a.preventDefault();var b=c.val();b&&(this._trigger("rated",{rating:b,note:d.val()}),this.close())}.bind(this))},g.prototype.close=function(){this._popup.close(),this._popup=null},g.prototype.display=function(){return M.util.js_pending("tool_lp/grade_dialogue:display"),a.when(f.get_string("rate","tool_lp"),this._render()).then(function(a,b){return this._popup=new d(a,b[0],function(){this._afterRender(),M.util.js_complete("tool_lp/grade_dialogue:display")}.bind(this)),this._popup}.bind(this))["catch"](b.exception)},g.prototype._find=function(b){return a(this._popup.getContent()).find(b)},g.prototype._render=function(){var a={cangrade:this._canGrade,ratings:this._ratingOptions};return c.render("tool_lp/competency_grader",a)},g});
@@ -1 +1 @@
define(["jquery","core/notification","core/ajax","core/log","tool_lp/grade_dialogue","tool_lp/event_base","tool_lp/scalevalues"],function(a,b,c,d,e,f,g){var h=function(b,c,d,e,g,h,i){f.prototype.constructor.apply(this,[]);var j=a(b);if(!j.length)throw new Error("Could not find the trigger");this._scaleId=c,this._competencyId=d,this._userId=e,this._planId=g,this._courseId=h,this._chooseStr=i,this._setUp(),j.click(function(a){a.preventDefault(),this._dialogue.display()}.bind(this)),this._planId?(this._methodName="core_competency_grade_competency_in_plan",this._args={competencyid:this._competencyId,planid:this._planId}):this._courseId?(this._methodName="core_competency_grade_competency_in_course",this._args={competencyid:this._competencyId,courseid:this._courseId,userid:this._userId}):(this._methodName="core_competency_grade_competency",this._args={userid:this._userId,competencyid:this._competencyId})};return h.prototype=Object.create(f.prototype),h.prototype._setUp=function(){var a=[],d=this,f=g.get_values(d._scaleId);f.then(function(b){a.push({value:"",name:d._chooseStr});for(var c=0;c<b.length;c++){var e=b[c];a.push({value:e.id,name:e.name})}return a}).then(function(a){return new e(a)}).then(function(a){return a.on("rated",function(a,e){var f=d._args;f.grade=e.rating,f.note=e.note,c.call([{methodname:d._methodName,args:f,done:function(a){d._trigger("competencyupdated",{args:f,evidence:a})},fail:b.exception}])}),a}).then(function(a){d._dialogue=a}).fail(b.exception)},h.prototype._scaleId=null,h.prototype._competencyId=null,h.prototype._userId=null,h.prototype._planId=null,h.prototype._courseId=null,h.prototype._chooseStr=null,h.prototype._dialogue=null,h});
define(["jquery","core/notification","core/ajax","core/log","tool_lp/grade_dialogue","tool_lp/event_base","tool_lp/scalevalues"],function(a,b,c,d,e,f,g){var h=function(b,c,d,e,g,h,i){f.prototype.constructor.apply(this,[]);var j=a(b);if(!j.length)throw new Error("Could not find the trigger");this._scaleId=c,this._competencyId=d,this._userId=e,this._planId=g,this._courseId=h,this._chooseStr=i,this._setUp(),j.click(function(a){a.preventDefault(),this._dialogue.display()}.bind(this)),this._planId?(this._methodName="core_competency_grade_competency_in_plan",this._args={competencyid:this._competencyId,planid:this._planId}):this._courseId?(this._methodName="core_competency_grade_competency_in_course",this._args={competencyid:this._competencyId,courseid:this._courseId,userid:this._userId}):(this._methodName="core_competency_grade_competency",this._args={userid:this._userId,competencyid:this._competencyId})};return h.prototype=Object.create(f.prototype),h.prototype._setUp=function(){var a=[],d=this;M.util.js_pending("tool_lp/grade_user_competency_inline:_setUp");var f=g.get_values(d._scaleId);f.then(function(b){a.push({value:"",name:d._chooseStr});for(var c=0;c<b.length;c++){var e=b[c];a.push({value:e.id,name:e.name})}return a}).then(function(a){return new e(a)}).then(function(a){return a.on("rated",function(a,e){var f=d._args;f.grade=e.rating,f.note=e.note,c.call([{methodname:d._methodName,args:f,done:function(a){d._trigger("competencyupdated",{args:f,evidence:a})},fail:b.exception}])}),a}).then(function(a){d._dialogue=a,M.util.js_complete("tool_lp/grade_user_competency_inline:_setUp")}).fail(b.exception)},h.prototype._scaleId=null,h.prototype._competencyId=null,h.prototype._userId=null,h.prototype._planId=null,h.prototype._courseId=null,h.prototype._chooseStr=null,h.prototype._dialogue=null,h});
+13
View File
@@ -35,6 +35,8 @@ define(['core/yui'], function(Y) {
* @param {Boolean} wide Specify we want an extra wide dialogue (the size is standard, but wider than the default).
*/
var dialogue = function(title, content, afterShow, afterHide, wide) {
M.util.js_pending('tool_lp/dialogue:dialogue');
this.yuiDialogue = null;
var parent = this;
@@ -59,6 +61,10 @@ define(['core/yui'], function(Y) {
width: width
});
parent.yuiDialogue.before('visibleChange', function() {
M.util.js_pending('tool_lp/dialogue:before:visibleChange');
});
parent.yuiDialogue.after('visibleChange', function(e) {
if (e.newVal) {
// Delay the callback call to the next tick, otherwise it can happen that it is
@@ -67,18 +73,25 @@ define(['core/yui'], function(Y) {
Y.soon(function() {
afterShow(parent);
parent.yuiDialogue.centerDialogue();
M.util.js_complete('tool_lp/dialogue:before:visibleChange');
});
} else {
M.util.js_complete('tool_lp/dialogue:before:visibleChange');
}
} else {
if ((typeof afterHide !== 'undefined')) {
Y.soon(function() {
afterHide(parent);
M.util.js_complete('tool_lp/dialogue:before:visibleChange');
});
} else {
M.util.js_complete('tool_lp/dialogue:before:visibleChange');
}
}
});
parent.yuiDialogue.show();
M.util.js_complete('tool_lp/dialogue:dialogue');
});
};
+5 -1
View File
@@ -102,6 +102,7 @@ define(['jquery',
* @return {Promise}
*/
Grade.prototype.display = function() {
M.util.js_pending('tool_lp/grade_dialogue:display');
return $.when(
Str.get_string('rate', 'tool_lp'),
this._render()
@@ -110,7 +111,10 @@ define(['jquery',
this._popup = new Dialogue(
title,
templateResult[0],
this._afterRender.bind(this)
function() {
this._afterRender();
M.util.js_complete('tool_lp/grade_dialogue:display');
}.bind(this)
);
return this._popup;
@@ -94,6 +94,7 @@ define(['jquery',
var options = [],
self = this;
M.util.js_pending('tool_lp/grade_user_competency_inline:_setUp');
var promise = ScaleValues.get_values(self._scaleId);
promise.then(function(scalevalues) {
options.push({
@@ -134,6 +135,7 @@ define(['jquery',
.then(function(dialogue) {
self._dialogue = dialogue;
M.util.js_complete('tool_lp/grade_user_competency_inline:_setUp');
return;
})
.fail(notification.exception);
@@ -32,7 +32,7 @@
// No example context because the JS is connected to webservices
}}
<div class="float-sm-right card card-block">
<div class="float-sm-right border p-2 mb-2">
{{#hascompetencies}}
<span>
<label for="competency-nav-{{uniqid}}" class="accesshide">{{#str}}jumptocompetency, tool_lp{{/str}}</label>
@@ -82,7 +82,7 @@
{{/comppath}}
{{#usercompetencycourse}}
{{#grade}}
<span class="badge {{^proficiency}}badge-danger{{/proficiency}}">{{gradename}}</span>
<span class="badge {{#proficiency}}badge-success{{/proficiency}}{{^proficiency}}badge-danger{{/proficiency}}">{{gradename}}</span>
{{/grade}}
{{/usercompetencycourse}}
{{#canmanagecoursecompetencies}}
@@ -49,7 +49,7 @@
Template statistics template.
}}
{{#competencycount}}
<div data-region="coursecompetencystatistics" class="card">
<div data-region="coursecompetencystatistics" class="border p-2 mb-2">
{{#canbegradedincourse}}
{{< tool_lp/progress_bar}}
{{$progresstext}}
@@ -44,7 +44,7 @@
"id": 1
}
}}
<div class="card well-small evidence" data-region="evidence" data-id="{{id}}">
<div class="border p-2 mb-2 evidence" data-region="evidence" data-id="{{id}}">
{{#candelete}}
<div class="float-sm-right">
<a href="#" data-action="delete-evidence">{{#pix}}t/delete{{/pix}}</a>
@@ -50,10 +50,12 @@
<div class="col-lg-6">
<p>
<form data-region="filtercompetencies" data-frameworkid="{{framework.id}}" class="form-inline">
<div class="form-group">
<div class="input-group mb-3">
<label class="accesshide" for="filter{{uniqid}}">{{#str}}search, tool_lp{{/str}}</label>
<input class="form-control" type="text" id="filter{{uniqid}}" placeholder="{{#str}}search, tool_lp{{/str}}" value="{{search}}">
<button class="btn btn-secondary">{{#pix}}a/search, , {{#str}}search{{/str}}{{/pix}}</button>
<div class="input-group-append">
<button class="btn btn-secondary">{{#pix}}a/search, , {{#str}}search{{/str}}{{/pix}}</button>
</div>
</div>
</form>
</p>
@@ -62,8 +64,8 @@
</ul>
</div>
<div class="card col-lg-6">
<div class="card-block card-body">
<div class="col-lg-6">
<div class="border p-2 mb-2">
<div class="card-title">
<h4 data-region="selected-competency">{{#str}}selectedcompetency, tool_lp{{/str}}</h4>
<span data-region="competencyactionsmenu" class="float-sm-right">
@@ -28,7 +28,7 @@
// No example context because the JS is connected to webservices
}}
<div class="float-right card p-2">
<div class="float-right border mb-2 p-2">
<form class="user-competency-course-navigation">
<input type="hidden" name="courseid" value="{{courseid}}"/>
<input type="hidden" name="mod" value="{{moduleid}}"/>
@@ -26,10 +26,8 @@
</h2>
<div>{{{template.description}}}</div>
{{#canmanagetemplatecompetencies}}
<div data-region="actions" class="clearfix">
<div class="float-left">
<button disabled class="btn btn-secondary">{{#str}}addtemplatecompetencies, tool_lp{{/str}}</button>
</div>
<div data-region="actions" class="my-4">
<button disabled class="btn btn-secondary">{{#str}}addtemplatecompetencies, tool_lp{{/str}}</button>
</div>
{{/canmanagetemplatecompetencies}}
<h3 class="mt-1">{{#str}}templatecompetencies, tool_lp{{/str}}</h3>
@@ -41,7 +39,7 @@
<div class="drag-parentnode">
{{#competencies}}
<div class="drag-samenode" data-id="{{competency.id}}">
<div class="card">
<div class="border p-2 mb-2">
{{#canmanagetemplatecompetencies}}
<span class="drag-handlecontainer float-left"></span>
<div class="float-sm-right">
@@ -45,8 +45,7 @@
Template statistics template.
}}
{{#competencycount}}
<div data-region="templatestatistics" class="card">
<div class="card-block">
<div data-region="templatestatistics" class="border p-2 mb-2">
{{< tool_lp/progress_bar}}
{{$progresstext}}
{{#str}}xcompetencieslinkedoutofy, tool_lp, { "x": "{{linkedcompetencycount}}", "y": "{{competencycount}}" } {{/str}}
@@ -90,6 +89,5 @@
</div>
</div>
{{/leastproficientcount}}
</div>
</div>
{{/competencycount}}
@@ -35,7 +35,7 @@
// No example context because the JS is connected to webservices
}}
<div class="float-sm-right card card-block p-x-1 p-b-1">
<div class="float-sm-right border p-2 mb-2">
<p>{{{groupselector}}}</p>
<form class="user-competency-course-navigation">
<input type="hidden" name="userid" value="{{userid}}"/>
@@ -57,7 +57,7 @@
</dd>
<dt>{{#str}}proficient, tool_lp{{/str}}</dt>
<dd>
<span class="badge{{^proficiency}} badge-danger{{/proficiency}} float-left">
<span class="badge {{#proficiency}}badge-success{{/proficiency}}{{^proficiency}}badge-danger{{/proficiency}} float-left">
{{proficiencyname}}
</span>
</dd>
@@ -81,7 +81,7 @@
{{#usercompetencycourse}}
<dt>{{#str}}proficient, tool_lp{{/str}}</dt>
<dd>
<span class="badge{{^proficiency}} badge-danger{{/proficiency}} float-left">
<span class="badge {{#proficiency}}badge-success{{/proficiency}}{{^proficiency}}badge-danger{{/proficiency}} float-left">
{{proficiencyname}}
</span>
</dd>
@@ -68,7 +68,7 @@
</dd>
<dt>{{#str}}proficient, tool_lp{{/str}}</dt>
<dd>
<span class="badge{{^proficiency}} badge-danger{{/proficiency}} float-left">
<span class="badge {{#proficiency}}badge-success{{/proficiency}}{{^proficiency}}badge-danger{{/proficiency}} float-left">
{{proficiencyname}}
</span>
</dd>
@@ -101,7 +101,7 @@
<dd>{{gradename}} - {{#str}}plancompleted, tool_lp{{/str}}</dd>
<dt>{{#str}}proficient, tool_lp{{/str}}</dt>
<dd>
<span class="badge{{^proficiency}} badge-danger{{/proficiency}} float-left">
<span class="badge {{#proficiency}}badge-success{{/proficiency}}{{^proficiency}}badge-danger{{/proficiency}} float-left">
{{proficiencyname}}
</span>
</dd>
@@ -24,7 +24,7 @@
$string['classname'] = 'Class name';
$string['component'] = 'Component';
$string['configmessageinboundhost'] = 'The address of the server that Moodle should check mail against. To specify a non-default port, use [server]:[port], for example mail.example.com:587. If a port isn\'t specified, the default port for the type of mail server will be used.';
$string['configmessageinboundhost'] = 'The address of the server that Moodle should check mail against. To specify a non-default port, use [server]:[port], for example mail.example.com:993. If a port isn\'t specified, the default port for the type of mail server will be used.';
$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';
+30
View File
@@ -49,6 +49,8 @@ class api {
const LOGIN_VIA_EMBEDDED_BROWSER = 3;
/** @var int seconds an auto-login key will expire. */
const LOGIN_KEY_TTL = 60;
/** @var string URL of the Moodle Apps Portal */
const MOODLE_APPS_PORTAL_URL = 'https://apps.moodle.com';
/**
* Returns a list of Moodle plugins supporting the mobile app.
@@ -346,6 +348,7 @@ class api {
*/
public static function get_features_list() {
global $CFG;
require_once($CFG->libdir . '/authlib.php');
$general = new lang_string('general');
$mainmenu = new lang_string('mainmenu', 'tool_mobile');
@@ -355,6 +358,7 @@ class api {
$user = new lang_string('user');
$files = new lang_string('files');
$remoteaddons = new lang_string('remoteaddons', 'tool_mobile');
$identityproviders = new lang_string('oauth2identityproviders', 'tool_mobile');
$availablemods = core_plugin_manager::instance()->get_plugins_of_type('mod');
$coursemodules = array();
@@ -421,6 +425,7 @@ class api {
'NoDelegate_CoreTag' => new lang_string('tags'),
'$mmLoginEmailSignup' => new lang_string('startsignup'),
'NoDelegate_ResponsiveMainMenuItems' => new lang_string('responsivemainmenuitems', 'tool_mobile'),
'NoDelegate_DarkMode' => new lang_string('darkmode', 'tool_mobile'),
),
"$mainmenu" => array(
'$mmSideMenuDelegate_mmaFrontpage' => new lang_string('sitehome'),
@@ -473,6 +478,31 @@ class api {
$features["$remoteaddons"] = $remoteaddonslist;
}
// Display OAuth 2 identity providers.
if (is_enabled_auth('oauth2')) {
$identityproviderslist = array();
$idps = \auth_plugin_base::get_identity_providers(['oauth2']);
foreach ($idps as $idp) {
// Only add identity providers that have an ID.
$id = isset($idp['url']) ? $idp['url']->get_param('id') : null;
if ($id != null) {
$identityproviderslist['NoDelegate_IdentityProvider_' . $id] = $idp['name'];
}
}
if (!empty($identityproviderslist)) {
$features["$identityproviders"] = array();
if (count($identityproviderslist) > 1) {
// Include an option to disable them all.
$features["$identityproviders"]['NoDelegate_IdentityProviders'] = new lang_string('all');
}
$features["$identityproviders"] = array_merge($features["$identityproviders"], $identityproviderslist);
}
}
return $features;
}
@@ -45,12 +45,16 @@ $string['custommenuitems_desc'] = 'Additional items can be added to the app\'s m
Link-opening methods are: app (for linking to an activity supported by the app), inappbrowser (for opening a link in a browser without leaving the app), browser (for opening the link in the device default browser outside the app) and embedded (for displaying the link in an iframe in a new page in the app).
When items are missing a translation for a given language, they will use other languages as fallback unless "_only" is appended to the language code.
For example:
<pre>
App help|https://someurl.xyz/help|inappbrowser
My grades|https://someurl.xyz/local/mygrades/index.php|embedded|en
Mis calificaciones|https://someurl.xyz/local/mygrades/index.php|embedded|es
You will only see this in English|https://someurl.xyz/english|browser|en_only
</pre>';
$string['darkmode'] = 'Dark mode';
$string['disabledfeatures'] = 'Disabled features';
$string['disabledfeatures_desc'] = 'Select here the features you want to disable in the Mobile app for your site. Please note that some features listed here could be already disabled via other site settings. You will have to log out and log in again in the app to see the changes.';
$string['displayerrorswarning'] = 'Display debug messages (debugdisplay) is enabled. It should be disabled.';
@@ -84,6 +88,8 @@ $string['mobilecssurl'] = 'CSS';
$string['mobilefeatures'] = 'Mobile features';
$string['mobilenotificationsdisabledwarning'] = 'Mobile notifications are not enabled. They should be enabled in Notification settings.';
$string['mobilesettings'] = 'Mobile settings';
$string['moodleappsportalfeatureswarning'] = 'Please note that some features may be restricted depending on your Moodle app subscription. For details, visit the <a href="{$a}" target="_blank">Moodle Apps Portal</a>.';
$string['oauth2identityproviders'] = 'OAuth 2 identity providers';
$string['offlineuse'] = 'Offline use';
$string['pluginname'] = 'Moodle app tools';
$string['pluginnotenabledorconfigured'] = 'Plugin not enabled or configured.';
+7 -1
View File
@@ -30,10 +30,16 @@ require_once($CFG->libdir . '/externallib.php');
$serviceshortname = required_param('service', PARAM_ALPHANUMEXT);
$passport = required_param('passport', PARAM_RAW); // Passport send from the app to validate the response URL.
$urlscheme = optional_param('urlscheme', 'moodlemobile', PARAM_ALPHANUM); // The URL scheme the app supports.
$urlscheme = optional_param('urlscheme', 'moodlemobile', PARAM_NOTAGS); // The URL scheme the app supports.
$confirmed = optional_param('confirmed', false, PARAM_BOOL); // If we are being redirected after user confirmation.
$oauthsso = optional_param('oauthsso', 0, PARAM_INT); // Id of the OpenID issuer (for OAuth direct SSO).
// Validate that the urlscheme is valid.
if (!preg_match('/^[a-zA-Z][a-zA-Z0-9-\+\.]*$/', $urlscheme)) {
throw new moodle_exception('Invalid parameter: the value of urlscheme isn\'t valid. ' .
'It should start with a letter and can only contain letters, numbers and the characters "." "+" "-".');
}
// Check web services enabled.
if (!$CFG->enablewebservices) {
throw new moodle_exception('enablewsdescription', 'webservice');
+11 -1
View File
@@ -50,6 +50,12 @@ if ($hassiteconfig) {
// Show only mobile settings if the mobile service is enabled.
if (!empty($CFG->enablemobilewebservice)) {
// General notification about limited features due to app restrictions.
$notify = new \core\output\notification(
get_string('moodleappsportalfeatureswarning', 'tool_mobile', tool_mobile\api::MOODLE_APPS_PORTAL_URL),
\core\output\notification::NOTIFY_WARNING);
$featuresnotice = $OUTPUT->render($notify);
// Type of login.
$temp = new admin_settingpage('mobileauthentication', new lang_string('mobileauthentication', 'tool_mobile'));
$options = array(
@@ -63,13 +69,15 @@ if ($hassiteconfig) {
$temp->add(new admin_setting_configtext('tool_mobile/forcedurlscheme',
new lang_string('forcedurlscheme_key', 'tool_mobile'),
new lang_string('forcedurlscheme', 'tool_mobile'), '', PARAM_ALPHANUM));
new lang_string('forcedurlscheme', 'tool_mobile'), '', PARAM_NOTAGS));
$ADMIN->add('mobileapp', $temp);
// Appearance related settings.
$temp = new admin_settingpage('mobileappearance', new lang_string('mobileappearance', 'tool_mobile'));
$temp->add(new admin_setting_heading('tool_mobile/moodleappsportalfeaturesappearance', '', $featuresnotice));
$temp->add(new admin_setting_configtext('mobilecssurl', new lang_string('mobilecssurl', 'tool_mobile'),
new lang_string('configmobilecssurl', 'tool_mobile'), '', PARAM_URL));
@@ -102,6 +110,8 @@ if ($hassiteconfig) {
// Features related settings.
$temp = new admin_settingpage('mobilefeatures', new lang_string('mobilefeatures', 'tool_mobile'));
$temp->add(new admin_setting_heading('tool_mobile/moodleappsportalfeatures', '', $featuresnotice));
$temp->add(new admin_setting_heading('tool_mobile/logout',
new lang_string('logout'), ''));
+1 -1
View File
@@ -122,7 +122,7 @@ class tool_mobile_external_testcase extends externallib_advanced_testcase {
set_config('hostname', 'localhost', 'auth_cas');
set_config('auth_logo', 'http://invalidurl.com//invalid/', 'auth_cas');
set_config('auth_name', 'CAS', 'auth_cas');
set_config('auth', 'oauth2,cas');
list($authinstructions, $notusedformat) = external_format_text($authinstructions, FORMAT_MOODLE, $context->id);
+6 -5
View File
@@ -131,11 +131,12 @@ if ($execute) {
tool_phpunit_problem('Can not create configuration file');
}
}
$configdir = escapeshellarg($configdir);
// no cleanup of path - this is tricky because we can not use escapeshellarg and friends for escaping,
// this is from admin user so PARAM_PATH must be enough
chdir($CFG->dirroot);
passthru("php $CFG->admin/tool/phpunit/cli/util.php --run -c $configdir $testclass $testpath", $code);
$configdir = escapeshellarg($configdir);
$cleanclass = escapeshellarg($testclass);
$cleanpath = escapeshellarg($testpath);
passthru("php $CFG->admin/tool/phpunit/cli/util.php --run -c $configdir $cleanclass $cleanpath", $code);
chdir($oldcwd);
echo '</pre>';
@@ -146,7 +147,7 @@ if ($execute) {
}
echo $OUTPUT->box_start('generalbox boxwidthwide boxaligncenter');
echo '<form method="get" action="webrunner.php">';
echo '<form method="post" action="webrunner.php">';
echo '<fieldset class="invisiblefieldset">';
echo '<label for="testpath">Test one file</label> ';
echo '<input type="text" id="testpath" name="testpath" value="'.s($testpath).'" size="50" /> (all test cases from webrunner.xml if empty)';
+15 -1
View File
@@ -39,15 +39,29 @@ if ($userid != $USER->id) {
if (!has_capability('tool/policy:acceptbehalf', $context)) {
require_capability('tool/policy:viewacceptances', $context);
}
$user = core_user::get_user($userid);
$PAGE->navigation->extend_for_user($user);
}
$title = get_string('policiesagreements', 'tool_policy');
$PAGE->set_context($context);
$PAGE->set_pagelayout('standard');
$PAGE->set_url(new moodle_url('/admin/tool/policy/user.php', ['userid' => $userid]));
$PAGE->set_title($title);
if ($userid == $USER->id &&
($profilenode = $PAGE->settingsnav->find('myprofile', null))) {
$profilenode->make_active();
}
$PAGE->navbar->add($title);
$output = $PAGE->get_renderer('tool_policy');
echo $output->header();
echo $output->heading(get_string('policiesagreements', 'tool_policy'));
echo $output->heading($title);
$acceptances = new \tool_policy\output\acceptances($userid, $returnurl);
echo $output->render($acceptances);
$PAGE->requires->js_call_amd('tool_policy/acceptmodal', 'getInstance', [context_system::instance()->id]);
@@ -127,3 +127,36 @@ Feature: Basic recycle bin functionality
And I press "Yes"
And I should see "Recycle bin has been emptied"
And I should see "There are no items in the recycle bin."
@javascript
Scenario: Show recycle bin on category action menu
Given I log in as "admin"
And I navigate to "Courses > Manage courses and categories" in site administration
And I click on "Actions menu" "link"
And I click on "Recycle bin" "link"
Then I should see "There are no items in the recycle bin."
@javascript
Scenario: Not show recycle bin empty on category action menu whit autohide enable
Given I log in as "admin"
And the following config values are set as admin:
| categorybinenable | 0 | tool_recyclebin |
And I navigate to "Courses > Manage courses and categories" in site administration
And I click on "Actions menu" "link"
Then I should not see "Recycle bin"
@javascript
Scenario: Show recycle bin not empty on category action menu whit autohide enable
Given I log in as "admin"
And the following config values are set as admin:
| autohide | 1 | tool_recyclebin |
And I navigate to "Courses > Manage courses and categories" in site administration
And I click on "Actions menu" "link"
Then I should not see "Recycle bin"
And I click on "delete" action for "Course 2" in management course listing
And I press "Delete"
And I should see "Deleting C2"
And I should see "C2 has been completely deleted"
And I press "Continue"
When I click on "Actions menu" "link"
Then I should see "Recycle bin"
+2 -2
View File
@@ -100,9 +100,9 @@ if (!$problems) {
$count = $problem->racount;
$edit = array();
$aurl = new moodle_url('/admin/roles/define.php', array('roleid'=>$problem->roleid, 'action'=>'edit'));
$edit[] = html_writer::link($aurl, $OUTPUT->pix_icon('t/edit', 'core', get_string('edit')));
$edit[] = html_writer::link($aurl, $OUTPUT->pix_icon('t/edit', get_string('edit')));
$aurl = new moodle_url($PAGE->url, array('roleid'=>$problem->roleid, 'contextlevel'=>$problem->contextlevel, 'action'=>'delete'));
$edit[] = html_writer::link($aurl, $OUTPUT->pix_icon('t/delete', 'core', get_string('delete')));
$edit[] = html_writer::link($aurl, $OUTPUT->pix_icon('t/delete', get_string('delete')));
$data[] = array($levelname, $rolename, $count, implode('&nbsp;', $edit));
}
$table = new html_table();
@@ -412,6 +412,12 @@ class tool_uploadcourse_course {
$this->error('invalidshortname', new lang_string('invalidshortname', 'tool_uploadcourse'));
return false;
}
// Ensure we don't overflow the maximum length of the shortname field.
if (core_text::strlen($this->shortname) > 255) {
$this->error('invalidshortnametoolong', new lang_string('invalidshortnametoolong', 'tool_uploadcourse', 255));
return false;
}
}
$exists = $this->exists();
@@ -479,6 +485,12 @@ class tool_uploadcourse_course {
return false;
}
// Ensure we don't overflow the maximum length of the fullname field.
if (!empty($coursedata['fullname']) && core_text::strlen($coursedata['fullname']) > 254) {
$this->error('invalidfullnametoolong', new lang_string('invalidfullnametoolong', 'tool_uploadcourse', 254));
return false;
}
// If the course does not exist, or will be forced created.
if (!$exists || $mode === tool_uploadcourse_processor::MODE_CREATE_ALL) {
@@ -720,6 +732,12 @@ class tool_uploadcourse_course {
}
}
// Visibility can only be 0 or 1.
if (!empty($coursedata['visible']) AND !($coursedata['visible'] == 0 OR $coursedata['visible'] == 1)) {
$this->error('invalidvisibilitymode', new lang_string('invalidvisibilitymode', 'tool_uploadcourse'));
return false;
}
// Saving data.
$this->data = $coursedata;
$this->enrolmentdata = tool_uploadcourse_helper::get_enrolment_data($this->rawdata);
@@ -90,8 +90,11 @@ $string['invalidcsvfile'] = 'Invalid input CSV file';
$string['invalidencoding'] = 'Invalid encoding';
$string['invalidmode'] = 'Invalid mode selected';
$string['invalideupdatemode'] = 'Invalid update mode selected';
$string['invalidvisibilitymode'] = 'Invalid visible mode';
$string['invalidroles'] = 'Invalid role names: {$a}';
$string['invalidshortname'] = 'Invalid shortname';
$string['invalidfullnametoolong'] = 'The fullname field is limited to {$a} characters';
$string['invalidshortnametoolong'] = 'The shortname field is limited to {$a} characters';
$string['missingmandatoryfields'] = 'Missing value for mandatory fields: {$a}';
$string['missingshortnamenotemplate'] = 'Missing shortname and shortname template not set';
$string['mode'] = 'Upload mode';
@@ -82,6 +82,47 @@ class tool_uploadcourse_course_testcase extends advanced_testcase {
$this->assertArrayHasKey('invalidshortname', $co->get_errors());
}
public function test_invalid_shortname_too_long() {
$this->resetAfterTest();
$mode = tool_uploadcourse_processor::MODE_CREATE_NEW;
$updatemode = tool_uploadcourse_processor::UPDATE_NOTHING;
$upload = new tool_uploadcourse_course($mode, $updatemode, [
'category' => 1,
'fullname' => 'New course',
'shortname' => str_repeat('X', 2000),
]);
$this->assertFalse($upload->prepare());
$this->assertArrayHasKey('invalidshortnametoolong', $upload->get_errors());
}
public function test_invalid_fullname_too_long() {
$this->resetAfterTest();
$mode = tool_uploadcourse_processor::MODE_CREATE_NEW;
$updatemode = tool_uploadcourse_processor::UPDATE_NOTHING;
$upload = new tool_uploadcourse_course($mode, $updatemode, [
'category' => 1,
'fullname' => str_repeat('X', 2000),
]);
$this->assertFalse($upload->prepare());
$this->assertArrayHasKey('invalidfullnametoolong', $upload->get_errors());
}
public function test_invalid_visibility() {
$this->resetAfterTest(true);
$mode = tool_uploadcourse_processor::MODE_CREATE_NEW;
$updatemode = tool_uploadcourse_processor::UPDATE_NOTHING;
$data = array('shortname' => 'test', 'fullname' => 'New course', 'summary' => 'New', 'category' => 1, 'visible' => 2);
$co = new tool_uploadcourse_course($mode, $updatemode, $data);
$this->assertFalse($co->prepare());
$this->assertArrayHasKey('invalidvisibilitymode', $co->get_errors());
}
public function test_create() {
global $DB;
$this->resetAfterTest(true);
+10
View File
@@ -720,6 +720,13 @@ class manager {
* @param int $direction
*/
protected static function _move_tour(tour $tour, $direction) {
// We can't move the first tour higher, nor the last tour any lower.
if (($tour->is_first_tour() && $direction == helper::MOVE_UP) ||
($tour->is_last_tour() && $direction == helper::MOVE_DOWN)) {
return;
}
$currentsortorder = $tour->get_sortorder();
$targetsortorder = $currentsortorder + $direction;
@@ -848,6 +855,9 @@ class manager {
}
$existingtourrecords->close();
// Ensure we correct the sortorder in any existing tours, prior to adding latest shipped tours.
helper::reset_tour_sortorder();
foreach (array_reverse($shippedtours) as $filename => $version) {
$filepath = $CFG->dirroot . "/{$CFG->admin}/tool/usertours/tours/" . $filename;
$tourjson = file_get_contents($filepath);
+7
View File
@@ -64,5 +64,12 @@ function xmldb_tool_usertours_upgrade($oldversion) {
// Automatically generated Moodle v3.7.0 release upgrade line.
// Put any upgrade step following this.
if ($oldversion < 2019052001) {
// Updating shipped tours will fix broken sortorder records in existing tours.
manager::update_shipped_tours();
upgrade_plugin_savepoint(true, 2019052001, 'tool', 'usertours');
}
return true;
}
@@ -122,6 +122,83 @@ class tool_usertours_manager_testcase extends advanced_testcase {
$rcm->invokeArgs($manager, $arguments);
}
/**
* Data provider for test_move_tour
*
* @return array
*/
public function move_tour_provider() {
$alltours = [
['name' => 'Tour 1'],
['name' => 'Tour 2'],
['name' => 'Tour 3'],
];
return [
'Move up' => [
$alltours,
'Tour 2',
\tool_usertours\helper::MOVE_UP,
0,
],
'Move down' => [
$alltours,
'Tour 2',
\tool_usertours\helper::MOVE_DOWN,
2,
],
'Move up (first)' => [
$alltours,
'Tour 1',
\tool_usertours\helper::MOVE_UP,
0,
],
'Move down (last)' => [
$alltours,
'Tour 3',
\tool_usertours\helper::MOVE_DOWN,
2,
],
];
}
/**
* Test moving tours (changing sortorder)
*
* @dataProvider move_tour_provider
*
* @param array $alltours
* @param string $movetourname
* @param int $direction
* @param int $expectedsortorder
* @return void
*/
public function test_move_tour($alltours, $movetourname, $direction, $expectedsortorder) {
global $DB;
$this->resetAfterTest();
// Clear out existing tours so ours are the only ones, otherwise we can't predict the sortorder.
$DB->delete_records('tool_usertours_tours');
foreach ($alltours as $tourconfig) {
$this->helper_create_tour((object) $tourconfig);
}
// Load our tour to move.
$record = $DB->get_record('tool_usertours_tours', ['name' => $movetourname]);
$tour = \tool_usertours\tour::load_from_record($record);
// Call protected method via reflection.
$class = new ReflectionClass(\tool_usertours\manager::class);
$method = $class->getMethod('_move_tour');
$method->setAccessible(true);
$method->invokeArgs(null, [$tour, $direction]);
// Assert expected sortorder.
$this->assertEquals($expectedsortorder, $tour->get_sortorder());
}
/**
* Data Provider for get_matching_tours tests.
*
+1 -1
View File
@@ -24,6 +24,6 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2019052000; // The current module version (Date: YYYYMMDDXX).
$plugin->version = 2019052001; // The current module version (Date: YYYYMMDDXX).
$plugin->requires = 2019051100; // Requires this Moodle version.
$plugin->component = 'tool_usertours'; // Full name of the plugin (used for diagnostics).
@@ -68,13 +68,13 @@ class view_xml extends XMLDBAction {
// Get the file parameter
$file = required_param('file', PARAM_PATH);
$file = $CFG->dirroot . $file;
// File must be under $CFG->wwwroot and
// under one db directory (simple protection)
if (substr($file, 0, strlen($CFG->dirroot)) == $CFG->dirroot &&
substr(dirname($file), -2, 2) == 'db') {
$fullpath = $CFG->dirroot . $file;
// File param must start with / and end with /db/install.xml to be safe.
if (substr($file, 0, 1) == '/' &&
substr($file, -15, 15) == '/db/install.xml') {
// Everything is ok. Load the file to memory
$this->output = file_get_contents($file);
$this->output = file_get_contents($fullpath);
} else {
// Switch to HTML and error
$this->does_generate = ACTION_GENERATE_HTML;
+1 -1
View File
@@ -41,7 +41,7 @@ class test_analysis extends \core_analytics\analysis {
*/
public function process_analysable(\core_analytics\analysable $analysable): array {
// Half a second.
usleep(500000);
sleep(1);
return parent::process_analysable($analysable);
}
}
+1 -1
View File
@@ -292,7 +292,7 @@ class analytics_model_testcase extends advanced_testcase {
$this->resetAfterTest(true);
set_config('modeltimelimit', 1, 'analytics');
set_config('modeltimelimit', 2, 'analytics');
$courses = array();
for ($i = 0; $i < 5; $i++) {
+1 -1
View File
@@ -149,7 +149,7 @@ class auth_email_external extends external_api {
new external_single_structure(
array(
'id' => new external_value(PARAM_INT, 'Profile field id', VALUE_OPTIONAL),
'shortname' => new external_value(PARAM_ALPHANUM, 'Password policy', VALUE_OPTIONAL),
'shortname' => new external_value(PARAM_ALPHANUMEXT, 'Profile field shortname', VALUE_OPTIONAL),
'name' => new external_value(PARAM_TEXT, 'Profield field name', VALUE_OPTIONAL),
'datatype' => new external_value(PARAM_ALPHANUMEXT, 'Profield field datatype', VALUE_OPTIONAL),
'description' => new external_value(PARAM_RAW, 'Profield field description', VALUE_OPTIONAL),
+1 -1
View File
@@ -49,6 +49,6 @@ class behat_auth_email extends behat_base {
$confirmationpath = $confirmationurl->out_as_local_url(false);
$url = $confirmationpath . '?' . 'data='. $secret .'/'. $username;
$this->getSession()->visit($this->locate_path($url));
$this->execute('behat_general::i_visit', [$url]);
}
}
+19 -8
View File
@@ -79,16 +79,19 @@ class auth_ldap_plugin_testcase extends advanced_testcase {
$o['ou'] = 'users';
ldap_add($connection, 'ou='.$o['ou'].','.$topdn, $o);
$createdusers = array();
for ($i=1; $i<=5; $i++) {
$this->create_ldap_user($connection, $topdn, $i);
$createdusers[] = 'username' . $i;
}
// Set up creators group.
$assignedroles = array('username1', 'username2');
$o = array();
$o['objectClass'] = array('posixGroup');
$o['cn'] = 'creators';
$o['gidNumber'] = 1;
$o['memberUid'] = array('username1', 'username2');
$o['memberUid'] = $assignedroles;
ldap_add($connection, 'cn='.$o['cn'].','.$topdn, $o);
$creatorrole = $DB->get_record('role', array('shortname'=>'coursecreator'));
@@ -145,15 +148,23 @@ class auth_ldap_plugin_testcase extends advanced_testcase {
// Check events, 5 users created with 2 users having roles.
$this->assertCount(7, $events);
foreach ($events as $index => $event) {
$usercreatedindex = array(0, 2, 4, 5, 6);
$roleassignedindex = array (1, 3);
if (in_array($index, $usercreatedindex)) {
$this->assertInstanceOf('\core\event\user_created', $event);
}
if (in_array($index, $roleassignedindex)) {
$this->assertInstanceOf('\core\event\role_assigned', $event);
$username = $DB->get_field('user', 'username', array('id' => $event->relateduserid)); // Get username.
if ($event->eventname === '\core\event\user_created') {
$this->assertContains($username, $createdusers);
unset($events[$index]); // Remove matching event.
} else if ($event->eventname === '\core\event\role_assigned') {
$this->assertContains($username, $assignedroles);
unset($events[$index]); // Remove matching event.
} else {
$this->fail('Unexpected event found: ' . $event->eventname);
}
}
// If all the user_created and role_assigned events have matched
// then the $events array should be now empty.
$this->assertCount(0, $events);
$this->assertEquals(5, $DB->count_records('user', array('auth'=>'ldap')));
$this->assertEquals(2, $DB->count_records('role_assignments'));
+2 -1
View File
@@ -263,7 +263,8 @@ class auth_plugin_shibboleth extends auth_plugin_base {
global $OUTPUT;
if (!isset($this->config->user_attribute) || empty($this->config->user_attribute)) {
echo $OUTPUT->notification(get_string("shib_not_set_up_error", "auth_shibboleth"), 'notifyproblem');
echo $OUTPUT->notification(get_string("shib_not_set_up_error", "auth_shibboleth",
(new moodle_url('/auth/shibboleth/README.txt'))->out()), 'notifyproblem');
return;
}
if ($this->config->convert_data and $this->config->convert_data != '' and !is_readable($this->config->convert_data)) {
+3 -2
View File
@@ -32,8 +32,9 @@
$shibbolethauth = get_auth_plugin('shibboleth');
// Check whether Shibboleth is configured properly
$readmeurl = (new moodle_url('/auth/shibboleth/README.txt'))->out();
if (empty($pluginconfig->user_attribute)) {
print_error('shib_not_set_up_error', 'auth_shibboleth');
print_error('shib_not_set_up_error', 'auth_shibboleth', '', $readmeurl);
}
/// If we can find the Shibboleth attribute, save it in session and return to main login page
@@ -91,7 +92,7 @@
elseif (!empty($_SERVER['HTTP_SHIB_APPLICATION_ID']) || !empty($_SERVER['Shib-Application-ID'])) {
print_error('shib_no_attributes_error', 'auth_shibboleth' , '', '\''.$pluginconfig->user_attribute.'\', \''.$pluginconfig->field_map_firstname.'\', \''.$pluginconfig->field_map_lastname.'\' and \''.$pluginconfig->field_map_email.'\'');
} else {
print_error('shib_not_set_up_error', 'auth_shibboleth');
print_error('shib_not_set_up_error', 'auth_shibboleth', '', $readmeurl);
}
+3 -3
View File
@@ -28,7 +28,7 @@ $string['auth_shib_auth_method_description'] = 'Provide a name for the Shibbolet
$string['auth_shib_auth_logo'] = 'Authentication method logo';
$string['auth_shib_auth_logo_description'] = 'Provide a logo for the Shibboleth authentication method that is familiar to your users. This could be the logo of your Shibboleth federation, e.g. <tt>SWITCHaai Login</tt> or <tt>InCommon Login</tt> or similar.';
$string['auth_shib_contact_administrator'] = 'In case you are not associated with the given organizations and you need access to a course on this server, please contact the <a href="mailto:{$a}">Moodle Administrator</a>.';
$string['auth_shibbolethdescription'] = 'Using this method users are created and authenticated using Shibboleth. For set-up details, see the <a href="../auth/shibboleth/README.txt">Shibboleth README</a>.';
$string['auth_shibbolethdescription'] = 'Using this method users are created and authenticated using Shibboleth. For set-up details, see the <a href="{$a}">Shibboleth README</a>.';
$string['auth_shibboleth_errormsg'] = 'Please select the organization you are member of!';
$string['auth_shibboleth_login'] = 'Shibboleth login';
$string['auth_shibboleth_login_long'] = 'Login to Moodle via Shibboleth';
@@ -36,7 +36,7 @@ $string['auth_shibboleth_manual_login'] = 'Manual login';
$string['auth_shibboleth_select_member'] = 'I\'m a member of ...';
$string['auth_shibboleth_select_organization'] = 'For authentication via Shibboleth, please select your organisation from the drop-down menu:';
$string['auth_shib_convert_data'] = 'Data modification API';
$string['auth_shib_convert_data_description'] = 'You can use this API to further modify the data provided by Shibboleth. Read the <a href="../auth/shibboleth/README.txt">README</a> for further instructions.';
$string['auth_shib_convert_data_description'] = 'You can use this API to further modify the data provided by Shibboleth. Read the <a href="{$a}">README</a> for further instructions.';
$string['auth_shib_convert_data_warning'] = 'The file does not exist or is not readable by the webserver process!';
$string['auth_shib_changepasswordurl'] = 'Password-change URL';
$string['auth_shib_idp_list'] = 'Identity providers';
@@ -57,6 +57,6 @@ $string['auth_shib_username_description'] = 'Name of the webserver Shibboleth en
$string['shib_invalid_account_error'] = 'You seem to be Shibboleth authenticated but Moodle has no valid account for your username. Your account may not exist or it may have been suspended.';
$string['shib_no_attributes_error'] = 'You seem to be Shibboleth authenticated but Moodle didn\'t receive any user attributes. Please check that your Identity Provider releases the necessary attributes ({$a}) to the Service Provider Moodle is running on or inform the webmaster of this server.';
$string['shib_not_all_attributes_error'] = 'Moodle needs certain Shibboleth attributes which are not present in your case. The attributes are: {$a}<br />Please contact the webmaster of this server or your Identity Provider.';
$string['shib_not_set_up_error'] = 'Shibboleth authentication doesn\'t seem to be set up correctly because no Shibboleth environment variables are present for this page. Please consult the <a href="README.txt">README</a> for further instructions on how to set up Shibboleth authentication or contact the webmaster of this Moodle installation.';
$string['shib_not_set_up_error'] = 'Shibboleth authentication doesn\'t seem to be set up correctly because no Shibboleth environment variables are present for this page. Please consult the <a href="{$a}">README</a> for further instructions on how to set up Shibboleth authentication or contact the webmaster of this Moodle installation.';
$string['pluginname'] = 'Shibboleth';
$string['privacy:metadata'] = 'The Shibboleth authentication plugin does not store any personal data.';
+3 -2
View File
@@ -30,8 +30,9 @@ if ($ADMIN->fulltree) {
require_once($CFG->dirroot.'/auth/shibboleth/classes/admin_setting_special_idp_configtextarea.php');
// Introductory explanation.
$readmeurl = (new moodle_url('/auth/shibboleth/README.txt'))->out();
$settings->add(new admin_setting_heading('auth_shibboleth/pluginname', '',
new lang_string('auth_shibbolethdescription', 'auth_shibboleth')));
new lang_string('auth_shibbolethdescription', 'auth_shibboleth', $readmeurl)));
// Username.
$settings->add(new admin_setting_configtext('auth_shibboleth/user_attribute', get_string('username'),
@@ -40,7 +41,7 @@ if ($ADMIN->fulltree) {
// COnvert Data configuration file.
$settings->add(new admin_setting_configfile('auth_shibboleth/convert_data',
get_string('auth_shib_convert_data', 'auth_shibboleth'),
get_string('auth_shib_convert_data_description', 'auth_shibboleth'), ''));
get_string('auth_shib_convert_data_description', 'auth_shibboleth', $readmeurl), ''));
// WAYF.
$settings->add(new auth_shibboleth_admin_setting_special_wayf_select());
+1 -1
View File
@@ -58,7 +58,7 @@ class behat_auth extends behat_base {
}
// Visit login page.
$this->getSession()->visit($this->locate_path($loginurl->out_as_local_url()));
$this->execute('behat_general::i_visit', [$loginurl]);
// Enter username and password.
$this->execute('behat_forms::i_set_the_field_to', array('Username', $this->escape($username)));
-1
View File
@@ -91,7 +91,6 @@ class core_backup_external extends external_api {
require_capability('moodle/backup:backupactivity', $context);
} else {
require_capability('moodle/backup:backupcourse', $context);
$instanceid = $course->id;
}
$results = array();
+46
View File
@@ -955,6 +955,52 @@ class core_backup_moodle2_testcase extends advanced_testcase {
$this->assertEquals('', $requests[2]->searcharea);
}
/**
* Test restoring courses based on the backup plan. Primarily used with
* the import functionality
*/
public function test_restore_course_using_plan_defaults() {
global $DB, $CFG, $USER;
$this->resetAfterTest(true);
$this->setAdminUser();
$CFG->enableglobalsearch = true;
// Set admin config setting so that activities are not restored by default.
set_config('restore_general_activities', 0, 'restore');
// Create a course.
$generator = $this->getDataGenerator();
$course = $generator->create_course();
$course2 = $generator->create_course();
$course3 = $generator->create_course();
// Add a forum.
$forum = $generator->create_module('forum', ['course' => $course->id]);
// Backup course...
$CFG->backup_file_logger_level = backup::LOG_NONE;
$bc = new backup_controller(backup::TYPE_1COURSE, $course->id,
backup::FORMAT_MOODLE, backup::INTERACTIVE_NO, backup::MODE_IMPORT,
$USER->id);
$backupid = $bc->get_backupid();
$bc->execute_plan();
$bc->destroy();
// Restore it on top of course2 (should duplicate the forum).
$rc = new restore_controller($backupid, $course2->id,
backup::INTERACTIVE_NO, backup::MODE_IMPORT, $USER->id,
backup::TARGET_EXISTING_ADDING, null);
$this->assertTrue($rc->execute_precheck());
$rc->execute_plan();
$rc->destroy();
// Get the forums now on the old course.
$modinfo = get_fast_modinfo($course2->id);
$forums = $modinfo->get_instances_of('forum');
$this->assertCount(0, $forums);
}
/**
* The Question category hierarchical structure was changed in Moodle 3.5.
* From 3.5, all question categories in each context are a child of a single top level question category for that context.
+2 -2
View File
@@ -55,9 +55,11 @@ require_capability('moodle/restore:restorecourse', $context);
if (is_null($course)) {
$coursefullname = $SITE->fullname;
$courseshortname = $SITE->shortname;
$courseurl = new moodle_url('/');
} else {
$coursefullname = $course->fullname;
$courseshortname = $course->shortname;
$courseurl = course_get_url($course->id);
}
// Show page header.
@@ -173,7 +175,6 @@ if ($restore->get_stage() != restore_ui::STAGE_PROCESS) {
\core\task\manager::queue_adhoc_task($asynctask);
// Add ajax progress bar and initiate ajax via a template.
$courseurl = new moodle_url('/course/view.php', array('id' => $course->id));
$restoreurl = new moodle_url('/backup/restorefile.php', array('contextid' => $contextid));
$progresssetup = array(
'backupid' => $restoreid,
@@ -182,7 +183,6 @@ if ($restore->get_stage() != restore_ui::STAGE_PROCESS) {
'restoreurl' => $restoreurl->out()
);
echo $renderer->render_from_template('core/async_backup_status', $progresssetup);
}
$restore->destroy();
@@ -282,7 +282,14 @@ abstract class restore_controller_dbops extends restore_dbops {
if ($plan->setting_exists($settingname)) {
$setting = $plan->get_setting($settingname);
$value = self::get_setting_default($config, $setting);
$locked = (get_config('restore', $config . '_locked') == true);
$locked = (get_config('restore',$config . '_locked') == true);
// Use the original value when this is an import and the setting is unlocked.
if ($controller->get_mode() == backup::MODE_IMPORT && $controller->get_interactive()) {
if (!$uselocks || !$locked) {
$value = $setting->get_value();
}
}
// We can only update the setting if it isn't already locked by config or permission.
if ($setting->get_status() != base_setting::LOCKED_BY_CONFIG
+15 -10
View File
@@ -1371,7 +1371,9 @@ abstract class restore_dbops {
// Note: for DB deleted users md5(username) is stored *sometimes* in the email field,
// hence we are looking there for usernames if not empty. See delete_user()
// If match by id and mnethost and user is deleted in DB and
// match by username LIKE 'backup_email.%' or by non empty email = md5(username) => ok, return target user
// match by username LIKE 'substring(backup_email).%' where the substr length matches the retained data in the
// username field (100 - (timestamp + 1) characters), or by non empty email = md5(username) => ok, return target user.
$usernamelookup = core_text::substr($user->email, 0, 89) . '.%';
if ($rec = $DB->get_record_sql("SELECT *
FROM {user} u
WHERE id = ?
@@ -1384,13 +1386,14 @@ abstract class restore_dbops {
AND email = ?
)
)",
array($user->id, $user->mnethostid, $user->email.'.%', md5($user->username)))) {
array($user->id, $user->mnethostid, $usernamelookup, md5($user->username)))) {
return $rec; // Matching user, deleted in DB found, return it
}
// 1D - Handle users deleted in backup file and "alive" in DB
// If match by id and mnethost and user is deleted in backup file
// and match by email = email_without_time(backup_email) => ok, return target user
// and match by substring(email) = email_without_time(backup_email) where the substr length matches the retained data
// in the username field (100 - (timestamp + 1) characters) => ok, return target user.
if ($user->deleted) {
// Note: for DB deleted users email is stored in username field, hence we
// are looking there for emails. See delete_user()
@@ -1400,7 +1403,7 @@ abstract class restore_dbops {
FROM {user} u
WHERE id = ?
AND mnethostid = ?
AND UPPER(email) = UPPER(?)",
AND " . $DB->sql_substr('UPPER(email)', 1, 89) . " = UPPER(?)",
array($user->id, $user->mnethostid, $trimemail))) {
return $rec; // Matching user, deleted in backup file found, return it
}
@@ -1447,7 +1450,8 @@ abstract class restore_dbops {
// Note: for DB deleted users md5(username) is stored *sometimes* in the email field,
// hence we are looking there for usernames if not empty. See delete_user()
// 2B1 - If match by mnethost and user is deleted in DB and not empty email = md5(username) and
// (by username LIKE 'backup_email.%' or non-zero firstaccess) => ok, return target user
// (by username LIKE 'substring(backup_email).%' or non-zero firstaccess) => ok, return target user.
$usernamelookup = core_text::substr($user->email, 0, 89) . '.%';
if ($rec = $DB->get_record_sql("SELECT *
FROM {user} u
WHERE mnethostid = ?
@@ -1461,14 +1465,15 @@ abstract class restore_dbops {
AND firstaccess = ?
)
)",
array($user->mnethostid, md5($user->username), $user->email.'.%', $user->firstaccess))) {
array($user->mnethostid, md5($user->username), $usernamelookup, $user->firstaccess))) {
return $rec; // Matching user found, return it
}
// 2B2 - If match by mnethost and user is deleted in DB and
// username LIKE 'backup_email.%' and non-zero firstaccess) => ok, return target user
// username LIKE 'substring(backup_email).%' and non-zero firstaccess) => ok, return target user
// (this covers situations where md5(username) wasn't being stored so we require both
// the email & non-zero firstaccess to match)
$usernamelookup = core_text::substr($user->email, 0, 89) . '.%';
if ($rec = $DB->get_record_sql("SELECT *
FROM {user} u
WHERE mnethostid = ?
@@ -1476,13 +1481,13 @@ abstract class restore_dbops {
AND UPPER(username) LIKE UPPER(?)
AND firstaccess != 0
AND firstaccess = ?",
array($user->mnethostid, $user->email.'.%', $user->firstaccess))) {
array($user->mnethostid, $usernamelookup, $user->firstaccess))) {
return $rec; // Matching user found, return it
}
// 2C - Handle users deleted in backup file and "alive" in DB
// If match mnethost and user is deleted in backup file
// and match by email = email_without_time(backup_email) and non-zero firstaccess=> ok, return target user
// and match by substring(email) = email_without_time(backup_email) and non-zero firstaccess=> ok, return target user.
if ($user->deleted) {
// Note: for DB deleted users email is stored in username field, hence we
// are looking there for emails. See delete_user()
@@ -1491,7 +1496,7 @@ abstract class restore_dbops {
if ($rec = $DB->get_record_sql("SELECT *
FROM {user} u
WHERE mnethostid = ?
AND UPPER(email) = UPPER(?)
AND " . $DB->sql_substr('UPPER(email)', 1, 89) . " = UPPER(?)
AND firstaccess != 0
AND firstaccess = ?",
array($user->mnethostid, $trimemail, $user->firstaccess))) {
@@ -119,4 +119,246 @@ class restore_dbops_testcase extends advanced_testcase {
$this->assertSame('Table "backup_ids_temp" does not exist', $e->getMessage());
}
}
/**
* Data provider for {@link test_precheck_user()}
*/
public function precheck_user_provider() {
$emailmultiplier = [
'shortmail' => 'normalusername@example.com',
'longmail' => str_repeat('a', 100) // It's not validated, hence any string is ok.
];
$providercases = [];
foreach ($emailmultiplier as $emailk => $email) {
// Get the related cases.
$cases = $this->precheck_user_cases($email);
// Rename them (keys).
foreach ($cases as $key => $case) {
$providercases[$key . ' - ' . $emailk] = $case;
}
}
return $providercases;
}
/**
* Get all the cases implemented in {@link restore_dbops::precheck_users()}
*
* @param string $email
*/
private function precheck_user_cases($email) {
global $CFG;
$baseuserarr = [
'username' => 'normalusername',
'email' => $email,
'mnethostid' => $CFG->mnet_localhost_id,
'firstaccess' => 123456789,
'deleted' => 0,
'forceemailcleanup' => false, // Hack to force the DB record to have empty mail.
'forceduplicateadminallowed' => false]; // Hack to enable import_general_duplicate_admin_allowed.
return [
// Cases with samesite = true.
'samesite match existing (1A)' => [
'dbuser' => $baseuserarr,
'backupuser' => $baseuserarr,
'samesite' => true,
'outcome' => 'match'
],
'samesite match existing anon (1B)' => [
'dbuser' => array_merge($baseuserarr, [
'username' => 'anon01']),
'backupuser' => array_merge($baseuserarr, [
'id' => -1, 'username' => 'anon01', 'firstname' => 'anonfirstname01',
'lastname' => 'anonlastname01', 'email' => 'anon01@doesntexist.invalid']),
'samesite' => true,
'outcome' => 'match'
],
'samesite match existing deleted in db, alive in backup, by db username (1C)' => [
'dbuser' => array_merge($baseuserarr, [
'deleted' => 1]),
'backupuser' => array_merge($baseuserarr, [
'username' => 'this_wont_match']),
'samesite' => true,
'outcome' => 'match'
],
'samesite match existing deleted in db, alive in backup, by db email (1C)' => [
'dbuser' => array_merge($baseuserarr, [
'deleted' => 1]),
'backupuser' => array_merge($baseuserarr, [
'email' => 'this_wont_match']),
'samesite' => true,
'outcome' => 'match'
],
'samesite match existing alive in db, deleted in backup (1D)' => [
'dbuser' => $baseuserarr,
'backupuser' => array_merge($baseuserarr, [
'deleted' => 1]),
'samesite' => true,
'outcome' => 'match'
],
'samesite conflict (1E)' => [
'dbuser' => $baseuserarr,
'backupuser' => array_merge($baseuserarr, ['id' => -1]),
'samesite' => true,
'outcome' => false
],
'samesite create user (1F)' => [
'dbuser' => $baseuserarr,
'backupuser' => array_merge($baseuserarr, [
'username' => 'newusername']),
'samesite' => false,
'outcome' => true
],
// Cases with samesite = false.
'no samesite match existing, by db email (2A1)' => [
'dbuser' => $baseuserarr,
'backupuser' => array_merge($baseuserarr, [
'firstaccess' => 0]),
'samesite' => false,
'outcome' => 'match'
],
'no samesite match existing, by db firstaccess (2A1)' => [
'dbuser' => $baseuserarr,
'backupuser' => array_merge($baseuserarr, [
'email' => 'this_wont_match@example.con']),
'samesite' => false,
'outcome' => 'match'
],
'no samesite match existing anon (2A1 too)' => [
'dbuser' => array_merge($baseuserarr, [
'username' => 'anon01']),
'backupuser' => array_merge($baseuserarr, [
'id' => -1, 'username' => 'anon01', 'firstname' => 'anonfirstname01',
'lastname' => 'anonlastname01', 'email' => 'anon01@doesntexist.invalid']),
'samesite' => false,
'outcome' => 'match'
],
'no samesite match dupe admin (2A2)' => [
'dbuser' => array_merge($baseuserarr, [
'username' => 'admin_old_site_id',
'forceduplicateadminallowed' => true]),
'backupuser' => array_merge($baseuserarr, [
'username' => 'admin']),
'samesite' => false,
'outcome' => 'match'
],
'no samesite match existing deleted in db, alive in backup, by db username (2B1)' => [
'dbuser' => array_merge($baseuserarr, [
'deleted' => 1]),
'backupuser' => array_merge($baseuserarr, [
'firstaccess' => 0]),
'samesite' => false,
'outcome' => 'match'
],
'no samesite match existing deleted in db, alive in backup, by db firstaccess (2B1)' => [
'dbuser' => array_merge($baseuserarr, [
'deleted' => 1]),
'backupuser' => array_merge($baseuserarr, [
'mail' => 'this_wont_match']),
'samesite' => false,
'outcome' => 'match'
],
'no samesite match existing deleted in db, alive in backup (2B2)' => [
'dbuser' => array_merge($baseuserarr, [
'deleted' => 1,
'forceemailcleanup' => true]),
'backupuser' => $baseuserarr,
'samesite' => false,
'outcome' => 'match'
],
'no samesite match existing alive in db, deleted in backup (2C)' => [
'dbuser' => $baseuserarr,
'backupuser' => array_merge($baseuserarr, [
'deleted' => 1]),
'samesite' => false,
'outcome' => 'match'
],
'no samesite conflict (2D)' => [
'dbuser' => $baseuserarr,
'backupuser' => array_merge($baseuserarr, [
'email' => 'anotheruser@example.com', 'firstaccess' => 0]),
'samesite' => false,
'outcome' => false
],
'no samesite create user (2E)' => [
'dbuser' => $baseuserarr,
'backupuser' => array_merge($baseuserarr, [
'username' => 'newusername']),
'samesite' => false,
'outcome' => true
],
];
}
/**
* Test restore precheck_user method
*
* @dataProvider precheck_user_provider
* @covers restore_dbops::precheck_user()
*
* @param array $dbuser
* @param array $backupuser
* @param bool $samesite
* @param mixed $outcome
**/
public function test_precheck_user($dbuser, $backupuser, $samesite, $outcome) {
global $DB;
$this->resetAfterTest();
$dbuser = (object)$dbuser;
$backupuser = (object)$backupuser;
$siteid = null;
// If the backup user must be deleted, simulate it (by temp inserting to DB, deleting and fetching it back).
if ($backupuser->deleted) {
$backupuser->id = $DB->insert_record('user', array_merge((array)$backupuser, ['deleted' => 0]));
delete_user($backupuser);
$backupuser = $DB->get_record('user', ['id' => $backupuser->id]);
$DB->delete_records('user', ['id' => $backupuser->id]);
unset($backupuser->id);
}
// Create the db user, normally.
$dbuser->id = $DB->insert_record('user', array_merge((array)$dbuser, ['deleted' => 0]));
$backupuser->id = $backupuser->id ?? $dbuser->id;
// We may want to enable the import_general_duplicate_admin_allowed setting and look for old admin records.
if ($dbuser->forceduplicateadminallowed) {
set_config('import_general_duplicate_admin_allowed', true, 'backup');
$siteid = 'old_site_id';
}
// If the DB user must be deleted, do it and fetch it back.
if ($dbuser->deleted) {
delete_user($dbuser);
// We may want to clean the mail field (old behavior, not containing the current md5(username).
if ($dbuser->forceemailcleanup) {
$DB->set_field('user', 'email', '', ['id' => $dbuser->id]);
}
}
// Get the dbuser record, because we may have changed it above.
$dbuser = $DB->get_record('user', ['id' => $dbuser->id]);
$method = (new ReflectionClass('restore_dbops'))->getMethod('precheck_user');
$method->setAccessible(true);
$result = $method->invoke(null, $backupuser, $samesite, $siteid);
if (is_bool($result)) {
$this->assertSame($outcome, $result);
} else {
$outcome = $dbuser; // Outcome is not bool, matching found, so it must be the dbuser,
// Just check ids, it means the expected match has been found in database.
$this->assertSame($outcome->id, $result->id);
}
}
}
+10 -3
View File
@@ -305,10 +305,17 @@ class async_helper {
$tabledata = array();
// Get relevant backup ids based on context instance id.
$select = 'itemid = ? AND execution = ? AND status < ? AND status > ?';
$params = array($instanceid, backup::EXECUTION_DELAYED, backup::STATUS_FINISHED_ERR, backup::STATUS_NEED_PRECHECK);
$backups = $DB->get_records_select('backup_controllers', $select, $params, 'timecreated DESC', 'id, backupid, timecreated');
$select = 'itemid = :itemid AND execution = :execution AND status < :status1 AND status > :status2 ' .
'AND operation = :operation';
$params = [
'itemid' => $instanceid,
'execution' => backup::EXECUTION_DELAYED,
'status1' => backup::STATUS_FINISHED_ERR,
'status2' => backup::STATUS_NEED_PRECHECK,
'operation' => 'backup',
];
$backups = $DB->get_records_select('backup_controllers', $select, $params, 'timecreated DESC', 'id, backupid, timecreated');
foreach ($backups as $backup) {
$bc = \backup_controller::load_controller($backup->backupid); // Get the backup controller.
$filename = $bc->get_plan()->get_setting('filename')->get_value();
+3 -3
View File
@@ -56,7 +56,7 @@ class behat_backup extends behat_base {
// table elements are used, and we need to catch exceptions contantly.
// Go to homepage.
$this->getSession()->visit($this->locate_path('/?redirect=0'));
$this->execute('behat_general::i_visit', ['/?redirect=0']);
$this->execute("behat_general::wait_until_the_page_is_ready");
// Click the course link.
@@ -98,7 +98,7 @@ class behat_backup extends behat_base {
// table elements are used, and we need to catch exceptions contantly.
// Go to homepage.
$this->getSession()->visit($this->locate_path('/?redirect=0'));
$this->execute('behat_general::i_visit', ['/?redirect=0']);
// Click the course link.
$this->execute("behat_general::click_link", $backupcourse);
@@ -134,7 +134,7 @@ class behat_backup extends behat_base {
// table elements are used, and we need to catch exceptions contantly.
// Go to homepage.
$this->getSession()->visit($this->locate_path('/?redirect=0'));
$this->execute('behat_general::i_visit', ['/?redirect=0']);
$this->execute("behat_general::wait_until_the_page_is_ready");
// Click the course link.
+2 -1
View File
@@ -36,7 +36,8 @@ if (empty($CFG->enablebadges)) {
$hash = required_param('b', PARAM_ALPHANUM); // Issued badge unique hash for badge assertion.
$action = optional_param('action', null, PARAM_BOOL); // Generates badge class if true.
$obversion = optional_param('obversion', OPEN_BADGES_V1, PARAM_INT); // For control format OB specification version.
// OB specification version. If it's not defined, the site will be used as default.
$obversion = optional_param('obversion', badges_open_badges_backpack_api(), PARAM_INT);
$assertion = new core_badges_assertion($hash, $obversion);
+8
View File
@@ -67,6 +67,14 @@ if ($action == 'edit') {
echo $output->heading(get_string('managebackpacks', 'badges'));
$form->display();
} else if ($action == 'test') {
// If no backpack has been selected, there isn't anything to test.
if (empty($id)) {
redirect($url);
}
echo $OUTPUT->header();
echo $output->render_test_backpack_result($id);
} else {
echo $OUTPUT->header();
echo $output->heading(get_string('managebackpacks', 'badges'));
+4 -4
View File
@@ -199,7 +199,7 @@ class core_badges_assertion {
$class['criteria'] = $this->_url->out(false); // Currently issued badge URL.
if ($issued) {
if ($this->_obversion == OPEN_BADGES_V2) {
$issuerurl = new moodle_url('/badges/badge_json.php', array('id' => $this->get_badge_id(), 'action' => 0));
$issuerurl = new moodle_url('/badges/issuer_json.php', array('id' => $this->get_badge_id()));
} else {
$issuerurl = new moodle_url('/badges/assertion.php', array('b' => $this->_data->uniquehash, 'action' => 0));
}
@@ -233,7 +233,8 @@ class core_badges_assertion {
$issuer['email'] = $CFG->badges_defaultissuercontact;
}
} else {
$issuer = badges_get_default_issuer();
$badge = new badge($this->get_badge_id());
$issuer = $badge->get_badge_issuer();
}
}
$this->embed_data_badge_version2($issuer, OPEN_BADGES_V2_TYPE_ISSUER);
@@ -341,8 +342,7 @@ class core_badges_assertion {
'/badges/badge_json.php',
array('id' => $this->get_badge_id())
);
$issuerurl = new moodle_url('/badges/badge_json.php', array('id' => $this->get_badge_id(), 'action' => 0,
'obversion' => $this->_obversion));
$issuerurl = new moodle_url('/badges/issuer_json.php', ['id' => $this->get_badge_id()]);
// For assertion.
if ($type == OPEN_BADGES_V2_TYPE_ASSERTION) {
$json['@context'] = OPEN_BADGES_V2_CONTEXT;

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