mirror of
https://github.com/moodle/moodle.git
synced 2025-08-05 08:56:36 +02:00
Merge branch 'wip-MDL-35678-master' of git://github.com/abgreeve/moodle
This commit is contained in:
commit
9d1989daa7
2 changed files with 297 additions and 351 deletions
|
@ -15,15 +15,18 @@
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
require_once '../../../config.php';
|
require_once("../../../config.php");
|
||||||
require_once $CFG->libdir.'/gradelib.php';
|
require_once($CFG->libdir.'/gradelib.php');
|
||||||
require_once $CFG->dirroot.'/grade/lib.php';
|
require_once($CFG->dirroot.'/grade/lib.php');
|
||||||
require_once '../grade_import_form.php';
|
require_once($CFG->dirroot. '/grade/import/grade_import_form.php');
|
||||||
require_once '../lib.php';
|
require_once($CFG->dirroot.'/grade/import/lib.php');
|
||||||
|
require_once($CFG->libdir . '/csvlib.class.php');
|
||||||
|
|
||||||
$id = required_param('id', PARAM_INT); // course id
|
$id = required_param('id', PARAM_INT); // course id
|
||||||
$separator = optional_param('separator', '', PARAM_ALPHA);
|
$separator = optional_param('separator', '', PARAM_ALPHA);
|
||||||
$verbosescales = optional_param('verbosescales', 1, PARAM_BOOL);
|
$verbosescales = optional_param('verbosescales', 1, PARAM_BOOL);
|
||||||
|
$iid = optional_param('iid', null, PARAM_INT);
|
||||||
|
$importcode = optional_param('importcode', '', PARAM_FILE);
|
||||||
|
|
||||||
$url = new moodle_url('/grade/import/csv/index.php', array('id'=>$id));
|
$url = new moodle_url('/grade/import/csv/index.php', array('id'=>$id));
|
||||||
if ($separator !== '') {
|
if ($separator !== '') {
|
||||||
|
@ -34,8 +37,6 @@ if ($verbosescales !== 1) {
|
||||||
}
|
}
|
||||||
$PAGE->set_url($url);
|
$PAGE->set_url($url);
|
||||||
|
|
||||||
define('GRADE_CSV_LINE_LENGTH', 4096);
|
|
||||||
|
|
||||||
if (!$course = $DB->get_record('course', array('id'=>$id))) {
|
if (!$course = $DB->get_record('course', array('id'=>$id))) {
|
||||||
print_error('nocourseid');
|
print_error('nocourseid');
|
||||||
}
|
}
|
||||||
|
@ -48,33 +49,14 @@ require_capability('gradeimport/csv:view', $context);
|
||||||
$separatemode = (groups_get_course_groupmode($COURSE) == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context));
|
$separatemode = (groups_get_course_groupmode($COURSE) == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context));
|
||||||
$currentgroup = groups_get_course_group($course);
|
$currentgroup = groups_get_course_group($course);
|
||||||
|
|
||||||
// sort out delimiter
|
|
||||||
if (isset($CFG->CSV_DELIMITER)) {
|
|
||||||
$csv_delimiter = $CFG->CSV_DELIMITER;
|
|
||||||
|
|
||||||
if (isset($CFG->CSV_ENCODE)) {
|
|
||||||
$csv_encode = '/\&\#' . $CFG->CSV_ENCODE . '/';
|
|
||||||
}
|
|
||||||
} else if ($separator == 'tab') {
|
|
||||||
$csv_delimiter = "\t";
|
|
||||||
$csv_encode = "";
|
|
||||||
} else {
|
|
||||||
$csv_delimiter = ",";
|
|
||||||
$csv_encode = '/\&\#44/';
|
|
||||||
}
|
|
||||||
|
|
||||||
print_grade_page_head($course->id, 'import', 'csv', get_string('importcsv', 'grades'));
|
print_grade_page_head($course->id, 'import', 'csv', get_string('importcsv', 'grades'));
|
||||||
|
|
||||||
// set up import form
|
// Set up the grade import mapping form.
|
||||||
$mform = new grade_import_form(null, array('includeseparator'=>!isset($CFG->CSV_DELIMITER), 'verbosescales'=>true));
|
|
||||||
|
|
||||||
// set up grade import mapping form
|
|
||||||
$header = '';
|
|
||||||
$gradeitems = array();
|
$gradeitems = array();
|
||||||
if ($id) {
|
if ($id) {
|
||||||
if ($grade_items = grade_item::fetch_all(array('courseid'=>$id))) {
|
if ($grade_items = grade_item::fetch_all(array('courseid'=>$id))) {
|
||||||
foreach ($grade_items as $grade_item) {
|
foreach ($grade_items as $grade_item) {
|
||||||
// skip course type and category type
|
// Skip course type and category type.
|
||||||
if ($grade_item->itemtype == 'course' || $grade_item->itemtype == 'category') {
|
if ($grade_item->itemtype == 'course' || $grade_item->itemtype == 'category') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -90,96 +72,84 @@ if ($id) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($importcode = optional_param('importcode', '', PARAM_FILE)) {
|
// Set up the import form.
|
||||||
$filename = $CFG->tempdir.'/gradeimport/cvs/'.$USER->id.'/'.$importcode;
|
$mform = new grade_import_form(null, array('includeseparator'=>true, 'verbosescales'=>true));
|
||||||
$fp = fopen($filename, "r");
|
|
||||||
$headers = fgets($fp, GRADE_CSV_LINE_LENGTH);
|
|
||||||
$header = explode($csv_delimiter, $headers);
|
|
||||||
fclose($fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
$mform2 = new grade_import_mapping_form(null, array('gradeitems'=>$gradeitems, 'header'=>$header));
|
// If the csv file hasn't been imported yet then look for a form submission or
|
||||||
|
// show the initial submission form.
|
||||||
|
if (!$iid) {
|
||||||
|
// If the import form has been submitted.
|
||||||
|
if ($formdata = $mform->get_data()) {
|
||||||
|
|
||||||
// if import form is submitted
|
// Large files are likely to take their time and memory. Let PHP know
|
||||||
if ($formdata = $mform->get_data()) {
|
// that we'll take longer, and that the process should be recycled soon
|
||||||
|
// to free up memory.
|
||||||
|
@set_time_limit(0);
|
||||||
|
raise_memory_limit(MEMORY_EXTRA);
|
||||||
|
|
||||||
// Large files are likely to take their time and memory. Let PHP know
|
// Use current (non-conflicting) time stamp.
|
||||||
// that we'll take longer, and that the process should be recycled soon
|
$importcode = get_new_importcode();
|
||||||
// to free up memory.
|
|
||||||
@set_time_limit(0);
|
|
||||||
raise_memory_limit(MEMORY_EXTRA);
|
|
||||||
|
|
||||||
// use current (non-conflicting) time stamp
|
$text = $mform->get_file_content('userfile');
|
||||||
$importcode = get_new_importcode();
|
$iid = csv_import_reader::get_new_iid('grade');
|
||||||
$filename = make_temp_directory('gradeimport/cvs/'.$USER->id);
|
$csvimport = new csv_import_reader($iid, 'grade');
|
||||||
$filename = $filename.'/'.$importcode;
|
|
||||||
|
|
||||||
$text = $mform->get_file_content('userfile');
|
$csvimport->load_csv_content($text, $formdata->encoding, $separator);
|
||||||
// trim utf-8 bom
|
|
||||||
/// normalize line endings and do the encoding conversion
|
|
||||||
$text = textlib::convert($text, $formdata->encoding);
|
|
||||||
$text = textlib::trim_utf8_bom($text);
|
|
||||||
// Fix mac/dos newlines
|
|
||||||
$text = preg_replace('!\r\n?!',"\n",$text);
|
|
||||||
$fp = fopen($filename, "w");
|
|
||||||
fwrite($fp,$text);
|
|
||||||
fclose($fp);
|
|
||||||
|
|
||||||
if (!$fp = fopen($filename, "r")) {
|
|
||||||
print_error('cannotopenfile');
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- get header (field names) ---
|
|
||||||
$header = explode($csv_delimiter, fgets($fp, GRADE_CSV_LINE_LENGTH));
|
|
||||||
|
|
||||||
// print some preview
|
|
||||||
$numlines = 0; // 0 preview lines displayed
|
|
||||||
|
|
||||||
echo $OUTPUT->heading(get_string('importpreview', 'grades'));
|
|
||||||
echo '<table>';
|
|
||||||
echo '<tr>';
|
|
||||||
foreach ($header as $h) {
|
|
||||||
$h = clean_param($h, PARAM_RAW);
|
|
||||||
echo '<th>'.$h.'</th>';
|
|
||||||
}
|
|
||||||
echo '</tr>';
|
|
||||||
while (!feof ($fp) && $numlines <= $formdata->previewrows) {
|
|
||||||
$lines = explode($csv_delimiter, fgets($fp, GRADE_CSV_LINE_LENGTH));
|
|
||||||
echo '<tr>';
|
|
||||||
foreach ($lines as $line) {
|
|
||||||
echo '<td>'.$line.'</td>';
|
|
||||||
}
|
|
||||||
$numlines ++;
|
|
||||||
echo '</tr>';
|
|
||||||
}
|
|
||||||
echo '</table>';
|
|
||||||
|
|
||||||
// display the mapping form with header info processed
|
|
||||||
$mform2 = new grade_import_mapping_form(null, array('gradeitems'=>$gradeitems, 'header'=>$header));
|
|
||||||
$mform2->set_data(array('importcode'=>$importcode, 'id'=>$id, 'verbosescales'=>$verbosescales, 'separator'=>$separator));
|
|
||||||
$mform2->display();
|
|
||||||
|
|
||||||
//} else if (($formdata = data_submitted()) && !empty($formdata->map)) {
|
|
||||||
|
|
||||||
// else if grade import mapping form is submitted
|
|
||||||
} else if ($formdata = $mform2->get_data()) {
|
|
||||||
|
|
||||||
$importcode = clean_param($formdata->importcode, PARAM_FILE);
|
|
||||||
$filename = $CFG->tempdir.'/gradeimport/cvs/'.$USER->id.'/'.$importcode;
|
|
||||||
|
|
||||||
if (!file_exists($filename)) {
|
|
||||||
print_error('cannotuploadfile');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($fp = fopen($filename, "r")) {
|
|
||||||
// --- get header (field names) ---
|
// --- get header (field names) ---
|
||||||
$header = explode($csv_delimiter, clean_param(fgets($fp,GRADE_CSV_LINE_LENGTH), PARAM_RAW));
|
$header = $csvimport->get_columns();
|
||||||
|
|
||||||
|
// Print a preview of the data.
|
||||||
|
$numlines = 0; // 0 lines previewed so far.
|
||||||
|
|
||||||
|
echo $OUTPUT->heading(get_string('importpreview', 'grades'));
|
||||||
|
|
||||||
foreach ($header as $i => $h) {
|
foreach ($header as $i => $h) {
|
||||||
$h = trim($h); $header[$i] = $h; // remove whitespace
|
$h = trim($h); // Remove whitespace.
|
||||||
|
$h = clean_param($h, PARAM_RAW); // Clean the header.
|
||||||
|
$header[$i] = $h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$table = new html_table();
|
||||||
|
$table->head = $header;
|
||||||
|
$csvimport->init();
|
||||||
|
$previewdata = array();
|
||||||
|
while ($numlines <= $formdata->previewrows) {
|
||||||
|
$lines = $csvimport->next();
|
||||||
|
if ($lines) {
|
||||||
|
$previewdata[] = $lines;
|
||||||
|
}
|
||||||
|
$numlines ++;
|
||||||
|
}
|
||||||
|
$table->data = $previewdata;
|
||||||
|
echo html_writer::table($table);
|
||||||
} else {
|
} else {
|
||||||
print_error('cannotopenfile');
|
// Display the standard upload file form.
|
||||||
|
groups_print_course_menu($course, 'index.php?id='.$id);
|
||||||
|
echo html_writer::start_tag('div', array('class' => 'clearer'));
|
||||||
|
echo html_writer::end_tag('div');
|
||||||
|
|
||||||
|
$mform->display();
|
||||||
|
echo $OUTPUT->footer();
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Data has already been submitted so we can use the $iid to retrieve it.
|
||||||
|
$csvimport = new csv_import_reader($iid, 'grade');
|
||||||
|
$header = $csvimport->get_columns();
|
||||||
|
|
||||||
|
// we create a form to handle mapping data from the file to the database.
|
||||||
|
$mform2 = new grade_import_mapping_form(null, array('gradeitems'=>$gradeitems, 'header'=>$header));
|
||||||
|
$mform2->set_data(array('iid' => $iid, 'id' => $id, 'importcode'=>$importcode, 'verbosescales' => $verbosescales));
|
||||||
|
|
||||||
|
// Here, if we have data, we process the fields and enter the information into the database.
|
||||||
|
if ($formdata = $mform2->get_data()) {
|
||||||
|
|
||||||
|
foreach ($header as $i => $h) {
|
||||||
|
$h = trim($h); // Remove whitespace.
|
||||||
|
$h = clean_param($h, PARAM_RAW); // Clean the header.
|
||||||
|
$header[$i] = $h;
|
||||||
}
|
}
|
||||||
|
|
||||||
$map = array();
|
$map = array();
|
||||||
|
@ -204,8 +174,6 @@ if ($formdata = $mform->get_data()) {
|
||||||
$maperrors[$j] = true;
|
$maperrors[$j] = true;
|
||||||
} else {
|
} else {
|
||||||
// collision
|
// collision
|
||||||
fclose($fp);
|
|
||||||
unlink($filename); // needs to be uploaded again, sorry
|
|
||||||
print_error('cannotmapfield', '', '', $j);
|
print_error('cannotmapfield', '', '', $j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -217,186 +185,160 @@ if ($formdata = $mform->get_data()) {
|
||||||
@set_time_limit(0);
|
@set_time_limit(0);
|
||||||
raise_memory_limit(MEMORY_EXTRA);
|
raise_memory_limit(MEMORY_EXTRA);
|
||||||
|
|
||||||
// we only operate if file is readable
|
$csvimport->init();
|
||||||
if ($fp = fopen($filename, "r")) {
|
|
||||||
|
|
||||||
// read the first line makes sure this doesn't get read again
|
$newgradeitems = array(); // temporary array to keep track of what new headers are processed
|
||||||
$header = explode($csv_delimiter, fgets($fp, GRADE_CSV_LINE_LENGTH));
|
$status = true;
|
||||||
|
|
||||||
$newgradeitems = array(); // temporary array to keep track of what new headers are processed
|
while ($line = $csvimport->next()) {
|
||||||
$status = true;
|
if(count($line) <= 1){
|
||||||
|
// there is no data on this line, move on
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
while (!feof ($fp)) {
|
// array to hold all grades to be inserted
|
||||||
// add something
|
$newgrades = array();
|
||||||
$line = explode($csv_delimiter, fgets($fp, GRADE_CSV_LINE_LENGTH));
|
// array to hold all feedback
|
||||||
|
$newfeedbacks = array();
|
||||||
|
// each line is a student record
|
||||||
|
foreach ($line as $key => $value) {
|
||||||
|
|
||||||
if(count($line) <= 1){
|
$value = clean_param($value, PARAM_RAW);
|
||||||
// there is no data on this line, move on
|
$value = trim($value);
|
||||||
continue;
|
|
||||||
|
/*
|
||||||
|
* the options are
|
||||||
|
* 1) userid, useridnumber, usermail, username - used to identify user row
|
||||||
|
* 2) new - new grade item
|
||||||
|
* 3) id - id of the old grade item to map onto
|
||||||
|
* 3) feedback_id - feedback for grade item id
|
||||||
|
*/
|
||||||
|
|
||||||
|
$t = explode("_", $map[$key]);
|
||||||
|
$t0 = $t[0];
|
||||||
|
if (isset($t[1])) {
|
||||||
|
$t1 = (int)$t[1];
|
||||||
|
} else {
|
||||||
|
$t1 = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
// array to hold all grades to be inserted
|
switch ($t0) {
|
||||||
$newgrades = array();
|
case 'userid': //
|
||||||
// array to hold all feedback
|
if (!$user = $DB->get_record('user', array('id' => $value))) {
|
||||||
$newfeedbacks = array();
|
// user not found, abort whole import
|
||||||
// each line is a student record
|
import_cleanup($importcode);
|
||||||
foreach ($line as $key => $value) {
|
echo $OUTPUT->notification("user mapping error, could not find user with id \"$value\"");
|
||||||
//decode encoded commas
|
$status = false;
|
||||||
$value = clean_param($value, PARAM_RAW);
|
break 3;
|
||||||
$value = trim($value);
|
}
|
||||||
if (!empty($csv_encode)) {
|
$studentid = $value;
|
||||||
$value = preg_replace($csv_encode, $csv_delimiter, $value);
|
break;
|
||||||
}
|
case 'useridnumber':
|
||||||
|
if (!$user = $DB->get_record('user', array('idnumber' => $value))) {
|
||||||
|
// user not found, abort whole import
|
||||||
|
import_cleanup($importcode);
|
||||||
|
echo $OUTPUT->notification("user mapping error, could not find user with idnumber \"$value\"");
|
||||||
|
$status = false;
|
||||||
|
break 3;
|
||||||
|
}
|
||||||
|
$studentid = $user->id;
|
||||||
|
break;
|
||||||
|
case 'useremail':
|
||||||
|
if (!$user = $DB->get_record('user', array('email' => $value))) {
|
||||||
|
import_cleanup($importcode);
|
||||||
|
echo $OUTPUT->notification("user mapping error, could not find user with email address \"$value\"");
|
||||||
|
$status = false;
|
||||||
|
break 3;
|
||||||
|
}
|
||||||
|
$studentid = $user->id;
|
||||||
|
break;
|
||||||
|
case 'username':
|
||||||
|
if (!$user = $DB->get_record('user', array('username' => $value))) {
|
||||||
|
import_cleanup($importcode);
|
||||||
|
echo $OUTPUT->notification("user mapping error, could not find user with username \"$value\"");
|
||||||
|
$status = false;
|
||||||
|
break 3;
|
||||||
|
}
|
||||||
|
$studentid = $user->id;
|
||||||
|
break;
|
||||||
|
case 'new':
|
||||||
|
// first check if header is already in temp database
|
||||||
|
|
||||||
/*
|
if (empty($newgradeitems[$key])) {
|
||||||
* the options are
|
|
||||||
* 1) userid, useridnumber, usermail, username - used to identify user row
|
|
||||||
* 2) new - new grade item
|
|
||||||
* 3) id - id of the old grade item to map onto
|
|
||||||
* 3) feedback_id - feedback for grade item id
|
|
||||||
*/
|
|
||||||
|
|
||||||
$t = explode("_", $map[$key]);
|
$newgradeitem = new stdClass();
|
||||||
$t0 = $t[0];
|
$newgradeitem->itemname = $header[$key];
|
||||||
if (isset($t[1])) {
|
$newgradeitem->importcode = $importcode;
|
||||||
$t1 = (int)$t[1];
|
$newgradeitem->importer = $USER->id;
|
||||||
} else {
|
|
||||||
$t1 = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ($t0) {
|
// insert into new grade item buffer
|
||||||
case 'userid': //
|
$newgradeitems[$key] = $DB->insert_record('grade_import_newitem', $newgradeitem);
|
||||||
if (!$user = $DB->get_record('user', array('id' => $value))) {
|
}
|
||||||
// user not found, abort whole import
|
$newgrade = new stdClass();
|
||||||
import_cleanup($importcode);
|
$newgrade->newgradeitem = $newgradeitems[$key];
|
||||||
echo $OUTPUT->notification("user mapping error, could not find user with id \"$value\"");
|
|
||||||
|
// if the user has a grade for this grade item
|
||||||
|
if (trim($value) != '-') {
|
||||||
|
// instead of omitting the grade we could insert one with finalgrade set to 0
|
||||||
|
// we do not have access to grade item min grade
|
||||||
|
$newgrade->finalgrade = $value;
|
||||||
|
$newgrades[] = $newgrade;
|
||||||
|
}
|
||||||
|
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;
|
$status = false;
|
||||||
|
import_cleanup($importcode);
|
||||||
|
echo $OUTPUT->notification(get_string('importfailed', 'grades'));
|
||||||
break 3;
|
break 3;
|
||||||
}
|
}
|
||||||
$studentid = $value;
|
|
||||||
break;
|
// t1 is the id of the grade item
|
||||||
case 'useridnumber':
|
$feedback = new stdClass();
|
||||||
if (!$user = $DB->get_record('user', array('idnumber' => $value))) {
|
$feedback->itemid = $t1;
|
||||||
// user not found, abort whole import
|
$feedback->feedback = $value;
|
||||||
import_cleanup($importcode);
|
$newfeedbacks[] = $feedback;
|
||||||
echo $OUTPUT->notification("user mapping error, could not find user with idnumber \"$value\"");
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// existing grade items
|
||||||
|
if (!empty($map[$key])) {
|
||||||
|
// case of an id, only maps id of a grade_item
|
||||||
|
// this was idnumber
|
||||||
|
if (!$gradeitem = new grade_item(array('id'=>$map[$key], 'courseid'=>$course->id))) {
|
||||||
|
// supplied bad mapping, should not be possible since user
|
||||||
|
// had to pick mapping
|
||||||
$status = false;
|
$status = false;
|
||||||
|
import_cleanup($importcode);
|
||||||
|
echo $OUTPUT->notification(get_string('importfailed', 'grades'));
|
||||||
break 3;
|
break 3;
|
||||||
}
|
}
|
||||||
$studentid = $user->id;
|
|
||||||
break;
|
// check if grade item is locked if so, abort
|
||||||
case 'useremail':
|
if ($gradeitem->is_locked()) {
|
||||||
if (!$user = $DB->get_record('user', array('email' => $value))) {
|
|
||||||
import_cleanup($importcode);
|
|
||||||
echo $OUTPUT->notification("user mapping error, could not find user with email address \"$value\"");
|
|
||||||
$status = false;
|
$status = false;
|
||||||
|
import_cleanup($importcode);
|
||||||
|
echo $OUTPUT->notification(get_string('gradeitemlocked', 'grades'));
|
||||||
break 3;
|
break 3;
|
||||||
}
|
}
|
||||||
$studentid = $user->id;
|
|
||||||
break;
|
|
||||||
case 'username':
|
|
||||||
if (!$user = $DB->get_record('user', array('username' => $value))) {
|
|
||||||
import_cleanup($importcode);
|
|
||||||
echo $OUTPUT->notification("user mapping error, could not find user with username \"$value\"");
|
|
||||||
$status = false;
|
|
||||||
break 3;
|
|
||||||
}
|
|
||||||
$studentid = $user->id;
|
|
||||||
break;
|
|
||||||
case 'new':
|
|
||||||
// first check if header is already in temp database
|
|
||||||
|
|
||||||
if (empty($newgradeitems[$key])) {
|
|
||||||
|
|
||||||
$newgradeitem = new stdClass();
|
|
||||||
$newgradeitem->itemname = $header[$key];
|
|
||||||
$newgradeitem->importcode = $importcode;
|
|
||||||
$newgradeitem->importer = $USER->id;
|
|
||||||
|
|
||||||
// insert into new grade item buffer
|
|
||||||
$newgradeitems[$key] = $DB->insert_record('grade_import_newitem', $newgradeitem);
|
|
||||||
}
|
|
||||||
$newgrade = new stdClass();
|
$newgrade = new stdClass();
|
||||||
$newgrade->newgradeitem = $newgradeitems[$key];
|
$newgrade->itemid = $gradeitem->id;
|
||||||
|
if ($gradeitem->gradetype == GRADE_TYPE_SCALE and $verbosescales) {
|
||||||
// if the user has a grade for this grade item
|
if ($value === '' or $value == '-') {
|
||||||
if (trim($value) != '-') {
|
$value = null; // no grade
|
||||||
// instead of omitting the grade we could insert one with finalgrade set to 0
|
|
||||||
// we do not have access to grade item min grade
|
|
||||||
$newgrade->finalgrade = $value;
|
|
||||||
$newgrades[] = $newgrade;
|
|
||||||
}
|
|
||||||
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);
|
|
||||||
echo $OUTPUT->notification(get_string('importfailed', 'grades'));
|
|
||||||
break 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
// t1 is the id of the grade item
|
|
||||||
$feedback = new stdClass();
|
|
||||||
$feedback->itemid = $t1;
|
|
||||||
$feedback->feedback = $value;
|
|
||||||
$newfeedbacks[] = $feedback;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// existing grade items
|
|
||||||
if (!empty($map[$key])) {
|
|
||||||
// case of an id, only maps id of a grade_item
|
|
||||||
// this was idnumber
|
|
||||||
if (!$gradeitem = new grade_item(array('id'=>$map[$key], 'courseid'=>$course->id))) {
|
|
||||||
// supplied bad mapping, should not be possible since user
|
|
||||||
// had to pick mapping
|
|
||||||
$status = false;
|
|
||||||
import_cleanup($importcode);
|
|
||||||
echo $OUTPUT->notification(get_string('importfailed', 'grades'));
|
|
||||||
break 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if grade item is locked if so, abort
|
|
||||||
if ($gradeitem->is_locked()) {
|
|
||||||
$status = false;
|
|
||||||
import_cleanup($importcode);
|
|
||||||
echo $OUTPUT->notification(get_string('gradeitemlocked', 'grades'));
|
|
||||||
break 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
$newgrade = new stdClass();
|
|
||||||
$newgrade->itemid = $gradeitem->id;
|
|
||||||
if ($gradeitem->gradetype == GRADE_TYPE_SCALE and $verbosescales) {
|
|
||||||
if ($value === '' or $value == '-') {
|
|
||||||
$value = null; // no grade
|
|
||||||
} else {
|
|
||||||
$scale = $gradeitem->load_scale();
|
|
||||||
$scales = explode(',', $scale->scale);
|
|
||||||
$scales = array_map('trim', $scales); //hack - trim whitespace around scale options
|
|
||||||
array_unshift($scales, '-'); // scales start at key 1
|
|
||||||
$key = array_search($value, $scales);
|
|
||||||
if ($key === false) {
|
|
||||||
echo "<br/>t0 is $t0";
|
|
||||||
echo "<br/>grade is $value";
|
|
||||||
$status = false;
|
|
||||||
import_cleanup($importcode);
|
|
||||||
echo $OUTPUT->notification(get_string('badgrade', 'grades'));
|
|
||||||
break 3;
|
|
||||||
}
|
|
||||||
$value = $key;
|
|
||||||
}
|
|
||||||
$newgrade->finalgrade = $value;
|
|
||||||
} else {
|
} else {
|
||||||
if ($value === '' or $value == '-') {
|
$scale = $gradeitem->load_scale();
|
||||||
$value = null; // no grade
|
$scales = explode(',', $scale->scale);
|
||||||
|
$scales = array_map('trim', $scales); //hack - trim whitespace around scale options
|
||||||
} else if (!is_numeric($value)) {
|
array_unshift($scales, '-'); // scales start at key 1
|
||||||
// non numeric grade value supplied, possibly mapped wrong column
|
$key = array_search($value, $scales);
|
||||||
|
if ($key === false) {
|
||||||
echo "<br/>t0 is $t0";
|
echo "<br/>t0 is $t0";
|
||||||
echo "<br/>grade is $value";
|
echo "<br/>grade is $value";
|
||||||
$status = false;
|
$status = false;
|
||||||
|
@ -404,94 +346,98 @@ if ($formdata = $mform->get_data()) {
|
||||||
echo $OUTPUT->notification(get_string('badgrade', 'grades'));
|
echo $OUTPUT->notification(get_string('badgrade', 'grades'));
|
||||||
break 3;
|
break 3;
|
||||||
}
|
}
|
||||||
$newgrade->finalgrade = $value;
|
$value = $key;
|
||||||
}
|
}
|
||||||
$newgrades[] = $newgrade;
|
$newgrade->finalgrade = $value;
|
||||||
} // otherwise, we ignore this column altogether
|
} else {
|
||||||
// because user has chosen to ignore them (e.g. institution, address etc)
|
if ($value === '' or $value == '-') {
|
||||||
break;
|
$value = null; // no grade
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// no user mapping supplied at all, or user mapping failed
|
} else if (!is_numeric($value)) {
|
||||||
if (empty($studentid) || !is_numeric($studentid)) {
|
// non numeric grade value supplied, possibly mapped wrong column
|
||||||
// user not found, abort whole import
|
echo "<br/>t0 is $t0";
|
||||||
$status = false;
|
echo "<br/>grade is $value";
|
||||||
import_cleanup($importcode);
|
$status = false;
|
||||||
echo $OUTPUT->notification('user mapping error, could not find user!');
|
import_cleanup($importcode);
|
||||||
break;
|
echo $OUTPUT->notification(get_string('badgrade', 'grades'));
|
||||||
}
|
break 3;
|
||||||
|
}
|
||||||
if ($separatemode and !groups_is_member($currentgroup, $studentid)) {
|
$newgrade->finalgrade = $value;
|
||||||
// not allowed to import into this group, abort
|
|
||||||
$status = false;
|
|
||||||
import_cleanup($importcode);
|
|
||||||
echo $OUTPUT->notification('user not member of current group, can not update!');
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// insert results of this students into buffer
|
|
||||||
if ($status and !empty($newgrades)) {
|
|
||||||
|
|
||||||
foreach ($newgrades as $newgrade) {
|
|
||||||
|
|
||||||
// check if grade_grade is locked and if so, abort
|
|
||||||
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);
|
|
||||||
echo $OUTPUT->notification(get_string('gradelocked', 'grades'));
|
|
||||||
break 2;
|
|
||||||
}
|
}
|
||||||
}
|
$newgrades[] = $newgrade;
|
||||||
|
} // otherwise, we ignore this column altogether
|
||||||
$newgrade->importcode = $importcode;
|
// because user has chosen to ignore them (e.g. institution, address etc)
|
||||||
$newgrade->userid = $studentid;
|
break;
|
||||||
$newgrade->importer = $USER->id;
|
|
||||||
$DB->insert_record('grade_import_values', $newgrade);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// updating/inserting all comments here
|
|
||||||
if ($status and !empty($newfeedbacks)) {
|
|
||||||
foreach ($newfeedbacks as $newfeedback) {
|
|
||||||
$sql = "SELECT *
|
|
||||||
FROM {grade_import_values}
|
|
||||||
WHERE importcode=? AND userid=? AND itemid=? AND importer=?";
|
|
||||||
if ($feedback = $DB->get_record_sql($sql, array($importcode, $studentid, $newfeedback->itemid, $USER->id))) {
|
|
||||||
$newfeedback->id = $feedback->id;
|
|
||||||
$DB->update_record('grade_import_values', $newfeedback);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// the grade item for this is not updated
|
|
||||||
$newfeedback->importcode = $importcode;
|
|
||||||
$newfeedback->userid = $studentid;
|
|
||||||
$newfeedback->importer = $USER->id;
|
|
||||||
$DB->insert_record('grade_import_values', $newfeedback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// at this stage if things are all ok, we commit the changes from temp table
|
// no user mapping supplied at all, or user mapping failed
|
||||||
if ($status) {
|
if (empty($studentid) || !is_numeric($studentid)) {
|
||||||
grade_import_commit($course->id, $importcode);
|
// user not found, abort whole import
|
||||||
|
$status = false;
|
||||||
|
import_cleanup($importcode);
|
||||||
|
echo $OUTPUT->notification('user mapping error, could not find user!');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($separatemode and !groups_is_member($currentgroup, $studentid)) {
|
||||||
|
// not allowed to import into this group, abort
|
||||||
|
$status = false;
|
||||||
|
import_cleanup($importcode);
|
||||||
|
echo $OUTPUT->notification('user not member of current group, can not update!');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// insert results of this students into buffer
|
||||||
|
if ($status and !empty($newgrades)) {
|
||||||
|
|
||||||
|
foreach ($newgrades as $newgrade) {
|
||||||
|
|
||||||
|
// check if grade_grade is locked and if so, abort
|
||||||
|
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);
|
||||||
|
echo $OUTPUT->notification(get_string('gradelocked', 'grades'));
|
||||||
|
break 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$newgrade->importcode = $importcode;
|
||||||
|
$newgrade->userid = $studentid;
|
||||||
|
$newgrade->importer = $USER->id;
|
||||||
|
$DB->insert_record('grade_import_values', $newgrade);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// updating/inserting all comments here
|
||||||
|
if ($status and !empty($newfeedbacks)) {
|
||||||
|
foreach ($newfeedbacks as $newfeedback) {
|
||||||
|
$sql = "SELECT *
|
||||||
|
FROM {grade_import_values}
|
||||||
|
WHERE importcode=? AND userid=? AND itemid=? AND importer=?";
|
||||||
|
if ($feedback = $DB->get_record_sql($sql, array($importcode, $studentid, $newfeedback->itemid, $USER->id))) {
|
||||||
|
$newfeedback->id = $feedback->id;
|
||||||
|
$DB->update_record('grade_import_values', $newfeedback);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// the grade item for this is not updated
|
||||||
|
$newfeedback->importcode = $importcode;
|
||||||
|
$newfeedback->userid = $studentid;
|
||||||
|
$newfeedback->importer = $USER->id;
|
||||||
|
$DB->insert_record('grade_import_values', $newfeedback);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// temporary file can go now
|
|
||||||
fclose($fp);
|
|
||||||
unlink($filename);
|
|
||||||
} else {
|
|
||||||
print_error('cannotreadfile');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// at this stage if things are all ok, we commit the changes from temp table
|
||||||
|
if ($status) {
|
||||||
|
grade_import_commit($course->id, $importcode);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
groups_print_course_menu($course, 'index.php?id='.$id);
|
// If data hasn't been submitted then display the data mapping form.
|
||||||
echo '<div class="clearer"></div>';
|
$mform2->display();
|
||||||
|
echo $OUTPUT->footer();
|
||||||
// display the standard upload file form
|
|
||||||
$mform->display();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
echo $OUTPUT->footer();
|
|
||||||
|
|
||||||
|
|
|
@ -118,11 +118,11 @@ class grade_import_mapping_form extends moodleform {
|
||||||
$mform->setType('map', PARAM_INT);
|
$mform->setType('map', PARAM_INT);
|
||||||
$mform->addElement('hidden', 'id');
|
$mform->addElement('hidden', 'id');
|
||||||
$mform->setType('id', PARAM_INT);
|
$mform->setType('id', PARAM_INT);
|
||||||
|
$mform->addElement('hidden', 'iid');
|
||||||
|
$mform->setType('iid', PARAM_INT);
|
||||||
$mform->addElement('hidden', 'importcode');
|
$mform->addElement('hidden', 'importcode');
|
||||||
$mform->setType('importcode', PARAM_FILE);
|
$mform->setType('importcode', PARAM_FILE);
|
||||||
$mform->addElement('hidden', 'verbosescales', 1);
|
$mform->addElement('hidden', 'verbosescales', 1);
|
||||||
$mform->setType('separator', PARAM_ALPHA);
|
|
||||||
$mform->addElement('hidden', 'separator', 'comma');
|
|
||||||
$mform->setType('verbosescales', PARAM_INT);
|
$mform->setType('verbosescales', PARAM_INT);
|
||||||
$mform->addElement('hidden', 'groupid', groups_get_course_group($COURSE));
|
$mform->addElement('hidden', 'groupid', groups_get_course_group($COURSE));
|
||||||
$mform->setType('groupid', PARAM_INT);
|
$mform->setType('groupid', PARAM_INT);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue