role assignment and unassignment now propagates to metacourses

This commit is contained in:
skodak
2006-09-17 08:42:42 +00:00
parent ff64aaeaec
commit 4e5f3064bf
2 changed files with 55 additions and 47 deletions
+51 -23
View File
@@ -1416,6 +1416,18 @@ function role_assign($roleid, $userid, $groupid, $contextid, $timestart=0, $time
/// Make sure they have an entry in user_lastaccess for courses they can access
// role_add_lastaccess_entries($userid, $context);
}
/// now handle metacourse role assignments if in course context
if ($success and $context->aggregatelevel == CONTEXT_COURSE) {
if ($parents = get_records('course_meta', 'child_course', $context->instanceid)) {
foreach ($parents as $parent) {
if ($metacontext = get_context_instance(CONTEXT_COURSE, $parent->parent_course)) {
// try it even when something failed
$success = $success and role_assign($roleid, $userid, $groupid, $metacontext->id, $timestart, $timeend, $hidden, $enrol);
}
}
}
}
return $success;
}
@@ -1432,6 +1444,8 @@ function role_assign($roleid, $userid, $groupid, $contextid, $timestart=0, $time
function role_unassign($roleid=0, $userid=0, $groupid=0, $contextid=0) {
global $USER, $CFG;
$success = true;
$args = array('roleid', 'userid', 'groupid', 'contextid');
$select = array();
@@ -1442,37 +1456,51 @@ function role_unassign($roleid=0, $userid=0, $groupid=0, $contextid=0) {
}
if ($select) {
if (delete_records_select('role_assignments', implode(' AND ', $select))) {
/// If the user is the current user, then reload the capabilities too.
if (!empty($USER->id) && $USER->id == $userid) {
load_user_capability();
}
if ($contextid) {
if ($context = get_record('context', 'id', $contextid)) {
if ($ras = get_records_select('role_assignments', implode(' AND ', $select))) {
$mods = get_list_of_plugins('mod');
foreach($ras as $ra) {
$success = delete_records('role_assignments', 'id', $ra->id) and $success;
/// If the user is the current user, then reload the capabilities too.
if (!empty($USER->id) && $USER->id == $ra->userid) {
load_user_capability();
}
$context = get_record('context', 'id', $ra->contextid);
/// Ask all the modules if anything needs to be done for this user
if ($mods = get_list_of_plugins('mod')) {
foreach ($mods as $mod) {
include_once($CFG->dirroot.'/mod/'.$mod.'/lib.php');
$functionname = $mod.'_role_unassign';
if (function_exists($functionname)) {
$functionname($userid, $context);
foreach ($mods as $mod) {
include_once($CFG->dirroot.'/mod/'.$mod.'/lib.php');
$functionname = $mod.'_role_unassign';
if (function_exists($functionname)) {
$functionname($ra->userid, $context); // watch out, $context might be NULL if something goes wrong
}
}
/// now handle metacourse role unassigment and removing from goups if in course context
if (!empty($context) and $context->aggregatelevel == CONTEXT_COURSE) {
//remove from groups when user has no role
$roles = get_user_roles($context, $ra->userid, true);
if (empty($roles)) {
if ($groups = get_groups($context->instanceid, $ra->userid)) {
foreach ($groups as $group) {
delete_records('groups_members', 'groupid', $group->id, 'userid', $ra->userid);
}
}
}
//unassign roles in metacourses too
if ($parents = get_records('course_meta', 'child_course', $context->instanceid)) {
foreach ($parents as $parent) {
if ($metacontext = get_context_instance(CONTEXT_COURSE, $parent->parent_course)) {
// ignore errors in metacourses in case they are not properly synchronized
role_unassign($roleid, $userid, $groupid, $metacontext->id);
}
}
}
/// Remove entries from user_lastaccess for courses they can no longer access
//role_add_lastaccess_entries($userid, $context);
}
}
return true;
}
return false;
}
return true;
return $success;
}
/**
@@ -2445,4 +2473,4 @@ function get_role_users($roleid, $context, $parent=false) {
return get_records_sql($SQL);
}
?>
?>
+4 -24
View File
@@ -316,15 +316,6 @@ function enrol_student($userid, $courseid, $timestart=0, $timeend=0, $enrol='man
return false;
}
/// Enrol the student in any parent meta courses...
if ($parents = get_records('course_meta', 'child_course', $courseid)) {
foreach ($parents as $parent) {
if ($metacontext = get_context_instance(CONTEXT_COURSE, $parent->parent_course)) {
role_assign($role->id, $user->id, 0, $metacontext->id, $timestart, $timeend, 0, 'metacourse');
}
}
}
return role_assign($role->id, $user->id, 0, $context->id, $timestart, $timeend, 0, $enrol);
}
@@ -348,18 +339,7 @@ function unenrol_student($userid, $courseid=0) {
delete_records('forum_subscriptions', 'forum', $forum->id, 'userid', $userid);
}
}
if ($groups = get_groups($courseid, $userid)) {
foreach ($groups as $group) {
delete_records('groups_members', 'groupid', $group->id, 'userid', $userid);
}
}
/// unenroll from all parent metacourses
if ($parents = get_records('course_meta','child_course',$courseid)) {
foreach ($parents as $parent) {
$status = $status and unenrol_student($userid, $parent->parent_course);
}
}
/// remove from all student roles
/// remove from all legacy student roles
if ($courseid == SITEID) {
$context = get_context_instance(CONTEXT_SYSTEM, SITEID);
} else if (!$context = get_context_instance(CONTEXT_COURSE, $courseid)) {
@@ -369,13 +349,13 @@ function unenrol_student($userid, $courseid=0) {
return false;
}
foreach($roles as $role) {
$status = $status and role_unassign($role->id, $userid, 0, $context);
$status = role_unassign($role->id, $userid, 0, $context) and $status;
}
} else {
// recursivelly unenroll student from all course
// recursivelly unenroll student from all courses
if ($courses = get_records('course')) {
foreach($courses as $course) {
$status = $status and unenrol_student($userid, $course->id);
$status = unenrol_student($userid, $course->id) and $status;
}
}
}