diff --git a/grade/import/xmlurl/fetch.php b/grade/import/xml/fetch.php similarity index 100% rename from grade/import/xmlurl/fetch.php rename to grade/import/xml/fetch.php diff --git a/grade/import/xmlurl/grade_import_form.php b/grade/import/xml/grade_import_form.php similarity index 74% rename from grade/import/xmlurl/grade_import_form.php rename to grade/import/xml/grade_import_form.php index 9662bcbe44a2f..17eabb733d046 100644 --- a/grade/import/xmlurl/grade_import_form.php +++ b/grade/import/xml/grade_import_form.php @@ -7,15 +7,20 @@ function definition () { $mform =& $this->_form; - $strrequired = get_string('required'); + $this->set_upload_manager(new upload_manager('userfile', false, false, null, false, 0, true, true, false)); // course id needs to be passed for auth purposes $mform->addElement('hidden', 'id', optional_param('id')); $mform->setType('id', PARAM_INT); $mform->addElement('header', 'general', get_string('importfile', 'grades')); + $mform->disabledIf('url', 'userfile', 'noteq', ''); + // file upload - $mform->addElement('text', 'url', get_string('importfile', 'grades'), 'size="80"'); - $mform->addRule('url', $strrequired, 'required', null, 'client'); + $mform->addElement('file', 'userfile', get_string('file')); + $mform->setType('userfile', PARAM_FILE); + $mform->disabledIf('userfile', 'url', 'noteq', ''); + + $mform->addElement('text', 'url', get_string('fileurl', 'gradeimport_xml'), 'size="80"'); if (!empty($CFG->gradepublishing)) { $mform->addElement('header', 'publishing', get_string('publishing', 'grades')); @@ -38,8 +43,13 @@ function definition () { $mform->addElement('date_time_selector', 'validuntil', get_string('keyvaliduntil', 'userkey'), array('optional'=>true)); $mform->setHelpButton('validuntil', array(false, get_string('keyvaliduntil', 'userkey'), false, true, false, get_string("keyvaliduntilhelp", 'userkey'))); - $mform->disabledIf('iprestriction', 'key', get_string('createnewkey', 'userkey')); - $mform->disabledIf('validuntil', 'key', get_string('createnewkey', 'userkey')); + + $mform->disabledIf('iprestriction', 'key', 'noteq', 1); + $mform->disabledIf('validuntil', 'key', 'noteq', 1); + + $mform->disabledIf('iprestriction', 'url', 'eq', ''); + $mform->disabledIf('validuntil', 'url', 'eq', ''); + $mform->disabledIf('key', 'url', 'eq', ''); } $this->add_action_buttons(false, get_string('uploadgrades', 'grades')); @@ -48,7 +58,9 @@ function definition () { function validation($data) { $err = array(); - if ($data['url'] != clean_param($data['url'], PARAM_URL)) { + $strrequired = get_string('required'); + + if (array_key_exists('url', $data) and $data['url'] != clean_param($data['url'], PARAM_URL)) { $err['url'] = get_string('error'); } diff --git a/grade/import/xmlurl/index.php b/grade/import/xml/import.php old mode 100755 new mode 100644 similarity index 61% rename from grade/import/xmlurl/index.php rename to grade/import/xml/import.php index 7018c6179dd00..a52370842fef0 --- a/grade/import/xmlurl/index.php +++ b/grade/import/xml/import.php @@ -24,11 +24,11 @@ /////////////////////////////////////////////////////////////////////////// require_once '../../../config.php'; -require_once $CFG->dirroot.'/grade/lib.php'; -require_once 'grade_import_form.php'; -require_once '../lib.php'; +require_once 'lib.php'; +require_once $CFG->libdir.'/filelib.php'; -$id = required_param('id', PARAM_INT); // course id +$url = required_param('url', PARAM_URL); // only real urls here +$id = required_param('id', PARAM_INT); // course id if (!$course = get_record('course', 'id', $id)) { print_error('nocourseid'); @@ -36,43 +36,55 @@ require_login($course); $context = get_context_instance(CONTEXT_COURSE, $id); + require_capability('moodle/grade:import', $context); -require_capability('gradeimport/xml_getch:view', $context); +require_capability('gradeimport/xml:view', $context); + -// print header -$strgrades = get_string('grades', 'grades'); -$actionstr = get_string('modulename', 'gradeimport_xmlurl'); -$navigation = grade_build_nav(__FILE__, $actionstr, array('courseid' => $course->id)); +// 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 +// to free up memory. +@set_time_limit(0); +@raise_memory_limit("256M"); +if (function_exists('apache_child_terminate')) { + @apache_child_terminate(); +} -$mform = new grade_import_form(); +$text = download_file_content($url); +if ($text === false) { + error('Can not read file'); +} -if ($data = $mform->get_data()) { +$error = ''; +$importcode = import_xml_grades($text, $course, $error); - if (empty($data->key)) { - redirect('import.php?id='.$id.'&url='.urlencode($data->url)); +if ($importcode !== false) { + /// comit the code if we are up this far - } else { - if ($data->key == 1) { - $data->key = create_user_key('grade/import', $USER->id, $course->id, $data->iprestriction, $data->validuntil); + if (defined('USER_KEY_LOGIN')) { + if (grade_import_commit($id, $importcode, false)) { + echo 'ok'; + die; + } else { + error('Grade import error'); //TODO: localize } + } else { + $strgrades = get_string('grades', 'grades'); + $actionstr = get_string('xml', 'grades'); + $navigation = grade_build_nav(__FILE__, $actionstr, array('courseid' => $course->id)); + print_header($course->shortname.': '.get_string('grades'), $course->fullname, $navigation); - print_grade_plugin_selector($id, 'import', 'xmlurl'); + print_grade_plugin_selector($id, 'import', 'xml'); + + grade_import_commit($id, $importcode); - echo ''; print_footer(); die; } -} -print_header($course->shortname.': '.get_string('grades'), $course->fullname, $navigation); -print_grade_plugin_selector($id, 'import', 'xmlurl'); - -$mform->display(); - -print_footer(); +} else { + error($error); +} -?> +?> \ No newline at end of file diff --git a/grade/import/xml/index.php b/grade/import/xml/index.php index c2309ec705481..912eedfd8eb2c 100755 --- a/grade/import/xml/index.php +++ b/grade/import/xml/index.php @@ -1,15 +1,31 @@ libdir.'/gradelib.php'; -require_once $CFG->dirroot.'/grade/lib.php'; -require_once '../grade_import_form.php'; -require_once '../lib.php'; +require_once 'lib.php'; +require_once 'grade_import_form.php'; $id = required_param('id', PARAM_INT); // course id @@ -22,151 +38,65 @@ require_capability('moodle/grade:import', $context); require_capability('gradeimport/xml:view', $context); - // print header $strgrades = get_string('grades', 'grades'); -$actionstr = get_string('xml', 'grades'); +$actionstr = get_string('modulename', 'gradeimport_xml'); $navigation = grade_build_nav(__FILE__, $actionstr, array('courseid' => $course->id)); -print_header($course->shortname.': '.get_string('grades'), $course->fullname, $navigation); -print_grade_plugin_selector($id, 'import', 'xml'); $mform = new grade_import_form(); -if ( $formdata = $mform->get_data()) { - - // array to hold all grades to be inserted - $newgrades = array(); - - $filename = $mform->get_userfile_name(); +if ($data = $mform->get_data()) { // 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 // to free up memory. @set_time_limit(0); - @raise_memory_limit("192M"); + @raise_memory_limit("256M"); if (function_exists('apache_child_terminate')) { @apache_child_terminate(); } - $text = my_file_get_contents($filename); - - // trim utf-8 bom - $textlib = textlib_get_instance(); - // converts to propert unicode - $text = $textlib->convert($text, $formdata->encoding); - $text = $textlib->trim_utf8_bom($text); - // Fix mac/dos newlines - $text = preg_replace('!\r\n?!',"\n",$text); - - // text is the text, we should xmlize it - include_once($CFG->dirroot.'/lib/xmlize.php'); - $content = xmlize($text); - - if ($results = $content['results']['#']['result']) { - - // import batch identifier timestamp - $importcode = time(); - $status = true; - - $numlines = 0; - - // print some previews - print_heading(get_string('importpreview', 'grades')); - - echo ''; - foreach ($results as $i => $result) { - if ($numlines < $formdata->previewrows && isset($results[$i+1])) { - echo ''; - foreach ($result['#'] as $fieldname => $val) { - echo ''; - } - echo ''; - $numlines ++; - } else if ($numlines == $formdata->previewrows || !isset($results[$i+1])) { - echo '
'.$fieldname.' > '.$val[0]['#'].'
'; - $numlines ++; - } - - if (!$gradeitem = new grade_item(array('idnumber'=>$result['#']['assignment'][0]['#'], 'courseid'=>$course->id))) { - // gradeitem does not exist - // no data in temp table so far, abort - $status = false; - break; - } - - // grade item locked, abort - if ($gradeitem->locked) { - $status = false; - notify(get_string('gradeitemlocked', 'grades')); - break 3; - } - - // check if grade_grade is locked and if so, abort - if ($grade_grade = new grade_grade(array('itemid'=>$gradeitem->id, 'userid'=>$result['#']['student'][0]['#']))) { - if ($grade_grade->locked) { - // individual grade locked, abort - $status = false; - notify(get_string('gradegradeslocked', 'grades')); - break 2; - } - } - unset($newgrade); - - if (isset($result['#']['score'][0]['#'])) { - $newgrade -> itemid = $gradeitem->id; - $newgrade -> rawgrade = $result['#']['score'][0]['#']; - $newgrade-> userid = $result['#']['student'][0]['#']; - $newgrades[] = $newgrade; - } - } - - // loop through info collected so far - if ($status && !empty($newgrades)) { - foreach ($newgrades as $newgrade) { - - // check if user exist - if (!$user = get_record('user', 'id', addslashes($newgrade->userid))) { - // no user found, abort - $status = false; - import_cleanup($importcode); - notify(get_string('baduserid', 'grades')); - notify(get_string('importfailed', 'grades')); - break; - } - - // check grade value is a numeric grade - if (!is_numeric($newgrade->rawgrade)) { - $status = false; - import_cleanup($importcode); - notify(get_string('badgrade', 'grades')); - break; - } - - // insert this grade into a temp table - $newgrade->import_code = $importcode; - if (!insert_record('grade_import_values', addslashes_recursive($newgrade))) { - $status = false; - // could not insert into temp table - import_cleanup($importcode); - notify(get_string('importfailed', 'grades')); - break; - } - } - } + if ($text = $mform->get_file_content('userfile')) { + print_header($course->shortname.': '.get_string('grades'), $course->fullname, $navigation); + print_grade_plugin_selector($id, 'import', 'xml'); - // if all ok, we proceed - if ($status) { - /// comit the code if we are up this far + $error = ''; + $importcode = import_xml_grades($text, $course, $error); + if ($importcode) { grade_import_commit($id, $importcode); + print_footer(); + die; + } else { + notify($error); + print_continue($CFG->wwwroot.'/grade/index.php?id='.$course->id); + print_footer(); + die; } + + } else if (empty($data->key)) { + redirect('import.php?id='.$id.'&url='.urlencode($data->url)); + } else { - // no results section found in xml, - // assuming bad format, abort import - notify('badxmlformat', 'grade'); + if ($data->key == 1) { + $data->key = create_user_key('grade/import', $USER->id, $course->id, $data->iprestriction, $data->validuntil); + } + + print_header($course->shortname.': '.get_string('grades'), $course->fullname, $navigation); + print_grade_plugin_selector($id, 'import', 'xml'); + + echo ''; + print_footer(); + die; } -} else { - // display the standard upload file form - $mform->display(); } +print_header($course->shortname.': '.get_string('grades'), $course->fullname, $navigation); +print_grade_plugin_selector($id, 'import', 'xml'); + +$mform->display(); + print_footer(); + ?> diff --git a/grade/import/xml/lib.php b/grade/import/xml/lib.php new file mode 100644 index 0000000000000..419709f939ab4 --- /dev/null +++ b/grade/import/xml/lib.php @@ -0,0 +1,103 @@ +libdir.'/gradelib.php'; +require_once($CFG->libdir.'/xmlize.php'); +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! + $newgrades = array(); + + $status = true; + + $content = xmlize($text); + + if ($results = $content['results']['#']['result']) { + + foreach ($results as $i => $result) { + if (!$grade_items = grade_item::fetch_all(array('idnumber'=>$result['#']['assignment'][0]['#'], 'courseid'=>$course->id))) { + // gradeitem does not exist + // no data in temp table so far, abort + $status = false; + $error = get_string('errincorrectidnumber', 'gradeimport_xml'); + break; + } else if (count($grade_items) != 1) { + $status = false; + $error = get_string('errduplicateidnumber', 'gradeimport_xml'); + break; + } else { + $grade_item = reset($grade_items); + } + + // grade item locked, abort + if ($grade_item->locked) { + $status = false; + $error = get_string('gradeitemlocked', 'grades'); + break; + } + + // check if grade_grade is locked and if so, abort + if ($grade_grade = new grade_grade(array('itemid'=>$grade_item->id, 'userid'=>$result['#']['student'][0]['#']))) { + if ($grade_grade->locked) { + // individual grade locked, abort + $status = false; + $error = get_string('gradegradeslocked', 'grades'); + break; + } + } + + if (isset($result['#']['score'][0]['#'])) { + $newgrade = new object(); + $newgrade->itemid = $grade_item->id; + $newgrade->grade = $result['#']['score'][0]['#']; + $newgrade->userid = $result['#']['student'][0]['#']; + $newgrades[] = $newgrade; + } + } + + // loop through info collected so far + if ($status && !empty($newgrades)) { + foreach ($newgrades as $newgrade) { + + // check if user exist + if (!$user = get_record('user', 'id', addslashes($newgrade->userid))) { + // no user found, abort + $status = false; + $error = get_string('baduserid', 'grades'); + break; + } + + // check grade value is a numeric grade + if (!is_numeric($newgrade->grade)) { + $status = false; + $error = get_string('badgrade', 'grades'); + break; + } + + // insert this grade into a temp table + $newgrade->import_code = $importcode; + if (!insert_record('grade_import_values', addslashes_recursive($newgrade))) { + $status = false; + // could not insert into temp table + $error = get_string('importfailed', 'grades'); + break; + } + } + } + } else { + // no results section found in xml, + // assuming bad format, abort import + $status = false; + $error = get_string('errbadxmlformat', 'gradeimport_xml'); + } + + if ($status) { + return $importcode; + + } else { + import_cleanup($importcode); + return false; + } +} +?> \ No newline at end of file diff --git a/grade/import/xml/version.php b/grade/import/xml/version.php index 55d7451372e08..d616882fb9bdb 100644 --- a/grade/import/xml/version.php +++ b/grade/import/xml/version.php @@ -1,6 +1,6 @@ version = 2007072500; -$plugin->requires = 2007072402; +$plugin->version = 2007092600; +$plugin->requires = 2007092002; ?> diff --git a/grade/import/xmlurl/db/access.php b/grade/import/xmlurl/db/access.php deleted file mode 100644 index 2cd83369095f6..0000000000000 --- a/grade/import/xmlurl/db/access.php +++ /dev/null @@ -1,16 +0,0 @@ - array( - 'captype' => 'write', - 'contextlevel' => CONTEXT_COURSE, - 'legacy' => array( - 'admin' => CAP_ALLOW - ) - ) -); - -?> - - diff --git a/grade/import/xmlurl/import.php b/grade/import/xmlurl/import.php deleted file mode 100644 index eb74353a45d6c..0000000000000 --- a/grade/import/xmlurl/import.php +++ /dev/null @@ -1,178 +0,0 @@ -libdir.'/filelib.php'; -require_once($CFG->libdir.'/xmlize.php'); -require_once($CFG->libdir.'/gradelib.php'); -require_once $CFG->dirroot.'/grade/lib.php'; -require_once $CFG->dirroot.'/grade/import/lib.php'; - -$url = required_param('url', PARAM_URL); // only real urls here -$id = required_param('id', PARAM_INT); // course id - -if (!$course = get_record('course', 'id', $id)) { - print_error('nocourseid'); -} - -require_login($course); -$context = get_context_instance(CONTEXT_COURSE, $id); - -require_capability('moodle/grade:import', $context); -require_capability('gradeimport/xmlurl:view', $context); - - -// 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 -// to free up memory. -@set_time_limit(0); -@raise_memory_limit("192M"); -if (function_exists('apache_child_terminate')) { - @apache_child_terminate(); -} - -$text = download_file_content($url); -if ($text === false) { - error('Can not read file'); -} - -$status = true; -$error = ''; - -$importcode = time(); -$newgrades = array(); - -$content = xmlize($text); - -if ($results = $content['results']['#']['result']) { - - foreach ($results as $i => $result) { - if (!$grade_items = grade_item::fetch_all(array('idnumber'=>$result['#']['assignment'][0]['#'], 'courseid'=>$course->id))) { - // gradeitem does not exist - // no data in temp table so far, abort - $status = false; - $error = 'incorrect grade item idnumber'; //TODO: localize - break; - } else if (count($grade_items) != 1) { - $status = false; - $error = 'duplicate grade item idnumber'; //TODO: localize - break; - } else { - $grade_item = reset($grade_items); - } - - // grade item locked, abort - if ($grade_item->locked) { - $status = false; - $error = get_string('gradeitemlocked', 'grades'); - break; - } - - // check if grade_grade is locked and if so, abort - if ($grade_grade = new grade_grade(array('itemid'=>$grade_item->id, 'userid'=>$result['#']['student'][0]['#']))) { - if ($grade_grade->locked) { - // individual grade locked, abort - $status = false; - $error = get_string('gradegradeslocked', 'grades'); - break; - } - } - - if (isset($result['#']['score'][0]['#'])) { - $newgrade = new object(); - $newgrade->itemid = $grade_item->id; - $newgrade->grade = $result['#']['score'][0]['#']; - $newgrade->userid = $result['#']['student'][0]['#']; - $newgrades[] = $newgrade; - } - } - - // loop through info collected so far - if ($status && !empty($newgrades)) { - foreach ($newgrades as $newgrade) { - - // check if user exist - if (!$user = get_record('user', 'id', addslashes($newgrade->userid))) { - // no user found, abort - $status = false; - $error = get_string('baduserid', 'grades'); - break; - } - - // check grade value is a numeric grade - if (!is_numeric($newgrade->grade)) { - $status = false; - $error = get_string('badgrade', 'grades'); - break; - } - - // insert this grade into a temp table - $newgrade->import_code = $importcode; - if (!insert_record('grade_import_values', addslashes_recursive($newgrade))) { - $status = false; - // could not insert into temp table - $error = get_string('importfailed', 'grades'); - break; - } - } - } -} else { - // no results section found in xml, - // assuming bad format, abort import - $status = false; - $error = get_string('badxmlformat', 'grade'); -} - -if ($status) { - /// comit the code if we are up this far - - if (defined('USER_KEY_LOGIN')) { - if (grade_import_commit($id, $importcode, false)) { - echo 'ok'; - die; - } else { - error('Grade import error'); //TODO: localize - } - - } else { - $strgrades = get_string('grades', 'grades'); - $actionstr = get_string('xmlurl', 'grades'); - $navigation = grade_build_nav(__FILE__, $actionstr, array('courseid' => $course->id)); - - print_header($course->shortname.': '.get_string('grades'), $course->fullname, $navigation); - print_grade_plugin_selector($id, 'import', 'xmlurl'); - - grade_import_commit($id, $importcode); - - print_footer(); - die; - } - -} else { - import_cleanup($importcode); - error($error); -} - -?> \ No newline at end of file diff --git a/grade/import/xmlurl/version.php b/grade/import/xmlurl/version.php deleted file mode 100644 index 9da38254da06d..0000000000000 --- a/grade/import/xmlurl/version.php +++ /dev/null @@ -1,6 +0,0 @@ -version = 2007092501; -$plugin->requires = 2007092002; - -?> diff --git a/lang/en_utf8/gradeimport_xml.php b/lang/en_utf8/gradeimport_xml.php index e1de4cf608b96..6b76b910eb9c0 100644 --- a/lang/en_utf8/gradeimport_xml.php +++ b/lang/en_utf8/gradeimport_xml.php @@ -1,5 +1,9 @@