MDL-15187 tool_uploaduser: assign system roles from CSV

Added feature to assign/unassign system roles stored in the CSV fields
sysrole1, sysrole2... Roles to be unassigned are prefixed with minus.
This commit is contained in:
Stephen Parry 2015-04-06 12:36:35 +01:00 committed by Andrew Nicols
parent 1d3fd63f97
commit 2a34360ed9
3 changed files with 75 additions and 18 deletions

View File

@ -187,7 +187,8 @@ if ($formdata = $mform2->is_cancelled()) {
// caches // caches
$ccache = array(); // course cache - do not fetch all courses here, we will not probably use them all anyway! $ccache = array(); // course cache - do not fetch all courses here, we will not probably use them all anyway!
$cohorts = array(); $cohorts = array();
$rolecache = uu_allowed_roles_cache(); // roles lookup cache $rolecache = uu_allowed_roles_cache(); // Course roles lookup cache.
$sysrolecache = uu_allowed_sysroles_cache(); // System roles lookup cache.
$manualcache = array(); // cache of used manual enrol plugins in each course $manualcache = array(); // cache of used manual enrol plugins in each course
$supportedauths = uu_supported_auths(); // officially supported plugins that are enabled $supportedauths = uu_supported_auths(); // officially supported plugins that are enabled
@ -889,6 +890,41 @@ if ($formdata = $mform2->is_cancelled()) {
// find course enrolments, groups, roles/types and enrol periods // find course enrolments, groups, roles/types and enrol periods
// this is again a special case, we always do this for any updated or created users // this is again a special case, we always do this for any updated or created users
foreach ($filecolumns as $column) { foreach ($filecolumns as $column) {
if (preg_match('/^sysrole\d+$/', $column)) {
if (!empty($user->$column)) {
$sysrolename = $user->$column;
if ($sysrolename[0] == '-') {
$removing = true;
$sysrolename = substr($sysrolename, 1);
} else {
$removing = false;
}
if (array_key_exists($sysrolename, $sysrolecache)) {
$sysroleid = $sysrolecache[$sysrolename]->id;
} else {
$upt->track('enrolments', get_string('unknownrole', 'error', s($sysrolename)), 'error');
continue;
}
if ($removing) {
if (user_has_role_assignment($user->id, $sysroleid, SYSCONTEXTID)) {
role_unassign($sysroleid, $user->id, SYSCONTEXTID);
$upt->track('enrolments', get_string('unassignedsysrole',
'tool_uploaduser', $sysrolecache[$sysroleid]->name));
}
} else {
if (!user_has_role_assignment($user->id, $sysroleid, SYSCONTEXTID)) {
role_assign($sysroleid, $user->id, SYSCONTEXTID);
$upt->track('enrolments', get_string('assignedsysrole',
'tool_uploaduser', $sysrolecache[$sysroleid]->name));
}
}
}
continue;
}
if (!preg_match('/^course\d+$/', $column)) { if (!preg_match('/^course\d+$/', $column)) {
continue; continue;
} }
@ -927,32 +963,32 @@ if ($formdata = $mform2->is_cancelled()) {
// let's not invent new lang strings here for this rarely used feature. // let's not invent new lang strings here for this rarely used feature.
if (!empty($user->{'role'.$i})) { if (!empty($user->{'role'.$i})) {
$addrole = $user->{'role'.$i}; $rolename = $user->{'role'.$i};
if (array_key_exists($addrole, $rolecache)) { if (array_key_exists($rolename, $rolecache)) {
$rid = $rolecache[$addrole]->id; $roleid = $rolecache[$rolename]->id;
} else { } else {
$upt->track('enrolments', get_string('unknownrole', 'error', s($addrole)), 'error'); $upt->track('enrolments', get_string('unknownrole', 'error', s($rolename)), 'error');
continue; continue;
} }
role_assign($rid, $user->id, context_course::instance($courseid)); role_assign($roleid, $user->id, context_course::instance($courseid));
$a = new stdClass(); $a = new stdClass();
$a->course = $shortname; $a->course = $shortname;
$a->role = $rolecache[$rid]->name; $a->role = $rolecache[$roleid]->name;
$upt->track('enrolments', get_string('enrolledincourserole', 'enrol_manual', $a)); $upt->track('enrolments', get_string('enrolledincourserole', 'enrol_manual', $a));
} }
} else if ($manual and $manualcache[$courseid]) { } else if ($manual and $manualcache[$courseid]) {
// find role // find role
$rid = false; $roleid = false;
if (!empty($user->{'role'.$i})) { if (!empty($user->{'role'.$i})) {
$addrole = $user->{'role'.$i}; $rolename = $user->{'role'.$i};
if (array_key_exists($addrole, $rolecache)) { if (array_key_exists($rolename, $rolecache)) {
$rid = $rolecache[$addrole]->id; $roleid = $rolecache[$rolename]->id;
} else { } else {
$upt->track('enrolments', get_string('unknownrole', 'error', s($addrole)), 'error'); $upt->track('enrolments', get_string('unknownrole', 'error', s($rolename)), 'error');
continue; continue;
} }
@ -965,14 +1001,14 @@ if ($formdata = $mform2->is_cancelled()) {
} else if (empty($formdata->{'uulegacy'.$addtype})) { } else if (empty($formdata->{'uulegacy'.$addtype})) {
continue; continue;
} else { } else {
$rid = $formdata->{'uulegacy'.$addtype}; $roleid = $formdata->{'uulegacy'.$addtype};
} }
} else { } else {
// no role specified, use the default from manual enrol plugin // no role specified, use the default from manual enrol plugin
$rid = $manualcache[$courseid]->roleid; $roleid = $manualcache[$courseid]->roleid;
} }
if ($rid) { if ($roleid) {
// Find duration and/or enrol status. // Find duration and/or enrol status.
$timeend = 0; $timeend = 0;
$status = null; $status = null;
@ -999,11 +1035,11 @@ if ($formdata = $mform2->is_cancelled()) {
$timeend = $today + $manualcache[$courseid]->enrolperiod; $timeend = $today + $manualcache[$courseid]->enrolperiod;
} }
$manual->enrol_user($manualcache[$courseid], $user->id, $rid, $today, $timeend, $status); $manual->enrol_user($manualcache[$courseid], $user->id, $roleid, $today, $timeend, $status);
$a = new stdClass(); $a = new stdClass();
$a->course = $shortname; $a->course = $shortname;
$a->role = $rolecache[$rid]->name; $a->role = $rolecache[$roleid]->name;
$upt->track('enrolments', get_string('enrolledincourserole', 'enrol_manual', $a)); $upt->track('enrolments', get_string('enrolledincourserole', 'enrol_manual', $a));
} }
} }

View File

@ -26,6 +26,7 @@
$string['allowdeletes'] = 'Allow deletes'; $string['allowdeletes'] = 'Allow deletes';
$string['allowrenames'] = 'Allow renames'; $string['allowrenames'] = 'Allow renames';
$string['allowsuspends'] = 'Allow suspending and activating of accounts'; $string['allowsuspends'] = 'Allow suspending and activating of accounts';
$string['assignedsysrole'] = 'Assigned system role {$a}';
$string['csvdelimiter'] = 'CSV delimiter'; $string['csvdelimiter'] = 'CSV delimiter';
$string['defaultvalues'] = 'Default values'; $string['defaultvalues'] = 'Default values';
$string['deleteerrors'] = 'Delete errors'; $string['deleteerrors'] = 'Delete errors';
@ -37,6 +38,7 @@ $string['pluginname'] = 'User upload';
$string['renameerrors'] = 'Rename errors'; $string['renameerrors'] = 'Rename errors';
$string['requiredtemplate'] = 'Required. You may use template syntax here (%l = lastname, %f = firstname, %u = username). See help for details and examples.'; $string['requiredtemplate'] = 'Required. You may use template syntax here (%l = lastname, %f = firstname, %u = username). See help for details and examples.';
$string['rowpreviewnum'] = 'Preview rows'; $string['rowpreviewnum'] = 'Preview rows';
$string['unassignedsysrole'] = 'Unassigned system role {$a}';
$string['uploadpicture_baduserfield'] = 'The user attribute specified is not valid. Please, try again.'; $string['uploadpicture_baduserfield'] = 'The user attribute specified is not valid. Please, try again.';
$string['uploadpicture_cannotmovezip'] = 'Cannot move zip file to temporary directory.'; $string['uploadpicture_cannotmovezip'] = 'Cannot move zip file to temporary directory.';
$string['uploadpicture_cannotprocessdir'] = 'Cannot process unzipped files.'; $string['uploadpicture_cannotprocessdir'] = 'Cannot process unzipped files.';

View File

@ -196,7 +196,7 @@ function uu_validate_user_upload_columns(csv_import_reader $cir, $stdfields, $pr
// hack: somebody wrote uppercase in csv file, but the system knows only lowercase profile field // hack: somebody wrote uppercase in csv file, but the system knows only lowercase profile field
$newfield = $lcfield; $newfield = $lcfield;
} else if (preg_match('/^(cohort|course|group|type|role|enrolperiod|enrolstatus)\d+$/', $lcfield)) { } else if (preg_match('/^(sysrole|cohort|course|group|type|role|enrolperiod|enrolstatus)\d+$/', $lcfield)) {
// special fields for enrolments // special fields for enrolments
$newfield = $lcfield; $newfield = $lcfield;
@ -365,6 +365,25 @@ function uu_allowed_roles_cache() {
return $rolecache; return $rolecache;
} }
/**
* Returns mapping of all system roles using short role name as index.
* @return array
*/
function uu_allowed_sysroles_cache() {
$allowedroles = get_assignable_roles(context_system::instance(), ROLENAME_SHORT);
foreach ($allowedroles as $rid => $rname) {
$rolecache[$rid] = new stdClass();
$rolecache[$rid]->id = $rid;
$rolecache[$rid]->name = $rname;
if (!is_numeric($rname)) { // Only non-numeric shortnames are supported!
$rolecache[$rname] = new stdClass();
$rolecache[$rname]->id = $rid;
$rolecache[$rname]->name = $rname;
}
}
return $rolecache;
}
/** /**
* Pre process custom profile data, and update it with corrected value * Pre process custom profile data, and update it with corrected value
* *