Exemplo n.º 1
0
 /**
  * Handles the incoming request
  *
  */
 public function handle_request()
 {
     global $USER;
     switch ($this->action) {
         case 'startquiz':
             // only allow instructors to perform this action
             if ($this->RTQ->is_instructor()) {
                 $firstquestion = $this->session->start_quiz();
                 $this->jsonlib->set('status', 'startedquiz');
                 $this->jsonlib->set('questionid', $firstquestion->get_slot());
                 $this->jsonlib->set('nextstarttime', $this->session->get_session()->nextstarttime);
                 $this->jsonlib->set('notime', $firstquestion->getNoTime());
                 if ($firstquestion->getNoTime() == 0) {
                     // this question has a time limit
                     if ($firstquestion->getQuestionTime() == 0) {
                         $questiontime = $this->RTQ->getRTQ()->defaultquestiontime;
                     } else {
                         $questiontime = $firstquestion->getQuestionTime();
                     }
                     $this->jsonlib->set('questiontime', $questiontime);
                 } else {
                     $this->jsonlib->set('questiontime', 0);
                 }
                 $delay = $this->session->get_session()->nextstarttime - time();
                 $this->jsonlib->set('delay', $delay);
                 $qattempt = $this->session->get_open_attempt();
                 $this->jsonlib->set('lastquestion', $qattempt->lastquestion ? 'true' : 'false');
                 $this->jsonlib->send_response();
             } else {
                 $this->jsonlib->send_error('invalidaction');
             }
             break;
         case 'savequestion':
             // check if we're working on the current question for the session
             $currentquestion = $this->session->get_session()->currentquestion;
             $jscurrentquestion = required_param('questionid', PARAM_INT);
             if ($currentquestion != $jscurrentquestion) {
                 $this->jsonlib->send_error('invalid question');
             }
             // if we pass attempt to save the question
             $qattempt = $this->session->get_open_attempt();
             // make sure the attempt belongs to the current user
             if ($qattempt->userid != $USER->id) {
                 $this->jsonlib->send_error('invalid user');
             }
             if ($qattempt->save_question()) {
                 $this->jsonlib->set('status', 'success');
                 $this->jsonlib->set('feedback', $qattempt->get_question_feedback());
                 // next we need to send back the updated sequence check for javascript to update
                 // the sequence check on the question form.  this allows the question to be resubmitted again
                 list($seqname, $seqvalue) = $qattempt->get_sequence_check($this->session->get_session()->currentqnum);
                 $this->jsonlib->set('seqcheckname', $seqname);
                 $this->jsonlib->set('seqcheckval', $seqvalue);
                 $this->jsonlib->send_response();
             } else {
                 $this->jsonlib->send_error('unable to save question');
             }
             break;
         case 'getresults':
             // only allow instructors to perform this action
             if ($this->RTQ->is_instructor()) {
                 $this->session->set_status('reviewing');
                 // get the current question results
                 $responses = $this->session->get_question_results();
                 $this->jsonlib->set('responses', $responses);
                 $this->jsonlib->set('status', 'success');
                 $this->jsonlib->set('qtype', $this->RTQ->get_questionmanager()->get_questiontype_byqnum($this->session->get_session()->currentqnum));
                 $this->jsonlib->send_response();
             } else {
                 $this->jsonlib->send_error('invalidaction');
             }
             break;
         case 'getcurrentresults':
             // case to get the results of the question currently going
             if ($this->RTQ->is_instructor()) {
                 $responses = $this->session->get_question_results();
                 $this->jsonlib->set('responses', $responses);
                 $this->jsonlib->set('status', 'success');
                 $this->jsonlib->set('qtype', $this->RTQ->get_questionmanager()->get_questiontype_byqnum($this->session->get_session()->currentqnum));
                 $this->jsonlib->send_response();
             } else {
                 $this->jsonlib->send_error('invalidaction');
             }
             break;
         case 'getnotresponded':
             // only allow instructors to perform this action
             if ($this->RTQ->is_instructor()) {
                 $notrespondedHTML = $this->session->get_not_responded();
                 $this->jsonlib->set('notresponded', $notrespondedHTML);
                 $this->jsonlib->set('status', 'success');
                 $this->jsonlib->send_response();
             } else {
                 $this->jsonlib->send_error('invalidaction');
             }
             break;
         case 'nextquestion':
             // only allow instructors to perform this action
             if ($this->RTQ->is_instructor()) {
                 $nextquestion = $this->session->next_question();
                 $this->session->set_status('running');
                 $this->jsonlib->set('status', 'startedquestion');
                 $qattempt = $this->session->get_open_attempt();
                 $this->jsonlib->set('lastquestion', $qattempt->lastquestion ? 'true' : 'false');
                 $this->jsonlib->set('questionid', $nextquestion->get_slot());
                 $this->jsonlib->set('nextstarttime', $this->session->get_session()->nextstarttime);
                 $this->jsonlib->set('notime', $nextquestion->getNoTime());
                 if ($nextquestion->getNoTime() == 0) {
                     // this question has a time limit
                     if ($nextquestion->getQuestionTime() == 0) {
                         $questiontime = $this->RTQ->getRTQ()->defaultquestiontime;
                     } else {
                         $questiontime = $nextquestion->getQuestionTime();
                     }
                     $this->jsonlib->set('questiontime', $questiontime);
                 } else {
                     $this->jsonlib->set('questiontime', 0);
                 }
                 $delay = $this->session->get_session()->nextstarttime - time();
                 $this->jsonlib->set('delay', $delay);
                 $this->jsonlib->send_response();
             } else {
                 $this->jsonlib->send_error('invalidaction');
             }
             break;
         case 'repollquestion':
             if ($this->RTQ->is_instructor()) {
                 $repollquestion = $this->session->repoll_question();
                 $this->session->set_status('running');
                 $this->jsonlib->set('status', 'startedquestion');
                 $qattempt = $this->session->get_open_attempt();
                 $this->jsonlib->set('lastquestion', $qattempt->lastquestion ? 'true' : 'false');
                 $this->jsonlib->set('questionid', $repollquestion->get_slot());
                 $this->jsonlib->set('nextstarttime', $this->session->get_session()->nextstarttime);
                 $this->jsonlib->set('notime', $repollquestion->getNoTime());
                 if ($repollquestion->getNoTime() == 0) {
                     // this question has a time limit
                     if ($repollquestion->getQuestionTime() == 0) {
                         $questiontime = $this->RTQ->getRTQ()->defaultquestiontime;
                     } else {
                         $questiontime = $repollquestion->getQuestionTime();
                     }
                     $this->jsonlib->set('questiontime', $questiontime);
                 } else {
                     $this->jsonlib->set('questiontime', 0);
                 }
                 $delay = $this->session->get_session()->nextstarttime - time();
                 $this->jsonlib->set('delay', $delay);
                 $this->jsonlib->send_response();
             } else {
                 $this->jsonlib->send_error('invalidaction');
             }
             break;
         case 'gotoquestion':
             if ($this->RTQ->is_instructor()) {
                 $qnum = optional_param('qnum', '', PARAM_INT);
                 if (empty($qnum)) {
                     $this->jsonlib->send_error('invalid question number');
                 }
                 if (!($question = $this->session->goto_question($qnum))) {
                     $this->jsonlib->send_error('invalid question number');
                 }
                 $this->session->set_status('running');
                 $this->jsonlib->set('status', 'startedquestion');
                 $qattempt = $this->session->get_open_attempt();
                 $this->jsonlib->set('lastquestion', $qattempt->lastquestion ? 'true' : 'false');
                 $this->jsonlib->set('questionid', $question->get_slot());
                 $this->jsonlib->set('nextstarttime', $this->session->get_session()->nextstarttime);
                 $this->jsonlib->set('notime', $question->getNoTime());
                 if ($question->getNoTime() == 0) {
                     // this question has a time limit
                     if ($question->getQuestionTime() == 0) {
                         $questiontime = $this->RTQ->getRTQ()->defaultquestiontime;
                     } else {
                         $questiontime = $question->getQuestionTime();
                     }
                     $this->jsonlib->set('questiontime', $questiontime);
                 } else {
                     $this->jsonlib->set('questiontime', 0);
                 }
                 $delay = $this->session->get_session()->nextstarttime - time();
                 $this->jsonlib->set('delay', $delay);
                 $this->jsonlib->send_response();
             } else {
                 $this->jsonlib->send_error('invalidaction');
             }
             break;
         case 'endquestion':
             // update the session status to say that we're ending the question (this will in turn update students
             if ($this->RTQ->is_instructor()) {
                 $this->session->end_question();
                 $this->jsonlib->set('status', 'success');
                 $this->jsonlib->send_response();
             } else {
                 $this->jsonlib->send_error('invalidaction');
             }
             break;
         case 'getrightresponse':
             if ($this->RTQ->is_instructor()) {
                 $rightresponsequestion = $this->session->get_question_right_response();
                 $this->jsonlib->set('rightanswer', $rightresponsequestion);
                 $this->jsonlib->set('status', 'success');
                 $this->jsonlib->send_response();
             } else {
                 $this->jsonlib->send_error('invalidaction');
             }
             break;
         case 'closesession':
             // only allow instructors to perform this action
             if ($this->RTQ->is_instructor()) {
                 $this->session->end_session();
                 // next calculate and save grades
                 if (!$this->RTQ->get_grader()->save_all_grades()) {
                     $this->jsonlib->send_error('can\'t save grades');
                 }
                 $this->jsonlib->set('status', 'success');
                 $this->jsonlib->send_response();
             } else {
                 $this->jsonlib->send_error('invalidaction');
             }
             break;
         default:
             $this->jsonlib->send_error('invalidaction');
             break;
     }
 }