Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
66a2296
MDL-87356 qtype_random: orphaned random questions should be deleted
james-cnz Dec 1, 2025
c300545
MDL-82281 quiz: Amend test to circumvent modinfo cache fails.
lucaboesch Jun 25, 2024
a45cfb7
MDL-87340 mod_quiz: make test_question_shuffle more robust
lameze Dec 7, 2025
dcd55b5
Merge branch 'mdl-87356_405' of https://github.com/james-cnz/moodle i…
Dec 9, 2025
f5fc38f
Merge branch 'MDL-82281-405' of https://github.com/lucaboesch/moodle …
Dec 9, 2025
70ba060
MDL-86416 navigation: Render the more menu only when it's not empty
stopfstedt Oct 29, 2025
367a2a7
MDL-86805 courseindex: Fix RTL keyboard navigation in tree
andimendunia Dec 9, 2025
3d812fe
MDL-86807 core_courseformat: RTL chevron in move activity modal
muhammadarnaldo Dec 9, 2025
806b3f2
Merge branch 'MDL-86805-405' of https://github.com/andimendunia/moodl…
junpataleta Dec 9, 2025
5a40f55
Merge branch 'MDL-86807-405' of https://github.com/muhammadarnaldo/mo…
junpataleta Dec 9, 2025
0e0bdbd
MDL-84736 gradingform : Behat for editing guide with graded submissions
andelacruz Mar 5, 2025
3902694
MDL-84736 behat: add custom step to edit a criterion
lameze Mar 19, 2025
4112aa8
Automatically generated installer lang files
Dec 11, 2025
a2aaba5
Merge branch 'MDL-84736-405' of https://github.com/lameze/moodle into…
HuongNV13 Dec 11, 2025
9ebe2f8
MDL-86420 enrol_database: avoid duplicate key violations
muhammadarnaldo Dec 10, 2025
6139a04
Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbo…
rezaies Dec 12, 2025
b357491
weekly release 4.5.8+
rezaies Dec 12, 2025
dd9b7e8
MDL-87428 core_course: Fix RTL keyboard navigation
muhammadarnaldo Dec 12, 2025
d404adf
MDL-87443 behat: define new Toast message named selector.
paulholden Dec 11, 2025
39096ac
MDL-87443 reportbuilder: use Toast selector in Behat scenarios.
paulholden Dec 11, 2025
0620c07
MDL-87415 profile: set page title when accessed as guest user.
stopfstedt Dec 10, 2025
2025178
MDL-86436 navigation: hide empty page heading menu.
stopfstedt Dec 13, 2025
7049a83
MDL-87341 javascript: Fix aria label issue for navigation bar
TomoTsuyuki Dec 14, 2025
c083984
MDL-87094 core_course: Behat to restrict available activities/resources
andelacruz Dec 4, 2025
ede9478
Merge branch 'MDL-87341_405' of https://github.com/TomoTsuyuki/moodle…
junpataleta Dec 15, 2025
1ef3216
Merge branch 'MDL-86416-405' of https://github.com/junpataleta/moodle…
Dec 17, 2025
31c83f8
Merge branch 'MDL-87094-405' of https://github.com/andelacruz/moodle …
HuongNV13 Dec 17, 2025
6880fa0
Merge branch 'MDL-86420-405' of https://github.com/muhammadarnaldo/mo…
HuongNV13 Dec 18, 2025
d807b51
Merge branch 'MDL-87428-405' of https://github.com/muhammadarnaldo/mo…
junpataleta Dec 18, 2025
6eb5c80
Merge branch 'MDL-87340-405' of https://github.com/lameze/moodle into…
HuongNV13 Dec 18, 2025
9e2daa9
weekly release 4.5.8+
HuongNV13 Dec 19, 2025
c03ad2f
MDL-87433 course: Add sorting to get_nearest_editable_subcategory
muhammadarnaldo Dec 24, 2025
52ef396
MDL-81882 core: Optimize block instance deletion with batch processing
yusufwib01 Nov 14, 2025
df9acfa
Merge branch 'MDL-87433-405' of https://github.com/muhammadarnaldo/mo…
HuongNV13 Dec 29, 2025
8fec0dc
Merge branch 'MDL-81882-405' of https://github.com/yusufwib01/moodle …
HuongNV13 Dec 29, 2025
f833fba
MDL-87416 glossary: set page title on glossary entry details page.
stopfstedt Dec 12, 2025
794b06c
Merge branch 'MDL-87416-glossary-entry-page-title-missing-M4.5' of ht…
junpataleta Jan 7, 2026
e3a4f45
Merge branch 'MDL-86436-navigation-accessibility-page-heading-menu-vi…
junpataleta Jan 7, 2026
771e06b
MDL-87288 output: Fix pagination in small containers.
Dec 18, 2025
b275637
Merge branch 'MDL-87288-405' of https://github.com/ilyatregubov/moodl…
paulholden Jan 7, 2026
e394149
weekly release 4.5.8+
HuongNV13 Jan 9, 2026
c13c753
MDL-87088 core_grades: Behat to view grades from user menu
andelacruz Dec 4, 2025
61dc480
MDL-77162 filepicker: default to selecting first repository available.
stopfstedt Dec 15, 2025
4290c0d
Merge branch 'MDL-87088-405' of https://github.com/andelacruz/moodle …
HuongNV13 Jan 12, 2026
1646ab8
MDL-87088 behat: add missing @javascript tags to required tests
lameze Jan 12, 2026
e46b6a5
MDL-85535 forum: Label discussion navigation
junpataleta Dec 3, 2025
f009e8e
MDL-85535 forum: Render discussion navigation at the bottom only
junpataleta Dec 3, 2025
8e40b62
MDL-87638 feedback: Fix usage of sortable list
junpataleta Jan 12, 2026
72fb26e
Automatically generated installer lang files
Jan 13, 2026
c991393
Merge branch 'MDL-87443-405' of https://github.com/paulholden/moodle …
HuongNV13 Jan 13, 2026
f0c8417
MDL-87634 core: exclude fixtures from Github actions "one-by-one" job.
paulholden Jan 12, 2026
b17cba4
Merge branch 'MDL-87634-405' of https://github.com/paulholden/moodle …
snake Jan 15, 2026
9ce4d3a
Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbo…
snake Jan 16, 2026
23ad73e
weekly release 4.5.8+
snake Jan 16, 2026
9c9b316
MDL-87090 mod_assign : Teacher can override assignment deadlines
mioyu-ubiq Jan 6, 2026
99809ba
MDL-87090 behat: improve new test
lameze Jan 19, 2026
3c3f130
Automatically generated installer lang files
Jan 20, 2026
e195cb3
MDL-87092 tool_uploaduser: suspend enrolments via CSV upload
Kredelirious Jan 20, 2026
5bff1a6
MDL-86639 groups: Wrap group names in grade report group selector
yusufwib01 Jan 14, 2026
93045eb
Automatically generated installer lang files
Jan 21, 2026
f6c8f4a
MDL-86527 behat: Fix random failures when toggling edit mode
muhammadarnaldo Dec 23, 2025
894f2f1
MDL-86527 behat: Avoid element-click-intercepted failures
muhammadarnaldo Dec 23, 2025
f557352
Merge branch 'MDL-87090-405' of https://github.com/lameze/moodle into…
HuongNV13 Jan 22, 2026
35ad89a
Merge branch 'MDL-87092-405' of https://github.com/Kredelirious/moodl…
HuongNV13 Jan 22, 2026
d4c569d
Merge branch 'MDL-86527-405' of https://github.com/HuongNV13/moodle i…
safatshahin Jan 22, 2026
3dcfe65
Automatically generated installer lang files
Jan 23, 2026
39012d0
MDL-87018 qtype_essay: Add unit tests for un_summarise_response().
bhect0 Nov 4, 2025
d3eaf24
Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbo…
HuongNV13 Jan 26, 2026
e4c595a
weekly release 4.5.8+
HuongNV13 Jan 26, 2026
a68bc93
MDL-87675 core: Add delay for displaying the YUI alert dialogue message
nvhai248 Jan 28, 2026
2edd3e1
MDL-86994 mod_assign: Behat to test permitted users can edit submission
mioyu-ubiq Jan 20, 2026
1b56df0
Merge branch 'MDL-86639-405' of https://github.com/yusufwib01/moodle …
junpataleta Jan 28, 2026
53f4183
MDL-87521 behat: better error reporting if an adhoc task fails
timhunt Dec 22, 2025
9118477
Automatically generated installer lang files
Jan 29, 2026
ec6551c
MDL-87087 tool_dataprivacy: Test data request by authorized user
andelacruz Jan 14, 2026
5567567
Merge branch 'MDL-87018-405' of https://github.com/bhect0/moodle into…
HuongNV13 Jan 29, 2026
cbeefb6
Merge branch 'MDL-86994-405' of https://github.com/mioyu-ubiq/moodle …
HuongNV13 Jan 29, 2026
f4254a2
Merge branch 'MDL-87087-405' of https://github.com/lameze/moodle into…
HuongNV13 Jan 29, 2026
641639c
Merge branch 'MDL-87521_405' of https://github.com/timhunt/moodle int…
HuongNV13 Jan 29, 2026
adfde92
MDL-87789 libraries: patch lti1p3 for certification support
snake Jan 29, 2026
6bf1093
MDL-86437 enrol_lti: Cast scoreGiven to float for LTI compliance
gcfgo Oct 2, 2025
156d7a5
Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbo…
HuongNV13 Jan 30, 2026
aa24806
weekly release 4.5.8+
HuongNV13 Jan 30, 2026
1768ae9
Automatically generated installer lang files
Jan 31, 2026
a528f9c
MDL-86905 core: Use proper link markup for email links
junpataleta Oct 20, 2025
f3b0bb1
MDL-87694 core: `headinglevel` display option for $OUTPUT->confirm()
junpataleta Jan 28, 2026
890849b
MDL-87694 profile: set top level heading when accessed as guest user.
stopfstedt Feb 2, 2026
c6d921e
MDL-87694 profile: set page title to "Login required".
stopfstedt Feb 2, 2026
6f84540
MDL-87694 core: prevent empty heading in context header.
stopfstedt Feb 2, 2026
ffb5bfe
Automatically generated installer lang files
Feb 3, 2026
417c399
Merge branch 'MDL-87675-405' of https://github.com/nvhai248/moodle in…
HuongNV13 Feb 3, 2026
c2bd37c
Merge branch 'MDL-86905-405' of https://github.com/junpataleta/moodle…
HuongNV13 Feb 3, 2026
d3ec08f
Merge branch 'MDL-87694-course-participant-profile-missing-heading-M4…
junpataleta Feb 3, 2026
1241a17
MDL-87258 mod_lti: request access for PNA
rjnl Jan 26, 2026
4dce7cd
Merge branch 'MDL-87638-405' of https://github.com/junpataleta/moodle…
snake Feb 3, 2026
50c2251
Merge branch 'MDL-77162-filepicker-a11y-tab-order-repository-keyboard…
junpataleta Feb 3, 2026
3e2dbf5
Merge branch 'MDL-85535-405' of https://github.com/junpataleta/moodle…
snake Feb 3, 2026
1ecd11e
Automatically generated installer lang files
Feb 4, 2026
b1ba8e6
Merge branch 'MDL-87789-405' of https://github.com/snake/moodle into …
Feb 4, 2026
f3227be
MDL-87612 repository: safer unserializing of file source data.
paulholden Jan 30, 2026
6d92262
MDL-87843 filter_tex: Switch to use Colour picker setting
HuongNV13 Feb 3, 2026
cba59e5
Merge branch 'MDL-86437-405' of https://github.com/snake/moodle into …
Feb 4, 2026
f9a2bb1
MDL-87757 block_myoverview: fix the heading-order
muhammadarnaldo Jan 27, 2026
1d95966
MDL-87757 block_myoverview: Remove navigation role and behat update
muhammadarnaldo Feb 3, 2026
857c907
MDL-86785 tiny_equation: Add timeout handling for mimetex execution
yusufwib01 Oct 11, 2025
e526991
MDL-87352 admin: Add MoodleNet removal warnings
andimendunia Feb 3, 2026
43874f1
Merge branch 'MDL-87757-405' of https://github.com/muhammadarnaldo/mo…
junpataleta Feb 4, 2026
31d96fb
Merge branch 'MDL-87258-405' of https://github.com/rjnl/moodle into M…
Feb 4, 2026
3cf9457
MDL-87594 composer: Upgrade symfony/process to v6.4.33
yusufwib01 Feb 3, 2026
4e8e5ca
Merge branch 'MDL-87352-405' of https://github.com/andimendunia/moodl…
HuongNV13 Feb 4, 2026
72f49e4
MDL-87870 filter_tex: escape background argument content.
paulholden Feb 4, 2026
f3748c1
MDL-87870 admin: tighten up validation of colour picker values.
paulholden Feb 4, 2026
caab968
Merge branch 'install_405_STABLE' of https://git.in.moodle.com/amosbo…
Feb 5, 2026
1a8415f
NOBUG: Add upgrade notes
Feb 5, 2026
afe3c2b
weekly release 4.5.8+
Feb 5, 2026
506a4a3
NOBUG: Add upgrade notes
HuongNV13 Feb 6, 2026
6b4d33a
Moodle release 4.5.9
HuongNV13 Feb 6, 2026
1c0e0f5
MDL-87892 admin: Fix MoodleNet removal warning
HuongNV13 Feb 6, 2026
d42c5d9
Merge branch 'MDL-87892-405' of https://github.com/HuongNV13/moodle i…
rezaies Feb 9, 2026
be8d3d0
MDL-87892 admin: Fix MoodleNet check
HuongNV13 Feb 9, 2026
6cfefde
Merge branch 'MDL-87892-405' of https://github.com/HuongNV13/moodle i…
rezaies Feb 9, 2026
7a7f029
weekly release 4.5.9+
HuongNV13 Feb 10, 2026
b2c2f2a
Moodle release 4.5.10
HuongNV13 Feb 11, 2026
9693ead
Merge tag 'v4.5.10' into UCSFCLE_405_STABLE
ctam Feb 12, 2026
8826dc3
Update push.yml to address MySQL issue
ctam Feb 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/onebyone.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ jobs:
chunk=$(((($count % $chunks)) + 1))
echo "$testname $testfile" >> ./chunk_$chunk.txt
done < <(grep "function test_" "${testfile}" | sed -r "s/^.*function (test_[a-zA-Z0-9_]+).*/\1/")
done < <(find . -name "*_test.php")
done < <(find . -name "*_test.php" -not -path "*/fixtures/*")
# Generate the matrix to run tests.
echo "matrix=$(ls -1 chunk_*.txt | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT
echo "$count individual tests collected in $chunks files"
Expand Down
33 changes: 13 additions & 20 deletions .github/workflows/push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,27 +77,20 @@ jobs:
# db: pgsql

steps:
- name: Setting up DB mysql
- name: Run MySQL Server
if: ${{ matrix.db == 'mysqli' }}
uses: moodlehq/mysql-action@v1
with:
collation server: utf8mb4_bin
mysql version: 8.0
mysql database: test
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' }}
# uses: m4nu56/postgresql-action@v1
# with:
# postgresql version: 13
# postgresql db: test
# postgresql user: test
# postgresql password: test
run: |
docker run --rm \
-e MYSQL_DATABASE=test \
-e MYSQL_USER=test \
-e MYSQL_PASSWORD=test \
-e MYSQL_ROOT_PASSWORD=test \
-p 3306:3306 \
-d \
--tmpfs /var/lib/mysql:rw,noexec,nosuid,size=1024M \
mysql:8.0 \
--skip-log-bin \
--collation-server=utf8mb4_bin

- name: Configuring git vars
uses: rlespinasse/github-slug-action@v4
Expand Down
7 changes: 7 additions & 0 deletions MDL-87443-2025121117305654.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
issueNumber: MDL-87443
notes:
core:
- message: >-
There is a new Behat `toast_message` named selector to more easily
assert the presence of Toast messages on the page
type: improved
10 changes: 10 additions & 0 deletions UPGRADING.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@ More detailed information on key changes can be found in the [Developer update n

The format of this change log follows the advice given at [Keep a CHANGELOG](https://keepachangelog.com).

## 4.5.9

### core

#### Changed

- `\core\output\core_renderer::confirm()`'s `$displayoptions` parameter now also accepts a `headinglevel` option that developers can use to specify the heading level of the confirmation's heading. If not specified, the confirmation heading will be rendered in an `h4` tag.

For more information see [MDL-87694](https://tracker.moodle.org/browse/MDL-87694)

## 4.5.8

### core
Expand Down
30 changes: 24 additions & 6 deletions admin/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -941,9 +941,27 @@

$output = $PAGE->get_renderer('core', 'admin');

echo $output->admin_notifications_page($maturity, $insecuredataroot, $errorsdisplayed, $cronoverdue, $dbproblems,
$maintenancemode, $availableupdates, $availableupdatesfetch, $buggyiconvnomb,
$registered, $cachewarnings, $eventshandlers, $themedesignermode, $devlibdir,
$mobileconfigured, $overridetossl, $invalidforgottenpasswordurl, $croninfrequent,
$showcampaigncontent, $showfeedbackencouragement, $servicesandsupportcontent,
$xmlrpcwarning);
echo $output->admin_notifications_page(
$maturity,
$insecuredataroot,
$errorsdisplayed,
$cronoverdue,
$dbproblems,
$maintenancemode,
$availableupdates,
$availableupdatesfetch,
$buggyiconvnomb,
$registered,
$cachewarnings,
$eventshandlers,
$themedesignermode,
$devlibdir,
$mobileconfigured,
$overridetossl,
$invalidforgottenpasswordurl,
$croninfrequent,
$showcampaigncontent,
$showfeedbackencouragement,
$servicesandsupportcontent,
$xmlrpcwarning
);
47 changes: 40 additions & 7 deletions admin/renderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -282,13 +282,30 @@ public function upgrade_confirm_abort_install_page(array $abortable, moodle_url
*
* @return string HTML to output.
*/
public function admin_notifications_page($maturity, $insecuredataroot, $errorsdisplayed,
$cronoverdue, $dbproblems, $maintenancemode, $availableupdates, $availableupdatesfetch,
$buggyiconvnomb, $registered, array $cachewarnings = array(), $eventshandlers = 0,
$themedesignermode = false, $devlibdir = false, $mobileconfigured = false,
$overridetossl = false, $invalidforgottenpasswordurl = false, $croninfrequent = false,
$showcampaigncontent = false, bool $showfeedbackencouragement = false, bool $showservicesandsupport = false,
$xmlrpcwarning = '') {
public function admin_notifications_page(
$maturity,
$insecuredataroot,
$errorsdisplayed,
$cronoverdue,
$dbproblems,
$maintenancemode,
$availableupdates,
$availableupdatesfetch,
$buggyiconvnomb,
$registered,
array $cachewarnings = [],
$eventshandlers = 0,
$themedesignermode = false,
$devlibdir = false,
$mobileconfigured = false,
$overridetossl = false,
$invalidforgottenpasswordurl = false,
$croninfrequent = false,
$showcampaigncontent = false,
bool $showfeedbackencouragement = false,
bool $showservicesandsupport = false,
$xmlrpcwarning = ''
) {

global $CFG;
$output = '';
Expand All @@ -314,6 +331,7 @@ public function admin_notifications_page($maturity, $insecuredataroot, $errorsdi
$output .= $this->mobile_configuration_warning($mobileconfigured);
$output .= $this->forgotten_password_url_warning($invalidforgottenpasswordurl);
$output .= $this->mnet_deprecation_warning($xmlrpcwarning);
$output .= $this->moodlenet_removal_warning();
$output .= $this->userfeedback_encouragement($showfeedbackencouragement);
$output .= $this->services_and_support_content($showservicesandsupport);
$output .= $this->campaign_content($showcampaigncontent);
Expand Down Expand Up @@ -2267,6 +2285,21 @@ protected function mnet_deprecation_warning($xmlrpcwarning) {
return $this->warning($xmlrpcwarning);
}

/**
* Display a warning about the removal of MoodleNet integration.
*
* @return string HTML to output.
*/
protected function moodlenet_removal_warning(): string {
$moodlenetenabled = get_config('tool_moodlenet', 'enablemoodlenet');
if (!empty($moodlenetenabled)) {
$moodlenetwarning = get_string('moodlenetremovalwarning', 'admin');
return $this->warning($moodlenetwarning);
}

return '';
}

/**
* Renders the theme selector list.
*
Expand Down
100 changes: 100 additions & 0 deletions admin/tool/dataprivacy/tests/behat/user_data_request.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
@tool @tool_dataprivacy
Feature: Authorized users can request others personal data
In order to export or access another users data
As a designated role
I need the correct permissions

Background:
Given the following "users" exist:
| username | firstname | lastname | email |
| user1 | User1 | One | user1@example.com |
| user2 | User2 | Two | user2@example.com |
| officer1 | Officer1 | One | officer1@example.com |
# Create Privacy Officer Role.
And the following "role" exists:
| shortname | privacyofficer |
| name | Privacy Officer |
| context_system | 1 |
| tool/dataprivacy:managedataregistry | allow |
| tool/dataprivacy:managedatarequests | allow |
| tool/dataprivacy:makedatarequestsforchildren | allow |
| moodle/site:configview | allow |
| moodle/category:viewhiddencategories | allow |
| moodle/course:viewhiddencourses | allow |
| moodle/course:viewhiddenactivities | allow |
| moodle/course:view | allow |
# Create Parent Role.
And the following "role" exists:
| shortname | parentrole |
| name | Parent Role |
| context_user | 1 |
| moodle/user:viewdetails | allow |
| moodle/user:viewalldetails | allow |
| moodle/user:readuserblogs | allow |
| moodle/user:readuserposts | allow |
| moodle/user:viewuseractivitiesreport | allow |
| moodle/user:editprofile | allow |
| tool/policy:acceptbehalf | allow |
| tool/dataprivacy:makedatarequestsforchildren | allow |
# Add permission to allow parent to make requests on behalf of child user.
And the following config values are set as admin:
| contactdataprotectionofficer | 1 | tool_dataprivacy |
And I log in as "admin"

@javascript
Scenario: Privacy officer can request for other user's personal data
Given I navigate to "Users > Permissions > Assign system roles" in site administration
# Assign Privacy Officer role to officer1.
And I follow "Privacy Officer"
And I set the field "addselect_searchtext" to "Officer1"
And I set the field "addselect" to "Officer1 One (officer1@example.com)"
And I press "Add"
# Navigate to home in order to navigate properly to Privacy settings.
And I am on site homepage
# Select Privacy officer in the Orivacy officer role mapping setting.
And I navigate to "Users > Privacy and policies > Privacy settings" in site administration
And I click on "Privacy Officer" "checkbox"
And I press "Save changes"
And I log in as "officer1"
And I navigate to "Users > Privacy and policies > Data requests" in site administration
# Create a new request as the designated privacy officer.
When I follow "New request"
And I set the field "User" to "User1 One"
And I set the field "Comment" to "User One data"
And I press "Save changes"
# Confirm that the new data request is successfully created for selected user with status "Awaiting approval".
Then the following should exist in the "generaltable" table:
| Type | User | Requested by | Status | Message |
| Export | User1 One | Officer1 One | Awaiting approval | User One data |

@javascript
Scenario: Parent user can request data on behalf of child user
Given I navigate to "Users > Accounts > Browse list of users" in site administration
And I follow "User1 One"
And I click on "Preferences" "link" in the ".profile_tree" "css_element"
# Assign user2 as parent for user1.
And I follow "Assign roles relative to this user"
And I follow "Parent"
And I set the field "Potential users" to "User2 Two (user2@example.com)"
And I click on "Add" "button" in the "#page-content" "css_element"
And I log in as "user2"
And I follow "Profile" in the user menu
And I follow "Data requests"
# As parent, create a data request for a child user.
And I follow "New request"
And I click on "User" "field"
When I type "User1 One"
# Confirm that only the parent's child users can be searched and selected.
Then I should see "User1 One"
And I type "User2 Two"
And I should see "No suggestions"
And I type "Officer1 One"
And I should see "No suggestions"
And I set the field "Search" to "User1"
And I set the field "Comment" to "This is a comment"
And I press "Save changes"
# Confirm that data request was successfully made by parent on behalf of child user.
And I should see "Your request has been submitted to the privacy officer"
And the following should exist in the "generaltable" table:
| Type | Requested by | Status | Message |
| Export all of my personal data (User1 One) | User2 Two | Awaiting approval | This is a comment |
3 changes: 3 additions & 0 deletions admin/tool/moodlenet/lang/en/tool_moodlenet.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@
$string['defaultmoodlenetname'] = "MoodleNet instance name";
$string['defaultmoodlenetnamevalue'] = 'MoodleNet Central';
$string['defaultmoodlenetname_desc'] = 'The name of the MoodleNet instance available via the activity chooser.';
$string['removalwarning_feature'] = 'If you need to continue using MoodleNet, contact your site administrator about setting up a self-hosted MoodleNet instance.';
$string['removalwarning_service'] = 'After the date, you will no longer be able to browse or add content from MoodleNet Central.';
$string['removalwarning_title'] = 'The MoodleNet service will be shut down on 20 April 2026.';
$string['enablemoodlenet'] = 'Enable MoodleNet integration (inbound)';
$string['enablemoodlenet_desc'] = 'If enabled, a user with the capability to create and manage activities can browse MoodleNet via the activity chooser and import MoodleNet resources into their course. In addition, a user with the capability to restore backups can select a backup file on MoodleNet and restore it into Moodle.';
$string['errorduringdownload'] = 'An error occurred while downloading the file: {$a}';
Expand Down
10 changes: 9 additions & 1 deletion admin/tool/moodlenet/templates/chooser_moodlenet.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,16 @@
<div class="content text-start mb-5 px-5 py-4" data-region="chooser-option-summary-content-container">
<div data-region="moodle-net">
<div class="overlay-icon-container z-index-1 d-none" data-region="spinner"></div>
<img class="w-25 mb-4" aria-hidden="true" src="{{{img}}}">
<img class="w-25 mb-4" alt="" aria-hidden="true" src="{{{img}}}">
<p>{{#str}} instancedescription, tool_moodlenet {{/str}}</p>

{{! Removal warning - always visible when MoodleNet integration is enabled }}
<div class="alert alert-warning w-75 mx-auto mb-3" role="alert">
<strong>{{#str}}removalwarning_title, tool_moodlenet{{/str}}</strong>
<p class="mb-1">{{#str}}removalwarning_service, tool_moodlenet{{/str}}</p>
<p class="mb-0">{{#str}}removalwarning_feature, tool_moodlenet{{/str}}</p>
</div>

<p class="w-75 mx-auto mb-1 mt-5">{{#str}} connectandbrowse, tool_moodlenet {{/str}}</p>
<a class="btn btn-secondary d-block w-75 mx-auto mb-4"
data-action="browse"
Expand Down
41 changes: 41 additions & 0 deletions admin/tool/uploaduser/tests/behat/suspend_user_enrolment.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
@tool @tool_uploaduser @_file_upload
Feature: Admin can suspend user course enrolment via CSV upload
In order to manage enrolments in bulk
As an administrator
I need to be able to enrol and suspend users using CSV upload

Background:
Given the following "courses" exist:
| fullname | shortname |
| Course 1 | C1 |
| Course 2 | C2 |
| Course 3 | C3 |

@javascript
Scenario: Admin uploads enrol and suspend CSVs and verifies enrolment status
Given I log in as "admin"
And I navigate to "Users > Accounts > Upload users" in site administration
When I upload "lib/tests/fixtures/QA_user_enrol.txt" file to "File" filemanager
And I press "Upload users"
And I press "Upload users"
And I press "Continue"
And I upload "lib/tests/fixtures/QA_user_suspend.txt" file to "File" filemanager
And I press "Upload users"
And I set the field "Upload type" to "Update existing users only"
And I press "Upload users"
And I press "Continue"
And I am on the "Course 1" "enrolled users" page
Then the following should exist in the "participants" table:
| First name | Status |
| Learner One | Active |
| Learner Two | Active |
And I am on the "Course 2" "enrolled users" page
And the following should exist in the "participants" table:
| First name | Status |
| Learner One | Active |
| Learner Two | Suspended |
And I am on the "Course 3" "enrolled users" page
And the following should exist in the "participants" table:
| First name | Status |
| Learner One | Suspended |
| Learner Two | Active |
8 changes: 2 additions & 6 deletions auth/oauth2/classes/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -197,9 +197,7 @@ public static function send_confirm_link_login_email($userinfo, $issuer, $userid

$data->link = $confirmationurl->out(false);
$message = get_string('confirmlinkedloginemail', 'auth_oauth2', $data);

$data->link = $confirmationurl->out();
$messagehtml = text_to_html(get_string('confirmlinkedloginemail', 'auth_oauth2', $data), false, false, true);
$messagehtml = text_to_html(get_string('confirmlinkedloginemail', 'auth_oauth2', $data), false, false);

$user->mailformat = 1; // Always send HTML version as well.

Expand Down Expand Up @@ -339,9 +337,7 @@ public static function send_confirm_account_email($userinfo, $issuer) {

$data->link = $confirmationurl->out(false);
$message = get_string('confirmaccountemail', 'auth_oauth2', $data);

$data->link = $confirmationurl->out();
$messagehtml = text_to_html(get_string('confirmaccountemail', 'auth_oauth2', $data), false, false, true);
$messagehtml = text_to_html(get_string('confirmaccountemail', 'auth_oauth2', $data), false, false);

$user->mailformat = 1; // Always send HTML version as well.

Expand Down
Loading