/**
  * Grade quiz automatically
  *
  * This function grades each question automatically if there all questions are auto gradable. If not
  * the quiz will not be auto gradable.
  *
  * @since 1.7.4
  *
  * @param  integer $quiz_id         ID of quiz
  * @param  array $submitted questions id ans answers {
  *          @type int $question_id
  *          @type mixed $answer
  * }
  * @param  integer $total_questions Total questions in quiz (not used)
  * @param string $quiz_grade_type Optional defaults to auto
  *
  * @return int $quiz_grade total sum of all question grades
  */
 public static function grade_quiz_auto($quiz_id = 0, $submitted = array(), $total_questions = 0, $quiz_grade_type = 'auto')
 {
     if (!(intval($quiz_id) > 0) || !$submitted || $quiz_grade_type != 'auto') {
         return false;
         // exit early
     }
     $user_id = get_current_user_id();
     $lesson_id = Sensei()->quiz->get_lesson_id($quiz_id);
     $quiz_autogradable = true;
     /**
      * Filter the types of question types that can be automatically graded.
      *
      * This filter fires inside the auto grade quiz function and provides you with the default list.
      *
      * @param array {
      *      'multiple-choice',
      *      'boolean',
      *      'gap-fill'.
      * }
      */
     $autogradable_question_types = apply_filters('sensei_autogradable_question_types', array('multiple-choice', 'boolean', 'gap-fill'));
     $grade_total = 0;
     $all_question_grades = array();
     foreach ($submitted as $question_id => $answer) {
         // check if the question is autogradable, either by type, or because the grade is 0
         $question_type = Sensei()->question->get_question_type($question_id);
         $achievable_grade = Sensei()->question->get_question_grade($question_id);
         // Question has a zero grade, so skip grading
         if (0 == $achievable_grade) {
             $all_question_grades[$question_id] = $achievable_grade;
         } elseif (in_array($question_type, $autogradable_question_types)) {
             // Get user question grade
             $question_grade = Sensei_Utils::sensei_grade_question_auto($question_id, $question_type, $answer, $user_id);
             $all_question_grades[$question_id] = $question_grade;
             $grade_total += $question_grade;
         } else {
             // There is a question that cannot be autograded
             $quiz_autogradable = false;
         }
         // end if in_array( $question_type...
     }
     // end for each question
     // Only if the whole quiz was autogradable do we set a grade
     if ($quiz_autogradable) {
         $quiz_total = Sensei_Utils::sensei_get_quiz_total($quiz_id);
         // Check for zero total from grades
         if (0 < $quiz_total) {
             $grade = abs(round(doubleval($grade_total) * 100 / $quiz_total, 2));
         } else {
             $grade = 0;
         }
         Sensei_Utils::sensei_grade_quiz($quiz_id, $grade, $user_id, $quiz_grade_type);
     } else {
         $grade = new WP_Error('autograde', __('This quiz is not able to be automatically graded.', 'woothemes-sensei'));
     }
     // store the auto gradable grades. If the quiz is not auto gradable the grades can be use as the default
     // when doing manual grading.
     Sensei()->quiz->set_user_grades($all_question_grades, $lesson_id, $user_id);
     return $grade;
 }
Esempio n. 2
0
 /**
  * Update question answers to use new data structure
  *
  * @since 1.3.0
  * @access public
  * @return boolean
  */
 public function update_question_answer_data($n = 50, $offset = 0)
 {
     // Get Total Number of Updates to run
     $quiz_count_object = wp_count_posts('quiz');
     $quiz_count_published = $quiz_count_object->publish;
     // Calculate if this is the last page
     if (0 == $offset) {
         $current_page = 1;
     } else {
         $current_page = intval($offset / $n);
     }
     // End If Statement
     $total_pages = intval($quiz_count_published / $n);
     $args = array('post_type' => 'quiz', 'posts_per_page' => $n, 'offset' => $offset, 'post_status' => 'publish', 'suppress_filters' => 0);
     $quizzes = get_posts($args);
     $old_answers = array();
     $right_answers = array();
     $old_user_answers = array();
     if (is_array($quizzes)) {
         foreach ($quizzes as $quiz) {
             $quiz_id = $quiz->ID;
             // Get current user answers
             $comments = Sensei_Utils::sensei_check_for_activity(array('post_id' => $quiz_id, 'type' => 'sensei_quiz_answers'), true);
             // Need to always return an array, even with only 1 item
             if (!is_array($comments)) {
                 $comments = array($comments);
             }
             foreach ($comments as $comment) {
                 $user_id = $comment->user_id;
                 $content = maybe_unserialize(base64_decode($comment->comment_content));
                 $old_user_answers[$quiz_id][$user_id] = $content;
             }
             // Get correct answers
             $questions = Sensei_Utils::sensei_get_quiz_questions($quiz_id);
             if (is_array($questions)) {
                 foreach ($questions as $question) {
                     $right_answer = get_post_meta($question->ID, '_question_right_answer', true);
                     $right_answers[$quiz_id][$question->ID] = $right_answer;
                 }
             }
         }
     }
     if (is_array($right_answers)) {
         foreach ($right_answers as $quiz_id => $question) {
             $count = 0;
             if (is_array($question)) {
                 foreach ($question as $question_id => $answer) {
                     ++$count;
                     if (isset($old_user_answers[$quiz_id])) {
                         $answers_linkup[$quiz_id][$count] = $question_id;
                     }
                 }
             }
         }
     }
     if (is_array($old_user_answers)) {
         foreach ($old_user_answers as $quiz_id => $user_answers) {
             foreach ($user_answers as $user_id => $answers) {
                 foreach ($answers as $answer_id => $user_answer) {
                     $question_id = $answers_linkup[$quiz_id][$answer_id];
                     $new_user_answers[$question_id] = $user_answer;
                     Sensei_Utils::sensei_grade_question_auto($question_id, '', $user_answer, $user_id);
                 }
                 $lesson_id = get_post_meta($quiz_id, '_quiz_lesson', true);
                 Sensei_Utils::sensei_start_lesson($lesson_id, $user_id);
                 Sensei_Utils::sensei_save_quiz_answers($new_user_answers, $user_id);
             }
         }
     }
     if ($current_page == $total_pages) {
         return true;
     } else {
         return false;
     }
     // End If Statement
 }