]> git.mjollnir.org Git - moodle.git/commitdiff
utf8 migrate support for site with roles active, resolved isstudent legacy problem...
authortoyomoyo <toyomoyo>
Fri, 1 Sep 2006 09:25:34 +0000 (09:25 +0000)
committertoyomoyo <toyomoyo>
Fri, 1 Sep 2006 09:25:34 +0000 (09:25 +0000)
admin/index.php
admin/utfdbmigrate.php
lib/accesslib.php
lib/datalib.php
lib/moodlelib.php

index e152dbc3782ba68fb44e755efa269e4641622da5..2148c194f08e70e31c0522897873f3292d9869c2 100644 (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);
index b58fbad97c5e2f565b95124908fa5fb0a133921f..746e560ffa62d3480d9482e3338774786e634a5e 100755 (executable)
@@ -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];
index 5ef5189fb2387e0ae99a5494766a50b84eee81cb..107d5af9e67b446e36f0294408ce10d330271dcf 100755 (executable)
@@ -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']);
+                foreach ($parentcats as $parentcat) {
+                    if (isset($capabilities[$parentcat]['do_anything'])) {
+                        return (0 < $capabilities[$parentcat]['do_anything']);
+                    }
                 }
-            }
-        break;
+            break;
 
-        case CONTEXT_GROUP:
-            // Find course.
-            $group = get_record('groups','id',$context->instanceid);
-            $courseinstance = get_context_instance(CONTEXT_COURSE, $group->courseid);
+            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']);
+                $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']);
-            }
+                $coursecontext = '';
+                if (isset($capabilities[$courseinstance->id]['do_anything'])) {
+                    return (0 < $capabilities[$courseinstance->id]['do_anything']);
+                }
 
-        break;
+            break;
 
-        case CONTEXT_MODULE:
-            // Find course.
-            $cm = get_record('course_modules', 'id', $context->instanceid);
-            $courseinstance = get_context_instance(CONTEXT_COURSE, $cm->course);
+            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 ($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']);
-            }
+                if (isset($capabilities[$courseinstance->id]['do_anything'])) {
+                    return (0 < $capabilities[$courseinstance->id]['do_anything']);
+                }
 
-        break;
+            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
+            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]['do_anything'])) {
+                        return (0 < $capabilities[$parentcat]['do_anything']);
+                    }
                 }
-            }
 
-            if (isset($capabilities[$courseinstance->id]['do_anything'])) {
-                return (0 < $capabilities[$courseinstance->id]['do_anything']);
-            }
-        break;
+                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;
-    }
+            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);  
 
 }
 ?>
index 1e957b7f966aae8b95eb477c6b88c1f05390b35b..48a935cb0494ead6e468adb96aa7f2c6b5b61adf 100644 (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
+                             
 }
 
 /**
index b0087a5ff7cc343bddad12bb657a0e3cf6602050..af9a10cbaabca715e7f1651bfb7089abbce5fe64 100644 (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);
         }
     }