]> git.mjollnir.org Git - moodle.git/commitdiff
Question type RANDOM now stores responses just like any other question type.
authorkaipe <kaipe>
Sat, 18 Dec 2004 13:55:18 +0000 (13:55 +0000)
committerkaipe <kaipe>
Sat, 18 Dec 2004 13:55:18 +0000 (13:55 +0000)
Therefore all workarounds are removed from lib.php and an isolated workaround is included in random/questiontype.php in order to ensure backward compability.

mod/quiz/lib.php
mod/quiz/questiontypes/random/questiontype.php

index c38beedf1bd0d293b2fee57773f828fd2299bf61..fef532eea26dc09c3faa773b14e5b7ee4151900d 100644 (file)
@@ -795,33 +795,6 @@ function quiz_get_attempt_questions($quiz, $attempt, $attempting = false) {
                 $rawresponses[$qid]->id =
                         insert_record("quiz_responses", $rawresponses[$qid])
                 or error("Unable to create attemptonlast response for question $qid");
-                
-                ///////////////////////////////////////////
-                /// WORKAROUND FOR QUESTION TYPE RANDOM ///
-                ///////////////////////////////////////////
-                if (RANDOM == $question->qtype) {
-                    $randomqid = $prevresponses[$qid]->answer;
-                    if (empty($prevresponses[$randomqid]) || ereg(
-                            "(^|,)$randomqid(,|$)", $questionsinuse)) {
-                        // Ooops!
-                        // The randomly picked question has been included
-                        // among the fixed ones or did not get any response
-                        // in the previous attempt - either way the raw
-                        // responserecord created above needs to go!
-                        delete_records('quiz_responses', 'id',
-                                       $rawresponses[$qid]->id);
-                        unset($rawresponses[$qid]);
-
-                    } else if (empty($rawresponses[$randomqid])) {
-                        /// Also copy this response from the previous attempt
-                        $rawresponses[$randomqid] = $prevresponses[$randomqid];
-                        $rawresponses[$randomqid]->attempt = $attempt->id;
-                        $rawresponses[$randomqid]->id =
-                                insert_record('quiz_responses', $rawresponses[$randomqid])
-                        or error("Unable to create attemptonlast response for question $qid");
-
-                    }
-                } ////// END OF WORKAROUND ///////
             }
 
             /* Extract possible response and its wrapped questions */
@@ -858,19 +831,6 @@ function quiz_get_attempt_questions($quiz, $attempt, $attempting = false) {
                         ->convert_to_response_answer_field
                         ($questions[$question->id]->response);
 
-                ///////////////////////////////////////////
-                // WORKAROUND for question type RANDOM:
-                ///////////////////////////////////////////
-                if ($question->qtype == RANDOM and ereg(
-                        '^random([0-9]+)-(.*)$', $responserecord->answer, $afields)) {
-                    $responserecord->answer = $afields[1];
-                    insert_record("quiz_responses", $responserecord)
-                    or error("Unable to create an initial random response for question $question->id");
-
-                    $responserecord->question = $responserecord->answer;
-                    $responserecord->answer = $afields[2];
-                } ///   End of WORKAROUND //////////////////////
-
                 insert_record("quiz_responses", $responserecord)
                 or error("Unable to create initial response for question $question->id");
 
@@ -1688,31 +1648,6 @@ function quiz_save_attempt($quiz, $questions, $result, $attemptnum) {
             $responseanswerfield = $QUIZ_QTYPES[$question->qtype]
                     ->convert_to_response_answer_field($question->response);
 
-            ///////////////////////////////////////////
-            // WORKAROUND for question type RANDOM:
-            ///////////////////////////////////////////
-            if ($question->qtype == RANDOM) {
-
-                /// This will update the grade only
-                /// Everything else must already be in place...
-                if (!update_record('quiz_responses', $response)) {
-                    notify("Error while saving grade on random response");
-                    return false;
-                }
-
-                /// Rescue grade before fetching response record for actual question
-                $responsegradefield = $response->grade;
-
-                /// Fetch the response record containing
-                /// the response on the actual question
-                $response = get_record('quiz_responses',
-                        'attempt', $attempt->id, 'question', $response->answer);
-
-                $response->grade = $responsegradefield;
-                ereg('^random[0-9]+-(.*)$', $responseanswerfield, $afields);
-                $responseanswerfield = $afields[1];
-            } ///   End of WORKAROUND //////////////////////
-
             $response->answer = $responseanswerfield;
         } else {
             $response->answer = '';
index 02b2e4983b8ce7213ba2d3ae826cfebbf29a2baa..1a7790f5eced37ea68501f2c8e2a50974b10294e 100644 (file)
@@ -49,9 +49,6 @@ class quiz_random_qtype extends quiz_default_questiontype {
     }
 
     function convert_to_response_answer_field($questionresponse) {
-    /// THIS IS PART OF A WORKAROUND AS THIS IS THE ONLY
-    /// CASE WHERE IT IS NEEDED TO STORE TWO RESPONSE RECORDS...
-
         global $QUIZ_QTYPES;
 
         foreach ($questionresponse as $key => $response) {
@@ -70,8 +67,7 @@ class quiz_random_qtype extends quiz_default_questiontype {
     function create_response($question, $nameprefix, $questionsinuse) {
     // It's for question types like RANDOMSAMATCH and RANDOM that
     // the true power of the pattern with this function comes to the surface.
-    // This implementation will stand even after a possible exclusion of
-    // the funtions extract_response and convert_to_response_answer_field
+
         global $CFG;
 
         if (!isset($this->catrandoms[$question->category])) {
@@ -110,35 +106,85 @@ class quiz_random_qtype extends quiz_default_questiontype {
 
     function extract_response($rawresponse, $nameprefix) {
         global $QUIZ_QTYPES;
+
+        /// The raw response records for random questions come in two flavours:
+        /// ---- 1 ----
+        /// For responses stored by Moodle version 1.5 and later the answer
+        /// field has the pattern random#-* where the # part is the numeric
+        /// question id of the actual question shown in the quiz attempt
+        /// and * represents the student response to that actual question.
+        /// ---- 2 ----
+        /// For responses stored by older Moodle versions - the answer field is
+        /// simply the question id of the actual question. The student response
+        /// to the actual question is stored in a separate response record.
+        /// -----------------------
+        /// This means that prior to Moodle version 1.5, random questions needed
+        /// two response records for storing the response to a single question.
+        /// From version 1.5 and later the question type random works like all
+        /// the other question types in that it now only needs one response
+        /// record per question.
+        /// Because updating the old response records to fit the new response
+        /// record format could need hours of CPU time and the equivalent
+        /// amount of down time for the Moodle site and because a response
+        /// storage with two response formats for random question only effect
+        /// this function, where the response record is translated, this
+        /// function is now able to handle both types of response record.
+
+
+        /*** Pick random question id from the answer field in a way that ***/
+        /*** works for both formats: ***/
+        if (!ereg('^(random)?([0-9]+)(-(.*))?$', $rawresponse->answer, $answerregs)) {
+            error("The answer value '$rawresponse->answer' for the response with "
+                    ."id=$rawresponse->id to the random question "
+                    ."$rawresponse->question is malformated."
+                    ." - No response can be extracted!");
+        }
+        $randomquestionid = $answerregs[2];
+
         if ($randomquestion = get_record('quiz_questions',
-                                         'id', $rawresponse->answer)) {
-            if ($randomresponse = get_record
+                                         'id', $randomquestionid)) {
+
+            if ($answerregs[1] && $answerregs[3]) {
+                /**** The raw response is formatted according to
+                /**** Moodle version 1.5 or later ****/
+                $randomresponse = $rawresponse;
+                $randomresponse->question = $randomquestionid;
+                $randomresponse->answer = $answerregs[4];
+
+            } else if ($randomresponse = get_record
                     ('quiz_responses', 'question', $rawresponse->answer,
                                        'attempt', $rawresponse->attempt)) {
+                /*** The response was stored by an older version  of Moodle */
+                /*** :-)  ***/
                 
+            } else {
+                notify("Error: Cannot find response to random question $randomquestionid");
+                unset($randomresponse);
+            }
+            
+            if (isset($randomresponse)) {
                 /// The prefered case:
-                // The response field for the random question was found
-                // the response array can be extracted:
+                /// There is a random question and a response field, from 
+                /// which the response array can be extracted:
 
                 $response = $QUIZ_QTYPES[$randomquestion->qtype]
                         ->extract_response($randomresponse,
                         quiz_qtype_nameprefix($randomquestion, $nameprefix));
 
             } else {
-                notify("Error: Cannot find response to random question $randomquestion->id");
 
                 /// Instead: workaround by creating a new response:
                 $response = $QUIZ_QTYPES[$randomquestion->qtype]
                         ->create_response($randomquestion,
                         quiz_qtype_nameprefix($randomquestion, $nameprefix),
-                        "$rawresponse->question,$rawresponse->answer");
+                        "$rawresponse->question,$randomquestionid");
                 // (That last argument is instead of $questionsinuse.
                 // It is not correct but it would be very messy to
                 // determine the correct value, while very few
                 // question types actually use it and they who do have
                 // good chances to execute properly anyway.)
             }
-            $response[$nameprefix] = $randomquestion->id;
+            $response[$nameprefix] = $randomquestionid;
             return $response;
         } else {
             notify("Error: Unable to find random question $rawresponse->question");