/**
  * 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;
 }