/** * Prints user interface - current allocation and a form to edit it */ public function ui() { global $PAGE, $DB; $output = $PAGE->get_renderer('workshopallocation_manual'); $pagingvar = 'page'; $page = optional_param($pagingvar, 0, PARAM_INT); $perpage = 10; // todo let the user modify this $hlauthorid = -1; // highlight this author $hlreviewerid = -1; // highlight this reviewer $message = new workshop_message(); $m = optional_param('m', '', PARAM_ALPHANUMEXT); // message code if ($m) { $m = explode('-', $m); switch ($m[0]) { case self::MSG_ADDED: $hlauthorid = $m[1]; $hlreviewerid = $m[2]; $message = new workshop_message(get_string('allocationadded', 'workshopallocation_manual'), workshop_message::TYPE_OK); break; case self::MSG_EXISTS: $hlauthorid = $m[1]; $hlreviewerid = $m[2]; $message = new workshop_message(get_string('allocationexists', 'workshopallocation_manual'), workshop_message::TYPE_INFO); break; case self::MSG_NOSUBMISSION: $hlauthorid = $m[1]; $message = new workshop_message(get_string('nosubmissionfound', 'workshop'), workshop_message::TYPE_ERROR); break; case self::MSG_CONFIRM_DEL: $hlauthorid = $m[2]; $hlreviewerid = $m[3]; if ($m[4] == 0) { $message = new workshop_message(get_string('areyousuretodeallocate', 'workshopallocation_manual'), workshop_message::TYPE_INFO); } else { $message = new workshop_message(get_string('areyousuretodeallocategraded', 'workshopallocation_manual'), workshop_message::TYPE_ERROR); } $url = new moodle_url($PAGE->url, array('mode' => 'del', 'what' => $m[1], 'confirm' => 1, 'sesskey' => sesskey())); $label = get_string('iamsure', 'workshop'); $message->set_action($url, $label); break; case self::MSG_DELETED: $hlauthorid = $m[1]; $hlreviewerid = $m[2]; $message = new workshop_message(get_string('assessmentdeleted', 'workshop'), workshop_message::TYPE_OK); break; case self::MSG_DELETE_ERROR: $hlauthorid = $m[1]; $hlreviewerid = $m[2]; $message = new workshop_message(get_string('assessmentnotdeleted', 'workshop'), workshop_message::TYPE_ERROR); break; } } // 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 two users $participants = array_intersect_key($participants, array($hlauthorid => null, $hlreviewerid => null)); $button = $output->single_button($PAGE->url, get_string('showallparticipants', 'workshopallocation_manual'), 'get'); } else { // slice the list of participants according to the current page $participants = array_slice($participants, $page * $perpage, $perpage, true); $button = ''; } // this will hold the information needed to display user names and pictures $userinfo = $DB->get_records_list('user', 'id', array_keys($participants), '', user_picture::fields()); // load the participants' submissions $submissions = $this->workshop->get_submissions(array_keys($participants)); 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; $userinfo[$submission->authorid]->email = $submission->authoremail; } } // 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, r.email, 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; $userinfo[$reviewer->reviewerid]->email = $reviewer->email; } } } // get current reviewees $reviewees = array(); if ($participants) { list($participantids, $params) = $DB->get_in_or_equal(array_keys($participants), SQL_PARAMS_NAMED); $params['workshopid'] = $this->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, e.email 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 AND s.example = 0"; $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; $userinfo[$reviewee->revieweeid]->email = $reviewee->email; } } } // the information about the allocations $allocations = array(); foreach ($participants as $participant) { $allocations[$participant->id] = new stdClass(); $allocations[$participant->id]->userid = $participant->id; $allocations[$participant->id]->submissionid = null; $allocations[$participant->id]->reviewedby = array(); $allocations[$participant->id]->reviewerof = array(); } unset($participants); foreach ($submissions as $submission) { $allocations[$submission->authorid]->submissionid = $submission->id; $allocations[$submission->authorid]->submissiontitle = $submission->title; $allocations[$submission->authorid]->submissiongrade = $submission->grade; } unset($submissions); foreach($reviewers as $reviewer) { $allocations[$reviewer->authorid]->reviewedby[$reviewer->reviewerid] = $reviewer->assessmentid; } unset($reviewers); foreach($reviewees as $reviewee) { $allocations[$reviewee->reviewerid]->reviewerof[$reviewee->revieweeid] = $reviewee->assessmentid; } unset($reviewees); // prepare data to be rendered $data = new workshopallocation_manual_allocations(); $data->allocations = $allocations; $data->userinfo = $userinfo; $data->authors = $this->workshop->get_potential_authors(); $data->reviewers = $this->workshop->get_potential_reviewers(); $data->hlauthorid = $hlauthorid; $data->hlreviewerid = $hlreviewerid; $data->selfassessment = $this->workshop->useselfassessment; // prepare paging bar $pagingbar = new paging_bar($numofparticipants, $page, $perpage, $PAGE->url, $pagingvar); $pagingbarout = $output->render($pagingbar); return $pagingbarout . $output->render($message) . $output->render($data) . $button . $pagingbarout; }
/** * Prints user interface - current allocation and a form to edit it */ public function ui() { global $PAGE, $DB; $output = $PAGE->get_renderer('workshopallocation_manual'); $page = optional_param('page', 0, PARAM_INT); $perpage = get_user_preferences('workshopallocation_manual_perpage', 10); $groupid = groups_get_activity_group($this->workshop->cm, true); $hlauthorid = -1; // highlight this author $hlreviewerid = -1; // highlight this reviewer $message = new workshop_message(); $m = optional_param('m', '', PARAM_ALPHANUMEXT); // message code if ($m) { $m = explode('-', $m); switch ($m[0]) { case self::MSG_ADDED: $hlauthorid = $m[1]; $hlreviewerid = $m[2]; $message = new workshop_message(get_string('allocationadded', 'workshopallocation_manual'), workshop_message::TYPE_OK); break; case self::MSG_EXISTS: $hlauthorid = $m[1]; $hlreviewerid = $m[2]; $message = new workshop_message(get_string('allocationexists', 'workshopallocation_manual'), workshop_message::TYPE_INFO); break; case self::MSG_NOSUBMISSION: $hlauthorid = $m[1]; $message = new workshop_message(get_string('nosubmissionfound', 'workshop'), workshop_message::TYPE_ERROR); break; case self::MSG_CONFIRM_DEL: $hlauthorid = $m[2]; $hlreviewerid = $m[3]; if ($m[4] == 0) { $message = new workshop_message(get_string('areyousuretodeallocate', 'workshopallocation_manual'), workshop_message::TYPE_INFO); } else { $message = new workshop_message(get_string('areyousuretodeallocategraded', 'workshopallocation_manual'), workshop_message::TYPE_ERROR); } $url = new moodle_url($PAGE->url, array('mode' => 'del', 'what' => $m[1], 'confirm' => 1, 'sesskey' => sesskey())); $label = get_string('iamsure', 'workshop'); $message->set_action($url, $label); break; case self::MSG_DELETED: $hlauthorid = $m[1]; $hlreviewerid = $m[2]; $message = new workshop_message(get_string('assessmentdeleted', 'workshop'), workshop_message::TYPE_OK); break; case self::MSG_DELETE_ERROR: $hlauthorid = $m[1]; $hlreviewerid = $m[2]; $message = new workshop_message(get_string('assessmentnotdeleted', 'workshop'), workshop_message::TYPE_ERROR); break; } } // fetch the list of ids of all workshop participants $numofparticipants = $this->workshop->count_participants(false, $groupid); $participants = $this->workshop->get_participants(false, $groupid, $perpage * $page, $perpage); if ($hlauthorid > 0 and $hlreviewerid > 0) { // display just those two users $participants = array_intersect_key($participants, array($hlauthorid => null, $hlreviewerid => null)); $button = $output->single_button($PAGE->url, get_string('showallparticipants', 'workshopallocation_manual'), 'get'); } else { $button = ''; } // this will hold the information needed to display user names and pictures $userinfo = $participants; // load the participants' submissions $submissions = $this->workshop->get_submissions(array_keys($participants)); $allnames = get_all_user_name_fields(); foreach ($submissions as $submission) { if (!isset($userinfo[$submission->authorid])) { $userinfo[$submission->authorid] = new stdclass(); $userinfo[$submission->authorid]->id = $submission->authorid; $userinfo[$submission->authorid]->picture = $submission->authorpicture; $userinfo[$submission->authorid]->imagealt = $submission->authorimagealt; $userinfo[$submission->authorid]->email = $submission->authoremail; foreach ($allnames as $addname) { $temp = 'author' . $addname; $userinfo[$submission->authorid]->{$addname} = $submission->{$temp}; } } } // get current reviewers $reviewers = array(); if ($submissions) { list($submissionids, $params) = $DB->get_in_or_equal(array_keys($submissions), SQL_PARAMS_NAMED); $picturefields = user_picture::fields('r', array(), 'reviewerid'); $sql = "SELECT a.id AS assessmentid, a.submissionid, {$picturefields},\n s.id AS submissionid, s.authorid\n FROM {workshop_assessments} a\n JOIN {user} r ON (a.reviewerid = r.id)\n JOIN {workshop_submissions} s ON (a.submissionid = s.id)\n 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]->picture = $reviewer->picture; $userinfo[$reviewer->reviewerid]->imagealt = $reviewer->imagealt; $userinfo[$reviewer->reviewerid]->email = $reviewer->email; foreach ($allnames as $addname) { $userinfo[$reviewer->reviewerid]->{$addname} = $reviewer->{$addname}; } } } } // get current reviewees $reviewees = array(); if ($participants) { list($participantids, $params) = $DB->get_in_or_equal(array_keys($participants), SQL_PARAMS_NAMED); $namefields = get_all_user_name_fields(true, 'e'); $params['workshopid'] = $this->workshop->id; $sql = "SELECT a.id AS assessmentid, a.submissionid,\n u.id AS reviewerid,\n s.id AS submissionid,\n e.id AS revieweeid, e.lastname, e.firstname, {$namefields}, e.picture, e.imagealt, e.email\n FROM {user} u\n JOIN {workshop_assessments} a ON (a.reviewerid = u.id)\n JOIN {workshop_submissions} s ON (a.submissionid = s.id)\n JOIN {user} e ON (s.authorid = e.id)\n WHERE u.id {$participantids} AND s.workshopid = :workshopid AND s.example = 0"; $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; $userinfo[$reviewee->revieweeid]->email = $reviewee->email; foreach ($allnames as $addname) { $userinfo[$reviewee->revieweeid]->{$addname} = $reviewee->{$addname}; } } } } // the information about the allocations $allocations = array(); foreach ($participants as $participant) { $allocations[$participant->id] = new stdClass(); $allocations[$participant->id]->userid = $participant->id; $allocations[$participant->id]->submissionid = null; $allocations[$participant->id]->reviewedby = array(); $allocations[$participant->id]->reviewerof = array(); } unset($participants); foreach ($submissions as $submission) { $allocations[$submission->authorid]->submissionid = $submission->id; $allocations[$submission->authorid]->submissiontitle = $submission->title; $allocations[$submission->authorid]->submissiongrade = $submission->grade; } unset($submissions); foreach ($reviewers as $reviewer) { $allocations[$reviewer->authorid]->reviewedby[$reviewer->reviewerid] = $reviewer->assessmentid; } unset($reviewers); foreach ($reviewees as $reviewee) { $allocations[$reviewee->reviewerid]->reviewerof[$reviewee->revieweeid] = $reviewee->assessmentid; } unset($reviewees); // prepare data to be rendered $data = new workshopallocation_manual_allocations(); $data->workshop = $this->workshop; $data->allocations = $allocations; $data->userinfo = $userinfo; $data->authors = $this->workshop->get_potential_authors(); $data->reviewers = $this->workshop->get_potential_reviewers(); $data->hlauthorid = $hlauthorid; $data->hlreviewerid = $hlreviewerid; $data->selfassessment = $this->workshop->useselfassessment; // prepare the group selector $groupselector = $output->container(groups_print_activity_menu($this->workshop->cm, $PAGE->url, true), 'groupwidget'); // prepare paging bar $pagingbar = new paging_bar($numofparticipants, $page, $perpage, $PAGE->url, 'page'); $pagingbarout = $output->render($pagingbar); $perpageselector = $output->perpage_selector($perpage); return $groupselector . $pagingbarout . $output->render($message) . $output->render($data) . $button . $pagingbarout . $perpageselector; }
/** * Prints user interface - current allocation and a form to edit it */ public function ui() { global $PAGE, $DB; $output = $PAGE->get_renderer('workshopallocation_manual'); $pagingvar = 'page'; $page = optional_param($pagingvar, 0, PARAM_INT); $perpage = 10; // todo let the user modify this $hlauthorid = -1; // highlight this author $hlreviewerid = -1; // highlight this reviewer $message = new workshop_message(); $m = optional_param('m', '', PARAM_ALPHANUMEXT); // message code if ($m) { $m = explode('-', $m); switch ($m[0]) { case self::MSG_ADDED: $hlauthorid = $m[1]; $hlreviewerid = $m[2]; $message = new workshop_message(get_string('allocationadded', 'workshopallocation_manual'), workshop_message::TYPE_OK); break; case self::MSG_EXISTS: $hlauthorid = $m[1]; $hlreviewerid = $m[2]; $message = new workshop_message(get_string('allocationexists', 'workshopallocation_manual'), workshop_message::TYPE_INFO); break; case self::MSG_NOSUBMISSION: $hlauthorid = $m[1]; $message = new workshop_message(get_string('nosubmissionfound', 'workshop'), workshop_message::TYPE_ERROR); break; case self::MSG_CONFIRM_DEL: $hlauthorid = $m[2]; $hlreviewerid = $m[3]; if ($m[4] == 0) { $message = new workshop_message(get_string('areyousuretodeallocate', 'workshopallocation_manual'), workshop_message::TYPE_INFO); } else { $message = new workshop_message(get_string('areyousuretodeallocategraded', 'workshopallocation_manual'), workshop_message::TYPE_ERROR); } $url = new moodle_url($PAGE->url, array('mode' => 'del', 'what' => $m[1], 'confirm' => 1, 'sesskey' => sesskey())); $label = get_string('iamsure', 'workshop'); $message->set_action($url, $label); break; case self::MSG_DELETED: $hlauthorid = $m[1]; $hlreviewerid = $m[2]; $message = new workshop_message(get_string('assessmentdeleted', 'workshop'), workshop_message::TYPE_OK); break; case self::MSG_DELETE_ERROR: $hlauthorid = $m[1]; $hlreviewerid = $m[2]; $message = new workshop_message(get_string('assessmentnotdeleted', 'workshop'), workshop_message::TYPE_ERROR); break; } } // 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); // TEAMMODE :: Morgan Harris // this introduces a new variable, $gradeitems, that replaces $participants in some cases // basically in team mode you get a list of *groups* not people $useridstr = implode(array_keys($participants),","); $sql = <<<SQL SELECT g.id, g.name FROM {groups} g JOIN {groups_members} m ON m.groupid = g.id WHERE g.courseid = {$this->workshop->cm->course} AND m.userid IN ($useridstr) GROUP BY g.id, g.name ORDER BY g.name SQL; $rslt = $DB->get_records_sql($sql); $gradeitems = $rslt; $numofparticipants = count($gradeitems); // we will need later for the pagination if ($hlauthorid > 0 and $hlreviewerid > 0) { // display just those two users // todo: figure out a sensible way to GROUPMOD this $participants = array_intersect_key($participants, array($hlauthorid => null, $hlreviewerid => null)); $button = $output->single_button($PAGE->url, get_string('showallparticipants', 'workshopallocation_manual'), 'get'); } else { // slice the list of participants according to the current page $gradeitems = array_slice($gradeitems, $page * $perpage, $perpage, true); $button = ''; } // this will hold the information needed to display user names and pictures $userinfo = $DB->get_records_list('user', 'id', array_keys($participants), '', user_picture::fields()); $groupinfo = $DB->get_records_list('groups', 'id', array_keys($gradeitems)); // load the participants' submissions $submissions = $this->workshop->get_submissions_grouped(); 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; $userinfo[$submission->authorid]->email = $submission->authoremail; } } // get current reviewers $reviewers = array(); if ($submissions) { $keys = array_keys( $submissions ); list($submissionids, $params) = $DB->get_in_or_equal($keys, SQL_PARAMS_NAMED); $sql = "SELECT a.id AS assessmentid, a.submissionid, r.id AS reviewerid, r.lastname, r.firstname, r.picture, r.imagealt, r.email, 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; $userinfo[$reviewer->reviewerid]->email = $reviewer->email; } } } // the information about the allocations $allocations = array(); foreach ($gradeitems as $participant) { $allocations[$participant->id] = new stdClass(); $allocations[$participant->id]->groupid = $participant->id; $allocations[$participant->id]->group = $participant; $allocations[$participant->id]->submissionid = null; $allocations[$participant->id]->reviewedby = array(); $allocations[$participant->id]->reviewerof = array(); } unset($participants); //as we're iterating over this list, we also need to check if all the names are unique for our upload script $allgroupnames = array(); foreach ($submissions as $submission) { $id = $submission->group->id; $allocations[$id]->submissionid = $submission->id; $allocations[$id]->submissiontitle = $submission->title; $allocations[$id]->submissiongrade = $submission->grade; $allocations[$id]->userid = $submission->authorid; $allgroupnames[$id] = $submission->group->name; } $duplicategroupnames = array_unique(array_diff_assoc($allgroupnames,array_unique($allgroupnames))); foreach($reviewers as $reviewer) { $id = $submissions[$reviewer->submissionid]; $allocations[$id->group->id]->reviewedby[$reviewer->reviewerid] = $reviewer->assessmentid; } unset($reviewers); unset($submissions); foreach($userinfo as $k => $u) { $userinfo[$k]->groups = groups_get_all_groups($this->workshop->cm->course, $u->id, $this->workshop->cm->groupingid, 'g.id'); } // prepare data to be rendered $data = new workshopallocation_teammode_manual_allocations(); $data->allocations = $allocations; $data->gradeitems = $gradeitems; $data->userinfo = $userinfo; $data->groupduplicates = $duplicategroupnames; $data->authors = $this->workshop->get_potential_authors(); $data->reviewers = $this->workshop->get_potential_reviewers(); $data->hlauthorid = $hlauthorid; $data->hlreviewerid = $hlreviewerid; $data->selfassessment = $this->workshop->useselfassessment; $data->gradeitems = $gradeitems; // prepare paging bar $pagingbar = new paging_bar($numofparticipants, $page, $perpage, $PAGE->url, $pagingvar); $pagingbarout = $output->render($pagingbar); return $pagingbarout . $output->render($message) . $output->render($data) . $button . $pagingbarout; }