]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-9636 grade import fixes - allow null grades, no importcode collisions and stealin...
authorskodak <skodak>
Sun, 7 Oct 2007 13:04:49 +0000 (13:04 +0000)
committerskodak <skodak>
Sun, 7 Oct 2007 13:04:49 +0000 (13:04 +0000)
grade/export/lib.php
grade/import/csv/index.php
grade/import/grade_import_form.php
grade/import/lib.php
grade/import/xml/lib.php
lang/en_utf8/grades.php
lib/db/install.xml
lib/db/upgrade.php
version.php

index e8d9995f491568b145004a92152783facbcb7e10..28504de2996ed5bba979401b212e819f7dbc0c50 100755 (executable)
@@ -149,6 +149,8 @@ class grade_export {
         $displaytype = null;
         if ($this->export_letters) {
             $displaytype = GRADE_DISPLAY_TYPE_LETTER;
+        } else {
+            $displaytype = GRADE_DISPLAY_TYPE_REAL;
         }
 
         return grade_format_gradevalue($grade->finalgrade, $this->grade_items[$grade->itemid], false, $displaytype, null);
index 80733423a53605f9b640a06cc5f839858d6ed667..90aae6b7c769a9d577bbdb2ced18870896039110 100755 (executable)
@@ -44,8 +44,12 @@ $mform = new grade_import_form();
 // they are somehow not returned with get_data()
 if (($formdata = data_submitted()) && !empty($formdata->map)) {
 
-    // temporary file name supplied by form
-    $filename = $CFG->dataroot.'/temp/'.clean_param($formdata->filename, PARAM_FILE);
+    $importcode = clean_param($formdata->importcode, PARAM_FILE);
+    $filename = $CFG->dataroot.'/temp/gradeimport/cvs/'.$USER->id.'/'.$importcode;
+
+    if (!file_exists($filename)) {
+        error('error processing upload file');
+    }
 
     if ($fp = fopen($filename, "r")) {
         // --- get header (field names) ---
@@ -55,7 +59,7 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
             $h = trim($h); $header[$i] = $h; // remove whitespace
         }
     } else {
-        error ('could not open file '.$filename);
+        error ('could not open file');
     }
 
     $map = array();
@@ -79,7 +83,7 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
             } else {
                 // collision
                 unlink($filename); // needs to be uploaded again, sorry
-                error('mapping collision detected, 2 fields maps to the same grdae item '.$j);
+                error('mapping collision detected, 2 fields maps to the same grade item '.$j);
             }
         }
     }
@@ -97,13 +101,7 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
     if ($fp = fopen($filename, "r")) {
 
         // read the first line makes sure this doesn't get read again
-        $header = split($csv_delimiter, clean_param(fgets($fp,1024), PARAM_RAW));
-
-        // use current (non-conflicting) time stamp
-        $importcode = time();
-        while (get_record('grade_import_values', 'import_code', $importcode)) {
-            $importcode = time();
-        }
+        $header = split($csv_delimiter, fgets($fp,1024));
 
         $newgradeitems = array(); // temporary array to keep track of what new headers are processed
         $status = true;
@@ -133,7 +131,7 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
                 $t = explode("_", $map[$key]);
                 $t0 = $t[0];
                 if (isset($t[1])) {
-                    $t1 = $t[1];
+                    $t1 = (int)$t[1];
                 } else {
                     $t1 = '';
                 }
@@ -184,7 +182,8 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
 
                             $newgradeitem = new object();
                             $newgradeitem->itemname = $header[$key];
-                            $newgradeitem->import_code = $importcode;
+                            $newgradeitem->importcode = $importcode;
+                            $newgradeitem->importer   = $USER->id;
 
                             // failed to insert into new grade item buffer
                             if (!$newgradeitems[$key] = insert_record('grade_import_newitem', addslashes_recursive($newgradeitem))) {
@@ -206,6 +205,17 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
                     break;
                     case 'feedback':
                         if ($t1) {
+                            // case of an id, only maps id of a grade_item
+                            // this was idnumber
+                            if (!$gradeitem = new grade_item(array('id'=>$t1, 'courseid'=>$course->id))) {
+                                // supplied bad mapping, should not be possible since user
+                                // had to pick mapping
+                                $status = false;
+                                import_cleanup($importcode);
+                                notify(get_string('importfailed', 'grades'));
+                                break 3;
+                            }
+
                             // t1 is the id of the grade item
                             $feedback = new object();
                             $feedback->itemid   = $t1;
@@ -215,10 +225,12 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
                     break;
                     default:
                         // existing grade items
-                        if (!empty($map[$key]) && $value!=="") {
+                        if (!empty($map[$key])) {
+                            if ($value === '' or $value == '-') {
+                                $value = null; // no grade
 
+                            } else if (!is_numeric($value)) {
                             // non numeric grade value supplied, possibly mapped wrong column
-                            if (!is_numeric($value)) {
                                 echo "<br/>t0 is $t0";
                                 echo "<br/>grade is $value";
                                 $status = false;
@@ -239,7 +251,7 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
                             }
 
                             // check if grade item is locked if so, abort
-                            if ($gradeitem->locked) {
+                            if ($gradeitem->is_locked()) {
                                 $status = false;
                                 import_cleanup($importcode);
                                 notify(get_string('gradeitemlocked', 'grades'));
@@ -266,13 +278,13 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
             }
 
             // insert results of this students into buffer
-            if (!empty($newgrades)) {
+            if ($status and !empty($newgrades)) {
 
                 foreach ($newgrades as $newgrade) {
 
                     // check if grade_grade is locked and if so, abort
-                    if ($grade_grade = new grade_grade(array('itemid'=>$newgrade->itemid, 'userid'=>$studentid))) {
-                        if ($grade_grade->locked) {
+                    if (!empty($newgrade->itemid) and $grade_grade = new grade_grade(array('itemid'=>$newgrade->itemid, 'userid'=>$studentid))) {
+                        if ($grade_grade->is_locked()) {
                             // individual grade locked
                             $status = false;
                             import_cleanup($importcode);
@@ -281,8 +293,9 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
                         }
                     }
 
-                    $newgrade->import_code = $importcode;
-                    $newgrade->userid = $studentid;
+                    $newgrade->importcode = $importcode;
+                    $newgrade->userid     = $studentid;
+                    $newgrade->importer   = $USER->id;
                     if (!insert_record('grade_import_values', addslashes_recursive($newgrade))) {
                         // could not insert into temporary table
                         $status = false;
@@ -294,15 +307,20 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
             }
 
             // updating/inserting all comments here
-            if (!empty($newfeedbacks)) {
+            if ($status and !empty($newfeedbacks)) {
                 foreach ($newfeedbacks as $newfeedback) {
-                    if ($feedback = get_record('grade_import_values', 'import_code', $importcode, 'userid', $studentid, 'itemid', $newfeedback->itemid)) {
-                        $newfeedback ->id = $feedback ->id;
+                    $sql = "SELECT *
+                              FROM {$CFG->prefix}grade_import_values
+                             WHERE importcode=$importcode AND userid=$studentid AND itemid=$newfeedback->itemid AND importer={$USER->id}";
+                    if ($feedback = get_record_sql($sql)) {
+                        $newfeedback->id = $feedback->id;
                         update_record('grade_import_values', addslashes_recursive($newfeedback));
+
                     } else {
                         // the grade item for this is not updated
-                        $newfeedback->import_code = $importcode;
-                        $newfeedback->userid = $studentid;
+                        $newfeedback->importcode = $importcode;
+                        $newfeedback->userid     = $studentid;
+                        $newfeedback->importer   = $USER->id;
                         insert_record('grade_import_values', addslashes_recursive($newfeedback));
                     }
                 }
@@ -320,8 +338,6 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
     }
 
 } else if ($formdata = $mform->get_data()) {
-    // else if file is just uploaded
-    $filename = $mform->get_userfile_name();
 
     // Large files are likely to take their time and memory. Let PHP know
     // that we'll take longer, and that the process should be recycled soon
@@ -332,7 +348,14 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
         @apache_child_terminate();
     }
 
-    $text = my_file_get_contents($filename);
+    // use current (non-conflicting) time stamp
+    $importcode = get_new_importcode();
+    if (!$filename = make_upload_directory('temp/gradeimport/cvs/'.$USER->id, true)) {
+        die;
+    }
+    $filename = $filename.'/'.$importcode;
+
+    $text = $mform->get_file_content('userfile');
     // trim utf-8 bom
     $textlib = textlib_get_instance();
     /// normalize line endings and do the encoding conversion
@@ -347,7 +370,7 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
     $fp = fopen($filename, "r");
 
     // --- get header (field names) ---
-    $header = split($csv_delimiter, clean_param(fgets($fp,1024), PARAM_RAW));
+    $header = split($csv_delimiter, fgets($fp,1024), PARAM_RAW);
 
     // print some preview
     $numlines = 0; // 0 preview lines displayed
@@ -387,7 +410,8 @@ if (($formdata = data_submitted()) && !empty($formdata->map)) {
         }
     }
     // display the mapping form with header info processed
-    $mform2 = new grade_import_mapping_form(qualified_me(), array('gradeitems'=>$gradeitems, 'header'=>$header, 'filename'=>$filename));
+    $mform2 = new grade_import_mapping_form(null, array('gradeitems'=>$gradeitems, 'header'=>$header));
+    $mform2->set_data(array('importcode'=>$importcode, 'id'=>$id));
     $mform2->display();
 } else {
     // display the standard upload file form
index df29572e631b292bf95b8f36b62340ee58d533e1..3ca28a95a825554bc8f01c7abcdf1cef33743642 100755 (executable)
@@ -1,5 +1,6 @@
 <?php // $Id$
 require_once $CFG->libdir.'/formslib.php';
+require_once($CFG->libdir.'/gradelib.php');
 
 class grade_import_form extends moodleform {
     function definition (){
@@ -18,19 +19,10 @@ class grade_import_form extends moodleform {
         $mform->addElement('select', 'encoding', get_string('encoding', 'grades'), $encodings);
 
         $options = array('10'=>10, '20'=>20, '100'=>100, '1000'=>1000, '100000'=>100000);
-        $mform->addElement('select', 'previewrows', 'Preview rows', $options); // TODO: localize
+        $mform->addElement('select', 'previewrows', get_string('rowpreviewnum', 'grades'), $options); // TODO: localize
         $mform->setType('previewrows', PARAM_INT);
         $this->add_action_buttons(false, get_string('uploadgrades', 'grades'));
     }
-
-    function get_userfile_name(){
-        if ($this->is_submitted() and $this->is_validated()) {
-            // return the temporary filename to process
-            return $this->_upload_manager->files['userfile']['tmp_name'];
-        } else{
-            return  NULL;
-        }
-    }
 }
 
 class grade_import_mapping_form extends moodleform {
@@ -41,8 +33,6 @@ class grade_import_mapping_form extends moodleform {
 
         // this is an array of headers
         $header = $this->_customdata['header'];
-        // temporary filename
-        $filename = $this->_customdata['filename'];
         // course id
 
         $mform->addElement('header', 'general', get_string('identifier', 'grades'));
@@ -71,8 +61,6 @@ class grade_import_mapping_form extends moodleform {
             }
         }
 
-        include_once($CFG->libdir.'/gradelib.php');
-
         if ($header) {
             $i = 0; // index
             foreach ($header as $h) {
@@ -88,23 +76,13 @@ class grade_import_mapping_form extends moodleform {
             }
         }
 
-        // find a non-conflicting file name based on time stamp
-        $newfilename = 'cvstemp_'.time();
-        while (file_exists($CFG->dataroot.'/temp/'.$newfilename)) {
-            $newfilename = 'cvstemp_'.time();
-        }
-
-        // move the uploaded file
-        move_uploaded_file($filename, $CFG->dataroot.'/temp/'.$newfilename);
-
         // course id needs to be passed for auth purposes
         $mform->addElement('hidden', 'map', 1);
         $mform->setType('map', PARAM_INT);
-        $mform->addElement('hidden', 'id', optional_param('id'));
+        $mform->addElement('hidden', 'id');
         $mform->setType('id', PARAM_INT);
-        //echo '<input name="filename" value='.$newfilename.' type="hidden" />';
-        $mform->addElement('hidden', 'filename', $newfilename);
-        $mform->setType('filename', PARAM_FILE);
+        $mform->addElement('hidden', 'importcode');
+        $mform->setType('importcode', PARAM_FILE);
         $this->add_action_buttons(false, get_string('uploadgrades', 'grades'));
 
     }
index d1779a9c959809e80b24be5d5815f7068cf659fb..3169c1a7f4e9e303d6b38662a7a7c02ad403b7cf 100755 (executable)
@@ -1,5 +1,22 @@
 <?php  // $Id$
 
+require_once($CFG->libdir.'/gradelib.php');
+
+/**
+ * Returns new improtcode for current user
+ * @return int importcode
+ */
+function get_new_importcode() {
+    global $USER;
+
+    $importcode = time();
+    while (get_record('grade_import_values', 'importcode', $importcode, 'importer', $USER->id)) {
+        $importcode--;
+    }
+
+    return $importcode;
+}
+
 /**
  * given an import code, commits all entries in buffer tables
  * (grade_import_value and grade_import_newitem)
  * @return bool success
  */
 function grade_import_commit($courseid, $importcode, $importfeedback=true, $verbose=true) {
-    global $CFG;
+    global $CFG, $USER;
 
-    include_once($CFG->libdir.'/gradelib.php');
-    include_once($CFG->libdir.'/grade/grade_item.php');
     $commitstart = time(); // start time in case we need to roll back
     $newitemids = array(); // array to hold new grade_item ids from grade_import_newitem table, mapping array
 
     /// first select distinct new grade_items with this batch
 
     if ($newitems = get_records_sql("SELECT *
-                                     FROM {$CFG->prefix}grade_import_newitem
-                                     WHERE import_code = $importcode")) {
+                                       FROM {$CFG->prefix}grade_import_newitem
+                                      WHERE importcode = $importcode AND importer={$USER->id}")) {
 
         // instances of the new grade_items created, cached
         // in case grade_update fails, so that we can remove them
@@ -60,13 +75,12 @@ function grade_import_commit($courseid, $importcode, $importfeedback=true, $verb
     /// then find all existing items
 
     if ($gradeitems = get_records_sql("SELECT DISTINCT (itemid)
-                                       FROM {$CFG->prefix}grade_import_values
-                                       WHERE import_code = $importcode
-                                       AND itemid > 0")) {
+                                         FROM {$CFG->prefix}grade_import_values
+                                        WHERE importcode = $importcode AND importer={$USER->id} AND itemid > 0")) {
 
         $modifieditems = array();
 
-        foreach ($gradeitems as $itemid=>$iteminfo) {
+        foreach ($gradeitems as $itemid=>$notused) {
 
             if (!$gradeitem = new grade_item(array('id'=>$itemid))) {
                 // not supposed to happen, but just in case
@@ -114,22 +128,11 @@ function grade_import_commit($courseid, $importcode, $importfeedback=true, $verb
  * @param string importcode - import batch identifier
  */
 function import_cleanup($importcode) {
+    global $USER;
+
     // remove entries from buffer table
-    delete_records('grade_import_values', 'import_code', $importcode);
-    delete_records('grade_import_newitem', 'import_code', $importcode);
+    delete_records('grade_import_values', 'importcode', $importcode, 'importer', $USER->id);
+    delete_records('grade_import_newitem', 'importcode', $importcode, 'importer', $USER->id);
 }
 
-/// Returns the file as one big long string
-function my_file_get_contents($filename, $use_include_path = 0) {
-
-    $data = "";
-    $file = @fopen($filename, "rb", $use_include_path);
-    if ($file) {
-        while (!feof($file)) {
-            $data .= fread($file, 1024);
-        }
-        fclose($file);
-    }
-    return $data;
-}
 ?>
index ed8e0c9355f83bd4e5f7b8f20fbf39fa333a3a9f..7d1907afa92d7772b6d21e965272f084ec3356ef 100644 (file)
@@ -6,7 +6,9 @@ require_once $CFG->dirroot.'/grade/lib.php';
 require_once $CFG->dirroot.'/grade/import/lib.php';
 
 function import_xml_grades($text, $course, &$error) {
-    $importcode = time(); //TODO: fix predictable+colliding import code!
+    global $USER;
+
+    $importcode = get_new_importcode();
 
     $status = true;
 
@@ -46,6 +48,7 @@ function import_xml_grades($text, $course, &$error) {
 
             // check if grade_grade is locked and if so, abort
             if ($grade_grade = new grade_grade(array('itemid'=>$grade_item->id, 'userid'=>$user->id))) {
+                $grade_grade->grade_item =& $grade_item;
                 if ($grade_grade->is_locked()) {
                     // individual grade locked, abort
                     $status = false;
@@ -55,9 +58,10 @@ function import_xml_grades($text, $course, &$error) {
             }
 
             $newgrade = new object();
-            $newgrade->itemid      = $grade_item->id;
-            $newgrade->userid      = $user->id;
-            $newgrade->import_code = $importcode;
+            $newgrade->itemid     = $grade_item->id;
+            $newgrade->userid     = $user->id;
+            $newgrade->importcode = $importcode;
+            $newgrade->importer   = $USER->id;
 
             // check grade value exists and is a numeric grade
             if (isset($result['#']['score'][0]['#'])) {
index 1ed71f6dc19183dc315aa2fcaf2afbdf8dfa6709..62f9d7c081742f90140b300cd7994531ed238012 100644 (file)
@@ -348,8 +348,9 @@ $string['report'] = 'Report';
 $string['reportplugins'] = 'Report plugins';
 $string['reportsettings'] = 'Report settings';
 $string['reprintheaders'] = 'Reprint Headers';
-$string['respectingcurrentdata'] = "leaving current configuration unmodified";
+$string['respectingcurrentdata'] = 'leaving current configuration unmodified';
 $string['right'] = 'Right';
+$string['rowpreviewnum'] = 'Preview rows';
 $string['savechanges'] = 'Save Changes';
 $string['savepreferences'] = 'Save Preferences';
 $string['scaledpct'] = 'Scaled %%';
index 813cb996ce5ce60245939b408e5bec8b2e2f79bd..0608cc2ed208774ee7e8286752a439c1a559e3a8 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<XMLDB PATH="lib/db" VERSION="20071002" COMMENT="XMLDB file for core Moodle tables"
+<XMLDB PATH="lib/db" VERSION="20071007" COMMENT="XMLDB file for core Moodle tables"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="../../lib/xmldb/xmldb.xsd"
 >
     <TABLE NAME="grade_import_newitem" COMMENT="temporary table for storing new grade_item names from grade import" PREVIOUS="grade_grades_history" NEXT="grade_import_values">
       <FIELDS>
         <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="true" ENUM="false" NEXT="itemname"/>
-        <FIELD NAME="itemname" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" ENUM="false" COMMENT="new grade item name" PREVIOUS="id" NEXT="import_code"/>
-        <FIELD NAME="import_code" TYPE="int" LENGTH="12" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" ENUM="false" COMMENT="import batch code for identification" PREVIOUS="itemname"/>
+        <FIELD NAME="itemname" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" ENUM="false" COMMENT="new grade item name" PREVIOUS="id" NEXT="importcode"/>
+        <FIELD NAME="importcode" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" ENUM="false" COMMENT="import batch code for identification" PREVIOUS="itemname" NEXT="importer"/>
+        <FIELD NAME="importer" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" ENUM="false" COMMENT="user importing the data" PREVIOUS="importcode"/>
       </FIELDS>
       <KEYS>
-        <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
+        <KEY NAME="primary" TYPE="primary" FIELDS="id" NEXT="importer"/>
+        <KEY NAME="importer" TYPE="foreign" FIELDS="importer" REFTABLE="user" REFFIELDS="id" PREVIOUS="primary"/>
       </KEYS>
     </TABLE>
     <TABLE NAME="grade_import_values" COMMENT="Temporary table for importing grades" PREVIOUS="grade_import_newitem" NEXT="tag">
         <FIELD NAME="itemid" TYPE="int" LENGTH="10" NOTNULL="false" UNSIGNED="true" SEQUENCE="false" ENUM="false" COMMENT="if set, this points to existing grade_items id" PREVIOUS="id" NEXT="newgradeitem"/>
         <FIELD NAME="newgradeitem" TYPE="int" LENGTH="10" NOTNULL="false" UNSIGNED="true" SEQUENCE="false" ENUM="false" COMMENT="if set, points to the id of grade_import_newitem" PREVIOUS="itemid" NEXT="userid"/>
         <FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" ENUM="false" PREVIOUS="newgradeitem" NEXT="finalgrade"/>
-        <FIELD NAME="finalgrade" TYPE="number" LENGTH="10" NOTNULL="true" UNSIGNED="false" DEFAULT="0" SEQUENCE="false" ENUM="false" DECIMALS="5" COMMENT="raw grade value" PREVIOUS="userid" NEXT="feedback"/>
-        <FIELD NAME="feedback" TYPE="text" LENGTH="medium" NOTNULL="false" SEQUENCE="false" ENUM="false" PREVIOUS="finalgrade" NEXT="import_code"/>
-        <FIELD NAME="import_code" TYPE="int" LENGTH="12" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" ENUM="false" COMMENT="similar to backup_code, a unique batch code for identifying one batch of imports" PREVIOUS="feedback"/>
+        <FIELD NAME="finalgrade" TYPE="number" LENGTH="10" NOTNULL="false" UNSIGNED="false" SEQUENCE="false" ENUM="false" DECIMALS="5" COMMENT="raw grade value" PREVIOUS="userid" NEXT="feedback"/>
+        <FIELD NAME="feedback" TYPE="text" LENGTH="medium" NOTNULL="false" SEQUENCE="false" ENUM="false" PREVIOUS="finalgrade" NEXT="importcode"/>
+        <FIELD NAME="importcode" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" ENUM="false" COMMENT="similar to backup_code, a unique batch code for identifying one batch of imports" PREVIOUS="feedback" NEXT="importer"/>
+        <FIELD NAME="importer" TYPE="int" LENGTH="10" NOTNULL="false" UNSIGNED="true" SEQUENCE="false" ENUM="false" PREVIOUS="importcode"/>
       </FIELDS>
       <KEYS>
         <KEY NAME="primary" TYPE="primary" FIELDS="id" NEXT="itemid"/>
         <KEY NAME="itemid" TYPE="foreign" FIELDS="itemid" REFTABLE="grade_items" REFFIELDS="id" PREVIOUS="primary" NEXT="newgradeitem"/>
-        <KEY NAME="newgradeitem" TYPE="foreign" FIELDS="newgradeitem" REFTABLE="grade_import_newitem" REFFIELDS="id" PREVIOUS="itemid"/>
+        <KEY NAME="newgradeitem" TYPE="foreign" FIELDS="newgradeitem" REFTABLE="grade_import_newitem" REFFIELDS="id" PREVIOUS="itemid" NEXT="importer"/>
+        <KEY NAME="importer" TYPE="foreign" FIELDS="importer" REFTABLE="user" REFFIELDS="id" COMMENT="user who is importing" PREVIOUS="newgradeitem"/>
       </KEYS>
     </TABLE>
     <TABLE NAME="tag" COMMENT="Tag table - this generic table will replace the old &quot;tags&quot; table." PREVIOUS="grade_import_values" NEXT="tag_correlation">
index 18232947fb219e24eba695d32d03dea5e20203f3..1918135e6efd5f1d333511b4558500a3d39dcd70 100644 (file)
@@ -1309,42 +1309,6 @@ function xmldb_main_upgrade($oldversion=0) {
     /// Launch create table for grade_grades_history
         $result = $result && create_table($table);
 
-
-    /// Define table grade_import_newitem to be created
-        $table = new XMLDBTable('grade_import_newitem');
-
-    /// Adding fields to table grade_import_newitem
-        $table->addFieldInfo('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null, null);
-        $table->addFieldInfo('itemname', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, null, null);
-        $table->addFieldInfo('import_code', XMLDB_TYPE_INTEGER, '12', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, null);
-
-    /// Adding keys to table grade_import_newitem
-        $table->addKeyInfo('primary', XMLDB_KEY_PRIMARY, array('id'));
-
-    /// Launch create table for grade_import_newitem
-        $result = $result && create_table($table);
-
-
-    /// Define table grade_import_values to be created
-        $table = new XMLDBTable('grade_import_values');
-
-    /// Adding fields to table grade_import_values
-        $table->addFieldInfo('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null, null);
-        $table->addFieldInfo('itemid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null, null, null);
-        $table->addFieldInfo('newgradeitem', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null, null, null);
-        $table->addFieldInfo('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, null);
-        $table->addFieldInfo('finalgrade', XMLDB_TYPE_NUMBER, '10, 5', null, XMLDB_NOTNULL, null, null, null, '0');
-        $table->addFieldInfo('feedback', XMLDB_TYPE_TEXT, 'medium', null, null, null, null, null, null);
-        $table->addFieldInfo('import_code', XMLDB_TYPE_INTEGER, '12', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, null);
-
-    /// Adding keys to table grade_import_values
-        $table->addKeyInfo('primary', XMLDB_KEY_PRIMARY, array('id'));
-        $table->addKeyInfo('itemid', XMLDB_KEY_FOREIGN, array('itemid'), 'grade_items', array('id'));
-        $table->addKeyInfo('newgradeitem', XMLDB_KEY_FOREIGN, array('newgradeitem'), 'grade_import_newitem', array('id'));
-
-    /// Launch create table for grade_import_values
-        $result = $result && create_table($table);
-
     /// upgrade the old 1.8 gradebook - migrade data into new grade tables
         if ($result) {
             require_once($CFG->libdir.'/db/upgradelib.php');
@@ -2354,6 +2318,60 @@ function xmldb_main_upgrade($oldversion=0) {
         $result = $result && change_field_notnull($table, $field);
     }
 
+    if ($result && $oldversion < 2007100700) {
+
+    /// first drop existing tables - we do not need any data from there
+        $table = new XMLDBTable('grade_import_values');
+        if (table_exists($table)) {
+            drop_table($table);
+        }
+
+        $table = new XMLDBTable('grade_import_newitem');
+        if (table_exists($table)) {
+            drop_table($table);
+        }
+
+    /// Define table grade_import_newitem to be created
+        $table = new XMLDBTable('grade_import_newitem');
+
+    /// Adding fields to table grade_import_newitem
+        $table->addFieldInfo('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null, null);
+        $table->addFieldInfo('itemname', XMLDB_TYPE_CHAR, '255', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, null);
+        $table->addFieldInfo('importcode', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, null);
+        $table->addFieldInfo('importer', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, null);
+
+    /// Adding keys to table grade_import_newitem
+        $table->addKeyInfo('primary', XMLDB_KEY_PRIMARY, array('id'));
+        $table->addKeyInfo('importer', XMLDB_KEY_FOREIGN, array('importer'), 'user', array('id'));
+
+    /// Launch create table for grade_import_newitem
+        $result = $result && create_table($table);
+
+
+    /// Define table grade_import_values to be created
+        $table = new XMLDBTable('grade_import_values');
+
+    /// Adding fields to table grade_import_values
+        $table->addFieldInfo('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null, null);
+        $table->addFieldInfo('itemid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null, null, null);
+        $table->addFieldInfo('newgradeitem', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null, null, null);
+        $table->addFieldInfo('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, null);
+        $table->addFieldInfo('finalgrade', XMLDB_TYPE_NUMBER, '10, 5', null, null, null, null, null, null);
+        $table->addFieldInfo('feedback', XMLDB_TYPE_TEXT, 'medium', XMLDB_UNSIGNED, null, null, null, null, null);
+        $table->addFieldInfo('importcode', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, null);
+        $table->addFieldInfo('importer', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null, null, null);
+
+    /// Adding keys to table grade_import_values
+        $table->addKeyInfo('primary', XMLDB_KEY_PRIMARY, array('id'));
+        $table->addKeyInfo('itemid', XMLDB_KEY_FOREIGN, array('itemid'), 'grade_items', array('id'));
+        $table->addKeyInfo('newgradeitem', XMLDB_KEY_FOREIGN, array('newgradeitem'), 'grade_import_newitem', array('id'));
+        $table->addKeyInfo('importer', XMLDB_KEY_FOREIGN, array('importer'), 'user', array('id'));
+
+    /// Launch create table for grade_import_values
+        $result = $result && create_table($table);
+
+    }
+
 
 /* NOTE: please keep this at the end of upgrade file for now ;-)
     /// drop old gradebook tables
index fb5e3a5273a2c79013412adb7120be4d5137c686..e8f1def9d4480b262d10d27d9e2f14057cd33aaf 100644 (file)
@@ -6,7 +6,7 @@
 // This is compared against the values stored in the database to determine
 // whether upgrades should be performed (see lib/db/*.php)
 
-    $version = 2007100500;  // YYYYMMDD = date
+    $version = 2007100700;  // YYYYMMDD = date
                             //       XY = increments within a single day
 
     $release = '1.9 Beta +';   // Human-friendly version name