MDL-59246 mod_workshop: New WS get_submission_assessments

This commit is contained in:
Juan Leyva
2017-10-02 09:36:36 +02:00
parent 6e2f4866b0
commit 30b54b823a
5 changed files with 448 additions and 17 deletions
+184 -16
View File
@@ -31,6 +31,7 @@ require_once($CFG->dirroot . '/mod/workshop/locallib.php');
use mod_workshop\external\workshop_summary_exporter;
use mod_workshop\external\submission_exporter;
use mod_workshop\external\assessment_exporter;
/**
* Workshop external functions
@@ -874,6 +875,36 @@ class mod_workshop_external extends external_api {
);
}
/**
* Helper method for validating a submission.
*
* @param stdClass $submission submission object
* @param workshop $workshop workshop instance
* @return void
* @since Moodle 3.4
*/
protected static function validate_submission($submission, workshop $workshop) {
global $USER;
$workshopclosed = $workshop->phase == workshop::PHASE_CLOSED;
$canviewpublished = has_capability('mod/workshop:viewpublishedsubmissions', $workshop->context);
$canview = $submission->authorid == $USER->id; // I did it.
$canview = $canview || !empty($workshop->get_assessment_of_submission_by_user($submission->id, $USER->id)); // I reviewed.
$canview = $canview || has_capability('mod/workshop:viewallsubmissions', $workshop->context); // I can view all.
$canview = $canview || ($submission->published && $workshopclosed && $canviewpublished); // It has been published.
if ($canview) {
// Here we should check if the user share group.
if ($submission->authorid != $USER->id &&
!groups_user_groups_visible($workshop->course, $submission->authorid, $workshop->cm)) {
throw new moodle_exception('notingroup');
}
} else {
throw new moodle_exception('nopermissions', 'error', '', 'view submission');
}
}
/**
* Returns the description of the external function parameters.
*
@@ -907,22 +938,7 @@ class mod_workshop_external extends external_api {
$submission = $DB->get_record('workshop_submissions', array('id' => $params['submissionid']), '*', MUST_EXIST);
list($workshop, $course, $cm, $context) = self::validate_workshop($submission->workshopid);
$workshopclosed = $workshop->phase == workshop::PHASE_CLOSED;
$canviewpublished = has_capability('mod/workshop:viewpublishedsubmissions', $context);
$canview = $submission->authorid == $USER->id; // I did it.
$canview = $canview || !empty($workshop->get_assessment_of_submission_by_user($submission->id, $USER->id)); // I reviewed.
$canview = $canview || has_capability('mod/workshop:viewallsubmissions', $context); // I can view all.
$canview = $canview || ($submission->published && $workshopclosed && $canviewpublished); // It has been published.
if ($canview) {
// Here we should check if the user share group.
if ($submission->authorid != $USER->id && !groups_user_groups_visible($course, $submission->authorid, $cm)) {
throw new moodle_exception('notingroup');
}
} else {
throw new moodle_exception('nopermissions', 'error', '', 'view submission');
}
self::validate_submission($submission, $workshop);
$submission = self::prepare_submission_for_external($submission, $workshop);
@@ -948,4 +964,156 @@ class mod_workshop_external extends external_api {
)
);
}
/**
* Helper method for validating if the current user can view the submission assessments.
*
* @param stdClass $submission submission object
* @param workshop $workshop workshop instance
* @return void
* @since Moodle 3.4
*/
protected static function check_view_submission_assessments($submission, workshop $workshop) {
global $USER;
$ownsubmission = $submission->authorid == $USER->id;
$canview = has_capability('mod/workshop:viewallassessments', $workshop->context) ||
($ownsubmission && $workshop->assessments_available());
if ($canview) {
// Here we should check if the user share group.
if ($submission->authorid != $USER->id &&
!groups_user_groups_visible($workshop->course, $submission->authorid, $workshop->cm)) {
throw new moodle_exception('notingroup');
}
} else {
throw new moodle_exception('nopermissions', 'error', '', 'view assessment');
}
}
/**
* Helper method for returning the assessment data according the current user capabilities and current phase.
*
* @param stdClass $assessment the assessment data
* @param workshop $workshop the workshop class
* @return stdClass object with the assessment data filtered or null if is not viewable yet
* @since Moodle 3.4
*/
protected static function prepare_assessment_for_external($assessment, workshop $workshop) {
global $USER;
static $canviewallassessments = null;
static $canviewreviewers = null;
static $canoverridegrades = null;
// Remove all the properties that does not belong to the assessment table.
$properties = assessment_exporter::properties_definition();
foreach ($assessment as $key => $value) {
if (!isset($properties[$key])) {
unset($assessment->{$key});
}
}
if (is_null($canviewallassessments)) {
$canviewallassessments = has_capability('mod/workshop:viewallassessments', $workshop->context);
}
if (is_null($canviewreviewers)) {
$canviewreviewers = has_capability('mod/workshop:viewreviewernames', $workshop->context);
}
if (is_null($canoverridegrades)) {
$canoverridegrades = has_capability('mod/workshop:overridegrades', $workshop->context);
}
$isreviewer = $assessment->reviewerid == $USER->id;
if (!$isreviewer && is_null($assessment->grade) && !$canviewallassessments) {
// Students do not see peer-assessment that are not graded yet.
return null;
}
// Remove the feedback for the reviewer if the feedback is not closed or if we don't have enough permissions to see it.
if (!$canoverridegrades && ($workshop->phase != workshop::PHASE_CLOSED || !$isreviewer)) {
// Remove all the feedback information (all the optional fields).
foreach ($properties as $attribute => $settings) {
if (!empty($settings['optional'])) {
unset($assessment->{$attribute});
}
}
}
if (!$isreviewer && !$canviewreviewers) {
$assessment->reviewerid = 0;
}
return $assessment;
}
/**
* Returns the description of the external function parameters.
*
* @return external_function_parameters
* @since Moodle 3.4
*/
public static function get_submission_assessments_parameters() {
return new external_function_parameters(
array(
'submissionid' => new external_value(PARAM_INT, 'Submission id'),
)
);
}
/**
* Retrieves the given submission assessments.
*
* @param int $submissionid the submission id
* @return array containing the assessments and warnings.
* @since Moodle 3.4
* @throws moodle_exception
*/
public static function get_submission_assessments($submissionid) {
global $USER, $DB, $PAGE;
$params = self::validate_parameters(self::get_submission_assessments_parameters(), array('submissionid' => $submissionid));
$warnings = $assessments = array();
// Get and validate the submission and workshop.
$submission = $DB->get_record('workshop_submissions', array('id' => $params['submissionid']), '*', MUST_EXIST);
list($workshop, $course, $cm, $context) = self::validate_workshop($submission->workshopid);
// Check that we can get the assessments and get them.
self::check_view_submission_assessments($submission, $workshop);
$assessmentsrecords = $workshop->get_assessments_of_submission($submission->id);
$related = array('context' => $context);
foreach ($assessmentsrecords as $assessment) {
$assessment = self::prepare_assessment_for_external($assessment, $workshop);
if (empty($assessment)) {
continue;
}
$exporter = new assessment_exporter($assessment, $related);
$assessments[] = $exporter->export($PAGE->get_renderer('core'));
}
return array(
'assessments' => $assessments,
'warnings' => $warnings
);
}
/**
* Returns description of method result value
*
* @return external_description
* @since Moodle 3.4
*/
public static function get_submission_assessments_returns() {
return new external_single_structure(
array(
'assessments' => new external_multiple_structure(
assessment_exporter::get_read_structure()
),
'warnings' => new external_warnings()
)
);
}
}