diff --git a/admin/settings/grades.php b/admin/settings/grades.php index 36e7398905b..88863ee0326 100644 --- a/admin/settings/grades.php +++ b/admin/settings/grades.php @@ -9,7 +9,7 @@ $temp->add(new admin_setting_special_gradeexport()); // enable outcomes checkbox $temp->add(new admin_setting_configcheckbox('enableoutcomes', get_string('enableoutcomes', 'grades'), get_string('configenableoutcomes', 'grades'), 0, PARAM_INT)); // enable publishing in exports/imports -$temp->add(new admin_setting_configcheckbox('enablepublishing', get_string('enablepublishing', 'userkey'), get_string('configenablepublishing', 'userkey'), 0, PARAM_INT)); +$temp->add(new admin_setting_configcheckbox('gradepublishing', get_string('gradepublishing', 'grades'), get_string('configgradepublishing', 'grades'), 0, PARAM_INT)); $ADMIN->add('grades', $temp); /// Scales and outcomes diff --git a/grade/export/grade_export_form.php b/grade/export/grade_export_form.php index 9c3f935009d..9406a396c3a 100755 --- a/grade/export/grade_export_form.php +++ b/grade/export/grade_export_form.php @@ -19,6 +19,9 @@ class grade_export_form extends moodleform { $mform->setHelpButton('export_letters', array(false, get_string('exportletters', 'grades'), false, true, false, get_string("exportlettershelp", 'grades'))); + $mform->addElement('advcheckbox', 'export_feedback', get_string('exportfeedback', 'grades')); + $mform->setDefault('export_feedback', 0); + $options = array('10'=>10, '20'=>20, '100'=>100, '1000'=>1000, '100000'=>100000); $mform->addElement('select', 'previewrows', 'Preview rows', $options); // TODO: localize @@ -30,7 +33,7 @@ class grade_export_form extends moodleform { $mform->setDefault('separator', 'comma'); } - if (!empty($features['publishing'])) { + if (!empty($CFG->gradepublishing) and !empty($features['publishing'])) { $mform->addElement('header', 'publishing', get_string('publishing', 'grades')); $options = array(get_string('nopublish', 'grades'), get_string('createnewkey', 'userkey')); if ($keys = get_records_select('user_private_key', "script='grade/export' AND instance={$COURSE->id} AND userid={$USER->id}")) { @@ -43,11 +46,11 @@ class grade_export_form extends moodleform { false, true, false, get_string("userkeyhelp", 'grades'))); $mform->addElement('static', 'keymanagerlink', get_string('keymanager', 'userkey'), ''.get_string('keymanager', 'userkey').''); - + $mform->addElement('text', 'iprestriction', get_string('keyiprestriction', 'userkey'), array('size'=>80)); $mform->setHelpButton('iprestriction', array(false, get_string('keyiprestriction', 'userkey'), false, true, false, get_string("keyiprestrictionhelp", 'userkey'))); - + $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'))); @@ -55,14 +58,14 @@ class grade_export_form extends moodleform { $mform->disabledIf('validuntil', 'key', get_string('createnewkey', 'userkey')); } - $mform->addElement('header', 'gradeitems', get_string('gradeitemsinc', 'grades')); // TODO: localize + $mform->addElement('header', 'gradeitems', get_string('gradeitemsinc', 'grades')); if ($grade_items = grade_item::fetch_all(array('courseid'=>$COURSE->id))) { foreach ($grade_items as $grade_item) { if (!empty($features['idnumberrequired']) and empty($grade_item->idnumber)) { $mform->addElement('advcheckbox', 'itemids['.$grade_item->id.']', $grade_item->get_name(), get_string('noidnumber')); $mform->hardFreeze('itemids['.$grade_item->id.']'); - + } else { $mform->addElement('advcheckbox', 'itemids['.$grade_item->id.']', $grade_item->get_name()); $mform->setDefault('itemids['.$grade_item->id.']', 1); diff --git a/grade/export/lib.php b/grade/export/lib.php index 90725f532b8..18b61c747ad 100755 --- a/grade/export/lib.php +++ b/grade/export/lib.php @@ -32,187 +32,194 @@ require_once($CFG->dirroot.'/grade/export/grade_export_form.php'); */ class grade_export { - var $id; // course id - var $grade_items; // array of grade_items - var $groupid; - var $grades = array(); // Collect all grades in this array - var $comments = array(); // Collect all comments for each grade - var $columns = array(); // Accumulate column names in this array. - var $columnidnumbers = array(); // Collect all gradeitem id numbers - var $students = array(); - var $course; // course - var $userkey; // Optional MD5 string used to publish this export data via a URL - var $export_letters; - var $itemidsurl; // A string of itemids to add to the URL for the export + var $plugin; // plgin name - must be filled in subclasses! - // common strings - var $strgrades; - var $strgrade; + var $grade_items; // list of all course grade items + var $groupid; // groupid, 0 means all groups + var $course; // course object + var $columns; // array of grade_items selected for export + + var $previewrows; // number of rows in preview + var $export_letters; // export letters - TODO: finish implementation + var $export_feedback; // export feedback + var $userkey; // export using private user key + + var $letters; // internal + var $report; // internal /** * Constructor should set up all the private variables ready to be pulled - * @param int $courseid course id - * @param array $itemids array of grade item ids, empty means all - * @param stdClass $formdata Optional object of formdata. + * @param object $course + * @param int $groupid id of selected group, 0 means all + * @param string $itemlist comma separated list of item ids, empty means all + * @param boolean $export_feedback + * @param boolean $export_letters * @note Exporting as letters will lead to data loss if that exported set it re-imported. */ - function grade_export($courseid, $itemids=null, $formdata=null) { - global $CFG, $USER, $COURSE; + function grade_export($course, $groupid=0, $itemlist='', $export_feedback=false, $export_letters=false) { + $this->course = $course; + $this->groupid = $groupid; + $this->grade_items = grade_item::fetch_all(array('courseid'=>$this->course->id)); - $this->export_letters = false; - if (isset($formdata->export_letters)) { - $this->export_letters = $formdata->export_letters; + $this->columns = array(); + if (!empty($itemlist)) { + $itemids = explode(',', $itemlist); + // remove items that are not requested + foreach ($itemids as $itemid) { + if (array_key_exists($itemid, $this->grade_items)) { + $this->columns[$itemid] =& $this->grade_items[$itemid]; + } + } + } else { + foreach ($this->grade_items as $itemid=>$unused) { + $this->columns[$itemid] =& $this->grade_items[$itemid]; + } + } + + $this->export_letters = $export_letters; + $this->export_feedback = $export_feedback; + $this->userkey = ''; + $this->previewrows = false; + } + + /** + * Init object based using data from form + * @param object $formdata + */ + function process_form($formdata) { + global $USER; + + $this->columns = array(); + if (!empty($formdata->itemids)) { + foreach ($formdata->itemids as $itemid=>$selected) { + if ($selected and array_key_exists($itemid, $this->grade_items)) { + $this->columns[$itemid] =& $this->grade_items[$itemid]; + } + } + } else { + foreach ($this->grade_items as $itemid=>$unused) { + $this->columns[$itemid] =& $this->grade_items[$itemid]; + } } - $this->userkey = false; if (isset($formdata->key)) { - if ($formdata->key == 1 && isset($formdata->iprestriction) && isset($formdata->validuntil)) { // Create a new key - $formdata->key = create_user_key('grade/export', $USER->id, $COURSE->id, $formdata->iprestriction, $formdata->validuntil); + if ($formdata->key == 1 && isset($formdata->iprestriction) && isset($formdata->validuntil)) { + // Create a new key + $formdata->key = create_user_key('grade/export', $USER->id, $this->course->id, $formdata->iprestriction, $formdata->validuntil); } $this->userkey = $formdata->key; } - $this->strgrades = get_string("grades"); - $this->strgrade = get_string("grade"); - - if (!$course = get_record("course", "id", $courseid)) { - error("Course ID was incorrect"); - } - $context = get_context_instance(CONTEXT_COURSE, $course->id); - require_capability('moodle/grade:export', $context); - - $this->id = $course->id; - $this->course = $course; - - // fetch all grade items - if (empty($itemids)) { - $this->grade_items = grade_item::fetch_all(array('courseid'=>$this->id)); - } else { - $this->grade_items = array(); - foreach ($itemids as $iid) { - if ($grade_item = grade_item::fetch(array('id'=>(int)$iid, 'courseid'=>$this->id))) { - $this->grade_items[$grade_item->id] = $grade_item; - } - } + if (isset($formdata->export_letters)) { + $this->export_letters = $formdata->export_letters; } - // init colums - foreach ($this->grade_items as $grade_item) { - if ($grade_item->itemtype == 'mod') { - $this->columns[$grade_item->id] = get_string('modulename', $grade_item->itemmodule).': '.$grade_item->get_name(); + if (isset($formdata->export_feedback)) { + $this->export_feedback = $formdata->export_feedback; + } + + if (isset($formdata->previewrows)) { + $this->previewrows = $formdata->previewrows; + } + + } + + /** + * Update exported field in grade_grades table + * @return boolean + */ + function track_exports() { + global $CFG; + + /// Whether this plugin is entitled to update export time + if ($expplugins = explode(",", $CFG->gradeexport)) { + if (in_array($this->plugin, $expplugins)) { + return true; } else { - $this->columns[$grade_item->id] = $grade_item->get_name(); - } - $this->columnidnumbers[$grade_item->id] = $grade_item->idnumber; // this might be needed for some export plugins - } - - /// Check to see if groups are being used in this course - if ($groupmode = groupmode($course)) { // Groups are being used - - if (isset($_GET['group'])) { - $changegroup = $_GET['group']; /// 0 or higher - } else { - $changegroup = -1; /// This means no group change was specified - } - - $currentgroup = get_and_set_current_group($course, $groupmode, $changegroup); - + return false; + } } else { - $currentgroup = false; - } - - $this->groupid = $currentgroup; - - if ($currentgroup) { - $this->students = get_group_students($currentgroup, "u.lastname ASC"); - } else { - $this->students = get_role_users(@implode(',', $CFG->gradebookroles), $context); - } - - if (!empty($this->students)) { - foreach ($this->students as $student) { - $this->grades[$student->id] = array(); // Collect all grades in this array - $this->comments[$student->id] = array(); // Collect all comments in tihs array - } - } - - if (isset($formdata->itemids)) { - // Build itemidsurl for links - $itemids = array(); - if ($formdata->itemids) { - foreach ($formdata->itemids as $itemid=>$selected) { - if ($selected) { - $itemids[] = $itemid; - } - } - $this->itemidsurl = implode(",", $itemids); - } else { - //error? - $this->itemidsurl = ''; - } + return false; } } - function load_grades() { + /** + * internal + */ + function _init_letters() { global $CFG; - // first make sure we have all final grades - // TODO: check that no grade_item has needsupdate set - grade_regrade_final_grades($this->id); - - if ($this->export_letters) { - require_once($CFG->dirroot . '/grade/report/lib.php'); - $report = new grade_report($this->id, null, null); - $letters = $report->get_grade_letters(); - } else { - $letters = null; - } - - if ($this->grade_items) { - foreach ($this->grade_items as $gradeitem) { - // load as an array of grade_final objects - if ($itemgrades = $gradeitem->get_final() and !empty($this->students)) { - foreach ($this->students as $student) { - $finalgrade = null; - $feedback = ''; - if (array_key_exists($student->id, $itemgrades)) { - $finalgrade = $itemgrades[$student->id]->finalgrade; - $grade = new grade_grade($itemgrades[$student->id], false); - if ($grade_text = $grade->load_text()) { - $feedback = format_text($grade_text->feedback, $grade_text->feedbackformat); - } - } - - if ($this->export_letters) { - $grade_item_displaytype = $report->get_pref('gradedisplaytype', $gradeitem->id); - // TODO Convert final grade to letter if export option is on, and grade_item is set to letter type MDL-10490 - if ($grade_item_displaytype == GRADE_REPORT_GRADE_DISPLAY_TYPE_LETTER) { - $finalgrade = grade_grade::get_letter($letters, $finalgrade, $gradeitem->grademin, $gradeitem->grademax); - } - } - - $this->grades[$student->id][$gradeitem->id] = $finalgrade; - $this->comments[$student->id][$gradeitem->id] = $feedback; - } - } + if (!isset($this->letters)) { + if ($this->export_letters) { + require_once($CFG->dirroot . '/grade/report/lib.php'); + $this->report = new grade_report($this->course->id, null, null); + $this->letters = $this->report->get_grade_letters(); + } else { + $this->letters = false; // false prevents another fetching of grade letters } } } /** - * To be implemented by child class - * TODO finish PHPdocs + * Returns string representation of final grade + * @param $object $grade instance of grade_grade class + * @return string + */ + function format_grade($grade) { + $this->_init_letters(); + + //TODO: rewrite the letters handling code - this is slow + if ($this->letters) { + $grade_item = $this->grade_items[$grade->itemid]; + $grade_item_displaytype = $this->report->get_pref('gradedisplaytype', $grade_item->id); + + if ($grade_item_displaytype == GRADE_REPORT_GRADE_DISPLAY_TYPE_LETTER) { + return grade_grade::get_letter($this->letters, $grade->finalgrade, $grade_item->grademin, $grade_item->grademax); + } + } + + //TODO: format it somehow - scale/letter/number/etc. + return $grade->finalgrade; + } + + /** + * Returns the name of column in export + * @param object $grade_item + * @param boolena $feedback feedback colum + * &return string + */ + function format_column_name($grade_item, $feedback=false) { + if ($grade_item->itemtype == 'mod') { + $name = get_string('modulename', $grade_item->itemmodule).': '.$grade_item->get_name(); + } else { + $name = $grade_item->get_name(); + } + + if ($feedback) { + $name .= ' ('.get_string('feedback').')'; + } + + return strip_tags($name); + } + + /** + * Returns formatted grade feedback + * @param object $feedback object with properties feedback and feedbackformat + * @return string + */ + function format_feedback($feedback) { + return strip_tags(format_text($feedback->feedback, $feedback->feedbackformat)); + } + + /** + * Implemented by child class */ function print_grades() { } /** - * Displays all the grades on screen as a feedback mechanism - * TODO finish PHPdoc + * Prints preview of exported grades on screen as a feedback mechanism */ - function display_grades($feedback=false, $rows=10) { - - $this->load_grades(); - + function display_preview() { echo '
'.get_string("firstname")." | ". @@ -221,58 +228,83 @@ class grade_export { ''.get_string("institution")." | ". ''.get_string("department")." | ". ''.get_string("email")." | "; - foreach ($this->columns as $column) { - $column = strip_tags($column); - echo "$column | "; + foreach ($this->columns as $grade_item) { + echo ''.$this->format_column_name($grade_item).' | '; /// add a column_feedback column - if ($feedback) { - echo "{$column}_feedback | "; + if ($this->export_feedback) { + echo ''.$this->format_column_name($grade_item, true).' | '; } } echo '||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$user->firstname | $user->lastname | $user->idnumber | $user->institution | $user->department | $user->email | "; + foreach ($this->columns as $itemid=>$unused) { + $gradetxt = $this->format_grade($userdata->grades[$itemid]); + echo "$gradetxt | "; - echo "$student->firstname | $student->lastname | $student->idnumber | $student->institution | $student->department | $student->email | "; - foreach ($studentgrades as $itemid=>$grade) { - $grade = strip_tags($grade); - echo "$grade | "; - - if ($feedback) { - echo ''.$this->comments[$studentid][$itemid].' | '; + if ($this->export_feedback) { + echo ''.$this->format_feedback($userdata->feedbacks[$itemid]).' | '; } } echo "
';
echo ''.$link.'';
diff --git a/grade/export/ods/dump.php b/grade/export/ods/dump.php
index c22d6ef4025..fb7c17ece84 100644
--- a/grade/export/ods/dump.php
+++ b/grade/export/ods/dump.php
@@ -7,6 +7,10 @@ $id = required_param('id', PARAM_INT); // course id
require_user_key_login('grade/export', $id); // we want different keys for each course
+if (empty($CFG->gradepublishing)) {
+ error('Grade publishing disabled');
+}
+
// use the same page parameters as export.php and append &key=sdhakjsahdksahdkjsahksadjksahdkjsadhksa
require 'export.php';
diff --git a/grade/export/ods/export.php b/grade/export/ods/export.php
index 802fab8dc0e..bad4edae2e0 100755
--- a/grade/export/ods/export.php
+++ b/grade/export/ods/export.php
@@ -27,10 +27,11 @@ require_once '../../../config.php';
require_once $CFG->dirroot.'/grade/export/lib.php';
require_once 'grade_export_ods.php';
-$id = required_param('id', PARAM_INT); // course id
-$feedback = optional_param('feedback', '', PARAM_ALPHA);
-$export_letters = optional_param('export_letters', '', PARAM_INT);
-$itemids = explode(",", required_param('itemids', PARAM_RAW));
+$id = required_param('id', PARAM_INT); // course id
+$groupid = optional_param('groupid', 0, PARAM_INT);
+$itemids = required_param('itemids', PARAM_RAW);
+$export_feedback = optional_param('export_feedback', 0, PARAM_BOOL);
+$export_letters = optional_param('export_letters', 0, PARAM_BOOL);
if (!$course = get_record('course', 'id', $id)) {
print_error('nocourseid');
@@ -44,7 +45,7 @@ require_capability('gradeexport/ods:view', $context);
// print all the exported data here
-$export = new grade_export_ods($id, $itemids, $export_letters);
-$export->print_grades($feedback);
+$export = new grade_export_ods($course, $groupid, $itemids, $export_feedback, $export_letters);
+$export->print_grades();
?>
diff --git a/grade/export/ods/grade_export_ods.php b/grade/export/ods/grade_export_ods.php
index 7355bd84a19..1c3a2261a7b 100755
--- a/grade/export/ods/grade_export_ods.php
+++ b/grade/export/ods/grade_export_ods.php
@@ -26,35 +26,27 @@ require_once($CFG->dirroot.'/grade/export/lib.php');
class grade_export_ods extends grade_export {
+ var $plugin = 'ods';
+
/**
* To be implemented by child classes
*/
- function print_grades($feedback = false) {
+ function print_grades() {
global $CFG;
-
- $this->load_grades();
-
require_once($CFG->dirroot.'/lib/odslib.class.php');
- /// Whether this plugin is entitled to update export time
- if ($expplugins = explode(",", $CFG->gradeexport)) {
- if (in_array('ods', $expplugins)) {
- $export = true;
- } else {
- $export = false;
- }
- } else {
- $export = false;
- }
+ $export_tracking = $this->track_exports();
+
+ $strgrades = get_string('grades', 'grade');
/// Calculate file name
- $downloadfilename = clean_filename("{$this->course->shortname} $this->strgrades.ods");
+ $downloadfilename = clean_filename("{$this->course->shortname} $strgrades.ods");
/// Creating a workbook
$workbook = new MoodleODSWorkbook("-");
/// Sending HTTP headers
$workbook->send($downloadfilename);
/// Adding the worksheet
- $myxls =& $workbook->add_worksheet($this->strgrades);
+ $myxls =& $workbook->add_worksheet($strgrades);
/// Print names of all the fields
$myxls->write_string(0,0,get_string("firstname"));
@@ -64,61 +56,48 @@ class grade_export_ods extends grade_export {
$myxls->write_string(0,4,get_string("department"));
$myxls->write_string(0,5,get_string("email"));
$pos=6;
- foreach ($this->columns as $column) {
- $myxls->write_string(0,$pos++,strip_tags($column));
+ foreach ($this->columns as $grade_item) {
+ $myxls->write_string(0, $pos++, $this->format_column_name($grade_item));
/// add a column_feedback column
- if ($feedback) {
- $myxls->write_string(0,$pos++,strip_tags($column."_feedback"));
+ if ($this->export_feedback) {
+ $myxls->write_string(0, $pos++, $this->format_column_name($grade_item, true));
}
}
/// Print all the lines of data.
$i = 0;
- if (!empty($this->grades)) {
- foreach ($this->grades as $studentid => $studentgrades) {
- $i++;
- $student = $this->students[$studentid];
- if (empty($this->totals[$student->id])) {
- $this->totals[$student->id] = '';
+ $gui = new graded_users_iterator($this->course, $this->columns, $this->groupid);
+ $gui->init();
+ while ($userdata = $gui->next_user()) {
+ $i++;
+ $user = $userdata->user;
+
+ $myxls->write_string($i,0,$user->firstname);
+ $myxls->write_string($i,1,$user->lastname);
+ $myxls->write_string($i,2,$user->idnumber);
+ $myxls->write_string($i,3,$user->institution);
+ $myxls->write_string($i,4,$user->department);
+ $myxls->write_string($i,5,$user->email);
+ $j=6;
+ foreach ($userdata->grades as $itemid => $grade) {
+ $gradestr = $this->format_grade($grade);
+ if (is_numeric($gradestr)) {
+ $myxls->write_number($i,$j++,$gradestr);
+ }
+ else {
+ $myxls->write_string($i,$j++,$gradestr);
}
- $myxls->write_string($i,0,$student->firstname);
- $myxls->write_string($i,1,$student->lastname);
- $myxls->write_string($i,2,$student->idnumber);
- $myxls->write_string($i,3,$student->institution);
- $myxls->write_string($i,4,$student->department);
- $myxls->write_string($i,5,$student->email);
- $j=6;
- foreach ($studentgrades as $gradeitemid => $grade) {
- if (is_numeric($grade)) {
- $myxls->write_number($i,$j++,$grade);
- }
- else {
- $myxls->write_string($i,$j++,strip_tags($grade));
- }
-
- // writing comment if requested
- if ($feedback) {
- $myxls->write_string($i,$j++,$this->comments[$student->id][$gradeitemid]);
- }
-
- /// if export flag needs to be set
- /// construct the grade_grade object and update timestamp if CFG flag is set
-
- if ($export) {
- $params= new object();
- $params->itemid = $gradeitemid;
- $params->userid = $studentid;
-
- $grade_grade = new grade_grade($params);
- $grade_grade->exported = time();
- // update the time stamp;
- $grade_grade->update();
- }
+ // writing feedback if requested
+ if ($this->export_feedback) {
+ $myxls->write_string($i, $j++, $this->format_feedback($userdata->feedbacks[$itemid]));
}
+
+ //TODO: reimplement export handling flag
}
}
+ $gui->close();
/// Close the workbook
$workbook->close();
diff --git a/grade/export/ods/index.php b/grade/export/ods/index.php
index 2e2689222a8..50794d69199 100755
--- a/grade/export/ods/index.php
+++ b/grade/export/ods/index.php
@@ -27,8 +27,7 @@ require_once '../../../config.php';
require_once $CFG->dirroot.'/grade/export/lib.php';
require_once 'grade_export_ods.php';
-$id = required_param('id', PARAM_INT); // course id
-$feedback = optional_param('feedback', '', PARAM_ALPHA);
+$id = required_param('id', PARAM_INT); // course id
if (!$course = get_record('course', 'id', $id)) {
print_error('nocourseid');
@@ -48,16 +47,21 @@ $navigation = grade_build_nav(__FILE__, $actionstr, array('courseid' => $course-
print_header($course->shortname.': '.get_string('grades'), $course->fullname, $navigation);
print_grade_plugin_selector($id, 'export', 'ods');
-$mform = new grade_export_form(null, array('publishing' => $CFG->enablepublishing));
+$mform = new grade_export_form(null, array('publishing' => true));
// process post information
if ($data = $mform->get_data()) {
+ $export = new grade_export_ods($course, get_current_group($course->id));
+
// print the grades on screen for feedbacks
- $export = new grade_export($id, $itemids, $data);
- $export->display_grades($feedback, $data->previewrows);
- $export->print_continue('ods');
+ $export->process_form($data);
+ $export->display_preview();
+ $export->print_continue();
+ die;
}
+//TODO: add course group selector here
+
$mform->display();
print_footer();
diff --git a/grade/export/txt/dump.php b/grade/export/txt/dump.php
index c22d6ef4025..fb7c17ece84 100644
--- a/grade/export/txt/dump.php
+++ b/grade/export/txt/dump.php
@@ -7,6 +7,10 @@ $id = required_param('id', PARAM_INT); // course id
require_user_key_login('grade/export', $id); // we want different keys for each course
+if (empty($CFG->gradepublishing)) {
+ error('Grade publishing disabled');
+}
+
// use the same page parameters as export.php and append &key=sdhakjsahdksahdkjsahksadjksahdkjsadhksa
require 'export.php';
diff --git a/grade/export/txt/export.php b/grade/export/txt/export.php
index 21a97baa94a..80a5388bf82 100755
--- a/grade/export/txt/export.php
+++ b/grade/export/txt/export.php
@@ -27,10 +27,12 @@ require_once '../../../config.php';
require_once $CFG->dirroot.'/grade/export/lib.php';
require_once 'grade_export_txt.php';
-$id = required_param('id', PARAM_INT); // course id
-$feedback = optional_param('feedback', '', PARAM_ALPHA);
-$export_letters = optional_param('export_letters', '', PARAM_INT);
-$itemids = explode(",", required_param('itemids', PARAM_RAW));
+$id = required_param('id', PARAM_INT); // course id
+$groupid = optional_param('groupid', 0, PARAM_INT);
+$itemids = required_param('itemids', PARAM_RAW);
+$export_feedback = optional_param('export_feedback', 0, PARAM_BOOL);
+$export_letters = optional_param('export_letters', 0, PARAM_BOOL);
+$separator = optional_param('separator', 'comma', PARAM_ALPHA);
if (!$course = get_record('course', 'id', $id)) {
print_error('nocourseid');
@@ -42,9 +44,9 @@ $context = get_context_instance(CONTEXT_COURSE, $id);
require_capability('moodle/grade:export', $context);
require_capability('gradeexport/txt:view', $context);
+
// print all the exported data here
-$export = new grade_export_txt($id, $itemids, $export_letters);
-$export->set_separator(optional_param('separator'));
-$export->print_grades($feedback);
+$export = new grade_export_txt($course, $groupid, $itemids, $export_feedback, $export_letters, $separator);
+$export->print_grades();
?>
diff --git a/grade/export/txt/grade_export_txt.php b/grade/export/txt/grade_export_txt.php
index bc64e6ad7dc..789183858b9 100755
--- a/grade/export/txt/grade_export_txt.php
+++ b/grade/export/txt/grade_export_txt.php
@@ -26,94 +26,91 @@ require_once($CFG->dirroot.'/grade/export/lib.php');
class grade_export_txt extends grade_export {
- var $separator = "\t"; // default separator
+ var $plugin = 'txt';
- function set_separator($separator) {
- if ($separator == 'comma') {
- $this->separator = ",";
- } else if ($separator == 'tab') {
- $this->separator = "\t";
+ var $separator; // default separator
+
+ function grade_export_txt($course, $groupid=0, $itemlist='', $export_feedback=false, $export_letters=false, $separator='comma') {
+ $this->grade_export($course, $groupid, $itemlist, $export_feedback, $export_letters);
+ $this->separator = $separator;
+ }
+
+ function process_form($formdata) {
+ parent::process_form($formdata);
+ if (isset($formdata->separator)) {
+ $this->separator = $formdata->separator;
}
}
- /**
- * To be implemented by child classes
- */
- function print_grades($feedback = false) {
+ function get_export_params() {
+ $params = parent::get_export_params();
+ $params['separator'] = $this->separator;
+ return $params;
+ }
+
+ function print_grades() {
global $CFG;
- $this->load_grades();
+ $export_tracking = $this->track_exports();
- $retval = '';
+ $strgrades = get_string('grades', 'grade');
- /// Whether this plugin is entitled to update export time
- if ($expplugins = explode(",", $CFG->gradeexport)) {
- if (in_array('txt', $expplugins)) {
- $export = true;
- } else {
- $export = false;
- }
- } else {
- $export = false;
+ switch ($this->separator) {
+ case 'comma':
+ $separator = ",";
+ break;
+ case 'tab':
+ default:
+ $separator = "\t";
}
/// Print header to force download
+ @header('Cache-Control: private, must-revalidate, pre-check=0, post-check=0, max-age=0');
+ @header('Expires: '. gmdate('D, d M Y H:i:s', 0) .' GMT');
+ @header('Pragma: no-cache');
header("Content-Type: application/download\n");
- $downloadfilename = clean_filename("{$this->course->shortname} $this->strgrades");
+ $downloadfilename = clean_filename("{$this->course->shortname} $strgrades");
header("Content-Disposition: attachment; filename=\"$downloadfilename.txt\"");
/// Print names of all the fields
-
- $retval .= get_string("firstname")."$this->separator".
- get_string("lastname")."{$this->separator}".
- get_string("idnumber")."{$this->separator}".
- get_string("institution")."{$this->separator}".
- get_string("department")."{$this->separator}".
+ echo get_string("firstname").$separator.
+ get_string("lastname").$separator.
+ get_string("idnumber").$separator.
+ get_string("institution").$separator.
+ get_string("department").$separator.
get_string("email");
- foreach ($this->columns as $column) {
- $column = strip_tags($column);
- $retval .= "{$this->separator}$column";
- /// add a column_feedback column
- if ($feedback) {
- $retval .= "{$this->separator}{$column}_feedback";
+ foreach ($this->columns as $grade_item) {
+ echo $separator.$this->format_column_name($grade_item);
+
+ /// add a feedback column
+ if ($this->export_feedback) {
+ echo $separator.$this->format_column_name($grade_item, true);
}
}
+ echo "\n";
/// Print all the lines of data.
- foreach ($this->grades as $studentid => $studentgrades) {
+ $gui = new graded_users_iterator($this->course, $this->columns, $this->groupid);
+ $gui->init();
+ while ($userdata = $gui->next_user()) {
- $student = $this->students[$studentid];
+ $user = $userdata->user;
- $retval .= "$student->firstname{$this->separator}$student->lastname{$this->separator}$student->idnumber{$this->separator}$student->institution{$this->separator}$student->department{$this->separator}$student->email";
+ echo $user->firstname.$separator.$user->lastname.$separator.$user->idnumber.$separator.$user->institution.$separator.$user->department.$separator.$user->email;
- foreach ($studentgrades as $gradeitemid => $grade) {
- $grade = strip_tags($grade);
- $retval .= "{$this->separator}$grade";
+ foreach ($userdata->grades as $itemid => $grade) {
+ echo $separator.$this->format_grade($grade);
- if ($feedback) {
- $retval .= "{$this->separator}".$this->comments[$student->id][$gradeitemid];
+ if ($this->export_feedback) {
+ echo $separator.$this->format_feedback($userdata->feedbacks[$itemid]);
}
- /// if export flag needs to be set
- /// construct the grade_grade object and update timestamp if CFG flag is set
-
- if ($export) {
- //this should be improved with sql
- $params = new object();
- $params->itemid = $gradeitemid;
- $params->userid = $studentid;
-
- $grade_grade = new grade_grade($params);
- $grade_grade->exported = time();
- // update the time stamp;
- $grade_grade->update();
- }
+ //TODO: reimplement export handling flag
}
- $retval .= "\n";
+ echo "\n";
}
-
- echo $retval;
+ $gui->close();
exit;
}
diff --git a/grade/export/txt/index.php b/grade/export/txt/index.php
index a4436cb70a7..3921ff58eab 100755
--- a/grade/export/txt/index.php
+++ b/grade/export/txt/index.php
@@ -27,8 +27,7 @@ require_once '../../../config.php';
require_once $CFG->dirroot.'/grade/export/lib.php';
require_once 'grade_export_txt.php';
-$id = required_param('id', PARAM_INT); // course id
-$feedback = optional_param('feedback', '', PARAM_ALPHA);
+$id = required_param('id', PARAM_INT); // course id
if (!$course = get_record('course', 'id', $id)) {
print_error('nocourseid');
@@ -48,17 +47,21 @@ $navigation = grade_build_nav(__FILE__, $actionstr, array('courseid' => $course-
print_header($course->shortname.': '.get_string('grades'), $course->fullname, $navigation);
print_grade_plugin_selector($id, 'export', 'txt');
-$mform = new grade_export_form(null, array('includeseparator'=>true, 'publishing' => $CFG->enablepublishing));
+$mform = new grade_export_form(null, array('includeseparator'=>true, 'publishing' => true));
// process post information
if ($data = $mform->get_data()) {
+ $export = new grade_export_txt($course, get_current_group($course->id));
+
// print the grades on screen for feedbacks
- $export = new grade_export($id, $itemids, $data);
- $export->display_grades($feedback, $data->previewrows);
- $export->print_continue('txt');
+ $export->process_form($data);
+ $export->display_preview();
+ $export->print_continue();
+ die;
}
-// print the form to choose what grade_items to export
+//TODO: add course group selector here
+
$mform->display();
print_footer();
diff --git a/grade/export/xls/dump.php b/grade/export/xls/dump.php
index c22d6ef4025..fb7c17ece84 100644
--- a/grade/export/xls/dump.php
+++ b/grade/export/xls/dump.php
@@ -7,6 +7,10 @@ $id = required_param('id', PARAM_INT); // course id
require_user_key_login('grade/export', $id); // we want different keys for each course
+if (empty($CFG->gradepublishing)) {
+ error('Grade publishing disabled');
+}
+
// use the same page parameters as export.php and append &key=sdhakjsahdksahdkjsahksadjksahdkjsadhksa
require 'export.php';
diff --git a/grade/export/xls/export.php b/grade/export/xls/export.php
index 80adbe41a5e..1fc83506cc7 100755
--- a/grade/export/xls/export.php
+++ b/grade/export/xls/export.php
@@ -27,10 +27,11 @@ require_once '../../../config.php';
require_once $CFG->dirroot.'/grade/export/lib.php';
require_once 'grade_export_xls.php';
-$id = required_param('id', PARAM_INT); // course id
-$feedback = optional_param('feedback', '', PARAM_ALPHA);
-$export_letters = optional_param('export_letters', '', PARAM_INT);
-$itemids = explode(",", required_param('itemids', PARAM_RAW));
+$id = required_param('id', PARAM_INT); // course id
+$groupid = optional_param('groupid', 0, PARAM_INT);
+$itemids = required_param('itemids', PARAM_RAW);
+$export_feedback = optional_param('export_feedback', 0, PARAM_BOOL);
+$export_letters = optional_param('export_letters', 0, PARAM_BOOL);
if (!$course = get_record('course', 'id', $id)) {
print_error('nocourseid');
@@ -42,8 +43,9 @@ $context = get_context_instance(CONTEXT_COURSE, $id);
require_capability('moodle/grade:export', $context);
require_capability('gradeexport/xls:view', $context);
+
// print all the exported data here
-$export = new grade_export_xls($id, $itemids, $export_letters);
-$export->print_grades($feedback);
+$export = new grade_export_xls($course, $groupid, $itemids, $export_feedback, $export_letters);
+$export->print_grades();
?>
diff --git a/grade/export/xls/grade_export_xls.php b/grade/export/xls/grade_export_xls.php
index 5104297fc10..cfb51b8f0e2 100755
--- a/grade/export/xls/grade_export_xls.php
+++ b/grade/export/xls/grade_export_xls.php
@@ -26,35 +26,27 @@ require_once($CFG->dirroot.'/grade/export/lib.php');
class grade_export_xls extends grade_export {
+ var $plugin = 'xls';
+
/**
* To be implemented by child classes
*/
- function print_grades($feedback = false) {
+ function print_grades() {
global $CFG;
-
- $this->load_grades();
-
- /// Whether this plugin is entitled to update export time
- if ($expplugins = explode(",", $CFG->gradeexport)) {
- if (in_array('xls', $expplugins)) {
- $export = true;
- } else {
- $export = false;
- }
- } else {
- $export = false;
- }
-
require_once($CFG->dirroot.'/lib/excellib.class.php');
+ $export_tracking = $this->track_exports();
+
+ $strgrades = get_string('grades', 'grade');
+
/// Calculate file name
- $downloadfilename = clean_filename("{$this->course->shortname} $this->strgrades.xls");
+ $downloadfilename = clean_filename("{$this->course->shortname} $strgrades.xls");
/// Creating a workbook
$workbook = new MoodleExcelWorkbook("-");
/// Sending HTTP headers
$workbook->send($downloadfilename);
/// Adding the worksheet
- $myxls =& $workbook->add_worksheet($this->strgrades);
+ $myxls =& $workbook->add_worksheet($strgrades);
/// Print names of all the fields
$myxls->write_string(0,0,get_string("firstname"));
@@ -64,63 +56,52 @@ class grade_export_xls extends grade_export {
$myxls->write_string(0,4,get_string("department"));
$myxls->write_string(0,5,get_string("email"));
$pos=6;
- foreach ($this->columns as $column) {
- $myxls->write_string(0,$pos++,strip_tags($column));
+ foreach ($this->columns as $grade_item) {
+ $myxls->write_string(0, $pos++, $this->format_column_name($grade_item));
+
/// add a column_feedback column
- if ($feedback) {
- $myxls->write_string(0,$pos++,strip_tags($column."_feedback"));
+ if ($this->export_feedback) {
+ $myxls->write_string(0, $pos++, $this->format_column_name($grade_item, true));
}
}
/// Print all the lines of data.
$i = 0;
- if (!empty($this->grades)) {
- foreach ($this->grades as $studentid => $studentgrades) {
- $i++;
- $student = $this->students[$studentid];
- if (empty($this->totals[$student->id])) {
- $this->totals[$student->id] = '';
+ $gui = new graded_users_iterator($this->course, $this->columns, $this->groupid);
+ $gui->init();
+ while ($userdata = $gui->next_user()) {
+ $i++;
+ $user = $userdata->user;
+
+ $myxls->write_string($i,0,$user->firstname);
+ $myxls->write_string($i,1,$user->lastname);
+ $myxls->write_string($i,2,$user->idnumber);
+ $myxls->write_string($i,3,$user->institution);
+ $myxls->write_string($i,4,$user->department);
+ $myxls->write_string($i,5,$user->email);
+ $j=6;
+ foreach ($userdata->grades as $itemid => $grade) {
+ $gradestr = $this->format_grade($grade);
+ if (is_numeric($gradestr)) {
+ $myxls->write_number($i,$j++,$gradestr);
+ }
+ else {
+ $myxls->write_string($i,$j++,$gradestr);
}
- $myxls->write_string($i,0,$student->firstname);
- $myxls->write_string($i,1,$student->lastname);
- $myxls->write_string($i,2,$student->idnumber);
- $myxls->write_string($i,3,$student->institution);
- $myxls->write_string($i,4,$student->department);
- $myxls->write_string($i,5,$student->email);
- $j=6;
- foreach ($studentgrades as $gradeitemid => $grade) {
- if (is_numeric($grade)) {
- $myxls->write_number($i,$j++,$grade);
- }
- else {
- $myxls->write_string($i,$j++,strip_tags($grade));
- }
-
- // writing comment if requested
- if ($feedback) {
- $myxls->write_string($i,$j++,$this->comments[$student->id][$gradeitemid]);
- }
-
- /// if export flag needs to be set
- /// construct the grade_grade object and update timestamp if CFG flag is set
-
- if ($export) {
- $params = new object();
- $params->itemid = $gradeitemid;
- $params->userid = $studentid;
-
- $grade_grade = new grade_grade($params);
- $grade_grade->exported = time();
- // update the time stamp;
- $grade_grade->update();
- }
+ // writing feedback if requested
+ if ($this->export_feedback) {
+ $myxls->write_string($i, $j++, $this->format_feedback($userdata->feedbacks[$itemid]));
}
+
+ //TODO: reimplement export handling flag
}
}
+ $gui->close();
/// Close the workbook
$workbook->close();
+
exit;
}
}
diff --git a/grade/export/xls/index.php b/grade/export/xls/index.php
index bcd9a71659d..3c37637ca72 100755
--- a/grade/export/xls/index.php
+++ b/grade/export/xls/index.php
@@ -27,8 +27,7 @@ require_once '../../../config.php';
require_once $CFG->dirroot.'/grade/export/lib.php';
require_once 'grade_export_xls.php';
-$id = required_param('id', PARAM_INT); // course id
-$feedback = optional_param('feedback', '', PARAM_ALPHA);
+$id = required_param('id', PARAM_INT); // course id
if (!$course = get_record('course', 'id', $id)) {
print_error('nocourseid');
@@ -48,16 +47,21 @@ $navigation = grade_build_nav(__FILE__, $actionstr, array('courseid' => $course-
print_header($course->shortname.': '.get_string('grades'), $course->fullname, $navigation);
print_grade_plugin_selector($id, 'export', 'xls');
-$mform = new grade_export_form(null, array('publishing' => $CFG->enablepublishing));
+$mform = new grade_export_form(null, array('publishing' => true));
// process post information
if ($data = $mform->get_data()) {
+ $export = new grade_export_xls($course, get_current_group($course->id));
+
// print the grades on screen for feedbacks
- $export = new grade_export($id, $itemids, $data);
- $export->display_grades($feedback, $data->previewrows);
- $export->print_continue('xls');
+ $export->process_form($data);
+ $export->display_preview();
+ $export->print_continue();
+ die;
}
+//TODO: add course group selector here
+
$mform->display();
print_footer();
diff --git a/grade/export/xml/dump.php b/grade/export/xml/dump.php
index c22d6ef4025..fb7c17ece84 100644
--- a/grade/export/xml/dump.php
+++ b/grade/export/xml/dump.php
@@ -7,6 +7,10 @@ $id = required_param('id', PARAM_INT); // course id
require_user_key_login('grade/export', $id); // we want different keys for each course
+if (empty($CFG->gradepublishing)) {
+ error('Grade publishing disabled');
+}
+
// use the same page parameters as export.php and append &key=sdhakjsahdksahdkjsahksadjksahdkjsadhksa
require 'export.php';
diff --git a/grade/export/xml/export.php b/grade/export/xml/export.php
index 1a71534588a..04416c86f3a 100755
--- a/grade/export/xml/export.php
+++ b/grade/export/xml/export.php
@@ -27,10 +27,11 @@ require_once '../../../config.php';
require_once $CFG->dirroot.'/grade/export/lib.php';
require_once 'grade_export_xml.php';
-$id = required_param('id', PARAM_INT); // course id
-$feedback = optional_param('feedback', '', PARAM_ALPHA);
-$export_letters = optional_param('export_letters', '', PARAM_INT);
-$itemids = explode(",", required_param('itemids', PARAM_RAW));
+$id = required_param('id', PARAM_INT); // course id
+$groupid = optional_param('groupid', 0, PARAM_INT);
+$itemids = required_param('itemids', PARAM_RAW);
+$export_feedback = optional_param('export_feedback', 0, PARAM_BOOL);
+$export_letters = optional_param('export_letters', 0, PARAM_BOOL);
if (!$course = get_record('course', 'id', $id)) {
print_error('nocourseid');
@@ -42,8 +43,9 @@ $context = get_context_instance(CONTEXT_COURSE, $id);
require_capability('moodle/grade:export', $context);
require_capability('gradeexport/xml:view', $context);
+
// print all the exported data here
-$export = new grade_export_xml($id, $itemids, $export_letters);
-$export->print_grades($feedback);
+$export = new grade_export_xml($course, $groupid, $itemids, $export_feedback, $export_letters);
+$export->print_grades();
?>
diff --git a/grade/export/xml/grade_export_xml.php b/grade/export/xml/grade_export_xml.php
index a262ec19677..48fa2bf4f16 100755
--- a/grade/export/xml/grade_export_xml.php
+++ b/grade/export/xml/grade_export_xml.php
@@ -26,6 +26,8 @@ require_once($CFG->dirroot.'/grade/export/lib.php');
class grade_export_xml extends grade_export {
+ var $plugin = 'xml';
+
/**
* To be implemented by child classes
* @param boolean $feedback
@@ -34,26 +36,17 @@ class grade_export_xml extends grade_export {
*/
function print_grades($feedback = false) {
global $CFG;
+ require_once($CFG->libdir.'/filelib.php');
- $this->load_grades();
+ $export_tracking = $this->track_exports();
- $retval = '';
-
- /// Whether this plugin is entitled to update export time
- if ($expplugins = explode(",", $CFG->gradeexport)) {
- if (in_array('xml', $expplugins)) {
- $export = true;
- } else {
- $export = false;
- }
- } else {
- $export = false;
- }
+ $strgrades = get_string('grades', 'grade');
/// Calculate file name
- $downloadfilename = clean_filename("{$this->course->shortname} $this->strgrades.xml");
+ $downloadfilename = clean_filename("{$this->course->shortname} $strgrades.xml");
- $tempfilename = $CFG->dataroot . MD5(microtime()) . $downloadfilename;
+ make_upload_directory('temp/gradeexport', false);
+ $tempfilename = $CFG->dataroot .'/temp/gradeexport/'. md5(sesskey().microtime().$downloadfilename);
if (!$handle = fopen($tempfilename, 'w+b')) {
error("Could not create a temporary file into which to dump the XML data.");
return false;
@@ -62,74 +55,65 @@ class grade_export_xml extends grade_export {
/// time stamp to ensure uniqueness of batch export
fwrite($handle, '