MDL-58140 completion: access control refinements

Part of MDL-58138 epic
This commit is contained in:
Marina Glancy
2017-04-19 08:52:57 +08:00
committed by Jake Dallimore
parent 6e60511953
commit 0cbc248dd3
9 changed files with 114 additions and 38 deletions
+60 -16
View File
@@ -65,26 +65,47 @@ class manager {
$sectionobject = new stdClass();
$sectionobject->sectionnumber = $sectionnumber;
$sectionobject->name = get_section_name($this->courseid, $sectioninfo);
$sectionobject->activities = [];
foreach ($section as $cmid) {
$mod = $moduleinfo->get_cm($cmid);
$moduleobject = new stdClass();
$moduleobject->cmid = $cmid;
$moduleobject->modname = $mod->get_formatted_name();
$moduleobject->icon = $mod->get_icon_url()->out();
$moduleobject->url = $mod->url;
// Get activity completion information.
$moduleobject->completionstatus = $this->get_completion_detail($mod);
$sectionobject->activities[] = $moduleobject;
}
$data->sections[] = $sectionobject;
$activitiesdata = $this->get_activities($section, true);
$sectionobject->activities = $activitiesdata->activities;
$data->sections[] = $sectionobject;
}
return $data;
}
/**
* Gets the data (context) to be used with the activityinstance template
*
* @param array $cmids list of course module ids
* @param bool $withcompletiondetails include completion details
* @return \stdClass
*/
public function get_activities($cmids, $withcompletiondetails = false) {
$moduleinfo = get_fast_modinfo($this->courseid);
$activities = [];
foreach ($cmids as $cmid) {
$mod = $moduleinfo->get_cm($cmid);
if (!$mod->uservisible) {
continue;
}
$moduleobject = new stdClass();
$moduleobject->cmid = $cmid;
$moduleobject->modname = $mod->get_formatted_name();
$moduleobject->icon = $mod->get_icon_url()->out();
$moduleobject->url = $mod->url;
$moduleobject->canmanage = $withcompletiondetails && self::can_edit_bulk_completion($this->courseid, $mod);
// Get activity completion information.
if ($moduleobject->canmanage) {
$moduleobject->completionstatus = $this->get_completion_detail($mod); // This is a placeholder only. Must be replaced later.
} else {
$moduleobject->completionstatus = ['icon' => null, 'string' => null];
}
$activities[] = $moduleobject;
}
return (object)['activities' => $activities];
}
private function get_completion_detail(\cm_info $mod) {
global $OUTPUT;
$strings = [];
@@ -137,4 +158,27 @@ class manager {
return $data;
}
/**
* Checks if current user can edit activity completion
*
* @param int|stdClass $courseorid
* @param \cm_info|null $cm if specified capability for a given coursemodule will be check,
* if not specified capability to edit at least one activity is checked.
*/
public static function can_edit_bulk_completion($courseorid, $cm = null) {
if ($cm) {
return $cm->uservisible && has_capability('moodle/course:manageactivities', $cm->context);
}
$coursecontext = context_course::instance(is_object($courseorid) ? $courseorid->id : $courseorid);
if (has_capability('moodle/course:manageactivities', $coursecontext)) {
return true;
}
$modinfo = get_fast_modinfo($courseorid);
foreach ($modinfo->cms as $mod) {
if ($mod->uservisible && has_capability('moodle/course:manageactivities', $mod->context)) {
return true;
}
}
return false;
}
}