-
Notifications
You must be signed in to change notification settings - Fork 8
/
gradebycatcalculator.php
112 lines (95 loc) · 3.9 KB
/
gradebycatcalculator.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* A class to encapsulate the loading of data and calculation of grades by category.
*
* @package quizaccess
* @subpackage gradebycategory
* @copyright 2013 Portsmouth University
* @author Jamie Pratt (me@jamiep.org)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class quizaccess_gradebycategory_calculator {
protected $lateststeps;
protected $qidtocatidhash;
protected $categorynames;
protected $quiz;
public function __construct($quiz) {
$this->quiz = $quiz;
}
public function set_latest_steps($lateststeps){
$this->lateststeps = $lateststeps;
}
public function load_latest_steps($attempts) {
$qubaids = array();
foreach ($attempts as $attempt) {
$qubaids[] = $attempt->uniqueid;
}
$dm = new question_engine_data_mapper();
$qubaidcondition = new qubaid_list($qubaids);
$slots = array_filter(explode(',', $attempt->layout));
$lateststeps = $dm->load_questions_usages_latest_steps($qubaidcondition, $slots);
$this->lateststeps = array();
foreach ($lateststeps as $step) {
$this->lateststeps[$step->questionusageid][$step->slot] = $step;
}
}
protected function get_question_ids() {
$questionids = array();
foreach ($this->lateststeps as $attempt) {
foreach ($attempt as $slot => $lateststep) {
if ($lateststep->maxmark != 0) {
$questionids[] = $lateststep->questionid;
}
}
}
return $questionids;
}
public function load_cat_data() {
global $DB;
list($questionidssql, $questionidsparams) = $DB->get_in_or_equal($this->get_question_ids());
$qincatsql = "SELECT q.id as qid, cat.id AS catid, cat.name AS catname FROM {question_categories} cat, {question} q ".
"WHERE q.category = cat.id AND q.id $questionidssql";
$categoriesforqsrawrecs = $DB->get_records_sql($qincatsql, $questionidsparams);
$this->qidtocatidhash = array();
$this->categorynames = array();
foreach ($categoriesforqsrawrecs as $categoriesforqsrawrec) {
$this->qidtocatidhash[$categoriesforqsrawrec->qid] = $categoriesforqsrawrec->catid;
$this->categorynames[$categoriesforqsrawrec->catid] = $categoriesforqsrawrec->catname;
}
return $this->categorynames;
}
public function grade_by_category($uniqueattemptid, $catid) {
$qcount = 0;
$totalpossiblemark = 0;
$totalactualmark = 0;
foreach ($this->lateststeps[$uniqueattemptid] as $lateststep) {
if (isset($this->qidtocatidhash[$lateststep->questionid])) {
if ($this->qidtocatidhash[$lateststep->questionid] == $catid) {
$totalpossiblemark += $lateststep->maxmark;
$totalactualmark += ($lateststep->fraction * $lateststep->maxmark);
$qcount++;
}
}
}
if ($totalpossiblemark > 0) {
$grade = quiz_format_grade($this->quiz, ($totalactualmark / $totalpossiblemark) * 100);
} else {
$grade = '--';
}
return "$grade ($qcount)";
}
}