*/
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;
$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;
}
}
}
}
+ // 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();
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);
$userinfo[$reviewer->reviewerid]->lastname = $reviewer->lastname;
$userinfo[$reviewer->reviewerid]->picture = $reviewer->picture;
$userinfo[$reviewer->reviewerid]->imagealt = $reviewer->imagealt;
- $userinfo[$reviewer->reviewerid]->firstname = $reviewer->firstname;
}
}
}
$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) {
$userinfo[$reviewee->revieweeid]->lastname = $reviewee->lastname;
$userinfo[$reviewee->revieweeid]->picture = $reviewee->picture;
$userinfo[$reviewee->revieweeid]->imagealt = $reviewee->imagealt;
- $userinfo[$reviewee->revieweeid]->firstname = $reviewee->firstname;
}
}
$allocations[$participant->id]->reviewerof = array();
}
unset($participants);
+
foreach ($submissions as $submission) {
$allocations[$submission->authorid]->submissionid = $submission->id;
$allocations[$submission->authorid]->submissiontitle = $submission->title;
}
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);
// 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;
}
$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";
* @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
$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'),
$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()));
$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()));
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
*
}
/**
- * 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.
$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;
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');
// 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));
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
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;
$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';
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.
*
* @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;
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);
* 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);
*
* @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) {
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;
}
}
// 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() {
// 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() {
$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() {
$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() {
$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() {
$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() {
* @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);
*
* @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;
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, *
* 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);
* 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)) {
}
/**
- * 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.
* 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);
}
}
// 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() {
// 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() {
// 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() {
// 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() {
// 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() {
// 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() {
// excercise SUT
$suggested = $this->strategy->calculate_peer_grade($grades);
// validate
- $this->assertEqual($suggested, 0.05);
+ $this->assertEqual($suggested, 5.00000);
}
}
$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);
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;
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';
* 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);
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';
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);
* @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);
}
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);
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);
/**
* 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.*,
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);
}
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;
$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)) {
* 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) {
}
$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;
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
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;
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:
}