/** * Allocate submissions as requested by user * * @return workshopplus_allocation_result */ public function init() { global $PAGE; $mode = optional_param('mode', 'display', PARAM_ALPHA); $perpage = optional_param('perpage', null, PARAM_INT); if ($perpage and $perpage > 0 and $perpage <= 1000) { require_sesskey(); set_user_preference('workshopplusallocation_manual_perpage', $perpage); redirect($PAGE->url); } $result = new workshopplus_allocation_result($this); switch ($mode) { case 'new': if (!confirm_sesskey()) { throw new moodle_exception('confirmsesskeybad'); } $reviewerid = required_param('by', PARAM_INT); $authorid = required_param('of', PARAM_INT); $m = array(); // message object to be passed to the next page $submission = $this->workshopplus->get_submission_by_author($authorid); if (!$submission) { // nothing submitted by the given user $m[] = self::MSG_NOSUBMISSION; $m[] = $authorid; } else { // ok, we have the submission $res = $this->workshopplus->add_allocation($submission, $reviewerid); if ($res == workshopplus::ALLOCATION_EXISTS) { $m[] = self::MSG_EXISTS; $m[] = $submission->authorid; $m[] = $reviewerid; } else { $m[] = self::MSG_ADDED; $m[] = $submission->authorid; $m[] = $reviewerid; } } $m = implode('-', $m); // serialize message object to be passed via URL redirect($PAGE->url->out(false, array('m' => $m))); break; case 'del': if (!confirm_sesskey()) { throw new moodle_exception('confirmsesskeybad'); } $assessmentid = required_param('what', PARAM_INT); $confirmed = optional_param('confirm', 0, PARAM_INT); $assessment = $this->workshopplus->get_assessment_by_id($assessmentid); if ($assessment) { if (!$confirmed) { $m[] = self::MSG_CONFIRM_DEL; $m[] = $assessment->id; $m[] = $assessment->authorid; $m[] = $assessment->reviewerid; if (is_null($assessment->grade)) { $m[] = 0; } else { $m[] = 1; } } else { if ($this->workshopplus->delete_assessment($assessment->id)) { $m[] = self::MSG_DELETED; $m[] = $assessment->authorid; $m[] = $assessment->reviewerid; } else { $m[] = self::MSG_DELETE_ERROR; $m[] = $assessment->authorid; $m[] = $assessment->reviewerid; } } $m = implode('-', $m); // serialize message object to be passed via URL redirect($PAGE->url->out(false, array('m' => $m))); } break; } $result->set_status(workshopplus_allocation_result::STATUS_VOID); return $result; }
/** * Executes the allocation * * @return workshopplus_allocation_result */ public function execute() { global $DB; $result = new workshopplus_allocation_result($this); // make sure the workshopplus itself is at the expected state if ($this->workshopplus->phase != workshopplus::PHASE_SUBMISSION) { $result->set_status(workshopplus_allocation_result::STATUS_FAILED, get_string('resultfailedphase', 'workshopplusallocation_scheduled')); return $result; } if (empty($this->workshopplus->submissionend)) { $result->set_status(workshopplus_allocation_result::STATUS_FAILED, get_string('resultfaileddeadline', 'workshopplusallocation_scheduled')); return $result; } if ($this->workshopplus->submissionend > time()) { $result->set_status(workshopplus_allocation_result::STATUS_VOID, get_string('resultvoiddeadline', 'workshopplusallocation_scheduled')); return $result; } $current = $DB->get_record('workshopplusallocation_scheduled', array('workshopplusid' => $this->workshopplus->id, 'enabled' => 1), '*', IGNORE_MISSING); if ($current === false) { $result->set_status(workshopplus_allocation_result::STATUS_FAILED, get_string('resultfailedconfig', 'workshopplusallocation_scheduled')); return $result; } if (!$current->enabled) { $result->set_status(workshopplus_allocation_result::STATUS_VOID, get_string('resultdisabled', 'workshopplusallocation_scheduled')); return $result; } if (!is_null($current->timeallocated) and $current->timeallocated >= $this->workshopplus->submissionend) { $result->set_status(workshopplus_allocation_result::STATUS_VOID, get_string('resultvoidexecuted', 'workshopplusallocation_scheduled')); return $result; } // so now we know that we are after the submissions deadline and either the scheduled allocation was not // executed yet or it was but the submissions deadline has been prolonged (and hence we should repeat the // allocations) $settings = workshopplus_random_allocator_setting::instance_from_text($current->settings); $randomallocator = $this->workshopplus->allocator_instance('random'); $randomallocator->execute($settings, $result); // store the result in the instance's table $update = new stdClass(); $update->id = $current->id; $update->timeallocated = $result->get_timeend(); $update->resultstatus = $result->get_status(); $update->resultmessage = $result->get_message(); $update->resultlog = json_encode($result->get_logs()); $DB->update_record('workshopplusallocation_scheduled', $update); return $result; }