Skip to content

Commit

Permalink
MDL-65061 enrol: Add suspend and other behaviours to IMS enrol plugin
Browse files Browse the repository at this point in the history
Change-Id: Ia169a8c1dae9c6132d40158ac2a3e346dc3f5e1e
Co-authored-by: Sarah Cotton <sarah.cotton@catalyst-eu.net>
Co-authored-by: Mark Johnson <mark.johnson@catalyst-eu.net>
  • Loading branch information
3 people committed Sep 20, 2022
1 parent b077af7 commit 73cb052
Show file tree
Hide file tree
Showing 4 changed files with 767 additions and 9 deletions.
6 changes: 6 additions & 0 deletions enrol/imsenterprise/lang/en/enrol_imsenterprise.php
Expand Up @@ -93,3 +93,9 @@
$string['ignore'] = 'Ignore';
$string['importimsfile'] = 'Import IMS Enterprise file';
$string['privacy:metadata'] = 'The IMS Enterprise file enrolment plugin does not store any personal data.';
$string['unenrolaction'] = 'Unenrol action';
$string['unenrolaction_desc'] = 'Action to be taken when a user is unenrolled from a course (only applied when the <strong>unenrol</strong> setting above is active)';
$string['disableenrolonly'] = 'Suspend enrolment only';
$string['disableenrolmentandremoveallroles'] = 'Suspend enrolment & remove roles';
$string['noaction'] = 'No action';
$string['removeenrolmentandallroles'] = 'Delete enrolment & roles';
79 changes: 70 additions & 9 deletions enrol/imsenterprise/lib.php
Expand Up @@ -584,7 +584,11 @@ protected function process_person_tag($tagcontents) {
$this->log_line("Created user record ('.$id.') for user '$person->username' (ID number $person->idnumber).");
}
} else if ($createnewusers) {
$this->log_line("User record already exists for user '$person->username' (ID number $person->idnumber).");

$username = $person->username ?? "[unknown username]";
$personnumber = $person->idnumber ?? "[unknown ID number]";

$this->log_line("User record already exists for user '" . $username . "' (ID number " . $personnumber . ").");

// It is totally wrong to mess with deleted users flag directly in database!!!
// There is no official way to undelete user, sorry..
Expand Down Expand Up @@ -683,10 +687,12 @@ protected function process_membership_tag($tagcontents) {

// Decide the "real" role (i.e. the Moodle role) that this user should be assigned to.
// Zero means this roletype is supposed to be skipped.
$moodleroleid = $this->rolemappings[$member->roletype];
$moodleroleid = (isset($member->roletype) && isset($this->rolemappings[$member->roletype]))
? $this->rolemappings[$member->roletype] : null;
if (!$moodleroleid) {
$this->log_line("SKIPPING role $member->roletype for $memberstoreobj->userid "
."($member->idnumber) in course $memberstoreobj->course");
$this->log_line("SKIPPING role " .
($member->roletype ?? "[]") . " for $memberstoreobj->userid " .
"($member->idnumber) in course $memberstoreobj->course");
continue;
}

Expand Down Expand Up @@ -741,25 +747,80 @@ protected function process_membership_tag($tagcontents) {

} else if ($this->get_config('imsunenrol')) {
// Unenrol member.
$unenrolsetting = $this->get_config('unenrolaction');

$einstances = $DB->get_records('enrol',
array('enrol' => $memberstoreobj->enrol, 'courseid' => $courseobj->id));
foreach ($einstances as $einstance) {
// Unenrol the user from all imsenterprise enrolment instances.
$this->unenrol_user($einstance, $memberstoreobj->userid);

switch ($unenrolsetting) {
case ENROL_EXT_REMOVED_SUSPEND:
case ENROL_EXT_REMOVED_SUSPENDNOROLES: {
foreach ($einstances as $einstance) {
$this->update_user_enrol($einstance, $memberstoreobj->userid,
ENROL_USER_SUSPENDED, $timeframe->begin, $timeframe->end);

$this->log_line("Suspending user enrolment for $member->idnumber in " .
" course $ship->coursecode ");

if (intval($unenrolsetting) === intval(ENROL_EXT_REMOVED_SUSPENDNOROLES)) {
if (!$context =
context_course::instance($courseobj->id, IGNORE_MISSING)) {

$this->log_line("Unable to process IMS unenrolment request " .
" because course context not found. User: " .
"#$memberstoreobj->userid ($member->idnumber) , " .
" course: $memberstoreobj->course");
} else {

role_unassign_all([
'contextid' => $context->id,
'userid' => $memberstoreobj->userid,
'component' => 'enrol_imsenterprise',
'itemid' => $einstance->id
]);

$this->log_line("Removing role assignments for user " .
"$member->idnumber from role $moodleroleid in course " .
"$ship->coursecode ");
}
}
}
}
break;

case ENROL_EXT_REMOVED_UNENROL: {
foreach ($einstances as $einstance) {
$this->unenrol_user($einstance, $memberstoreobj->userid);
$this->log_line("Removing user enrolment record for $member->idnumber " .
" in course $ship->coursecode ");
}
}
break;

case ENROL_EXT_REMOVED_KEEP: {
$this->log_line("Processed KEEP IMS unenrol instruction (i.e. do nothing)");
}
break;

default:
$this->log_line("Unable to process IMS unenrolment request because " .
" the value set for plugin parameter, unenrol action, is not recognised. " .
" User: #$memberstoreobj->userid ($member->idnumber) " .
" , course: $memberstoreobj->course");
break;
}

$membersuntally++;
$this->log_line("Unenrolled $member->idnumber from role $moodleroleid in course");
}

}
}
$this->log_line("Added $memberstally users to course $ship->coursecode");
if ($membersuntally > 0) {
$this->log_line("Removed $membersuntally users from course $ship->coursecode");
$this->log_line("Processed $membersuntally unenrol instructions for course $ship->coursecode");
}
}

} // End process_membership_tag().

/**
Expand Down
15 changes: 15 additions & 0 deletions enrol/imsenterprise/settings.php
Expand Up @@ -111,6 +111,21 @@
$settings->add(new admin_setting_configcheckbox('enrol_imsenterprise/imsunenrol',
get_string('allowunenrol', 'enrol_imsenterprise'), get_string('allowunenrol_desc', 'enrol_imsenterprise'), 0));

/* Action to take when a request to remove a user enrolment record is detected in the IMS file */
$options = [
ENROL_EXT_REMOVED_KEEP => get_string('noaction', 'enrol_imsenterprise'),
ENROL_EXT_REMOVED_UNENROL => get_string('removeenrolmentandallroles', 'enrol_imsenterprise'),
ENROL_EXT_REMOVED_SUSPEND => get_string('disableenrolonly', 'enrol_imsenterprise'),
ENROL_EXT_REMOVED_SUSPENDNOROLES => get_string('disableenrolmentandremoveallroles', 'enrol_imsenterprise'),
];

$settings->add(
new admin_setting_configselect('enrol_imsenterprise/unenrolaction',
get_string('unenrolaction', 'enrol_imsenterprise'),
get_string('unenrolaction_desc', 'enrol_imsenterprise'),
ENROL_EXT_REMOVED_UNENROL, $options)
);

if (!during_initial_install()) {
$imscourses = new imsenterprise_courses();
foreach ($imscourses->get_courseattrs() as $courseattr) {
Expand Down

0 comments on commit 73cb052

Please sign in to comment.