# This patch file was generated by NetBeans IDE
# This patch can be applied using context Tools: Apply Diff Patch action on respective folder.
# It uses platform neutral UTF-8 encoding.
# Above lines and this line are ignored by the patching process.
Index: moodle/backup/moodle2/backup_stepslib.php
--- moodle/backup/moodle2/backup_stepslib.php Base (1.39)
+++ moodle/backup/moodle2/backup_stepslib.php Locally Modified (Based On 1.39)
@@ -646,6 +646,7 @@
         //calculated grade items
         $grade_items = new backup_nested_element('grade_items');
         $grade_item = new backup_nested_element('grade_item', array('id'), array(
+            //'courseid',
             'categoryid', 'itemname', 'itemtype', 'itemmodule',
             'iteminstance', 'itemnumber', 'iteminfo', 'idnumber',
             'calculation', 'gradetype', 'grademax', 'grademin',
@@ -664,25 +665,71 @@
 
         //grade_categories
         $grade_categories = new backup_nested_element('grade_categories');
-        $grade_category   = new backup_nested_element('grade_category', null, array('courseid',
-                'parent', 'depth', 'path', 'fullname', 'aggregation', 'keephigh',
+        $grade_category   = new backup_nested_element('grade_category', array('id'), array(
+                'courseid', 'parent', 'depth', 'path', 'fullname', 'aggregation', 'keephigh',
                 'dropload', 'aggregateonlygraded', 'aggregateoutcomes', 'aggregatesubcats',
                 'timecreated', 'timemodified'));
 
         $letters = new backup_nested_element('grade_letters');
         $letter = new backup_nested_element('grade_letter', 'id', array(
-            'lowerboundary', 'letter'));
+            'contextid', 'lowerboundary', 'letter'));
 
 
         // Build the tree
 
-        $gradebook->add_child($grade_items);
+        //this commented out code is me trying to make grade items children of grade categories
+        //however $grade_category->add_child($grade_items); causes an error and I dont know why
+        /*$gradebook->add_child($grade_items);
+
+        $gradebook->add_child($grade_categories);
+        $grade_categories->add_child($grade_category);
+        $grade_category->add_child($grade_items);
         $grade_items->add_child($grade_item);
         $grade_item->add_child($grade_grades);
         $grade_grades->add_child($grade_grade);
 
-        //$grade_item->add_child($grade_scale);
+        $gradebook->add_child($letters);
+        $letters->add_child($letter);
 
+        // Define sources
+        $grade_category_sql = "SELECT gc.*, gi.sortorder
+                               FROM {grade_categories} gc
+                               JOIN {grade_items} gi ON (gi.iteminstance = gc.id)
+                               WHERE gc.courseid = :courseid
+                               AND (gi.itemtype='course' OR gi.itemtype='category')
+                               ORDER BY gc.parent ASC";//need parent categories before their children
+        $grade_category_params = array('courseid'=>backup::VAR_COURSEID);
+        $grade_category->set_source_sql($grade_category_sql, $grade_category_params);
+
+        //Include manual, category and the course grade item
+        $grade_items_sql ="SELECT * FROM mdl_grade_items
+                            WHERE courseid = :courseid
+                            AND ( (itemtype='manual' and categoryid=:categoryid1)
+                                OR (itemtype='course' and iteminstance=:categoryid2)
+                                OR (itemtype='category' and iteminstance=:categoryid3) )";
+        $grade_items_params = array('courseid'=>backup::VAR_COURSEID,
+            ':categoryid1'=>backup::VAR_PARENTID,
+            ':categoryid2'=>backup::VAR_PARENTID,
+            ':categoryid3'=>backup::VAR_PARENTID);
+        $grade_item->set_source_sql($grade_items_sql, $grade_items_params);
+
+        if ($userinfo) {
+            $grade_grade->set_source_table('grade_grades', array('itemid' => backup::VAR_PARENTID));
+        }
+
+        $letter->set_source_table('grade_letters', array('contextid' => backup::VAR_CONTEXTID));
+
+        // Annotations (both as final as far as they are going to be exported in next steps)
+        $grade_item->annotate_ids('scalefinal', 'scaleid'); // Straight as scalefinal because it's > 0
+        $grade_item->annotate_ids('outcomefinal', 'outcomeid');*/
+
+        
+
+        $gradebook->add_child($grade_items);
+        $grade_items->add_child($grade_item);
+        $grade_item->add_child($grade_grades);
+        $grade_grades->add_child($grade_grade);
+
         $gradebook->add_child($grade_categories);
         $grade_categories->add_child($grade_category);
 
Index: moodle/backup/moodle2/restore_final_task.class.php
--- moodle/backup/moodle2/restore_final_task.class.php Base (1.6)
+++ moodle/backup/moodle2/restore_final_task.class.php Locally Modified (Based On 1.6)
@@ -42,7 +42,9 @@
             $this->add_step(new restore_review_pending_block_positions('review_block_positions'));
         }
 
-        // TODO: Gradebook
+        // Gradebook
+        //todo check if we actually need to restore gradebook
+        $this->add_step(new restore_gradebook_step('gradebook_step','gradebook.xml'));
 
         // Decode all the interlinks
         $this->add_step(new restore_decode_interlinks('decode_interlinks'));
Index: moodle/backup/moodle2/restore_stepslib.php
--- moodle/backup/moodle2/restore_stepslib.php Base (1.23)
+++ moodle/backup/moodle2/restore_stepslib.php Locally Modified (Based On 1.23)
@@ -67,6 +67,184 @@
 }
 
 /**
+ * Restore calculated grade items, grade categories etc
+ */
+//ELOY - am I inheriting from the correct class?
+//class restore_gradebook extends restore_execution_step {
+//class restore_gradebook_step extends restore_activity_structure_step {
+class restore_gradebook_step extends restore_structure_step {
+
+    /*protected function define_execution() {
+        //calculated grade items
+
+        //grade_grades
+        //$userinfo = $this->get_setting_value('users');
+        $userinfo = $this->task->get_setting_value('users');
+        if ($userinfo) {   
+        }
+
+        //grade_categories
+
+        //grade letters
+    }*/
+    protected function define_structure() {
+        $paths = array();
+        //$userinfo = $this->get_setting_value('userinfo');
+        $userinfo = $this->task->get_setting_value('users');
+
+        $paths[] = new restore_path_element('gradebook', '/gradebook');
+
+        $paths[] = new restore_path_element('grade_item', '/gradebook/grade_items/grade_item');
+        if ($userinfo) {
+            $paths[] = new restore_path_element('grade_grade', '/gradebook/grade_items/grade_item/grade_grades/grade_grade');
+        }
+        
+        $paths[] = new restore_path_element('grade_category', '/gradebook/grade_categories/grade_category');
+        $paths[] = new restore_path_element('grade_letter', '/gradebook/grade_letters/grade_letter');
+
+        // Return the paths wrapped into standard activity structure
+        //return $this->prepare_activity_structure($paths);
+        //$paths[] = new restore_path_element('activity', '/activity');
+        return $paths;
+    }
+
+    protected function process_gradebook($data) {
+    }
+
+    protected function process_grade_item($data) {
+        global $DB;
+var_dump('process_grade_item');
+        $data = (object)$data;
+
+        $oldid = $data->id;
+        $data->course = $this->get_courseid();
+
+        //ELOY - which of these do I do?
+        //$data->courseid = $this->get_mappingid('course', $data->courseid);
+        //$data->courseid = $this->get_new_parentid('course');
+        $data->courseid = $this->get_courseid();
+
+        //$data->categoryid = $this->get_mappingid('category', $data->categoryid);
+        $data->categoryid = $this->get_new_parentid('grade_category');
+
+        //iteminstance is null for manual grade items but not for course of category grade_items
+        if ($data->itemtype!='manual') {
+var_dump($data->itemtype);
+var_dump($data->iteminstance);
+            if ($data->itemtype=='category') {
+            //if ($data->itemtype=='course' || $data->itemtype=='category') {
+                $data->iteminstance = $this->get_mappingid('grade_category', $data->iteminstance);
+            } else {
+                //mtrace("data->iteminstance had an unexpected value: {$data->itemtype}");
+            }
+        }
+
+        $data->scaleid   = $this->get_mappingid('scale', $data->scaleid);
+        $data->outcomeid = $this->get_mappingid('outcome', $data->outcomeid);
+
+        $data->locktime     = $this->apply_date_offset($data->locktime);
+        $data->timecreated  = $this->apply_date_offset($data->timecreated);
+        $data->timemodified = $this->apply_date_offset($data->timemodified);
+
+        //for course or category grade items they should already exist so update instead of insert
+        if($data->itemtype=='course' || $data->itemtype=='category') {
+var_dump($data);
+            //get the ID of the already created grade item
+            $gi = new stdclass();
+            $gi->courseid  = $this->get_courseid();
+
+            $gi->itemtype  = $data->itemtype;
+            if ($data->itemtype=='course') {
+                //need to get the id of the grade_category that was automatically created for the course
+                $category = new stdclass();
+                $category->courseid  = $this->get_courseid();
+
+                $coursecategory = $DB->get_record('grade_categories', (array)$category);
+                $gi->iteminstance = $coursecategory->id;
+            } else {
+                $gi->iteminstance = $data->iteminstance;
+            }
+
+            $existinggradeitem = $DB->get_record('grade_items', (array)$gi);
+            $newitemid = $existinggradeitem->id;
+            $data->id = $newitemid;
+
+            $DB->update_record('grade_items', $data);
+        } else { //insert manual grade items
+            $newitemid = $DB->insert_record('grade_items', $data);
+        }
+        $this->set_mapping('grade_item', $oldid, $newitemid);
+    }
+
+    protected function process_grade_grade($data) {
+        global $DB;
+
+        $data = (object)$data;
+        $oldid = $data->id;
+
+        $data->itemid = $this->get_new_parentid('grade_item');
+
+        $data->userid = $this->get_mappingid('user', $data->userid);
+        $data->usermodified = $this->get_mappingid('user', $data->usermodified);
+        $data->locktime     = $this->apply_date_offset($data->locktime);
+        $data->timecreated  = $this->apply_date_offset($data->timecreated);
+        $data->timemodified = $this->apply_date_offset($data->timemodified);
+//var_dump($data);
+        $newitemid = $DB->insert_record('grade_grades', $data);
+        $this->set_mapping('grade_grade', $oldid, $newitemid);
+    }
+    protected function process_grade_category($data) {
+        global $DB;
+var_dump('process_grade_category');
+        $data = (object)$data;
+        $oldid = $data->id;
+
+        $data->course = $this->get_courseid();
+
+        //$data->courseid = $this->get_new_parentid('course');
+        $data->courseid = $data->course;
+        
+        //$data->parent = $this->get_mappingid('grade_category', $data->parent);
+        $data->parent = $this->get_new_parentid('grade_category');
+
+        $data->timecreated  = $this->apply_date_offset($data->timecreated);
+        $data->timemodified = $this->apply_date_offset($data->timemodified);
+
+        if(!empty($data->parent)) { //top level grade category is created when the course is created
+            $newitemid = $DB->insert_record('grade_categories', $data);
+        } else {
+            //get the already created course level grade category
+            $category = new stdclass();
+            $category->courseid  = $this->get_courseid();
+
+            $coursecategory = $DB->get_record('grade_categories', (array)$category);
+            $newitemid = $coursecategory->id;
+            $data->id = $newitemid;
+            
+            //parent was being saved as 0 when it should be null
+            $data->parent = null;
+
+            $DB->update_record('grade_categories', $data);
+        }
+        $this->set_mapping('grade_category', $oldid, $newitemid);
+    }
+    protected function process_grade_letter($data) {
+        global $DB;
+
+        $data = (object)$data;
+        $oldid = $data->id;
+
+        //ELOY - is this how I get the context id that the grade letter exists within?
+        //$data->contextid = $this->task->get_contextid();
+        //$data->contextid = $this->get_new_parentid('context');
+        $data->contextid = $this->get_mappingid('context', $data->contextid);
+
+        $newitemid = $DB->insert_record('grade_letters', $data);
+        $this->set_mapping('grade_letter', $oldid, $newitemid);
+    }
+}
+
+/**
  * decode all the interlinks present in restored content
  * relying 100% in the restore_decode_processor that handles
  * both the contents to modify and the rules to be applied
Index: moodle/backup/util/dbops/backup_plan_dbops.class.php
--- moodle/backup/util/dbops/backup_plan_dbops.class.php Base (1.5)
+++ moodle/backup/util/dbops/backup_plan_dbops.class.php Locally Modified (Based On 1.5)
@@ -207,6 +207,9 @@
         $count = $DB->count_records_sql($sql, $params);
 
         //if there are 0 activity grade items not already included in the backup
-        return $count == 0;
+        //return $count == 0;
+
+        //DO NOT CHECK THIS IN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+        return true;
     }
 }
