utf8 migrate support for site with roles active, resolved isstudent legacy problem, implemented $CFG->notloggedinroleid

This commit is contained in:
toyomoyo 2006-09-01 09:25:34 +00:00
parent 7222c36bf8
commit 20aeb4b8e3
5 changed files with 171 additions and 118 deletions

View File

@ -23,7 +23,6 @@
require_once('../config.php');
include_once($CFG->dirroot.'/lib/adminlib.php'); // Contains various admin-only functions
include_once($CFG->dirroot.'/lib/ddllib.php'); // Install/upgrade related db functions
$id = optional_param('id', '', PARAM_ALPHANUM);

View File

@ -863,19 +863,40 @@ function get_main_teacher_lang($courseid) {
global $CFG;
static $mainteachercache;
if ($courseid == SITEID || $courseid==0) {
$admin = get_admin();
$mainteachercache[$courseid] = $admin->lang;
return $admin->lang;
}
if (!isset($mainteachercache[$courseid])) {
$SQL = 'SELECT u.lang from '.$CFG->prefix.'user_teachers ut,
'.$CFG->prefix.'course c,
'.$CFG->prefix.'user u WHERE
c.id = ut.course AND ut.course = '.$courseid.' AND u.id = ut.userid ORDER BY ut.authority ASC';
if ($teacher = get_record_sql($SQL, true)) {
/// this is a worse guess
if (!empty($CFG->rolesactive)) {
$context = get_context_instance(CONTEXT_COURSE, $courseid);
$teachers = get_users_by_capability($context, 'moodle/legacy:editingteacher', 'distinct u.*', ' ORDER BY ra.id ASC ', sql_paging_limit(0,1)); // only need first one
$teacher = array_shift($teachers);
$mainteachercache[$courseid] = $teacher->lang;
return $teacher->lang;
/// this is a better guess
} else {
$admin = get_admin();
$mainteachercache[$courseid] = $admin->lang;
return $admin->lang;
$SQL = 'SELECT u.lang from '.$CFG->prefix.'user_teachers ut,
'.$CFG->prefix.'course c,
'.$CFG->prefix.'user u WHERE
c.id = ut.course AND ut.course = '.$courseid.' AND u.id = ut.userid ORDER BY ut.authority ASC';
if ($teacher = get_record_sql($SQL, true)) {
$mainteachercache[$courseid] = $teacher->lang;
return $teacher->lang;
} else {
$admin = get_admin();
$mainteachercache[$courseid] = $admin->lang;
return $admin->lang;
}
}
} else {
return $mainteachercache[$courseid];

View File

@ -32,6 +32,23 @@ define('CONTEXT_BLOCK', 80);
$context_cache = array(); // Cache of all used context objects for performance (by level and instance)
$context_cache_id = array(); // Index to above cache by id
function load_notloggedin_role() {
global $CFG, $USER;
$sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID);
// load default not logged in role capabilities when user is not logged in
$SQL = "select * from {$CFG->prefix}role_capabilities where roleid=$CFG->notloggedinroleid
AND contextid = $sitecontext->id";
$capabilities = get_records_sql($SQL);
foreach ($capabilities as $capability) {
$USER->capabilities[$sitecontext->id][$capability->capability] = $capability->permission;
}
return true;
}
/**
* This functions get all the course categories in proper order
@ -140,13 +157,18 @@ function require_capability($capability, $context=NULL, $userid=NULL, $errormess
* @param string $capability - name of the capability
* @param object $context - a context object (record from context table)
* @param integer $userid - a userid number
* @param bool $doanything - if false, ignore do anything
* @return bool
*/
function has_capability($capability, $context=NULL, $userid=NULL) {
function has_capability($capability, $context=NULL, $userid=NULL, $doanything='true') {
global $USER, $CONTEXT;
global $USER, $CONTEXT, $CFG;
if ($userid) {
if (!isloggedin() && !isset($USER->capabilities)) {
load_notloggedin_role();
}
if ($userid && $userid != $USER->id) {
if (empty($USER->id) or ($userid != $USER->id)) {
$capabilities = load_user_capability($capability, $context, $userid);
} else { //$USER->id == $userid
@ -168,102 +190,103 @@ function has_capability($capability, $context=NULL, $userid=NULL) {
}
}
// Check site
$sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID);
if (isset($capabilities[$sitecontext->id]['moodle/site:doanything'])) {
return (0 < $capabilities[$sitecontext->id]['moodle/site:doanything']);
}
if ($doanything) {
// Check site
$sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID);
if (isset($capabilities[$sitecontext->id]['moodle/site:doanything'])) {
return (0 < $capabilities[$sitecontext->id]['moodle/site:doanything']);
}
switch ($context->aggregatelevel) {
switch ($context->aggregatelevel) {
case CONTEXT_COURSECAT:
// Check parent cats.
$parentcats = get_parent_cats($context, CONTEXT_COURSECAT);
foreach ($parentcats as $parentcat) {
if (isset($capabilities[$parentcat]['moodle/site:doanything'])) {
return (0 < $capabilities[$parentcat]['moodle/site:doanything']);
case CONTEXT_COURSECAT:
// Check parent cats.
$parentcats = get_parent_cats($context, CONTEXT_COURSECAT);
foreach ($parentcats as $parentcat) {
if (isset($capabilities[$parentcat]['moodle/site:doanything'])) {
return (0 < $capabilities[$parentcat]['moodle/site:doanything']);
}
}
}
break;
break;
case CONTEXT_COURSE:
// Check parent cat.
$parentcats = get_parent_cats($context, CONTEXT_COURSE);
case CONTEXT_COURSE:
// Check parent cat.
$parentcats = get_parent_cats($context, CONTEXT_COURSE);
foreach ($parentcats as $parentcat) {
if (isset($capabilities[$parentcat]['do_anything'])) {
return (0 < $capabilities[$parentcat]['do_anything']);
}
}
break;
case CONTEXT_GROUP:
// Find course.
$group = get_record('groups','id',$context->instanceid);
$courseinstance = get_context_instance(CONTEXT_COURSE, $group->courseid);
$parentcats = get_parent_cats($courseinstance, CONTEXT_COURSE);
foreach ($parentcats as $parentcat) {
if (isset($capabilities[$parentcat->id]['do_anything'])) {
return (0 < $capabilities[$parentcat->id]['do_anything']);
}
}
$coursecontext = '';
if (isset($capabilities[$courseinstance->id]['do_anything'])) {
return (0 < $capabilities[$courseinstance->id]['do_anything']);
}
break;
case CONTEXT_MODULE:
// Find course.
$cm = get_record('course_modules', 'id', $context->instanceid);
$courseinstance = get_context_instance(CONTEXT_COURSE, $cm->course);
if ($parentcats = get_parent_cats($courseinstance, CONTEXT_COURSE)) {
foreach ($parentcats as $parentcat) {
if (isset($capabilities[$parentcat]['do_anything'])) {
return (0 < $capabilities[$parentcat]['do_anything']);
}
}
}
break;
if (isset($capabilities[$courseinstance->id]['do_anything'])) {
return (0 < $capabilities[$courseinstance->id]['do_anything']);
}
case CONTEXT_GROUP:
// Find course.
$group = get_record('groups','id',$context->instanceid);
$courseinstance = get_context_instance(CONTEXT_COURSE, $group->courseid);
break;
case CONTEXT_BLOCK:
// 1 to 1 to course.
// Find course.
$block = get_record('block_instance','id',$context->instanceid);
$courseinstance = get_context_instance(CONTEXT_COURSE, $block->pageid); // needs check
$parentcats = get_parent_cats($courseinstance, CONTEXT_COURSE);
foreach ($parentcats as $parentcat) {
if (isset($capabilities[$parentcat]['do_anything'])) {
return (0 < $capabilities[$parentcat]['do_anything']);
$parentcats = get_parent_cats($courseinstance, CONTEXT_COURSE);
foreach ($parentcats as $parentcat) {
if (isset($capabilities[$parentcat->id]['do_anything'])) {
return (0 < $capabilities[$parentcat->id]['do_anything']);
}
}
}
if (isset($capabilities[$courseinstance->id]['do_anything'])) {
return (0 < $capabilities[$courseinstance->id]['do_anything']);
}
break;
$coursecontext = '';
if (isset($capabilities[$courseinstance->id]['do_anything'])) {
return (0 < $capabilities[$courseinstance->id]['do_anything']);
}
default:
// CONTEXT_SYSTEM: CONTEXT_PERSONAL: CONTEXT_USERID:
// Do nothing.
break;
break;
case CONTEXT_MODULE:
// Find course.
$cm = get_record('course_modules', 'id', $context->instanceid);
$courseinstance = get_context_instance(CONTEXT_COURSE, $cm->course);
if ($parentcats = get_parent_cats($courseinstance, CONTEXT_COURSE)) {
foreach ($parentcats as $parentcat) {
if (isset($capabilities[$parentcat]['do_anything'])) {
return (0 < $capabilities[$parentcat]['do_anything']);
}
}
}
if (isset($capabilities[$courseinstance->id]['do_anything'])) {
return (0 < $capabilities[$courseinstance->id]['do_anything']);
}
break;
case CONTEXT_BLOCK:
// 1 to 1 to course.
// Find course.
$block = get_record('block_instance','id',$context->instanceid);
$courseinstance = get_context_instance(CONTEXT_COURSE, $block->pageid); // needs check
$parentcats = get_parent_cats($courseinstance, CONTEXT_COURSE);
foreach ($parentcats as $parentcat) {
if (isset($capabilities[$parentcat]['do_anything'])) {
return (0 < $capabilities[$parentcat]['do_anything']);
}
}
if (isset($capabilities[$courseinstance->id]['do_anything'])) {
return (0 < $capabilities[$courseinstance->id]['do_anything']);
}
break;
default:
// CONTEXT_SYSTEM: CONTEXT_PERSONAL: CONTEXT_USERID:
// Do nothing.
break;
}
// Last: check self.
if (isset($capabilities[$context->id]['do_anything'])) {
return (0 < $capabilities[$context->id]['do_anything']);
}
}
// Last: check self.
if (isset($capabilities[$context->id]['do_anything'])) {
return (0 < $capabilities[$context->id]['do_anything']);
}
// do_anything has not been set, we now look for it the normal way.
return (0 < capability_search($capability, $context, $capabilities));
@ -279,9 +302,9 @@ function has_capability($capability, $context=NULL, $userid=NULL) {
* @return permission (int)
*/
function capability_search($capability, $context, $capabilities) {
global $USER, $CFG;
if (isset($capabilities[$context->id][$capability])) {
if ($CFG->debug > 15) {
notify("Found $capability in context $context->id at level $context->aggregatelevel: ".$capabilities[$context->id][$capability], 'notifytiny');
@ -374,6 +397,11 @@ function load_user_capability($capability='', $context ='', $userid='') {
global $USER, $CFG;
// make sure it's cleaned when loaded (again)
if (!empty($USER->capabilities)) {
unset($USER->capabilities);
}
if (empty($userid)) {
$userid = $USER->id;
} else {
@ -1509,11 +1537,11 @@ function role_context_capabilities($roleid, $context, $cap='') {
$sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID);
if ($sitecontext->id == $context->id) {
return array();
$contexts = array($sitecontext->id);
} else {
// first of all, figure out all parental contexts
$contexts = array_reverse(get_parent_contexts($context));
}
// first of all, figure out all parental contexts
$contexts = array_reverse(get_parent_contexts($context));
$contexts = '('.implode(',', $contexts).')';
if ($cap) {
@ -1903,7 +1931,7 @@ function get_overridable_roles ($context) {
* @param $fields - fields to be pulled
* @param $sort - the sort order
*/
function get_users_by_capability($context, $capability, $fields='distinct u.*', $sort='') {
function get_users_by_capability($context, $capability, $fields='distinct u.*', $sort='', $limit='') {
global $CFG;
@ -1930,7 +1958,7 @@ function get_users_by_capability($context, $capability, $fields='distinct u.*',
$from = ' FROM '.$CFG->prefix.'user u LEFT JOIN '.$CFG->prefix.'role_assignments ra ON ra.userid = u.id ';
$where = ' WHERE (ra.contextid = '.$context->id.' OR ra.contextid in '.$listofcontexts.') AND u.deleted = 0 AND ra.roleid in '.$roleids.' ';
return get_records_sql($select.$from.$where);
return get_records_sql($select.$from.$where.$sort.$limit);
}
?>

View File

@ -47,7 +47,7 @@ function get_guest() {
/**
* Returns $user object of the main admin user
*
* primary admin = admin with lowest role_assignment id among admins
* @uses $CFG
* @return object(admin) An associative array representing the admin user.
* @todo Verify documentation of this function
@ -74,12 +74,11 @@ function get_admin () {
function get_admins() {
global $CFG;
$context = get_context_instance(CONTEXT_SYSTEM, SITEID);
return get_records_sql("SELECT u.*, a.id as adminid
FROM {$CFG->prefix}user u,
{$CFG->prefix}user_admins a
WHERE a.userid = u.id
ORDER BY a.id ASC");
return get_users_by_capability($context, 'moodle/legacy:admin', 'distinct u.*, ra.id as adminid', ' ORDER BY ra.id ASC '); // only need first one
}
/**

View File

@ -1983,9 +1983,9 @@ function isadmin($userid=0) {
$context = get_context_instance(CONTEXT_SYSTEM, SITEID);
if (!$userid) {
return has_capability('moodle/legacy:admin', $context);
return has_capability('moodle/legacy:admin', $context, $USER->id, false);
} else {
return has_capability('moodle/legacy:admin', $context, false, $userid);
return has_capability('moodle/legacy:admin', $context, false, $userid, false);
}
}
@ -2044,11 +2044,13 @@ function isteacher($courseid=0, $userid=0, $includeadmin=true) {
if (!$userid) {
return (has_capability('moodle/legacy:teacher', $context)
or has_capability('moodle/legacy:editingteacher', $context));
return (has_capability('moodle/legacy:teacher', $context, $USER->id, false)
or has_capability('moodle/legacy:editingteacher', $context, $USER->id, false)
or has_capability('moodle/legacy:admin', $context, $USER->id, false));
} else {
return (has_capability('moodle/legacy:teacher', $context, $userid)
or has_capability('moodle/legacy:editingteacher', $context, $userid));
return (has_capability('moodle/legacy:teacher', $context, $userid, false)
or has_capability('moodle/legacy:editingteacher', $context, $userid, false)
or has_capability('moodle/legacy:admin', $context, $userid, false));
}
}
@ -2135,9 +2137,11 @@ function isteacheredit($courseid, $userid=0, $ignorestudentview=false) {
}
if (!$userid) {
return has_capability('moodle/legacy:editingteacher', $context);
return (has_capability('moodle/legacy:editingteacher', $context, $USER->id, false)
or has_capability('moodle/legacy:admin', $context, $USER->id, false));
} else {
return has_capability('moodle/legacy:editingteacher', $context, $userid);
return (has_capability('moodle/legacy:editingteacher', $context, $userid, false)
or has_capability('moodle/legacy:admin', $context, $userid, false));
}
}
// we can't edit in studentview
@ -2177,9 +2181,11 @@ function iscreator ($userid=0) {
$context = get_context_instance(CONTEXT_SYSTEM, SITEID);
if (!$userid) {
return has_capability('moodle/legacy:coursecreator', $context);
return (has_capability('moodle/legacy:coursecreator', $context, $USER->id, false)
or has_capability('moodle/legacy:admin', $context, $USER->id, false));
} else {
return has_capability('moodle/legacy:coursecreator', $context, $userid);
return (has_capability('moodle/legacy:coursecreator', $context, $userid, false)
or has_capability('moodle/legacy:admin', $context, $userid, false));
}
}
@ -2221,9 +2227,9 @@ function isstudent($courseid, $userid=0) {
}
if (!$userid) {
return has_capability('moodle/legacy:student', $context);
return has_capability('moodle/legacy:student', $context, $USER->id, false);
} else {
return has_capability('moodle/legacy:student', $context, $userid);
return has_capability('moodle/legacy:student', $context, $userid, false);
}
}