From 59c8be2362749a168719ab025993de551b66e9cb Mon Sep 17 00:00:00 2001 From: David Mudrak Date: Wed, 28 Sep 2011 02:02:37 +0200 Subject: [PATCH] MDL-27857 Export to portfolio support in the assignment module improved Portfolio API code in the assignment module expected that the current user is the author of the submission. Therefore the "Export to portfolio" button did not work when the submission was viewed by a teacher (eg at the page with the list of all submissions in the Advanced upload assignment). This patch introduces a new callback argument 'submissionid' that holds explicit ID of the submission the export deals with. With it available, we do not need to expect the current user is the author of the submission. The patch also cleans some strings used for portfolio callback exceptions. --- mod/assignment/lang/en/assignment.php | 8 ++++--- mod/assignment/lib.php | 4 ++-- mod/assignment/locallib.php | 33 +++++++++++++++++++++++---- mod/assignment/renderer.php | 2 +- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/mod/assignment/lang/en/assignment.php b/mod/assignment/lang/en/assignment.php index e9a90317d78..bef1da47f3c 100644 --- a/mod/assignment/lang/en/assignment.php +++ b/mod/assignment/lang/en/assignment.php @@ -125,9 +125,11 @@ $string['helpuploadsingle'] = '

This type of assignment allows each participan a zipped web site, or anything you ask them to submit.

'; $string['hideintro'] = 'Hide description before available date'; $string['hideintro_help'] = 'If enabled, the assignment description is hidden before the "Available from" date. Only the assignment name is displayed.'; -$string['invalidassignment'] = 'incorrect assignment'; -$string['invalidid'] = 'assignment ID was incorrect'; -$string['invalidtype'] = 'Incorrect assignment type'; +$string['invalidassignment'] = 'Invalid assignment'; +$string['invalidfileandsubmissionid'] = 'Missing file or submission ID'; +$string['invalidid'] = 'Invalid assignment ID'; +$string['invalidsubmissionid'] = 'Invalid submission ID'; +$string['invalidtype'] = 'Invalid assignment type'; $string['invaliduserid'] = 'Invalid user ID'; $string['itemstocount'] = 'Count'; $string['lastgrade'] = 'Last grade'; diff --git a/mod/assignment/lib.php b/mod/assignment/lib.php index 6e59317b26b..7111981945f 100644 --- a/mod/assignment/lib.php +++ b/mod/assignment/lib.php @@ -1918,7 +1918,7 @@ class assignment_base { $path = file_encode_url($CFG->wwwroot.'/pluginfile.php', '/'.$this->context->id.'/mod_assignment/submission/'.$submission->id.'/'.$filename); $output .= ''.$mimetype.''.s($filename).''; if ($CFG->enableportfolios && $this->portfolio_exportable() && has_capability('mod/assignment:exportownsubmission', $this->context)) { - $button->set_callback_options('assignment_portfolio_caller', array('id' => $this->cm->id, 'fileid' => $file->get_id()), '/mod/assignment/locallib.php'); + $button->set_callback_options('assignment_portfolio_caller', array('id' => $this->cm->id, 'submissionid' => $submission->id, 'fileid' => $file->get_id()), '/mod/assignment/locallib.php'); $button->set_format_by_file($file); $output .= $button->to_html(PORTFOLIO_ADD_ICON_LINK); } @@ -1926,7 +1926,7 @@ class assignment_base { $output .= '
'; } if ($CFG->enableportfolios && count($files) > 1 && $this->portfolio_exportable() && has_capability('mod/assignment:exportownsubmission', $this->context)) { - $button->set_callback_options('assignment_portfolio_caller', array('id' => $this->cm->id), '/mod/assignment/locallib.php'); + $button->set_callback_options('assignment_portfolio_caller', array('id' => $this->cm->id, 'submissionid' => $submission->id), '/mod/assignment/locallib.php'); $output .= '
' . $button->to_html(PORTFOLIO_ADD_TEXT_LINK); } } diff --git a/mod/assignment/locallib.php b/mod/assignment/locallib.php index d6701bb582e..e2c3761aea2 100644 --- a/mod/assignment/locallib.php +++ b/mod/assignment/locallib.php @@ -38,6 +38,9 @@ class assignment_portfolio_caller extends portfolio_module_caller_base { */ private $assignmentfile; + /** @var int callback arg - the id of submission we export */ + protected $submissionid; + /** * callback arg for a single file export */ @@ -45,11 +48,19 @@ class assignment_portfolio_caller extends portfolio_module_caller_base { public static function expected_callbackargs() { return array( - 'id' => true, - 'fileid' => false, + 'id' => true, + 'submissionid' => false, + 'fileid' => false, ); } + /** + * Load data needed for the portfolio export + * + * If the assignment type implements portfolio_load_data(), the processing is delegated + * to it. Otherwise, the caller must provide either fileid (to export single file) or + * submissionid (to export all data attached to the given submission) via callback arguments. + */ public function load_data() { global $DB, $CFG; @@ -75,9 +86,23 @@ class assignment_portfolio_caller extends portfolio_module_caller_base { return $this->assignment->portfolio_load_data($this); } - $submission = $DB->get_record('assignment_submissions', array('assignment'=>$assignment->id, 'userid'=>$this->user->id)); + if (empty($this->fileid)) { + if (empty($this->submissionid)) { + throw new portfolio_caller_exception('invalidfileandsubmissionid', 'mod_assignment'); + } - $this->set_file_and_format_data($this->fileid, $this->assignment->context->id, 'mod_assignment', 'submission', $submission->id, 'timemodified', false); + if (! $submission = $DB->get_record('assignment_submissions', array('assignment'=>$assignment->id, 'id'=>$this->submissionid))) { + throw new portfolio_caller_exception('invalidsubmissionid', 'mod_assignment'); + } + + $submissionid = $submission->id; + + } else { + // once we know the file id, we do not need the submission + $submissionid = null; + } + + $this->set_file_and_format_data($this->fileid, $this->assignment->context->id, 'mod_assignment', 'submission', $submissionid, 'timemodified', false); } public function prepare_package() { diff --git a/mod/assignment/renderer.php b/mod/assignment/renderer.php index 3d10cf2e7c4..77eaf61efd5 100644 --- a/mod/assignment/renderer.php +++ b/mod/assignment/renderer.php @@ -96,7 +96,7 @@ class assignment_files implements renderable { $files = $fs->get_area_files($this->context->id, 'mod_assignment', $filearea, $itemid, "timemodified", false); if (count($files) >= 1 && has_capability('mod/assignment:exportownsubmission', $this->context)) { $button = new portfolio_add_button(); - $button->set_callback_options('assignment_portfolio_caller', array('id' => $this->cm->id), '/mod/assignment/locallib.php'); + $button->set_callback_options('assignment_portfolio_caller', array('id' => $this->cm->id, 'submissionid' => $itemid), '/mod/assignment/locallib.php'); $button->reset_formats(); $this->portfolioform = $button->to_html(PORTFOLIO_ADD_TEXT_LINK); }