From: David Mudrak Date: Mon, 4 Jan 2010 18:08:13 +0000 (+0000) Subject: A lot of work here and there X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=00aca3c14c2dce0fe03c4953d4061f2c6d571154;p=moodle.git A lot of work here and there DB columns userid renamed to authorid or reviewerid to make the value clear. Improved manual allocation UI. Raw grades are stored as numeric values from 0.00000 to 100.00000 (instead of the current 0 to 1) to be more precise. Started to work on the Grading report (it est the overall report of all grades form submission and grades for assessments). --- diff --git a/mod/workshop/allocation/manual/lib.php b/mod/workshop/allocation/manual/lib.php index 147e8b0ac5..4b4c8707cb 100644 --- a/mod/workshop/allocation/manual/lib.php +++ b/mod/workshop/allocation/manual/lib.php @@ -33,9 +33,6 @@ require_once(dirname(dirname(dirname(__FILE__))) . '/locallib.php'); // works */ class workshop_manual_allocator implements workshop_allocator { - /** participants per page */ - const PERPAGE = 30; - /** constants that are used to pass status messages between init() and ui() */ const MSG_ADDED = 1; const MSG_NOSUBMISSION = 2; @@ -81,11 +78,11 @@ class workshop_manual_allocator implements workshop_allocator { $res = $this->workshop->add_allocation($submission, $reviewerid); if ($res == workshop::ALLOCATION_EXISTS) { $m[] = self::MSG_EXISTS; - $m[] = $submission->userid; + $m[] = $submission->authorid; $m[] = $reviewerid; } else { $m[] = self::MSG_ADDED; - $m[] = $submission->userid; + $m[] = $submission->authorid; $m[] = $reviewerid; } } @@ -195,25 +192,35 @@ class workshop_manual_allocator implements workshop_allocator { } } + // fetch the list of ids of all workshop participants - this may get really long so fetch just id + $participants = get_users_by_capability($PAGE->context, array('mod/workshop:submit', 'mod/workshop:peerassess'), + 'u.id', 'u.lastname,u.firstname,u.id', '', '', '', '', false, false, true); + + $numofparticipants = count($participants); // we will need later for the pagination + if ($hlauthorid > 0 and $hlreviewerid > 0) { - // display just those users, no pagination - $participants = get_users_by_capability($PAGE->context, array('mod/workshop:submit', 'mod/workshop:peerassess'), - 'u.id,u.lastname,u.firstname,u.picture,u.imagealt', 'u.lastname,u.firstname,u.id', - '', '', '', '', false, false, true); + // display just those two users $participants = array_intersect_key($participants, array($hlauthorid => null, $hlreviewerid => null)); } else { - // the paginated list of users to be displayed in the middle column ("Participant") - $participants = get_users_by_capability($PAGE->context, array('mod/workshop:submit', 'mod/workshop:peerassess'), - 'u.id,u.lastname,u.firstname,u.picture,u.imagealt', 'u.lastname,u.firstname,u.id', - $page * self::PERPAGE, self::PERPAGE, '', '', false, false, true); + // slice the list of participants according to the current page + $participants = array_slice($participants, $page * workshop::PERPAGE, workshop::PERPAGE, true); } - // this will hold the information needed to display user names and pictures - $userinfo = $participants; + $userinfo = $DB->get_records_list('user', 'id', array_keys($participants), '', 'id,lastname,firstname,picture,imagealt'); // load the participants' submissions $submissions = $this->workshop->get_submissions(array_keys($participants), false); + foreach ($submissions as $submission) { + if (!isset($userinfo[$submission->authorid])) { + $userinfo[$submission->authorid] = new stdClass(); + $userinfo[$submission->authorid]->id = $submission->authorid; + $userinfo[$submission->authorid]->firstname = $submission->authorfirstname; + $userinfo[$submission->authorid]->lastname = $submission->authorlastname; + $userinfo[$submission->authorid]->picture = $submission->authorpicture; + $userinfo[$submission->authorid]->imagealt = $submission->authorimagealt; + } + } // get current reviewers $reviewers = array(); @@ -221,9 +228,9 @@ class workshop_manual_allocator implements workshop_allocator { list($submissionids, $params) = $DB->get_in_or_equal(array_keys($submissions), SQL_PARAMS_NAMED); $sql = "SELECT a.id AS assessmentid, a.submissionid, r.id AS reviewerid, r.lastname, r.firstname, r.picture, r.imagealt, - s.id AS submissionid, s.userid AS authorid + s.id AS submissionid, s.authorid FROM {workshop_assessments} a - JOIN {user} r ON (a.userid = r.id) + JOIN {user} r ON (a.reviewerid = r.id) JOIN {workshop_submissions} s ON (a.submissionid = s.id) WHERE a.submissionid $submissionids"; $reviewers = $DB->get_records_sql($sql, $params); @@ -235,7 +242,6 @@ class workshop_manual_allocator implements workshop_allocator { $userinfo[$reviewer->reviewerid]->lastname = $reviewer->lastname; $userinfo[$reviewer->reviewerid]->picture = $reviewer->picture; $userinfo[$reviewer->reviewerid]->imagealt = $reviewer->imagealt; - $userinfo[$reviewer->reviewerid]->firstname = $reviewer->firstname; } } } @@ -246,11 +252,11 @@ class workshop_manual_allocator implements workshop_allocator { $sql = "SELECT a.id AS assessmentid, a.submissionid, u.id AS reviewerid, s.id AS submissionid, - r.id AS revieweeid, r.lastname, r.firstname, r.picture, r.imagealt + e.id AS revieweeid, e.lastname, e.firstname, e.picture, e.imagealt FROM {user} u - JOIN {workshop_assessments} a ON (a.userid = u.id) + JOIN {workshop_assessments} a ON (a.reviewerid = u.id) JOIN {workshop_submissions} s ON (a.submissionid = s.id) - JOIN {user} r ON (s.userid = r.id) + JOIN {user} e ON (s.authorid = e.id) WHERE u.id $participantids AND s.workshopid = :workshopid"; $reviewees = $DB->get_records_sql($sql, $params); foreach ($reviewees as $reviewee) { @@ -261,7 +267,6 @@ class workshop_manual_allocator implements workshop_allocator { $userinfo[$reviewee->revieweeid]->lastname = $reviewee->lastname; $userinfo[$reviewee->revieweeid]->picture = $reviewee->picture; $userinfo[$reviewee->revieweeid]->imagealt = $reviewee->imagealt; - $userinfo[$reviewee->revieweeid]->firstname = $reviewee->firstname; } } @@ -276,6 +281,7 @@ class workshop_manual_allocator implements workshop_allocator { $allocations[$participant->id]->reviewerof = array(); } unset($participants); + foreach ($submissions as $submission) { $allocations[$submission->authorid]->submissionid = $submission->id; $allocations[$submission->authorid]->submissiontitle = $submission->title; @@ -291,13 +297,8 @@ class workshop_manual_allocator implements workshop_allocator { } unset($reviewees); - // we have all data, let us pass it to the renderer and return the output - $wsoutput = $PAGE->theme->get_renderer('mod_workshop', $PAGE); - $uioutput = $PAGE->theme->get_renderer('workshopallocation_manual', $PAGE); - // prepare data to be displayed $data = new stdClass(); - $data->wsoutput = $wsoutput; $data->allocations = $allocations; $data->userinfo = $userinfo; $data->authors = $this->workshop->get_potential_authors($PAGE->context); @@ -308,15 +309,19 @@ class workshop_manual_allocator implements workshop_allocator { // prepare paging bar $pagingbar = new moodle_paging_bar(); - $pagingbar->totalcount = count($data->authors); + $pagingbar->totalcount = $numofparticipants; $pagingbar->page = $page; - $pagingbar->perpage = self::PERPAGE; + $pagingbar->perpage = workshop::PERPAGE; $pagingbar->baseurl = $PAGE->url; $pagingbar->pagevar = $pagingvar; $pagingbar->nocurr = true; $pagingbarout = $OUTPUT->paging_bar($pagingbar); + // we have all data, let us pass it to the renderers and return the output + $wsoutput = $PAGE->theme->get_renderer('mod_workshop', $PAGE); + $uioutput = $PAGE->theme->get_renderer('workshopallocation_manual', $PAGE); + return $pagingbarout . $wsoutput->status_message($msg) . $uioutput->display_allocations($data) . $pagingbarout; } @@ -346,13 +351,13 @@ class workshop_manual_allocator implements workshop_allocator { $sql = "SELECT author.id AS authorid, author.firstname AS authorfirstname, author.lastname AS authorlastname, author.picture AS authorpicture, author.imagealt AS authorimagealt, s.id AS submissionid, s.title AS submissiontitle, s.grade AS submissiongrade, - a.id AS assessmentid, a.timecreated AS timeallocated, a.userid AS reviewerid, + a.id AS assessmentid, a.timecreated AS timeallocated, a.reviewerid, reviewer.firstname AS reviewerfirstname, reviewer.lastname AS reviewerlastname, reviewer.picture as reviewerpicture, reviewer.imagealt AS reviewerimagealt FROM {user} author - LEFT JOIN {workshop_submissions} s ON (s.userid = author.id) + LEFT JOIN {workshop_submissions} s ON (s.authorid = author.id) LEFT JOIN {workshop_assessments} a ON (s.id = a.submissionid) - LEFT JOIN {user} reviewer ON (a.userid = reviewer.id) + LEFT JOIN {user} reviewer ON (a.reviewerid = reviewer.id) WHERE (author.id $authorids OR reviewer.id $reviewerids) AND (s.id IS NULL OR s.workshopid = :workshopid) ORDER BY author.lastname,author.firstname,author.id,reviewer.lastname,reviewer.firstname,reviewer.id"; diff --git a/mod/workshop/allocation/manual/renderer.php b/mod/workshop/allocation/manual/renderer.php index 769bd5aabb..c5f1820f31 100644 --- a/mod/workshop/allocation/manual/renderer.php +++ b/mod/workshop/allocation/manual/renderer.php @@ -55,7 +55,6 @@ class moodle_workshopallocation_manual_renderer extends moodle_renderer_base { * @return string html code */ public function display_allocations(stdClass $data) { - $wsoutput = $data->wsoutput; // moodle_mod_workshop_renderer $allocations = $data->allocations; // array prepared array of all allocations data $userinfo = $data->userinfo; // names and pictures of all required users $authors = $data->authors; // array potential reviewees @@ -64,11 +63,14 @@ class moodle_workshopallocation_manual_renderer extends moodle_renderer_base { $hlreviewerid = $data->hlreviewerid; // int id of the reviewer to highlight $selfassessment = $data->selfassessment; // bool is the self-assessment allowed in this workshop? - $wsoutput = $this->page->theme->get_renderer('mod_workshop', $this->page); if (empty($allocations)) { - return $wsoutput->status_message((object)array('text' => get_string('nosubmissions', 'workshop'))); + return $this->output->heading(get_string('nosubmissions', 'workshop')); } + // convert user collections into drop down menus + $authors = array_map('fullname', $authors); + $reviewers = array_map('fullname', $reviewers); + $table = new html_table(); $table->set_classes('allocations'); $table->head = array(get_string('participantreviewedby', 'workshop'), @@ -134,7 +136,7 @@ class moodle_workshopallocation_manual_renderer extends moodle_renderer_base { $exclude[$allocation->userid] = true; } // todo add an option to exclude users without own submission - $options = $this->users_to_menu_options($reviewers, $exclude); + $options = array_diff_key($reviewers, $exclude); if ($options) { $handler = new moodle_url($this->page->url, array('mode' => 'new', 'of' => $allocation->userid, 'sesskey' => sesskey())); @@ -181,7 +183,7 @@ class moodle_workshopallocation_manual_renderer extends moodle_renderer_base { $o .= $this->output->container(get_string('selfassessmentdisabled', 'workshop'), 'info'); } // todo add an option to exclude users without own submission - $options = $this->users_to_menu_options($authors, $exclude); + $options = array_diff_key($authors, $exclude); if ($options) { $handler = new moodle_url($this->page->url, array('mode' => 'new', 'by' => $allocation->userid, 'sesskey' => sesskey())); @@ -213,22 +215,6 @@ class moodle_workshopallocation_manual_renderer extends moodle_renderer_base { return $o; } - /** - * Given a list of users, returns an array suitable to render the HTML select field - * - * @param array $users array of users or array of groups of users - * @return array of options to be passed to {@link html_select::make_ popup_form()} - */ - protected function users_to_menu_options($users, array $exclude) { - $options = array(); // to be returned - foreach ($users as $user) { - if (!isset($exclude[$user->id])) { - $options[$user->id] = fullname($user); - } - } - return $options; - } - /** * Generates an icon link to remove the allocation * diff --git a/mod/workshop/allocation/random/lib.php b/mod/workshop/allocation/random/lib.php index d0212380cd..021754a89a 100644 --- a/mod/workshop/allocation/random/lib.php +++ b/mod/workshop/allocation/random/lib.php @@ -246,7 +246,7 @@ class workshop_random_allocator implements workshop_allocator { } /** - * Flips the structure of submission so it is indexed by userid attribute + * Flips the structure of submission so it is indexed by authorid attribute * * It is the caller's responsibility to make sure the submissions are not teacher * examples so no user is the author of more submissions. @@ -258,10 +258,10 @@ class workshop_random_allocator implements workshop_allocator { $byauthor = array(); if (is_array($submissions)) { foreach ($submissions as $submissionid => $submission) { - if (isset($byauthor[$submission->userid])) { + if (isset($byauthor[$submission->authorid])) { throw new moodle_exception('moresubmissionsbyauthor', 'workshop'); } - $byauthor[$submission->userid] = $submission; + $byauthor[$submission->authorid] = $submission; } } return $byauthor; diff --git a/mod/workshop/allocation/random/simpletest/testallocator.php b/mod/workshop/allocation/random/simpletest/testallocator.php index 4a5be21845..c3451fffaf 100644 --- a/mod/workshop/allocation/random/simpletest/testallocator.php +++ b/mod/workshop/allocation/random/simpletest/testallocator.php @@ -126,23 +126,23 @@ class workshop_allocation_random_test extends UnitTestCase { public function test_index_submissions_by_authors() { // fixture setup $submissions = array( - 676 => (object)array('id' => 676, 'userid' => 23), - 121 => (object)array('id' => 121, 'userid' => 56), + 676 => (object)array('id' => 676, 'authorid' => 23), + 121 => (object)array('id' => 121, 'authorid' => 56), ); // exercise SUT $submissions = $this->allocator->index_submissions_by_authors($submissions); // verify $this->assertEqual(array( - 23 => (object)array('id' => 676, 'userid' => 23), - 56 => (object)array('id' => 121, 'userid' => 56), + 23 => (object)array('id' => 676, 'authorid' => 23), + 56 => (object)array('id' => 121, 'authorid' => 56), ), $submissions); } public function test_index_submissions_by_authors_duplicate_author() { // fixture setup $submissions = array( - 14 => (object)array('id' => 676, 'userid' => 3), - 87 => (object)array('id' => 121, 'userid' => 3), + 14 => (object)array('id' => 676, 'authorid' => 3), + 87 => (object)array('id' => 121, 'authorid' => 3), ); // set expectation $this->expectException('moodle_exception'); diff --git a/mod/workshop/assessment.php b/mod/workshop/assessment.php index 2716750dd0..6154a0100c 100644 --- a/mod/workshop/assessment.php +++ b/mod/workshop/assessment.php @@ -66,7 +66,7 @@ if ('preview' == $mode) { // we do not require 'mod/workshop:peerassess' here, we just check that the assessment record // has been prepared for the current user. So even a user without the peerassess capability // (like a 'teacher', for example) can become a reviewer - if ($USER->id !== $assessment->userid) { + if ($USER->id !== $assessment->reviewerid) { print_error('nopermissions', '', $workshop->view_url()); } $PAGE->set_url($workshop->assess_url($assessment->id)); @@ -94,7 +94,7 @@ if ($mform->is_cancelled()) { if (!is_null($rawgrade) and isset($data->saveandclose)) { echo $OUTPUT->header(); echo $OUTPUT->heading(get_string('assessmentresult', 'workshop'), 2); - echo $OUTPUT->box('Given grade: ' . sprintf("%01.2f", $rawgrade * 100) . ' %'); // todo more detailed info using own renderer + echo $OUTPUT->box('Given grade: ' . $rawgrade . ' %'); // todo more detailed info using own renderer, format grade echo $OUTPUT->continue_button($workshop->view_url()); echo $OUTPUT->footer(); die(); // bye-bye @@ -113,7 +113,7 @@ echo $OUTPUT->heading(get_string('assessmentform', 'workshop'), 2); if ('assessment' === $mode) { if (has_capability('mod/workshop:viewauthornames', $PAGE->context)) { $showname = true; - $author = $workshop->user_info($submission->userid); + $author = $workshop->user_info($submission->authorid); } else { $showname = false; $author = null; diff --git a/mod/workshop/develtools.php b/mod/workshop/develtools.php index 3f7672ac48..7339077cbd 100644 --- a/mod/workshop/develtools.php +++ b/mod/workshop/develtools.php @@ -63,7 +63,7 @@ case 'mksubmissions': $submission = new stdClass(); $submission->workshopid = $workshop->id; $submission->example = 0; - $submission->userid = $authorid; + $submission->authorid = $authorid; $submission->timecreated = $timenow; $submission->timemodified = $timenow; $submission->title = $author->firstname . '\'s submission'; diff --git a/mod/workshop/form/accumulative/lib.php b/mod/workshop/form/accumulative/lib.php index 98a40914c1..bd19b46011 100644 --- a/mod/workshop/form/accumulative/lib.php +++ b/mod/workshop/form/accumulative/lib.php @@ -26,6 +26,7 @@ defined('MOODLE_INTERNAL') || die(); require_once(dirname(dirname(__FILE__)) . '/lib.php'); // interface definition +require_once($CFG->libdir . '/gradelib.php'); // to handle float vs decimal issues /** * Accumulative grading strategy logic. @@ -199,7 +200,7 @@ class workshop_accumulative_strategy implements workshop_strategy { * * @param stdClass $assessment Assessment being filled * @param stdClass $data Raw data as returned by the assessment form - * @return float|null Raw grade (0 to 1) for submission as suggested by the peer + * @return float|null Raw grade (0.00000 to 100.00000) for submission as suggested by the peer */ public function save_assessment(stdClass $assessment, stdClass $data) { global $DB; @@ -355,12 +356,15 @@ class workshop_accumulative_strategy implements workshop_strategy { protected function get_current_assessment_data(stdClass $assessment) { global $DB; + if (empty($this->dimensions)) { + return array(); + } list($dimsql, $dimparams) = $DB->get_in_or_equal(array_keys($this->dimensions), SQL_PARAMS_NAMED); // beware! the caller may rely on the returned array is indexed by dimensionid $sql = "SELECT dimensionid, * FROM {workshop_grades} WHERE assessmentid = :assessmentid AND strategy= :strategy AND dimensionid $dimsql"; - $params = array('assessmentid' => $assessment->id, 'strategy' => 'acumulative'); + $params = array('assessmentid' => $assessment->id, 'strategy' => 'accumulative'); $params = array_merge($params, $dimparams); return $DB->get_records_sql($sql, $params); @@ -370,7 +374,7 @@ class workshop_accumulative_strategy implements workshop_strategy { * Aggregates the assessment form data and sets the grade for the submission given by the peer * * @param stdClass $assessment Assessment record - * @return float|null Raw grade (from 0 to 1) for submission as suggested by the peer + * @return float|null Raw grade (from 0.00000 to 100.00000) for submission as suggested by the peer */ protected function update_peer_grade(stdClass $assessment) { $grades = $this->get_current_assessment_data($assessment); @@ -386,7 +390,7 @@ class workshop_accumulative_strategy implements workshop_strategy { * * @param array $grades Grade records as returned by {@link get_current_assessment_data} * @uses $this->dimensions - * @return float|null Raw grade (from 0 to 1) for submission as suggested by the peer + * @return float|null Raw grade (from 0.00000 to 100.00000) for submission as suggested by the peer */ protected function calculate_peer_grade(array $grades) { @@ -407,11 +411,11 @@ class workshop_accumulative_strategy implements workshop_strategy { if ($dimension->grade < 0) { // this is a scale $scaleid = -$dimension->grade; - $sumgrades += $this->scale_to_grade($scaleid, $grade->grade) * $dimension->weight; + $sumgrades += $this->scale_to_grade($scaleid, $grade->grade) * $dimension->weight * 100; $sumweights += $dimension->weight; } else { // regular grade - $sumgrades += ($grade->grade / $dimension->grade) * $dimension->weight; + $sumgrades += ($grade->grade / $dimension->grade) * $dimension->weight * 100; $sumweights += $dimension->weight; } } diff --git a/mod/workshop/form/accumulative/simpletest/teststrategy.php b/mod/workshop/form/accumulative/simpletest/teststrategy.php index b8888d1756..17a4dccaaa 100644 --- a/mod/workshop/form/accumulative/simpletest/teststrategy.php +++ b/mod/workshop/form/accumulative/simpletest/teststrategy.php @@ -99,7 +99,7 @@ class workshop_accumulative_strategy_test extends UnitTestCase { // excercise SUT $suggested = $this->strategy->calculate_peer_grade($grades); // validate - $this->assertEqual(grade_floatval(5/20), $suggested); + $this->assertEqual(grade_floatval(5/20 * 100), $suggested); } public function test_calculate_peer_grade_negative_weight() { @@ -118,7 +118,7 @@ class workshop_accumulative_strategy_test extends UnitTestCase { // excercise SUT $suggested = $this->strategy->calculate_peer_grade($grades); // validate - $this->assertEqual(grade_floatval(5/20), $suggested); + $this->assertEqual(grade_floatval(5/20 * 100), $suggested); } public function test_calculate_peer_grade_three_numericals_same_weight() { @@ -135,7 +135,7 @@ class workshop_accumulative_strategy_test extends UnitTestCase { $suggested = $this->strategy->calculate_peer_grade($grades); // validate - $this->assertEqual(grade_floatval((11/20 + 87/100 + 10/10)/3), $suggested); + $this->assertEqual(grade_floatval((11/20 + 87/100 + 10/10)/3 * 100), $suggested); } public function test_calculate_peer_grade_three_numericals_different_weights() { @@ -152,7 +152,7 @@ class workshop_accumulative_strategy_test extends UnitTestCase { $suggested = $this->strategy->calculate_peer_grade($grades); // validate - $this->assertEqual(grade_floatval((7/15*3 + 66/80*1 + 4/5*2)/6), $suggested); + $this->assertEqual(grade_floatval((7/15*3 + 66/80*1 + 4/5*2)/6 * 100), $suggested); } public function test_calculate_peer_grade_one_scale_max() { @@ -169,7 +169,7 @@ class workshop_accumulative_strategy_test extends UnitTestCase { $suggested = $this->strategy->calculate_peer_grade($grades); // validate - $this->assertEqual(1.00000, $suggested); + $this->assertEqual(100.00000, $suggested); } public function test_calculate_peer_grade_one_scale_min_with_scale_caching() { @@ -210,7 +210,7 @@ class workshop_accumulative_strategy_test extends UnitTestCase { $suggested = $this->strategy->calculate_peer_grade($grades); // validate - $this->assertEqual(grade_floatval((1/2*2 + 4/6*3)/5), $suggested); + $this->assertEqual(grade_floatval((1/2*2 + 4/6*3)/5 * 100), $suggested); } public function test_calculate_peer_grade_scale_exception() { diff --git a/mod/workshop/form/lib.php b/mod/workshop/form/lib.php index b8c3be5037..adf7a879e9 100644 --- a/mod/workshop/form/lib.php +++ b/mod/workshop/form/lib.php @@ -70,7 +70,8 @@ interface workshop_strategy { * @see grade_floatval() * @param stdClass $assessment Assessment being filled * @param stdClass $data Raw data as returned by the assessment form - * @return float|null Raw grade (0 to 1) for submission as suggested by the peer or null if impossible to count + * @return float|null Raw percentual grade (0.00000 to 100.00000) for submission + * as suggested by the peer or null if impossible to count */ public function save_assessment(stdClass $assessment, stdClass $data); diff --git a/mod/workshop/form/numerrors/lib.php b/mod/workshop/form/numerrors/lib.php index 8e432a57fb..617d47e3c1 100644 --- a/mod/workshop/form/numerrors/lib.php +++ b/mod/workshop/form/numerrors/lib.php @@ -235,7 +235,7 @@ class workshop_numerrors_strategy implements workshop_strategy { * * @param stdClass $assessment Assessment being filled * @param stdClass $data Raw data as returned by the assessment form - * @return float|null Raw grade (from 0 to 1) for submission as suggested by the peer + * @return float|null Raw grade (from 0.00000 to 100.00000) for submission as suggested by the peer */ public function save_assessment(stdClass $assessment, stdClass $data) { global $DB; @@ -424,6 +424,9 @@ class workshop_numerrors_strategy implements workshop_strategy { protected function get_current_assessment_data(stdClass $assessment) { global $DB; + if (empty($this->dimensions)) { + return array(); + } list($dimsql, $dimparams) = $DB->get_in_or_equal(array_keys($this->dimensions), SQL_PARAMS_NAMED); // beware! the caller may rely on the returned array is indexed by dimensionid $sql = "SELECT dimensionid, * @@ -439,7 +442,7 @@ class workshop_numerrors_strategy implements workshop_strategy { * Aggregates the assessment form data and sets the grade for the submission given by the peer * * @param stdClass $assessment Assessment record - * @return float|null Raw grade (0 to 1) for submission as suggested by the peer + * @return float|null Raw grade (0.00000 to 100.00000) for submission as suggested by the peer */ protected function update_peer_grade(stdClass $assessment) { $grades = $this->get_current_assessment_data($assessment); @@ -454,7 +457,7 @@ class workshop_numerrors_strategy implements workshop_strategy { * Calculates the aggregated grade given by the reviewer * * @param array $grades Grade records as returned by {@link get_current_assessment_data} - * @return float|null Raw grade (0 to 1) for submission as suggested by the peer + * @return float|null Raw grade (0.00000 to 100.00000) for submission as suggested by the peer */ protected function calculate_peer_grade(array $grades) { if (empty($grades)) { @@ -471,7 +474,7 @@ class workshop_numerrors_strategy implements workshop_strategy { } /** - * Returns a grade 0..1 for the given number of errors + * Returns a grade 0.00000 to 100.00000 for the given number of errors * * This is where we use the mapping table defined by the teacher. If a grade for the given * number of errors (negative assertions) is not defined, the most recently defined one is used. @@ -487,21 +490,21 @@ class workshop_numerrors_strategy implements workshop_strategy { * With this mapping, one error is mapped to 100% grade and 4 errors is mapped to 60%. * * @param mixed $numerrors Number of errors - * @return float Raw grade (0 to 1) for the given number of negative assertions + * @return float Raw grade (0.00000 to 100.00000) for the given number of negative assertions */ protected function errors_to_grade($numerrors) { - $grade = 100; + $grade = 100.00000; for ($i = 1; $i <= $numerrors; $i++) { if (isset($this->mappings[$i])) { $grade = $this->mappings[$i]->grade; } } - if ($grade > 100) { - $grade = 100; + if ($grade > 100.00000) { + $grade = 100.00000; } - if ($grade < 0) { - $grade = 0; + if ($grade < 0.00000) { + $grade = 0.00000; } - return grade_floatval($grade/100); + return grade_floatval($grade); } } diff --git a/mod/workshop/form/numerrors/simpletest/teststrategy.php b/mod/workshop/form/numerrors/simpletest/teststrategy.php index 943be186d5..7f03926dc1 100644 --- a/mod/workshop/form/numerrors/simpletest/teststrategy.php +++ b/mod/workshop/form/numerrors/simpletest/teststrategy.php @@ -110,7 +110,7 @@ class workshop_numerrors_strategy_test extends UnitTestCase { // excercise SUT $suggested = $this->strategy->calculate_peer_grade($grades); // validate - $this->assertEqual($suggested, 1.0); + $this->assertEqual($suggested, 100.00000); } public function test_calculate_peer_grade_one_error() { @@ -133,7 +133,7 @@ class workshop_numerrors_strategy_test extends UnitTestCase { // excercise SUT $suggested = $this->strategy->calculate_peer_grade($grades); // validate - $this->assertEqual($suggested, 0.8); + $this->assertEqual($suggested, 80.00000); } public function test_calculate_peer_grade_three_errors_same_weight_a() { @@ -157,7 +157,7 @@ class workshop_numerrors_strategy_test extends UnitTestCase { // excercise SUT $suggested = $this->strategy->calculate_peer_grade($grades); // validate - $this->assertEqual($suggested, 0.1); + $this->assertEqual($suggested, 10.00000); } public function test_calculate_peer_grade_three_errors_same_weight_b() { @@ -181,7 +181,7 @@ class workshop_numerrors_strategy_test extends UnitTestCase { // excercise SUT $suggested = $this->strategy->calculate_peer_grade($grades); // validate - $this->assertEqual($suggested, 0); + $this->assertEqual($suggested, 0.00000); } public function test_calculate_peer_grade_one_error_weighted() { @@ -205,7 +205,7 @@ class workshop_numerrors_strategy_test extends UnitTestCase { // excercise SUT $suggested = $this->strategy->calculate_peer_grade($grades); // validate - $this->assertEqual($suggested, 0.33); + $this->assertEqual($suggested, 33.00000); } public function test_calculate_peer_grade_zero_weight() { @@ -229,7 +229,7 @@ class workshop_numerrors_strategy_test extends UnitTestCase { // excercise SUT $suggested = $this->strategy->calculate_peer_grade($grades); // validate - $this->assertEqual($suggested, 1.0); + $this->assertEqual($suggested, 100.00000); } public function test_calculate_peer_grade_sum_weight() { @@ -257,6 +257,6 @@ class workshop_numerrors_strategy_test extends UnitTestCase { // excercise SUT $suggested = $this->strategy->calculate_peer_grade($grades); // validate - $this->assertEqual($suggested, 0.05); + $this->assertEqual($suggested, 5.00000); } } diff --git a/mod/workshop/lib.php b/mod/workshop/lib.php index 1ea2bef1f3..2ba5bddb6f 100644 --- a/mod/workshop/lib.php +++ b/mod/workshop/lib.php @@ -500,7 +500,7 @@ function workshop_get_file_info($browser, $areas, $course, $cm, $context, $filea $sql = 'SELECT s.id, u.lastname, u.firstname FROM {workshop_submissions} s - INNER JOIN {user} u ON (s.userid = u.id) + INNER JOIN {user} u ON (s.authorid = u.id) WHERE s.workshopid = ?'; $params = array($cm->instance); $authors = $DB->get_records_sql($sql, $params); diff --git a/mod/workshop/locallib.php b/mod/workshop/locallib.php index e914532304..08baea4ea7 100644 --- a/mod/workshop/locallib.php +++ b/mod/workshop/locallib.php @@ -52,6 +52,9 @@ class workshop { const PHASE_EVALUATION = 40; const PHASE_CLOSED = 50; + /** how many participants per page are displayed by various reports */ + const PERPAGE = 30; + /** @var stdClass course module record */ public $cm = null; @@ -225,8 +228,7 @@ class workshop { public function get_allocations() { global $DB; - $sql = 'SELECT a.id, a.submissionid, a.userid AS reviewerid, - s.userid AS authorid + $sql = 'SELECT a.id, a.submissionid, a.reviewerid, s.authorid FROM {workshop_assessments} a INNER JOIN {workshop_submissions} s ON (a.submissionid = s.id) WHERE s.example = 0 AND s.workshopid = :workshopid'; @@ -241,19 +243,22 @@ class workshop { * Fetches data from {workshop_submissions} and adds some useful information from other * tables. Does not return textual fields to prevent possible memory lack issues. * - * @param mixed $userid int|array|'all' If set to [array of] integer, return submission[s] of the given user[s] only + * @param mixed $authorid int|array|'all' If set to [array of] integer, return submission[s] of the given user[s] only * @param mixed $examples false|true|'all' Only regular submissions, only examples, all submissions * @return array */ - public function get_submissions($userid='all', $examples=false) { + public function get_submissions($authorid='all', $examples=false) { global $DB; - $sql = 'SELECT s.id, s.workshopid, s.example, s.userid, s.timecreated, s.timemodified, - s.title, s.grade, s.gradeover, s.gradeoverby, s.gradinggrade, - u.lastname AS authorlastname, u.firstname AS authorfirstname, u.id AS authorid, - u.picture AS authorpicture, u.imagealt AS authorimagealt + $sql = 'SELECT s.id, s.workshopid, s.example, s.authorid, s.timecreated, s.timemodified, + s.title, s.grade, s.gradeover, s.gradeoverby, + u.lastname AS authorlastname, u.firstname AS authorfirstname, + u.picture AS authorpicture, u.imagealt AS authorimagealt, + t.lastname AS overlastname, t.firstname AS overfirstname, + t.picture AS overpicture, t.imagealt AS overimagealt FROM {workshop_submissions} s - INNER JOIN {user} u ON (s.userid = u.id) + INNER JOIN {user} u ON (s.authorid = u.id) + LEFT JOIN {user} t ON (s.gradeoverby = u.id) WHERE s.workshopid = :workshopid'; $params = array('workshopid' => $this->id); @@ -267,15 +272,15 @@ class workshop { throw new coding_exception('Illegal parameter value: $examples may be false|true|"all"'); } - if ('all' === $userid) { + if ('all' === $authorid) { // no additional conditions - } elseif (is_array($userid)) { - list($usql, $uparams) = $DB->get_in_or_equal($userid, SQL_PARAMS_NAMED); - $sql .= " AND userid $usql"; + } elseif (is_array($authorid)) { + list($usql, $uparams) = $DB->get_in_or_equal($authorid, SQL_PARAMS_NAMED); + $sql .= " AND authorid $usql"; $params = array_merge($params, $uparams); } else { - $sql .= ' AND userid = :userid'; - $params['userid'] = $userid; + $sql .= ' AND authorid = :authorid'; + $params['authorid'] = $authorid; } $sql .= ' ORDER BY u.lastname, u.firstname'; @@ -295,7 +300,7 @@ class workshop { u.lastname AS authorlastname, u.firstname AS authorfirstname, u.id AS authorid, u.picture AS authorpicture, u.imagealt AS authorimagealt FROM {workshop_submissions} s - INNER JOIN {user} u ON (s.userid = u.id) + INNER JOIN {user} u ON (s.authorid = u.id) WHERE s.workshopid = :workshopid AND s.id = :id'; $params = array('workshopid' => $this->id, 'id' => $id); return $DB->get_record_sql($sql, $params, MUST_EXIST); @@ -307,19 +312,19 @@ class workshop { * @param int $id author id * @return stdClass|false */ - public function get_submission_by_author($id) { + public function get_submission_by_author($authorid) { global $DB; - if (empty($id)) { + if (empty($authorid)) { return false; } $sql = 'SELECT s.*, u.lastname AS authorlastname, u.firstname AS authorfirstname, u.id AS authorid, u.picture AS authorpicture, u.imagealt AS authorimagealt FROM {workshop_submissions} s - INNER JOIN {user} u ON (s.userid = u.id) - WHERE s.example = 0 AND s.workshopid = :workshopid AND s.userid = :userid'; - $params = array('workshopid' => $this->id, 'userid' => $id); + INNER JOIN {user} u ON (s.authorid = u.id) + WHERE s.example = 0 AND s.workshopid = :workshopid AND s.authorid = :authorid'; + $params = array('workshopid' => $this->id, 'authorid' => $authorid); return $DB->get_record_sql($sql, $params); } @@ -335,15 +340,15 @@ class workshop { public function get_all_assessments() { global $DB; - $sql = 'SELECT a.id, a.submissionid, a.userid, a.timecreated, a.timemodified, a.timeagreed, + $sql = 'SELECT a.id, a.submissionid, a.reviewerid, a.timecreated, a.timemodified, a.timeagreed, a.grade, a.gradinggrade, a.gradinggradeover, a.gradinggradeoverby, reviewer.id AS reviewerid,reviewer.firstname AS reviewerfirstname,reviewer.lastname as reviewerlastname, s.title, author.id AS authorid, author.firstname AS authorfirstname,author.lastname AS authorlastname FROM {workshop_assessments} a - INNER JOIN {user} reviewer ON (a.userid = reviewer.id) + INNER JOIN {user} reviewer ON (a.reviewerid = reviewer.id) INNER JOIN {workshop_submissions} s ON (a.submissionid = s.id) - INNER JOIN {user} author ON (s.userid = author.id) + INNER JOIN {user} author ON (s.authorid = author.id) WHERE s.workshopid = :workshopid AND s.example = 0 ORDER BY reviewer.lastname, reviewer.firstname'; $params = array('workshopid' => $this->id); @@ -365,9 +370,9 @@ class workshop { s.title, author.id AS authorid, author.firstname AS authorfirstname,author.lastname as authorlastname FROM {workshop_assessments} a - INNER JOIN {user} reviewer ON (a.userid = reviewer.id) + INNER JOIN {user} reviewer ON (a.reviewerid = reviewer.id) INNER JOIN {workshop_submissions} s ON (a.submissionid = s.id) - INNER JOIN {user} author ON (s.userid = author.id) + INNER JOIN {user} author ON (s.authorid = author.id) WHERE a.id = :id AND s.workshopid = :workshopid'; $params = array('id' => $id, 'workshopid' => $this->id); @@ -377,10 +382,10 @@ class workshop { /** * Get the complete information about all assessments allocated to the given reviewer * - * @param int $userid reviewer id + * @param int $reviewerid * @return array */ - public function get_assessments_by_reviewer($userid) { + public function get_assessments_by_reviewer($reviewerid) { global $DB; $sql = 'SELECT a.*, @@ -390,11 +395,11 @@ class workshop { author.id AS authorid, author.firstname AS authorfirstname,author.lastname AS authorlastname, author.picture AS authorpicture, author.imagealt AS authorimagealt FROM {workshop_assessments} a - INNER JOIN {user} reviewer ON (a.userid = reviewer.id) + INNER JOIN {user} reviewer ON (a.reviewerid = reviewer.id) INNER JOIN {workshop_submissions} s ON (a.submissionid = s.id) - INNER JOIN {user} author ON (s.userid = author.id) - WHERE s.example = 0 AND reviewer.id = :userid AND s.workshopid = :workshopid'; - $params = array('userid' => $userid, 'workshopid' => $this->id); + INNER JOIN {user} author ON (s.authorid = author.id) + WHERE s.example = 0 AND reviewer.id = :reviewerid AND s.workshopid = :workshopid'; + $params = array('reviewerid' => $reviewerid, 'workshopid' => $this->id); return $DB->get_records_sql($sql, $params); } @@ -410,14 +415,14 @@ class workshop { public function add_allocation(stdClass $submission, $reviewerid, $bulk=false) { global $DB; - if ($DB->record_exists('workshop_assessments', array('submissionid' => $submission->id, 'userid' => $reviewerid))) { + if ($DB->record_exists('workshop_assessments', array('submissionid' => $submission->id, 'reviewerid' => $reviewerid))) { return self::ALLOCATION_EXISTS; } $now = time(); $assessment = new stdClass(); $assessment->submissionid = $submission->id; - $assessment->userid = $reviewerid; + $assessment->reviewerid = $reviewerid; $assessment->timecreated = $now; $assessment->timemodified = $now; @@ -692,29 +697,29 @@ class workshop { $phase = new stdClass(); $phase->title = get_string('phasesubmission', 'workshop'); $phase->tasks = array(); - if (has_capability('mod/workshop:submit', $context, $userid)) { + if (has_capability('moodle/course:manageactivities', $context, $userid)) { $task = new stdClass(); - $task->title = get_string('tasksubmit', 'workshop'); - $task->link = $this->submission_url(); - if ($DB->record_exists('workshop_submissions', array('workshopid'=>$this->id, 'example'=>0, 'userid'=>$userid))) { + $task->title = get_string('taskinstructreviewers', 'workshop'); + $task->link = $this->updatemod_url(); + if (trim(strip_tags($this->instructreviewers))) { $task->completed = true; } elseif ($this->phase >= self::PHASE_ASSESSMENT) { $task->completed = false; - } else { - $task->completed = null; // still has a chance to submit } - $phase->tasks['submit'] = $task; + $phase->tasks['instructreviewers'] = $task; } - if (has_capability('moodle/course:manageactivities', $context, $userid)) { + if (has_capability('mod/workshop:submit', $context, $userid)) { $task = new stdClass(); - $task->title = get_string('taskinstructreviewers', 'workshop'); - $task->link = $this->updatemod_url(); - if (trim(strip_tags($this->instructreviewers))) { + $task->title = get_string('tasksubmit', 'workshop'); + $task->link = $this->submission_url(); + if ($DB->record_exists('workshop_submissions', array('workshopid'=>$this->id, 'example'=>0, 'authorid'=>$userid))) { $task->completed = true; } elseif ($this->phase >= self::PHASE_ASSESSMENT) { $task->completed = false; + } else { + $task->completed = null; // still has a chance to submit } - $phase->tasks['instructreviewers'] = $task; + $phase->tasks['submit'] = $task; } $phases[self::PHASE_SUBMISSION] = $phase; if (has_capability('mod/workshop:allocate', $context, $userid)) { @@ -896,7 +901,7 @@ class workshop { * Saves a raw grade for submission as calculated from the assessment form fields * * @param array $assessmentid assessment record id, must exists - * @param mixed $grade raw percentual grade from 0 to 1 + * @param mixed $grade raw percentual grade from 0.00000 to 100.00000 * @return false|float the saved grade */ public function set_peer_grade($assessmentid, $grade) { @@ -932,14 +937,14 @@ class workshop { } $userswithsubmission = array(); list($usql, $uparams) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED); - $sql = "SELECT id,userid + $sql = "SELECT id,authorid FROM {workshop_submissions} - WHERE example = 0 AND workshopid = :workshopid AND userid $usql"; + WHERE example = 0 AND workshopid = :workshopid AND authorid $usql"; $params = array('workshopid' => $this->id); $params = array_merge($params, $uparams); $submissions = $DB->get_records_sql($sql, $params); foreach ($submissions as $submission) { - $userswithsubmission[$submission->userid] = null; + $userswithsubmission[$submission->authorid] = true; } return $userswithsubmission; diff --git a/mod/workshop/submission.php b/mod/workshop/submission.php index ca37e80ee9..abd009f3d8 100644 --- a/mod/workshop/submission.php +++ b/mod/workshop/submission.php @@ -51,14 +51,14 @@ if ($id) { // submission is specified if (!$submission = $workshop->get_submission_by_author($USER->id)) { $submission = new stdClass(); $submission->id = null; - $submission->userid = $USER->id; + $submission->authorid = $USER->id; } } -$ownsubmission = $submission->userid == $USER->id; +$ownsubmission = $submission->authorid == $USER->id; $canviewall = has_capability('mod/workshop:viewallsubmissions', $PAGE->context); $cansubmit = has_capability('mod/workshop:submit', $PAGE->context); -$isreviewer = $DB->record_exists('workshop_assessments', array('submissionid' => $submission->id, 'userid' => $USER->id)); +$isreviewer = $DB->record_exists('workshop_assessments', array('submissionid' => $submission->id, 'reviewerid' => $USER->id)); if ($submission->id and ($ownsubmission or $canviewall or $isreviewer)) { // ok you can go @@ -87,7 +87,7 @@ if ($mform->is_cancelled()) { if (empty($formdata->id)) { $formdata->workshopid = $workshop->id; $formdata->example = 0; // todo add examples support - $formdata->userid = $USER->id; + $formdata->authorid = $USER->id; $formdata->timecreated = $timenow; } $formdata->timemodified = $timenow; diff --git a/mod/workshop/view.php b/mod/workshop/view.php index cf3e356130..889dd9f3d8 100644 --- a/mod/workshop/view.php +++ b/mod/workshop/view.php @@ -154,8 +154,145 @@ case workshop::PHASE_ASSESSMENT: echo $OUTPUT->box_end(); } } - + break; case workshop::PHASE_EVALUATION: + $pagingvar = 'page'; + $page = optional_param($pagingvar, 0, PARAM_INT); + + if (has_capability('mod/workshop:viewallassessments', $PAGE->context)) { + $showauthornames = has_capability('mod/workshop:viewauthornames', $PAGE->context); + $showreviewernames = has_capability('mod/workshop:viewreviewernames', $PAGE->context); + // todo this is very similar to what allocation/manual/lib.php does - refactoring expectable + + // fetch the list of ids of all workshop participants - this may get really long so fetch just id + $participants = get_users_by_capability($PAGE->context, array('mod/workshop:submit', 'mod/workshop:peerassess'), + 'u.id', 'u.lastname,u.firstname,u.id', '', '', '', '', false, false, true); + + $numofparticipants = count($participants); // we will need later for the pagination + + // slice the list of participants according to the current page + $participants = array_slice($participants, $page * workshop::PERPAGE, workshop::PERPAGE, true); + + // this will hold the information needed to display user names and pictures + $userinfo = $DB->get_records_list('user', 'id', array_keys($participants), '', 'id,lastname,firstname,picture,imagealt'); + + // load the participants' submissions + $submissions = $workshop->get_submissions(array_keys($participants), false); + foreach ($submissions as $submission) { + if (!isset($userinfo[$submission->authorid])) { + $userinfo[$submission->authorid] = new stdClass(); + $userinfo[$submission->authorid]->id = $submission->authorid; + $userinfo[$submission->authorid]->firstname = $submission->authorfirstname; + $userinfo[$submission->authorid]->lastname = $submission->authorlastname; + $userinfo[$submission->authorid]->picture = $submission->authorpicture; + $userinfo[$submission->authorid]->imagealt = $submission->authorimagealt; + } + if (!isset($userinfo[$submission->gradeoverby])) { + $userinfo[$submission->gradeoverby] = new stdClass(); + $userinfo[$submission->gradeoverby]->id = $submission->gradeoverby; + $userinfo[$submission->gradeoverby]->firstname = $submission->overfirstname; + $userinfo[$submission->gradeoverby]->lastname = $submission->overlastname; + $userinfo[$submission->gradeoverby]->picture = $submission->overpicture; + $userinfo[$submission->gradeoverby]->imagealt = $submission->overimagealt; + } + } + + // get current reviewers + $reviewers = array(); + if ($submissions) { + list($submissionids, $params) = $DB->get_in_or_equal(array_keys($submissions), SQL_PARAMS_NAMED); + $sql = "SELECT a.id AS assessmentid, a.submissionid, + r.id AS reviewerid, r.lastname, r.firstname, r.picture, r.imagealt, + s.id AS submissionid, s.authorid + FROM {workshop_assessments} a + JOIN {user} r ON (a.reviewerid = r.id) + JOIN {workshop_submissions} s ON (a.submissionid = s.id) + WHERE a.submissionid $submissionids"; + $reviewers = $DB->get_records_sql($sql, $params); + foreach ($reviewers as $reviewer) { + if (!isset($userinfo[$reviewer->reviewerid])) { + $userinfo[$reviewer->reviewerid] = new stdClass(); + $userinfo[$reviewer->reviewerid]->id = $reviewer->reviewerid; + $userinfo[$reviewer->reviewerid]->firstname = $reviewer->firstname; + $userinfo[$reviewer->reviewerid]->lastname = $reviewer->lastname; + $userinfo[$reviewer->reviewerid]->picture = $reviewer->picture; + $userinfo[$reviewer->reviewerid]->imagealt = $reviewer->imagealt; + } + } + } + + // get current reviewees + list($participantids, $params) = $DB->get_in_or_equal(array_keys($participants), SQL_PARAMS_NAMED); + $params['workshopid'] = $workshop->id; + $sql = "SELECT a.id AS assessmentid, a.submissionid, + u.id AS reviewerid, + s.id AS submissionid, + e.id AS revieweeid, e.lastname, e.firstname, e.picture, e.imagealt + FROM {user} u + JOIN {workshop_assessments} a ON (a.reviewerid = u.id) + JOIN {workshop_submissions} s ON (a.submissionid = s.id) + JOIN {user} e ON (s.authorid = e.id) + WHERE u.id $participantids AND s.workshopid = :workshopid"; + $reviewees = $DB->get_records_sql($sql, $params); + foreach ($reviewees as $reviewee) { + if (!isset($userinfo[$reviewee->revieweeid])) { + $userinfo[$reviewee->revieweeid] = new stdClass(); + $userinfo[$reviewee->revieweeid]->id = $reviewee->revieweeid; + $userinfo[$reviewee->revieweeid]->firstname = $reviewee->firstname; + $userinfo[$reviewee->revieweeid]->lastname = $reviewee->lastname; + $userinfo[$reviewee->revieweeid]->picture = $reviewee->picture; + $userinfo[$reviewee->revieweeid]->imagealt = $reviewee->imagealt; + } + } + + // get the current grades for assessment + list($participantids, $params) = $DB->get_in_or_equal(array_keys($participants), SQL_PARAMS_NAMED); + $params['workshopid'] = $workshop->id; + $sql = "SELECT * FROM {workshop_evaluations} WHERE reviewerid $participantids AND workshopid = :workshopid"; + $gradinggrades = $DB->get_records_sql($sql, $params); + + // now populate the final data object to be rendered + $grades = array(); + + foreach ($participants as $participant) { + // set up default (null) values + $grades[$participant->id] = new stdClass; + $grades[$participant->id]->userid = $participant->id; + $grades[$participant->id]->submissionid = null; + $grades[$participant->id]->reviewedby = array(); + $grades[$participant->id]->reviewerof = array(); + $grades[$participant->id]->gradinggrade = null; + } + unset($participants); + + foreach ($submissions as $submission) { + $grades[$submission->authorid]->submissionid = $submission->id; + $grades[$submission->authorid]->submissiontitle = $submission->title; + $grades[$submission->authorid]->submissiongrade = $submission->grade; + $grades[$submission->authorid]->submissiongradeover = $submission->gradeover; + $grades[$submission->authorid]->submissiongradeoverby = $submission->gradeoverby; + } + unset($submissions); + + foreach($reviewers as $reviewer) { + $grades[$reviewer->authorid]->reviewedby[$reviewer->reviewerid] = $reviewer->assessmentid; + } + unset($reviewers); + + foreach($reviewees as $reviewee) { + $grades[$reviewee->reviewerid]->reviewerof[$reviewee->revieweeid] = $reviewee->assessmentid; + } + unset($reviewees); + + foreach ($gradinggrades as $gradinggrade) { + $grades[$gradinggrade->reviewerid]->gradinggrade = $gradinggrade->gradinggrade; + } + + // we have all data, let us pass it to the renderer and return the output + + print_object($grades); die(); // DONOTCOMMIT + break; + } case workshop::PHASE_CLOSED: default: }