Compare commits

...

309 Commits

Author SHA1 Message Date
Jun Pataleta 4b69c11978 Moodle release 4.1.1 2023-01-14 14:17:03 +08:00
Jun Pataleta 2d628ba8d6 weekly release 4.1+ 2023-01-13 10:52:14 +08:00
Andrew Nicols 3528887bb6 Merge branch 'MDL-76820-401' of https://github.com/cameron1729/moodle into MOODLE_401_STABLE 2023-01-12 12:09:35 +08:00
Jun Pataleta 217a32f033 Merge branch 'MDL-76649_401' of https://github.com/timhunt/moodle into MOODLE_401_STABLE 2023-01-12 12:06:45 +08:00
Jun Pataleta d24c201b6d Merge branch 'MDL-76474-401-2' of https://github.com/HuongNV13/moodle into MOODLE_401_STABLE 2023-01-12 11:55:41 +08:00
Huong Nguyen 4d9960ace2 MDL-76474 tiny_h5p: Prevent H5P Formatter placeholder to be assessed 2023-01-12 10:53:06 +07:00
Huong Nguyen 4e1c4f4483 MDL-76474 tiny_accessibilitychecker: Prevent placeholders to be assessed 2023-01-12 10:53:04 +07:00
Huong Nguyen b4e7d5300a MDL-76474 editor_tiny: Implement placeholder selector list
We created a list of placeholder selectors in placeholderSelectors option.
The purpose of this list is to indicate the contents that are only shown
in the editor and not to the users, by that way, we can decide to apply or
not to apply rules, styles, etc... to these contents
2023-01-12 10:52:39 +07:00
Michael Hawkins 313d44f83a MDL-76861 blog: Ensure correct escaping applied to search string 2023-01-12 11:43:11 +08:00
Jake Dallimore 6a6f5b79dd MDL-76862 user: Unit test for setting user home page preferences 2023-01-12 11:35:26 +08:00
Paul Holden f3c335b376 MDL-76862 user: ensure user can only update own preferred start page. 2023-01-12 11:35:26 +08:00
Andrew Nicols 5eb91a54c3 Merge branch 'MDL-76839-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2023-01-12 10:57:01 +08:00
Cameron Ball 1e72ef978a MDL-76820 core_search: Reset manager::$coursedeleting between tests 2023-01-12 10:54:44 +08:00
Jun Pataleta 28ccae3b7a Merge branch 'MDL-76739-401' of https://github.com/junpataleta/moodle into MOODLE_401_STABLE 2023-01-12 10:17:37 +08:00
Jun Pataleta f06b222aa8 MDL-76739 behat: Replace occurrences of "surname" in Behat tests
Replace occurrences of "surname" in Behat tests with "last name"
2023-01-12 09:52:48 +08:00
Ilya Tregubov a4aeb20a30 Merge branch 'MDL-76607-401' of https://github.com/davewoloszyn/moodle into MOODLE_401_STABLE 2023-01-11 19:16:29 +07:00
Andrew Nicols b50964d2e2 Merge branch '66924-view-own-private-reply-401' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_401_STABLE 2023-01-11 15:53:27 +08:00
Tim Hunt 2ea89b98a7 MDL-76810 redirect handling: ensure return URLs are properly sanitised 2023-01-11 11:43:12 +08:00
Andrew Nicols 833bc53bbb Merge branch 'MDL-76356_401' of https://github.com/stronk7/moodle into MOODLE_401_STABLE 2023-01-11 10:30:25 +08:00
Jake Dallimore 5123d2bf53 Merge branch 'MDL-76597-401-2' of https://github.com/junpataleta/moodle into MOODLE_401_STABLE 2023-01-11 10:12:08 +08:00
David Mudrák acd82d3a86 MDL-76739 lang: Use the fixed strings in the tests, too 2023-01-10 21:15:06 +01:00
Helen Foster 152bbd76c5 MDL-76739 lang: Import fixed English strings (en_fix) 2023-01-10 21:13:14 +01:00
Paul Holden 02df248fbd Merge branch 'MDL-76811-401' of https://github.com/andrewnicols/moodle into MOODLE_401_STABLE 2023-01-10 16:40:06 +00:00
Paul Holden f5844e80fd Merge branch 'MDL-76803-401' of https://github.com/junpataleta/moodle into MOODLE_401_STABLE 2023-01-10 16:24:16 +00:00
Paul Holden a789bf5b24 Merge branch 'MDL-76653-401' of https://github.com/lameze/moodle into MOODLE_401_STABLE 2023-01-10 15:29:16 +00:00
Marina Glancy ff5fc3820a MDL-76356 various: avoid implicit conversion to int
PHP before version 8.1 automatically converted to int if the function
parameter (or array key) is expected to be int. PHP 8.1 shows notice in
this case
2023-01-10 15:25:57 +01:00
Marina Glancy 66dcb1683b MDL-76356 various: avoid implicit conversion to arrays
PHP before version 8.1 automatically converted stdClass or 'false' to arrays if
function parameter expects array (for example, "reset").
PHP 8.1 shows notices in these situations
2023-01-10 15:03:40 +01:00
Paul Holden 9cdafb6cad MDL-76839 mod_data: correct external test class coverage notation. 2023-01-10 13:02:29 +00:00
Paul Holden 89c59f32cf Merge branch 'MDL-76833-401' of https://github.com/andrewnicols/moodle into MOODLE_401_STABLE 2023-01-10 12:29:14 +00:00
Jun Pataleta 8280476728 MDL-76803 lang: Update usages of reworded email display options 2023-01-10 16:01:44 +08:00
Jun Pataleta 4fc9c3bba1 MDL-76803 lang: Make email display options more concise 2023-01-10 16:01:44 +08:00
Andrew Nicols 74f1a285a1 MDL-76833 core: Bump phpunit/php-code-coverage version
This includes a bug fix for a display issue with code coverage reporting
in phpunit's HTML output report.
2023-01-10 12:09:01 +08:00
Andrew Nicols d9ae9e51cd MDL-76811 mod_data: Remove duplicate tests 2023-01-10 11:39:40 +08:00
Andrew Nicols cd42aa554f MDL-76811 mod_data: Stop testing template creation on field creation
The default template is no longer created when creating the fields with
the generator, so we should stop testing that it is.
2023-01-10 11:39:40 +08:00
Andrew Nicols e8ea4916e9 MDL-76811 mod_data: Generator test cleanup 2023-01-10 11:39:40 +08:00
Simey Lameze d1f75e4dce MDL-76653 behat: add coverage for SCORM availability 2023-01-10 10:26:04 +08:00
Jun Pataleta 1b54b120ad Merge branch 'MDL-76061-MOODLE_401_STABLE' of https://github.com/PhMemmel/moodle into MOODLE_401_STABLE 2023-01-10 09:41:46 +08:00
Philipp Memmel 3c5413f02a MDL-76061 core_calendar: Fix changing event type from 'user' 2023-01-09 15:03:15 +01:00
Julien Boulen 4ea254faf2 MDL-66924 mod_forum: Allow users to see their own private messages
Allow users to see their own private messages even if they don't have
mod/forum:readprivatereplies capability

Add behat test to avoid MDL-67109 issue.

Co-authored-by: Martin Putzlocher <mputzi@users.noreply.github.com>
2023-01-09 14:43:51 +01:00
Tim Hunt d71ada1952 MDL-76649 quiz statistics task: output more useful trace info
At the moment, quiz_statistics\task\recalculate gives no useful
information about what it is doing, which makes it hard to investigate
if the task fails. This commit makes it more usefully verbose.

Also, following this change, one instance of this task will not
run for more than one hour at a time.

As part of this commit, I have added a new helper mtrace_exception.
to consistently log exceptions in scheduled tasks. It is sad to
add a new function to moodlelib.php, but that seemed the logical place.
Looking at other tasks, this method is badly needed. Many are just
logging the ->getMessage() which is normaly insufficient for proper
debugging. However, swiching all existing tasks to use the new function
will need to wait for a future MDL.
2023-01-09 13:34:14 +00:00
Paul Holden 29efbedc8b Merge branch 'MDL-75532-401' of https://github.com/snake/moodle into MOODLE_401_STABLE 2023-01-09 11:50:59 +00:00
Jun Pataleta 8ea2421cd4 Merge branch 'MDL-76785-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2023-01-09 19:38:42 +08:00
Jun Pataleta 1361e6ad92 Merge branch 'MDL-76506_m41' of https://github.com/jrchamp/moodle into MOODLE_401_STABLE 2023-01-09 19:33:59 +08:00
Paul Holden 3387060fe1 MDL-76785 tiny_media: define video width/height language strings.
AMOS BEGIN
 CPY [videoheight,atto_media],[videoheight,tiny_media]
 CPY [videowidth,atto_media],[videowidth,tiny_media]
AMOS END
2023-01-09 10:52:18 +00:00
Jun Pataleta 5d27f595d7 Merge branch 'MDL-76787-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2023-01-09 18:38:55 +08:00
Paul Holden 6f2d09dc5a Merge branch 'MDL-76601-401' of https://github.com/junpataleta/moodle into MOODLE_401_STABLE 2023-01-09 10:11:10 +00:00
Jun Pataleta e101b6f195 Merge branch 'MDL-76812-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2023-01-09 17:46:13 +08:00
Jun Pataleta 934d8a2866 MDL-76597 mod_quiz: Add a default heading name for Behat tests 2023-01-09 15:41:59 +08:00
Jun Pataleta 6a7668e350 MDL-76597 mod_quiz: Set presentation role for the question list
Since the <ul> and <li> elements for listing the quiz questions and
elements are mainly used for layout purposes, it is better to set the
role of these elements to presentation only.
The aria-label for the <li> element is inappropriate and can also cause
confusion to screen reader users. Better to remove this. Though this is
being used in the confirmation modal so better to just change it to a
data attribute.
2023-01-09 15:41:59 +08:00
Jun Pataleta d2bacb04ff MDL-76597 mod_quiz: Set presentation role for the question list
Since the <ul> and <li> elements for listing the quiz questions and
elements are mainly used for layout purposes, it is better to set the
role of these elements to presentation only.
2023-01-09 15:41:59 +08:00
Jun Pataleta 77a0f1b129 MDL-76597 mod_quiz: Add label for question checkboxes 2023-01-09 15:41:59 +08:00
Jun Pataleta ca841d1489 MDL-76597 mod_quiz: Darken section heading on quiz questions page 2023-01-09 15:41:59 +08:00
Jun Pataleta c2216eefa6 MDL-76597 mod_quiz: Add label for version selector 2023-01-09 15:41:59 +08:00
Jun Pataleta 241da816db MDL-76597 mod_quiz: Add a default sr-only section heading
Add a default sr-only section heading in order to prevent having an
empty heading for the quiz section which is not good for accessibility.

Plus:
- There's also an existing issue where filters are never applied to
section headings on load. This has been fixed in this commit as well.
- Button role added for the edit section button which enables it to
take advantage of the theme highlighting when it receives focus.
2023-01-09 15:41:59 +08:00
Jake Dallimore 18302e1244 MDL-75532 enrol_lti: fix optional lineitemsurl in grade sync task
As in MDL-74691, we need either or both of these fields, meaning either
one could be omitted. This just supports that as per the fix made in
MDL-74691.
2023-01-09 11:39:17 +08:00
Jake Dallimore 2080ba7c83 MDL-75532 enrol_lti: add tests for coupled and decoupled line items
This covers the following cases:
1. Where only the 'lineitem' service endpoint is provided
2. Where only the 'lineitems' service endpoint is provided.
Existing tests already cover the case where both are provided.
2023-01-09 11:39:09 +08:00
Paul Holden b99d68087d Merge branch 'MDL-32114-401' of https://github.com/srobotta/moodle into MOODLE_401_STABLE 2023-01-06 11:20:47 +00:00
Paul Holden 93d95cf1fe Merge branch 'MDL-76578-401' of https://github.com/aanabit/moodle into MOODLE_401_STABLE 2023-01-06 10:41:36 +00:00
Paul Holden 13a6018b6d Merge branch 'MDL-76781-401' of https://github.com/lucaboesch/moodle into MOODLE_401_STABLE 2023-01-06 10:23:55 +00:00
Paul Holden ee507d22ec MDL-76812 reportbuilder: ensure audience key is incremented correctly. 2023-01-06 09:58:05 +00:00
Ilya Tregubov 145317b2b3 MDL-76251 mod_forum: Fix illegal whitespace. Another try. 2023-01-06 16:41:25 +07:00
Ilya Tregubov c3fdfc996c Merge branch 'MDL-76251-patch-401' of https://github.com/ilyatregubov/moodle into MOODLE_401_STABLE 2023-01-06 16:14:38 +07:00
Ilya Tregubov 6ee2865fcc MDL-76251 mod_forum: Fix illegal whitespace. 2023-01-06 16:11:51 +07:00
Ilya Tregubov 4943d24d50 Merge branch 'MDL-76251-401' of https://github.com/aya-saad1/moodle into MOODLE_401_STABLE 2023-01-06 15:37:55 +07:00
Stephan Robotta 64b8061180 MDL-32114 form: markdown must be preserved on saving post
- Markdown is saved to the DB, no conversion to HTML to keep
  ability to reedit the content without beaking it.
- Blockquote element is styled that it's distingishable from
  normal text.
2023-01-05 18:36:16 +01:00
Andrew Nicols b24414554f Merge branch 'MDL-76508-401' of https://github.com/meirzamoodle/moodle into MOODLE_401_STABLE 2023-01-05 21:30:22 +08:00
Luca Bösch 325ca6568b MDL-76781 gradebook: support multilingual group names. 2023-01-05 13:27:02 +01:00
Paul Holden cd072308e5 weekly release 4.1+ 2023-01-05 10:53:10 +00:00
Aya Saad 3e0ad5831a MDL-76251 mod_forum: fix responsive issues in discussion 2023-01-05 11:41:19 +02:00
David Woloszyn a5430f1022 MDL-76607 timeline: Reordered message to account for long course name 2023-01-05 12:13:50 +11:00
David Woloszyn 46fca91bc4 MDL-76607 css: Fixed various classes where long strings break layout 2023-01-05 12:13:49 +11:00
Paul Holden f8b463e394 MDL-76787 tiny_h5p: correct capability for plugin enabled state. 2023-01-04 16:07:47 +00:00
Sara Arjona 717e049627 Merge branch 'MDL-76375-401' of https://github.com/lucaboesch/moodle into MOODLE_401_STABLE 2023-01-04 16:21:42 +01:00
Luca Bösch 6e286481e0 MDL-76375 quiz generator: Allow more than one attempt by Behat tests. 2023-01-04 15:15:46 +01:00
Sara Arjona 1cf0f78b9a Merge branch 'MDL-76221-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2023-01-04 13:09:18 +01:00
Paul Holden d95ab775ac MDL-76657 grade: load required test libraries for grade helper. 2023-01-04 11:22:42 +00:00
Paul Holden 56a3828cf7 Merge branch 'MDL-76657-401' of https://github.com/rezaies/moodle into MOODLE_401_STABLE 2023-01-04 11:10:39 +00:00
Paul Holden 4ecd652189 MDL-76221 reportbuilder: improve report test generator methods.
Test generators for creating report columns, filters and conditions
now allow for setting all persistent properties.
2023-01-04 10:56:23 +00:00
Jun Pataleta 9c4b8bf7e8 Merge branch 'MDL-74822-401' of https://github.com/HuongNV13/moodle into MOODLE_401_STABLE 2023-01-04 17:29:21 +08:00
Jun Pataleta c380811bb2 MDL-76601 block_myoverview: Remove hover action before clicking on menu
With the course card menu now always displayed, there's no need to hover
first before clicking on the menus on block_myoverview Behat tests.
2023-01-04 17:22:38 +08:00
Jun Pataleta 3e175706ff MDL-76601 blocks: Always display course card menus
Displaying the course card menu only on hover is bad in terms of
accessibility as it prevents keyboard-only users from accessing the
menu. So it's better to always display them.
2023-01-04 17:22:38 +08:00
Sara Arjona db3bc708c4 Merge branch 'MDL-76181-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2023-01-04 09:20:19 +01:00
Sara Arjona 87b3be343e Merge branch 'MDL-76308-401' of https://github.com/BruceGoodGuy/moodle into MOODLE_401_STABLE 2023-01-03 14:13:00 +01:00
Paul Holden a25f2d0d7e Merge branch 'MDL-53137-401' of https://github.com/lucisgit/moodle into MOODLE_401_STABLE 2023-01-03 12:14:36 +00:00
Sara Arjona 0eb65f27ba Merge branch 'MDL-71506-401' of https://github.com/lucaboesch/moodle into MOODLE_401_STABLE 2023-01-03 13:10:17 +01:00
Paul Holden a4dfd67aed Merge branch 'MDL-75346-reset_dashboard_error-401' of https://github.com/leonstr/moodle into MOODLE_401_STABLE 2023-01-03 11:28:28 +00:00
Shamim Rezaie 3a5820f3c4 MDL-76657 gradebook: Remove hard-coded plugin names from unit test 2023-01-03 20:23:48 +11:00
Andrew Nicols a9abcf1af7 MDL-32105 mod_glossary: Improve behat test 2023-01-03 15:32:12 +08:00
Andrew Nicols 72f4f8ec7c Merge branch 'MDL-32105-401' of https://github.com/Chocolate-lightning/moodle into MOODLE_401_STABLE 2023-01-03 15:32:04 +08:00
Peter 9fd77db89a MDL-32105 mod_glossary: Restrict glossary aliases by set of keywords 2023-01-03 13:50:19 +08:00
Huong Nguyen c6a1770682 MDL-74822 usertours: Fix accessibility issues with user tours
Including in this commit:
 - Prevent the tour to be displayed if the CSS is disabled by the browser
 - Removed redundant tabindex=0 attribute on the target
 - Created extra code to re-calculate the suitable position of the tour
 - Fixed tour issue in 200% and 400% zoom
 - Fixed tour highlight is not correct in 200% and 400%
2023-01-03 10:35:24 +07:00
Sara Arjona 3e4ba8af5c Merge branch 'MDL-60038-401' of https://github.com/aneno-m-e/moodle into MOODLE_401_STABLE 2023-01-02 16:35:23 +01:00
Luca Bösch dcb0de7c92 MDL-71506 mod_choice: suppress non respondents in downloads if set so. 2023-01-02 15:53:20 +01:00
Sara Arjona e2c8f3db7c Merge branch 'MDL-76106-401' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_401_STABLE 2023-01-02 13:07:39 +01:00
Sara Arjona b7b2097f50 Merge branch 'MDL-76760-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2023-01-02 12:27:40 +01:00
Paul Holden 0dbc7187ff MDL-76181 reportbuilder: sort columns during stress testing. 2022-12-29 13:57:37 +00:00
Sara Arjona 7e1aa845c7 weekly release 4.1+ 2022-12-29 12:57:44 +01:00
Sara Arjona 810cffb702 Merge branch 'MDL-76399-patch-401' of https://github.com/ilyatregubov/moodle into MOODLE_401_STABLE 2022-12-29 09:13:32 +01:00
Ilya Tregubov 5271bd9237 MDL-76399 behat: switch to appropriate Behat step for selects. 2022-12-29 14:53:16 +07:00
Ilya Tregubov f84d8e3c37 Merge branch 'MDL-76399-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-29 09:43:28 +07:00
Sara Arjona a3a3fd451c Merge branch 'MDL-76004-401' of https://github.com/aanabit/moodle into MOODLE_401_STABLE 2022-12-28 18:22:35 +01:00
Sara Arjona 52d5ebbb21 Merge branch 'MDL-72523-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-28 13:01:39 +01:00
Sara Arjona c72b7b7edc Merge branch 'MDL-76617_401' of https://github.com/stronk7/moodle into MOODLE_401_STABLE 2022-12-28 12:42:21 +01:00
Paul Holden c4960a2adf MDL-72523 calendar: return original focus from event modals. 2022-12-28 11:14:44 +00:00
Huong Nguyen 510bf00643 MDL-72523 javascript: Introduce setReturnElement for core/modal 2022-12-28 11:14:44 +00:00
Sara Arjona d3fca5e689 Merge branch 'MDL-72563-401' of https://github.com/KepaUrzelai/moodle into MOODLE_401_STABLE 2022-12-28 12:13:16 +01:00
Sara Arjona 1be732e913 Merge branch 'MDL-69071-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-28 11:41:11 +01:00
Paul Holden d2f55155a8 MDL-76760 tool_behat: defer library loading until service execution.
Ensures that API documentation can be generated without requiring
the presence of the `vendor/` directory.
2022-12-28 10:39:48 +00:00
Sara Arjona 430c7ff4e7 Merge branch 'MDL-76734-401' of https://github.com/andrewnicols/moodle into MOODLE_401_STABLE 2022-12-28 10:04:31 +01:00
Ilya Tregubov 181cab2fbd Merge branch 'MDL-76731_401' of https://github.com/PhilippImhof/moodle into MOODLE_401_STABLE 2022-12-28 15:14:07 +07:00
Sara Arjona f4f0207693 Merge branch 'MDL-76679-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-27 16:55:25 +01:00
Amaia Anabitarte ad8a10e7b6 MDL-76578 core_course: One section per page summary information 2022-12-26 16:03:34 +01:00
Meirza 9d822d41d8 MDL-76508 templates: Handling non-JSON string
When the param string contains a left curly bracket as the first character,
the system will assume the string is a JSON string and will be parsed and returned as an object.
But in some cases, the string is not JSON and will return an error if the system parses it.
For example, a user might have used the course name with a left curly bracket as the first character.
Adding a double quote after the left curly bracket to differentiate between string and JSON string,
so it can be safe to parse the string.
2022-12-24 05:50:56 +07:00
Noemie Ariste e89ed4b463 MDL-60038 moodlelib: ignore site policy if user auth type = 'webservice' 2022-12-23 10:09:09 +13:00
Eloy Lafuente (stronk7) 5db1ac4e98 MDL-76617 store_mongodb: Adjust moodle to mongo-php-library to v1.15.0
The new library version should work without problems with older
php-mongodb extension versions:
- v1.15.0 (paired version, tested).
- v1.14.1 (tested)

So, here, in 401_STABLE, we aren't raising the requirements. We have
done that in master, in order to get php82 support, but not here. For
more details about compatibilities, see:

https://www.mongodb.com/docs/drivers/php/#compatibility
2022-12-22 19:36:40 +01:00
Eloy Lafuente (stronk7) c22b39a650 MDL-76617 store_mongodb: Update mongo-php-library to v1.15.0
This updates the library from v1.13.1. Fixes some php81 warnings
leading to failed/risky tests.

The new library version should work without problems with older
php-mongodb extension versions:
- v1.15.0 (paired version, tested).
- v1.14.1 (tested)
2022-12-22 19:36:40 +01:00
Philipp Imhof 9d64ad1416 MDL-76731 behat: add steps to check for version
Co-authored-by: Andrew Nicols <andrew@nicols.co.uk>
2022-12-22 17:12:47 +01:00
Tony Butler 11816b9e41 MDL-53137 qtype_numerical: Swap geo tolerance limits for -ve answers 2022-12-22 15:32:39 +00:00
Ilya Tregubov 178aa05227 weekly release 4.1+ 2022-12-22 19:16:29 +07:00
Ilya Tregubov 9f2e81004c Merge branch 'install_401_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_401_STABLE 2022-12-22 19:16:26 +07:00
Ilya Tregubov 0b7102abcc Merge branch 'MDL-76667-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-22 12:27:51 +07:00
Paul Holden fe16fea153 Merge branch 'MDL-75965-401' of https://github.com/HuongNV13/moodle into MOODLE_401_STABLE 2022-12-22 12:27:51 +07:00
Andrew Nicols 86f9ffc274 MDL-75105 tool_behat: Correct version number 2022-12-22 12:27:51 +07:00
Andrew Nicols a439461f03 MDL-75105 tool_behat: Coding style fixes 2022-12-22 12:27:51 +07:00
Andrew Nicols 5c15c1f211 Merge branch 'MDL-75105_401_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_401_STABLE 2022-12-22 12:27:51 +07:00
Paul Holden 86d02a9239 Merge branch 'MDL-75914-401' of https://github.com/meirzamoodle/moodle into MOODLE_401_STABLE 2022-12-22 12:27:51 +07:00
AMOS bot 68706da86a Automatically generated installer lang files 2022-12-22 00:07:43 +00:00
Meirza 296fd70a2c MDL-75914 webservice: Added fake URL to avoid debugging output.
Webservice doesn't need to set the page URL. Hence,
any function that requires a page URL will raise debugging output.
The patch fixes it by adding a fake URL for the webservice.
The patch also removed assertDebuggingCalled because it is no longer needed.
2022-12-21 16:33:00 +07:00
Mark Johnson 0c448af668 MDL-75105 tool_behat: List available data generators
This will find all data generators that can be used in behat via the
'the following "something" exist:' step, and display them in a select
list on the step definitions page.

When a generator is selected, it will fetch the required fields for that
generator and display them on the page.
2022-12-21 08:38:28 +00:00
Huong Nguyen 1f7bb3a50d MDL-75965 question_multichoice: Misalignment of feedback icons 2022-12-21 14:15:42 +07:00
Andrew Nicols 744e1dbaea MDL-76734 editor_tiny: Listen to TinyMCE submit events
jQuery submit events do not trigger the native submit event, and
therefore the TinyMCE submit listener is not called. This means that the
tinymce.triggerSave() function is not called, and the editor content is
not saved.

To work around this, if there is a form for the Node that the editor is
attached to, the jQuery submit event is listened to and the save event
called.

Unfortunately it is not possible to use a global jQuery submit listener
added to the document to save all editors on the page.
In some cases, this is too late because the bubbling process means that
a child node consumer may attempt to consume the data before the
delegated handler is called for the document.
2022-12-21 13:03:14 +08:00
Ilya Tregubov 5b47024f13 Merge branch 'MDL-76727-401' of https://github.com/andrewnicols/moodle into MOODLE_401_STABLE 2022-12-21 09:50:18 +07:00
Paul Holden dcf4a4629b Merge branch 'MDL-75279-401' of https://github.com/spvickers/moodle into MOODLE_401_STABLE 2022-12-20 10:27:38 +00:00
Andrew Nicols bb7cce1e56 MDL-76727 core: Allow phpcs configuration to be overridden locally
This change reduces the priority of the shipped phpcs configuration to
allow for local overrides.

This is beneficial in several situations:
- when users wish to apply stricter or additional standards
- when the integration team wishes to trial new rules
2022-12-20 09:35:45 +08:00
Stephen Vickers 27cc23ca7a MDL-75279 mod_lti: Add username to NRPS response 2022-12-19 18:09:27 +00:00
Paul Holden e8123832fb Merge branch 'MDL-72906-401' of https://github.com/tdjones/moodle into MOODLE_401_STABLE 2022-12-19 10:23:10 +00:00
Ilya Tregubov 6b47dc3b29 Merge branch 'MDL-74779-401' of https://github.com/ssj365/moodle into MOODLE_401_STABLE 2022-12-19 09:44:48 +07:00
Leon Stringer a77b23cdb7 MDL-75346 core_my: Handle missing blocks on reset
If the default dashboard contained a block that was missing from disk
then "Exception - Call to a member function instance_copy() on bool"
was shown to users.  This change only shows an error with debugging
enabled which now includes the name of the missing block.
2022-12-17 17:39:44 +00:00
Paul Holden 7708594e89 MDL-76399 question: switch to appropriate Behat step for selects. 2022-12-16 13:09:46 +00:00
Paul Holden 1dda343f05 MDL-76399 behat: improvements to "should exist in" thrown exception. 2022-12-16 12:29:57 +00:00
Paul Holden 4f19d454ea Merge branch 'MDL-76026_401' of https://github.com/AnupamaSarjoshi/moodle into MOODLE_401_STABLE 2022-12-16 09:54:15 +00:00
Andrew Nicols 24c009f222 weekly release 4.1+ 2022-12-16 09:05:52 +08:00
Andrew Nicols 5556693437 Merge branch 'install_401_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_401_STABLE 2022-12-16 09:05:50 +08:00
Paul Holden b874e20b55 MDL-69071 core: retrieve full result from remote content.
Use the full result from download_file_content within the component
installer to ensure that spurious debugging is not emitted during
operation. Handle validation of the returned data consistently.
2022-12-15 17:19:17 +00:00
Paul Holden 06383b0b8a MDL-76679 admin: correct password config field template.
The template changes were missed as part of 0795b579, update them
to match so that they continue to work with the unmask JS module.
2022-12-14 19:12:05 +00:00
Sara Arjona 4979a5e988 Merge branch 'MDL-76674_401' of https://github.com/stronk7/moodle into MOODLE_401_STABLE 2022-12-14 18:34:50 +01:00
Amaia Anabitarte 76ce30ca98 MDL-76004 core_h5p: Ensure the browser is serving updated file 2022-12-14 16:22:46 +01:00
Eloy Lafuente (stronk7) 1e54868139 MDL-76674 core_lang: Add string for new America/Ciudad_Juarez 2022-12-14 15:51:10 +01:00
Paul Holden a33d1c8903 Merge branch 'MDL-76666_401' of https://github.com/stronk7/moodle into MOODLE_401_STABLE 2022-12-14 13:22:03 +00:00
Eloy Lafuente (stronk7) c5213c103b MDL-76666 local_langimport: Better handling of long locales
Under some linux versions, and depending of the configured
locale categories, it's possible to get a current locally
which length > 255 when calling to setlocale(LC_ALL, 0).

Later, if that long locale is tried to be restored, there
is a "setlocale(): Specified locale name is too long" warning
error.

When that happens we need to split the long locale into
individual chunks and set all the (six) locale categories
supported one by one.

Covered with tests, note that, in practice, this only
happens with linux because it supports 12 locale categories
@ OS level. Both BSD (6) and Windows (5) hardly can reach the limit.

No matter of that, the tests have been designed to ensure that
they pass on all OSs, just the new code only will be executed
on linux.
2022-12-14 12:25:17 +01:00
Sara Arjona 4ce5c57547 Merge branch 'MDL-75441-401' of https://github.com/aanabit/moodle into MOODLE_401_STABLE 2022-12-14 09:57:12 +01:00
AMOS bot 7496e9df75 Automatically generated installer lang files 2022-12-14 00:07:43 +00:00
Anupama Sarjoshi fe094a3705 MDL-76026 Question bank: Fix errors related to categories renaming
This part of the code in 'question_category_object.php' 'update_category' method was used before Moodle 4.0 version for renaming
the random questions in an updated category. For Moodle 4.1, it is unnecessary as the details of random questions are no more
stored in 'question' table but in 'question_set_references' table. The method call move_question_set_references handles the same.
2022-12-13 18:01:24 +00:00
Amaia Anabitarte 93bd773ee9 MDL-75441 mod_forum: Show add new post button to guest users 2022-12-13 17:38:30 +01:00
Paul Holden 0d20d1e8aa MDL-76667 forms: mark modal form as submitted upon success.
Ensure the form change checker module doesn't warn user about it.
2022-12-13 14:48:10 +00:00
Andrew Nicols 361ebe960b Merge branch 'MDL-76509-401' of https://github.com/safatshahin/moodle into MOODLE_401_STABLE 2022-12-13 20:31:35 +08:00
Andrew Nicols 0d5d3a0c49 Merge branch 'MDL-76536-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-13 11:42:35 +08:00
Andrew Nicols 4d94f7e677 MDL-76293 gradebook: Address coding violations
This includes a data provider which had the 'test_' prefix and was
therefore run as a test.
2022-12-13 11:07:02 +08:00
Andrew Nicols 6f68abf715 Merge branch 'MDL-76293_401' of https://github.com/mkassaei/moodle into MOODLE_401_STABLE 2022-12-13 11:06:59 +08:00
Safat ac21fa9a1c MDL-76509 core: Upgrade error resolve for slot tags 2022-12-13 13:39:02 +11:00
Shamiso.Jaravaza f954848667 MDL-74779 mod_bigbluebuttonbn: Fix recording sort
AMOS BEGIN
 MOV [config_recordings_sortorder,mod_bigbluebuttonbn],[config_recordings_asc_sort,mod_bigbluebuttonbn]
 MOV [config_recordings_sortorder_description,mod_bigbluebuttonbn],[config_recordings_asc_sort_description,mod_bigbluebuttonbn]
AMOS END
2022-12-12 13:33:22 -07:00
hieuvu a42c52bf4e MDL-76106 qtype_ddmarker: fix the missing maker issue.
We will not calculate old maker position again and using old data.
This will make sure the position of makers is correct
when the background image is smaller than dropzone.
2022-12-12 20:31:24 +07:00
Sara Arjona 987542f609 Merge branch 'MDL-75571-401' of https://github.com/jacdsouza/moodle into MOODLE_401_STABLE 2022-12-12 11:23:18 +01:00
Khoa Nguyen Dang 959b58e132 MDL-76308 Question\D&D: The draggable area is slim characters to select 2022-12-12 13:53:57 +07:00
Andrew Nicols be5cf43aa4 Merge branch 'MDL-76398-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-11 20:20:19 +08:00
Jackson D'souza de182b9a22 MDL-75571 tool_componentlibrary: Custom activity icon 2022-12-09 15:56:07 +00:00
Jackson D'souza c48f443c32 MDL-75571 theme_boost: Activity icon
* Use Activity get_icon_url helper method to fetch icon.
2022-12-09 15:56:07 +00:00
Jackson D'souza fc67298a27 MDL-75571 block_timeline: Display custom activity icon if available. 2022-12-09 15:56:07 +00:00
Jackson D'souza c3db3298dd MDL-75571 calendar: Activity icon
* Use Activity get_icon_url helper method to fetch icon.
2022-12-09 15:56:07 +00:00
Sara Arjona 6bb2b9aa69 Merge branch 'MDL-76274-401' of https://github.com/cameron1729/moodle into MOODLE_401_STABLE 2022-12-09 16:18:08 +01:00
Paul Holden 187a7f7ac5 MDL-76536 enrol: prevent invalid role assignments in course creation.
Upgrade step to fixup existing bad data.
2022-12-09 11:39:19 +00:00
Sara Arjona 6b24f59302 weekly release 4.1+ 2022-12-09 08:56:58 +01:00
Sara Arjona 797a20a597 Merge branch 'install_401_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_401_STABLE 2022-12-09 08:56:55 +01:00
Jun Pataleta 7a1e9ad82c Merge branch 'MDL-76556-401' of https://github.com/andrewnicols/moodle into MOODLE_401_STABLE 2022-12-08 10:07:47 +08:00
Andrew Nicols bd40bc0341 Merge branch 'MDL-76491-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-08 08:10:44 +08:00
AMOS bot 398fc9b0d3 Automatically generated installer lang files 2022-12-08 00:07:41 +00:00
Andrew Nicols 2a69a46a71 Merge branch 'MDL-76550_401' of https://github.com/AnupamaSarjoshi/moodle into MOODLE_401_STABLE 2022-12-08 08:06:49 +08:00
Andrew Nicols 41b48aeea5 Merge branch 'MDL-76074-401' of https://github.com/srobotta/moodle into MOODLE_401_STABLE 2022-12-08 07:28:45 +08:00
Andrew Nicols 3a544f384b Merge branch 'MDL-76116-401' of https://github.com/meirzamoodle/moodle into MOODLE_401_STABLE 2022-12-08 06:17:10 +08:00
Sara Arjona d8f2ead786 Merge branch 'MDL-75588-401' of https://github.com/HuongNV13/moodle into MOODLE_401_STABLE 2022-12-07 19:31:11 +01:00
Trevor Jones 50f06cb2be MDL-72906 Quiz: Prevent scrollbar on multichoice
Remove negative margin from the "clear my choice" anchor.
With the negative margin, when the containing box height is calculated
the anchor's hidden style overflows beyond the boundary and triggers
the overflow:auto to add a scroll bar.
2022-12-07 11:23:35 -07:00
Mahmoud Kassaei d4abc697b8 MDL-76293 Gradebook: PHPUnit fails when plugins are not expected 2022-12-07 17:41:19 +00:00
Sara Arjona 10c1a7de42 Merge branch 'MDL-76575-401' of https://github.com/HuongNV13/moodle into MOODLE_401_STABLE 2022-12-07 18:32:19 +01:00
Sara Arjona dc444f4634 Merge branch 'MDL-76500-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-07 18:27:53 +01:00
Sara Arjona 151de4586d Merge branch 'MDL-76193-401' of https://github.com/JBThong/moodle into MOODLE_401_STABLE 2022-12-07 17:26:22 +01:00
Sara Arjona 52890694bf Merge branch 'MDL-76571_401' of https://github.com/timhunt/moodle into MOODLE_401_STABLE 2022-12-07 17:17:41 +01:00
Tim Hunt 95f073453b MDL-76571 quiz reports: should not show description items
... or anything else with length = 0. This got broken in MDL-71696.

The only way to fix this kind-of involves and API change to
quiz_report_get_significant_questions. However, it is only changing
the external API of this function back to how it was before the 4.0 release,
and the chnages in 4.0 were never documented, nor, I would guess, intended,
since they just broke things.
2022-12-07 14:53:41 +00:00
Jun Pataleta 6661a3eb45 Merge branch 'MDL-76559-401' of https://github.com/andrewnicols/moodle into MOODLE_401_STABLE 2022-12-07 22:41:07 +08:00
Andrew Nicols 0f8f164a07 MDL-76559 core: validate_email does not take false either 2022-12-07 21:40:18 +08:00
Sara Arjona 4cc96c42fa Merge branch 'MDL-76273-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-07 12:51:37 +01:00
Huong Nguyen 208c9fb5af MDL-75588 assign: Reset completion status when resetting a submission 2022-12-07 16:16:01 +07:00
Huong Nguyen 8884da3d8b MDL-76575 tiny_media: Remove unnecessary console log 2022-12-07 15:50:40 +07:00
Jun Pataleta e0f34d5049 Merge branch 'MDL-73017-M401_add-environment-check-for-versions-not-supporting-php-8-1' of https://github.com/ziegenberg/moodle into MOODLE_401_STABLE 2022-12-07 13:47:12 +08:00
Meirza 09e171c522 MDL-76116 mnet: styling the delete key confirmation window properly 2022-12-07 11:26:26 +07:00
Jun Pataleta 4426e21204 Merge branch 'MDL-76559-401' of https://github.com/andrewnicols/moodle into MOODLE_401_STABLE 2022-12-06 23:19:37 +08:00
Andrew Nicols fb7d1b34ef MDL-76559 core: validate_email should not accept empty values 2022-12-06 20:53:47 +08:00
Jun Pataleta 32bb535cb6 Merge branch 'MDL-76476-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-06 19:41:17 +08:00
Jun Pataleta dd3b92545e Merge branch 'MDL-75381-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-06 19:24:34 +08:00
Ilya Tregubov e572943d21 Merge branch 'MDL-76490-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-06 13:09:38 +03:00
Paul Holden 2d2b2e3244 MDL-76500 grade: fix grade form when item cannot be overridden. 2022-12-06 09:20:01 +00:00
Ilya Tregubov e03c52acbe Merge branch 'MDL-76446-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-06 12:19:09 +03:00
Cameron Ball c503238978 MDL-76274 assignfeedback_editpdf: Fix upgrade step for stale conversions 2022-12-06 16:05:44 +08:00
Ilya Tregubov bc5c812db3 Merge branch 'MDL-75516_401' of https://github.com/larsbonczek/moodle into MOODLE_401_STABLE 2022-12-06 10:38:12 +03:00
Stephan Robotta d7734740b2 MDL-76074 completion: fixed filter in reports with custom user fields
When the site uses custom user text fields that would show up in a
user list, the filter for firstname or lastname didnt work anymore.
If a filter was used, no result would show up. Users where shown only
when the course reports where used without filters.
2022-12-06 08:24:46 +01:00
Andrew Nicols ba38d916be Merge branch 'MDL-75446-401' of https://github.com/andelacruz/moodle into MOODLE_401_STABLE 2022-12-06 15:19:47 +08:00
Andrew Nicols e7c70fd2c0 Merge branch 'MDL-75573-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-06 13:55:58 +08:00
Andrew Nicols fa309d0650 Merge branch 'MDL-76145-401' of https://github.com/meirzamoodle/moodle into MOODLE_401_STABLE 2022-12-06 13:36:16 +08:00
Paul Holden 1efd88b2c8 MDL-76273 core: multi-byte character filename support for TCPDF.
See: https://github.com/tecnickcom/TCPDF/pull/562
2022-12-05 15:04:23 +00:00
Paul Holden 20ac0d1626 MDL-76490 behat: use defined step for interaction with autocomplete. 2022-12-05 14:22:19 +00:00
Marina Glancy 40ee69ea8b MDL-76490 behat: correct step for opening autocomplete in container. 2022-12-05 14:21:53 +00:00
Anupama Sarjoshi 87d5f8eb0f MDL-76550 Quiz and qbank: Fix display of Category and question names 2022-12-05 12:19:14 +00:00
Sara Arjona 05c53f2c44 Merge branch 'MDL-75789-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-05 12:53:43 +01:00
Sara Arjona 1b9bcbf19d Merge branch 'MDL-76166-username-logging-MOODLE_401_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_401_STABLE 2022-12-05 12:44:23 +01:00
Ilya Tregubov a3ed6cea5f Merge branch 'MDL-75788-401' of https://github.com/lameze/moodle into MOODLE_401_STABLE 2022-12-05 14:31:44 +03:00
Sara Arjona f2dd9867ab Merge branch 'MDL-76482-401' of https://github.com/andrewnicols/moodle into MOODLE_401_STABLE 2022-12-05 12:04:02 +01:00
Daniel Ziegenberg bbd49c9533 MDL-73017 env: Moodle 3.9.x, 3.11.x and 4.0.x do not support PHP 8.1
This commit adds an additional environment check for the unsupported
PHP 8.1 version to Moodle 3.9.x, 3.11.x and 4.0.x.

It also updates the lang string for unsupported PHP version.

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2022-12-05 11:29:09 +01:00
Angelia Dela Cruz bc82295f6a MDL-75446 behat: Workshop behat generators use UI
Replace steps that manually add Workshop instances via the UI and use
Behat generators. This improves the speed of the Behat test runs.
2022-12-05 16:05:07 +08:00
Ilya Tregubov 2e1118fa62 Merge branch 'MDL-76330-MOODLE_401_STABLE' of https://github.com/sh-csg/moodle into MOODLE_401_STABLE 2022-12-05 09:22:05 +03:00
Ferran Recio 272a458099 MDL-76225 core_courseformat: fix section title id 2022-12-05 13:48:05 +08:00
Thong Bui 2370255e4c MDL-76193 Questions: Backup and Restore with tags fails 2022-12-05 10:01:48 +07:00
AMOS bot 9cf6e7128e Automatically generated installer lang files 2022-12-04 00:08:32 +00:00
Andrew Nicols ed29852851 MDL-76556 tool_log: Set the store property correctly 2022-12-03 11:48:26 +08:00
Ilya Tregubov a7e9836173 Merge branch 'MDL-76495-401' of https://github.com/marinaglancy/moodle into MOODLE_401_STABLE 2022-12-02 13:49:13 +03:00
Lars Bonczek add1d29339 MDL-75516 core: Perform proper JSON encoding in mustache quote helper 2022-12-02 11:22:23 +01:00
Paul Holden 68dc955abe MDL-76491 javascript: add missing core/notification imports. 2022-12-02 10:06:21 +00:00
Paul Holden 258fe36e10 MDL-76491 javascript: prevent eslint undefined Notification import. 2022-12-02 10:06:04 +00:00
Paul Holden 76fde950c1 MDL-76398 reportbuilder: use improved action menu steps in Behat.
Improved steps for using actions menus were added in 232ebac3, so
make use of them here for consistency/reliability.
2022-12-02 09:55:55 +00:00
Paul Holden d4681259bc MDL-76398 behat: broader action menu partial matching by element.
For action menu elements whose trigger element isn't plain text
(e.g. a pix icon), we should be able to match via the title of
that element.
2022-12-02 09:55:45 +00:00
Ilya Tregubov e6dec9c0fb Merge branch 'MDL-75951-401' of https://github.com/andrewnicols/moodle into MOODLE_401_STABLE 2022-12-02 11:55:54 +03:00
Dani Palou 8b153fb67d MDL-75788 behat: Use profile field generators in existing tests 2022-12-02 14:58:28 +08:00
Dani Palou 1145b8f597 MDL-75788 testing: Handle new lines in menu profile field generator 2022-12-02 14:58:28 +08:00
Andrew Nicols 743fc68b4f MDL-75951 core: Update box/spout to address PHP 8.1 deprecation
This change is a direct pull from an upstream fix:
https://github.com/openspout/openspout/commit/64a09a748d04992d63b38712599a9d8742bd77f7

This addresses the deprecation of auto_detect_line_endings in PHP 8.1.
2022-12-02 13:58:39 +08:00
Ilya Tregubov 9d801ab8a0 Merge branch 'MDL-76494-401' of https://github.com/marinaglancy/moodle into MOODLE_401_STABLE 2022-12-02 08:41:34 +03:00
hieuvu b7f08d7ecc MDL-76106 qtype_ddmarker: Improve loading consistency.
Wait for the image to load completely before running the js.
2022-12-02 12:39:23 +07:00
Andrew Nicols 715ec40ad6 Merge branch 'MDL-76493-401' of https://github.com/marinaglancy/moodle into MOODLE_401_STABLE 2022-12-02 12:15:30 +08:00
Paul Holden 1d98d162a1 MDL-75573 backup: translate async operation type in messages. 2022-12-01 19:48:58 +00:00
Stefan Hanauska d42189d71a MDL-76330 enrol: Check permission to show edit icon 2022-12-01 20:07:13 +01:00
Sara Arjona 7f5f04dbc2 weekly release 4.1+ 2022-12-01 16:07:58 +01:00
Sara Arjona 82d90a8950 NOBUG: Fixed file access permissions 2022-12-01 16:07:57 +01:00
Simey Lameze e581bd6cde MDL-76507 behat: change step to use 'Recent and next 60 days' option
It was detected that 'This month' option may cause failures in builds in between months
so using the 'Recent and next 60 days' still fixes the weekend scenario and also the
in between months issue.
2022-12-01 08:51:26 +01:00
Andrew Nicols 68cd224ef3 Merge branch 'MDL-75604-401' of https://github.com/ssj365/moodle into MOODLE_401_STABLE 2022-12-01 08:59:07 +03:00
Andrew Nicols afef05b07c Merge branch 'MDL-75281-401' of https://github.com/call-learning/moodle into MOODLE_401_STABLE 2022-12-01 08:59:07 +03:00
Jun Pataleta d9cd25c2fb MDL-76497 upgrade: add the 4.1.0 separation line to all upgrade scripts 2022-12-01 08:59:07 +03:00
Sara Arjona 960bc4e3c5 Merge branch 'MDL-76226-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-01 08:59:07 +03:00
Sara Arjona cf06e4207f Merge branch 'MDL-76507-401' of https://github.com/lameze/moodle into MOODLE_401_STABLE 2022-12-01 08:59:07 +03:00
Jun Pataleta 9f06111278 Merge branch 'MDL-76250-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-01 08:59:06 +03:00
Andrew Nicols a8bcb23134 MDL-76483 core: Handle default value for get_docs_url() 2022-12-01 08:59:06 +03:00
Ilya Tregubov 5c96f74a06 Merge branch 'MDL-74853-401' of https://github.com/marinaglancy/moodle into MOODLE_401_STABLE 2022-12-01 08:59:06 +03:00
Ilya Tregubov 7cc3d06276 Merge branch 'MDL-76487-401' of https://github.com/ilyatregubov/moodle into MOODLE_401_STABLE 2022-12-01 08:59:06 +03:00
Andrew Nicols b00f1464a8 Merge branch 'MDL-75826-401' of https://github.com/meirzamoodle/moodle into MOODLE_401_STABLE 2022-12-01 08:59:06 +03:00
Andrew Nicols 88393518f5 MDL-76487 tiny_autosave: Clarify autosave store rejection message 2022-12-01 08:59:06 +03:00
Jun Pataleta 57e5cc1588 Merge branch 'MDL-68981-401' of https://github.com/HuongNV13/moodle into MOODLE_401_STABLE 2022-12-01 08:59:06 +03:00
Andrew Nicols a0efc27d31 MDL-76487 tiny_autosave: Use navigator.sendBeacon instead of fetch
Firefox does not support the keepalive flag for fetch, despite every
other browser except IE supporting it.
2022-12-01 08:59:06 +03:00
David Woloszyn 0be376fdc0 MDL-76183 lib: Update Github URLs 2022-12-01 08:59:05 +03:00
Jun Pataleta 8bf788a1bd Merge branch 'MDL-76284-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-01 08:59:05 +03:00
Eloy Lafuente (stronk7) 864a2ea990 MDL-76429 composer: Bump to phpwebdriver 1.2.1 for php81 compat
Note this comes with a bunch of other small updates, all them
pretty minor and should not be problematic. Better we get them
than keeping them apart.
2022-12-01 08:59:05 +03:00
Andrew Nicols 73f10723b3 Merge branch 'MDL-76380-401' of https://github.com/paulholden/moodle into MOODLE_401_STABLE 2022-12-01 08:59:05 +03:00
sam marshall be11ee3383 MDL-76218 cachestore_redis: delete_many can fail with no keys
In some cases, we get an error message such as:

Wrong parameter count for Redis::zRem()

Within the delete_many function. This function requires at least one
key to be supplied, but if delete_many is called with an empty array,
we will call it with no keys.
2022-12-01 08:59:05 +03:00
Eloy Lafuente (stronk7) fbb0fd952d MDL-75977 xmldb: Avoid using null params on built-in DB functions
This changes a couple of cases, in postgres and oracle where we
were trying to calculate strlen() on null values (that causes a
PHP 8.1 warning).

Also, at the same time, fixing another case in xmldb_field, it
was detected that it had a bug around precision (being set to the
value of type), being used as object property, when it's not, so
it was also fixed by moving the code logic a little bit.

Note that the bug has been there since inception because there
isn't any code in Moodle using that ->precision property. It
was just detected thanks to PHP 8.2, but that's another story. :-)

Verified that with the patch:
- All DBs can be installed (phpunit install)
- Both DDL and DML pass without any ddl/dml warning (in all DBs).
2022-12-01 08:59:05 +03:00
Meirza 0cc4492303 MDL-76127 Profiling: Make the breadcrumb of the profiling URL clickable
Boost has the behavior to remove the last item action.
To avoid that, we need to add an action item.
2022-12-01 08:59:05 +03:00
Ilya Tregubov dcc2d22a74 Merge branch 'MDL-72019-401' of https://github.com/ilyatregubov/moodle into MOODLE_401_STABLE 2022-12-01 08:59:05 +03:00
Meirza 1c2503a6de MDL-72019 user: Allows data to be formatted when exporting. 2022-12-01 08:59:05 +03:00
Laurent David c86d6510ce MDL-75281 mod_bigbluebuttonbn: Upgrade failure when table exists
* Fix several upgrade script issue when the recording table exists or plugin has been
downgraded prior to 4.x upgrade
2022-11-30 20:18:27 +01:00
Shamiso.Jaravaza a8f889acbf MDL-75604 mod_bigbluebuttonbn: Fix welcome section
* Removed welcome message from General settings
* Cleaned settings.php file to remove hardcoded add($item) after adding conditional element
2022-11-30 12:10:07 -07:00
Kepa Urzelai 5a07bcf871 MDL-72563 theme_boost: rubric area style fix 2022-11-30 15:13:50 +01:00
Marina Glancy 12ac6ce86b MDL-76494 libs: patch Box::Spout for PHP 8.1 - calling basename on null 2022-11-30 10:45:58 +01:00
Meirza 2db281b197 MDL-76145 course: Avoid long course names that exceed available space
Co-authored-by: Stephen Sharpe <stephen.sharpe@synergy-learning.com>
2022-11-30 11:36:24 +07:00
Andrew Nicols 805559cb48 MDL-76482 output: The javascript mustache helper should return a string 2022-11-30 12:18:47 +08:00
Huong Nguyen 19ed64f2d9 MDL-68981 tool_recyclebin: Force necessary settings when restoring
Created code to force the necessary settings for restore_item in:
  + course_bin class
  + category_bin class
2022-11-30 10:18:54 +07:00
Huong Nguyen dcc115786d MDL-68981 tool_recyclebin: Extra PHPUnit with General restore config 2022-11-30 10:18:54 +07:00
Huong Nguyen 2ef01c0fdf MDL-68981 tool_recyclebin: Extra Behat test with General restore config
Including in this commit:
 - Convert existing Behat scenario to use Data generators
 - Convert existing Behat scenario to use Provider
 - Add new scenario for Include users setting in General restore page
2022-11-30 10:18:54 +07:00
Brendan Heywood 2696f446ac MDL-76166 calendar: Ensure user is in server access logs 2022-11-30 13:26:27 +11:00
Brendan Heywood c45c98f6f2 MDL-76166 auth: Ensure user is in server access logs 2022-11-30 13:26:27 +11:00
Jonathan Champ 181ecedb11 MDL-76506 cache_application: Fix MDL_PERF and perfdebug checks 2022-11-29 13:28:05 -05:00
Paul Holden 7e8efa870d MDL-76446 user: correct logic for multiple keyword search.
When the keyword participant filter was used with multiple values
in conjunction with other participants filters, the boolean logic
was effectively:

 X AND Y OR Z

When what we actually wanted was:

 X AND (Y OR Z)
2022-11-29 16:31:05 +00:00
Paul Holden b363723f9a MDL-76476 tiny_media: don't load image preview if none exists. 2022-11-29 16:28:15 +00:00
Ilya Tregubov e0ef5d0638 Merge branch 'MDL-75463-401' of https://github.com/ilyatregubov/moodle into MOODLE_401_STABLE 2022-11-29 13:32:16 +03:00
Kevin Percy 38250aec8e MDL-75463 lib: Update Bennu version number to 0.2 2022-11-29 13:31:25 +03:00
Andrew Nicols 5475fb8a15 Merge branch 'MDL-76355-401' of https://github.com/marinaglancy/moodle into MOODLE_401_STABLE 2022-11-29 17:30:02 +08:00
Angelia Dela Cruz 5384f872bb MDL-75960 behat: Survey behat generators use UI
Replace steps that manually add Survey instances via the UI and use
Behat generators. This improves the speed of the Behat test runs.
2022-11-29 17:06:42 +08:00
Paul Holden eb3ee12852 MDL-75381 gradereport_grader: ensure valid paging preference value.
Set type of the report paging setting to integer, to ensure usage
of it is predictable. Unsupported operated type errors were thrown
on PHP8.0 when it's value contained a string or was empty.
2022-11-29 08:42:02 +00:00
Daniel Ziegenberg dded69ad15 MDL-74823 lib: HTMLPurifier upgrade to 4.16.0
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2022-11-29 16:39:48 +08:00
Daniel Ziegenberg 2cfaa895aa MDL-74823 lib: normalize line endings for HTMLPurifier
Prior to this change, all the line endings in the imported HTMLPurifier
library were using CRLF (\r\n aka Windows style), but the HTMLPurifier
source and also the downloadable artefacts use LF (\n aka Linux style)
as line endings. This has been the case since
510d190382 when with the commit
"MDL-38672 import HTML Purifier 4.5.0" all line endings were changed
from LF to CRLF. There was no comment in the commit on why this change
was done.

As the original source uses LF, this commit partly reverts
510d190382 and goes back to LF as line
endings.

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2022-11-29 16:39:35 +08:00
Daniel Ziegenberg 60e176b50d MDL-74823 lib: HTMLPurifier upgrade to 4.14.0
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2022-11-29 16:39:22 +08:00
Paul Holden 530e06da6d MDL-75789 restore: multi-byte safe substring calculating course names.
Co-authored-by: Leon Stringer <leon.stringer@ntlworld.com>
2022-11-29 08:36:00 +00:00
info@eWallah.net 4d9c6785ff MDL-65939 phpunit: Maildigest tests can query a wrong adhoc task 2022-11-29 15:41:31 +08:00
Simey Lameze 1b8456dbb1 MDL-76058 behat: send message using data generator 2022-11-29 15:37:15 +08:00
Andrew Nicols 3e26150eae Merge branch 'MDL-76088-401' of https://github.com/marinaglancy/moodle into MOODLE_401_STABLE 2022-11-29 15:09:46 +08:00
Pablo Amaya 5cf31d7445 MDL-74454 mod_scorm: Fixed problems in lateral navigation.
Fixed problems in lateral navigation and grading when
a SCORM has more than three levels

The SCORM module has problems with full screen display,
completion tracking and grading in SCORM.

Also resolves issues MDL-74992, MDL-73249, MDL-75407
2022-11-29 14:18:30 +08:00
Andrew Nicols 62238568a2 MDL-76258 mod_lti: Codign style fixes 2022-11-29 12:28:46 +08:00
Stefan Hanauska 6e9e2be8f4 MDL-76258 mod_lti: Reset clientid after restore 2022-11-29 12:28:46 +08:00
Andrew Nicols 34f8f82288 MDL-69570 assignfeedback_editpdf: Whitespace fix 2022-11-29 11:50:41 +08:00
Adrian Greeve ac8b7e9f0a MDL-69570 assignfeedback_editpdf: Upgrade step to remove files.
This upgrade step removes all orphaned editpdf feedback files and
records.
2022-11-29 11:50:41 +08:00
Adrian Greeve b50c240ab5 MDL-69570 assignfeedback_editpdf: Remove temp pdf files
This adds a new method to the assignfeedback edit pdf library
to specify user data file areas that will return just the meaningful
annotated feedback pdf.

get_file_areas has been updated for this plugin to return all
file areas related to assignfeedback_editpdf, and should stop
producing orphaned files and records when a course reset is done.

Thanks to @toniginard who provided a base solution for me to work
off.
2022-11-29 11:50:41 +08:00
Jonathan Champ 189c4ce4de MDL-76506 core\lock: Fix MDL_PERF and perfdebug checks 2022-11-28 18:54:13 -05:00
Paul Holden e3840909f5 MDL-76380 tool_oauth2: remove double persistent load on update.
The method already loaded the validated persistent model data on the
previous line, there's no need to do it again (while also trying to
load unvalidated properties).
2022-11-28 19:38:52 +00:00
Paul Holden 523b590711 MDL-76250 mod_assign: disable form change checker for grading options.
This was previously fixed in 8e9efe60, but seems to have regressed
somewhere along the way.
2022-11-28 16:07:29 +00:00
Paul Holden b391ed9941 MDL-76226 admin: account for preset config checkboxes other than bool.
The assumption that the settings checkbox always stores boolean values
(e.g. 0/1) isn't correct. The `perfdebug` configuration instead uses
the values 7/15.
2022-11-28 16:04:43 +00:00
Marina Glancy a5f92c041e MDL-74853 various: add second parameter to htmlentities functions
Default value of the $flag argument changed in PHP 8.1 from ENT_COMPAT to ENT_QUOTES | ENT_SUBSTITUTE
To ensure consistent behavior across different PHP version the second parameter is now required for the functions:
htmlspecialchars(), htmlentities(), htmlspecialchars_decode(), html_entity_decode() and get_html_translation_table()
2022-11-28 16:12:32 +01:00
Marina Glancy cfe0945ffb MDL-76495 libs: patch TCPDF for PHP 8.1 compatibility 2022-11-28 16:02:03 +01:00
Marina Glancy 6989097a3c MDL-76495 lib: test for qrcode in TCPDF 2022-11-28 16:02:03 +01:00
Marina Glancy 847f08dcd4 MDL-76494 libs: patch Box::Spout for PHP 8.1 compatibility 2022-11-28 15:56:54 +01:00
Marina Glancy 02430ee562 MDL-76494 core_reportbuilder: behat test for downloading report 2022-11-28 15:56:54 +01:00
Marina Glancy a8e90aaae1 MDL-76494 dataformat: tests for Excel and ODS writers 2022-11-28 15:56:53 +01:00
Paul Holden fac0c27efb MDL-76284 webservice: early exit if no users for missing capabilities. 2022-11-28 11:53:23 +00:00
Marina Glancy a7e7cd71cb MDL-76355 lib: apply a patch to googleapi for php 8.1 compatibility 2022-11-28 12:01:05 +01:00
Marina Glancy 37be6bfa4d MDL-76088 blocks: fixed incorrect use of static cache 2022-11-28 11:59:46 +01:00
Marina Glancy d311cab0c0 MDL-76493 core: make sure format_string(null) works on PHP 8.1 2022-11-28 11:55:50 +01:00
Meirza fb5a3dd643 MDL-75826 profile: Redirect to profile page if returnto is profile. 2022-11-28 16:39:11 +07:00
1027 changed files with 38655 additions and 35036 deletions
+1
View File
@@ -87,6 +87,7 @@
'no-octal-escape': 'error',
'no-proto': 'error',
'no-redeclare': 'warn',
'no-restricted-globals': ['error', { 'name': 'Notification' }],
'no-return-assign': 'error',
'no-script-url': 'error',
'no-self-assign': 'error',
+1 -1
View File
@@ -54,5 +54,5 @@ moodle-plugin-ci.phar
/admin/tool/componentlibrary/docs
/admin/tool/componentlibrary/hugo/site/data/my-index.json
.hugo_build.lock
.phpcs.xml
phpcs.xml
jsconfig.json
+2 -2
View File
@@ -39,7 +39,7 @@ module.exports = grunt => {
{
rule: {
_attrs: {
ref: './.phpcs.xml.dist',
ref: './phpcs.xml.dist',
},
},
},
@@ -52,7 +52,7 @@ module.exports = grunt => {
});
});
grunt.file.write('.phpcs.xml', toXML(config, {
grunt.file.write('phpcs.xml', toXML(config, {
header: true,
indent: ' ',
}) + "\n");
+2
View File
@@ -3371,6 +3371,7 @@
<VENDOR name="oracle" version="11.2" />
</DATABASE>
<PHP version="7.3.0" level="required">
<RESTRICT function="restrict_php_version_81" message="unsupportedphpversion81" />
</PHP>
<PCREUNICODE level="optional">
<FEEDBACK>
@@ -3557,6 +3558,7 @@
<VENDOR name="oracle" version="11.2" />
</DATABASE>
<PHP version="7.3.0" level="required">
<RESTRICT function="restrict_php_version_81" message="unsupportedphpversion81" />
</PHP>
<PCREUNICODE level="optional">
<FEEDBACK>
+18 -3
View File
@@ -46,11 +46,23 @@
$formcontinue = new single_button(new moodle_url('index.php', array('confirm' => md5($mnet->public_key))), get_string('yes'));
$formcancel = new single_button(new moodle_url('index.php', array()), get_string('no'));
echo $OUTPUT->header();
echo $OUTPUT->confirm(get_string("deletekeycheck", "mnet"), $formcontinue, $formcancel);
echo $OUTPUT->footer();
exit;
} else {
// We're deleting
// If no/cancel then redirect back to the network setting page.
if (!isset($form->confirm)) {
redirect(
new moodle_url('/admin/mnet/index.php'),
get_string('keydeletedcancelled', 'mnet'),
null,
\core\output\notification::NOTIFY_SUCCESS
);
}
if (!isset($SESSION->mnet_confirm_delete_key)) {
// fail - you're being attacked?
@@ -63,8 +75,12 @@
if($time < time() - 60) {
// fail - you're out of time.
throw new \moodle_exception ('deleteoutoftime', 'mnet', 'index.php');
exit;
redirect(
new moodle_url('/admin/mnet/index.php'),
get_string('deleteoutoftime', 'mnet'),
null,
\core\output\notification::NOTIFY_WARNING
);
}
if ($key != md5(sha1($mnet->keypair['keypair_PEM']))) {
@@ -75,7 +91,6 @@
$mnet->replace_keys();
redirect('index.php', get_string('keydeleted','mnet'));
exit;
}
}
$hosts = $DB->get_records_select('mnet_host', "id <> ? AND deleted = 0", array($CFG->mnet_localhost_id), 'wwwroot ASC');
@@ -16,6 +16,8 @@
namespace core_adminpresets\local\setting;
use admin_setting_configcheckbox;
/**
* Checkbox setting.
*
@@ -26,15 +28,15 @@ namespace core_adminpresets\local\setting;
*/
class adminpresets_admin_setting_configcheckbox extends adminpresets_setting {
protected function set_value($value) {
$this->value = clean_param($value, PARAM_BOOL);
$this->set_visiblevalue();
return true;
}
/**
* Sets the visible name for the setting selected value
*/
protected function set_visiblevalue() {
if ($this->value) {
/** @var admin_setting_configcheckbox $settingdata */
$settingdata = $this->get_settingdata();
// We need to compare the "yes" value of the inner checkbox, which isn't necessarily boolean.
if ($this->value == $settingdata->yes) {
$str = get_string('yes');
} else {
$str = get_string('no');
@@ -533,7 +533,7 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
protected function get_description_field($id) {
return '<textarea class="form-textarea form-control" id="'. s($id) .'" name="description" rows="10" cols="50">' .
htmlspecialchars($this->role->description) .
htmlspecialchars($this->role->description, ENT_COMPAT) .
'</textarea>';
}
+1 -1
View File
@@ -187,7 +187,7 @@ class provider_test extends provider_testcase {
$writer = writer::with_context($context);
$this->assertTrue($writer->has_any_data());
if ($context->contextlevel == CONTEXT_MODULE) {
if ($data = $writer->get_data($subcontextstudent)) {
if ($data = (array)$writer->get_data($subcontextstudent)) {
$this->assertEquals($user->id, reset($data)->userid);
}
if ($data = (array)$writer->get_data($subcontextrc)) {
+1 -1
View File
@@ -101,7 +101,7 @@ if ($hassiteconfig) {
new lang_string('limitconcurrentlogins', 'core_auth'),
new lang_string('limitconcurrentlogins_desc', 'core_auth'), 0, $options));
$temp->add(new admin_setting_configtext('alternateloginurl', new lang_string('alternateloginurl', 'auth'),
new lang_string('alternatelogin', 'auth', htmlspecialchars(get_login_url())), ''));
new lang_string('alternatelogin', 'auth', htmlspecialchars(get_login_url(), ENT_COMPAT)), ''));
$temp->add(new admin_setting_configtext('forgottenpasswordurl', new lang_string('forgottenpasswordurl', 'auth'),
new lang_string('forgottenpassword', 'auth'), '', PARAM_URL));
$temp->add(new admin_setting_confightmleditor('auth_instructions', new lang_string('instructions', 'auth'),
@@ -51,12 +51,12 @@
<div class="form-password">
<span data-passwordunmask="wrapper" data-passwordunmaskid="{{ id }}">
<span data-passwordunmask="editor">
<input type="hidden"
<input type="password"
name="{{ name }}"
id="{{ id }}"
value="{{ value }}"
data-size="{{ size }}"
class="form-control d-inline-block"
class="form-control d-none"
>
</span>
<a href="#" data-passwordunmask="edit" title="{{ edithint }}">
+3 -3
View File
@@ -18,7 +18,7 @@ Feature: An administrator can browse user accounts
When I navigate to "Users > Accounts > Browse list of users" in site administration
# Name field always present, email field is default for showidentity.
Then the following should exist in the "users" table:
| First name / Surname | Email address |
| First name / Last name | Email address |
| User One | one@example.com |
| User Two | two@example.com |
# Should not see other identity fields or non-default name fields.
@@ -34,7 +34,7 @@ Feature: An administrator can browse user accounts
| alternativefullnameformat | firstnamephonetic lastname |
When I navigate to "Users > Accounts > Browse list of users" in site administration
Then the following should exist in the "users" table:
| First name - phonetic / Surname | Email address |
| First name - phonetic / Last name | Email address |
| Yewzer One | one@example.com |
| Yoozare Two | two@example.com |
@@ -43,7 +43,7 @@ Feature: An administrator can browse user accounts
| showuseridentity | department,profile_field_frog |
When I navigate to "Users > Accounts > Browse list of users" in site administration
Then the following should exist in the "users" table:
| First name / Surname | Favourite frog | Department |
| First name / Last name | Favourite frog | Department |
| User One | Kermit | Attack |
| User Two | Tree | Defence |
And I should not see "Email address" in the "table" "css_element"
@@ -15,7 +15,7 @@ Feature: Allowing multiple accounts to have the same email address
And I set the following fields to these values:
| Username | s2 |
| First name | Jane |
| Surname | Doe |
| Last name | Doe |
| Email address | <email> |
| New password | test |
And I press "Create user"
@@ -8,7 +8,7 @@ Feature: An administrator can configure the available user list filters
When I log in as "admin"
And I navigate to "Users > Accounts > Browse list of users" in site administration
Then I should see "User full name"
And I should not see "Surname" in the "New filter" "fieldset"
And I should not see "Last name" in the "New filter" "fieldset"
And I should not see "Firstname" in the "New filter" "fieldset"
And I should not see "Username" in the "New filter" "fieldset"
And I should not see "Email address" in the "New filter" "fieldset"
@@ -30,7 +30,7 @@ Feature: An administrator can configure the available user list filters
And I should not see "MNet ID provider" in the "New filter" "fieldset"
And I navigate to "Users > Accounts > Bulk user actions" in site administration
Then I should see "User full name"
And I should not see "Surname" in the "New filter" "fieldset"
And I should not see "Last name" in the "New filter" "fieldset"
And I should not see "Firstname" in the "New filter" "fieldset"
And I should not see "Username" in the "New filter" "fieldset"
And I should not see "Email address" in the "New filter" "fieldset"
@@ -57,7 +57,7 @@ Feature: An administrator can configure the available user list filters
And I log in as "admin"
And I navigate to "Users > Accounts > Browse list of users" in site administration
Then I should see "User full name"
And I should not see "Surname" in the "New filter" "fieldset"
And I should not see "Last name" in the "New filter" "fieldset"
And I should not see "Firstname" in the "New filter" "fieldset"
And I should see "Username" in the "New filter" "fieldset"
And I should see "Email address" in the "New filter" "fieldset"
@@ -79,7 +79,7 @@ Feature: An administrator can configure the available user list filters
And I should not see "MNet ID provider" in the "New filter" "fieldset"
And I navigate to "Users > Accounts > Bulk user actions" in site administration
Then I should see "User full name"
And I should not see "Surname" in the "New filter" "fieldset"
And I should not see "Last name" in the "New filter" "fieldset"
And I should not see "Firstname" in the "New filter" "fieldset"
And I should see "Username" in the "New filter" "fieldset"
And I should see "Email address" in the "New filter" "fieldset"
@@ -106,7 +106,7 @@ Feature: An administrator can configure the available user list filters
And I log in as "admin"
And I navigate to "Users > Accounts > Browse list of users" in site administration
Then I should see "User full name"
And I should not see "Surname" in the "New filter" "fieldset"
And I should not see "Last name" in the "New filter" "fieldset"
And I should not see "Firstname" in the "New filter" "fieldset"
And I should not see "Username" in the "New filter" "fieldset"
And I should not see "Email address" in the "New filter" "fieldset"
@@ -128,7 +128,7 @@ Feature: An administrator can configure the available user list filters
And I should not see "MNet ID provider" in the "New filter" "fieldset"
And I navigate to "Users > Accounts > Bulk user actions" in site administration
Then I should see "User full name"
And I should not see "Surname" in the "New filter" "fieldset"
And I should not see "Last name" in the "New filter" "fieldset"
And I should not see "Firstname" in the "New filter" "fieldset"
And I should not see "Username" in the "New filter" "fieldset"
And I should not see "Email address" in the "New filter" "fieldset"
+11
View File
@@ -0,0 +1,11 @@
define("tool_behat/steps",["exports","core/ajax","core/templates","core/pending"],(function(_exports,_ajax,_templates,_pending){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}
/**
* Enhancements for the step definitions page.
*
* @module tool_behat/steps
* @copyright 2022 Catalyst IT EU
* @author Mark Johnson <mark.johnson@catalyst-eu.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_ajax=_interopRequireDefault(_ajax),_templates=_interopRequireDefault(_templates),_pending=_interopRequireDefault(_pending);_exports.init=()=>{document.addEventListener("change",(async e=>{const entityElement=e.target.closest(".entities"),stepElement=e.target.closest(".stepcontent");if(!entityElement||!stepElement)return;const pendingPromise=new _pending.default("tool_behat/steps:change"),entityData=await(entityType=e.target.value,_ajax.default.call([{methodname:"tool_behat_get_entity_generator",args:{entitytype:entityType}}])[0]);var entityType;const{html:html,js:js}=await(entityData=>{var _entityData$required;return null!==(_entityData$required=entityData.required)&&void 0!==_entityData$required&&_entityData$required.length?_templates.default.renderForPromise("tool_behat/steprequiredfields",{fields:entityData.required}):Promise.resolve({html:"",js:""})})(entityData),stepRequiredFields=stepElement.querySelector(".steprequiredfields");stepRequiredFields?await _templates.default.replaceNode(stepRequiredFields,html,js):await _templates.default.appendNodeContents(stepElement,html,js),pendingPromise.resolve()}))}}));
//# sourceMappingURL=steps.min.js.map
@@ -0,0 +1 @@
{"version":3,"file":"steps.min.js","sources":["../src/steps.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\nimport Ajax from 'core/ajax';\nimport Templates from 'core/templates';\nimport PendingJS from 'core/pending';\n\n/**\n * Enhancements for the step definitions page.\n *\n * @module tool_behat/steps\n * @copyright 2022 Catalyst IT EU\n * @author Mark Johnson <mark.johnson@catalyst-eu.net>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * Call the get_entity_generator web service function\n *\n * Takes the name of an entity generator and returns an object containing a list of the required fields.\n *\n * @param {String} entityType\n * @returns {Promise}\n */\nconst getGeneratorEntities = (entityType) => Ajax.call([{\n methodname: 'tool_behat_get_entity_generator',\n args: {entitytype: entityType}\n}])[0];\n\n/**\n * Render HTML for required fields\n *\n * Takes the entity data returned from getGeneratorEntities and renders the HTML to display the required fields.\n *\n * @param {String} entityData\n * @return {Promise}\n */\nconst getRequiredFieldsContent = (entityData) => {\n if (!entityData.required?.length) {\n return Promise.resolve({\n html: '',\n js: ''\n });\n }\n return Templates.renderForPromise('tool_behat/steprequiredfields', {fields: entityData.required});\n};\n\nexport const init = () => {\n // When an entity is selected in the \"the following exist\" step, fetch and display the required fields.\n document.addEventListener('change', async(e) => {\n const entityElement = e.target.closest('.entities');\n const stepElement = e.target.closest('.stepcontent');\n if (!entityElement || !stepElement) {\n return;\n }\n\n const pendingPromise = new PendingJS('tool_behat/steps:change');\n\n const entityData = await getGeneratorEntities(e.target.value);\n const {html, js} = await getRequiredFieldsContent(entityData);\n\n const stepRequiredFields = stepElement.querySelector('.steprequiredfields');\n if (stepRequiredFields) {\n await Templates.replaceNode(stepRequiredFields, html, js);\n } else {\n await Templates.appendNodeContents(stepElement, html, js);\n }\n pendingPromise.resolve();\n });\n};\n"],"names":["document","addEventListener","async","entityElement","e","target","closest","stepElement","pendingPromise","PendingJS","entityData","entityType","value","Ajax","call","methodname","args","entitytype","html","js","required","_entityData$required","length","Templates","renderForPromise","fields","Promise","resolve","getRequiredFieldsContent","stepRequiredFields","querySelector","replaceNode","appendNodeContents"],"mappings":";;;;;;;;4NA2DoB,KAEhBA,SAASC,iBAAiB,UAAUC,MAAAA,UAC1BC,cAAgBC,EAAEC,OAAOC,QAAQ,aACjCC,YAAcH,EAAEC,OAAOC,QAAQ,oBAChCH,gBAAkBI,yBAIjBC,eAAiB,IAAIC,iBAAU,2BAE/BC,iBAlCgBC,WAkCwBP,EAAEC,OAAOO,MAlClBC,cAAKC,KAAK,CAAC,CACpDC,WAAY,kCACZC,KAAM,CAACC,WAAYN,eACnB,IAH0BA,IAAAA,iBAmChBO,KAACA,KAADC,GAAOA,SAtBaT,CAAAA,0EACzBA,WAAWU,0CAAXC,qBAAqBC,OAMnBC,mBAAUC,iBAAiB,gCAAiC,CAACC,OAAQf,WAAWU,WAL5EM,QAAQC,QAAQ,CACnBT,KAAM,GACNC,GAAI,MAkBiBS,CAAyBlB,YAE5CmB,mBAAqBtB,YAAYuB,cAAc,uBACjDD,yBACMN,mBAAUQ,YAAYF,mBAAoBX,KAAMC,UAEhDI,mBAAUS,mBAAmBzB,YAAaW,KAAMC,IAE1DX,eAAemB"}
+82
View File
@@ -0,0 +1,82 @@
// 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/>.
import Ajax from 'core/ajax';
import Templates from 'core/templates';
import PendingJS from 'core/pending';
/**
* Enhancements for the step definitions page.
*
* @module tool_behat/steps
* @copyright 2022 Catalyst IT EU
* @author Mark Johnson <mark.johnson@catalyst-eu.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* Call the get_entity_generator web service function
*
* Takes the name of an entity generator and returns an object containing a list of the required fields.
*
* @param {String} entityType
* @returns {Promise}
*/
const getGeneratorEntities = (entityType) => Ajax.call([{
methodname: 'tool_behat_get_entity_generator',
args: {entitytype: entityType}
}])[0];
/**
* Render HTML for required fields
*
* Takes the entity data returned from getGeneratorEntities and renders the HTML to display the required fields.
*
* @param {String} entityData
* @return {Promise}
*/
const getRequiredFieldsContent = (entityData) => {
if (!entityData.required?.length) {
return Promise.resolve({
html: '',
js: ''
});
}
return Templates.renderForPromise('tool_behat/steprequiredfields', {fields: entityData.required});
};
export const init = () => {
// When an entity is selected in the "the following exist" step, fetch and display the required fields.
document.addEventListener('change', async(e) => {
const entityElement = e.target.closest('.entities');
const stepElement = e.target.closest('.stepcontent');
if (!entityElement || !stepElement) {
return;
}
const pendingPromise = new PendingJS('tool_behat/steps:change');
const entityData = await getGeneratorEntities(e.target.value);
const {html, js} = await getRequiredFieldsContent(entityData);
const stepRequiredFields = stepElement.querySelector('.steprequiredfields');
if (stepRequiredFields) {
await Templates.replaceNode(stepRequiredFields, html, js);
} else {
await Templates.appendNodeContents(stepElement, html, js);
}
pendingPromise.resolve();
});
};
@@ -0,0 +1,92 @@
<?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/>.
/**
* Return data about an entity generator.
*
* @package tool_behat
* @copyright 2022 onwards Catalyst IT EU {@link https://catalyst-eu.net}
* @author Mark Johnson <mark.johnson@catalyst-eu.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_behat\external;
defined('MOODLE_INTERNAL') || die();
require_once($CFG->libdir . '/externallib.php');
/**
* External function for getting properties of entity generators.
*/
class get_entity_generator extends \external_api {
/**
* Define parameters for external function.
*
* The parameter is either in the format 'entity' or 'component_name > entity'. There is no appropriate param type for a
* string like this containing angle brackets, so we will do PARAM_RAW. The value will be parsed by
* behat_data_generators::parse_entity_type, which validates the format of the parameter and throws an exception if it is not
* correct.
*
* @return \external_function_parameters
*/
public static function execute_parameters(): \external_function_parameters {
return new \external_function_parameters([
'entitytype' => new \external_value(PARAM_RAW, 'Entity type that can be created by a generator.'),
]);
}
/**
* Return a list of the required fields for a given entity type.
*
* @param string $entitytype
* @return array
*/
public static function execute(string $entitytype): array {
global $CFG;
// Ensure we can load Behat and Facebook namespaces in behat libraries.
require_once("{$CFG->dirroot}/vendor/autoload.php");
require_once("{$CFG->libdir}/tests/behat/behat_data_generators.php");
$params = self::validate_parameters(self::execute_parameters(), ['entitytype' => $entitytype]);
$context = \context_system::instance();
self::validate_context($context);
require_capability('moodle/site:config', $context);
$generators = new \behat_data_generators();
$entity = $generators->get_entity($params['entitytype']);
return ['required' => $entity['required']];
}
/**
* Define return values.
*
* Return required fields
*
* @return \external_single_structure
*/
public static function execute_returns(): \external_single_structure {
return new \external_single_structure([
'required' => new \external_multiple_structure(
new \external_value(PARAM_TEXT, 'Required field'),
'Required fields',
VALUE_OPTIONAL
),
]);
}
}
+1 -1
View File
@@ -278,7 +278,7 @@ if (empty($parallelrun)) {
// Print combined run o/p from processes.
$exitcodes = print_combined_run_output($processes, $stoponfail);
// Time to finish run.
$time = round(microtime(true) - $time, 1);
$time = round(microtime(true) - $time, 0);
echo "Finished in " . gmdate("G\h i\m s\s", $time) . PHP_EOL . PHP_EOL;
ksort($exitcodes);
+37
View File
@@ -0,0 +1,37 @@
<?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/>.
/**
* Define web service functions for tool_behat
*
* @package tool_behat
* @copyright 2022 onwards Catalyst IT EU {@link https://catalyst-eu.net}
* @author Mark Johnson <mark.johnson@catalyst-eu.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
$functions = [
'tool_behat_get_entity_generator' => [
'classname' => 'tool_behat\\external\\get_entity_generator',
'methodname' => 'execute',
'description' => 'Get the generator details for an entity',
'type' => 'read',
'ajax' => true,
'capabilities' => 'moodle/site:config'
]
];
+1
View File
@@ -56,6 +56,7 @@ if ($components) {
$form = new steps_definitions_form(null, array('components' => $componentswithsteps));
// Output contents.
$PAGE->requires->js_call_amd('tool_behat/steps', 'init');
$renderer = $PAGE->get_renderer('tool_behat');
echo $renderer->render_stepsdefinitions($steps, $form);
+28
View File
@@ -24,6 +24,8 @@
defined('MOODLE_INTERNAL') || die();
require_once($CFG->libdir . '/behat/classes/behat_generator_base.php');
/**
* Renderer for behat tool web features
*
@@ -106,6 +108,32 @@ class tool_behat_renderer extends plugin_renderer_base {
},
$stepsdefinitions
);
$elementstrings = [];
$count = 1;
$stepsdefinitions = preg_replace_callback('/(the following ")ELEMENT\d?_STRING(" exist:)/',
function($matches) use (&$elementstrings, &$count) {
// Replace element type arguments with a user-friendly select.
if (empty($elementstrings)) {
$behatgenerators = new behat_data_generators();
$componententities = $behatgenerators->get_all_entities();
ksort($componententities);
$elementstrings = [];
foreach ($componententities as $component => $entities) {
asort($entities);
foreach ($entities as $entity) {
$string = ($component === 'core') ? $entity : $component . ' > ' . $entity;
$elementstrings[$string] = $string;
}
}
}
$select = html_writer::select($elementstrings, 'entities' . $count, '', ['' => 'choosedots'],
['class' => 'entities']);
$count++;
return $matches[1] . $select . $matches[2];
},
$stepsdefinitions
);
}
// Steps definitions.
+6
View File
@@ -29,3 +29,9 @@
#page-admin-tool-behat-index .steps-definitions .stepregex {
color: #060;
}
#page-admin-tool-behat-index .steprequiredfields {
font-weight: bold;
font-size: 1em;
margin-top: 1em;
}
@@ -0,0 +1,33 @@
{{!
This file is part of Moodle - https://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/>.
}}
{{!
@template tool_behat/steprequiredfields
Display a Gherkin-style table row showing required columns for a step.
Example context (json):
{
"fields": [
"user",
"role",
"context"
]
}
}}
<pre class="steprequiredfields">
|{{#fields}} {{{.}}} |{{/fields}}
</pre>
@@ -13,6 +13,10 @@ Feature: List the system steps definitions
Scenario: Accessing the list
Then I should see "Step definitions"
And I should not see "There aren't steps definitions matching this filter"
And I should not see "the following \"ELEMENT_STRING\" exist:"
And "entities1" "select" should exist
And the "entities1" select box should contain "users"
And the "entities1" select box should contain "mod_assign > submissions"
@javascript
Scenario: Filtering by type
@@ -34,3 +38,11 @@ Feature: List the system steps definitions
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."
@javascript
Scenario: Get required fields
Given I set the field "entities1" to "users"
And I should see "| username |"
When I set the field "entities1" to "mod_quiz > user overrides"
Then I should not see "| username |"
And I should see "| quiz | user |"
@@ -13,24 +13,24 @@ Feature: Transform steps arguments
And I open my profile in edit mode
Scenario: Use nasty strings on steps arguments
When I set the field "Surname" to "$NASTYSTRING1"
When I set the field "Last name" to "$NASTYSTRING1"
And I set the field "Description" to "$NASTYSTRING2"
And I set the field "City/town" to "$NASTYSTRING3"
And I press "Update profile"
And I click on "Edit profile" "link" in the "region-main" "region"
Then I should not see "NASTYSTRING"
And the field "Surname" matches value "$NASTYSTRING1"
And the field "Last name" matches value "$NASTYSTRING1"
And the field "City/town" matches value "$NASTYSTRING3"
Scenario: Use nasty strings on table nodes
When I set the following fields to these values:
| Surname | $NASTYSTRING1 |
| Last name | $NASTYSTRING1 |
| Description | $NASTYSTRING2 |
| City/town | $NASTYSTRING3 |
And I press "Update profile"
And I click on "Edit profile" "link" in the "region-main" "region"
Then I should not see "NASTYSTRING"
And the field "Surname" matches value "$NASTYSTRING1"
And the field "Last name" matches value "$NASTYSTRING1"
And the field "City/town" matches value "$NASTYSTRING3"
Scenario: Use double quotes
@@ -48,11 +48,11 @@ Feature: Transform steps arguments
Scenario: Nasty strings with other contents
When I set the field "First name" to "My Firstname $NASTYSTRING1"
And I set the following fields to these values:
| Surname | My Surname $NASTYSTRING2 |
| Last name | My Last name $NASTYSTRING2 |
And I press "Update profile"
And I click on "Edit profile" "link" in the "region-main" "region"
Then I should not see "NASTYSTRING"
And I should see "My Firstname"
And I should see "My Surname"
And I should see "My Last name"
And the field "First name" matches value "My Firstname $NASTYSTRING1"
And the field "Surname" matches value "My Surname $NASTYSTRING2"
And the field "Last name" matches value "My Last name $NASTYSTRING2"
@@ -0,0 +1,104 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Unit tests for get_entity_generator web service
*
* @package tool_behat
* @copyright 2022 onwards Catalyst IT EU {@link https://catalyst-eu.net}
* @author Mark Johnson <mark.johnson@catalyst-eu.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_behat\external;
/**
* Tests for get_entity_generator web service
*
* @covers \tool_behat\external\get_entity_generator
*/
class get_entity_generator_test extends \advanced_testcase {
/**
* Log in as admin
*
* @return void
*/
public function setUp(): void {
$this->resetAfterTest();
$this->setAdminUser();
}
/**
* Get the generator for a core entity.
*
* @return void
*/
public function test_execute_core_entity(): void {
$generator = get_entity_generator::execute('users');
$this->assertEquals(['required' => ['username']], $generator);
}
/**
* Get the generator for the plugin entity.
*
* @return void
*/
public function test_execute_plugin_entity(): void {
$generator = get_entity_generator::execute('mod_book > chapters');
$this->assertEquals(['required' => ['book', 'title', 'content']], $generator);
}
/**
* Get the generator for an entity with no required fields.
*
* @return void
*/
public function test_execute_no_requried(): void {
$generator = get_entity_generator::execute('mod_forum > posts');
$this->assertEquals(['required' => []], $generator);
}
/**
* Attempt to get the generator for a core entity that does not exist.
*
* @return void
*/
public function test_execute_invalid_entity(): void {
$this->expectException('coding_exception');
get_entity_generator::execute('foo');
}
/**
* Attempt to get a generator form a plugin that does not exist.
*
* @return void
*/
public function test_execute_invalid_plugin(): void {
$this->expectException('coding_exception');
get_entity_generator::execute('foo > bar');
}
/**
* Attempt to get a generator for an entity that does not exist, from a plugin that does.
*
* @return void
*/
public function test_execute_invalid_plugin_entity(): void {
$this->expectException('coding_exception');
get_entity_generator::execute('mod_book > bar');
}
}
+1 -1
View File
@@ -24,6 +24,6 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2022112800; // The current plugin version (Date: YYYYMMDDXX).
$plugin->version = 2022112801; // The current plugin version (Date: YYYYMMDDXX).
$plugin->requires = 2022111800; // Requires this Moodle version.
$plugin->component = 'tool_behat'; // Full name of the plugin (used for diagnostics)
@@ -388,13 +388,13 @@ class accessibility {
// Confirm if error is reported separately.
if ($DB->record_exists_select(manager::DB_ERRORS,
'resultid = ? AND ' . $DB->sql_compare_text('htmlcode', 255) . ' = ' . $DB->sql_compare_text('?', 255),
[$resultid, html_entity_decode($tmp->html)])) {
[$resultid, html_entity_decode($tmp->html, ENT_COMPAT)])) {
continue;
}
$error = new stdClass();
$error->resultid = $resultid;
$error->linenumber = $tmp->line;
$error->htmlcode = html_entity_decode($tmp->html);
$error->htmlcode = html_entity_decode($tmp->html, ENT_COMPAT);
$errors[] = $error;
}
@@ -43,7 +43,7 @@ class report_array extends brickfield_accessibility_reporter {
$output[$testname]['body'] = $translation['description'];
foreach ($test as $k => $problem) {
if (is_object($problem)) {
$output[$testname]['problems'][$k]['element'] = htmlentities($problem->get_html());
$output[$testname]['problems'][$k]['element'] = htmlentities($problem->get_html(), ENT_COMPAT);
$output[$testname]['problems'][$k]['line'] = $problem->get_line();
if ($problem->message) {
$output[$testname]['problems']['message'] = $problem->message;
@@ -67,7 +67,7 @@ class report_codehighlight extends \tool_brickfield\local\htmlchecker\brickfield
}
}
$this->dom->formatOutput = true;
$html = htmlspecialchars($this->dom->saveHTML());
$html = htmlspecialchars($this->dom->saveHTML(), ENT_COMPAT);
$html = str_replace('&quot;', '"', $html);
foreach ($this->classnames as $name) {
$html = preg_replace('/&lt;'. $name .'([^&]+)+\&gt;/', '<span \\1>', $html);
@@ -49,7 +49,7 @@ class report_xml extends brickfield_accessibility_reporter {
$output .= "\n\t<htmlchecker:problems>";
foreach ($test as $problem) {
if (is_object($problem)) {
$output .= "\n\t<htmlchecker:entities><![CDATA[" . htmlentities($problem->get_html()) .
$output .= "\n\t<htmlchecker:entities><![CDATA[" . htmlentities($problem->get_html(), ENT_COMPAT) .
"]]></htmlchecker:entities>";
$output .= "\n\t<htmlchecker:line>". $problem->get_line() ."</htmlchecker:line>";
if ($problem->message) {
@@ -180,7 +180,7 @@ class renderer extends \tool_brickfield\output\renderer {
];
$data->errordata = !empty($data->errordata) ? $data->errordata : [];
foreach ($data->errordata as $err) {
$err->htmlcode = htmlentities($err->htmlcode);
$err->htmlcode = htmlentities($err->htmlcode, ENT_COMPAT);
$row = [$data->tarlabels[$err->component], $err->shortname, $err->errline, $err->htmlcode];
$table->data[] = $row;
}
+3
View File
@@ -47,5 +47,8 @@ function xmldb_tool_cohortroles_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
@@ -81,6 +81,30 @@ $activity-icon-colors: (
);
{{</ highlight >}}
### Custom activity icons
Some activities allow icons to be customised. This can be done by implementing callback XXX_get_coursemodule_info() returning instance of object e.g. mod/lti/lib.php
{{< php >}}
$info = new cached_cm_info();
$info->iconurl = new moodle_url('https://moodle.org/theme/moodleorg/pix/moodle_logo_small.svg');
{{< /php >}}
To get this customised icon, use:
{{< php >}}
$iconurl = get_fast_modinfo($courseid)->get_cm($cmid)->get_icon_url()->out(false);
{{< /php >}}
<div class="media mb-3">
<div class="activityiconcontainer lti mr-3">
<img alt="lti icon" title="lti icon" src="https://moodle.org/theme/moodleorg/pix/moodle_logo_small.svg" class="activityicon "> </div>
<div class="media-body align-self-center">
<div class="text-uppercase small">external</div>
<div class="activityname"><a href="#">External tool module</a></div>
</div>
</div>
## Examples
<div class="media mb-3">
+3
View File
@@ -35,5 +35,8 @@ function xmldb_tool_customlang_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+1 -1
View File
@@ -5,6 +5,6 @@
* @copyright 2018 Adrian Greeve
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_dataprivacy/expand_contract",["jquery","core/url","core/str"],(function($,url,str){var expandedImage=$('<img alt="" src="'+url.imageUrl("t/expanded")+'"/>'),collapsedImage=$('<img alt="" src="'+url.imageUrl("t/collapsed")+'"/>'),CLASSES_EXPAND="fa-caret-right",CLASSES_COLLAPSE="fa-caret-down";return{expandCollapse:function(targetnode,thisnode){targetnode.hasClass("hide")?(targetnode.removeClass("hide"),targetnode.addClass("visible"),targetnode.attr("aria-expanded",!0),thisnode.find(":header i.fa").removeClass(CLASSES_EXPAND),thisnode.find(":header i.fa").addClass(CLASSES_COLLAPSE),thisnode.find(":header img.icon").attr("src",expandedImage.attr("src"))):(targetnode.removeClass("visible"),targetnode.addClass("hide"),targetnode.attr("aria-expanded",!1),thisnode.find(":header i.fa").removeClass(CLASSES_COLLAPSE),thisnode.find(":header i.fa").addClass(CLASSES_EXPAND),thisnode.find(":header img.icon").attr("src",collapsedImage.attr("src")))},expandCollapseAll:function(nextstate){var currentstate="visible"==nextstate?"hide":"visible",ariaexpandedstate="visible"==nextstate,iconclassnow="visible"==nextstate?CLASSES_EXPAND:CLASSES_COLLAPSE,iconclassnext="visible"==nextstate?CLASSES_COLLAPSE:CLASSES_EXPAND,imagenow="visible"==nextstate?expandedImage.attr("src"):collapsedImage.attr("src");$("."+currentstate).each((function(){$(this).removeClass(currentstate),$(this).addClass(nextstate),$(this).attr("aria-expanded",ariaexpandedstate)})),$(".tool_dataprivacy-expand-all").data("visibilityState",currentstate),str.get_string(currentstate,"tool_dataprivacy").then((function(langString){$(".tool_dataprivacy-expand-all").html(langString)})).catch(Notification.exception),$(":header i.fa").each((function(){$(this).removeClass(iconclassnow),$(this).addClass(iconclassnext)})),$(":header img.icon").each((function(){$(this).attr("src",imagenow)}))}}}));
define("tool_dataprivacy/expand_contract",["jquery","core/url","core/str","core/notification"],(function($,url,str,Notification){var expandedImage=$('<img alt="" src="'+url.imageUrl("t/expanded")+'"/>'),collapsedImage=$('<img alt="" src="'+url.imageUrl("t/collapsed")+'"/>'),CLASSES_EXPAND="fa-caret-right",CLASSES_COLLAPSE="fa-caret-down";return{expandCollapse:function(targetnode,thisnode){targetnode.hasClass("hide")?(targetnode.removeClass("hide"),targetnode.addClass("visible"),targetnode.attr("aria-expanded",!0),thisnode.find(":header i.fa").removeClass(CLASSES_EXPAND),thisnode.find(":header i.fa").addClass(CLASSES_COLLAPSE),thisnode.find(":header img.icon").attr("src",expandedImage.attr("src"))):(targetnode.removeClass("visible"),targetnode.addClass("hide"),targetnode.attr("aria-expanded",!1),thisnode.find(":header i.fa").removeClass(CLASSES_COLLAPSE),thisnode.find(":header i.fa").addClass(CLASSES_EXPAND),thisnode.find(":header img.icon").attr("src",collapsedImage.attr("src")))},expandCollapseAll:function(nextstate){var currentstate="visible"==nextstate?"hide":"visible",ariaexpandedstate="visible"==nextstate,iconclassnow="visible"==nextstate?CLASSES_EXPAND:CLASSES_COLLAPSE,iconclassnext="visible"==nextstate?CLASSES_COLLAPSE:CLASSES_EXPAND,imagenow="visible"==nextstate?expandedImage.attr("src"):collapsedImage.attr("src");$("."+currentstate).each((function(){$(this).removeClass(currentstate),$(this).addClass(nextstate),$(this).attr("aria-expanded",ariaexpandedstate)})),$(".tool_dataprivacy-expand-all").data("visibilityState",currentstate),str.get_string(currentstate,"tool_dataprivacy").then((function(langString){$(".tool_dataprivacy-expand-all").html(langString)})).catch(Notification.exception),$(":header i.fa").each((function(){$(this).removeClass(iconclassnow),$(this).addClass(iconclassnext)})),$(":header img.icon").each((function(){$(this).attr("src",imagenow)}))}}}));
//# sourceMappingURL=expand_contract.min.js.map
File diff suppressed because one or more lines are too long
@@ -21,7 +21,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define(['jquery', 'core/url', 'core/str'], function($, url, str) {
define(['jquery', 'core/url', 'core/str', 'core/notification'], function($, url, str, Notification) {
var expandedImage = $('<img alt="" src="' + url.imageUrl('t/expanded') + '"/>');
var collapsedImage = $('<img alt="" src="' + url.imageUrl('t/collapsed') + '"/>');
+3
View File
@@ -84,5 +84,8 @@ function xmldb_tool_dataprivacy_upgrade($oldversion) {
upgrade_plugin_savepoint(true, 2022053000, 'tool', 'dataprivacy');
}
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+14 -1
View File
@@ -79,6 +79,19 @@ class locale {
* @return string|false Returns the new current locale, or FALSE on error.
*/
protected function set_locale(int $category = LC_ALL, string $locale = '0') {
return setlocale($category, $locale);
if (strlen($locale) <= 255 || PHP_OS_FAMILY === 'BSD' || PHP_OS_FAMILY === 'Darwin') {
// We can set the whole locale all together.
return setlocale($category, $locale);
}
// Too long locale with linux or windows, let's split it into known and supported categories.
$split = explode(';', $locale);
foreach ($split as $element) {
[$category, $value] = explode('=', $element);
if (defined($category)) { // Only if the category exists, there are OS differences.
setlocale(constant($category), $value);
}
}
return setlocale(LC_ALL, 0); // Finally, return the complete configured locale.
}
}
+101 -11
View File
@@ -14,14 +14,6 @@
// 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 \tool_langimport\locale class.
*
* @package tool_langimport
* @copyright 2018 Université Rennes 2 {@link https://www.univ-rennes2.fr}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_langimport;
/**
@@ -29,6 +21,7 @@ namespace tool_langimport;
*
* @package tool_langimport
* @category test
* @coversDefaultClass \tool_langimport\locale
* @copyright 2018 Université Rennes 2 {@link https://www.univ-rennes2.fr}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -36,6 +29,7 @@ class locale_test extends \advanced_testcase {
/**
* Test that \tool_langimport\locale::check_locale_availability() works as expected.
*
* @covers ::check_locale_availability
* @return void
*/
public function test_check_locale_availability() {
@@ -43,7 +37,7 @@ class locale_test extends \advanced_testcase {
// - first setlocale() call which backup current locale
// - second setlocale() call which try to set new 'es' locale
// - third setlocale() call which restore locale.
$mock = $this->getMockBuilder(\tool_langimport\locale::class)
$mock = $this->getMockBuilder(locale::class)
->onlyMethods(['set_locale'])
->getMock();
$mock->method('set_locale')->will($this->onConsecutiveCalls('en', 'es', 'en'));
@@ -56,7 +50,7 @@ class locale_test extends \advanced_testcase {
// - first setlocale() call which backup current locale
// - second setlocale() call which fail to set new locale
// - third setlocale() call which restore locale.
$mock = $this->getMockBuilder(\tool_langimport\locale::class)
$mock = $this->getMockBuilder(locale::class)
->onlyMethods(['set_locale'])
->getMock();
$mock->method('set_locale')->will($this->onConsecutiveCalls('en', false, 'en'));
@@ -66,8 +60,104 @@ class locale_test extends \advanced_testcase {
$this->assertFalse($result);
// Test an invalid parameter.
$locale = new \tool_langimport\locale();
$locale = new locale();
$this->expectException(\coding_exception::class);
$locale->check_locale_availability('');
}
/**
* Test \tool_langimport\locale::set_locale() own logic.
*
* We have to explicitly test set_locale() own logic and results,
* that effectively sets the current locale, so we need to restore
* the original locale after every test (ugly, from a purist unit test
* point of view, but needed).
*
* @dataProvider set_locale_provider
* @covers ::set_locale
*
* @param string $set locale string to be set.
* @param string $ret expected results returned after setting the locale.
*/
public function test_set_locale(string $set, string $ret) {
// Make set_locale() public.
$loc = new locale();
$rc = new \ReflectionClass(locale::class);
$rm = $rc->getMethod('set_locale');
$rm->setAccessible(true);
// Capture current locale for later restore (funnily, using the set_locale() method itself.
$originallocale = $rm->invokeArgs($loc, [LC_ALL, 0]);
// Assert we get the locale defined as expected.
$this->assertEquals($ret, $rm->invokeArgs($loc, [LC_ALL, $set]));
// We have finished, restore the original locale, so this doesn't affect other tests at distance.
// (again, funnily, using the very same set_locale() method).
$rm->invokeArgs($loc, [LC_ALL, $originallocale]);
}
/**
* Data provider for test_set_locale().
*
* Provides a locale to be set (as 'set') and a expected return value (as 'ret'). Note that
* some of the locales are OS dependent, so only the ones matching the OS will be provided.
*
* We make extensive use of the en_AU.UTF-8/English_Australia.1252 locale that is mandatory to
* be installed in any system running PHPUnit tests.
*/
public function set_locale_provider(): array {
// Let's list the allowed categories by OS.
$bsdallowed = ['LC_COLLATE', 'LC_CTYPE', 'LC_MESSAGES', 'LC_MONETARY', 'LC_NUMERIC', 'LC_TIME'];
$winallowed = ['LC_COLLATE', 'LC_CTYPE', 'LC_MONETARY', 'LC_NUMERIC', 'LC_TIME'];
$linuxallowed = [
'LC_COLLATE', 'LC_CTYPE', 'LC_MESSAGES', 'LC_MONETARY', 'LC_NUMERIC', 'LC_TIME',
'LC_PAPER', 'LC_NAME', 'LC_ADDRESS', 'LC_TELEPHONE', 'LC_MEASUREMENT', 'LC_IDENTIFICATION'
];
// The base locale name is also OS dependent.
$baselocale = get_string('locale', 'langconfig');
if (PHP_OS_FAMILY === 'Windows') {
$baselocale = get_string('localewin', 'langconfig');
}
// Here we'll go accumulating cases to be provided.
$cases = [];
// First, the simplest case, just pass a locale name, without categories.
$cases['rawlocale'] = [
'set' => $baselocale,
'ret' => $baselocale,
];
// Now, let's fill ALL LC categories, we should get back the locale name if all them are set with same value.
// Note that this case is the one that, under Linux only, covers the changes performed to the set_locale() method.
// Pick the correct categories depending on the OS.
$oscategories = $bsdallowed; // Default to BSD/Dawrwin ones because they are the standard 6 supported by PHP.
if (PHP_OS_FAMILY === 'Windows') {
$oscategories = $winallowed;
} else if (PHP_OS_FAMILY === 'Linux') {
$oscategories = $linuxallowed;
}
$localestr = '';
foreach ($oscategories as $category) {
// Format is different by OS too, so let build the string conditionally.
if (PHP_OS_FAMILY === 'BSD' || PHP_OS_FAMILY === 'Darwin') {
// BSD uses slashes (/) separated list of the 6 values in exact order.
$localestr .= '/' . $baselocale;
} else {
// Linux/Windows use semicolon (;) separated list of category=value pairs.
$localestr .= ';' . $category . '=' . $baselocale;
}
}
$cases['allcategories'] = [
'set' => trim($localestr, ';/'),
'ret' => $baselocale,
];
// Return all the built cases.
return $cases;
}
}
+1 -1
View File
@@ -57,7 +57,7 @@ trait store {
throw new \coding_exception("Store $called doesn't define classes in correct namespaces.");
}
$this->component = $parts[0];
$this->store = str_replace('logstore_', '', $this->store);
$this->store = str_replace('logstore_', '', $this->component);
}
/**
+3
View File
@@ -39,5 +39,8 @@ function xmldb_tool_log_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
@@ -33,5 +33,8 @@ function xmldb_logstore_database_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
@@ -60,5 +60,8 @@ function xmldb_logstore_standard_upgrade($oldversion) {
upgrade_plugin_savepoint(true, 2022053000, 'logstore', 'standard');
}
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -41,5 +41,8 @@ function xmldb_tool_mobile_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -69,5 +69,8 @@ function xmldb_tool_monitor_upgrade($oldversion) {
upgrade_plugin_savepoint(true, 2022053000, 'tool', 'monitor');
}
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -149,5 +149,8 @@ function xmldb_tool_moodlenet_upgrade(int $oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
@@ -278,7 +278,7 @@ class page_agreedocs implements renderable, templatable {
$cache = \cache::make('core', 'presignup');
$cachekey = 'tool_policy_viewedpolicies';
$viewedpolicies = $cache->get($cachekey);
$viewedpolicies = $cache->get($cachekey) ?: [];
if (!empty($viewedpolicies)) {
// Get the list of the policies docs which the user haven't viewed during this session.
$pendingpolicies = array_diff($currentpolicyversionids, $viewedpolicies);
+3
View File
@@ -40,5 +40,8 @@ function xmldb_tool_policy_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+1 -1
View File
@@ -98,7 +98,7 @@ $string['nopermissiontoagreedocs'] = 'No permission to agree to the policies';
$string['nopermissiontoagreedocs_desc'] = 'Sorry, you do not have the required permissions to agree to the policies.<br />You will not be able to use this site until the following policies are agreed:';
$string['nopermissiontoagreedocsbehalf'] = 'No permission to agree to the policies on behalf of this user';
$string['nopermissiontoagreedocsbehalf_desc'] = 'Sorry, you do not have the required permission to agree to the following policies on behalf of {$a}:';
$string['nopermissiontoagreedocscontact'] = 'For further assistance:';
$string['nopermissiontoagreedocscontact'] = 'For more help:';
$string['nopermissiontoviewpolicyversion'] = 'You do not have permissions to view this policy version.';
$string['nopolicies'] = 'There are no policies for registered users with an active version.';
$string['selectpolicyandversion'] = 'Use the filter above to select policy and/or version';
@@ -19,7 +19,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| First name | User1 |
| Surname | L1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
@@ -53,7 +53,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| First name | User1 |
| Surname | L1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
@@ -98,7 +98,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| First name | User1 |
| Surname | L1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
@@ -157,7 +157,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| First name | User1 |
| Surname | L1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
@@ -210,7 +210,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| First name | User1 |
| Surname | L1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
@@ -522,7 +522,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| First name | User1 |
| Surname | L1 |
| Last name | L1 |
When I press "Create my new account"
Then I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
@@ -647,7 +647,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| First name | User1 |
| Surname | L1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
@@ -716,7 +716,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| First name | User1 |
| Surname | L1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
@@ -858,7 +858,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| First name | User1 |
| Surname | L1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
@@ -86,7 +86,7 @@ Feature: Optional policies
| Email address | user3@address.invalid |
| Email (again) | user3@address.invalid |
| First name | User3 |
| Surname | L3 |
| Last name | L3 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user3@address.invalid"
+6
View File
@@ -51,6 +51,12 @@ if ($listurl) {
$PAGE->navbar->add($listurl, $listurlnav);
}
// Add a new nav item to make $listurl clickable for the Boost theme.
if (isset($script)) {
$lastrunnav = get_string('lastrun', 'tool_profiling');
$PAGE->navbar->add($lastrunnav);
}
// Header
echo $OUTPUT->header();
@@ -41,6 +41,7 @@ $string['importok'] = 'File "{$a}" imported successfully.';
$string['importprefix'] = 'Import prefix';
$string['importproblem'] = 'Some problem happened importing the file "{$a}".';
$string['lastrunof'] = 'Summary of last run of {$a}';
$string['lastrun'] = 'Summary of last run';
$string['markreferencerun'] = 'Mark as reference run/comment';
$string['memory'] = 'Memory used';
$string['pluginname'] = 'Profiling runs';
@@ -243,6 +243,16 @@ class category_bin extends base_bin {
throw new \moodle_exception("Could not create course to restore into.");
}
// As far as recycle bin is using MODE_AUTOMATED, it observes the General restore settings.
// For recycle bin we want to ensure that backup files are always restore the users and groups information.
// In order to achieve that, we hack the setting here via $CFG->forced_plugin_settings,
// so it won't interfere other operations.
// See MDL-65218 and MDL-35773 for more information.
// This hack will be removed once recycle bin switches to use its own backup mode, with
// own preferences and 100% separate from MOODLE_AUTOMATED.
// TODO: Remove this as part of MDL-65228.
$CFG->forced_plugin_settings['restore'] = ['restore_general_users' => 1, 'restore_general_groups' => 1];
// Define the import.
$controller = new \restore_controller(
$tempdir,
@@ -277,6 +287,10 @@ class category_bin extends base_bin {
// Run the import.
$controller->execute_plan();
// We don't need the forced setting anymore, hence unsetting it.
// TODO: Remove this as part of MDL-65228.
unset($CFG->forced_plugin_settings['restore']);
// Have finished with the controller, let's destroy it, freeing mem and resources.
$controller->destroy();
@@ -234,6 +234,16 @@ class course_bin extends base_bin {
$fb = get_file_packer('application/vnd.moodle.backup');
$fb->extract_to_pathname($file, $fulltempdir);
// As far as recycle bin is using MODE_AUTOMATED, it observes the General restore settings.
// For recycle bin we want to ensure that backup files are always restore the users and groups information.
// In order to achieve that, we hack the setting here via $CFG->forced_plugin_settings,
// so it won't interfere other operations.
// See MDL-65218 and MDL-35773 for more information.
// This hack will be removed once recycle bin switches to use its own backup mode, with
// own preferences and 100% separate from MOODLE_AUTOMATED.
// TODO: Remove this as part of MDL-65228.
$CFG->forced_plugin_settings['restore'] = ['restore_general_users' => 1, 'restore_general_groups' => 1];
// Define the import.
$controller = new \restore_controller(
$tempdir,
@@ -264,6 +274,10 @@ class course_bin extends base_bin {
// Run the import.
$controller->execute_plan();
// We don't need the forced setting anymore, hence unsetting it.
// TODO: Remove this as part of MDL-65228.
unset($CFG->forced_plugin_settings['restore']);
// Have finished with the controller, let's destroy it, freeing mem and resources.
$controller->destroy();
@@ -22,35 +22,30 @@ Feature: Backup user data
And the following "activities" exist:
| activity | course | section | name | intro |
| quiz | C1 | 1 | Quiz 1 | Test quiz description |
And the following "question categories" exist:
| contextlevel | reference | name |
| Course | C1 | Test questions |
And the following "questions" exist:
| questioncategory | qtype | name | questiontext |
| Test questions | truefalse | TF1 | First question |
| Test questions | truefalse | TF2 | Second question |
And quiz "Quiz 1" contains the following questions:
| question | page |
| TF1 | 1 |
| TF2 | 1 |
@javascript
Scenario: Delete and restore a quiz with user data
Given I am on the "Quiz 1" "quiz activity" page logged in as teacher1
And I add a "True/False" question to the "Quiz 1" quiz with:
| Question name | TF1 |
| Question text | First question |
| General feedback | Thank you, this is the general feedback |
| Correct answer | False |
| Feedback for the response 'True'. | So you think it is true |
| Feedback for the response 'False'. | So you think it is false |
And I add a "True/False" question to the "Quiz 1" quiz with:
| Question name | TF2 |
| Question text | Second question |
| General feedback | Thank you, this is the general feedback |
| Correct answer | False |
| Feedback for the response 'True'. | So you think it is true |
| Feedback for the response 'False'. | So you think it is false |
And I set the field "maxgrade" to "10.0"
And I press "savechanges"
And I log out
When I am on the "Quiz 1" "quiz activity" page logged in as student1
Scenario Outline: Delete and restore a quiz with user data
Given the following config values are set as admin:
| restore_general_users | <include_user> | restore |
And I am on the "Quiz 1" "quiz activity" page logged in as student1
And I press "Attempt quiz"
And I click on "True" "radio" in the "First question" "question"
And I click on "False" "radio" in the "Second question" "question"
And I press "Finish attempt"
And I press "Submit all and finish"
And I click on "Submit" "button" in the "Submit all your answers and finish?" "dialogue"
And I should see "5.00 out of 10.00"
And I should see "50.00 out of 100.00"
And I log out
And I log in as "teacher1"
And I am on "Course 1" course homepage with editing mode on
@@ -63,5 +58,10 @@ Feature: Backup user data
And I log in as "student1"
And I am on "Course 1" course homepage
When I navigate to "User report" in the course gradebook
Then "Quiz 1" row "Grade" column of "user-grade" table should contain "5"
Then "Quiz 1" row "Grade" column of "user-grade" table should contain "50"
And "Quiz 1" row "Percentage" column of "user-grade" table should contain "50"
Examples:
| include_user | case_explanation |
| 1 | Checked |
| 1 | Unchecked |
@@ -190,6 +190,11 @@ class category_bin_test extends \advanced_testcase {
(object)['plugin' => 'backup', 'name' => 'backup_auto_storage', 'value' => 2],
(object)['plugin' => 'backup', 'name' => 'backup_auto_destination', 'value' => true],
]],
'restore/restore_general_users moodle' => [[
(object)['plugin' => 'restore', 'name' => 'restore_general_users', 'value' => 0],
(object)['plugin' => 'restore', 'name' => 'restore_general_groups', 'value' => 0],
]],
];
}
@@ -187,6 +187,11 @@ class course_bin_test extends \advanced_testcase {
(object)['plugin' => 'backup', 'name' => 'backup_auto_storage', 'value' => 2],
(object)['plugin' => 'backup', 'name' => 'backup_auto_destination', 'value' => true],
]],
'restore/restore_general_users moodle' => [[
(object)['plugin' => 'restore', 'name' => 'restore_general_users', 'value' => 0],
(object)['plugin' => 'restore', 'name' => 'restore_general_groups', 'value' => 0],
]],
];
}
@@ -66,14 +66,10 @@ Feature: Upload users
@javascript
Scenario: Upload users with custom profile fields
# Create user profile field.
Given I log in as "admin"
And I navigate to "Users > Accounts > User profile fields" in site administration
And I click on "Create a new profile field" "link"
And I click on "Text area" "link"
And I set the following fields to these values:
| Short name | superfield |
| Name | Super field |
And I click on "Save changes" "button"
Given the following "custom profile fields" exist:
| datatype | shortname | name |
| text | superfield | Super field |
And I log in as "admin"
# Upload users.
When I navigate to "Users > Accounts > Upload users" in site administration
And I upload "lib/tests/fixtures/upload_users_profile.csv" file to "File" filemanager
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+127 -4
View File
@@ -44,7 +44,7 @@ import {prefetchStrings} from 'core/prefetch';
* @constant
* @type {number}
*/
const MINSPACING = 50;
const MINSPACING = 10;
/**
* A user tour.
@@ -83,6 +83,12 @@ const Tour = class {
// Apply configuration.
this.configure.apply(this, arguments);
// Unset recalculate state.
this.possitionNeedToBeRecalculated = false;
// Unset recalculate count.
this.recalculatedNo = 0;
try {
this.storage = window.sessionStorage;
this.storageKey = 'tourstate_' + this.tourName;
@@ -396,6 +402,11 @@ const Tour = class {
return false;
}
// Check if the CSS styles are allowed on the browser or not.
if (!this.isCSSAllowed()) {
return false;
}
let target = this.getStepTarget(stepConfig);
if (target && target.length && target.is(':visible')) {
// Without a target, there can be no step.
@@ -405,6 +416,22 @@ const Tour = class {
return false;
}
/**
* Is the browser actually allow CSS styles?
*
* @returns {boolean} True if the browser is allowing CSS styles
*/
isCSSAllowed() {
const testCSSElement = document.createElement('div');
testCSSElement.classList.add('hide');
document.body.appendChild(testCSSElement);
const styles = window.getComputedStyle(testCSSElement);
const isAllowed = styles.display === 'none';
testCSSElement.remove();
return isAllowed;
}
/**
* Go to the next step in the tour.
*
@@ -924,6 +951,7 @@ const Tour = class {
// Configure ARIA attributes on the target.
let target = this.getStepTarget(stepConfig);
if (target) {
target.data('original-tabindex', target.attr('tabindex'));
if (!target.attr('tabindex')) {
target.attr('tabindex', 0);
}
@@ -1150,6 +1178,12 @@ const Tour = class {
if (target.data('original-tabindex')) {
target.attr('tabindex', target.data('tabindex'));
} else {
// If the target does not have the tabindex attribute at the beginning. We need to remove it.
// We should wait a little here before removing the attribute to prevent the browser from adding it again.
window.setTimeout(() => {
target.removeAttr('tabindex');
}, 400);
}
}
@@ -1296,6 +1330,7 @@ const Tour = class {
*/
positionStep(stepConfig) {
let content = this.currentStepNode;
let thisT = this;
if (!content || !content.length) {
// Unable to find the step node.
return this;
@@ -1335,9 +1370,15 @@ const Tour = class {
},
onCreate: function(data) {
recalculateArrowPosition(data);
recalculateStepPosition(data);
},
onUpdate: function(data) {
recalculateArrowPosition(data);
if (thisT.possitionNeedToBeRecalculated) {
thisT.recalculatedNo++;
thisT.possitionNeedToBeRecalculated = false;
recalculateStepPosition(data);
}
},
};
@@ -1387,6 +1428,90 @@ const Tour = class {
}
};
const recalculateStepPosition = function(data) {
const placement = data.placement.split('-')[0];
const isVertical = ['left', 'right'].indexOf(placement) !== -1;
const popperElement = $(data.instance.popper);
const targetElement = $(data.instance.reference);
const arrowElement = popperElement.find('[data-role="arrow"]');
const stepElement = popperElement.find('[data-role="flexitour-step"]');
const viewportHeight = $(window).height();
const viewportWidth = $(window).width();
const arrowHeight = parseFloat(arrowElement.outerHeight(true));
const popperHeight = parseFloat(popperElement.outerHeight(true));
const targetHeight = parseFloat(targetElement.outerHeight(true));
const arrowWidth = parseFloat(arrowElement.outerWidth(true));
const popperWidth = parseFloat(popperElement.outerWidth(true));
const targetWidth = parseFloat(targetElement.outerWidth(true));
let maxHeight;
if (thisT.recalculatedNo > 1) {
// The current screen is too small, and cannot fit with the original placement.
// We should set the placement to auto so the PopperJS can calculate the perfect placement.
thisT.currentStepPopper.options.placement = isVertical ? 'auto-left' : 'auto-bottom';
}
if (thisT.recalculatedNo > 2) {
// Return here to prevent recursive calling.
return;
}
if (isVertical) {
// Find the best place to put the tour: Left of right.
const leftSpace = targetElement.offset().left > 0 ? targetElement.offset().left : 0;
const rightSpace = viewportWidth - leftSpace - targetWidth;
const remainingSpace = leftSpace >= rightSpace ? leftSpace : rightSpace;
maxHeight = viewportHeight - MINSPACING * 2;
if (remainingSpace < (popperWidth + arrowWidth)) {
const maxWidth = remainingSpace - MINSPACING - arrowWidth;
if (maxWidth > 0) {
popperElement.css({
'max-width': maxWidth + 'px',
});
// Not enough space, flag true to make Popper to recalculate the position.
thisT.possitionNeedToBeRecalculated = true;
}
} else if (maxHeight < popperHeight) {
// Check if the Popper's height can fit the viewport height or not.
// If not, set the correct max-height value for the Popper element.
popperElement.css({
'max-height': maxHeight + 'px',
});
}
} else {
// Find the best place to put the tour: Top of bottom.
const topSpace = targetElement.offset().top > 0 ? targetElement.offset().top : 0;
const bottomSpace = viewportHeight - topSpace - targetHeight;
const remainingSpace = topSpace >= bottomSpace ? topSpace : bottomSpace;
maxHeight = remainingSpace - MINSPACING - arrowHeight;
if (remainingSpace < (popperHeight + arrowHeight)) {
// Not enough space, flag true to make Popper to recalculate the position.
thisT.possitionNeedToBeRecalculated = true;
}
}
// Check if the Popper's height can fit the viewport height or not.
// If not, set the correct max-height value for the body.
const currentStepBody = stepElement.find('[data-placeholder="body"]').first();
const headerEle = stepElement.find('.modal-header').first();
const footerEle = stepElement.find('.modal-footer').first();
const headerHeight = headerEle.outerHeight(true) ?? 0;
const footerHeight = footerEle.outerHeight(true) ?? 0;
maxHeight = maxHeight - headerHeight - footerHeight;
if (maxHeight > 0) {
headerEle.removeClass('minimal');
footerEle.removeClass('minimal');
currentStepBody.css({
'max-height': maxHeight + 'px',
'overflow': 'auto',
});
} else {
headerEle.addClass('minimal');
footerEle.addClass('minimal');
}
// Call the Popper update method to update the position.
thisT.currentStepPopper.update();
};
let background = $('[data-flexitour="step-background"]');
if (background.length) {
target = background;
@@ -1503,9 +1628,7 @@ const Tour = class {
}
let targetPosition = this.calculatePosition(targetNode);
if (targetPosition === 'fixed') {
background.css('top', 0);
} else if (targetPosition === 'absolute') {
if (targetPosition === 'absolute') {
background.css('position', 'fixed');
}
+3
View File
@@ -131,5 +131,8 @@ function xmldb_tool_usertours_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+6
View File
@@ -14,6 +14,12 @@ span[data-flexitour="container"] .modal-dialog .modal-content .modal-header {
border-bottom: 0;
}
span[data-flexitour="container"] .modal-dialog .modal-content .modal-header.minimal,
span[data-flexitour="container"] .modal-dialog .modal-content .modal-footer.minimal {
padding-top: 0;
padding-bottom: 0;
}
span[data-flexitour="container"] .modal-dialog .modal-content .modal-footer {
justify-content: flex-start;
border-top: 0;
+23 -6
View File
@@ -22,6 +22,8 @@
* @package core
*/
use core_user\fields;
define('NO_OUTPUT_BUFFERING', true);
require_once('../../config.php');
require_once($CFG->libdir.'/adminlib.php');
@@ -37,7 +39,7 @@ if (empty($SESSION->bulk_users)) {
}
if ($dataformat) {
$fields = array('id' => 'id',
$originfields = array('id' => 'id',
'username' => 'username',
'email' => 'email',
'firstname' => 'firstname',
@@ -51,8 +53,10 @@ if ($dataformat) {
'country' => 'country');
$extrafields = profile_get_user_fields_with_data(0);
$profilefields = [];
foreach ($extrafields as $formfield) {
$fields['profile_field_'.$formfield->get_shortname()] = 'profile_field_'.$formfield->get_shortname();
$profilefields[fields::PROFILE_FIELD_PREFIX . $formfield->get_shortname()] = fields::PROFILE_FIELD_PREFIX .
$formfield->get_shortname();
}
$filename = clean_filename(get_string('users'));
@@ -60,17 +64,17 @@ if ($dataformat) {
$downloadusers = new ArrayObject($SESSION->bulk_users);
$iterator = $downloadusers->getIterator();
\core\dataformat::download_data($filename, $dataformat, $fields, $iterator, function($userid, $supportshtml)
use ($extrafields, $fields) {
\core\dataformat::download_data($filename, $dataformat, array_merge($originfields, $profilefields), $iterator,
function($userid, $supportshtml) use ($originfields) {
global $DB;
if (!$user = $DB->get_record('user', array('id' => $userid))) {
return null;
}
profile_load_data($user);
$userprofiledata = array();
foreach ($fields as $field => $unused) {
foreach ($originfields as $field) {
// Custom user profile textarea fields come in an array
// The first element is the text and the second is the format.
// We only take the text.
@@ -82,6 +86,19 @@ if ($dataformat) {
$userprofiledata[$field] = $user->$field;
}
}
// Formatting extra field if transform is true.
$extrafields = profile_get_user_fields_with_data($userid);
foreach ($extrafields as $field) {
$fieldkey = fields::PROFILE_FIELD_PREFIX . $field->get_shortname();
if ($field->is_transform_supported()) {
$userprofiledata[$fieldkey] = $field->display_data();
} else {
$userprofiledata[$fieldkey] = $field->data;
}
}
return $userprofiledata;
});
+1 -1
View File
@@ -99,7 +99,7 @@ class calculation_info {
$samplekey = self::get_sample_key($uniquesampleid);
// Update the cached data adding the new indicator data.
$cacheddata = $cache->get($samplekey);
$cacheddata = $cache->get($samplekey) ?: [];
$cacheddata[$calculableclass] = $infokeys;
$cache->set($samplekey, $cacheddata);
}
+3
View File
@@ -46,5 +46,8 @@ function xmldb_auth_cas_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -38,5 +38,8 @@ function xmldb_auth_db_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -38,5 +38,8 @@ function xmldb_auth_email_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3 -3
View File
@@ -18,7 +18,7 @@ Feature: User must accept policy when logging in and signing up
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| First name | User1 |
| Surname | L1 |
| Last name | L1 |
And I press "Create my new account"
And I should see "Confirm your account"
And I should see "An email should have been sent to your address at user1@address.invalid"
@@ -48,7 +48,7 @@ Feature: User must accept policy when logging in and signing up
| Email address | user1@address.invalid |
| Email (again) | user1@address.invalid |
| First name | User1 |
| Surname | L1 |
| Last name | L1 |
| I understand and agree | 1 |
And I press "Create my new account"
And I should see "Confirm your account"
@@ -81,7 +81,7 @@ Feature: User must accept policy when logging in and signing up
| Email address | <email1> |
| Email (again) | <email2> |
| First name | Jane |
| Surname | Doe |
| Last name | Doe |
And I press "Create my new account"
Then I should <expect> "This email address is already registered. Perhaps you created an account in the past?"
And I should <expect2> "Invalid email address"
+3
View File
@@ -46,5 +46,8 @@ function xmldb_auth_ldap_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -88,5 +88,8 @@ function xmldb_auth_lti_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -38,5 +38,8 @@ function xmldb_auth_manual_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -38,5 +38,8 @@ function xmldb_auth_mnet_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+2 -2
View File
@@ -59,8 +59,8 @@ $string['privacy:metadata:mnet_external:institution'] = 'The institution that th
$string['privacy:metadata:mnet_external:lang'] = 'A user preference for the language shown.';
$string['privacy:metadata:mnet_external:lastaccess'] = 'The time that the user last accessed the site.';
$string['privacy:metadata:mnet_external:lastlogin'] = 'The last login of this user.';
$string['privacy:metadata:mnet_external:lastname'] = 'The surname of the user.';
$string['privacy:metadata:mnet_external:lastnamephonetic'] = 'The phonetic details about the user\'s surname.';
$string['privacy:metadata:mnet_external:lastname'] = 'The last name of the user.';
$string['privacy:metadata:mnet_external:lastnamephonetic'] = 'The phonetic details of the user\'s last name.';
$string['privacy:metadata:mnet_external:maildigest'] = 'A setting for the mail digest for this user.';
$string['privacy:metadata:mnet_external:maildisplay'] = 'A preference for the user about displaying their email address to other users.';
$string['privacy:metadata:mnet_external:middlename'] = 'The middle name of the user';
+3
View File
@@ -38,5 +38,8 @@ function xmldb_auth_none_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -39,5 +39,8 @@ function xmldb_auth_oauth2_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -60,5 +60,8 @@ function xmldb_auth_shibboleth_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
@@ -62,15 +62,10 @@ Feature: availability_profile
@javascript
Scenario: Test with custom user profile field
# Add custom field.
Given I log in as "admin"
And I navigate to "Users > Accounts > User profile fields" in site administration
And I click on "Create a new profile field" "link"
And I click on "Text input" "link"
And I set the following fields to these values:
| Short name | superfield |
| Name | Super field |
And I click on "Save changes" "button"
Given the following "custom profile fields" exist:
| datatype | shortname | name |
| text | superfield | Super field |
And I log in as "admin"
# Set field value for user.
And I navigate to "Users > Accounts > Browse list of users" in site administration
+1 -1
View File
@@ -48,7 +48,7 @@ class backup_files_edit_form extends moodleform {
$mform->setType('component', PARAM_COMPONENT);
$mform->addElement('hidden', 'returnurl', $this->_customdata['returnurl']);
$mform->setType('returnurl', PARAM_URL);
$mform->setType('returnurl', PARAM_LOCALURL);
$this->add_action_buttons(true, get_string('savechanges'));
$this->set_data($this->_customdata['data']);
+1 -1
View File
@@ -89,7 +89,7 @@ function array_remove_by_key($arr,$key) {
function cc_print_object($object) {
echo '<pre>' . htmlspecialchars(print_r($object,true)) . '</pre>';
echo '<pre>' . htmlspecialchars(print_r($object,true), ENT_COMPAT) . '</pre>';
}
+26
View File
@@ -5293,6 +5293,7 @@ class restore_move_module_questions_categories extends restore_execution_step {
AND parentitemid = ?", array($this->get_restoreid(), $contextid));
$top = question_get_top_category($newcontext->newitemid, true);
$oldtopid = 0;
$categoryids = [];
foreach ($modulecats as $modulecat) {
// Before 3.5, question categories could be created at top level.
// From 3.5 onwards, all question categories should be a child of a special category called the "top" category.
@@ -5308,6 +5309,7 @@ class restore_move_module_questions_categories extends restore_execution_step {
$cat->parent = $top->id;
}
$DB->update_record('question_categories', $cat);
$categoryids[] = (int)$cat->id;
}
// And set new contextid (and maybe update newitemid) also in question_category mapping (will be
@@ -5316,6 +5318,30 @@ class restore_move_module_questions_categories extends restore_execution_step {
$modulecat->newitemid, $newcontext->newitemid);
}
// Update the context id of any tags applied to any questions in these categories.
if ($categoryids) {
[$categorysql, $categoryidparams] = $DB->get_in_or_equal($categoryids, SQL_PARAMS_NAMED);
$sqlupdate = "UPDATE {tag_instance}
SET contextid = :newcontext
WHERE component = :component
AND itemtype = :itemtype
AND itemid IN (SELECT DISTINCT bi.newitemid as questionid
FROM {backup_ids_temp} bi
JOIN {question} q ON q.id = bi.newitemid
JOIN {question_versions} qv ON qv.questionid = q.id
JOIN {question_bank_entries} qbe ON qbe.id = qv.questionbankentryid
WHERE bi.backupid = :backupid AND bi.itemname = 'question_created'
AND qbe.questioncategoryid {$categorysql}) ";
$params = [
'newcontext' => $newcontext->newitemid,
'component' => 'core_question',
'itemtype' => 'question',
'backupid' => $this->get_restoreid(),
];
$params += $categoryidparams;
$DB->execute($sqlupdate, $params);
}
// Now set the parent id for the question categories that were in the top category in the course context
// and have been moved now.
if ($oldtopid) {
@@ -0,0 +1,24 @@
@core @core_backup
Feature: Backup and restore of the question that was tagged
Background:
Given the following "courses" exist:
| fullname | shortname | category |
| Course 1 | C1 | 0 |
@javascript @_file_upload
Scenario: Restore the quiz containing the question that was tagged
Given I am on the "Course 1" "restore" page logged in as "admin"
And I press "Manage backup files"
And I upload "backup/moodle2/tests/fixtures/test_tags_backup.mbz" file to "Files" filemanager
And I press "Save changes"
And I restore "test_tags_backup.mbz" backup into a new course using this options:
| Schema | Course name | Course 2 |
| Schema | Course short name | C2 |
When I am on the "TF1" "core_question > edit" page logged in as admin
And I expand all fieldsets
Then I should see "Tag1-TF1"
And I should see "Tag2-TF1"
And I am on the "TF2" "core_question > edit" page logged in as admin
And I expand all fieldsets
And I should see "Tag1-TF2"
Binary file not shown.
+7 -5
View File
@@ -1811,10 +1811,9 @@ abstract class restore_dbops {
public static function calculate_course_names($courseid, $fullname, $shortname) {
global $CFG, $DB;
$currentfullname = '';
$currentshortname = '';
$counter = 0;
// Iteratere while the name exists
// Iterate while fullname or shortname exist.
do {
if ($counter) {
$suffixfull = ' ' . get_string('copyasnoun') . ' ' . $counter;
@@ -1823,8 +1822,11 @@ abstract class restore_dbops {
$suffixfull = '';
$suffixshort = '';
}
$currentfullname = $fullname.$suffixfull;
$currentshortname = substr($shortname, 0, 100 - strlen($suffixshort)).$suffixshort; // < 100cc
// Ensure we don't overflow maximum length of name fields, in multi-byte safe manner.
$currentfullname = core_text::substr($fullname, 0, 254 - strlen($suffixfull)) . $suffixfull;
$currentshortname = core_text::substr($shortname, 0, 100 - strlen($suffixshort)) . $suffixshort;
$coursefull = $DB->get_record_select('course', 'fullname = ? AND id != ?',
array($currentfullname, $courseid), '*', IGNORE_MULTIPLE);
$courseshort = $DB->get_record_select('course', 'shortname = ? AND id != ?', array($currentshortname, $courseid));
+16 -1
View File
@@ -96,6 +96,21 @@ class async_helper {
return $user;
}
/**
* Return appropriate description for current async operation {@see async_helper::type}
*
* @return string
*/
private function get_operation_description(): string {
$operations = [
'backup' => new lang_string('backup'),
'copy' => new lang_string('copycourse'),
'restore' => new lang_string('restore'),
];
return (string) ($operations[$this->type] ?? $this->type);
}
/**
* Callback for preg_replace_callback.
* Replaces message placeholders with real values.
@@ -105,7 +120,7 @@ class async_helper {
*/
private function lookup_message_variables($matches) {
$options = array(
'operation' => $this->type,
'operation' => $this->get_operation_description(),
'backupid' => $this->backupid,
'user_username' => $this->user->username,
'user_email' => $this->user->email,
+11 -8
View File
@@ -30,6 +30,7 @@ require_once($CFG->dirroot . '/backup/util/includes/restore_includes.php');
* Asyncronhous helper tests.
*
* @package core_backup
* @covers \async_helper
* @copyright 2018 Matt Porritt <mattp@catalyst-au.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
@@ -47,7 +48,7 @@ class async_helper_test extends \advanced_testcase {
set_config('backup_async_message_users', '1', 'backup');
set_config('backup_async_message_subject', 'Moodle {operation} completed sucessfully', 'backup');
set_config('backup_async_message',
'Dear {user_firstname} {user_lastname}, <br/> Your {operation} (ID: {backupid}) has completed successfully!',
'Dear {user_firstname} {user_lastname}, your {operation} (ID: {backupid}) has completed successfully!',
'backup');
set_config('allowedemaildomains', 'example.com');
@@ -76,15 +77,17 @@ class async_helper_test extends \advanced_testcase {
$this->assertCount(1, $emails);
$email = reset($emails);
$this->assertSame($USER->email, $email->from);
$this->assertSame($user2->email, $email->to);
$this->assertSame('Moodle backup completed sucessfully', $email->subject);
$this->assertNotEmpty($email->header);
$this->assertNotEmpty($email->body);
$this->assertMatchesRegularExpression("/$backupid/", $email->body);
$this->assertThat($email->body, $this->logicalNot($this->stringContains('{')));
$this->assertGreaterThan(0, $messageid);
$sink->clear();
$this->assertSame($USER->email, $email->from);
$this->assertSame($user2->email, $email->to);
$this->assertSame('Moodle Backup completed sucessfully', $email->subject);
// Assert body placeholders have all been replaced.
$this->assertStringContainsString('Dear test human, your Backup', $email->body);
$this->assertStringContainsString("(ID: {$backupid})", $email->body);
$this->assertStringNotContainsString('{', $email->body);
}
/**
+1 -1
View File
@@ -27,7 +27,7 @@
defined('MOODLE_INTERNAL') || die();
/**
* Open Badges Assertions specification 1.0 {@link https://github.com/mozilla/openbadges/wiki/Assertions}
* Open Badges Assertions specification 1.0 {@link https://github.com/mozilla/openbadges-backpack/wiki/Assertions}
*
* Badge asserion is defined by three parts:
* - Badge Assertion (information regarding a specific badge that was awarded to a badge earner)
@@ -72,16 +72,13 @@ class badges_test extends core_reportbuilder_testcase {
$report = $generator->create_report(['name' => 'Badges', 'source' => badges::class, 'default' => 0]);
// Badge course.
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:fullname'])
->set_many(['sortenabled' => true, 'sortdirection' => SORT_ASC])->update();
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:fullname', 'sortenabled' => 1]);
// Badge name.
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'badge:name'])
->set_many(['sortenabled' => true, 'sortdirection' => SORT_ASC])->update();
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'badge:name', 'sortenabled' => 1]);
// User fullname.
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname'])
->set_many(['sortenabled' => true, 'sortdirection' => SORT_ASC])->update();
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname', 'sortenabled' => 1]);
$content = $this->get_custom_report_content($report->get('id'));
$this->assertCount(3, $content);
+3
View File
@@ -51,5 +51,8 @@ function xmldb_block_badges_upgrade($oldversion, $block) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -66,5 +66,8 @@ function xmldb_block_calendar_month_upgrade($oldversion, $block) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -51,5 +51,8 @@ function xmldb_block_calendar_upcoming_upgrade($oldversion, $block) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -54,5 +54,8 @@ function xmldb_block_completionstatus_upgrade($oldversion, $block) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -65,5 +65,8 @@ function xmldb_block_course_summary_upgrade($oldversion, $block) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -61,5 +61,8 @@ function xmldb_block_feedback_upgrade($oldversion, $block) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+3
View File
@@ -39,5 +39,8 @@ function xmldb_block_html_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
+2 -6
View File
@@ -132,12 +132,8 @@ class block_base {
function name() {
// Returns the block name, as present in the class name,
// the database, the block directory, etc etc.
static $myname;
if ($myname === NULL) {
$myname = strtolower(get_class($this));
$myname = substr($myname, strpos($myname, '_') + 1);
}
return $myname;
$myname = strtolower(get_class($this));
return substr($myname, strpos($myname, '_') + 1);
}
/**
+3
View File
@@ -78,5 +78,8 @@ function xmldb_block_myoverview_upgrade($oldversion) {
// Automatically generated Moodle v4.0.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
return true;
}

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