]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-14203 "split report into two seperate reports - Quiz Statistics report and Indivi...
authorjamiesensei <jamiesensei>
Tue, 10 Jun 2008 16:18:10 +0000 (16:18 +0000)
committerjamiesensei <jamiesensei>
Tue, 10 Jun 2008 16:18:10 +0000 (16:18 +0000)
lang/en_utf8/quiz_statistics.php [new file with mode: 0644]
mod/quiz/report/reportlib.php
mod/quiz/report/statistics/report.php [new file with mode: 0644]
mod/quiz/report/statistics/statistics_form.php [new file with mode: 0644]
theme/standard/styles_layout.css

diff --git a/lang/en_utf8/quiz_statistics.php b/lang/en_utf8/quiz_statistics.php
new file mode 100644 (file)
index 0000000..dfed5f6
--- /dev/null
@@ -0,0 +1,27 @@
+<?PHP // $Id$ 
+      // quiz_analysis.php - created with Moodle 1.7 beta + (2006101003)
+
+
+$string['statistics'] = 'Quiz statistics';
+$string['calculatefrom'] = 'Calculate statistics from';
+
+
+$string['quizinformation'] = 'Quiz information';
+$string['quizoverallstatistics'] = 'Quiz overall statistics';
+$string['quizname'] = 'Quiz name';
+$string['coursename'] = 'Course name';
+$string['nooffirstattempts'] = 'Number of first attempts';
+$string['noofallattempts'] = 'Total number of attempts';
+$string['statsforfirstattempts'] = 'Statistics for first attempts';
+$string['statsforallattempts'] = 'Statistics for all attempts';
+$string['firstattemptsavg'] = 'Average grade of first attempts';
+$string['allattemptsavg'] = 'Average grade of all attempts';
+$string['attemptsall'] = 'all attempts';
+$string['attemptsfirst'] = 'first attempt';
+$string['errormedian'] = 'Error fetching median';
+$string['errorpowers'] = 'Error fetching powers';
+$string['median'] = 'Median grade';
+$string['standarddeviation'] = 'Standard deviation';
+$string['skewness'] = 'Score distribution skewness';
+$string['kurtosis'] = 'Score distribution kurtosis';
+?>
\ No newline at end of file
index eb0254c53ea2b7e99b61dd6c67c3c3b075b5c331..42304c980029ccd0bbe8054a28713db32c5e693d 100644 (file)
@@ -243,4 +243,16 @@ function quiz_report_feedback_for_grade($grade, $quizid) {
 
     return $feedbacktext;
 }
+
+function quiz_report_scale_sumgrades_as_percentage($rawgrade, $quiz, $round = true) {
+    if ($quiz->sumgrades) {
+        $grade = $rawgrade * 100 / $quiz->sumgrades;
+        if ($round) {
+            $grade = number_format($grade, $quiz->decimalpoints);
+        }
+    } else {
+        $grade = 0;
+    }
+    return $grade.' %';
+}
 ?>
diff --git a/mod/quiz/report/statistics/report.php b/mod/quiz/report/statistics/report.php
new file mode 100644 (file)
index 0000000..57eab21
--- /dev/null
@@ -0,0 +1,223 @@
+<?php
+/**
+ * This script lists student attempts
+ *
+ * @version $Id$
+ * @author Martin Dougiamas, Tim Hunt and others.
+ * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
+ * @package quiz
+ *//** */
+
+require_once($CFG->libdir.'/tablelib.php');
+require_once($CFG->dirroot.'/mod/quiz/report/statistics/statistics_form.php');
+require_once($CFG->dirroot.'/mod/quiz/report/statistics/statistics_table.php');
+
+class quiz_report extends quiz_default_report {
+
+    /**
+     * Display the report.
+     */
+    function display($quiz, $cm, $course) {
+        global $CFG, $DB;
+
+        $context = get_context_instance(CONTEXT_MODULE, $cm->id);
+
+        $download = optional_param('download', '', PARAM_ALPHA);
+
+        $pageoptions = array();
+        $pageoptions['id'] = $cm->id;
+        $pageoptions['q'] = $quiz->id;
+        $pageoptions['mode'] = 'statistics';
+
+        $reporturl = new moodle_url($CFG->wwwroot.'/mod/quiz/report.php', $pageoptions);
+
+        $mform = new mod_quiz_report_statistics($reporturl);
+        if ($fromform = $mform->get_data()){
+            $useallattempts = $fromform->useallattempts;
+            if ($fromform->useallattempts){
+                set_user_preference('quiz_report_statistics_useallattempts', $fromform->useallattempts);
+            } else {
+                unset_user_preference('quiz_report_statistics_useallattempts');
+            }
+        } else {
+            $useallattempts = get_user_preferences('quiz_report_statistics_useallattempts', 0);
+        }
+
+        /// find out current groups mode
+        $currentgroup = groups_get_activity_group($cm, true);
+
+        if (!empty($currentgroup)) {
+            // all users who can attempt quizzes and who are in the currently selected group
+            if (!$groupstudents = get_users_by_capability($context, 'mod/quiz:attempt','','','','',$currentgroup,'',false)){
+                $groupstudents = array();
+            }
+            $groupstudentslist = join(',', array_keys($groupstudents));
+            $allowedlist = $groupstudentslist;
+        }
+
+        $questions = quiz_report_load_questions($quiz);
+
+        $table = new quiz_report_statistics_table($quiz , $questions, $reporturl);
+        $table->is_downloading($download, get_string('reportstatistics','quiz_statistics'),
+                    "$course->shortname ".format_string($quiz->name,true));
+        if (!$table->is_downloading()) {
+            // Only print headers if not asked to download data
+            $this->print_header_and_tabs($cm, $course, $quiz, "statistics");
+        }
+
+        if ($groupmode = groups_get_activity_groupmode($cm)) {   // Groups are being used
+            if (!$table->is_downloading()) {
+                groups_print_activity_menu($cm, $reporturl->out());
+            }
+        }
+
+        
+        // Print information on the number of existing attempts
+        if (!$table->is_downloading()) { //do not print notices when downloading
+            print_heading(get_string('quizinformation', 'quiz_statistics'));
+            $quizinformationtable = new object();
+            $quizinformationtable->align = array('center', 'center');
+            $quizinformationtable->width = '60%';
+            $quizinformationtable->class = 'generaltable titlesleft';
+            $quizinformationtable->data = array();
+            $quizinformationtable->data[] = array(get_string('quizname', 'quiz_statistics'), $quiz->name);
+            $quizinformationtable->data[] = array(get_string('coursename', 'quiz_statistics'), $course->fullname);
+            if ($cm->idnumber){
+                $quizinformationtable->data[] = array(get_string('coursename', 'quiz_statistics'), $cm->idnumber);
+            }
+            if ($quiz->timeopen){
+                $quizinformationtable->data[] = array(get_string('quizopen', 'quiz'), userdate($quiz->timeopen));
+            }
+            if ($quiz->timeclose){
+                $quizinformationtable->data[] = array(get_string('quizclose', 'quiz'), userdate($quiz->timeclose));
+            }
+            if ($quiz->timeopen && $quiz->timeclose){
+                $quizinformationtable->data[] = array(get_string('duration'), format_time($quiz->timeclose - $quiz->timeopen));
+            }
+            print_table($quizinformationtable);
+        }
+        if (!$table->is_downloading()) {
+            // Print display options
+            $mform->set_data(array('useallattempts' => $useallattempts));
+            $mform->display();
+        }
+        
+        $sql = 'SELECT (attempt=1) AS isfirst, COUNT(1) AS countrecs, SUM(sumgrades) AS total ' .
+                'FROM {quiz_attempts} ' .
+                'WHERE quiz = :quiz AND preview=0 AND timefinish !=0 ' .
+                'GROUP BY (attempt=1)';
+
+        if (!$attempttotals = $DB->get_records_sql($sql, array('quiz' => $quiz->id))){
+            print_heading(get_string('noattempts','quiz'));
+            return true;
+        } else {
+            $firstattempt = $attempttotals[1];
+            $allattempts = new object();
+            $allattempts->countrecs = $firstattempt->countrecs + 
+                            (isset($attempttotals[0])?$attempttotals[0]->countrecs:0);
+            $allattempts->total = $firstattempt->total + 
+                            (isset($attempttotals[0])?$attempttotals[0]->total:0);
+        }
+        
+        if (!$table->is_downloading()) {
+            print_heading(get_string('quizoverallstatistics', 'quiz_statistics'));
+            $quizoverallstatistics = new object();
+            $quizoverallstatistics->align = array('center', 'center');
+            $quizoverallstatistics->width = '60%';
+            $quizoverallstatistics->class = 'generaltable titlesleft';
+            $quizoverallstatistics->data = array();
+            $quizoverallstatistics->data[] = array(get_string('nooffirstattempts', 'quiz_statistics'), $firstattempt->countrecs);
+            $quizoverallstatistics->data[] = array(get_string('noofallattempts', 'quiz_statistics'), $allattempts->countrecs);
+            $quizoverallstatistics->data[] = array(get_string('firstattemptsavg', 'quiz_statistics'), quiz_report_scale_sumgrades_as_percentage($firstattempt->total / $firstattempt->countrecs, $quiz));
+            $quizoverallstatistics->data[] = array(get_string('allattemptsavg', 'quiz_statistics'), quiz_report_scale_sumgrades_as_percentage($allattempts->total / $allattempts->countrecs, $quiz));
+            print_table($quizoverallstatistics);
+        }
+        //get the median
+        
+        
+        if (!$table->is_downloading()) {
+            if ($useallattempts){
+                $usingattempts = $allattempts;
+                $usingattempts->heading = get_string('statsforallattempts', 'quiz_statistics');
+                $usingattempts->sql = '';
+            } else {
+                $usingattempts = $firstattempt;
+                $usingattempts->heading = get_string('statsforfirstattempts', 'quiz_statistics');
+                $usingattempts->sql = 'AND attempt=1 ';
+            }
+            print_heading($usingattempts->heading);
+            if (($usingattempts->countrecs/2)==floor($usingattempts->countrecs/2)){
+                //even number of attempts
+                $limitoffset = (floor($usingattempts->countrecs/2)) - 1;
+                $limit = 2;
+            } else {
+                $limitoffset = ($usingattempts->countrecs/2) - 1;
+                $limit = 1;
+            }
+            $sql = 'SELECT id, sumgrades ' .
+                'FROM {quiz_attempts} ' .
+                'WHERE quiz = :quiz AND preview=0 AND timefinish !=0 ' .
+                $usingattempts->sql.
+                'ORDER BY sumgrades';
+            if (!$mediangrades = $DB->get_records_sql_menu($sql, array('quiz' => $quiz->id), $limitoffset, $limit)){
+                print_error('errormedian', 'quiz_statistics');
+            }
+            if (count($mediangrades)==1){
+                $median = array_shift($mediangrades);
+            } else {
+                $median = array_shift($mediangrades);
+                $median += array_shift($mediangrades);
+                $median = $median /2;
+            }
+            //fetch sum of squared, cubed and power 4d 
+            //differences between grades and mean grade
+            $mean = $usingattempts->total / $usingattempts->countrecs;
+            $sql = "SELECT " .
+                "SUM(POWER((sumgrades - ?),2)) AS power2, " .
+                "SUM(POWER((sumgrades - ?),3)) AS power3, ".
+                "SUM(POWER((sumgrades - ?),4)) AS power4 ".
+                "FROM {quiz_attempts} " .
+                "WHERE quiz = ? AND preview=0 AND timefinish !=0 " .
+                $usingattempts->sql.
+                "ORDER BY sumgrades";
+            $params = array($mean, $mean, $mean, $quiz->id);
+            if (!$powers = $DB->get_record_sql($sql, $params)){
+                print_error('errorpowers', 'quiz_statistics');
+            }
+            
+            $s = $usingattempts->countrecs;
+            
+            $sd = sqrt($powers->power2 / ($s -1));
+            
+            $m2= $powers->power2 / $s;
+            $m3= $powers->power3 / $s;
+            $m4= $powers->power4 / $s;
+            
+            $k2= $s*$m2/($s-1);
+            $k3= $s*$s*$m3/(($s-1)*($s-2));
+            $k3= $s*$s*$s*$m3/(($s-1)*($s-2)*($s-3));
+            $k4= $s*$s*$s*(($s+1)*$m4-3*($s-1)*$m2*$m2)/(($s-1)*($s-2)*($s-3));
+            
+            $skewness = $k3 / (pow($k2, 2/3));
+            $kurtosis = $k4 / ($k2*$k2);
+            
+            $quizattsstatistics = new object();
+            $quizattsstatistics->align = array('center', 'center');
+            $quizattsstatistics->width = '60%';
+            $quizattsstatistics->class = 'generaltable titlesleft';
+            $quizattsstatistics->data = array();
+            
+            $quizattsstatistics->data[] = array(get_string('median', 'quiz_statistics'), quiz_report_scale_sumgrades_as_percentage($median, $quiz));
+            $quizattsstatistics->data[] = array(get_string('standarddeviation', 'quiz_statistics'), quiz_report_scale_sumgrades_as_percentage($sd, $quiz));
+            $quizattsstatistics->data[] = array(get_string('skewness', 'quiz_statistics'), $skewness);
+            $quizattsstatistics->data[] = array(get_string('kurtosis', 'quiz_statistics'), $kurtosis);
+            print_table($quizattsstatistics);
+        }
+
+        return true;
+    }
+
+}
+
+
+?>
diff --git a/mod/quiz/report/statistics/statistics_form.php b/mod/quiz/report/statistics/statistics_form.php
new file mode 100644 (file)
index 0000000..4c599c5
--- /dev/null
@@ -0,0 +1,20 @@
+<?php  // $Id$
+require_once "$CFG->libdir/formslib.php";
+class mod_quiz_report_statistics extends moodleform {
+
+    function definition() {
+        global $COURSE;
+        $mform    =& $this->_form;
+//-------------------------------------------------------------------------------
+        $mform->addElement('header', 'preferencespage', get_string('preferencespage', 'quiz_overview'));
+
+        $options = array();
+        $options[0] = get_string('attemptsfirst','quiz_statistics');
+        $options[1] = get_string('attemptsall','quiz_statistics');
+        $mform->addElement('select', 'useallattempts', get_string('calculatefrom', 'quiz_statistics'), $options);
+        $mform->setDefault('useallattempts', 0);
+//-------------------------------------------------------------------------------
+        $this->add_action_buttons(false, get_string('preferencessave', 'quiz_overview'));
+    }
+}
+?>
index ae797c0d804e8946c250f48b34567f5cc3edef86..eb2d96a221bb04315617bb2797856fcdeecbdc2e 100644 (file)
@@ -3933,6 +3933,10 @@ table.quizreviewsummary td.cell {
   width: 80%;
   margin: auto;
 }
+#mod-quiz-report table.titlesleft td.c0
+{
+  font-weight: bold;
+}
 #mod-quiz-report table#attempts,
 #mod-quiz-report h2.main {
   clear: both;