]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-10635 improved performance of update_course_icon() and friends; fixed parameter...
authorskodak <skodak>
Sat, 25 Aug 2007 11:28:37 +0000 (11:28 +0000)
committerskodak <skodak>
Sat, 25 Aug 2007 11:28:37 +0000 (11:28 +0000)
lib/accesslib.php
lib/moodlelib.php
lib/pagelib.php
lib/weblib.php

index c32b5aa1449961ff9f4bc1df85c88feba7034d85..de52ba2209bd892f14b9f4582dcd1c9a0bc8e07c 100755 (executable)
@@ -377,6 +377,37 @@ function require_capability($capability, $context=NULL, $userid=NULL, $doanythin
     }
 }
 
+/**
+ * Cheks if current user has allowed permission for any of submitted capabilities
+ * in given or child contexts.
+ * @param object $context - a context object (record from context table)
+ * @param array $capabilitynames array of strings, capability names
+ * @return boolean
+ */
+function has_capability_including_child_contexts($context, $capabilitynames) {
+    global $USER;
+
+    foreach ($capabilitynames as $capname) {
+        if (has_capability($capname, $context)) {
+            return true;
+        }
+    }
+
+    if ($children = get_child_contexts($context)) {
+        foreach ($capabilitynames as $capname) {
+            foreach ($children as $child) {
+                if (isset($USER->capabilities[$child][$capname]) and $USER->capabilities[$child][$capname] == CAP_ALLOW) {
+                    // extra check for inherited prevent and prohibit
+                    if (has_capability($capname, get_context_instance_by_id($child), $USER->id, false)) {
+                        return true;
+                    }
+                }
+            }
+        }
+    }
+
+    return false;
+}
 
 /**
  * This function returns whether the current user has the capability of performing a function
@@ -3976,6 +4007,7 @@ function role_switch($roleid, $context) {
         || !empty($USER->switchrole[$context->id])  || !confirm_sesskey()) {
 
         unset($USER->switchrole[$context->id]);  // Delete old capabilities
+        unset($USER->courseeditallowed);               // drop cache for course edit button
         load_all_capabilities();   //reload user caps
         return true;
     }
@@ -3995,6 +4027,7 @@ function role_switch($roleid, $context) {
 /// We have a valid roleid that this user can switch to, so let's set up the session
 
     $USER->switchrole[$context->id] = $roleid;     // So we know later what state we are in
+    unset($USER->courseeditallowed);                     // drop cache for course edit button
 
     load_all_capabilities();   //reload switched role caps
 
index 03eb2395961695fd38da43d18f3cea1df1d2051d..10dfc0c691dcfff2988da65d598bb16eeecdb06f 100644 (file)
@@ -2204,44 +2204,43 @@ function isguestuser($user=NULL) {
 }
 
 /**
- * Determines if the currently logged in user is in editing mode
+ * Determines if the currently logged in user is in editing mode.
+ * Note: originally this function had $userid parameter - it was not usable anyway
  *
  * @uses $USER
  * @param int $courseid The id of the course being tested
- * @param user $user A {@link $USER} object. If null then the currently logged in user is used.
  * @return bool
  */
-function isediting($courseid, $user=NULL) {
+function isediting($courseid) {
     global $USER;
-    if (!$user) {
-        $user = $USER;
-    }
-    if (empty($user->editing)) {
+
+    if (empty($USER->editing)) {
         return false;
+
+    } else {
+        return editcourseallowed($courseid);
     }
+}
+
+/**
+ * Verifies if user allowed to edit something in the course page.
+ * @param int $courseid The id of the course being tested
+ * @return bool
+ */
+function editcourseallowed($courseid) {
+    global $USER;
 
-    $capcheck = false;
-    $coursecontext = get_context_instance(CONTEXT_COURSE, $courseid);
+    // cache the result per course, it is automatically reset when using switchrole or loginas
+    if (!array_key_exists('courseeditallowed', $USER)) {
+        $USER->courseeditallowed = array();
+    }
 
-    if (has_capability('moodle/course:manageactivities', $coursecontext) ||
-        has_capability('moodle/site:manageblocks', $coursecontext)) {
-        $capcheck = true;
-    } else {
-        // loop through all child context, see if user has moodle/course:manageactivities or moodle/site:manageblocks
-        if ($children = get_child_contexts($coursecontext)) {
-            foreach ($children as $child) {
-                $childcontext = get_record('context', 'id', $child);
-                if (has_capability('moodle/course:manageactivities', $childcontext) ||
-                    has_capability('moodle/site:manageblocks', $childcontext)) {
-                    $capcheck = true;
-                    break;
-                }
-            }
-        }
+    if (!array_key_exists($courseid, $USER->courseeditallowed)) {
+        $USER->courseeditallowed[$courseid] = has_capability_including_child_contexts(get_context_instance(CONTEXT_COURSE, $courseid),
+                                            array('moodle/site:manageblocks', 'moodle/course:manageactivities'));
     }
 
-    return ($user->editing && $capcheck);
-    //return ($user->editing and has_capability('moodle/course:manageactivities', get_context_instance(CONTEXT_COURSE, $courseid)));
+    return $USER->courseeditallowed[$courseid];
 }
 
 /**
index f5498cdca230b48202c09d0204fa1c7d64547cee..f30a3ded36b8af8a6d36fdb0858d09323522cea2 100644 (file)
@@ -345,32 +345,14 @@ class page_course extends page_base {
 
     // Can user edit the course page or "sticky page"?
     // This is also about editting of blocks BUT mainly activities in course page layout, see
-    // update_course_icon() - it must use the same capability
+    // update_course_icon() has very similar checks - it must use the same capabilities
     function user_allowed_editing() {
+        global $USER;
+
         if (has_capability('moodle/site:manageblocks', get_context_instance(CONTEXT_SYSTEM)) && defined('ADMIN_STICKYBLOCKS')) {
             return true;
         }
-
-        $coursecontext = get_context_instance(CONTEXT_COURSE, $this->id);
-        $capcheck = false;   
-        if (has_capability('moodle/course:manageactivities', $coursecontext) ||
-            has_capability('moodle/site:manageblocks', $coursecontext)) {
-            $capcheck = true;      
-        } else {
-            // loop through all child context, see if user has moodle/course:manageactivities or moodle/site:manageblocks  
-            if ($children = get_child_contexts($coursecontext)) {
-                foreach ($children as $child) {
-                    $childcontext = get_record('context', 'id', $child);
-                    if (has_capability('moodle/course:manageactivities', $childcontext) ||
-                        has_capability('moodle/site:manageblocks', $childcontext)) {
-                        $capcheck = true;
-                        break;
-                    }             
-                }          
-            }
-        }
-        
-    return $capcheck;
+        return editcourseallowed($this->id);
     }
 
     // Is the user actually editing this course page or "sticky page" right now?
index 6f70b23a8f672f7fc279bf734df1ce2d1e3bf43e..4bf121e06ca574174541f248eaf40d2a36539461 100644 (file)
@@ -4440,32 +4440,9 @@ function print_editor_config($editorhidebuttons='', $return=false) {
  * @return string
  */
 function update_course_icon($courseid) {
-
     global $CFG, $USER;
 
-    $coursecontext = get_context_instance(CONTEXT_COURSE, $courseid);
-
-    $capcheck = false;
-
-    if (has_capability('moodle/course:manageactivities', $coursecontext) ||
-        has_capability('moodle/site:manageblocks', $coursecontext)) {
-        $capcheck = true;
-    } else {
-        // loop through all child context, see if user has moodle/course:manageactivities or moodle/site:manageblocks
-        if ($children = get_child_contexts($coursecontext)) {
-            foreach ($children as $child) {
-                $childcontext = get_record('context', 'id', $child);
-                if (has_capability('moodle/course:manageactivities', $childcontext) ||
-                    has_capability('moodle/site:manageblocks', $childcontext)) {
-                    $capcheck = true;
-                    break;
-                }
-            }
-        }
-    }
-
-
-    if ($capcheck) {
+    if (editcourseallowed($courseid)) {
         if (!empty($USER->editing)) {
             $string = get_string('turneditingoff');
             $edit = '0';