Compare commits

..

729 Commits

Author SHA1 Message Date
Jun Pataleta 0fae900b58 Moodle release 4.0.7 2023-03-11 13:10:44 +08:00
Jun Pataleta 202cd371a1 weekly release 4.0.6+ 2023-03-10 22:09:56 +08:00
Jun Pataleta e60107a0d3 Merge branch 'install_400_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_400_STABLE 2023-03-10 22:09:54 +08:00
Ilya Tregubov 1c6dcd21f9 Merge branch 'MDL-77429-400-fix' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2023-03-10 14:51:24 +08:00
Andrew Nicols 0be2c46692 MDL-77429 course: Change course date to previous day
When a test runs just after midnight, and the user time zone is not the
same as the server timezone, and the course is created using a generator
(which runs in server time zone) but the UI presented in the user
timezone, the course start time is still in the future.

We need to create the course a day earlier to ensure that the "This
week" indicator is in the correct day.
2023-03-10 14:11:23 +08:00
Andrew Nicols 4027a6f9fb MDL-77037 core_course: Add new courseindex test to classic excludelist 2023-03-10 13:32:15 +08:00
Jun Pataleta 2fc493dd9f Merge branch 'MDL-77458-400' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2023-03-10 12:06:03 +08:00
Jake Dallimore 25f8ff2446 Merge branch 'MDL-77517-400' of https://github.com/juancs/moodle into MOODLE_400_STABLE 2023-03-10 11:41:11 +08:00
Andrew Nicols 4287b7acd9 Merge branch 'MDL-77530-tool-task-checks-MOODLE_400_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_400_STABLE 2023-03-10 11:31:10 +08:00
Jake Dallimore a18d42a1bb Merge branch 'MDL-77219-400' of https://github.com/sarjona/moodle into MOODLE_400_STABLE 2023-03-10 10:36:45 +08:00
Jun Pataleta baabc32443 Merge branch 'MDL-76603-400' of https://github.com/junpataleta/moodle into MOODLE_400_STABLE 2023-03-10 10:14:49 +08:00
Shamim Rezaie 05d383cdff MDL-76603 gradingforms: Some A11y fixes on editing form
- Use span instead of dummy input elements because form elements need a
  label
- Sufficient size for target is at least 24px by 24px (Success Criteria
  2.5.8)
2023-03-10 10:11:25 +08:00
Shamim Rezaie d6087552d0 MDL-76603 mod_assign: Move advanced grading grades out of the tables 2023-03-10 10:11:25 +08:00
Shamim Rezaie 27c9eb38a0 MDL-76603 gradingform_rubric: preserve bg colour on hover 2023-03-10 10:11:25 +08:00
Shamim Rezaie ea697ca8a0 MDL-76603 gradingform_rubric: fix roles
- set the role of table to none
- moved aria-label from <table> element (that doesn't has role="none")
  to the element that has the radiogroup role
- if it's not radiogroup/radio, it is list/listitem
- removed aria-label from the rubric table and used caption instead
2023-03-10 10:11:25 +08:00
Andrew Nicols 5ba62ce7ae Merge branch 'MDL-76849-400-5' of https://github.com/junpataleta/moodle into MOODLE_400_STABLE 2023-03-10 09:29:56 +08:00
Jun Pataleta e851069e97 Merge branch 'MDL-70613-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-03-10 09:19:33 +08:00
Sara Arjona c231b4ff1b Merge branch 'MDL-77323-400' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_400_STABLE 2023-03-09 16:49:42 +01:00
Paul Holden 72f985e956 MDL-70613 mod_feedback: cast feedback text values for table sorting.
Specifically avoids Oracle ORA-00932 (inconsistent CLOB datatype).
2023-03-09 14:59:16 +00:00
Andrew Nicols 8284e13413 Merge branch 'MDL-77329-400-clr' of https://github.com/ferranrecio/moodle into MOODLE_400_STABLE 2023-03-09 22:19:25 +08:00
Andrew Nicols 0919443d33 Merge branch 'MDL-77429-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2023-03-09 22:11:28 +08:00
Andrew Nicols cdca553678 Merge branch 'MDL-77463-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2023-03-09 22:04:05 +08:00
Andrew Nicols aeef022c1c MDL-77037 core_course: Coding style fix in Behat feature 2023-03-09 22:00:00 +08:00
Andrew Nicols 2d3d946eef Merge branch 'MDL-77037-400' of https://github.com/laurentdavid/moodle into MOODLE_400_STABLE 2023-03-09 21:59:56 +08:00
James C fc4a4e6450 MDL-77329 course: Prevent collapse state loss 2023-03-09 12:01:27 +01:00
Sara Arjona abff12eda1 Merge branch 'MDL-76940-400' of https://github.com/laurentdavid/moodle into MOODLE_400_STABLE 2023-03-09 10:54:57 +01:00
Jun Pataleta 2570c08460 Merge branch 'MDL-77533-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-03-09 16:35:10 +08:00
Jun Pataleta b19ed507d1 Merge branch 'MDL-77559-400-2' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2023-03-09 15:53:34 +08:00
Laurent David e5f40a62d4 MDL-77037 core_courseformat: Refresh course index
* Refresh course index when language change
2023-03-09 08:44:28 +01:00
Brendan Heywood e3356e2a5a MDL-77530 tool_task: Fix coding errors in checks 2023-03-09 15:43:28 +11:00
Andrew Nicols 353b25f991 Merge branch 'MDL-77420-400' of https://github.com/ferranrecio/moodle into MOODLE_400_STABLE 2023-03-09 12:01:41 +08:00
Andrew Nicols f91555d94e Merge branch 'MDL-77014-400' of https://github.com/lucaboesch/moodle into MOODLE_400_STABLE 2023-03-09 11:42:16 +08:00
Andrew Nicols 8cba18bd0d Merge branch '76945-bootstrap-dropdowns-400' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_400_STABLE 2023-03-09 10:54:17 +08:00
Tim Hunt 5022583eec MDL-77467 retore: add progress tracking to potentially slow steps 2023-03-09 10:47:05 +08:00
Jun Pataleta c6abd93efb Merge branch 'MDL-77225_400' of https://github.com/timhunt/moodle into MOODLE_400_STABLE 2023-03-09 10:42:53 +08:00
Andrew Nicols 9893e93761 Merge branch 'MDL-77418-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-03-09 10:37:40 +08:00
Andrew Nicols af4fae4f5b Merge branch 'MOODLE_400_STABLE' of https://github.com/fcbsd/moodle into MOODLE_400_STABLE 2023-03-09 10:29:58 +08:00
Andrew Nicols 1bfc8f2097 MDL-77559 js: Rebuild all JS with Node 16 2023-03-09 09:53:19 +08:00
Jun Pataleta aa7d3faddb MDL-76849 qtype_essay: Allow question number inclusion in answer fields
* Have the following classes extend qtype_essay_format_renderer_base
  as they have been meant to:
  - qtype_essay_format_editor_renderer
  - qtype_essay_format_noinline_renderer
  - qtype_essay_format_plain_renderer
* Add a question_display_options instance variable for
qtype_essay_format_renderer_base so its subclasses can use it to
generate the label for their respective answer fields.
2023-03-09 08:58:52 +08:00
Jun Pataleta 05e3716ffe MDL-76849 qtype_shortanswer: Include question number in answer fields 2023-03-09 08:58:52 +08:00
Jun Pataleta f6c5e15bdf MDL-76849 qtype_numerical: Include question number in answer fields
* Also covers its qtype_calculated and qtype_calculatedsimple
which extend its renderer class
2023-03-09 08:58:52 +08:00
Jun Pataleta 9ba9723826 MDL-76849 qtype_multianswer: Include question number in answer fields
* Add the question number to the answer fields if it's available.
* Improve multiple choice question accessibility:
  - Label the multiple choice question groups appropriately by
    enclosing them in fieldset tags and applying sr-only legend tags to
    label them.
  - Apply Bootstrap form-check classes to the radio buttons, so they
    are rendered better and become responsive as well. This also helps
    avoid the use of the table element for layout purposes when
    rendering horizontal multiple choice sub-questions.
2023-03-09 08:58:52 +08:00
Jun Pataleta 716c223db5 MDL-76849 qtype_match: Include question number in answer fields 2023-03-09 08:58:52 +08:00
Jun Pataleta 8c6dbf8561 MDL-76849 qtype_truefalse: Include question number in answer fields
* Improve accessibility as well by grouping the radio buttons
in a fieldset.
2023-03-09 08:58:52 +08:00
Jun Pataleta fd13110bd4 MDL-76849 qtype_multichoice: Include question number in answer fields
* Improve accessibility as well by grouping the radio buttons/checkboxes
in a fieldset.
2023-03-09 08:58:52 +08:00
Jun Pataleta 2a5c62ab88 MDL-76849 qtype_ddwtos: Include question number in answer fields
* Plus include the item number so users will have an idea which blank
numbers they are currently on.
2023-03-09 08:58:52 +08:00
Jun Pataleta bad9e0a1bc MDL-76849 qtype_gapselect: Include question number in answer fields 2023-03-09 08:58:52 +08:00
Jun Pataleta b71d30097e MDL-76849 qtype: Add a questionidentifier instance variable
* Add an instance variable to question_display_options to store the
identifier associated with the question being rendered.
* This information can be used by question type plugins to improve the
accessibility of the answer fields being rendered by adding the
question identifier to the answer fields' labels.
* Adding the question identifier to the label can be achieved by using
question_display_options::add_question_identifier_to_label().

Co-authored-by: Tim Hunt <t.j.hunt@open.ac.uk>
2023-03-09 08:58:52 +08:00
Andrew Nicols 1852ad42b5 MDL-77559 js: Revert "MDL-75012 core: Bump NodeJS version requirements"
This reverts commit 7dc9c54ff6.
2023-03-09 08:21:36 +08:00
Andrew Nicols 3a0b800be7 MDL-77559 js: Revert "MDL-75012 js: Bump standard dependencies"
This reverts commit 86cc29f021.
2023-03-09 08:21:22 +08:00
Andrew Nicols 9e7a6d1c79 MDL-77559 js: Revert "MDL-75012 js: Remove grunt-contrib-uglify"
This reverts commit 415c9de634.
2023-03-09 08:21:19 +08:00
Andrew Nicols 7553895409 MDL-77559 js: Revert "MDL-75012 js: Bump stylelint and components"
This reverts commit e431f3a4d6.
2023-03-09 08:21:16 +08:00
Andrew Nicols 80a06b2966 MDL-77559 js: Revert "MDL-75012 js: Update browserslist"
This reverts commit a1d646d621.
2023-03-09 08:21:12 +08:00
Andrew Nicols e9e77f32e9 MDL-77559 js: Revert "MDL-75012 js: Bump node-sass"
This reverts commit d418ca209e.
2023-03-09 08:21:07 +08:00
Andrew Nicols c3097aab8c MDL-77559 js: Revert "MDL-75012 js: Audit fix"
This reverts commit 73d25ec0c6.
2023-03-09 08:21:03 +08:00
Andrew Nicols 290a7cffea MDL-77559 js: Revert "MDL-75012 js: Use our own jsdoc wrapper"
This reverts commit b7c2924b68.
2023-03-09 08:20:57 +08:00
Andrew Nicols 92b235d31b MDL-77559 js: Revert "MDL-75012 js: Bump shifter to new version"
This reverts commit 95b47d2432.
2023-03-09 08:20:53 +08:00
Andrew Nicols 9ea97cc350 MDL-77559 js: Revert "MDL-75012 js: Put shifter on a diet"
This reverts commit 77d822898a.
2023-03-09 08:20:49 +08:00
Andrew Nicols 62ed5dfd27 MDL-77559 js: Revert "MDL-75012 js: Remove unused babel-preset-minify dependency"
This reverts commit 8412495f5e.
2023-03-09 08:20:45 +08:00
Andrew Nicols dcabe38876 MDL-77559 js: Revert "MDL-75012 js: Bump Babel dependencies"
This reverts commit c90054e98e.
2023-03-09 08:20:42 +08:00
Andrew Nicols 3c05e673a3 MDL-77559 js: Revert "MDL-75012 js: Remove orphaned source maps"
This reverts commit 181e8f7686.
2023-03-09 08:20:09 +08:00
AMOS bot 1fd4f4b11b Automatically generated installer lang files 2023-03-09 00:07:38 +00:00
Tim Hunt f5645cf4a8 MDL-77225 questions: fix regrade of descriptions in finished attempts
The added logic is similar to the logic in other behaviours, and the new test fails without it.
2023-03-08 19:01:05 +00:00
Sara Arjona 4555270cfc Merge branch 'MDL-77464_400' of https://github.com/timhunt/moodle into MOODLE_400_STABLE 2023-03-08 16:14:53 +01:00
Laurent David a49c1483aa MDL-76940 core_courseformat: Index refreshing when role switch
* Hidden sections and content should not visible to students when switching role
2023-03-08 11:51:34 +01:00
Ilya Tregubov 7601dd8b7b Merge branch 'MDL-77414-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2023-03-08 17:05:46 +08:00
Angelia Dela Cruz a50c324721 MDL-77463 Behat: Coverage for assign submission notification to teacher 2023-03-08 17:03:53 +08:00
Angelia Dela Cruz 1885fd9a2f MDL-77429 Behat: Add coverage for changing course format as teacher 2023-03-08 15:49:32 +08:00
Luca Bösch 655cae8cc4 MDL-77014 course: Single activity format course title multilang. 2023-03-08 08:27:36 +01:00
Angelia Dela Cruz aacd3761aa MDL-77414 Behat: Coverage for "Require all group members submit" setting 2023-03-08 14:51:47 +08:00
Sara Arjona ff437575bc Merge branch 'MDL-77440_400' of https://github.com/timhunt/moodle into MOODLE_400_STABLE 2023-03-08 07:24:35 +01:00
Jun Pataleta c57bb0107c Merge branch 'MDL-77472-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-03-08 11:53:34 +08:00
Petr Skoda f057226154 MDL-77524 filter_algebra: fix error message 2023-03-08 11:27:13 +08:00
Paul Holden b946c528b0 MDL-75517 report_participation: filter report by viewable roles only. 2023-03-08 10:38:02 +08:00
Michael Hawkins e835233465 MDL-77204 mod_wiki: Clean filename in Moodle1 backup 2023-03-08 10:33:57 +08:00
Paul Holden 724c4fa373 MDL-77046 availability: validate profile field in condition. 2023-03-08 10:24:26 +08:00
Paul Holden 1bb6bd7381 MDL-76809 gradereport_history: pre-filter report userids filter.
Ensure current user is able to access each of the provided userids.
2023-03-08 10:01:08 +08:00
Ilya Tregubov 1cd3788793 Merge branch 'MDL-77446-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2023-03-08 09:19:27 +08:00
Petr Skoda 1d23929fa9 MDL-76645 filter_data: fix link title attribute 2023-03-08 00:55:19 +00:00
Paul Holden 586168df7c MDL-77129 tool_lp: remove redundant call to set page header. 2023-03-08 00:55:19 +00:00
Lars Bonczek e52133c631 MDL-75659 core: Don't render component argument twice in mustache pix helper 2023-03-08 00:55:19 +00:00
Jun Pataleta baca8dd626 Merge branch 'MDL-77416-400-enfix' of https://github.com/vmdef/moodle into MOODLE_400_STABLE 2023-03-08 08:50:16 +08:00
AMOS bot f0817b2e97 Automatically generated installer lang files 2023-03-08 00:07:40 +00:00
Tim Hunt 1397ce352a MDL-77464 questions: regrading was losing question_attempt metadata
This is very similar to MDL-77090, but at the time, I missed that this
also needed to be handled. (Question metadata is, I think, only used
by the quiz 'Try another question like this one' feature.)
2023-03-07 13:43:12 +00:00
Tim Hunt 33e98afe3c MDL-77464 questions: update comments in question_attempt_step
The class comment had some inaccuracies which I fixed.
I also replaced all uses of @link with @see.
2023-03-07 13:42:59 +00:00
Sara Arjona c11c5d26cd MDL-77219 behat: Fix issue with headless
Although the error in the "I check that I can import recordings into
the Recording activity and then if I delete them" scenario is unrelated
to this patch, this commit needs to be applied too, in order to avoid
behat failures (because the "Import recording links" button is in the
edge of the window).

This is a backport of MDL-74272.
2023-03-07 11:04:13 +01:00
Sara Arjona 6703d67439 MDL-77219 theme_boost: Remove plugin name on course page
In 4.0, the plugin name was added above their name. Based on the community
feedback and the research done by the UX team, this needs to be removed.
This commit removes the activity name when edit mode is disabled.

This is a backport of MDL-74272.
2023-03-07 11:04:12 +01:00
Angelia Dela Cruz 277c0ffc0d MDL-77446 Behat: Add coverage for changing uploaded file details 2023-03-07 16:13:26 +08:00
Andrew Nicols 6436f1532d Merge branch 'MDL-77094_400' of https://github.com/timhunt/moodle into MOODLE_400_STABLE 2023-03-07 12:23:24 +08:00
Andrew Nicols 95a95a80b0 Merge branch 'MDL-77336-400' of https://github.com/meirzamoodle/moodle into MOODLE_400_STABLE 2023-03-07 12:02:22 +08:00
AMOS bot ebe39a84db Automatically generated installer lang files 2023-03-07 00:07:38 +00:00
Tim Hunt 5c261335c7 MDL-77440 quiz: fix nav error reviewing after redoing a question 2023-03-06 16:17:30 +00:00
Sara Arjona 6b4edc0068 Merge branch 'MDL-77460-400' of https://github.com/lameze/moodle into MOODLE_400_STABLE 2023-03-06 16:34:08 +01:00
Paul Holden 3fc4c17115 MDL-77472 grade: correct URL param type for adding tracking params. 2023-03-06 09:50:03 +00:00
Meirza 4a0793d898 MDL-77336 admin: fix typo in adminpreset data settings. 2023-03-06 16:46:54 +07:00
Paul Holden 91178b70f5 MDL-77533 customfield: fix exception thrown during handler retrieval. 2023-03-06 09:27:21 +00:00
Juan Segarra Montesinos 04bb96886d MDL-77517 js: Disable "Edit mode" button when clicked
When clicked, disable the "Edit mode" button just before doing a
redirection. It's been reported that after clicling several times the
button, an inconsistent state between the button and the editing mode is
achieved. The patch mitigates the issue.
2023-03-05 07:06:24 +01:00
Víctor Déniz 1eeb10cf08 MDL-77416 lang: Use fixed strings in tests 2023-03-03 13:21:02 +00:00
Helen Foster 201e5c1103 MDL-77416 lang: Import fixed English strings (en_fix) 2023-03-03 13:21:02 +00:00
Jun Pataleta 1635a0f1b0 Merge branch 'MDL-77428-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2023-03-03 16:34:58 +08:00
Jun Pataleta 3ca56cb7f1 MDL-76849 question: New lang strings for answer fields 2023-03-03 15:32:45 +08:00
Jake Dallimore 62cfa26cb9 weekly release 4.0.6+ 2023-03-03 11:08:39 +08:00
Jake Dallimore b890f223e4 Merge branch 'install_400_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_400_STABLE 2023-03-03 11:08:36 +08:00
Andrew Nicols e2eb63f1d9 MDL-77458 core: Add supported php version info to phpcs config 2023-03-02 20:37:52 +08:00
Simey Lameze fc5eba83d2 MDL-77460 behat: improve roles.feature test 2023-03-02 18:25:22 +08:00
Angelia Dela Cruz 51a25fac44 MDL-77428 Behat: Add coverage for forum post word count 2023-03-02 13:47:25 +08:00
Jun Pataleta 181e8f7686 MDL-75012 js: Remove orphaned source maps 2023-03-02 13:13:42 +08:00
Jun Pataleta f5f3457173 Merge branch 'MDL-75012-400-5' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2023-03-02 12:28:05 +08:00
Andrew Nicols 58f411d2f1 MDL-75012 js: Full build of all grunt things 2023-03-02 12:15:25 +08:00
Andrew Nicols c90054e98e MDL-75012 js: Bump Babel dependencies
Please note that whilst some dependencies have higher versions
available, these are not compatible at this time.
2023-03-02 12:15:25 +08:00
Andrew Nicols 8412495f5e MDL-75012 js: Remove unused babel-preset-minify dependency 2023-03-02 12:15:25 +08:00
Jun Pataleta 2382d6188e Merge branch 'MDL-75719-400-4' of https://github.com/ilyatregubov/moodle into MOODLE_400_STABLE 2023-03-02 11:59:19 +08:00
Jake Dallimore 3f5d3f8952 Merge branch 'MDL-77461-400' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2023-03-02 11:42:55 +08:00
Paul Holden 7278c5f5b4 MDL-77368 forms: remove console logging of upload DOM element. 2023-03-02 11:20:09 +08:00
Andrew Nicols 0d08af8de6 MDL-77461 behat: Use get_course_id instead of DB fetch 2023-03-02 11:06:53 +08:00
Ilya Tregubov 8585a70700 MDL-75719 completion: Add Behat scenario for completion states. 2023-03-02 11:05:31 +08:00
Ilya Tregubov 62d0d76fe1 MDL-75719 completion: Fix unit tests and Behat tests.
Fix tests since we changed behavior of completions (completion
state an UI).
2023-03-02 11:05:30 +08:00
Ilya Tregubov 710fa8ed7a MDL-75719 completion: Fix viewed criteria.
When we unlock completion criteria and save changes 'viewed' criteria
still should be completed if user has viewed activity before. Seems
that that was broken by recent changes. Fixing here.
2023-03-02 11:05:30 +08:00
Ilya Tregubov 64efaed528 MDL-75719 completion: Fix completion state for hidden grade items.
For hidden grade items we used to mark students as completed if
they have any grade. But this was not working correctly when we
also set pass grade for activity and completion criteria based
on pass grade. So we will have these completion states

Competion criteria 'Receive grade':
No grade - COMPLETION_INCOMPLETE
Grade visible, achieved passing grade - COMPLETION_COMPLETE_PASS
Grade visible, failed passing grade - COMPLETION_COMPLETE_FAIL
Grade hidden - COMPLETION_COMPLETE

Completion criteris 'Receive passing grade'
No grade - COMPLETION_INCOMPLETE
Grade visible, achieved passing grade - COMPLETION_COMPLETE_PASS
Grade visible, failed passing grade - COMPLETION_COMPLETE_FAIL
Grade hidden, achieved passing grade - COMPLETION_COMPLETE_PASS
Grade hidden, failed passing grade - COMPLETION_COMPLETE_FAIL_HIDDEN
2023-03-02 11:05:30 +08:00
Jake Dallimore 9de063d19b Merge branch 'MDL-77318-400' of https://github.com/Utdanningsdirektoratet/moodle into MOODLE_400_STABLE 2023-03-02 10:56:15 +08:00
Andrew Nicols dd651bfe75 Merge branch 'MDL-77150-400' of https://github.com/roland04/moodle into MOODLE_400_STABLE 2023-03-02 10:49:02 +08:00
Andrew Nicols a3984be80b Merge branch 'MDL-75534-400-forum-usermodified-zero' of https://github.com/mudrd8mz/moodle into MOODLE_400_STABLE 2023-03-02 10:39:07 +08:00
Jake Dallimore 926a143dd6 Merge branch 'MDL-76298_400' of https://github.com/timhunt/moodle into MOODLE_400_STABLE 2023-03-02 10:13:23 +08:00
Jun Pataleta c5a99daa0c Merge branch 'MDL-77413-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2023-03-02 09:45:48 +08:00
Andrew Nicols 1ceb4e2691 Merge branch 'MDL-77391-m400' of https://github.com/jrchamp/moodle into MOODLE_400_STABLE 2023-03-02 09:27:17 +08:00
Andrew Nicols d46f7f29ce Merge branch 'MDL-77321-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-03-02 09:25:16 +08:00
Jun Pataleta 8d2296ef33 Merge branch 'MDL-74586-400-sqlrss' of https://github.com/mudrd8mz/moodle into MOODLE_400_STABLE 2023-03-02 08:58:15 +08:00
Jun Pataleta b961e519cf Merge branch 'MDL-76938_restore_comments_400' of https://github.com/davosmith/moodle into MOODLE_400_STABLE 2023-03-02 08:41:37 +08:00
AMOS bot 7995a6a7c9 Automatically generated installer lang files 2023-03-02 00:07:43 +00:00
fcbsd fc1adc914c MDL-77365 count_words: Make span> an inline tag MOODLE_400_STABLE 2023-03-01 16:05:24 +00:00
Jun Pataleta 5003c32dd2 Merge branch 'MDL-77417_400' of https://github.com/stronk7/moodle into MOODLE_400_STABLE 2023-03-01 23:54:09 +08:00
Mikel Martín 3bb68aefc0 MDL-77150 core_table: Fix classes added as columnsattributes are ignored
Fix columnattributes with key 'class' being ingored by adding them to every 'column_class'.
2023-03-01 11:16:23 +01:00
hieuvu 8304ad73a7 MDL-77323 question: Prevent drag item sent into two drop zone 2023-03-01 14:46:40 +07:00
Andrew Nicols 146441bf58 Merge branch 'MDL-58945_400' of https://github.com/timhunt/moodle into MOODLE_400_STABLE 2023-03-01 10:55:49 +08:00
Andrew Nicols e3264a1ebc Merge branch 'MDL-74585-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-03-01 10:52:07 +08:00
Andrew Nicols 960a32b2ae Merge branch 'MDL-77322_basicauth_checkbox-400' of https://github.com/leonstr/moodle into MOODLE_400_STABLE 2023-03-01 10:50:02 +08:00
Andrew Nicols 0082649a28 Merge branch 'MDL-72727-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-03-01 10:47:16 +08:00
AMOS bot 6e9ff0e536 Automatically generated installer lang files 2023-03-01 00:07:36 +00:00
Jonathan Champ 0e23d91ec3 MDL-77391 question admin: further improve query peformance in qtypes.php 2023-02-28 10:18:46 -05:00
Andrew Nicols a9cc05c9fd Merge branch 'MDL-77097_400' of https://github.com/stronk7/moodle into MOODLE_400_STABLE 2023-02-28 22:14:03 +08:00
David Mudrák 06d446aec1 MDL-74586 rss: Make rss_get_userid_from_token() use table index
Due to missing `AND k.script = 'rss'` condition, the query did not make
use of the existing script-value compound index defined for the table.
So it had to perform the full sequential scan for all rows when
searching for the token. This had serious performance issues on sites
with many users, especially in case on non-existing token / key.
2023-02-28 13:26:12 +01:00
Angelia Dela Cruz bef92dfbdc MDL-77413 Behat: Minor changes to optimise the existing tests 2023-02-28 17:23:58 +08:00
Angelia Dela Cruz 63a788899f MDL-77413 Behat: Add coverage to verify groups can have a picture 2023-02-28 17:23:40 +08:00
Jun Pataleta f5f57ba477 Merge branch 'MDL-77248-400' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2023-02-28 15:46:43 +08:00
Andrew Nicols 13a1d1d661 MDL-77248 mod_bigbluebuttonbn: Remove unused dpa pages 2023-02-28 12:04:51 +08:00
Andrew Nicols 223cdb0ed9 MDL-77248 mod_bigbluebuttonbn: Set dpa accepted when creating activities
This only applies when creating activities using the test data
generator.
2023-02-28 12:04:51 +08:00
Andrew Nicols c3f0e5ddaa MDL-77248 core: Move pre_enable_plugin_actions callback to enable_plugin 2023-02-28 12:04:51 +08:00
Andrew Nicols 77d822898a MDL-75012 js: Put shifter on a diet
This commit switches to a new custom version of Shifter which sees it
put on a massive diet.

Many of the standard Shifter features are totally unused by Moodle, but
they add dependency spaghetti. Some of those dependencies will start to
cause us issues as they have not been updated for a very long time, are
no longer maintained, and are no longer compatible with anything
resembling a recent version of NodeJS.
2023-02-28 10:22:45 +08:00
Andrew Nicols 95b47d2432 MDL-75012 js: Bump shifter to new version
This resolves an issue identified in 77083 which identified that GitHub
hashes shouldn't be treated as repeatable.

Whilst GitHub have reverted this change, it's still worth making this
change.
2023-02-28 10:19:51 +08:00
Andrew Nicols b7c2924b68 MDL-75012 js: Use our own jsdoc wrapper
grunt-jsdoc is abandoned and only works with an older version of jsdoc.

This is a very simple wrapper around jsdoc itself.
2023-02-28 10:19:51 +08:00
Andrew Nicols 73d25ec0c6 MDL-75012 js: Audit fix 2023-02-28 10:19:51 +08:00
Andrew Nicols d418ca209e MDL-75012 js: Bump node-sass 2023-02-28 10:19:51 +08:00
Andrew Nicols a1d646d621 MDL-75012 js: Update browserslist
To avoid build changes we exclude older versions of Android browser
2023-02-28 10:19:51 +08:00
Andrew Nicols e431f3a4d6 MDL-75012 js: Bump stylelint and components 2023-02-28 10:19:50 +08:00
Andrew Nicols 415c9de634 MDL-75012 js: Remove grunt-contrib-uglify
We stopped using this when we updated our processes to support ESMs in
MDL-62497. Removal of the dependency was missed at the time.
2023-02-28 10:19:50 +08:00
Andrew Nicols 86cc29f021 MDL-75012 js: Bump standard dependencies
This change bumps dependencies which have no impact upon the build
process
2023-02-28 10:19:50 +08:00
Andrew Nicols 7dc9c54ff6 MDL-75012 core: Bump NodeJS version requirements 2023-02-28 10:19:50 +08:00
Jun Pataleta 4200e6ee16 Merge branch 'MDL-76956-m400' of https://github.com/sammarshallou/moodle into MOODLE_400_STABLE 2023-02-28 10:07:27 +08:00
Paul Holden 8ce95fe759 MDL-72727 mod_forum: prevent default favourite toggle click event.
Allow the repository call to the web service method to complete before
re-directing, otherwise the call may not complete and/or races against
the page reload causing random Behat errors.
2023-02-27 23:30:40 +00:00
Paul Holden b60518501f MDL-77321 reportbuilder: cache list of loaded reports per user.
Since 0188af39 we've cached loaded reports, however there was an
edge case in those report sources that relied on the current user
as part of their own initialization (e.g. checking capabilities).

Co-authored-by: Marina Glancy <marina@moodle.com>
2023-02-27 21:21:45 +00:00
Paul Holden 3178dd5bb2 MDL-77418 mod_feedback: defensive use of analysis item data. 2023-02-27 19:21:33 +00:00
Ferran Recio e8bbcdae2c MDL-77420 core: fix modal close button on remove on close 2023-02-27 19:11:03 +01:00
Eloy Lafuente (stronk7) 0b6625e736 MDL-77417 behat: behat_error_handler meets deprecation error types
Right now, any E_DEPRECATED, E_USER_DEPRECATED error type leads
to exception in behat runs, because the behat error handled is
not aware of them. See MDL-38041 for the initial implementation.

We don't want that to happen and they must behave like other "low"
error types (notices, warnings...), that will be reported in logs
or output, but won't trigger any exception, so the test can continue.

This commit just adds those 2 "new" error types to the handler,
providing the very same behaviour for them than the rest.
2023-02-27 09:38:08 +01:00
Leon Stringer 079a2e0061 MDL-77322 oauth2: Fix basicauth checkbox
Following MDL-61880 you could turn on "Authenticate token requests via
HTTP headers" but not turn this off again.  This change fixes this and
adds a Behat scenario to test toggling this checkbox is saved
correctly.
2023-02-24 17:28:05 +00:00
Eloy Lafuente (stronk7) c0786c11c0 MDL-77097 store_mongodb: keep compatibility with PHP 7.4
Replaced 4 occurrences of get_debug_type() by gettype() to keep PHP 7.4 compatibility. Note this
has not been applied to 4.2dev and up because, there, it's safe to use get_debug_type().
2023-02-24 12:38:55 +01:00
Jun Pataleta 6458658400 weekly release 4.0.6+ 2023-02-24 15:43:29 +08:00
Jun Pataleta c3c22e7219 Merge branch 'install_400_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_400_STABLE 2023-02-24 15:43:26 +08:00
Matt Porritt d38a0b2100 MDL-77376 Licensing: Update trademark.txt
Update Trademark policy in TRADEMARK.txt to
be in line with advice from the Moodle HQ
legal team
2023-02-24 12:35:35 +08:00
Andrew Nicols 2cde600dd2 Merge branch 'MDL-76611-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-23 12:01:42 +08:00
Andrew Nicols ce4622ec99 Merge branch 'MDL-76843_400' of https://github.com/timhunt/moodle into MOODLE_400_STABLE 2023-02-23 11:53:26 +08:00
Andrew Nicols 8c455b4ad6 Merge branch 'MDL-77271-400' of https://github.com/lameze/moodle into MOODLE_400_STABLE 2023-02-23 11:49:36 +08:00
Ilya Tregubov fd5559e3d4 MDL-74433 mod_assign: Fix version.php 2023-02-23 11:47:35 +08:00
Ilya Tregubov acc02e0631 Merge branch 'MDL-74433_400' of https://github.com/larsbonczek/moodle into MOODLE_400_STABLE 2023-02-23 11:23:00 +08:00
Andrew Nicols e6ff8205f9 Merge branch 'MDL-77352-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-23 11:20:30 +08:00
Andrew Nicols c5c621dfce Merge branch 'MDL-75005_40' of https://github.com/skodak/moodle into MOODLE_400_STABLE 2023-02-23 10:29:41 +08:00
Andrew Nicols 6df8e613be MDL-77230 mod_feedback: Coding style violation fixes 2023-02-23 10:06:19 +08:00
Andrew Nicols 484516b450 Merge branch 'MDL-77230-400' of https://github.com/sarjona/moodle into MOODLE_400_STABLE 2023-02-23 10:06:16 +08:00
Ilya Tregubov 8d68d6c050 Merge branch 'MDL-76873-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-23 09:58:31 +08:00
Andrew Nicols 4a1e1081a5 Merge branch 'MDL-77210_400' of https://github.com/timhunt/moodle into MOODLE_400_STABLE 2023-02-23 09:23:07 +08:00
Andrew Nicols 72342d4c08 Merge branch 'MDL-77149-m400' of https://github.com/sammarshallou/moodle into MOODLE_400_STABLE 2023-02-23 09:21:32 +08:00
Paul Holden 6f91919237 MDL-74585 core: pass string identifier/component to network keepalive.
Avoid passing potentially large amounts of data in the page AMD call,
allow the `core/network` module to load actual string content itself.
2023-02-22 16:20:41 +00:00
Tim Hunt 467d99b7bb MDL-76843 quiz: add test to verify random essay stats now work 2023-02-22 15:12:03 +00:00
Tim Hunt 2580e7d399 MDL-76843 quiz: fix statistics questions for missing questions 2023-02-22 15:11:56 +00:00
Tim Hunt 89e2da51c9 MDL-76843 questions behat: enhancements requried to test this issue
* New steps to set up certian sorts of broken test data.
* Fix qtype_essay_question::un_summarise_response().
2023-02-22 15:10:23 +00:00
Tim Hunt 7ab289879a MDL-76298 drag-drop questions: validate the questions are complete
Previously, it was possible to create drag-drop markers and onto image
questions without any drag items or drop zones. This was non-sensical,
and broke statistics calculations.

So, missing validation added, and random guess score calculation made
robust.
2023-02-22 12:06:56 +00:00
Tim Hunt a15668409e MDL-58945 qbank: showing q text should give option of plain or full 2023-02-22 11:16:58 +00:00
Paul Holden 8c2b43f133 MDL-77352 javascript: declare debouncer outside the event handler.
It needs to be declared as such, otherwise each time the event is
triggered a new debouncer is created.
2023-02-21 22:47:58 +00:00
Paul Holden cdf532cf84 MDL-76602 mod_lti: array syntax/whitespace cleanup. 2023-02-21 17:10:22 +00:00
Paul Holden 2f794ccb3d Merge branch 'MDL-76602-400-lti13claims' of https://github.com/cengage/moodle into MOODLE_400_STABLE 2023-02-21 16:46:26 +00:00
sam marshall 3130c83f02 MDL-77149 core_files: Network filesystem (Amazon EFS) can warn
If you delete a file with a hash and then create another file with
the same hash, sometimes on EFS filesystems while trying to create
the new file, it returns true to the file_exists check even though
the file doesn't exist, but then fails other calls.

This change makes Moodle tolerate that behaviour.
2023-02-21 10:56:25 +00:00
Simey Lameze fcedef4566 MDL-77271 behat: verify user licence preference is remembered 2023-02-21 15:29:44 +08:00
AMOS bot d13319f328 Automatically generated installer lang files 2023-02-21 00:07:34 +00:00
Paul Holden f244de5a77 Merge branch 'MDL-76545-400' of https://github.com/ferranrecio/moodle into MOODLE_400_STABLE 2023-02-20 10:28:54 +00:00
Paul Holden 98c8165f6a Merge branch 'MDL-77287-400' of https://github.com/snake/moodle into MOODLE_400_STABLE 2023-02-20 09:55:09 +00:00
Audun Jørstad Lillekjendlie 4ccd18f6be MDL-77318 core: Add role attribute to user navigation div 2023-02-20 10:54:58 +01:00
Paul Holden e99051aabd MDL-76873 user: method for returning profile field instance of type.
Re-factor implementation of profile field access within user fields
class to use that already provided by the fields themselves.
2023-02-20 09:24:17 +00:00
Paul Holden 0e6bc44970 MDL-76873 reportbuilder: correct checks for profile field visibility. 2023-02-20 09:22:14 +00:00
Andrew Nicols 49af8b6508 Merge branch 'MDL-77020-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-20 09:55:18 +08:00
Ferran Recio e2e6e1407f MDL-76545 core: fix reactive debug panel
The reactive debug panel stops working when a new reactive instance is
created in the fly. This was not detected until the new dragf and drop
files into course uses a second reactive UI component in the same page.
2023-02-17 17:19:16 +01:00
Sara Arjona a47f28ee75 MDL-77230 mod_feedback: Validate feedback access
The get_items() and get_page_items() external methods should return
items only when the user has access. Otherwise, empty array for items
will be returned, with the exact error in the warnings parameter.
2023-02-17 12:43:33 +01:00
Petr Skoda 2f15514fa4 MDL-75005 core: remove invalid addslashes() 2023-02-17 09:49:45 +01:00
Jake Dallimore 831f0cf6ce MDL-77287 tool_oauth2: fix issuer form validation
This ensures validation errors from the issuer persistent are seen.
2023-02-17 15:16:11 +08:00
Ilya Tregubov cb2fa7a92d weekly release 4.0.6+ 2023-02-17 09:12:27 +08:00
Ilya Tregubov 1517a26b7e Merge branch 'install_400_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_400_STABLE 2023-02-17 09:12:24 +08:00
AMOS bot 41bd934db1 Automatically generated installer lang files 2023-02-17 00:07:47 +00:00
Paul Holden 162dfaaf85 MDL-77020 behat: refer to search input fields by name/role.
Co-authored-by: Andrew Nicols <andrew@nicols.co.uk>
2023-02-16 10:34:50 +00:00
Audun Jørstad Lillekjendlie e8cc15ecaa MDL-77020 core: Include a unique id in the search input field id 2023-02-16 10:24:45 +00:00
Andrew Nicols 31b6436f90 Merge branch 'MDL-75578-400' of https://github.com/mackensen/moodle into MOODLE_400_STABLE 2023-02-16 12:01:43 +08:00
Jun Pataleta 5a81c72bac Merge branch 'MDL-72182-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-16 11:55:44 +08:00
Jun Pataleta f291f78cab Merge branch 'MDL-76584-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-16 11:48:56 +08:00
Andrew Nicols bfddf75448 Merge branch 'MDL-74698_400' of https://github.com/jonof/moodle into MOODLE_400_STABLE 2023-02-16 11:07:04 +08:00
Ilya Tregubov fce1784938 MDL-76313 forum: code style changes. 2023-02-16 11:01:04 +08:00
Ilya Tregubov 846b0c890c Merge branch '76313-forum-improve-accessibility-400' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_400_STABLE 2023-02-16 11:00:43 +08:00
Ilya Tregubov 345c4a6a3c MDL-75379 core: Code style changes. 2023-02-16 10:50:30 +08:00
Ilya Tregubov 6c82a06f49 Merge branch 'MDL-75379_400' of https://github.com/larsbonczek/moodle into MOODLE_400_STABLE 2023-02-16 10:50:07 +08:00
Andrew Nicols f71d5a9b52 Merge branch 'MDL-76878-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-16 10:44:30 +08:00
Ilya Tregubov fe269e1bac Merge branch 'MDL-73519-400' of https://github.com/meirzamoodle/moodle into MOODLE_400_STABLE 2023-02-16 09:34:46 +08:00
Andrew Nicols 31db9d0c57 Merge branch 'MDL-76478-password-unmask-MOODLE_400_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_400_STABLE 2023-02-15 23:26:28 +08:00
Andrew Nicols 20437979e6 Merge branch 'MDL-76948_400' of https://github.com/larsbonczek/moodle into MOODLE_400_STABLE 2023-02-15 23:01:30 +08:00
Paul Holden a9b0d53459 Merge branch 'MDL-77147_400' of https://github.com/timhunt/moodle into MOODLE_400_STABLE 2023-02-15 11:49:23 +00:00
Ilya Tregubov 8d36719bc3 Merge branch 'MDL-75230-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2023-02-15 16:13:12 +08:00
Andrew Nicols f6ec6e9dce Merge branch 'MDL-77241-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-15 11:14:44 +08:00
Jun Pataleta cafd97276a Merge branch 'MDL-77223-400' of https://github.com/roland04/moodle into MOODLE_400_STABLE 2023-02-15 11:06:48 +08:00
AMOS bot 8e20336b30 Automatically generated installer lang files 2023-02-15 00:07:47 +00:00
Paul Holden 2c3c32e29e Merge branch 'MDL-75454-400' of https://github.com/davewoloszyn/moodle into MOODLE_400_STABLE 2023-02-14 15:06:05 +00:00
Paul Holden 3fced488b3 MDL-77241 course: optional chaining safety for section toggles. 2023-02-14 13:15:40 +00:00
Paul Holden 44c94ffad4 Merge branch 'MDL-63608_400' of https://github.com/AnupamaSarjoshi/moodle into MOODLE_400_STABLE 2023-02-14 11:59:56 +00:00
Ilya Tregubov b8604c273c Merge branch 'MDL-76947-400' of https://github.com/davewoloszyn/moodle into MOODLE_400_STABLE 2023-02-14 13:53:59 +08:00
David Woloszyn ea5d5ea519 MDL-75454 cache: Reduced exposure of sesskey param 2023-02-14 11:29:01 +11:00
Tim Hunt c7f1203480 MDL-77210 quiz: fix regrade for attempts with redone questions 2023-02-13 16:58:40 +00:00
Mikel Martín d57345bf06 MDL-77223 reportbuilder: Fix first report column as integer 2023-02-13 16:16:11 +01:00
Lars Bonczek 589ca9aec6 MDL-75379 core: Use non-static template cache 2023-02-13 12:37:02 +01:00
Paul Holden ebaec57bb2 MDL-76611 cohort: prevent duplicate idnumber in inplace editable. 2023-02-13 10:33:34 +00:00
Ilya Tregubov 0888a32602 Merge branch 'MDL-77189-400' of https://github.com/lameze/moodle into MOODLE_400_STABLE 2023-02-13 13:44:04 +08:00
Simey Lameze 326296c482 MDL-77189 behat: basic coverage for wikimedia repository 2023-02-13 13:23:54 +08:00
Jun Pataleta b93cb20e48 Merge branch '76314-forum-fix-forumtype-and-groupmode-validation-400' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_400_STABLE 2023-02-13 11:38:49 +08:00
Anupama Sarjoshi d7d375ed14 MDL-63608 quiz: Fix Access order when manually grading quizzes
Changes done to fix access order of attempts that need manual grading.
Changed button text from 'Save and go to next page' to 'Save and show next' to improve UI.
2023-02-10 17:44:33 +00:00
Paul Holden 44d77d0848 weekly release 4.0.6+ 2023-02-10 13:47:38 +00:00
Paul Holden 5169dd0f8b Merge branch 'install_400_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_400_STABLE 2023-02-10 13:47:36 +00:00
Julien Boulen 002ed2d867 MDL-76314 forum: add form check to prevent combining wrong parameters
Form validation prevents combining the forum type "single discussion" and the group mode "separate groups".
2023-02-10 11:07:38 +01:00
Andrew Nicols 0ebbecff73 Merge branch 'MDL-76904-400' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_400_STABLE 2023-02-09 12:04:49 +08:00
Andrew Nicols 941203b502 Merge branch 'MDL-74755-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-09 11:44:40 +08:00
Jun Pataleta 9f876fe558 Merge branch 'MDL-77052-400' of https://github.com/Utdanningsdirektoratet/moodle into MOODLE_400_STABLE 2023-02-09 11:27:04 +08:00
Andrew Nicols ebeb9a87fc Merge branch 'MDL-76354-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-09 10:59:34 +08:00
Andrew Nicols bac3842abc Merge branch 'MDL-77018_400' of https://github.com/timhunt/moodle into MOODLE_400_STABLE 2023-02-09 10:51:59 +08:00
Andrew Nicols 4efc9efd9b Merge branch 'MDL-76066-400' of https://github.com/aanabit/moodle into MOODLE_400_STABLE 2023-02-09 10:48:23 +08:00
Andrew Nicols 1278c93a06 Merge branch 'MDL-77057-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-09 10:21:23 +08:00
Andrew Nicols b7334e05db Merge branch 'MDL-76499-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2023-02-09 10:05:22 +08:00
Andrew Nicols e900f15c57 Merge branch 'MDL-70586-400' of https://github.com/sarjona/moodle into MOODLE_400_STABLE 2023-02-09 09:45:57 +08:00
Paul Holden 2b4711fdcd Merge branch 'MDL-76672-400' of https://github.com/Utdanningsdirektoratet/moodle into MOODLE_400_STABLE 2023-02-08 14:57:38 +00:00
Paul Holden 16d81dabab Merge branch 'MDL-76542-400' of https://github.com/lameze/moodle into MOODLE_400_STABLE 2023-02-08 14:22:12 +00:00
Simey Lameze e844d6d366 MDL-76542 behat: add step to go to user edit page directly 2023-02-08 20:55:43 +08:00
Simey Lameze 28c1597e5a MDL-76542 behat: create custom profile fields using data generators
This commit also adds a new test to verify the custom profile fields
works using the user interface.
2023-02-08 20:55:43 +08:00
Paul Holden 8c08aeb863 Merge branch 'MDL-73692-400-Add-support-for-missing-timestamps-to-rss-block' of https://github.com/melanietreitinger/moodle into MOODLE_400_STABLE 2023-02-08 11:22:52 +00:00
Melanie Treitinger 1914fe6604 MDL-73692 blocks: Add support for missing timestamps to rss block. 2023-02-08 11:16:06 +01:00
Jun Pataleta b0cc1c096a Merge branch 'MDL-74905_400' of https://github.com/stronk7/moodle into MOODLE_400_STABLE 2023-02-08 17:19:18 +08:00
Angelia Dela Cruz 61737d06c5 MDL-75230 behat: Lesson Behat tests optimised
Replace steps that manually add Lesson instances via the UI and use
Behat generators. This improves the speed of the Behat test runs.
2023-02-08 16:59:18 +08:00
Lars Bonczek 45b117f8e7 MDL-74433 mod_assign: Fix logging of submission removal 2023-02-07 12:38:03 +01:00
Andrew Nicols db37e1eb58 Merge branch 'MDL-77023-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-07 12:48:23 +08:00
Andrew Nicols feb10fbea9 Merge branch 'MDL-77123-400' of https://github.com/cameron1729/moodle into MOODLE_400_STABLE 2023-02-07 12:40:48 +08:00
Andrew Nicols d2306d35c6 Merge branch 'mdl-76729_400' of https://github.com/james-cnz/moodle into MOODLE_400_STABLE 2023-02-07 12:37:32 +08:00
Paul Holden ddff113f3b Merge branch 'MDL-77078-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2023-02-06 13:33:06 +00:00
Audun Jørstad Lillekjendlie b9a36a1562 MDL-76672 block_myoverview: add role attribute for filter div 2023-02-06 14:07:00 +01:00
Tim Hunt 5dd03dc296 MDL-77147 question admin: optimised the query in admin/qtypes.php 2023-02-06 12:48:16 +00:00
Audun Jørstad Lillekjendlie 5563c74c95 MDL-77052 block_recentlyaccesseditems: HTML role attribute
HTML elements with role=list must contain children with role=listitem
2023-02-06 13:47:35 +01:00
Paul Holden 7aacb04321 Merge branch 'MDL-76370-publicpaths-proxying-MOODLE_400_STABLE' of https://github.com/jaydn/moodle into MOODLE_400_STABLE 2023-02-06 11:02:48 +00:00
Marina Glancy 073901d019 MDL-72182 my: tests for resetting dashboard
Co-authored-by: Paul Holden <paulh@moodle.com>
2023-02-06 09:34:32 +00:00
Paul Holden cd7ec775ae MDL-72182 user: cross-DB compatibility for getting user pages/blocks. 2023-02-06 09:34:32 +00:00
Paul Holden 3419329a12 MDL-74755 block_accessreview: stricter checking of enabled config. 2023-02-06 09:31:45 +00:00
David Woloszyn 7821816fdd MDL-76947 css: Fixed layout regression on dropdown menus 2023-02-06 16:05:40 +11:00
Andrew Nicols 93f6ce8bfe Merge branch 'MDL-77091-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-06 12:59:46 +08:00
Angelia Dela Cruz 584c42e14d MDL-77078 Behat: Coverage for assignment submission statement 2023-02-06 11:32:11 +08:00
AMOS bot a252f3ca77 Automatically generated installer lang files 2023-02-06 00:07:37 +00:00
Andrew Nicols fecc3e0fa1 Merge branch 'MDL-76662-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-04 21:52:25 +08:00
Eloy Lafuente (stronk7) 2756ebfc7c MDL-74905 ci: travis and gha, some adjustments
Apply for some of the improvements made for 4.2:
- Use our own moodlehq/mysql-action
- Define the tmpfs size and ensure that binlogs are disabled.
2023-02-03 19:48:10 +01:00
Eloy Lafuente (stronk7) a279eba2f1 MDL-74905 environment: Apply agreed changes:
- PHP 8.0 required.
- Moodle 3.11.8 required (first minor supporting PHP 8.0 officially).
- MySQL 8.0 required.
- MariaDB 10.6.7 required.
- PostgreSQL 13 required.
- php-sodium extension required.
- 64-bit PHP required.
2023-02-03 19:48:10 +01:00
Eloy Lafuente (stronk7) 5160aa199e MDL-74905 environment: 4.2 base information
This is a direct copy of the 4.1 information, to
have all the real changes under control in next commit(s).
2023-02-03 19:48:10 +01:00
Paul Holden f2a4f26708 Merge branch 'MDL-76869-400' of https://github.com/cameron1729/moodle into MOODLE_400_STABLE 2023-02-03 14:58:31 +00:00
Paul Holden 21ebba9e39 Merge branch 'MDL-77090_400' of https://github.com/timhunt/moodle into MOODLE_400_STABLE 2023-02-03 14:46:54 +00:00
Tim Hunt 23e26675ff MDL-77090 questions: regrade of interactive attempts lose tries count
The behaviour-specific data was getting corrupted when the regrade
recreated the first step, because $oldstep->get_behaviour_data() was
stripping off the leading '-' characters from the names, and they were
not being added back.
2023-02-03 10:53:56 +00:00
Jun Pataleta a2b88160d7 weekly release 4.0.6+ 2023-02-03 15:43:41 +08:00
Angelia Dela Cruz edc5b03aa1 MDL-76499 behat: Resource Behat tests optimised
Replace steps that manually add resource instances via the UI and use
Behat generators. This improves the speed of the Behat test runs.

Co-authored-by: David Woloszyn <david.woloszyn@moodle.com>
2023-02-03 14:09:46 +08:00
Jonathon Fowler 36c92bc955 MDL-74698 backup: correctly restore course format options
Old-version backups (< 3.11.7, < 4.0.1) lose their course-level format
options when restoring into newer versions after the backup structure
was changed.

Also, course-level format options were not accurately restored against
the appropriate format type. And section-level format options were
redundantly stored at course-level and restored without mapping their
sectionids, thus creating lint.
2023-02-03 10:22:09 +10:00
Andrew Nicols 0004ba1d1b Merge branch 'MDL-75345-400-fix' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-02 22:01:04 +08:00
Paul Holden bdb6fb7baf MDL-75345 reportbuilder: remove course summary filter checks. 2023-02-02 13:48:49 +00:00
Cameron Ball d92966f83e MDL-77123 message_airnotifier: Don't test configured providers 2023-02-02 14:50:02 +08:00
Andrew Nicols 70fdaa51aa Merge branch 'MDL-75870-400' of https://github.com/nwp90/moodle into MOODLE_400_STABLE 2023-02-02 12:34:53 +08:00
Andrew Nicols 16e2822e90 Merge branch 'MDL-75085-400-4' of https://github.com/junpataleta/moodle into MOODLE_400_STABLE 2023-02-02 12:04:05 +08:00
Andrew Nicols 9842833fc1 Merge branch 'MDL-75830-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2023-02-02 11:58:31 +08:00
Andrew Nicols 69395127e0 Merge branch 'MDL-77024_400' of https://github.com/timhunt/moodle into MOODLE_400_STABLE 2023-02-02 11:52:59 +08:00
Andrew Nicols c1bc2d4dd2 Merge branch 'MDL-76675_400' of https://github.com/stronk7/moodle into MOODLE_400_STABLE 2023-02-02 11:04:12 +08:00
Jun Pataleta a4a9984650 Merge branch 'MDL-69690-400' of https://github.com/ilyatregubov/moodle into MOODLE_400_STABLE 2023-02-02 10:31:49 +08:00
Jun Pataleta 0b0874b063 Merge branch 'MDL-77092-m400' of https://github.com/sammarshallou/moodle into MOODLE_400_STABLE 2023-02-02 09:56:59 +08:00
Andrew Nicols 9c3af6a9ae Merge branch 'MDL-75912-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2023-02-02 09:44:43 +08:00
Ilya Tregubov cf6901bb9c Merge branch 'MDL-77079-400' of https://github.com/lameze/moodle into MOODLE_400_STABLE 2023-02-02 09:17:22 +08:00
Jun Pataleta 37da5b7176 MDL-75085 mod: Pass proper $required param value external_format_value 2023-02-02 09:05:27 +08:00
Jun Pataleta f829545013 MDL-75085 external: Pass proper $required param value in tests 2023-02-02 09:05:27 +08:00
Angelia Dela Cruz b79f853484 MDL-75830 behat: Book behat tests optimised
Replace steps that manually add Book instances via the UI and use
Behat generators. This improves the speed of the Behat test runs.
Additionally, performed Behat cleanup and optimisation to affected
files.
2023-02-02 09:03:42 +08:00
Andrew Nicols d851bb1ad3 Merge branch 'MDL-77003-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-02 08:21:23 +08:00
Andrew Nicols 720007a54c Merge branch 'MDL-75345-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-02-02 08:18:38 +08:00
Nick Phillips 5d7411d864 MDL-75870 course: only section togglers to toggle sections 2023-02-02 11:32:15 +13:00
Paul Holden 7e4ef00e6d Merge branch 'MDL-76658-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2023-02-01 16:34:41 +00:00
Paul Holden 6299d39bf2 MDL-75345 reportbuilder: improve course/user custom report tests.
Ensure column and filters provided by each source have sufficient
coverage. Re-factor individual entity/helper class tests to test
their own specific implementation only.

Remove now-defunct test fixtures.
2023-02-01 15:41:24 +00:00
Paul Holden b56a5e0dfb MDL-77091 reportbuilder: set base time in schedule test generator.
The base time allows for the setting of the "current time" for the
purposes of the schedule test against recurrence configuration.

We should ensure the generator method allows this property so that
it can be used when calculating the initial "next send time" of the
schedule upon creation (and avoiding excessive recursion when the
actual current time is used for the calculation).
2023-02-01 14:39:44 +00:00
Paul Holden 6be9700e32 Merge branch 'MDL-76311-400' of https://github.com/meirzamoodle/moodle into MOODLE_400_STABLE 2023-02-01 14:16:19 +00:00
Meirza 4369ac81a7 MDL-76311 user: redirect to proper URL if a new user creation cancelled 2023-02-01 20:13:22 +07:00
Sara Arjona 4f5795037e MDL-70586 mod_feedback: Hide the Preview questions icon for students
The Preview questions icon shouldn't be displayed unless the user can
edit the feedback or access to the reports; otherwise, it's causing
confusion (especially when the feedback is not opened).
2023-02-01 12:36:29 +01:00
Paul Holden b3e9ba1785 Merge branch 'MDL-73847_400' of https://github.com/jonof/moodle into MOODLE_400_STABLE 2023-02-01 10:00:29 +00:00
Jun Pataleta fc88017acf Merge branch 'MDL-76985-MOODLE_400_STABLE' of https://github.com/sh-csg/moodle into MOODLE_400_STABLE 2023-02-01 14:10:36 +08:00
Ilya Tregubov 4f0c9f4f4b Merge branch 'MDL-76587-400' of https://github.com/lameze/moodle into MOODLE_400_STABLE 2023-02-01 13:26:19 +08:00
Jun Pataleta 74bde5fb35 MDL-75085 external: Fix external_multiple_structure parameter passing
Some calls to the external_multiple_structure's constructor incorrectly
pass parameters where the value for the $description parameter is not
being passed. This results to invalid values being passed for the
$required parameter.
2023-02-01 12:29:08 +08:00
Jun Pataleta 58bef2f34e MDL-75085 webservice: Fix parameter passed to external_format_value 2023-02-01 12:29:08 +08:00
Angelia Dela Cruz f4965f1c72 MDL-75912 behat: Wiki behat generators use UI
Behat cleanup and optimisation
2023-02-01 11:22:35 +08:00
Angelia Dela Cruz f5666cffda MDL-75912 behat: Wiki Behat tests now use generators
Replace steps that manually add Wiki instances via the UI and use
Behat generators. This improves the speed of the Behat test runs.
2023-02-01 11:21:36 +08:00
Simey Lameze ebd0c7fe8c MDL-77079 behat: use different step to validate presets table data 2023-02-01 09:04:01 +08:00
Tim Hunt 73a7a74d92 MDL-77094 quiz_statistics: improve efficiency of the recalculate task
quiz_settings::create() requires at least 3 DB queries, so the point is
that we can avoid doing that until after we have worked out if we need
to calculate statistics for this quiz.

Also, we order the list of quizzes to consier, to process the ones with
more recent attempts first.
2023-01-31 17:02:57 +00:00
Julien Boulen ae60dd25f6 MDL-76945 theme: fix the rendering of arrows on dropdown variants 2023-01-31 15:21:53 +01:00
sam marshall 029e6e7d89 MDL-77092 Behat: Expand all fieldsets fails with single fieldset
The Behat step to expand all fieldsets did not work if the page
contains only one fieldset.
2023-01-31 13:59:12 +00:00
Angelia Dela Cruz e8719fd65a MDL-76658 Behat: Coverage for course cohort enrolment groups
Co-authored-by: Simey Lameze <simey@moodle.com>
2023-01-31 19:23:54 +08:00
Ilya Tregubov c499c7079f Merge branch 'MDL-77077-400' of https://github.com/snake/moodle into MOODLE_400_STABLE 2023-01-31 18:14:17 +08:00
hieuvu 66c35154b8 MDL-76904 question: Keep question highlight in url 2023-01-31 16:39:56 +07:00
Simey Lameze b11dbf60c0 MDL-76587 behat: make grading page wider to avoid 'out of bounds' fail
This is because on classic theme the navigation block pushes the content
to the right and once behat changes the grades the 'Save changes' button
is no longer visible.
2023-01-31 11:20:13 +08:00
Charles Fulton 4400c34168 MDL-75578 course: require course library to resolve namespace issues 2023-01-30 10:45:48 -05:00
Jake Dallimore 365fff0ff2 MDL-77077 mod_lti: Fix JWT signature verify when alg missing from JWKS
Infer the algorithm, where necessary, using a combination of JWT
headers and known valid LTI algorithms.
2023-01-30 16:45:35 +08:00
Andrew Nicols 0386f27ba1 Merge branch 'MDL-77040-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-01-30 12:28:21 +08:00
Tim Hunt a493821bcc MDL-77018 qbank_statistics: only load stats for contexts that exist
Also, pre-load the contexts for efficiency.
2023-01-27 20:52:33 +00:00
Paul Holden d3d62a087b MDL-77057 group: format group names in module override pages. 2023-01-27 11:50:52 +00:00
Eloy Lafuente (stronk7) 45730b9a07 MDL-76675 date: Only test all TZ names with PHPUNIT_LONGTEST enabled
It happens often that some timezone is renamed, split, added to the
IANAs list of timezones (that, for PHP is kept updated by the
php-timezonedb PECL extension).

When the information coming from the extension changes, all the
PHPUnit jobs in the world start failing (that's when CIs update
their PHP images, when devs update their packages, ...).

So, what we are doing here is to move that test that check for
every single string existing to be run only when PHPUNIT_LONGTEST
is enabled. That way only places running all tests will run that
one. And every other run just will skip it.

This corresponds to point 1 & 2 of the issue, lower impact in general
and, still be able to enable the tests to run.
2023-01-27 08:49:36 +01:00
Andrew Nicols a73cddb9f9 Merge branch 'MDL-75978-400' of https://github.com/JBThong/moodle into MOODLE_400_STABLE 2023-01-27 13:11:22 +08:00
Paul Holden 83bb155b67 MDL-77040 core: assert types of returned Geoplugin data, not values.
The results we get from these tests are beyond our control, and are
unreliable for use in testing.

See also previous change 215cd2d8 in similar tests.
2023-01-26 13:24:11 +00:00
Paul Holden 8f8cea4f03 MDL-76662 tool_log: correct supported reports test assertions. 2023-01-26 13:09:08 +00:00
Davo Smith f95c68c141 MDL-76938 backup: fix restore of comments linked to a course format 2023-01-26 12:33:24 +00:00
Sara Arjona f5ec0df5d5 weekly release 4.0.6+ 2023-01-26 09:59:17 +01:00
Lars Bonczek 539b6b6c85 MDL-76948 mod_assign: Fix description of submission_unlocked event 2023-01-25 19:21:43 +01:00
Tim Hunt 28226981fc MDL-77024 quiz: fix metatdata on log events
Some had the wrong edulevel or crud
2023-01-25 16:13:34 +00:00
Jun Pataleta fa558bdbdc Merge branch 'MDL-76977-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-01-25 16:10:03 +08:00
Jun Pataleta f5babd9a75 Merge branch 'MDL-77036-400' of https://github.com/lameze/moodle into MOODLE_400_STABLE 2023-01-25 16:02:11 +08:00
Stefan Hanauska f8a081f660 MDL-76985 course: Redirect to moved section 2023-01-25 09:00:39 +01:00
Simey Lameze a0115a8578 MDL-77036 core_iplookup: update test_ipv4 test expectations 2023-01-25 15:15:22 +08:00
Paul Holden 1d8744377f MDL-77003 javascript: improve string helper JSON detection.
Changes in fbc2732d made the JS template string helper method
too strict in regards to what it considers a valid JSON object.

Co-authored-by: Mike Churchward <mike@brickfieldlabs.ie>
2023-01-24 22:16:26 +00:00
Paul Holden 7d9c52b6bd MDL-77023 javascript: always normalise component of lang strings.
Co-authored-by: David Matamoros <davidmc@moodle.com>
2023-01-24 16:44:13 +00:00
Jun Pataleta 21aba2fb63 Merge branch 'MDL-76639-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2023-01-24 18:59:21 +08:00
Jun Pataleta d5f6993327 Merge branch 'MDL-76652-400' of https://github.com/lameze/moodle into MOODLE_400_STABLE 2023-01-24 18:45:12 +08:00
Jun Pataleta 9f6fcd1e47 Merge branch 'MDL-76655-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2023-01-24 18:26:53 +08:00
Angelia Dela Cruz 9c4637c086 MDL-76655 behat: Coverage for workshop grading strategies 2023-01-24 09:37:59 +08:00
Paul Holden a5fb38a57c MDL-76354 competency: export user privacy data unconditionally.
We should ensure that any past competency data for a user is always
exported, regardless whether competencies are currently enabled.
2023-01-23 22:15:29 +00:00
Amaia Anabitarte 72773d10f6 MDL-76066 mod_data: Trigger field_deleted event when importing 2023-01-23 18:55:13 +01:00
sam marshall e926de79f3 MDL-76956 core_grades: Regrade progress bar should be more granular
This change makes the regrade progress bar send frequent updates to
the web browser, even when processing within the same grade item, to
avoid timeout problems when there are a large number of users.
2023-01-23 11:42:14 +00:00
Paul Holden 1037818475 MDL-76584 question: correct temporary questionid upgrade field.
Pass correct parameter/type in field constructor (`XMLDB_NOTNULL`)
for consistency. This corrects the definition and preserves the
truthyness of the value that was incorrectly passed previously.
2023-01-23 09:16:32 +00:00
Paul Holden 93a6761b9e MDL-76977 phpunit: ensure unique data provider keys in mustache test. 2023-01-20 17:21:36 +00:00
Ilya Tregubov 13bc06e37d weekly release 4.0.6+ 2023-01-20 09:41:46 +08:00
Paul Holden e961a93ee8 MDL-76878 user: amend permission callbacks for preference definitions.
Ensure those preferences that are used for storing state can always be
updated via web service requests for the current user.
2023-01-19 15:28:52 +00:00
Jun Pataleta 6cec3844dc Merge branch 'MDL-76725-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-01-19 12:04:57 +08:00
Ilya Tregubov 3c44c156e6 Merge branch 'MDL-76870-400' of https://github.com/lameze/moodle into MOODLE_400_STABLE 2023-01-19 11:15:35 +08:00
Ilya Tregubov cd685999fa Merge branch 'MDL-76766-400' of https://github.com/aanabit/moodle into MOODLE_400_STABLE 2023-01-19 11:04:47 +08:00
Ilya Tregubov 56dc60887c Merge branch 'MDL-74756-MOODLE_400_STABLE' of https://github.com/sh-csg/moodle into MOODLE_400_STABLE 2023-01-19 10:31:06 +08:00
Andrew Nicols 76bb28ab0b Merge branch 'MDL-76841-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-01-19 08:55:28 +08:00
Andrew Nicols f28a05b21c Merge branch 'MDL-70070-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-01-19 08:50:58 +08:00
Jun Pataleta c7f189da0f Merge branch 'MDL-76525-MOODLE_400_STABLE' of https://github.com/PhMemmel/moodle into MOODLE_400_STABLE 2023-01-18 22:55:31 +08:00
Philipp Memmel 69d187f94b MDL-76525 mod_data: Add param validation for data fields 2023-01-18 12:12:37 +01:00
Claude Vervoort 644d3a5b3f MDL-76602 mod_lti: move lti13 claim declaration in subplugin 2023-01-17 16:56:58 -05:00
Jake Dallimore 963379d7a8 Merge branch 'MDL-66221-400' of https://github.com/raortegar/moodle into MOODLE_400_STABLE 2023-01-17 11:29:22 +08:00
Stefan Hanauska 366e1fae05 MDL-74756 availability_completion: Prev activity (completion n/enabled) 2023-01-16 22:20:42 +01:00
Paul Holden a8e796311e MDL-76841 tool_mobile: improve potential config issues test.
Avoid certificate checking of the default test site (`example.com`),
and update the assertion so we get clearer failures in the future.
2023-01-16 08:30:36 +00:00
Paul Holden dcb19eebc2 MDL-70070 phpunit: correct data provider method names.
They should not be prefixed `test_` because that's how actual
test methods containing assertions are identified by PHPUnit.
2023-01-16 08:28:25 +00:00
Jaydn Cunningham 5ed130b575 MDL-76370 curl: suppress CONNECT header when using HTTP proxy 2023-01-16 14:17:09 +10:30
Jonathon Fowler 587c9406a3 MDL-73847 lti: fetch keyset URLs using configured proxy settings 2023-01-16 10:00:26 +10:00
Jun Pataleta b864c78a31 Moodle release 4.0.6 2023-01-14 14:17:09 +08:00
raortegar f2a95bf7fa MDL-66221 tool_recyclebin: Fix recycle bin with activity settings
If backup_auto_activities setting from Automated backup is disabled
the activities will not be stored for the recycle bin
2023-01-13 11:31:57 +01:00
Simey Lameze 914e611bd1 MDL-76870 question: change assertion to assertEqualsCanonicalizing
By using that assertion the arrays will be sorted before comparison
preventing any Oracle sorting related failures.

Credits for the solution go to Tim Hunt!
2023-01-13 18:13:19 +08:00
Angelia Dela Cruz e6eb08a448 MDL-76639 behat: Add Behat test coverage for quiz with limited attempts 2023-01-13 16:29:43 +08:00
Jun Pataleta 5b81c07712 weekly release 4.0.5+ 2023-01-13 10:52:19 +08:00
Cameron Ball 4269b654b6 MDL-76869 gradebook: Pass exception to rollback 2023-01-12 16:35:54 +08:00
Ilya Tregubov f52cc16d34 MDL-69690 mod_workshop: Fix fieldname for workshop. 2023-01-12 14:42:24 +07:00
Andrew Nicols 7299eb910d Merge branch 'MDL-76820-400' of https://github.com/cameron1729/moodle into MOODLE_400_STABLE 2023-01-12 12:09:48 +08:00
Jun Pataleta 43bfcc4c77 Merge branch 'MDL-76649_400' of https://github.com/timhunt/moodle into MOODLE_400_STABLE 2023-01-12 12:06:54 +08:00
Michael Hawkins 044e23f691 MDL-76861 blog: Ensure correct escaping applied to search string 2023-01-12 11:43:22 +08:00
Jake Dallimore 8a5563445d MDL-76862 user: Unit test for setting user home page preferences 2023-01-12 11:30:46 +08:00
Paul Holden 8de0b97f7d MDL-76862 user: ensure user can only update own preferred start page. 2023-01-12 11:17:00 +08:00
Cameron Ball 8ee9748839 MDL-76820 core_search: Reset manager::$coursedeleting between tests 2023-01-12 10:54:50 +08:00
Jun Pataleta 2d82b93072 Merge branch 'MDL-76739-400' of https://github.com/junpataleta/moodle into MOODLE_400_STABLE 2023-01-12 10:17:52 +08:00
Jun Pataleta a387d795f7 MDL-76739 mod_data: Replace "Author surname" with "Author last name"
For consistency with the rest of the lang strings
2023-01-12 09:59:50 +08:00
Jun Pataleta 80d8f7f1be MDL-76739 behat: Replace occurrences of "surname" in Behat tests
Replace occurrences of "surname" in Behat tests with "last name".
2023-01-12 09:49:57 +08:00
David Mudrák bb82843548 MDL-76739 lang: Use the fixed strings in the tests, too 2023-01-11 18:54:57 +01:00
Helen Foster 3463f7fa5d MDL-76739 lang: Import fixed English strings (en_fix) 2023-01-11 18:54:57 +01:00
Ilya Tregubov 005814360f Merge branch 'MDL-76607-400' of https://github.com/davewoloszyn/moodle into MOODLE_400_STABLE 2023-01-11 19:18:48 +07:00
Amaia Anabitarte 5aae7cc4aa MDL-76766 mod_quiz: Allow shuffling quizes with no questions 2023-01-11 11:16:36 +01:00
Andrew Nicols 8e9e4ca362 Merge branch '66924-view-own-private-reply-400' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_400_STABLE 2023-01-11 15:53:40 +08:00
Tim Hunt 799f7fb18f MDL-76810 redirect handling: ensure return URLs are properly sanitised 2023-01-11 11:43:45 +08:00
Jake Dallimore 978a6bb8ec Merge branch 'MDL-76597-400-2' of https://github.com/junpataleta/moodle into MOODLE_400_STABLE 2023-01-11 10:12:33 +08:00
Paul Holden 7405121cd2 Merge branch 'MDL-76811-400' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2023-01-10 16:40:06 +00:00
Paul Holden aa40f64f98 Merge branch 'MDL-76803-400' of https://github.com/junpataleta/moodle into MOODLE_400_STABLE 2023-01-10 16:24:04 +00:00
Paul Holden b7baec898a Merge branch 'MDL-76653-400' of https://github.com/lameze/moodle into MOODLE_400_STABLE 2023-01-10 15:29:16 +00:00
Paul Holden aeabe6324b Merge branch 'MDL-76833-400' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2023-01-10 12:29:18 +00:00
Julien Boulen ad87801d2d MDL-76313 forum: improve accessibility on subscribers page
- add header on table of subscribers
- remove one redundant header
2023-01-10 11:17:16 +01:00
Jun Pataleta c445846da4 MDL-76803 lang: Update usages of reworded email display options 2023-01-10 16:01:51 +08:00
Jun Pataleta 8376eec99d MDL-76803 lang: Make email display options more concise 2023-01-10 16:01:51 +08:00
Meirza 46cb0bc324 MDL-73519 core_course: re-styling the unordered list.
Currently, the unordered list in the course content follows the original style and
is ordered from the top of the content section, which is not part of the description.
That's why the first occurrence of the list is the 2nd level which uses the circle as the marker/list type
instead of the disc. In contrast, the editor always uses the original style.

so we need to reset the CSS of the unordered list in the description to the original
which the disc as the first marker, a circle for the second marker,
and a square for the following levels.
2023-01-10 12:18:29 +07:00
Andrew Nicols a20c78d894 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 fe6d102184 MDL-76811 mod_data: Remove duplicate tests 2023-01-10 11:39:40 +08:00
Andrew Nicols e719cbb687 MDL-76811 mod_data: strpos check should be strict 2023-01-10 11:39:40 +08:00
Andrew Nicols b5cce2514d MDL-76811 mod_data: Generator test cleanup 2023-01-10 11:39:40 +08:00
Simey Lameze 81ff190dfb MDL-76653 behat: add coverage for SCORM availability 2023-01-10 10:25:55 +08:00
Jun Pataleta 7268fe0424 Merge branch 'MDL-76061-MOODLE_400_STABLE' of https://github.com/PhMemmel/moodle into MOODLE_400_STABLE 2023-01-10 09:42:10 +08:00
james-cnz 77e664ce4a MDL-76729 filepicker: Restore file picker thumbnails in tree view 2023-01-10 11:49:28 +13:00
Philipp Memmel c2b7e33b5d MDL-76061 core_calendar: Fix changing event type from 'user' 2023-01-09 15:06:09 +01:00
Tim Hunt 0dcd79d2e8 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:46:29 +00:00
Julien Boulen 918b7c9c87 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:45 +01:00
Paul Holden 06634f0add Merge branch 'MDL-75532-400' of https://github.com/snake/moodle into MOODLE_400_STABLE 2023-01-09 11:51:00 +00:00
Paul Holden d7ba5b5d6f Merge branch 'MDL-76601-400' of https://github.com/junpataleta/moodle into MOODLE_400_STABLE 2023-01-09 10:11:07 +00:00
Jun Pataleta a61a86c61d MDL-76597 mod_quiz: Add a default heading name for Behat tests 2023-01-09 15:42:57 +08:00
Jake Dallimore 673faab506 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:37:14 +08:00
Jake Dallimore 3a8149ccc2 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:37:14 +08:00
Simey Lameze ac754da8f2 MDL-76652 behat: use data generator and remove duplicated steps 2023-01-09 10:17:04 +08:00
Simey Lameze 492a8726e2 MDL-76652 behat: add coverage for postwithoutthrottling logic 2023-01-09 10:17:04 +08:00
Jun Pataleta 4d64b0b5fe 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-06 22:55:13 +08:00
Jun Pataleta 58d350d53d MDL-76597 question: Add question version lang string 2023-01-06 22:55:12 +08:00
Jun Pataleta 7ad4bc126b MDL-76597 mod_quiz: Add label for question checkboxes 2023-01-06 22:55:12 +08:00
Jun Pataleta dac806d47d MDL-76597 mod_quiz: Darken section heading on quiz questions page 2023-01-06 22:55:12 +08:00
Jun Pataleta 5ea303bacb MDL-76597 mod_quiz: Add label for version selector 2023-01-06 22:55:12 +08:00
Jun Pataleta d597211fa6 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-06 22:55:12 +08:00
Paul Holden fcea42b77e Merge branch 'MDL-32114-400' of https://github.com/srobotta/moodle into MOODLE_400_STABLE 2023-01-06 11:20:48 +00:00
Paul Holden 9b7854dbad Merge branch 'MDL-76578-400' of https://github.com/aanabit/moodle into MOODLE_400_STABLE 2023-01-06 10:41:37 +00:00
Ilya Tregubov 500bde134f Merge branch 'MDL-76251-patch-400' of https://github.com/ilyatregubov/moodle into MOODLE_400_STABLE 2023-01-06 16:15:06 +07:00
Ilya Tregubov dc230cf98e MDL-76251 mod_forum: Fix illegal whitespace. 2023-01-06 16:13:37 +07:00
Ilya Tregubov dc516a038e Merge branch 'MDL-76251-400' of https://github.com/aya-saad1/moodle into MOODLE_400_STABLE 2023-01-06 15:38:19 +07:00
Stephan Robotta bd1d89a94a 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:58 +01:00
Andrew Nicols 7d4104a8eb Merge branch 'MDL-76508-400' of https://github.com/meirzamoodle/moodle into MOODLE_400_STABLE 2023-01-05 21:31:14 +08:00
Paul Holden da216a5545 weekly release 4.0.5+ 2023-01-05 10:53:13 +00:00
Aya Saad 08d0ea0aad MDL-76251 mod_forum: fix responsive issues in discussion 2023-01-05 11:35:44 +02:00
David Woloszyn 50c1e2507d MDL-76607 timeline: Reordered message to account for long course name 2023-01-05 12:13:39 +11:00
David Woloszyn ec71e226d4 MDL-76607 css: Fixed various classes where long strings break layout 2023-01-05 12:13:39 +11:00
Sara Arjona 9b11c29932 Merge branch 'MDL-76375-400' of https://github.com/lucaboesch/moodle into MOODLE_400_STABLE 2023-01-04 16:21:51 +01:00
Luca Bösch 2af81f271d MDL-76375 quiz generator: Allow more than one attempt by Behat tests. 2023-01-04 15:16:30 +01:00
Paul Holden a7d6f79bdd MDL-76725 mod_wiki: avoid named arguments in real path callback.
See also f4fb91ae. PHP8 now supports named arguments in calls to
the `call_user_func_array` method, which can result in differing
behaviour compared to PHP7, e.g. in this case it was throwing an
exception due to an unknown named parameter.
2023-01-04 14:08:06 +00:00
Sara Arjona 1fa5b0c03c Merge branch 'MDL-76221-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-01-04 13:09:46 +01:00
Paul Holden 160019f2e3 MDL-76657 grade: load required test libraries for grade helper. 2023-01-04 11:22:51 +00:00
Paul Holden 8412f2adb0 Merge branch 'MDL-76657-400' of https://github.com/rezaies/moodle into MOODLE_400_STABLE 2023-01-04 11:10:43 +00:00
Jun Pataleta 1d3bd4e102 Merge branch 'MDL-74822-400' of https://github.com/HuongNV13/moodle into MOODLE_400_STABLE 2023-01-04 17:29:11 +08:00
Jun Pataleta 54e2850687 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:46 +08:00
Jun Pataleta 1c1f42d5d3 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:46 +08:00
Sara Arjona d070caea1a Merge branch 'MDL-76181-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-01-04 09:20:25 +01:00
Sara Arjona dd6549e0be Merge branch 'MDL-76308-400' of https://github.com/BruceGoodGuy/moodle into MOODLE_400_STABLE 2023-01-03 14:13:05 +01:00
Paul Holden 0b66c7a43a Merge branch 'MDL-53137-400' of https://github.com/lucisgit/moodle into MOODLE_400_STABLE 2023-01-03 12:14:43 +00:00
Sara Arjona 093b2d9eb5 Merge branch 'MDL-71506-400' of https://github.com/lucaboesch/moodle into MOODLE_400_STABLE 2023-01-03 13:10:22 +01:00
Paul Holden 7172bf1f73 Merge branch 'MDL-75346-reset_dashboard_error-400' of https://github.com/leonstr/moodle into MOODLE_400_STABLE 2023-01-03 11:28:33 +00:00
Shamim Rezaie 540ce30050 MDL-76657 gradebook: Remove hard-coded plugin names from unit test 2023-01-03 20:33:17 +11:00
Andrew Nicols 4fb6de6324 MDL-32105 mod_glossary: Improve behat test 2023-01-03 15:32:39 +08:00
Andrew Nicols d9d1cd7c55 Merge branch 'MDL-32105-400' of https://github.com/Chocolate-lightning/moodle into MOODLE_400_STABLE 2023-01-03 15:32:36 +08:00
Peter 6774281d65 MDL-32105 mod_glossary: Restrict glossary aliases by set of keywords 2023-01-03 13:49:09 +08:00
Huong Nguyen e22131aa8f 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:32 +07:00
Sara Arjona 81ecef2c1b Merge branch 'MDL-60038-400' of https://github.com/aneno-m-e/moodle into MOODLE_400_STABLE 2023-01-02 16:35:30 +01:00
Luca Bösch d0e3eb464a MDL-71506 mod_choice: suppress non respondents in downloads if set so. 2023-01-02 15:52:47 +01:00
Sara Arjona 5e439eefde Merge branch 'MDL-76106-400' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_400_STABLE 2023-01-02 13:07:45 +01:00
Sara Arjona d066f500bf Merge branch 'MDL-76760-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2023-01-02 12:27:46 +01:00
Paul Holden bb898838d6 MDL-76221 reportbuilder: improve report test generator methods.
Test generators for creating report columns, filters and conditions
now allow for setting all persistent properties.
2022-12-29 14:02:32 +00:00
Paul Holden 81cc2e6b41 MDL-76181 reportbuilder: sort columns during stress testing. 2022-12-29 13:57:42 +00:00
Sara Arjona fcfc240a77 weekly release 4.0.5+ 2022-12-29 12:57:50 +01:00
Sara Arjona f3fee9f4d2 Merge branch 'MDL-76399-patch-400' of https://github.com/ilyatregubov/moodle into MOODLE_400_STABLE 2022-12-29 09:13:39 +01:00
Ilya Tregubov 302610302a MDL-76399 behat: switch to appropriate Behat step for selects. 2022-12-29 14:45:00 +07:00
Ilya Tregubov fa417ba8a3 Merge branch 'MDL-76399-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-29 09:44:00 +07:00
Sara Arjona 9d14b80f5b Merge branch 'MDL-76004-400' of https://github.com/aanabit/moodle into MOODLE_400_STABLE 2022-12-28 18:22:40 +01:00
Sara Arjona bdbd1b3af0 Merge branch 'MDL-72523-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-28 13:01:45 +01:00
Paul Holden 2b6ca7e207 MDL-72523 calendar: return original focus from event modals. 2022-12-28 11:14:50 +00:00
Huong Nguyen 023ac9229f MDL-72523 javascript: Introduce setReturnElement for core/modal 2022-12-28 11:14:50 +00:00
Sara Arjona 5f02141a7a Merge branch 'MDL-72563-400' of https://github.com/KepaUrzelai/moodle into MOODLE_400_STABLE 2022-12-28 12:13:21 +01:00
Sara Arjona 54cffd7c2e Merge branch 'MDL-69071-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-28 11:41:18 +01:00
Paul Holden 5e80881587 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:54 +00:00
Ilya Tregubov c6c77554ef Merge branch 'MDL-76731_400' of https://github.com/PhilippImhof/moodle into MOODLE_400_STABLE 2022-12-28 15:14:35 +07:00
Sara Arjona dcfd3b29a9 Merge branch 'MDL-76679-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-27 16:55:31 +01:00
Amaia Anabitarte 293bc2d615 MDL-76578 core_course: One section per page summary information 2022-12-26 16:02:51 +01:00
Meirza eeccbf0ebd 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:24:24 +07:00
Noemie Ariste 8cded7cd9f MDL-60038 moodlelib: ignore site policy if user auth type = 'webservice' 2022-12-23 10:03:41 +13:00
Philipp Imhof 652d8971ec MDL-76731 behat: add steps to check for version
Co-authored-by: Andrew Nicols <andrew@nicols.co.uk>
2022-12-22 17:12:29 +01:00
Tony Butler 8fbede49ae MDL-53137 qtype_numerical: Swap geo tolerance limits for -ve answers 2022-12-22 15:32:00 +00:00
Ilya Tregubov 37e16d4da2 weekly release 4.0.5+ 2022-12-22 19:16:34 +07:00
Ilya Tregubov 5b325dc2e9 Merge branch 'install_400_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_400_STABLE 2022-12-22 19:16:32 +07:00
Ilya Tregubov 06d3ff9ea2 Merge branch 'MDL-76667-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-22 12:30:08 +07:00
Paul Holden 6aa9d215c8 Merge branch 'MDL-75965-400' of https://github.com/HuongNV13/moodle into MOODLE_400_STABLE 2022-12-22 12:30:08 +07:00
Andrew Nicols 0faa70e56a MDL-75105 tool_behat: Coding style fixes 2022-12-22 12:30:08 +07:00
Andrew Nicols 0ab77c7287 Merge branch 'MDL-75105_400_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_400_STABLE 2022-12-22 12:30:07 +07:00
Paul Holden 3d0bbf1a0f Merge branch 'MDL-75914-400' of https://github.com/meirzamoodle/moodle into MOODLE_400_STABLE 2022-12-22 12:30:07 +07:00
Thong Bui 1bde415012 MDL-75978 Quiz\D&D: on mobile, a moving line-wrap can bork the question 2022-12-22 10:08:59 +07:00
AMOS bot 9287e1e0ea Automatically generated installer lang files 2022-12-22 00:07:39 +00:00
Meirza e4bf4cf37e 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:32:54 +07:00
Mark Johnson 4dfb5cf6e7 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:20 +00:00
Huong Nguyen 4fc412b538 MDL-75965 question_multichoice: Misalignment of feedback icons 2022-12-21 14:15:50 +07:00
Ilya Tregubov 9e6b6b4925 Merge branch 'MDL-76727-400' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2022-12-21 09:50:45 +07:00
Paul Holden 0e52ea009d Merge branch 'MDL-75279-400' of https://github.com/spvickers/moodle into MOODLE_400_STABLE 2022-12-20 10:27:42 +00:00
Andrew Nicols 7a5389f1cc 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:51 +08:00
Stephen Vickers e7a5867a88 MDL-75279 mod_lti: Add username to NRPS response 2022-12-19 17:11:04 +00:00
Paul Holden 741c9e003d Merge branch 'MDL-72906-400' of https://github.com/tdjones/moodle into MOODLE_400_STABLE 2022-12-19 10:23:16 +00:00
Ilya Tregubov f464b00ab8 Merge branch 'MDL-74779-400' of https://github.com/ssj365/moodle into MOODLE_400_STABLE 2022-12-19 09:45:54 +07:00
Leon Stringer 2f4fa118db 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:40:38 +00:00
Paul Holden 2144007387 MDL-76399 question: switch to appropriate Behat step for selects. 2022-12-16 13:09:54 +00:00
Paul Holden 6176c8fc88 MDL-76399 behat: improvements to "should exist in" thrown exception. 2022-12-16 12:29:19 +00:00
Paul Holden e62f86b983 Merge branch 'MDL-76026_400' of https://github.com/AnupamaSarjoshi/moodle into MOODLE_400_STABLE 2022-12-16 09:54:54 +00:00
Andrew Nicols 089260dae2 weekly release 4.0.5+ 2022-12-16 09:05:57 +08:00
Andrew Nicols 661e595500 Merge branch 'install_400_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_400_STABLE 2022-12-16 09:05:56 +08:00
Paul Holden 1aba16cbea 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:08 +00:00
Paul Holden c9a5b23d7a 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:11 +00:00
Sara Arjona 636ad3d3a0 Merge branch 'MDL-76674_400' of https://github.com/stronk7/moodle into MOODLE_400_STABLE 2022-12-14 18:34:56 +01:00
Amaia Anabitarte 3f39fcf27e MDL-76004 core_h5p: Ensure the browser is serving updated file 2022-12-14 16:22:59 +01:00
Eloy Lafuente (stronk7) 1097414910 MDL-76674 core_lang: Add string for new America/Ciudad_Juarez 2022-12-14 15:51:36 +01:00
Paul Holden 364c3b1fa9 Merge branch 'MDL-76666_400' of https://github.com/stronk7/moodle into MOODLE_400_STABLE 2022-12-14 13:22:07 +00:00
Eloy Lafuente (stronk7) 27ebb8fa2d 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:37 +01:00
Sara Arjona 08c8e9bba2 Merge branch 'MDL-75441-400' of https://github.com/aanabit/moodle into MOODLE_400_STABLE 2022-12-14 09:57:19 +01:00
AMOS bot b4ab42a911 Automatically generated installer lang files 2022-12-14 00:07:39 +00:00
Anupama Sarjoshi a85ff11cba 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.0, 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 19:21:19 +00:00
Amaia Anabitarte 9d2ddbf7fe MDL-75441 mod_forum: Show add new post button to guest users 2022-12-13 18:48:01 +01:00
Paul Holden 34eee61037 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:16 +00:00
Andrew Nicols ff72ae15f3 Merge branch 'MDL-76509-400' of https://github.com/safatshahin/moodle into MOODLE_400_STABLE 2022-12-13 20:32:01 +08:00
Andrew Nicols 8a4a9fc096 Merge branch 'MDL-76536-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-13 11:42:57 +08:00
Andrew Nicols 4ab2e98a64 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:37 +08:00
Andrew Nicols e5ed497363 Merge branch 'MDL-76293_400' of https://github.com/mkassaei/moodle into MOODLE_400_STABLE 2022-12-13 11:07:33 +08:00
Safat 26ed26289d MDL-76509 core: Upgrade error resolve for slot tags 2022-12-13 13:40:33 +11:00
Shamiso.Jaravaza fdcc78fee0 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:32:09 -07:00
Sara Arjona 43e0217956 Merge branch 'MDL-75571-400' of https://github.com/jacdsouza/moodle into MOODLE_400_STABLE 2022-12-12 11:23:24 +01:00
Khoa Nguyen Dang 7ae8b4dbed MDL-76308 Question\D&D: The draggable area is slim characters to select 2022-12-12 13:49:39 +07:00
hieuvu 097b706970 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 11:10:18 +07:00
Andrew Nicols 2d3acb52df Merge branch 'MDL-76398-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-11 20:21:00 +08:00
Jackson D'souza 118240ef22 MDL-75571 tool_componentlibrary: Custom activity icon 2022-12-09 15:51:33 +00:00
Jackson D'souza d7b3d443aa MDL-75571 theme_boost: Activity icon
* Use Activity get_icon_url helper method to fetch icon.
2022-12-09 15:51:33 +00:00
Jackson D'souza 75247caff8 MDL-75571 block_timeline: Display custom activity icon if available. 2022-12-09 15:51:33 +00:00
Jackson D'souza bb23523870 MDL-75571 calendar: Activity icon
* Use Activity get_icon_url helper method to fetch icon.
2022-12-09 15:51:33 +00:00
Sara Arjona e4b7d8b323 Merge branch 'MDL-76274-400' of https://github.com/cameron1729/moodle into MOODLE_400_STABLE 2022-12-09 16:18:14 +01:00
Paul Holden 93ac861ec5 MDL-76536 enrol: prevent invalid role assignments in course creation.
Upgrade step to fixup existing bad data.
2022-12-09 11:39:51 +00:00
Sara Arjona ce6131e6f7 weekly release 4.0.5+ 2022-12-09 08:57:06 +01:00
Sara Arjona 3e0a29dee5 Merge branch 'install_400_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_400_STABLE 2022-12-09 08:57:01 +01:00
Jun Pataleta c1fb24274e Merge branch 'MDL-76556-400' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2022-12-08 10:07:41 +08:00
Andrew Nicols ec6d835341 Merge branch 'MDL-76491-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-08 08:12:55 +08:00
AMOS bot 73d873e752 Automatically generated installer lang files 2022-12-08 00:07:38 +00:00
Andrew Nicols 623ca576bd Merge branch 'MDL-76550_400' of https://github.com/AnupamaSarjoshi/moodle into MOODLE_400_STABLE 2022-12-08 08:07:20 +08:00
Andrew Nicols df2fe09963 Merge branch 'MDL-76074-400' of https://github.com/srobotta/moodle into MOODLE_400_STABLE 2022-12-08 07:29:05 +08:00
Andrew Nicols 4b31bb97f5 Merge branch 'MDL-76116-400' of https://github.com/meirzamoodle/moodle into MOODLE_400_STABLE 2022-12-08 06:17:25 +08:00
Sara Arjona b6355c6490 Merge branch 'MDL-75588-400' of https://github.com/HuongNV13/moodle into MOODLE_400_STABLE 2022-12-07 19:31:18 +01:00
Trevor Jones 40c59b5865 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:22:27 -07:00
Sara Arjona 814fc9cbc1 Merge branch 'MDL-76500-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-07 18:27:59 +01:00
Sara Arjona 77ef43cb2e Merge branch 'MDL-76193-400' of https://github.com/JBThong/moodle into MOODLE_400_STABLE 2022-12-07 17:26:30 +01:00
Sara Arjona 0ab8dfd19f Merge branch 'MDL-76571_400' of https://github.com/timhunt/moodle into MOODLE_400_STABLE 2022-12-07 17:17:50 +01:00
Tim Hunt 38bad90a7e 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:51:42 +00:00
Jun Pataleta 85ca739855 Merge branch 'MDL-76559-400' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2022-12-07 22:40:44 +08:00
Andrew Nicols 57f473425a MDL-76559 core: validate_email does not take false either 2022-12-07 21:40:18 +08:00
Sara Arjona 982427b990 Merge branch 'MDL-76273-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-07 12:51:49 +01:00
Huong Nguyen 15a855e371 MDL-75588 assign: Reset completion status when resetting a submission 2022-12-07 16:16:07 +07:00
Jun Pataleta 72ceec4d94 Merge branch 'MDL-73017-M400_add-environment-check-for-versions-not-supporting-php-8-1' of https://github.com/ziegenberg/moodle into MOODLE_400_STABLE 2022-12-07 13:47:21 +08:00
Meirza fd89171c91 MDL-76116 mnet: styling the delete key confirmation window properly 2022-12-07 11:28:15 +07:00
Jun Pataleta 9e06598722 Merge branch 'MDL-75635-MOODLE_40_STABLE' of https://github.com/catalyst/moodle into MOODLE_400_STABLE 2022-12-07 11:04:00 +08:00
Thong Bui 25ca760ccd MDL-76193 Questions: Backup and Restore with tags fails 2022-12-06 22:32:30 +07:00
Jun Pataleta 8cca821b62 Merge branch 'MDL-76559-400' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2022-12-06 23:19:28 +08:00
Andrew Nicols 7c28bd0d36 MDL-76559 core: validate_email should not accept empty values 2022-12-06 20:53:54 +08:00
Jun Pataleta 743fe53e6b Merge branch 'MDL-75381-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-06 19:24:28 +08:00
Ilya Tregubov af51642584 Merge branch 'MDL-76490-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-06 13:10:21 +03:00
Paul Holden 0dc67b9d10 MDL-76500 grade: fix grade form when item cannot be overridden. 2022-12-06 09:19:52 +00:00
Ilya Tregubov 8966d10fd6 Merge branch 'MDL-76446-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-06 12:19:34 +03:00
Mahmoud Kassaei 8ee6c1b4ed MDL-76293 Gradebook: PHPUnit fails when plugins are not expected 2022-12-06 08:39:56 +00:00
Cameron Ball f4dba7ab54 MDL-76274 assignfeedback_editpdf: Fix upgrade step for stale conversions 2022-12-06 16:07:50 +08:00
Ilya Tregubov 42d71d6502 Merge branch 'MDL-75516_400' of https://github.com/larsbonczek/moodle into MOODLE_400_STABLE 2022-12-06 10:38:40 +03:00
Andrew Nicols 34c8e455ea Merge branch 'MDL-75446-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2022-12-06 15:20:01 +08:00
Andrew Nicols e81a91d18f Merge branch 'MDL-75573-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-06 13:56:47 +08:00
Andrew Nicols c877d579e7 Merge branch 'MDL-76145-400' of https://github.com/meirzamoodle/moodle into MOODLE_400_STABLE 2022-12-06 13:36:30 +08:00
Brendan Heywood 940006d39f MDL-76478 formslib: Fix autocomplete bug of existing passwords 2022-12-06 12:34:17 +11:00
Paul Holden ef9310d1e7 MDL-76273 core: multi-byte character filename support for TCPDF.
See: https://github.com/tecnickcom/TCPDF/pull/562
2022-12-05 15:03:09 +00:00
Paul Holden 64439605c6 MDL-76490 behat: use defined step for interaction with autocomplete. 2022-12-05 14:22:27 +00:00
Marina Glancy 7ae00a1542 MDL-76490 behat: correct step for opening autocomplete in container. 2022-12-05 14:22:02 +00:00
Anupama Sarjoshi 8576612fbb MDL-76550 Quiz and qbank: Fix display of Category and question names 2022-12-05 12:09:26 +00:00
Sara Arjona 4fc0a470fb Merge branch 'MDL-75789-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-05 12:53:50 +01:00
Sara Arjona f05f5b909f Merge branch 'MDL-76166-username-logging-MOODLE_400_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_400_STABLE 2022-12-05 12:44:30 +01:00
Ilya Tregubov 90829a7550 Merge branch 'MDL-75788-400' of https://github.com/lameze/moodle into MOODLE_400_STABLE 2022-12-05 14:32:22 +03:00
Sara Arjona afafcca723 Merge branch 'MDL-76482-400' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2022-12-05 12:04:09 +01:00
Daniel Ziegenberg 02663758fb 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:39:53 +01:00
Angelia Dela Cruz 1bec71f1b6 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:37:06 +08:00
Ilya Tregubov 507d27ba9b Merge branch 'MDL-76330-MOODLE_400_STABLE' of https://github.com/sh-csg/moodle into MOODLE_400_STABLE 2022-12-05 09:22:37 +03:00
Jun Pataleta 65397a0a86 Merge branch 'MDL-76225-400' of https://github.com/ferranrecio/moodle into MOODLE_400_STABLE 2022-12-05 13:47:37 +08:00
AMOS bot a916576147 Automatically generated installer lang files 2022-12-04 00:08:29 +00:00
Andrew Nicols 258c8ca75c MDL-76556 tool_log: Set the store property correctly 2022-12-03 11:49:24 +08:00
Lars Bonczek 3afa59e702 MDL-75516 core: Perform proper JSON encoding in mustache quote helper 2022-12-02 13:37:33 +01:00
Paul Holden b729d36baf MDL-76491 javascript: add missing core/notification imports. 2022-12-02 10:06:27 +00:00
Paul Holden f5bb4eebce MDL-76491 javascript: prevent eslint undefined Notification import. 2022-12-02 10:06:10 +00:00
Paul Holden 91e96925c9 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:54:58 +00:00
Paul Holden b903d21ea2 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:54:58 +00:00
Stephan Robotta 1ad4c0e91c 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-02 09:42:29 +01:00
Dani Palou 6aafd5fa61 MDL-75788 behat: Use profile field generators in existing tests 2022-12-02 14:58:38 +08:00
Dani Palou e2d166e526 MDL-75788 testing: Handle new lines in menu profile field generator 2022-12-02 14:58:38 +08:00
hieuvu ae949341cd MDL-76106 qtype_ddmarker: Improve loading consistency.
Wait for the image to load completely before running the js.
2022-12-02 12:34:43 +07:00
Paul Holden ef5112211b MDL-75573 backup: translate async operation type in messages. 2022-12-01 19:48:36 +00:00
Stefan Hanauska ea6c1d65af MDL-76330 enrol: Check permission to show edit icon 2022-12-01 20:07:10 +01:00
Sara Arjona bdba78514f weekly release 4.0.5+ 2022-12-01 16:08:04 +01:00
Andrew Nicols 1d35066ba5 Merge branch 'MDL-75604-400' of https://github.com/ssj365/moodle into MOODLE_400_STABLE 2022-12-01 09:02:48 +03:00
Andrew Nicols cb26fec31f Merge branch 'MDL-75281-400' of https://github.com/call-learning/moodle into MOODLE_400_STABLE 2022-12-01 09:02:48 +03:00
Sara Arjona 1e6be54edd Merge branch 'MDL-76226-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-01 09:02:48 +03:00
Jun Pataleta 1fc5e599c5 Merge branch 'MDL-76250-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-01 09:02:48 +03:00
Jun Pataleta 53c1445753 Merge branch 'MDL-76483-400' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2022-12-01 09:02:48 +03:00
Andrew Nicols 53e5b88001 Merge branch 'MDL-75826-400' of https://github.com/meirzamoodle/moodle into MOODLE_400_STABLE 2022-12-01 09:02:48 +03:00
Jun Pataleta 17e976a2a7 Merge branch 'MDL-68981-400' of https://github.com/HuongNV13/moodle into MOODLE_400_STABLE 2022-12-01 09:02:48 +03:00
Jun Pataleta 230c3cedc6 Merge branch 'MDL-76284-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-01 09:02:48 +03:00
Jun Pataleta 09d76ce833 Merge branch 'MDL-76429_400' of https://github.com/stronk7/moodle into MOODLE_400_STABLE 2022-12-01 09:02:48 +03:00
Andrew Nicols 3b504d259b Merge branch 'MDL-76380-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-12-01 09:02:48 +03:00
Andrew Nicols a24b426062 Merge branch 'MDL-76218-m400' of https://github.com/sammarshallou/moodle into MOODLE_400_STABLE 2022-12-01 09:02:47 +03:00
Andrew Nicols e8c58c9a3b Merge branch 'MDL-76127-400' of https://github.com/meirzamoodle/moodle into MOODLE_400_STABLE 2022-12-01 09:02:47 +03:00
Ilya Tregubov f51798f962 Merge branch 'MDL-72019-400' of https://github.com/meirzamoodle/moodle into MOODLE_400_STABLE 2022-12-01 09:02:47 +03:00
Laurent David 46e658d506 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:15:13 +01:00
Shamiso.Jaravaza c72574f800 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 10:08:37 -07:00
Ferran Recio 70abc44e05 MDL-76225 core_courseformat: fix section title id 2022-11-30 16:47:09 +01:00
Meirza 966b0dd3df 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:16 +07:00
Andrew Nicols ad770fe215 MDL-76482 output: The javascript mustache helper should return a string 2022-11-30 12:18:54 +08:00
Huong Nguyen 832d237c94 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:20:09 +07:00
Huong Nguyen cb8b72034e MDL-68981 tool_recyclebin: Extra PHPUnit with General restore config 2022-11-30 10:20:09 +07:00
Huong Nguyen 31c047d2d3 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:20:06 +07:00
Brendan Heywood acf152ca8b MDL-76166 calendar: Ensure user is in server access logs 2022-11-30 13:26:11 +11:00
Brendan Heywood 4dc23af4ad MDL-76166 auth: Ensure user is in server access logs 2022-11-30 13:26:11 +11:00
Paul Holden d24c88543d 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:30:41 +00:00
Andrew Nicols 382f91cf8c Merge branch 'MDL-75960-400' of https://github.com/andelacruz/moodle into MOODLE_400_STABLE 2022-11-29 17:05:18 +08:00
Paul Holden 109b772c06 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:41:27 +00:00
Paul Holden 937c47e90e MDL-75789 restore: multi-byte safe substring calculating course names.
Co-authored-by: Leon Stringer <leon.stringer@ntlworld.com>
2022-11-29 08:32:13 +00:00
Andrew Nicols 1735591d32 Merge branch 'MDL-65939-400' of https://github.com/ewallah/moodle into MOODLE_400_STABLE 2022-11-29 15:41:51 +08:00
Andrew Nicols 6846a839f5 Merge branch 'MDL-76058-400' of https://github.com/lameze/moodle into MOODLE_400_STABLE 2022-11-29 15:37:24 +08:00
Andrew Nicols 11123d3aba Merge branch 'MDL-74454-MOODLE_400_STABLE' of https://github.com/pabloamayab/moodle into MOODLE_400_STABLE 2022-11-29 14:19:05 +08:00
Andrew Nicols eb61b04180 MDL-76258 mod_lti: Codign style fixes 2022-11-29 12:29:06 +08:00
Andrew Nicols 9fa5637b56 Merge branch 'MDL-76258-MOODLE_400_STABLE' of https://github.com/sh-csg/moodle into MOODLE_400_STABLE 2022-11-29 12:29:03 +08:00
Andrew Nicols ab112ec2b7 MDL-69570 assignfeedback_editpdf: Whitespace fix 2022-11-29 11:52:01 +08:00
Andrew Nicols 801ca38d89 Merge branch 'MDL-69570-400' of https://github.com/abgreeve/moodle into MOODLE_400_STABLE 2022-11-29 11:51:05 +08:00
Adrian Greeve fa0e0b9a39 MDL-69570 assignfeedback_editpdf: Upgrade step to remove files.
This upgrade step removes all orphaned editpdf feedback files and
records.
2022-11-29 09:48:47 +08:00
Adrian Greeve df99098fb6 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 09:47:48 +08:00
Paul Holden a63ddc2ec3 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:39:00 +00:00
Paul Holden 740d11fb43 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:04 +00:00
Paul Holden e4bdc416d8 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:14 +00:00
Paul Holden 7030ec9af2 MDL-76284 webservice: early exit if no users for missing capabilities. 2022-11-28 11:52:52 +00:00
Meirza 34f8f8fe90 MDL-75826 profile: Redirect to profile page if returnto is profile. 2022-11-28 16:16:23 +07:00
Angelia Dela Cruz aeebd7a189 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-28 10:01:16 +08:00
Eloy Lafuente (stronk7) ffbb559293 MDL-76429 composer: Bump to phpwebdriver 1.2.1 for php81 compat
This fix is really only required for Moodle 4.1 and up, that will
be the one supporting php81, but we always apply composer changes
to all branches (supported and security), so we keep them running
the same stuff.

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-11-25 16:27:24 +01:00
Andrew Nicols 6687efe4d5 MDL-76483 core: Handle default value for get_docs_url() 2022-11-25 22:19:20 +08:00
Ilya Tregubov efdaed1f70 weekly release 4.0.5+ 2022-11-25 15:38:30 +03:00
Jun Pataleta 56143593c4 Merge branch 'MDL-76468-400' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2022-11-24 17:51:43 +08:00
Andrew Nicols 1a5322ab4b MDL-76468 output: Correct slasharg URL for theme stylesheet 2022-11-24 16:41:07 +08:00
Andrew Nicols 449104d62a Merge branch 'MDL-76395-400-enfix' of https://github.com/vmdef/moodle into MOODLE_400_STABLE 2022-11-24 16:25:17 +08:00
Ilya Tregubov 437f447816 Merge branch 'MDL-76291-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-11-24 10:59:47 +03:00
Víctor Déniz ef8fdb4762 Merge branch 'MDL-76324-400' of https://github.com/HuongNV13/moodle into MOODLE_400_STABLE 2022-11-23 14:22:40 +00:00
Víctor Déniz 476474da69 MDL-76395 lang: Use fixed strings in tests 2022-11-23 12:45:54 +00:00
Paul Holden 2e534d0c99 MDL-76291 mod_bigbluebuttonbn: tell Behat to wait while polling.
While fetching recording data, and updating room info. Should reduce
random scenario failures.
2022-11-23 10:15:39 +00:00
Jun Pataleta c09e748a9a Merge branch 'MDL-76365-400' of https://github.com/HuongNV13/moodle into MOODLE_400_STABLE 2022-11-23 14:51:34 +08:00
Huong Nguyen 8a0f9db07f MDL-76324 webdav: Fix error for PHP 8.0 2022-11-23 09:12:02 +07:00
Helen Foster 0487f8ed9a MDL-76395 lang: Import fixed English strings (en_fix) 2022-11-23 00:14:28 +00:00
Ilya Tregubov bb7e105ca9 weekly release 4.0.5+ 2022-11-22 15:58:21 +03:00
Huong Nguyen cca0bc9ec5 MDL-76365 mod_data: Fix export with empty template
If the template is not created, we need to use the default template for the export
2022-11-22 12:08:45 +07:00
Jun Pataleta 65886c04da Merge branch 'MDL-76390_400' of https://github.com/stronk7/moodle into MOODLE_400_STABLE 2022-11-22 11:20:05 +08:00
Jun Pataleta 472ea45f92 Merge branch 'MDL-76367-400' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2022-11-22 11:08:31 +08:00
Jun Pataleta b62844e26c Merge branch 'MDL-76389_400' of https://github.com/stronk7/moodle into MOODLE_400_STABLE 2022-11-22 09:49:42 +08:00
Ilya Tregubov e72dd8c3d9 Merge branch 'MDL-76341-400' of https://github.com/stevandoMoodle/moodle into MOODLE_400_STABLE 2022-11-21 16:54:36 +03:00
Meirza 4419deedab 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-11-21 14:28:14 +07:00
Stevani Andolo 3bd0fd816f MDL-76341 tool_lp: Fixed learning plan's header not containing user name 2022-11-21 14:35:19 +08:00
Eloy Lafuente (stronk7) c5569f2965 MDL-76390 tool_lp: Remove magic getter call
Since Moodle 3.3 (see MDL-57273), the magix getters and setters
for persistent classes are deprecated, instead get() and set()
must be used.
2022-11-20 14:53:17 +01:00
Eloy Lafuente (stronk7) 5d16d55949 MDL-76389 output: Ensure we don't try to iterate over null
Just convert nulls to empty array before trying to iterate it.
2022-11-20 11:42:02 +01:00
Paul Holden 2da8a31849 weekly release 4.0.5+ 2022-11-18 11:43:11 +00:00
Paul Holden f9460201fd Merge branch 'install_400_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_400_STABLE 2022-11-18 11:43:08 +00:00
Andrew Nicols 5851941cef MDL-76367 core: Apply RTL transformations to editors too 2022-11-18 15:14:42 +08:00
Jun Pataleta 28a2586852 Merge branch 'MDL-76332-400' of https://github.com/call-learning/moodle into MOODLE_400_STABLE 2022-11-18 11:58:12 +08:00
Jun Pataleta 6579bdbdb7 Merge branch 'MDL-75903-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-11-18 11:29:09 +08:00
AMOS bot 12e4a722bd Automatically generated installer lang files 2022-11-18 00:07:39 +00:00
Sara Arjona 7d2d64a559 Merge branch 'MDL-73620-400_grouperror' of https://github.com/alexmorrisnz/moodle into MOODLE_400_STABLE 2022-11-17 18:00:27 +01:00
Sara Arjona cef970f6d5 Merge branch 'MDL-74780-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-11-17 17:40:15 +01:00
Paul Holden 7fb8631e3e Merge branch 'MDL-76105-400-enfix' of https://github.com/vmdef/moodle into MOODLE_400_STABLE 2022-11-17 16:30:18 +00:00
Sara Arjona 40d67d22b2 Merge branch 'MDL-70491-400_take2' of https://github.com/lucaboesch/moodle into MOODLE_400_STABLE 2022-11-17 17:25:54 +01:00
Sara Arjona 2700e9b29f Merge branch 'MDL-75627_m400_v1' of https://github.com/sbourget/moodle into MOODLE_400_STABLE 2022-11-17 17:22:30 +01:00
info@eWallah.net 0f6bed1637 MDL-65939 phpunit: Maildigest tests can query a wrong adhoc task 2022-11-17 15:53:41 +01:00
Paul Holden 9c9b10b709 Merge branch 'MDL-75569-400' of https://github.com/justusdieckmann/moodle into MOODLE_400_STABLE 2022-11-17 14:34:55 +00:00
Víctor Déniz 02a066b847 Merge branch 'MDL-76326-400' of https://github.com/HuongNV13/moodle into MOODLE_400_STABLE 2022-11-17 13:19:34 +00:00
Sara Arjona 1d8d3ba456 Merge branch 'MDL-75567-400' of https://github.com/justusdieckmann/moodle into MOODLE_400_STABLE 2022-11-17 13:06:33 +01:00
Víctor Déniz 18f6f90021 Merge branch 'MDL-73804-make-category-filter-context-400' of https://github.com/Peterburnett/moodle into MOODLE_400_STABLE 2022-11-17 11:56:33 +00:00
Paul Holden d2215442ac Merge branch 'MDL-75665_MOODLE_400_STABLE' of https://github.com/tasosb/moodle into MOODLE_400_STABLE 2022-11-17 11:42:28 +00:00
Meirza 591305c989 MDL-72019 user: Allows data to be formatted when exporting. 2022-11-17 16:23:58 +07:00
Jun Pataleta 0cc918fbce Merge branch 'MDL-76310-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-11-17 14:39:40 +08:00
Bas Brands 1085ea44b8 MDL-70491 theme_boost: improve form autocomplete badge styles 2022-11-17 07:04:51 +01:00
Huong Nguyen 424992eeff MDL-76326 oauth2: Update Nextcloud logo to the new one 2022-11-17 11:32:17 +07:00
Andrew Nicols 359d436178 Merge branch 'MDL-75651-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-11-17 10:07:07 +08:00
Andrew Nicols 222af18607 Merge branch 'MDL-76083-400' of https://github.com/aanabit/moodle into MOODLE_400_STABLE 2022-11-17 10:00:33 +08:00
David Mudrák 37f2404bd0 MDL-76105 lang: Use fixed strings in tests, too. 2022-11-16 17:33:18 +00:00
Laurent David bfedfcbc4a MDL-76332 mod_bigbluebuttonbn: Fix JS exception, recording only room
* The room updater should only run on room that have the join button
2022-11-16 18:16:54 +01:00
Paul Holden 3faffbc882 Merge branch 'MDL-73078-400' of https://github.com/lucaboesch/moodle into MOODLE_400_STABLE 2022-11-16 16:37:03 +00:00
Paul Holden eb0b6e7619 Merge branch 'MDL-76271-400' of https://github.com/davewoloszyn/moodle into MOODLE_400_STABLE 2022-11-16 16:25:01 +00:00
Sara Arjona b8cf30d2e9 Merge branch 'MDL-75380_400' of https://github.com/AnupamaSarjoshi/moodle into MOODLE_400_STABLE 2022-11-16 16:23:46 +01:00
Kepa Urzelai 441afd68b0 MDL-72563 theme_boost: rubric area style fix 2022-11-16 15:31:33 +01:00
Laurent David 09ed58c5a1 MDL-76083 mod_data: Fix preset importer
* We should delete fields that have not been marked as to preserve.
2022-11-16 13:15:28 +01:00
Helen Foster f9022d9fa9 MDL-76105 lang: Import fixed English strings (en_fix) 2022-11-16 10:21:38 +00:00
Jun Pataleta ce4bdc144e Merge branch 'MDL-75415-400' of https://github.com/ssj365/moodle into MOODLE_400_STABLE 2022-11-16 17:51:39 +08:00
Jun Pataleta 2d4fb04857 Merge branch 'MDL-74558-400' of https://github.com/ssj365/moodle into MOODLE_400_STABLE 2022-11-16 17:51:17 +08:00
Jake Dallimore f2b007ee49 Merge branch 'MDL-76220-400' of https://github.com/ferranrecio/moodle into MOODLE_400_STABLE 2022-11-16 16:34:03 +08:00
Jun Pataleta c70361bd9b Merge branch 'MDL-75365-400' of https://github.com/andrewnicols/moodle into MOODLE_400_STABLE 2022-11-16 12:38:00 +08:00
David Woloszyn eb9de04a11 MDL-76271 dndupload: Corrected layout when uploading to course via dnd 2022-11-16 11:20:05 +11:00
Víctor Déniz 0c15fe263e Merge branch 'MDL-75781-400' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_400_STABLE 2022-11-15 22:32:02 +00:00
Sara Arjona bd8e040536 Merge branch 'MDL-76039-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-11-15 17:57:12 +01:00
Ilya Tregubov d652929260 weekly release 4.0.5+ 2022-11-15 18:09:28 +03:00
Paul Holden fc09484ec1 MDL-76310 enrol_lti: fix consumer key upgrade steps for Oracle.
Avoids CLOB comparison exceptions, related to ORA-00932.
2022-11-15 11:50:00 +00:00
Peter Burnett 028dc3ff0a MDL-73804 category: Use system context for category name filtering 2022-11-15 14:48:58 +10:00
Jun Pataleta b1926ad5f2 Merge branch 'MDL-76230-400' of https://github.com/HuongNV13/moodle into MOODLE_400_STABLE 2022-11-15 11:48:46 +08:00
Jun Pataleta 882a63d966 Merge branch 'MDL-76196-400' of https://github.com/HuongNV13/moodle into MOODLE_400_STABLE 2022-11-15 11:06:34 +08:00
Víctor Déniz 707ff5a4f2 Merge branch 'MDL-76229-400' of https://github.com/meirzamoodle/moodle into MOODLE_400_STABLE 2022-11-14 23:40:59 +00:00
Víctor Déniz a76a02901f Merge branch 'MDL-76192-400' of https://github.com/mihailges/moodle into MOODLE_400_STABLE 2022-11-14 22:35:47 +00:00
Paul Holden bc220f8d72 MDL-75903 output: increase precision of primary active node matching.
Co-authored-by: Mikel Martín <mikel@moodle.com>
2022-11-14 17:31:32 +00:00
Paul Holden 6b412c403b MDL-74780 grade: account for absence of course grade items on import. 2022-11-14 17:30:20 +00:00
Paul Holden cb20f32f46 MDL-75651 mod_feedback: remove duplicated activity heading. 2022-11-14 17:28:56 +00:00
Sara Arjona 7d96732e31 Merge branch '75792-moodle400-fix-grouping-sort-order' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_400_STABLE 2022-11-14 16:07:26 +01:00
Sara Arjona 47d6bbcb9e Merge branch 'MDL-75300-400' of https://github.com/paulholden/moodle into MOODLE_400_STABLE 2022-11-14 16:04:11 +01:00
sam marshall 7731cb8127 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-11-14 14:39:12 +00:00
Paul Holden eb80cbd249 MDL-76039 forms: account for null values in serialize util method.
Co-authored-by: Marina Glancy <marina@moodle.com>
2022-11-14 14:20:40 +00:00
Julien Boulen 43f1e99dac MDL-75792 availability: sort groupings list by name 2022-11-14 13:16:58 +01:00
Huong Nguyen 4fca1452d4 MDL-76230 block_tag_flickr: Change User-agent value for API calls 2022-11-14 09:35:29 +07:00
Huong Nguyen e4af35b9b8 MDL-76230 block_tag_flickr: Extra Behat test for a specific tag 2022-11-14 09:35:29 +07:00
Meirza c2f415e57c MDL-76229 core_form: Show frozen text editor in a more accessible way. 2022-11-12 18:46:42 +07:00
Luca Bösch 872f3a03dc MDL-73078 workshop: align 'Edit subm' 'Delete subm' 'Export this page' 2022-11-11 16:43:36 +01:00
David Woloszyn cac3162bf3 MDL-76196 mod_folder: Display manual completion if inline display set 2022-11-11 15:50:06 +07:00
Andrew Nicols eab0470f4f MDL-75365 javascript: Support ES6 in all JS except YUI 2022-11-10 17:04:23 +08:00
Stefan Hanauska 229da267a6 MDL-76258 mod_lti: Reset clientid after restore 2022-11-09 19:33:52 +01:00
Mihail Geshoski a616371921 MDL-76192 mod_glossary: Export all entry aliases to the portfolio 2022-11-10 00:33:03 +08:00
Simey Lameze a1df353c67 MDL-76058 behat: send message using data generator 2022-11-09 09:52:07 +08:00
Ferran Recio bc794a82a2 MDL-76220 mod_wiki: fix extend_navigation
The wiki_extend_navigation is using $PAGE->url when it is not allowed
to. Extending navigation can be invoked in an Ajax request so it should
not use $PAGE global.
2022-11-08 14:41:35 +01:00
hieuvu 497c7ee517 MDL-75781 javascript: Centering when resize for dialog 2022-11-08 18:10:12 +07:00
Shamiso.Jaravaza 1f2f41a2d9 MDL-75415 mod_bigbluebuttonbn: Fix session times 2022-11-03 11:21:33 -06:00
Paul Holden 76d6feb23e MDL-75300 mod_h5pactivity: check whether reviewer join matches rows.
Return original capability join if so, to prevent generating invalid
SQL.
2022-11-02 19:25:47 +00:00
Anupama Sarjoshi 432628f3a3 MDL-75380 customfields: Fix incorrect links sent when enrolling users 2022-10-20 18:50:16 +01:00
David Mudrák fd14e16617 MDL-75534 Fix usermodified in very old forum discussions
Very early Moodle versions used to leave the field empty. Recent Moodle
versions expect that the value always links to an existing user account.
2022-10-19 20:44:50 +02:00
Shamiso.Jaravaza ebc4a00bca MDL-74558 mod_bigbluebuttonbn: Fix deletion error 2022-10-14 08:58:28 -06:00
Andrew Madden 3a60aec87d MDL-75635 quizaccess_seb: Implement Safe Exam Browser JS API
This is a backport of MDL-72188

* Replaces checking header for SEB config keys to assess quiz access.
* Adds new web service accessible via Ajax
* Forces the use of the new API where available
* Stores access in Moodle SESSION for quiz instead of checking every
page.
2022-10-11 08:33:30 +11:00
Alex Morris 7ee9daa15e MDL-73620 mod_forum: Fix issue with discussion permission check
Users with access to some groups but not all would receive an error
page when creating a discussion topic that was set to send to all
groups
2022-10-11 08:29:42 +13:00
Justus Dieckmann f98da613d6 MDL-75567 core_course: Other hidden badges remain when adding new one 2022-10-08 23:05:38 +02:00
Pablo Amaya 0c2b15935c 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-10-05 12:44:14 +02:00
Justus Dieckmann 8763bba518 MDL-75569 course: fix non-functional search bar in course index page
For users who are not allowed to access course/management.php, the
normal course search is used instead.
2022-09-20 12:34:45 +02:00
Stephen Bourget 3bb3afdcab MDL-75627 Calendar: Fix calendar imports from Office 365 2022-09-19 15:51:03 -04:00
Anastasios Bithas 098cf7b38d MDL-75665 gradereport_overview: Format strings in grade report overview 2022-09-07 12:36:59 +03:00
866 changed files with 13678 additions and 5525 deletions
+9 -5
View File
@@ -6,6 +6,10 @@
],
'env': {
'browser': true,
// Enable ES6+ features by default.
// See http://eslint.org/docs/user-guide/configuring#specifying-environments
// Note: The YUI override must exactly match this when disabling the ES6+ version because those features are not supported by Shifter.
'es2020': true,
'amd': true
},
'globals': {
@@ -83,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',
@@ -196,6 +201,10 @@
overrides: [
{
files: ["**/yui/src/**/*.js"],
'env': {
// Disable ES6+ for YUI files.
'es2020': false,
},
// Disable some rules which we can't safely define for YUI rollups.
rules: {
'no-undef': 'off',
@@ -221,10 +230,6 @@
},
{
files: ["**/amd/src/*.js", "**/amd/src/**/*.js", "Gruntfile.js", ".grunt/*.js", ".grunt/tasks/*.js", "jsdoc.conf.js"],
// We support es6 now. Woot!
env: {
es6: true
},
// We're using babel transpiling so use their parser
// for linting.
parser: '@babel/eslint-parser',
@@ -299,7 +304,6 @@
],
},
parserOptions: {
'ecmaVersion': 9,
'sourceType': 'module',
'requireConfigFile': false,
}
+3 -1
View File
@@ -66,7 +66,7 @@ jobs:
steps:
- name: Setting up DB mysql
if: ${{ matrix.db == 'mysqli' }}
uses: johanmeiring/mysql-action@tmpfs-patch
uses: moodlehq/mysql-action@v1
with:
collation server: utf8mb4_bin
mysql version: 5.7
@@ -74,6 +74,8 @@ jobs:
mysql user: test
mysql password: test
use tmpfs: true
tmpfs size: '1024M'
extra conf: --skip-log-bin
- name: Setting up DB pgsql
if: ${{ matrix.db == 'pgsql' }}
+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");
+3 -1
View File
@@ -81,7 +81,8 @@ install:
sudo service mysql stop
sudo mv /var/lib/mysql /mnt/ramdisk
sudo ln -s /mnt/ramdisk/mysql /var/lib/mysql
sudo service mysql restart
echo -e "[mysqld]\nskip-log-bin" | sudo tee -a /etc/mysql/my.cnf
sudo service mysql start
fi
- >
if [ "$DB" = 'pgsql' ];
@@ -92,6 +93,7 @@ install:
sudo mv /var/lib/postgresql /mnt/ramdisk
sudo ln -s /mnt/ramdisk/postgresql /var/lib/postgresql
sudo service postgresql start 9.6
sh -c 'until pg_isready -p 5432; do echo "Waiting for the DB to be up..."; sleep 2; done'
fi
- >
if [ "$TASK" = 'PHPUNIT' ];
+53 -35
View File
@@ -1,48 +1,66 @@
MOODLE TRADEMARKS POLICY
========================
The word "Moodle" is trademarked in many countries around the world. The word
was originally coined as an acronym: Modular Object-Oriented Dynamic Learning
Environment. The trademark is owned by Martin Dougiamas, Founder and Director
of Moodle.
The Moodle Trademark
--------------------
The law obligates trademark owners to police their marks and prevent the use of
confusingly similar names by third parties. Through this policy wed like to
make it clear how Moodle-related projects, organisations, and people can use
the Moodle trademark. Wed also like to be clear about how use of the word is
restricted when used to promote commercial Moodle services. We do this to
protect the very business model that allows us to continue developing Moodle
for you.
The brand and word "Moodle" has trade mark protection in many countries around
the world. Various Moodle™ trade marks are owned by either Moodle Pty Ltd or
one of its associated entities. The law obligates trade mark owners to police
their trade marks and prevent the use of confusingly similar names by
third parties.
Allowed uses
------------
We have created a more concise and thorough set of Trademark Guidelines
(https://moodle.com/wp-content/uploads/2023/02/Moodle-Trademark-Guidelines-2023-4.pdf)
to help you understand how to comply with Moodle's trade mark requirements.
The Trademark Guidelines will also assist our Moodle Certified Partners and the
community to understand some of the principles that inform Moodle's stance
whenever potential infringement has been detected by us or our community.
The following uses dont require any permission at all:
We need to be clear about use of the word "Moodle" and how we restrict its use
when promoting commercial Moodle™ branded services. The proper use of
trade marks reliably assures consumers about the quality of the associated
products or services and where they have been derived from. Because the
Moodle LMS is made available under the open source GNU General Public License'
that permits you to modify the copyrighted software, the distribution of such
modified software in combination with Moodle trade marks can potentially
mislead others in the community. To be clear, the GNU GPL does not include an
implied right or licence to use Moodle's trade marks.
* Referring to the software or the Moodle project.
* Describing your own Moodle implementation (including within corporate
settings).
We do all this to protect the very business model that allows us to continue
developing various Moodle software solutions for you.
Allowed uses of "Moodle"
------------------------
The following uses don't require any permission at all:
* Referring to the software or the Moodle project as the "Moodle™ software"
or the "Moodle™ project"
* Describing your own implementation of the Moodle™ software platform
(including within corporate settings).
* Describing a Moodle-based community hub.
* Describing some software youve made that integrates with Moodle
(eg a Moodle integration feature on another system).
* Describing certain software you've made that integrates with Moodle
branded software (e.g. a Moodle integration feature on another system).
Restricted uses
---------------
Restricted uses of "Moodle"
---------------------------
The following uses are generally prohibited without explicit and direct
permission being granted to you by Moodle Pty Ltd. We do this to protect the
Moodle project from software and sites which could confuse people. Please
contact us to ask for permission in writing.
Moodle project from software and sites which could confuse people. If in
doubt, reach out for clarification at <trademarks@moodle.com>
* You cant use "Moodle" in the name of your software (including Mobile apps)
* You cant use "Moodle" in your company name
* You cant use "Moodle" in your domain name
* You cant use "Moodle" in advertising-related keywords (such as Adsense)
* You cant use "Moodle" to describe services around Moodle (such as hosting,
training, support, consulting, course creation services, theme development,
customisation, installation, integration and certification). This applies
even if you do not charge for the services. Note that usually only Moodle
Partners have this permission.
For information about the Moodle Partner Certification Mark as well as for how
to contact us, please see <https://moodle.com/trademarks/>.
* You can't use the word "Moodle" or any Moodle logos for commercial purposes
without prior written permission from Moodle HQ.
* You can't use "Moodle" in the name of your software (including Mobile apps).
* You can't use "Moodle" in your company name.
* You can't use "Moodle" in your domain name.
* You can't use "Moodle" in advertising-related keywords (such as Adsense).
* You can't use "Moodle" to describe services around Moodle
(such as hosting, training, support, consulting, course creation services,
theme development, customisation, installation, integration, analytics
and certification) that cause consumers to be confused that you are
associated with Moodle HQ if you are not.
This applies even if you do not charge for the services.
Note that usually only Moodle Partners have this permission.
+189
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>
@@ -3922,4 +3924,191 @@
</CUSTOM_CHECK>
</CUSTOM_CHECKS>
</MOODLE>
<MOODLE version="4.2" requires="3.11.8">
<UNICODE level="required">
<FEEDBACK>
<ON_ERROR message="unicoderequired" />
</FEEDBACK>
</UNICODE>
<DATABASE level="required">
<VENDOR name="mariadb" version="10.6.7" />
<VENDOR name="mysql" version="8.0" />
<VENDOR name="postgres" version="13" />
<VENDOR name="mssql" version="14.0" />
<VENDOR name="oracle" version="19" />
</DATABASE>
<PHP version="8.0.0" level="required">
</PHP>
<PCREUNICODE level="optional">
<FEEDBACK>
<ON_CHECK message="pcreunicodewarning" />
</FEEDBACK>
</PCREUNICODE>
<PHP_EXTENSIONS>
<PHP_EXTENSION name="iconv" level="required">
<FEEDBACK>
<ON_ERROR message="iconvrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="mbstring" level="required">
<FEEDBACK>
<ON_ERROR message="mbstringrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="curl" level="required">
<FEEDBACK>
<ON_ERROR message="curlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="openssl" level="required">
<FEEDBACK>
<ON_ERROR message="opensslrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="tokenizer" level="optional">
<FEEDBACK>
<ON_CHECK message="tokenizerrecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="soap" level="optional">
<FEEDBACK>
<ON_CHECK message="soaprecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="ctype" level="required">
<FEEDBACK>
<ON_ERROR message="ctyperequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="zip" level="required">
<FEEDBACK>
<ON_ERROR message="ziprequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="zlib" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="gd" level="required">
<FEEDBACK>
<ON_ERROR message="gdrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="simplexml" level="required">
<FEEDBACK>
<ON_ERROR message="simplexmlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="spl" level="required">
<FEEDBACK>
<ON_ERROR message="splrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="pcre" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="dom" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="xml" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="xmlreader" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="intl" level="required">
<FEEDBACK>
<ON_ERROR message="intlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="json" level="required">
</PHP_EXTENSION>
<PHP_EXTENSION name="hash" level="required"/>
<PHP_EXTENSION name="fileinfo" level="required"/>
<PHP_EXTENSION name="sodium" level="required"/>
<PHP_EXTENSION name="exif" level="optional"/>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="96M" level="required">
<FEEDBACK>
<ON_ERROR message="settingmemorylimit" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="file_uploads" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="settingfileuploads" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="opcache.enable" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="opcacherecommended" />
</FEEDBACK>
</PHP_SETTING>
</PHP_SETTINGS>
<CUSTOM_CHECKS>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_storage_engine" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbstorageengine" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="question/engine/upgrade/upgradelib.php" function="quiz_attempts_upgraded" level="required">
<FEEDBACK>
<ON_ERROR message="quizattemptsupgradedmessage" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_slasharguments" level="optional">
<FEEDBACK>
<ON_CHECK message="slashargumentswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_tables_row_format" level="optional">
<FEEDBACK>
<ON_CHECK message="unsupporteddbtablerowformat" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_unoconv_version" level="optional">
<FEEDBACK>
<ON_CHECK message="unoconvwarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_libcurl_version" level="optional">
<FEEDBACK>
<ON_CHECK message="libcurlwarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_file_format" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbfileformat" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_file_per_table" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddbfilepertable" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_large_prefix" level="required">
<FEEDBACK>
<ON_ERROR message="unsupporteddblargeprefix" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_is_https" level="optional">
<FEEDBACK>
<ON_CHECK message="ishttpswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_incomplete_unicode_support" level="optional">
<FEEDBACK>
<ON_CHECK message="incompleteunicodesupport" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_sixtyfour_bits" level="required">
<FEEDBACK>
<ON_ERROR message="sixtyfourbitsrequired" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_max_input_vars" level="optional">
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_admin_dir_usage" level="optional">
<FEEDBACK>
<ON_CHECK message="iscustomadminwarnings" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_xmlrpc_usage" level="optional">
</CUSTOM_CHECK>
</CUSTOM_CHECKS>
</MOODLE>
</COMPATIBILITY_MATRIX>
+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.
print_error ('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');
+10 -19
View File
@@ -31,29 +31,20 @@
if (!empty($hide) and confirm_sesskey()) {
$class = \core_plugin_manager::resolve_plugininfo_class('mod');
$class::enable_plugin($hide, false);
admin_get_root(true, false); // settings not required - only pages
if ($class::enable_plugin($hide, false)) {
// Settings not required - only pages.
admin_get_root(true, false);
}
redirect(new moodle_url('/admin/modules.php'));
}
if (!empty($show) and confirm_sesskey()) {
$canenablemodule = true;
$modulename = $show;
// Invoking a callback function that enables plugins to force additional actions (e.g. displaying notifications,
// modals, etc.) and also specify through its returned value (bool) whether the process of enabling the plugin
// should continue after these actions or not.
if (component_callback_exists("mod_{$modulename}", 'pre_enable_plugin_actions')) {
$canenablemodule = component_callback("mod_{$modulename}", 'pre_enable_plugin_actions');
}
if ($canenablemodule) {
$class = \core_plugin_manager::resolve_plugininfo_class('mod');
$class::enable_plugin($show, true);
admin_get_root(true, false); // Settings not required - only pages.
redirect(new moodle_url('/admin/modules.php'));
if (!empty($show) && confirm_sesskey()) {
$class = \core_plugin_manager::resolve_plugininfo_class('mod');
if ($class::enable_plugin($show, true)) {
// Settings not required - only pages.
admin_get_root(true, false);
}
redirect(new moodle_url('/admin/modules.php'));
}
echo $OUTPUT->header();
@@ -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');
@@ -34,7 +34,7 @@ class adminpresets_admin_setting_configselect extends adminpresets_setting {
*/
protected function set_value($value) {
// When we intantiate the class we need the choices.
if (empty($this->settindata->choices) && method_exists($this->settingdata, 'load_choices')) {
if (empty($this->settingdata->choices) && method_exists($this->settingdata, 'load_choices')) {
$this->settingdata->load_choices();
}
+17 -29
View File
@@ -24,6 +24,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use core_question\local\bank\question_version_status;
require_once(__DIR__ . '/../config.php');
require_once($CFG->libdir . '/questionlib.php');
@@ -42,36 +43,23 @@ $qtypes = question_bank::get_all_qtypes();
$pluginmanager = core_plugin_manager::instance();
// Get some data we will need - question counts and which types are needed.
$hiddenstatus = \core_question\local\bank\question_version_status::QUESTION_STATUS_HIDDEN;
$draftstatus = \core_question\local\bank\question_version_status::QUESTION_STATUS_DRAFT;
// The second JOIN on question_versions (qv2) is to get the latest version of each question. 
// (Using this sort of JOIN is a known trick for doing this in the fastest possible way.)
$counts = $DB->get_records_sql("
SELECT q.qtype,
COUNT(qv.id) AS numquestions,
SUM(CASE WHEN qv.status = :hiddenstatus THEN 1 ELSE 0 END) AS numhidden,
SUM(CASE WHEN qv.status = :draftstatus THEN 1 ELSE 0 END) AS numdraft
FROM {question} q
JOIN {question_versions} qv ON q.id = qv.questionid
LEFT JOIN {question_versions} qv2 ON qv.questionbankentryid = qv2.questionbankentryid AND qv.version < qv2.version
WHERE qv2.questionbankentryid IS NULL
GROUP BY q.qtype
", [
'hiddenstatus' => question_version_status::QUESTION_STATUS_HIDDEN,
'draftstatus' => question_version_status::QUESTION_STATUS_DRAFT,
]);
$sql = "SELECT result.qtype,
SUM(result.numquestions) AS numquestions,
SUM(result.numhidden) AS numhidden,
SUM(result.numdraft) AS numdraft
FROM (SELECT data.qtype,
data.versionid,
COUNT(data.numquestions) AS numquestions,
(SELECT COUNT(qv.id)
FROM {question_versions} qv
WHERE qv.id = data.versionid
AND qv.status = :hiddenstatus) AS numhidden,
(SELECT COUNT(qv.id)
FROM {question_versions} qv
WHERE qv.id = data.versionid
AND qv.status = :draftstatus) AS numdraft
FROM (SELECT q.qtype, qv.id AS versionid, 1 AS numquestions
FROM {question} q
JOIN {question_versions} qv ON qv.questionid = q.id
JOIN {question_bank_entries} qbe ON qbe.id = qv.questionbankentryid
AND qv.version = (SELECT MAX(v.version)
FROM {question_versions} v
JOIN {question_bank_entries} be ON be.id = v.questionbankentryid
WHERE be.id = qbe.id)) data
GROUP BY data.qtype, data.versionid) result
GROUP BY result.qtype";
$counts = $DB->get_records_sql($sql, ['hiddenstatus' => $hiddenstatus, 'draftstatus' => $draftstatus]);
$needed = [];
foreach ($qtypes as $qtypename => $qtype) {
if (!isset($counts[$qtypename])) {
+2 -1
View File
@@ -477,7 +477,8 @@ if ($hassiteconfig or has_any_capability($capabilities, $systemcontext)) {
$temp->add(new admin_setting_heading('automatedsettings', new lang_string('automatedsettings','backup'), new lang_string('recyclebin_desc', 'backup')));
$temp->add(new admin_setting_configcheckbox('backup/backup_auto_users', new lang_string('generalusers', 'backup'), new lang_string('configgeneralusers', 'backup'), 1));
$temp->add(new admin_setting_configcheckbox('backup/backup_auto_role_assignments', new lang_string('generalroleassignments','backup'), new lang_string('configgeneralroleassignments','backup'), 1));
$temp->add(new admin_setting_configcheckbox('backup/backup_auto_activities', new lang_string('generalactivities','backup'), new lang_string('configgeneralactivities','backup'), 1));
$temp->add(new admin_setting_configcheckbox('backup/backup_auto_activities', new lang_string('generalactivities', 'backup'),
new lang_string('backupautoactivitiesdescription', 'backup'), 1));
$temp->add(new admin_setting_configcheckbox('backup/backup_auto_blocks', new lang_string('generalblocks','backup'), new lang_string('configgeneralblocks','backup'), 1));
$temp->add(new admin_setting_configcheckbox(
'backup/backup_auto_files',
@@ -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"
@@ -35,9 +35,7 @@ Feature: Allowing multiple accounts to have the same email address
| username | firstname | lastname | email |
| s1 | John | Doe | s1@example.com |
| s2 | Jane | Doe | s2@example.com |
When I log in as "admin"
And I navigate to "Users > Accounts > Browse list of users" in site administration
And I click on "Edit" "link" in the "Jane Doe" "table_row"
When I am on the "s2" "user > editing" page logged in as "admin"
And I set the field "Email address" to "<email>"
And I press "Update profile"
Then I should <expect> "This email address is already registered."
@@ -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,8 +11,11 @@ Feature: I can add a new preset with current settings
And I set the field "Name" to "Starter"
And I set the field "Description" to "Non-core starter preset"
When I click on "Create preset" "button"
Then I should see "Moodle with all of the most popular features" in the "Starter" "table_row"
And I should see "Starter" in the "Non-core starter preset" "table_row"
Then the following should exist in the "Site admin presets table" table:
| Name | Description |
| Starter | Moodle with all of the most popular features, including Assignment, Feedback, Forum, H5P, Quiz and Completion tracking. |
| Full | All the Starter features plus External (LTI) tool, SCORM, Workshop, Analytics, Badges, Competencies, Learning plans and lots more. |
| Starter | Non-core starter preset |
Scenario: Export current settings
Given I click on "Create preset" "button"
+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
),
]);
}
}
+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>
@@ -30,10 +30,9 @@ Feature: Verify that all form fields values can be get and set
| student2 | G2 |
| student3 | G2 |
And the following "activities" exist:
| activity | course | idnumber | name | intro | firstpagetitle | wikimode | visible |
| wiki | C1 | wiki1 | Test this one | Test this one | Test this one | collaborative | 0 |
And I log in as "admin"
And I am on the "Course 1" "reset" page
| activity | course | idnumber | name | firstpagetitle | wikimode | visible |
| wiki | C1 | wiki1 | Test this one | Test this one | collaborative | 0 |
And I am on the "Course 1" "reset" page logged in as admin
# Select (multi-select) - Checking "the select box should contain".
And I expand all fieldsets
And the "Unenrol users" select box should contain "No roles"
@@ -60,16 +59,14 @@ Feature: Verify that all form fields values can be get and set
# Checkbox - Checking "I set the field" and "The field matches value" ticked.
And I set the field "Force format" to "1"
And I press "Save and return to course"
And I am on the "Test this one" "wiki activity" page
And I navigate to "Settings" in current page administration
And I am on the "Test this one" "wiki activity editing" page
And I expand all fieldsets
And the field "Force format" matches value "1"
And the field "Force format" does not match value ""
# Checkbox - Checking "I set the field" and "The field matches value" unticked.
And I set the field "Force format" to ""
And I press "Save and return to course"
And I am on the "Test this one" "wiki activity" page
And I navigate to "Settings" in current page administration
And I am on the "Test this one" "wiki activity editing" page
And I expand all fieldsets
And the field "Force format" matches value ""
And the field "Force format" does not match value "1"
@@ -77,8 +74,7 @@ Feature: Verify that all form fields values can be get and set
And I set the following fields to these values:
| Force format | 1 |
And I press "Save and return to course"
And I am on the "Test this one" "wiki activity" page
And I navigate to "Settings" in current page administration
And I am on the "Test this one" "wiki activity editing" page
And I expand all fieldsets
And the following fields match these values:
| Force format | 1 |
@@ -88,8 +84,7 @@ Feature: Verify that all form fields values can be get and set
And I set the following fields to these values:
| Force format | |
And I press "Save and return to course"
And I am on the "Test this one" "wiki activity" page
And I navigate to "Settings" in current page administration
And I am on the "Test this one" "wiki activity editing" page
And I expand all fieldsets
And the following fields match these values:
| Force format | |
@@ -142,10 +137,11 @@ Feature: Verify that all form fields values can be get and set
And I navigate to "Settings" in current page administration
And the field "Course ID number" matches value "Course id number"
Scenario: with JS disabled all form fields getters and setters works as expected
@javascript
Scenario: with JS enabled all form fields getters and setters works as expected
Given the following "activities" exist:
| activity | course | name |
| lesson | C1 | Test lesson |
Then I am on the "Course 1" "groups" page
# Select (multi-select & AJAX) - Checking "I set the field" and "select box should contain".
And I set the field "groups" to "Group 2"
@@ -157,11 +153,8 @@ Feature: Verify that all form fields values can be get and set
And the "members" select box should contain "Student 2 (s2@example.com)"
And the "members" select box should not contain "Student 3 (s3@example.com)"
# Checkbox (AJAX) - Checking "I set the field" and "I set the following fields to these values".
And I am on "Course 1" course homepage
And I add a "Lesson" to section "1"
And I am on the "Test lesson" "lesson activity editing" page
And I set the following fields to these values:
| Name | Test lesson |
| Description | Test lesson description |
| available[enabled] | 1 |
And I set the field "deadline[enabled]" to "1"
# Checkbox (AJAX) - Checking "the field matches value" before saving.
@@ -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 = 2022041900; // The current plugin version (Date: YYYYMMDDXX).
$plugin->version = 2022041901; // The current plugin version (Date: YYYYMMDDXX).
$plugin->requires = 2022041200; // Requires this Moodle version.
$plugin->component = 'tool_behat'; // Full name of the plugin (used for diagnostics)
@@ -48,12 +48,7 @@ class accessibility {
public static function is_accessibility_enabled(): bool {
global $CFG;
if (isset($CFG->enableaccessibilitytools)) {
return $CFG->enableaccessibilitytools;
}
// Enabled by default.
return true;
return !empty($CFG->enableaccessibilitytools);
}
/**
@@ -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">
+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') + '"/>');
@@ -274,7 +274,7 @@ $string['requesttypedelete'] = 'Delete all of my personal data';
$string['requesttypedeleteshort'] = 'Delete';
$string['requesttypeexport'] = 'Export all of my personal data';
$string['requesttypeexportshort'] = 'Export';
$string['requesttypeothers'] = 'General inquiry';
$string['requesttypeothers'] = 'General enquiry';
$string['requesttypeothersshort'] = 'Message';
$string['requireallenddatesforuserdeletion'] = 'Consider courses without end date as active';
$string['requireallenddatesforuserdeletion_desc'] = 'When calculating user expiry, several factors are considered:
@@ -20,7 +20,7 @@ Feature: Contact the privacy officer
And I click on "Send" "button" in the "Contact the privacy officer" "dialogue"
Then I should see "Your request has been submitted to the privacy officer"
And I click on "Data requests" "link"
And I should see "Hello DPO!" in the "General inquiry" "table_row"
And I should see "Hello DPO!" in the "General enquiry" "table_row"
Scenario: Contacting the privacy officer when not enabled
When I log in as "student1"
+1 -1
View File
@@ -5,6 +5,6 @@ define("tool_langimport/search",["exports","core/pending","core/utils"],(functio
* @module tool_langimport/search
* @copyright 2021 Paul Holden <paulh@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_pending=(obj=_pending)&&obj.__esModule?obj:{default:obj};const SELECTORS_AVAILABLE_LANG_SELECT="select",SELECTORS_AVAILABLE_LANG_SEARCH='[data-action="search"]';var _default={init:form=>{const availableLangsElement=form.querySelector(SELECTORS_AVAILABLE_LANG_SELECT),availableLangsFilter=event=>{const pendingPromise=new _pending.default("tool_langimport/search:filter");availableLangsElement.querySelectorAll("option").forEach((option=>{option.remove()}));const searchTerm=event.target.value.toLowerCase(),availableLanguages=JSON.parse(availableLangsElement.dataset.availableLanguages),filteredLanguages=Object.keys(availableLanguages).reduce(((matches,langcode)=>(availableLanguages[langcode].toLowerCase().includes(searchTerm)&&(matches[langcode]=availableLanguages[langcode]),matches)),[]);Object.entries(filteredLanguages).forEach((_ref=>{let[langcode,langname]=_ref;const option=document.createElement("option");option.value=langcode,option.innerText=langname,availableLangsElement.append(option)})),pendingPromise.resolve()},availableLanguages={};availableLangsElement.querySelectorAll("option").forEach((option=>{availableLanguages[option.value]=option.text})),availableLangsElement.dataset.availableLanguages=JSON.stringify(availableLanguages);const availableLangsSearch=form.querySelector(SELECTORS_AVAILABLE_LANG_SEARCH);availableLangsSearch.addEventListener("keydown",(event=>{"Enter"===event.key&&event.preventDefault()})),availableLangsSearch.addEventListener("keyup",(event=>{const pendingPromise=new _pending.default("tool_langimport/search:keyup");(0,_utils.debounce)(availableLangsFilter,250)(event),setTimeout((()=>{pendingPromise.resolve()}),250)}))}};return _exports.default=_default,_exports.default}));
*/Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_pending=(obj=_pending)&&obj.__esModule?obj:{default:obj};const SELECTORS_AVAILABLE_LANG_SELECT="select",SELECTORS_AVAILABLE_LANG_SEARCH='[data-action="search"]';_exports.init=form=>{const availableLangsElement=form.querySelector(SELECTORS_AVAILABLE_LANG_SELECT),availableLanguages={};availableLangsElement.querySelectorAll("option").forEach((option=>{availableLanguages[option.value]=option.text})),availableLangsElement.dataset.availableLanguages=JSON.stringify(availableLanguages);const availableLangsSearch=form.querySelector(SELECTORS_AVAILABLE_LANG_SEARCH);availableLangsSearch.addEventListener("keydown",(event=>{"Enter"===event.key&&event.preventDefault()}));const availableLangsSearchDebounce=(0,_utils.debounce)((event=>{const pendingPromise=new _pending.default("tool_langimport/search:filter");availableLangsElement.querySelectorAll("option").forEach((option=>{option.remove()}));const searchTerm=event.target.value.toLowerCase(),availableLanguages=JSON.parse(availableLangsElement.dataset.availableLanguages),filteredLanguages=Object.keys(availableLanguages).reduce(((matches,langcode)=>(availableLanguages[langcode].toLowerCase().includes(searchTerm)&&(matches[langcode]=availableLanguages[langcode]),matches)),[]);Object.entries(filteredLanguages).forEach((_ref=>{let[langcode,langname]=_ref;const option=document.createElement("option");option.value=langcode,option.innerText=langname,availableLangsElement.append(option)})),pendingPromise.resolve()}),250);availableLangsSearch.addEventListener("keyup",(event=>{const pendingPromise=new _pending.default("tool_langimport/search:keyup");availableLangsSearchDebounce(event),setTimeout((()=>{pendingPromise.resolve()}),250)}))}}));
//# sourceMappingURL=search.min.js.map
File diff suppressed because one or more lines are too long
+3 -6
View File
@@ -36,7 +36,7 @@ const DEBOUNCE_TIMER = 250;
*
* @param {Element} form
*/
const init = (form) => {
export const init = form => {
const availableLangsElement = form.querySelector(SELECTORS.AVAILABLE_LANG_SELECT);
const availableLangsFilter = (event) => {
@@ -84,16 +84,13 @@ const init = (form) => {
});
// Debounce the event listener to allow the user to finish typing.
const availableLangsSearchDebounce = debounce(availableLangsFilter, DEBOUNCE_TIMER);
availableLangsSearch.addEventListener('keyup', (event) => {
const pendingPromise = new Pending('tool_langimport/search:keyup');
debounce(availableLangsFilter, DEBOUNCE_TIMER)(event);
availableLangsSearchDebounce(event);
setTimeout(() => {
pendingPromise.resolve();
}, DEBOUNCE_TIMER);
});
};
export default {
init: init,
};
+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;
}
}
@@ -33,3 +33,26 @@ Feature: Licence manager
And "This is the site default licence" "icon" should exist in the "cc" "table_row"
And "Enable licence" "icon" should not exist in the "cc" "table_row"
And "This is the site default licence" "icon" should not exist in the "public" "table_row"
@javascript @_file_upload
Scenario Outline: User licence preference is remembered depending of setting value
Given the following config values are set as admin:
| sitedefaultlicense | cc |
| rememberuserlicensepref | <rememberuserlicensepref> |
And I log in as "admin"
And I follow "Private files" in the user menu
And I follow "Add..."
And I follow "Upload a file"
And the field with xpath "//select[@name='license']" matches value "Creative Commons"
And I click on "Close" "button" in the "File picker" "dialogue"
When I upload "lib/tests/fixtures/empty.txt" file to "Files" filemanager as:
| Save as | empty_copy.txt |
| license | Public domain |
And I press "Save changes"
And I follow "Add..."
Then the field with xpath "//select[@name='license']" matches value "<expectedlicence>"
Examples:
| rememberuserlicensepref | expectedlicence |
| 0 | Creative Commons |
| 1 | Public domain |
+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);
}
/**
@@ -33,8 +33,7 @@ class store_test extends \advanced_testcase {
* Tests log writing.
*
* @param bool $jsonformat True to test with JSON format
* @dataProvider test_log_writing_provider
* @throws moodle_exception
* @dataProvider log_writing_provider
*/
public function test_log_writing(bool $jsonformat) {
global $DB, $CFG;
@@ -252,9 +251,9 @@ class store_test extends \advanced_testcase {
* Returns different JSON format settings so the test can be run with JSON format either on or
* off.
*
* @return [bool] Array of true/false
* @return bool[] Array of true/false
*/
public static function test_log_writing_provider(): array {
public static function log_writing_provider(): array {
return [
[false],
[true]
@@ -311,17 +310,16 @@ class store_test extends \advanced_testcase {
$logmanager = get_log_manager();
$allreports = \core_component::get_plugin_list('report');
$supportedreports = array(
'report_log' => '/report/log',
'report_loglive' => '/report/loglive'
);
// Make sure all supported reports are installed.
$expectedreports = array_keys(array_intersect_key($allreports, $supportedreports));
$reports = $logmanager->get_supported_reports('logstore_database');
$reports = array_keys($reports);
$expectedreports = array_intersect_key([
'log' => 'report_log',
'loglive' => 'report_loglive',
], $allreports);
$supportedreports = $logmanager->get_supported_reports('logstore_database');
foreach ($expectedreports as $expectedreport) {
$this->assertContains($expectedreport, $reports);
$this->assertArrayHasKey($expectedreport, $supportedreports);
}
}
}
@@ -217,20 +217,19 @@ class store_test extends \advanced_testcase {
$logmanager = get_log_manager();
$allreports = \core_component::get_plugin_list('report');
$supportedreports = array(
'report_log' => '/report/log',
'report_loglive' => '/report/loglive',
'report_outline' => '/report/outline',
'report_participation' => '/report/participation',
'report_stats' => '/report/stats'
);
// Make sure all supported reports are installed.
$expectedreports = array_keys(array_intersect_key($allreports, $supportedreports));
$reports = $logmanager->get_supported_reports('logstore_legacy');
$reports = array_keys($reports);
$expectedreports = array_intersect_key([
'log' => 'report_log',
'loglive' => 'report_loglive',
'outline' => 'report_outline',
'participation' => 'report_participation',
'stats' => 'report_stats'
], $allreports);
$supportedreports = $logmanager->get_supported_reports('logstore_legacy');
foreach ($expectedreports as $expectedreport) {
$this->assertContains($expectedreport, $reports);
$this->assertArrayHasKey($expectedreport, $supportedreports);
}
}
@@ -38,8 +38,7 @@ class store_test extends \advanced_testcase {
* Tests log writing.
*
* @param bool $jsonformat True to test with JSON format
* @dataProvider test_log_writing_provider
* @throws moodle_exception
* @dataProvider log_writing_provider
*/
public function test_log_writing(bool $jsonformat) {
global $DB;
@@ -223,9 +222,9 @@ class store_test extends \advanced_testcase {
* Returns different JSON format settings so the test can be run with JSON format either on or
* off.
*
* @return [bool] Array of true/false
* @return bool[] Array of true/false
*/
public static function test_log_writing_provider(): array {
public static function log_writing_provider(): array {
return [
[false],
[true]
@@ -239,20 +238,19 @@ class store_test extends \advanced_testcase {
$logmanager = get_log_manager();
$allreports = \core_component::get_plugin_list('report');
$supportedreports = array(
'report_log' => '/report/log',
'report_loglive' => '/report/loglive',
'report_outline' => '/report/outline',
'report_participation' => '/report/participation',
'report_stats' => '/report/stats'
);
// Make sure all supported reports are installed.
$expectedreports = array_keys(array_intersect_key($allreports, $supportedreports));
$reports = $logmanager->get_supported_reports('logstore_standard');
$reports = array_keys($reports);
$expectedreports = array_intersect_key([
'log' => 'report_log',
'loglive' => 'report_loglive',
'outline' => 'report_outline',
'participation' => 'report_participation',
'stats' => 'report_stats'
], $allreports);
$supportedreports = $logmanager->get_supported_reports('logstore_standard');
foreach ($expectedreports as $expectedreport) {
$this->assertContains($expectedreport, $reports);
$this->assertArrayHasKey($expectedreport, $supportedreports);
}
}
@@ -368,7 +366,7 @@ class store_test extends \advanced_testcase {
* Tests the decode_other function can cope with both JSON and PHP serialized format.
*
* @param mixed $value Value to encode and decode
* @dataProvider test_decode_other_provider
* @dataProvider decode_other_provider
*/
public function test_decode_other($value) {
$this->assertEquals($value, \logstore_standard\log\store::decode_other(serialize($value)));
@@ -387,7 +385,7 @@ class store_test extends \advanced_testcase {
*
* @return array Array of parameters
*/
public function test_decode_other_provider(): array {
public function decode_other_provider(): array {
return [
[['info' => 'd2819896', 'logurl' => 'discuss.php?d=2819896']],
[null],
@@ -400,8 +398,7 @@ class store_test extends \advanced_testcase {
* Checks that backup and restore of log data works correctly.
*
* @param bool $jsonformat True to test with JSON format
* @dataProvider test_log_writing_provider
* @throws moodle_exception
* @dataProvider log_writing_provider
*/
public function test_backup_restore(bool $jsonformat) {
global $DB;
+1 -1
View File
@@ -278,7 +278,7 @@ class external extends external_api {
));
$competency = api::read_competency($params['competencyid']);
$framework = api::read_framework($competency->get_competencyframeworkid());
$framework = api::read_framework($competency->get('competencyframeworkid'));
self::validate_context($framework->get_context());
$renderable = new output\competency_summary($competency, $framework, $params['includerelated'], $params['includecourses']);
$renderer = $PAGE->get_renderer('tool_lp');
-2
View File
@@ -229,7 +229,6 @@ class page_helper {
$PAGE->set_pagelayout('standard');
$PAGE->set_url($url);
$PAGE->set_title($title);
$PAGE->set_heading($title);
if (!empty($plan)) {
$PAGE->navbar->add($title, $planurl);
@@ -303,7 +302,6 @@ class page_helper {
$PAGE->set_pagelayout('standard');
$PAGE->set_url($url);
$PAGE->set_title($title);
$PAGE->set_heading($title);
if (!empty($evidence)) {
$PAGE->navbar->add($title, $evidenceurl);
+1 -1
View File
@@ -125,7 +125,7 @@ $string['qrcodetypeurl'] = 'QR code with site URL';
$string['qrcodetypelogin'] = 'QR code with automatic login';
$string['qrkeyttl'] = 'QR authentication key duration';
$string['qrkeyttl_desc'] = 'The length of time for which a QR code for automatic login is valid.';
$string['readingthisemailgettheapp'] = 'Reading this in an email? <a href="{$a}">Download the mobile app and receive notifications on your mobile device</a>.';
$string['readingthisemailgettheapp'] = 'Are you reading this in an email? <a href="{$a}">Download the mobile app and receive notifications on your mobile device</a>.';
$string['remoteaddons'] = 'Remote add-ons';
$string['scanqrcode'] = 'Scan QR code';
$string['selfsignedoruntrustedcertificatewarning'] = 'It seems that the HTTPS certificate is self-signed or not trusted. The mobile app will only work with trusted sites. Please use any online SSL checker to diagnose the problem. If it indicates that your certificate is OK, you can ignore this warning.';
+11 -7
View File
@@ -59,22 +59,26 @@ class api_test extends \externallib_advanced_testcase {
*/
public function test_get_potential_config_issues() {
global $CFG;
require_once($CFG->dirroot . '/message/lib.php');
$this->resetAfterTest(true);
$this->setAdminUser();
$CFG->userquota = '73289234723498234723423489273423497234234';
// Set non-SSL wwwroot, to avoid spurious certificate checking.
$CFG->wwwroot = 'http://www.example.com';
$CFG->debugdisplay = 1;
set_config('debugauthdb', 1, 'auth_db');
set_config('debugdb', 1, 'enrol_database');
$expectedissues = array('adodbdebugwarning', 'displayerrorswarning');
// Get potential issues, obtain their keys for comparison.
$issues = api::get_potential_config_issues();
$this->assertCount(count($expectedissues), $issues);
foreach ($issues as $issue) {
$this->assertTrue(in_array($issue[0], $expectedissues));
}
$issuekeys = array_column($issues, 0);
$this->assertEqualsCanonicalizing([
'nohttpsformobilewarning',
'adodbdebugwarning',
'displayerrorswarning',
], $issuekeys);
}
/**
+1 -2
View File
@@ -108,7 +108,7 @@ class issuer extends persistent {
$mform->addHelpButton('clientsecret', 'issuerclientsecret', 'tool_oauth2');
// Use basic authentication.
$mform->addElement('checkbox', 'basicauth', get_string('usebasicauth', 'tool_oauth2'));
$mform->addElement('advcheckbox', 'basicauth', get_string('usebasicauth', 'tool_oauth2'));
$mform->addHelpButton('basicauth', 'usebasicauth', 'tool_oauth2');
// Base Url.
@@ -244,7 +244,6 @@ class issuer extends persistent {
* @return array of additional errors, or overridden errors.
*/
protected function extra_validation($data, $files, array &$errors) {
$errors = [];
if ($data->showonloginpage != \core\oauth2\issuer::SERVICEONLY) {
if (!strlen(trim($data->loginscopes))) {
$errors['loginscopes'] = get_string('required');
@@ -218,9 +218,13 @@ Feature: Basic OAuth2 functionality
| Name | Invalid custom service |
| Client ID | thisistheclientid |
| Client secret | supersecret |
| Service base URL | https://dc.imsglobal.org/ |
| Service base URL | http://dc.imsglobal.org/ |
When I press "Save changes"
Then I should see "Could not discover end points for identity issuer: Invalid custom service"
Then I should see "For security reasons only https connections are allowed, sorry"
And I set the following fields to these values:
| Service base URL | https://dc.imsglobal.org/ |
And I press "Save changes"
And I should see "Could not discover end points for identity issuer: Invalid custom service"
And I should see "URL: https://dc.imsglobal.org/.well-known/openid-configuration"
And "Allow services" "icon" should exist in the "Invalid custom service" "table_row"
And "Do not allow login" "icon" should exist in the "Invalid custom service" "table_row"
@@ -358,3 +362,21 @@ Feature: Basic OAuth2 functionality
And I navigate to "Server > OAuth 2 services" in site administration
And "Allow login" "icon" should exist in the "Empty custom service" "table_row"
And "Do not allow services" "icon" should exist in the "Empty custom service" "table_row"
@javascript
Scenario: Changes to "Authenticate token requests via HTTP headers" are saved
Given I press "Custom"
And I set the following fields to these values:
| Name | Custom service |
| Client ID | thisistheclientid |
| Client secret | supersecret |
And I press "Save changes"
When I click on "Edit" "link" in the "Custom service" "table_row"
And I click on "Authenticate token requests via HTTP headers" "checkbox"
And I press "Save changes"
And I click on "Edit" "link" in the "Custom service" "table_row"
And the field "Authenticate token requests via HTTP headers" matches value "1"
And I click on "Authenticate token requests via HTTP headers" "checkbox"
And I press "Save changes"
And I click on "Edit" "link" in the "Custom service" "table_row"
Then the field "Authenticate token requests via HTTP headers" matches value ""
+11 -11
View File
@@ -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"
@@ -462,7 +462,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I am on site homepage
And I change window size to "large"
And I follow "Log in"
When I press "Log in as a guest"
When I press "Access as a guest"
Then I should see "If you continue browsing this website, you agree to our policies"
# Confirm when navigating, the pop-up policies are displayed.
When I am on the "My courses" page
@@ -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"
@@ -626,7 +626,7 @@ Feature: User must accept policy managed by this plugin when logging in and sign
And I am on site homepage
And I follow "Log in"
# First log in as a guest
And I press "Log in as a guest"
And I press "Access as a guest"
# Now sign up
And I follow "Log in"
When I click on "Create new account" "link"
@@ -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();
@@ -133,6 +133,16 @@ class course_bin extends base_bin {
\backup::MODE_AUTOMATED,
$user->id
);
// When "backup_auto_activities" setting is disabled, activities can't be restored from recycle bin.
$plan = $controller->get_plan();
$activitiessettings = $plan->get_setting('activities');
$settingsvalue = $activitiessettings->get_value();
if (empty($settingsvalue)) {
$controller->destroy();
return;
}
$controller->execute_plan();
// We don't need the forced setting anymore, hence unsetting it.
@@ -234,6 +244,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 +284,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 all and finish" "button" in the "Confirmation" "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],
]],
];
}
@@ -237,6 +242,29 @@ class course_bin_test extends \advanced_testcase {
$this->assertEquals(true, $attemptobj->is_finished());
}
/**
* Test that the activity is NOT stored in bin when
* in Automated backup setup settings "backup_auto_activities" is disabled.
*
* @dataProvider recycle_bin_settings_provider
* @covers ::store_item
*/
public function test_coursemodule_restore_with_activity_setting_disabled() {
// Set the configuration to not include activities in the automated backup.
set_config('backup_auto_activities', false, 'backup');
// Delete the course module.
course_delete_module($this->quiz->cmid);
// Now, run the course module deletion adhoc task.
\phpunit_util::run_all_adhoc_tasks();
// Check there is no items in the recycle bin.
$recyclebin = new \tool_recyclebin\course_bin($this->course->id);
$this->assertEquals(0, count($recyclebin->get_items()));
}
/**
* Tests that user data is not restored when module is restored.
*
@@ -38,15 +38,6 @@ use core\check\result;
*/
class adhocqueue extends check {
/**
* Constructor
*/
public function __construct() {
global $CFG;
$this->id = 'adhocqueue';
$this->name = get_string('checkadhocqueue', 'tool_task');
}
/**
* Return result
* @return result
+7 -10
View File
@@ -38,17 +38,14 @@ use core\check\result;
class cronrunning extends check {
/**
* Constructor
* A link the running tasks report
*
* @return action_link|null
*/
public function __construct() {
global $CFG;
$this->id = 'cronrunning';
$this->name = get_string('checkcronrunning', 'tool_task');
if (empty($CFG->cronclionly)) {
$this->actionlink = new \action_link(
new \moodle_url('/admin/cron.php'),
get_string('cron', 'admin'));
}
public function get_action_link(): ?\action_link {
return new \action_link(
new \moodle_url('/admin/tool/task/runningtasks.php'),
get_string('runningtasks', 'tool_task'));
}
/**
@@ -39,15 +39,13 @@ use core\check\result;
class maxfaildelay extends check {
/**
* Constructor
* Links to the task log report
*
* @return \action_link|null
*/
public function __construct() {
global $CFG;
$this->id = 'cronfaildelay';
$this->name = get_string('checkmaxfaildelay', 'tool_task');
$this->actionlink = new \action_link(
new \moodle_url('/admin/tool/task/scheduledtasks.php'),
get_string('scheduledtasks', 'tool_task'));
public function get_action_link(): ?\action_link {
$url = new \moodle_url('/admin/tasklogs.php');
return new \action_link($url, get_string('tasklogs', 'tool_task'));
}
/**
@@ -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
@@ -129,12 +125,10 @@ Feature: Upload users
And I should see "Users created: 4"
And I press "Continue"
# Boost check.
And I navigate to "Users > Accounts > Browse list of users" in site administration
And I click on ".icon[title=Edit]" "css_element" in the "jonest@example.com" "table_row"
And I am on the "jonest@example.com" "user > editing" page
And I should see "Boost"
# Classic check.
And I navigate to "Users > Accounts > Browse list of users" in site administration
And I click on ".icon[title=Edit]" "css_element" in the "reznor@example.com" "table_row"
And I am on the "reznor@example.com" "user > editing" page
And I should see "Classic"
@javascript
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');
}
+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;
@@ -152,14 +152,11 @@ Feature: Apply tour filters to a tour
| fullname | shortname | format | enablecompletion |
| Course 1 | C1 | topics | 1 |
| Course 2 | C2 | topics | 1 |
And the following "activities" exist:
| activity | course | name | firstpagetitle | wikimode |
| wiki | C1 | Test wiki name | First page | collaborative |
And I log in as "admin"
And I am on "Course 1" course homepage with editing mode on
And I add a "Wiki" to section "1" and I fill the form with:
| Wiki name | Test wiki name |
| Description | Test wiki description |
| First page name | First page |
| Wiki mode | Collaborative wiki |
And I am on "Course 2" course homepage
And I am on "Course 2" course homepage with editing mode on
And I add a "Forum" to section "1" and I fill the form with:
| Forum name | Test forum name |
| Forum type | Standard forum for general use |
+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;
});
+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"
+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';
+2 -2
View File
@@ -86,7 +86,7 @@ Please log in as before, using the link on the login page.
{$a->admin}';
$string['emailpasswordchangeinfosubject'] = '{$a}: Change password information';
$string['info'] = 'External account';
$string['issuer'] = 'OAuth 2 Service';
$string['issuer'] = 'OAuth 2 service';
$string['issuernologin'] = 'This issuer can not be used to login';
$string['linkedlogins'] = 'Linked logins';
$string['linkedloginshelp'] = 'Help with linked logins';
@@ -95,7 +95,7 @@ $string['loginerror_nouserinfo'] = 'No user information was returned. The OAuth
$string['loginerror_invaliddomain'] = 'The email address is not allowed at this site.';
$string['loginerror_authenticationfailed'] = 'The authentication process failed.';
$string['loginerror_cannotcreateaccounts'] = 'An account with your email address could not be found.';
$string['noissuersavailable'] = 'None of the configured OAuth2 services allow you to link login accounts';
$string['noissuersavailable'] = 'None of the configured OAuth 2 services allow you to link login accounts.';
$string['notloggedindebug'] = 'The login attempt failed. Reason: {$a}';
$string['notwhileloggedinas'] = 'Linked logins cannot be managed while logged in as another user.';
$string['oauth2:managelinkedlogins'] = 'Manage own linked login accounts';
@@ -277,13 +277,13 @@ class condition extends \core_availability\condition {
if (!isset($sectionprevious[$othercm->section])) {
$sectionprevious[$othercm->section] = $lastcmid;
}
if ($lastcmid) {
$this->modfastprevious[$othercm->id] = $lastcmid;
}
// Load previous to all cms with completion.
if ($othercm->completion == COMPLETION_TRACKING_NONE) {
continue;
}
if ($lastcmid) {
$this->modfastprevious[$othercm->id] = $lastcmid;
}
$lastcmid = $othercm->id;
}
// Fill empty sections index.
@@ -32,7 +32,7 @@ Feature: Confirm that availability_completion works with previous activity setti
And I expand all fieldsets
And I click on "Add restriction..." "button"
And I click on "Activity completion" "button" in the "Add restriction..." "dialogue"
And I click on "Displayed greyed-out if user does not meet this condition Click to hide" "link"
And I click on "Displayed if student doesn't meet this condition Click to hide" "link"
And I set the field "Activity or resource" to "Previous activity with completion"
And I press "Save and return to course"
Then I should see "Not available unless: The previous activity with completion" in the "region-main" "region"
@@ -58,7 +58,7 @@ Feature: Confirm that availability_completion works with previous activity setti
And I expand all fieldsets
And I click on "Add restriction..." "button"
And I click on "Activity completion" "button" in the "Add restriction..." "dialogue"
And I click on "Displayed greyed-out if user does not meet this condition Click to hide" "link"
And I click on "Displayed if student doesn't meet this condition Click to hide" "link"
And I set the field "Activity or resource" to "Previous activity with completion"
And I press "Save and return to course"
Then I should see "Not available unless: The previous activity with completion" in the "region-main" "region"
@@ -83,7 +83,7 @@ Feature: Confirm that availability_completion works with previous activity setti
And I expand all fieldsets
And I click on "Add restriction..." "button"
And I click on "Activity completion" "button" in the "Add restriction..." "dialogue"
And I click on "Displayed greyed-out if user does not meet this condition Click to hide" "link"
And I click on "Displayed if student doesn't meet this condition Click to hide" "link"
And I set the field "Activity or resource" to "Previous activity with completion"
And I press "Save and return to course"
Then I should see "Not available unless: The previous activity with completion" in the "region-main" "region"
@@ -112,7 +112,7 @@ Feature: Confirm that availability_completion works with previous activity setti
And I expand all fieldsets
And I click on "Add restriction..." "button"
And I click on "Activity completion" "button" in the "Add restriction..." "dialogue"
And I click on "Displayed greyed-out if user does not meet this condition Click to hide" "link"
And I click on "Displayed if student doesn't meet this condition Click to hide" "link"
And I set the field "Activity or resource" to "Previous activity with completion"
And I press "Save changes"
Then I should see "Not available unless: The previous activity with completion" in the "region-main" "region"
@@ -138,7 +138,7 @@ Feature: Confirm that availability_completion works with previous activity setti
And I expand all fieldsets
And I click on "Add restriction..." "button"
And I click on "Activity completion" "button" in the "Add restriction..." "dialogue"
And I click on "Displayed greyed-out if user does not meet this condition Click to hide" "link"
And I click on "Displayed if student doesn't meet this condition Click to hide" "link"
Then the "Activity or resource" select box should not contain "Previous activity with completion"
# Set Page2 restriction to Previous Activity with completion and delete Page1.
@@ -148,7 +148,7 @@ Feature: Confirm that availability_completion works with previous activity setti
And I expand all fieldsets
And I click on "Add restriction..." "button"
And I click on "Activity completion" "button" in the "Add restriction..." "dialogue"
And I click on "Displayed greyed-out if user does not meet this condition Click to hide" "link"
And I click on "Displayed if student doesn't meet this condition Click to hide" "link"
And I set the field "Activity or resource" to "Previous activity with completion"
And I press "Save and return to course"
Then I should see "Not available unless: The previous activity with completion" in the "region-main" "region"
@@ -170,7 +170,7 @@ Feature: Confirm that availability_completion works with previous activity setti
And I expand all fieldsets
And I click on "Add restriction..." "button"
And I click on "Activity completion" "button" in the "Add restriction..." "dialogue"
And I click on "Displayed greyed-out if user does not meet this condition Click to hide" "link"
And I click on "Displayed if student doesn't meet this condition Click to hide" "link"
And I set the field "Activity or resource" to "Previous activity with completion"
And I press "Save changes"
Then I should see "Not available unless: The previous activity with completion" in the "region-main" "region"
@@ -184,7 +184,7 @@ Feature: Confirm that availability_completion works with previous activity setti
And I expand all fieldsets
And I click on "Add restriction..." "button"
And I click on "Activity completion" "button" in the "Add restriction..." "dialogue"
And I click on "Displayed greyed-out if user does not meet this condition Click to hide" "link"
And I click on "Displayed if student doesn't meet this condition Click to hide" "link"
And I set the field "Activity or resource" to "Previous activity with completion"
And I press "Save changes"
Then I should see "Not available unless: The previous activity with completion" in the "region-main" "region"
@@ -380,7 +380,7 @@ class condition_test extends \advanced_testcase {
/**
* Tests the is_available and get_description functions for previous activity option.
*
* @dataProvider test_previous_activity_data
* @dataProvider previous_activity_data
* @param int $grade the current assign grade (0 for none)
* @param int $condition true for complete, false for incomplete
* @param string $mark activity to mark as complete
@@ -469,7 +469,7 @@ class condition_test extends \advanced_testcase {
$this->assertMatchesRegularExpression($description, $information);
}
public function test_previous_activity_data(): array {
public function previous_activity_data(): array {
// Assign grade, condition, activity to complete, activity to test, result, resultnot, description.
return [
'Missing previous activity complete' => [
@@ -561,7 +561,7 @@ class condition_test extends \advanced_testcase {
* Tests the is_available and get_description functions for
* previous activity option in course sections.
*
* @dataProvider test_section_previous_activity_data
* @dataProvider section_previous_activity_data
* @param int $condition condition value
* @param bool $mark if Page 1 must be mark as completed
* @param string $section section to add the availability
@@ -634,7 +634,7 @@ class condition_test extends \advanced_testcase {
}
public function test_section_previous_activity_data(): array {
public function section_previous_activity_data(): array {
return [
// Condition, Activity completion, section to test, result, resultnot, description.
'Completion complete Section with no previous activity' => [
@@ -34,11 +34,11 @@ $string['option_min'] = 'must be &#x2265;';
$string['option_max'] = 'must be <';
$string['pluginname'] = 'Restriction by grades';
$string['requires_any'] = 'You have a grade in <strong>{$a}</strong>';
$string['requires_max'] = 'You get an appropriate score in <strong>{$a}</strong>';
$string['requires_min'] = 'You achieve a required score in <strong>{$a}</strong>';
$string['requires_max'] = 'You achieve lower than a certain score in <strong>{$a}</strong>';
$string['requires_min'] = 'You achieve higher than a certain score in <strong>{$a}</strong>';
$string['requires_notany'] = 'You do not have a grade in <strong>{$a}</strong>';
$string['requires_notgeneral'] = 'You do not get certain scores in <strong>{$a}</strong>';
$string['requires_range'] = 'You get a particular score in <strong>{$a}</strong>';
$string['requires_range'] = 'You achieve a score within a certain range in <strong>{$a}</strong>';
$string['missing'] = '(missing activity)';
$string['title'] = 'Grade';
$string['privacy:metadata'] = 'The Restriction by grades plugin does not store any personal data.';
@@ -159,5 +159,5 @@ Feature: availability_grade
# Student sees information about no access to group, with group name in correct language.
When I am on the "C1" "Course" page logged in as "student1"
Then I should see "Not available unless: You achieve a required score in A-One"
Then I should see "Not available unless: You achieve higher than a certain score in A-One"
And I should not see "A-Un"
@@ -77,7 +77,7 @@ class condition_test extends \advanced_testcase {
$this->assertFalse($cond->is_available(false, $info, true, $user->id));
$information = $cond->get_description(false, false, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~achieve a required score.*Test!~', $information);
$this->assertMatchesRegularExpression('~achieve higher than.*Test!~', $information);
$this->assertTrue($cond->is_available(true, $info, true, $user->id));
// Min grade (success).
@@ -95,7 +95,7 @@ class condition_test extends \advanced_testcase {
$this->assertFalse($cond->is_available(false, $info, true, $user->id));
$information = $cond->get_description(false, false, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~get an appropriate score.*Test!~', $information);
$this->assertMatchesRegularExpression('~achieve lower than a certain score in.*Test!~', $information);
$this->assertTrue($cond->is_available(true, $info, true, $user->id));
// Max grade (success).
@@ -113,7 +113,7 @@ class condition_test extends \advanced_testcase {
$this->assertFalse($cond->is_available(false, $info, true, $user->id));
$information = $cond->get_description(false, false, $info);
$information = \core_availability\info::format_info($information, $course);
$this->assertMatchesRegularExpression('~get a particular score.*Test!~', $information);
$this->assertMatchesRegularExpression('~achieve a score within a certain range.*Test!~', $information);
$this->assertTrue($cond->is_available(true, $info, true, $user->id));
// Still fail (other end).
@@ -64,7 +64,7 @@ class frontend extends \core_availability\frontend {
global $DB;
if ($courseid != $this->allgroupingscourseid) {
$this->allgroupings = $DB->get_records('groupings',
array('courseid' => $courseid), 'id, name');
['courseid' => $courseid], 'name');
$this->allgroupingscourseid = $courseid;
}
return $this->allgroupings;
@@ -197,7 +197,12 @@ class condition extends \core_availability\condition {
$this->customfield);
}
} else {
$translatedfieldname = \core_user\fields::get_display_name($this->standardfield);
$standardfields = self::get_standard_profile_fields();
if (array_key_exists($this->standardfield, $standardfields)) {
$translatedfieldname = $standardfields[$this->standardfield];
} else {
$translatedfieldname = get_string('missing', 'availability_profile', $this->standardfield);
}
}
$a = new \stdClass();
// Not safe to call format_string here; use the special function to call it later.
@@ -321,6 +326,27 @@ class condition extends \core_availability\condition {
return $fieldconditionmet;
}
/**
* Return list of standard user profile fields used by the condition
*
* @return string[]
*/
public static function get_standard_profile_fields(): array {
return [
'firstname' => \core_user\fields::get_display_name('firstname'),
'lastname' => \core_user\fields::get_display_name('lastname'),
'email' => \core_user\fields::get_display_name('email'),
'city' => \core_user\fields::get_display_name('city'),
'country' => \core_user\fields::get_display_name('country'),
'idnumber' => \core_user\fields::get_display_name('idnumber'),
'institution' => \core_user\fields::get_display_name('institution'),
'department' => \core_user\fields::get_display_name('department'),
'phone1' => \core_user\fields::get_display_name('phone1'),
'phone2' => \core_user\fields::get_display_name('phone2'),
'address' => \core_user\fields::get_display_name('address'),
];
}
/**
* Gets data about custom profile fields. Cached statically in current
* request.
@@ -472,6 +498,11 @@ class condition extends \core_availability\condition {
$valuefield = 'data';
$default = $customfield->defaultdata;
} else {
$standardfields = self::get_standard_profile_fields();
if (!array_key_exists($this->standardfield, $standardfields)) {
// If the field isn't found, nobody matches.
return [];
}
$values = $DB->get_records_select('user', 'id ' . $sql, $params,
'', 'id, '. $this->standardfield);
$valuefield = $this->standardfield;
@@ -595,6 +626,11 @@ class condition extends \core_availability\condition {
$where = "(ud.data IS NOT NULL AND $condition)";
}
} else {
$standardfields = self::get_standard_profile_fields();
if (!array_key_exists($this->standardfield, $standardfields)) {
// If the field isn't found, nobody matches.
return ['SELECT id FROM {user} WHERE 0 = 1', []];
}
$tablesql = "JOIN {user} u ON u.id = userids.id";
list ($where, $mainparams) = $this->get_condition_sql(
'u.' . $this->standardfield);
@@ -42,20 +42,9 @@ class frontend extends \core_availability\frontend {
protected function get_javascript_init_params($course, \cm_info $cm = null,
\section_info $section = null) {
// Standard user fields.
$standardfields = array(
'firstname' => \core_user\fields::get_display_name('firstname'),
'lastname' => \core_user\fields::get_display_name('lastname'),
'email' => \core_user\fields::get_display_name('email'),
'city' => \core_user\fields::get_display_name('city'),
'country' => \core_user\fields::get_display_name('country'),
'idnumber' => \core_user\fields::get_display_name('idnumber'),
'institution' => \core_user\fields::get_display_name('institution'),
'department' => \core_user\fields::get_display_name('department'),
'phone1' => \core_user\fields::get_display_name('phone1'),
'phone2' => \core_user\fields::get_display_name('phone2'),
'address' => \core_user\fields::get_display_name('address')
);
$standardfields = condition::get_standard_profile_fields();
\core_collator::asort($standardfields);
// Custom fields.
@@ -39,7 +39,7 @@ $string['requires_notendswith'] = 'Your <strong>{$a->field}</strong> does not en
$string['requires_notisequalto'] = 'Your <strong>{$a->field}</strong> is not <strong>{$a->value}</strong>';
$string['requires_notstartswith'] = 'Your <strong>{$a->field}</strong> does not start with <strong>{$a->value}</strong>';
$string['requires_startswith'] = 'Your <strong>{$a->field}</strong> starts with <strong>{$a->value}</strong>';
$string['missing'] = '(Missing custom field: {$a})';
$string['missing'] = '(Missing field: {$a})';
$string['title'] = 'User profile';
$string['op_contains'] = 'contains';
$string['op_doesnotcontain'] = 'doesn\'t contain';
@@ -62,19 +62,11 @@ 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 |
# Set field value for user.
And I navigate to "Users > Accounts > Browse list of users" in site administration
And I click on ".icon[title=Edit]" "css_element" in the "s@example.com" "table_row"
And I am on the "s@example.com" "user > editing" page logged in as "admin"
And I expand all fieldsets
And I set the field "Super field" to "Bananaman"
And I click on "Update profile" "button"
@@ -55,7 +55,7 @@ Feature: display_availability
And I set the field "x[month]" to "March"
And I press "Save and return to course"
# Add a Page with 2 restrictions - one is set to hide from students if failed.
# Add a Page with 2 restrictions - one is set to Hide on course page if failed.
And I add a "Page" to section "2"
And I set the following fields to these values:
| Name | Page 2 |
@@ -86,13 +86,13 @@ Feature: edit_availability
And I should see "Date" in the "Restrict access" "fieldset"
And ".availability-item .availability-eye img" "css_element" should be visible
And ".availability-item .availability-delete img" "css_element" should be visible
And the "alt" attribute of ".availability-item .availability-eye img" "css_element" should contain "Displayed greyed-out"
And the "alt" attribute of ".availability-item .availability-eye img" "css_element" should contain "Displayed if student"
# Toggle the eye icon.
When I click on ".availability-item .availability-eye img" "css_element"
Then the "alt" attribute of ".availability-item .availability-eye img" "css_element" should contain "Hidden entirely"
When I click on ".availability-item .availability-eye img" "css_element"
Then the "alt" attribute of ".availability-item .availability-eye img" "css_element" should contain "Displayed greyed-out"
Then the "alt" attribute of ".availability-item .availability-eye img" "css_element" should contain "Displayed if student"
# Click the delete button.
When I click on ".availability-item .availability-delete img" "css_element"
+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']);
+3 -1
View File
@@ -546,9 +546,11 @@ class backup_course_structure_step extends backup_structure_step {
backup_helper::is_sqlparam('course'),
backup::VAR_PARENTID));
// Section level settings are dealt with in backup_section_structure_step.
// We only need to deal with course level (sectionid = 0) here.
$courseformatoption->set_source_sql('SELECT id, format, sectionid, name, value
FROM {course_format_options}
WHERE courseid = ?', [ backup::VAR_PARENTID ]);
WHERE courseid = ? AND sectionid = 0', [ backup::VAR_PARENTID ]);
$handler = core_course\customfield\course_handler::create();
$fieldsforbackup = $handler->get_instance_data_for_backup($this->task->get_courseid());
@@ -246,16 +246,6 @@ abstract class restore_activity_task extends restore_task {
}
}
/**
* Given a commment area, return the itemname that contains the itemid mappings
*
* By default both are the same (commentarea = itemname), so return it. If some
* module uses a different approach, this method can be overriden in its taks
*/
public function get_comment_mapping_itemname($commentarea) {
return $commentarea;
}
/**
* Define (add) particular steps that each activity can have
*/
+47 -4
View File
@@ -767,6 +767,7 @@ class restore_decode_interlinks extends restore_execution_step {
protected function define_execution() {
// Get the decoder (from the plan)
/** @var restore_decode_processor $decoder */
$decoder = $this->task->get_decoder();
restore_decode_processor::register_link_decoders($decoder); // Add decoder contents and rules
// And launch it, everything will be processed
@@ -1952,6 +1953,10 @@ class restore_course_structure_step extends restore_structure_step {
// Course record ready, update it
$DB->update_record('course', $data);
// Apply any course format options that may be saved against the course
// entity in earlier-version backups.
course_get_format($data)->update_course_format_options($data);
// Role name aliases
restore_dbops::set_course_role_names($this->get_restoreid(), $this->get_courseid());
}
@@ -1989,8 +1994,14 @@ class restore_course_structure_step extends restore_structure_step {
public function process_course_format_option(array $data) : void {
global $DB;
if ($data['sectionid']) {
// Ignore section-level format options saved course-level in earlier-version backups.
return;
}
$courseid = $this->get_courseid();
$record = $DB->get_record('course_format_options', [ 'courseid' => $courseid, 'name' => $data['name'] ], 'id');
$record = $DB->get_record('course_format_options', [ 'courseid' => $courseid, 'name' => $data['name'],
'format' => $data['format'], 'sectionid' => 0 ], 'id');
if ($record !== false) {
$DB->update_record('course_format_options', (object) [ 'id' => $record->id, 'value' => $data['value'] ]);
} else {
@@ -5261,6 +5272,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.
@@ -5276,6 +5288,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
@@ -5284,6 +5297,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) {
@@ -5432,17 +5469,22 @@ class restore_process_file_aliases_queue extends restore_execution_step {
protected function define_execution() {
global $DB;
$this->log('processing file aliases queue', backup::LOG_DEBUG);
$fs = get_file_storage();
// Load the queue.
$aliascount = $DB->count_records('backup_ids_temp',
['backupid' => $this->get_restoreid(), 'itemname' => 'file_aliases_queue']);
$rs = $DB->get_recordset('backup_ids_temp',
array('backupid' => $this->get_restoreid(), 'itemname' => 'file_aliases_queue'),
['backupid' => $this->get_restoreid(), 'itemname' => 'file_aliases_queue'],
'', 'info');
$this->log('processing file aliases queue. ' . $aliascount . ' entries.', backup::LOG_DEBUG);
$progress = $this->task->get_progress();
$progress->start_progress('Processing file aliases queue', $aliascount);
// Iterate over aliases in the queue.
foreach ($rs as $record) {
$progress->increment_progress();
$info = backup_controller_dbops::decode_backup_temp_info($record->info);
// Try to pick a repository instance that should serve the alias.
@@ -5567,6 +5609,7 @@ class restore_process_file_aliases_queue extends restore_execution_step {
}
}
}
$progress->end_progress();
$rs->close();
}
@@ -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
@@ -1806,10 +1806,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;
@@ -1818,8 +1817,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,
@@ -77,6 +77,7 @@ class restore_decode_processor {
*/
public function execute() {
// Iterate over all contents, visiting them
/** @var restore_decode_content $content */
foreach ($this->contents as $content) {
$content->process($this);
}
+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);
}
/**

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