42ff9ce6 |
1 | <?php //$Id$ |
2 | |
3 | /* |
4 | * This file is used for special upgrade functions - for example groups and gradebook. |
5 | * These functions must use SQL and dabase related functions only- no other Moodle API, |
6 | * because it might depend on db structures that are not yet present during upgrade. |
7 | * (Do not use functions from accesslib.php, grades classes or group functions at all!) |
8 | */ |
9 | |
10 | |
11 | /** |
12 | * This function is used to migrade old data and settings from old gradebook into new grading system. |
13 | * It is executed only once for each course during upgrade to 1.9, all grade tables must be empty initially. |
14 | * @param int $courseid |
15 | */ |
16 | function upgrade_18_gradebook($courseid) { |
17 | global $CFG; |
18 | |
19 | require_once($CFG->libdir.'/gradelib.php'); // we need constants only |
20 | |
21 | // get all grade items with mod details and categories |
22 | $sql = "SELECT gi.*, cm.idnumber as cmidnumber, m.name as modname |
23 | FROM {$CFG->prefix}grade_item gi, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m |
24 | WHERE gi.courseid=$courseid AND m.id=gi.modid AND cm.instance=gi.cminstance |
25 | ORDER BY gi.sort_order ASC"; |
26 | |
27 | if (!$olditems = get_records_sql($sql)) { |
28 | //nothing to do - no items present in old gradebook |
29 | return true; |
30 | } |
31 | |
32 | if (!$oldcats = get_records('grade_category', 'courseid', $courseid, 'id')) { |
33 | //there should be at least uncategorised category - hmm, nothing to do |
34 | return true; |
35 | } |
36 | |
37 | $order = 1; |
38 | |
39 | // create course category |
40 | $course_category = new object(); |
41 | $course_category->courseid = $courseid; |
42 | $course_category->fullname = 'course grade category'; |
43 | $course_category->parent = null; |
44 | $course_category->aggregation = GRADE_AGGREGATE_MEAN_ALL; |
45 | $course_category->timemodified = $course_category->timecreated = time(); |
46 | if (!$course_category->id = insert_record('grade_categories', $course_category)) { |
47 | return false; |
48 | } |
49 | $course_category->depth = 1; |
50 | $course_category->path = '/'.$course_category->id; |
51 | if (!update_record('grade_categories', $course_category)) { |
52 | return false; |
53 | } |
54 | |
55 | // create course item |
56 | $course_item = new object(); |
57 | $course_item->courseid = $courseid; |
58 | $course_item->itemtype = 'course'; |
59 | $course_item->iteminstance = $course_category->id; |
60 | $course_item->gradetype = GRADE_TYPE_VALUE; |
61 | $course_item->sortorder = $order++; |
62 | $course_item->timemodified = $course_item->timecreated = $course_category->timemodified; |
63 | $course_item->needsupdate = 1; |
64 | if (!insert_record('grade_items', $course_item)) { |
65 | return false; |
66 | } |
67 | |
68 | // existing categories |
69 | $categories = array(); |
70 | $hiddenoldcats = array(); |
71 | if (count($oldcats) == 1) { |
72 | $oldcat = reset($oldcats); |
73 | if ($oldcat->drop_x_lowest) { |
74 | $course_category->droplow = $oldcat->drop_x_lowest; |
75 | update_record('grade_categories', $course_category); |
76 | } |
77 | $categories[$oldcat->id] = $course_category; |
78 | |
79 | } else { |
80 | foreach ($oldcats as $oldcat) { |
81 | $category = new object(); |
82 | $category->courseid = $courseid; |
83 | $category->fullname = addslashes($oldcat->name); |
84 | $category->parent = $course_category->id; |
85 | $category->droplow = $oldcat->drop_x_lowest; |
86 | $category->aggregation = GRADE_AGGREGATE_MEAN_ALL; |
87 | $category->timemodified = $category->timecreated = time(); |
88 | if (!$category->id = insert_record('grade_categories', $category)) { |
89 | return false; |
90 | } |
91 | $category->depth = 2; |
92 | $category->path = '/'.$course_category->id.'/'.$category->id; |
93 | if (!update_record('grade_categories', $category)) { |
94 | return false; |
95 | } |
96 | |
97 | $categories[$oldcat->id] = $category; |
98 | |
99 | $item = new object(); |
100 | $item->courseid = $courseid; |
101 | $item->itemtype = 'category'; |
102 | $item->iteminstance = $category->id; |
103 | $item->gradetype = GRADE_TYPE_VALUE; |
104 | $item->plusfactor = $oldcat->bonus_points; |
105 | $item->hidden = $oldcat->hidden; |
106 | $item->aggregationcoef = $oldcat->weight; |
107 | $item->sortorder = $order++; |
108 | $item->timemodified = $item->timecreated = $category->timemodified; |
109 | $item->needsupdate = 1; |
110 | if (!insert_record('grade_items', $item)) { |
111 | return false; |
112 | } |
113 | if ($item->hidden) { |
114 | $hiddenoldcats[] = $oldcat->id; |
115 | } |
116 | } |
117 | |
118 | $course_category->aggregation = GRADE_AGGREGATE_WEIGHTED_MEAN_ALL; |
119 | update_record('grade_categories', $course_category); |
120 | } |
121 | unset($oldcats); |
122 | |
123 | // existing items |
124 | $newitems = array(); |
125 | foreach ($olditems as $olditem) { |
126 | if (empty($categories[$olditem->category])) { |
127 | continue; // faulty record |
128 | } |
129 | // proper data are set during activity upgrade or legacy grade fetching |
130 | $item = new object(); |
131 | $item->courseid = $courseid; |
132 | $item->itemtype = 'mod'; |
133 | $item->itemmodule = $olditem->modname; |
134 | $item->iteminstance = $olditem->cminstance; |
135 | $item->itemname = NULL; |
136 | $item->itemnumber = 0; |
137 | $item->gradetype = GRADE_TYPE_VALUE; |
138 | $item->multfactor = $olditem->scale_grade; |
139 | $item->hidden = (int)in_array($olditem->category, $hiddenoldcats); |
140 | $item->aggregationcoef = $olditem->extra_credit; |
141 | $item->sortorder = $order++; |
142 | $item->timemodified = $item->timecreated = time(); |
143 | $item->needsupdate = 1; |
144 | $item->categoryid = $categories[$olditem->category]->id; |
145 | if (!$item->id = insert_record('grade_items', $item)) { |
146 | return false; |
147 | } |
148 | |
149 | $newitems[$olditem->id] = $item; |
150 | |
151 | if ($olditem->extra_credit and $categories[$olditem->category]->aggregation != GRADE_AGGREGATE_EXTRACREDIT_MEAN_ALL) { |
152 | $categories[$olditem->category]->aggregation = GRADE_AGGREGATE_EXTRACREDIT_MEAN_ALL; |
153 | update_record('grade_categories', $categories[$olditem->category]); |
154 | } |
155 | } |
156 | unset($olditems); |
157 | |
158 | // setup up exception handling - exclude grade from aggregation |
159 | if ($exceptions = get_records('grade_exceptions', 'courseid', $courseid)) { |
160 | foreach ($exceptions as $exception) { |
161 | if (!array_key_exists($exception->grade_itemid, $newitems)) { |
162 | continue; // broken record |
163 | } |
164 | $grade = new object(); |
165 | $grade->excluded = time(); |
166 | $grade->itemid = $newitems[$exception->grade_itemid]->id; |
167 | $grade->userid = $exception->userid; |
168 | $grade->timemodified = $grade->timecreated = $grade->excluded; |
169 | insert_record('grade_grades', $grade); |
170 | } |
171 | } |
172 | |
173 | return true; |
174 | } |
175 | |
176 | ?> |