}
}
+/**
+ * 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
|| !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;
}
/// 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
}
/**
- * 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];
}
/**
// 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?
* @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';