mirror of
https://github.com/moodle/moodle.git
synced 2025-01-18 22:08:20 +01:00
MDL-42585 Assign: Add capability to only view grades
AMOS BEGIN CPY [viewgrades,grades],[assign:viewgrades,mod_assign] AMOS END
This commit is contained in:
parent
bdd5a6c5c2
commit
4a47008ca6
@ -143,5 +143,16 @@ $capabilities = array(
|
|||||||
'clonepermissionsfrom' => 'moodle/grade:manage'
|
'clonepermissionsfrom' => 'moodle/grade:manage'
|
||||||
),
|
),
|
||||||
|
|
||||||
|
'mod/assign:viewgrades' => array(
|
||||||
|
'captype' => 'read',
|
||||||
|
'contextlevel' => CONTEXT_MODULE,
|
||||||
|
'archetypes' => array(
|
||||||
|
'editingteacher' => CAP_ALLOW,
|
||||||
|
'manager' => CAP_ALLOW,
|
||||||
|
'teacher' => CAP_ALLOW
|
||||||
|
)
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -52,6 +52,8 @@ class assign_grading_table extends table_sql implements renderable {
|
|||||||
private $quickgrading = false;
|
private $quickgrading = false;
|
||||||
/** @var boolean $hasgrantextension - Only do the capability check once for the entire table */
|
/** @var boolean $hasgrantextension - Only do the capability check once for the entire table */
|
||||||
private $hasgrantextension = false;
|
private $hasgrantextension = false;
|
||||||
|
/** @var boolean $hasgrade - Only do the capability check once for the entire table */
|
||||||
|
private $hasgrade = false;
|
||||||
/** @var array $groupsubmissions - A static cache of group submissions */
|
/** @var array $groupsubmissions - A static cache of group submissions */
|
||||||
private $groupsubmissions = array();
|
private $groupsubmissions = array();
|
||||||
/** @var array $submissiongroups - A static cache of submission groups */
|
/** @var array $submissiongroups - A static cache of submission groups */
|
||||||
@ -83,6 +85,11 @@ class assign_grading_table extends table_sql implements renderable {
|
|||||||
parent::__construct('mod_assign_grading');
|
parent::__construct('mod_assign_grading');
|
||||||
$this->assignment = $assignment;
|
$this->assignment = $assignment;
|
||||||
|
|
||||||
|
// Check permissions up front.
|
||||||
|
$this->hasgrantextension = has_capability('mod/assign:grantextension',
|
||||||
|
$this->assignment->get_context());
|
||||||
|
$this->hasgrade = $this->assignment->can_grade();
|
||||||
|
|
||||||
foreach ($assignment->get_feedback_plugins() as $plugin) {
|
foreach ($assignment->get_feedback_plugins() as $plugin) {
|
||||||
if ($plugin->is_visible() && $plugin->is_enabled()) {
|
if ($plugin->is_visible() && $plugin->is_enabled()) {
|
||||||
foreach ($plugin->get_grading_batch_operations() as $action => $description) {
|
foreach ($plugin->get_grading_batch_operations() as $action => $description) {
|
||||||
@ -94,7 +101,7 @@ class assign_grading_table extends table_sql implements renderable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->perpage = $perpage;
|
$this->perpage = $perpage;
|
||||||
$this->quickgrading = $quickgrading;
|
$this->quickgrading = $quickgrading && $this->hasgrade;
|
||||||
$this->output = $PAGE->get_renderer('mod_assign');
|
$this->output = $PAGE->get_renderer('mod_assign');
|
||||||
|
|
||||||
$urlparams = array('action'=>'grading', 'id'=>$assignment->get_course_module()->id);
|
$urlparams = array('action'=>'grading', 'id'=>$assignment->get_course_module()->id);
|
||||||
@ -225,7 +232,7 @@ class assign_grading_table extends table_sql implements renderable {
|
|||||||
$headers = array();
|
$headers = array();
|
||||||
|
|
||||||
// Select.
|
// Select.
|
||||||
if (!$this->is_downloading()) {
|
if (!$this->is_downloading() && $this->hasgrade) {
|
||||||
$columns[] = 'select';
|
$columns[] = 'select';
|
||||||
$headers[] = get_string('select') .
|
$headers[] = get_string('select') .
|
||||||
'<div class="selectall"><label class="accesshide" for="selectall">' . get_string('selectall') . '</label>
|
'<div class="selectall"><label class="accesshide" for="selectall">' . get_string('selectall') . '</label>
|
||||||
@ -302,7 +309,7 @@ class assign_grading_table extends table_sql implements renderable {
|
|||||||
$columns[] = 'gradecanbechanged';
|
$columns[] = 'gradecanbechanged';
|
||||||
$headers[] = get_string('gradecanbechanged', 'assign');
|
$headers[] = get_string('gradecanbechanged', 'assign');
|
||||||
}
|
}
|
||||||
if (!$this->is_downloading()) {
|
if (!$this->is_downloading() && $this->hasgrade) {
|
||||||
// We have to call this column userid so we can use userid as a default sortable column.
|
// We have to call this column userid so we can use userid as a default sortable column.
|
||||||
$columns[] = 'userid';
|
$columns[] = 'userid';
|
||||||
$headers[] = get_string('edit');
|
$headers[] = get_string('edit');
|
||||||
@ -370,8 +377,6 @@ class assign_grading_table extends table_sql implements renderable {
|
|||||||
'assign',
|
'assign',
|
||||||
$this->assignment->get_instance()->id,
|
$this->assignment->get_instance()->id,
|
||||||
$users);
|
$users);
|
||||||
$this->hasgrantextension = has_capability('mod/assign:grantextension',
|
|
||||||
$this->assignment->get_context());
|
|
||||||
|
|
||||||
if (!empty($CFG->enableoutcomes) && !empty($this->gradinginfo->outcomes)) {
|
if (!empty($CFG->enableoutcomes) && !empty($this->gradinginfo->outcomes)) {
|
||||||
$columns[] = 'outcomes';
|
$columns[] = 'outcomes';
|
||||||
@ -809,7 +814,7 @@ class assign_grading_table extends table_sql implements renderable {
|
|||||||
$grade = '';
|
$grade = '';
|
||||||
$gradingdisabled = $this->assignment->grading_disabled($row->id);
|
$gradingdisabled = $this->assignment->grading_disabled($row->id);
|
||||||
|
|
||||||
if (!$this->is_downloading()) {
|
if (!$this->is_downloading() && $this->hasgrade) {
|
||||||
$name = fullname($row);
|
$name = fullname($row);
|
||||||
if ($this->assignment->is_blind_marking()) {
|
if ($this->assignment->is_blind_marking()) {
|
||||||
$name = get_string('hiddenuser', 'assign') .
|
$name = get_string('hiddenuser', 'assign') .
|
||||||
@ -1288,7 +1293,7 @@ class assign_grading_table extends table_sql implements renderable {
|
|||||||
* @return string HTML fragment.
|
* @return string HTML fragment.
|
||||||
*/
|
*/
|
||||||
protected function show_hide_link($column, $index) {
|
protected function show_hide_link($column, $index) {
|
||||||
if ($index > 0) {
|
if ($index > 0 || !$this->hasgrade) {
|
||||||
return parent::show_hide_link($column, $index);
|
return parent::show_hide_link($column, $index);
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
|
@ -49,6 +49,7 @@ $string['assign:managegrades'] = 'Review and release grades';
|
|||||||
$string['assign:releasegrades'] = 'Release grades';
|
$string['assign:releasegrades'] = 'Release grades';
|
||||||
$string['assign:revealidentities'] = 'Reveal student identities';
|
$string['assign:revealidentities'] = 'Reveal student identities';
|
||||||
$string['assign:reviewgrades'] = 'Review grades';
|
$string['assign:reviewgrades'] = 'Review grades';
|
||||||
|
$string['assign:viewgrades'] = 'View grades';
|
||||||
$string['assign:submit'] = 'Submit assignment';
|
$string['assign:submit'] = 'Submit assignment';
|
||||||
$string['assign:view'] = 'View assignment';
|
$string['assign:view'] = 'View assignment';
|
||||||
$string['assignfeedback'] = 'Feedback plugin';
|
$string['assignfeedback'] = 'Feedback plugin';
|
||||||
|
@ -223,7 +223,7 @@ function assign_extend_settings_navigation(settings_navigation $settings, naviga
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Link to download all submissions.
|
// Link to download all submissions.
|
||||||
if (has_capability('mod/assign:grade', $context)) {
|
if (has_any_capability(array('mod/assign:grade', 'mod/assign:viewgrades'), $context)) {
|
||||||
$link = new moodle_url('/mod/assign/view.php', array('id' => $cm->id, 'action'=>'grading'));
|
$link = new moodle_url('/mod/assign/view.php', array('id' => $cm->id, 'action'=>'grading'));
|
||||||
$node = $navref->add(get_string('viewgrading', 'assign'), $link, navigation_node::TYPE_SETTING);
|
$node = $navref->add(get_string('viewgrading', 'assign'), $link, navigation_node::TYPE_SETTING);
|
||||||
|
|
||||||
|
@ -2129,9 +2129,7 @@ class assign {
|
|||||||
$item = $this->get_submission($submissionid);
|
$item = $this->get_submission($submissionid);
|
||||||
|
|
||||||
// Check permissions.
|
// Check permissions.
|
||||||
if ($item->userid != $USER->id) {
|
$this->require_view_submission($item->userid);
|
||||||
require_capability('mod/assign:grade', $this->context);
|
|
||||||
}
|
|
||||||
$o .= $this->get_renderer()->render(new assign_header($this->get_instance(),
|
$o .= $this->get_renderer()->render(new assign_header($this->get_instance(),
|
||||||
$this->get_context(),
|
$this->get_context(),
|
||||||
$this->show_intro(),
|
$this->show_intro(),
|
||||||
@ -2153,9 +2151,7 @@ class assign {
|
|||||||
}
|
}
|
||||||
$item = $this->get_grade($gradeid);
|
$item = $this->get_grade($gradeid);
|
||||||
// Check permissions.
|
// Check permissions.
|
||||||
if ($item->userid != $USER->id) {
|
$this->require_view_submission($item->userid);
|
||||||
require_capability('mod/assign:grade', $this->context);
|
|
||||||
}
|
|
||||||
$o .= $this->get_renderer()->render(new assign_header($this->get_instance(),
|
$o .= $this->get_renderer()->render(new assign_header($this->get_instance(),
|
||||||
$this->get_context(),
|
$this->get_context(),
|
||||||
$this->show_intro(),
|
$this->show_intro(),
|
||||||
@ -2317,6 +2313,44 @@ class assign {
|
|||||||
return $this->get_renderer()->render_footer();
|
return $this->get_renderer()->render_footer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throw an error if the permissions to view this users submission are missing.
|
||||||
|
*
|
||||||
|
* @throws required_capability_exception
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
public function require_view_submission($userid) {
|
||||||
|
if (!$this->can_view_submission($userid)) {
|
||||||
|
throw new required_capability_exception($this->context, 'mod/assign:viewgrades', 'nopermission', '');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throw an error if the permissions to view grades in this assignment are missing.
|
||||||
|
*
|
||||||
|
* @throws required_capability_exception
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
public function require_view_grades() {
|
||||||
|
if (!$this->can_view_grades()) {
|
||||||
|
throw new required_capability_exception($this->context, 'mod/assign:viewgrades', 'nopermission', '');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does this user have view grade or grade permission for this assignment?
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function can_view_grades() {
|
||||||
|
// Permissions check.
|
||||||
|
if (!has_any_capability(array('mod/assign:viewgrades', 'mod/assign:grade'), $this->context)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Does this user have grade permission for this assignment?
|
* Does this user have grade permission for this assignment?
|
||||||
*
|
*
|
||||||
@ -2342,7 +2376,7 @@ class assign {
|
|||||||
// More efficient to load this here.
|
// More efficient to load this here.
|
||||||
require_once($CFG->libdir.'/filelib.php');
|
require_once($CFG->libdir.'/filelib.php');
|
||||||
|
|
||||||
require_capability('mod/assign:grade', $this->context);
|
$this->require_view_grades();
|
||||||
|
|
||||||
// Load all users with submit.
|
// Load all users with submit.
|
||||||
$students = get_enrolled_users($this->context, "mod/assign:submit", null, 'u.*', null, null, null,
|
$students = get_enrolled_users($this->context, "mod/assign:submit", null, 'u.*', null, null, null,
|
||||||
@ -2965,7 +2999,7 @@ class assign {
|
|||||||
$markerfilter = get_user_preferences('assign_markerfilter', '');
|
$markerfilter = get_user_preferences('assign_markerfilter', '');
|
||||||
$workflowfilter = get_user_preferences('assign_workflowfilter', '');
|
$workflowfilter = get_user_preferences('assign_workflowfilter', '');
|
||||||
$controller = $gradingmanager->get_active_controller();
|
$controller = $gradingmanager->get_active_controller();
|
||||||
$showquickgrading = empty($controller);
|
$showquickgrading = empty($controller) && $this->can_grade();
|
||||||
$quickgrading = get_user_preferences('assign_quickgrading', false);
|
$quickgrading = get_user_preferences('assign_quickgrading', false);
|
||||||
$showonlyactiveenrolopt = has_capability('moodle/course:viewsuspendedusers', $this->context);
|
$showonlyactiveenrolopt = has_capability('moodle/course:viewsuspendedusers', $this->context);
|
||||||
|
|
||||||
@ -3070,7 +3104,7 @@ class assign {
|
|||||||
|
|
||||||
$currentgroup = groups_get_activity_group($this->get_course_module(), true);
|
$currentgroup = groups_get_activity_group($this->get_course_module(), true);
|
||||||
$users = array_keys($this->list_participants($currentgroup, true));
|
$users = array_keys($this->list_participants($currentgroup, true));
|
||||||
if (count($users) != 0) {
|
if (count($users) != 0 && $this->can_grade()) {
|
||||||
// If no enrolled user in a course then don't display the batch operations feature.
|
// If no enrolled user in a course then don't display the batch operations feature.
|
||||||
$assignform = new assign_form('gradingbatchoperationsform', $gradingbatchoperationsform);
|
$assignform = new assign_form('gradingbatchoperationsform', $gradingbatchoperationsform);
|
||||||
$o .= $this->get_renderer()->render($assignform);
|
$o .= $this->get_renderer()->render($assignform);
|
||||||
@ -3092,7 +3126,7 @@ class assign {
|
|||||||
|
|
||||||
$o = '';
|
$o = '';
|
||||||
// Need submit permission to submit an assignment.
|
// Need submit permission to submit an assignment.
|
||||||
require_capability('mod/assign:grade', $this->context);
|
$this->require_view_grades();
|
||||||
require_once($CFG->dirroot . '/mod/assign/gradeform.php');
|
require_once($CFG->dirroot . '/mod/assign/gradeform.php');
|
||||||
|
|
||||||
// Only load this if it is.
|
// Only load this if it is.
|
||||||
@ -3244,7 +3278,7 @@ class assign {
|
|||||||
if (!$this->is_active_user($userid) && !has_capability('moodle/course:viewsuspendedusers', $this->context)) {
|
if (!$this->is_active_user($userid) && !has_capability('moodle/course:viewsuspendedusers', $this->context)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (has_capability('mod/assign:grade', $this->context)) {
|
if (has_any_capability(array('mod/assign:viewgrades', 'mod/assign:grade'), $this->context)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!is_enrolled($this->get_course_context(), $userid)) {
|
if (!is_enrolled($this->get_course_context(), $userid)) {
|
||||||
@ -3861,7 +3895,7 @@ class assign {
|
|||||||
$this->show_intro(),
|
$this->show_intro(),
|
||||||
$this->get_course_module()->id));
|
$this->get_course_module()->id));
|
||||||
|
|
||||||
if ($this->can_grade()) {
|
if ($this->can_view_grades()) {
|
||||||
$draft = ASSIGN_SUBMISSION_STATUS_DRAFT;
|
$draft = ASSIGN_SUBMISSION_STATUS_DRAFT;
|
||||||
$submitted = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
|
$submitted = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
|
||||||
if ($instance->teamsubmission) {
|
if ($instance->teamsubmission) {
|
||||||
|
@ -48,21 +48,14 @@ function assignsubmission_comments_comment_validate(stdClass $options) {
|
|||||||
if ($assignment->get_instance()->id != $submission->assignment) {
|
if ($assignment->get_instance()->id != $submission->assignment) {
|
||||||
throw new comment_exception('invalidcontext');
|
throw new comment_exception('invalidcontext');
|
||||||
}
|
}
|
||||||
if (!has_capability('mod/assign:grade', $context)) {
|
$canview = false;
|
||||||
if (!has_capability('mod/assign:submit', $context)) {
|
if ($submission->userid) {
|
||||||
throw new comment_exception('nopermissiontocomment');
|
$canview = $assignment->can_view_submission($submission->userid);
|
||||||
} else if ($assignment->get_instance()->teamsubmission) {
|
} else {
|
||||||
$group = $assignment->get_submission_group($USER->id);
|
$canview = $assignment->can_view_group_submission($submission->groupid);
|
||||||
$groupid = 0;
|
}
|
||||||
if ($group) {
|
if (!$canview) {
|
||||||
$groupid = $group->id;
|
throw new comment_exception('nopermissiontocomment');
|
||||||
}
|
|
||||||
if ($groupid != $submission->groupid) {
|
|
||||||
throw new comment_exception('nopermissiontocomment');
|
|
||||||
}
|
|
||||||
} else if ($submission->userid != $USER->id) {
|
|
||||||
throw new comment_exception('nopermissiontocomment');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -533,7 +533,29 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase {
|
|||||||
$this->assertEquals(false, $assign->testable_is_graded($this->students[1]->id));
|
$this->assertEquals(false, $assign->testable_is_graded($this->students[1]->id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function test_can_grade() {
|
||||||
|
global $DB;
|
||||||
|
|
||||||
|
$this->setUser($this->editingteachers[0]);
|
||||||
|
$assign = $this->create_instance();
|
||||||
|
|
||||||
|
$this->setUser($this->students[0]);
|
||||||
|
$this->assertEquals(false, $assign->can_grade());
|
||||||
|
$this->setUser($this->editingteachers[0]);
|
||||||
|
$this->assertEquals(true, $assign->can_grade());
|
||||||
|
$this->setUser($this->teachers[0]);
|
||||||
|
$this->assertEquals(true, $assign->can_grade());
|
||||||
|
|
||||||
|
// Test the viewgrades capability - without mod/assign:grade.
|
||||||
|
$this->setUser($this->students[0]);
|
||||||
|
$studentrole = $DB->get_record('role', array('shortname' => 'student'));
|
||||||
|
assign_capability('mod/assign:viewgrades', CAP_ALLOW, $studentrole->id, $assign->get_context()->id);
|
||||||
|
$this->assertEquals(false, $assign->can_grade());
|
||||||
|
}
|
||||||
|
|
||||||
public function test_can_view_submission() {
|
public function test_can_view_submission() {
|
||||||
|
global $DB;
|
||||||
|
|
||||||
$this->create_extra_users();
|
$this->create_extra_users();
|
||||||
$this->setUser($this->editingteachers[0]);
|
$this->setUser($this->editingteachers[0]);
|
||||||
$assign = $this->create_instance();
|
$assign = $this->create_instance();
|
||||||
@ -552,6 +574,15 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase {
|
|||||||
$this->assertEquals(true, $assign->can_view_submission($this->students[1]->id));
|
$this->assertEquals(true, $assign->can_view_submission($this->students[1]->id));
|
||||||
$this->assertEquals(true, $assign->can_view_submission($this->teachers[0]->id));
|
$this->assertEquals(true, $assign->can_view_submission($this->teachers[0]->id));
|
||||||
$this->assertEquals(true, $assign->can_view_submission($this->extrasuspendedstudents[0]->id));
|
$this->assertEquals(true, $assign->can_view_submission($this->extrasuspendedstudents[0]->id));
|
||||||
|
|
||||||
|
// Test the viewgrades capability - without mod/assign:grade.
|
||||||
|
$this->setUser($this->students[0]);
|
||||||
|
$studentrole = $DB->get_record('role', array('shortname' => 'student'));
|
||||||
|
assign_capability('mod/assign:viewgrades', CAP_ALLOW, $studentrole->id, $assign->get_context()->id);
|
||||||
|
$this->assertEquals(true, $assign->can_view_submission($this->students[0]->id));
|
||||||
|
$this->assertEquals(true, $assign->can_view_submission($this->students[1]->id));
|
||||||
|
$this->assertEquals(true, $assign->can_view_submission($this->teachers[0]->id));
|
||||||
|
$this->assertEquals(false, $assign->can_view_submission($this->extrasuspendedstudents[0]->id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
defined('MOODLE_INTERNAL') || die();
|
defined('MOODLE_INTERNAL') || die();
|
||||||
|
|
||||||
$module->component = 'mod_assign'; // Full name of the plugin (used for diagnostics).
|
$module->component = 'mod_assign'; // Full name of the plugin (used for diagnostics).
|
||||||
$module->version = 2013110500; // The current module version (Date: YYYYMMDDXX).
|
$module->version = 2013121300; // The current module version (Date: YYYYMMDDXX).
|
||||||
$module->requires = 2013110500; // Requires this Moodle version.
|
$module->requires = 2013110500; // Requires this Moodle version.
|
||||||
$module->cron = 60;
|
$module->cron = 60;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user