diff --git a/lang/en_utf8/portfolio.php b/lang/en_utf8/portfolio.php index ec958abb5aa..3cf2f806e06 100644 --- a/lang/en_utf8/portfolio.php +++ b/lang/en_utf8/portfolio.php @@ -29,6 +29,8 @@ $string['dontwait'] = 'Don\'t wait'; $string['err_uniquename'] = 'Portfolio name must be unique (per plugin)'; $string['enabled'] = 'Enable portfolios'; $string['enableddesc'] = 'This will allow administrators to configure remote systems for users to export content to'; +$string['exportalreadyfinished']= 'Portfolio export complete!'; +$string['exportalreadyfinisheddesc'] = 'Portfolio export complete!'; $string['exporting'] = 'Exporting to portfolio'; $string['exportingcontentfrom'] = 'Exporting content from $a'; $string['exportcomplete'] = 'Portfolio export complete!'; diff --git a/lib/portfolio/exporter.php b/lib/portfolio/exporter.php index ae74fdce47a..f5426981188 100644 --- a/lib/portfolio/exporter.php +++ b/lib/portfolio/exporter.php @@ -117,6 +117,12 @@ class portfolio_exporter { */ private $expirytime; + /** + * deleted - this is set during the cleanup routine + * so that subsequent save() calls can detect it + */ + private $deleted = false; + /** * construct a new exporter for use * @@ -485,6 +491,7 @@ class portfolio_exporter { $DB->delete_records('portfolio_tempdata', array('id' => $this->id)); $fs = get_file_storage(); $fs->delete_area_files(SYSCONTEXTID, 'portfolio_exporter', $this->id); + $this->deleted = true; return true; } @@ -523,11 +530,23 @@ class portfolio_exporter { 'caller_file' => $this->callerfile, 'caller_sha1' => $this->caller->get_sha1(), 'caller_class' => get_class($this->caller), + 'continueurl' => $this->instance->get_static_continue_url(), + 'returnurl' => $this->caller->get_return_url(), + 'tempdataid' => $this->id, 'time' => time(), ); $DB->insert_record('portfolio_log', $l); } + /** + * in some cases (mahara) we need to update this after the log has been done + * because of MDL-20872 + */ + public function update_log_url($url) { + global $DB; + $DB->set_field('portfolio_log', 'continueurl', $url, array('tempdataid' => $this->id)); + } + /** * processes the 'finish' stage of the export * @@ -536,7 +555,7 @@ class portfolio_exporter { public function process_stage_finished($queued=false) { global $OUTPUT; $returnurl = $this->caller->get_return_url(); - $continueurl = $this->instance->get_continue_url(); + $continueurl = $this->instance->get_interactive_continue_url(); $extras = $this->instance->get_extra_finish_options(); $key = 'exportcomplete'; @@ -616,7 +635,9 @@ class portfolio_exporter { $this->save(); // call again so that id gets added to the save data. } else { if (!$r = $DB->get_record('portfolio_tempdata', array('id' => $this->id))) { - debugging("tried to save current object, but failed - see MDL-20872"); + if (!$this->deleted) { + debugging("tried to save current object, but failed - see MDL-20872"); + } return; } $r->data = base64_encode(serialize($this)); @@ -774,7 +795,7 @@ class portfolio_exporter { * * @return array of stored_file objects keyed by name */ - public function get_tempfiles() { + public function get_tempfiles($skipfile='portfolio-export.zip') { $fs = get_file_storage(); $files = $fs->get_area_files(SYSCONTEXTID, 'portfolio_exporter', $this->id, '', false); if (empty($files)) { @@ -782,6 +803,9 @@ class portfolio_exporter { } $returnfiles = array(); foreach ($files as $f) { + if ($f->get_filename() == $skipfile) { + continue; + } $returnfiles[$f->get_filepath() . '/' . $f->get_filename()] = $f; } return $returnfiles; @@ -856,15 +880,18 @@ class portfolio_exporter { return $DB->get_records_sql_menu($sql, $values); } - public static function print_cleaned_export($log) { + public static function print_cleaned_export($log, $instance=null) { global $CFG, $OUTPUT, $PAGE; + if (empty($instance) || !$instance instanceof portfolio_plugin) { + $instance = portfolio_instance($log->portfolio); + } $title = get_string('exportalreadyfinished', 'portfolio'); $PAGE->navbar->add($title); $PAGE->set_title($title); $PAGE->set_heading($title); echo $OUTPUT->header(); echo $OUTPUT->notification(get_string('exportalreadyfinished', 'portfolio')); - self::print_finish_info($log->returnurl, $log->continueurl); + self::print_finish_info($log->returnurl, $instance->resolve_static_continue_url($log->continueurl)); echo $OUTPUT->continue_button($CFG->wwwroot); echo $OUTPUT->footer(); exit; diff --git a/lib/portfolio/plugin.php b/lib/portfolio/plugin.php index a8a91349bbb..fd0dbe96664 100644 --- a/lib/portfolio/plugin.php +++ b/lib/portfolio/plugin.php @@ -325,10 +325,29 @@ abstract class portfolio_plugin_base { /** * the url for the user to continue to their portfolio + * during the lifecycle of the request * * @return string url or false. */ - public abstract function get_continue_url(); + public abstract function get_interactive_continue_url(); + + /** + * the url to save in the log as the continue url + * this is passed through resolve_static_continue_url() + * at display time to the user. + */ + public function get_static_continue_url() { + return $this->get_interactive_continue_url(); + } + + /** + * override this function if you need to add something on to the url + * for post-export continues (eg from the log page) + * mahara does this, for example, to start a jump session + */ + public function resolve_static_continue_url($url) { + return $url; + } /** * mform to display to the user in their profile diff --git a/lib/simpletest/portfolio_testclass.php b/lib/simpletest/portfolio_testclass.php index 40586d7d2c9..29aa3db5922 100644 --- a/lib/simpletest/portfolio_testclass.php +++ b/lib/simpletest/portfolio_testclass.php @@ -51,7 +51,7 @@ class portfolio_plugin_test extends portfolio_plugin_push_base { return true; } - public function get_continue_url() { + public function get_interactive_continue_url() { return ''; } diff --git a/portfolio/type/boxnet/lib.php b/portfolio/type/boxnet/lib.php index f03278c4190..408c7faeeed 100644 --- a/portfolio/type/boxnet/lib.php +++ b/portfolio/type/boxnet/lib.php @@ -60,7 +60,7 @@ class portfolio_plugin_boxnet extends portfolio_plugin_push_base { ); } - public function get_continue_url() { + public function get_interactive_continue_url() { return 'http://box.net/files#0:f:' . $this->get_export_config('folder'); } diff --git a/portfolio/type/download/lib.php b/portfolio/type/download/lib.php index 1f175c952bc..3ad63109a74 100644 --- a/portfolio/type/download/lib.php +++ b/portfolio/type/download/lib.php @@ -48,7 +48,7 @@ class portfolio_plugin_download extends portfolio_plugin_pull_base { return true; } - public function get_continue_url() { + public function get_interactive_continue_url() { return false; } } diff --git a/portfolio/type/flickr/lib.php b/portfolio/type/flickr/lib.php index 2ce4df1817f..4fdd703ad83 100755 --- a/portfolio/type/flickr/lib.php +++ b/portfolio/type/flickr/lib.php @@ -55,7 +55,7 @@ class portfolio_plugin_flickr extends portfolio_plugin_push_base { return false; } - public function get_continue_url() { + public function get_interactive_continue_url() { // return $this->flickr->urls_getUserPhotos(); return "http://www.flickr.com/tools/uploader_edit.gne?ids="; // Add ids of uploaded files } diff --git a/portfolio/type/googledocs/lib.php b/portfolio/type/googledocs/lib.php index adfcc5507ce..db02fd1313b 100644 --- a/portfolio/type/googledocs/lib.php +++ b/portfolio/type/googledocs/lib.php @@ -23,7 +23,7 @@ class portfolio_plugin_googledocs extends portfolio_plugin_push_base { return true; } - public function get_continue_url(){ + public function get_interactive_continue_url(){ return 'http://docs.google.com/'; } diff --git a/portfolio/type/mahara/lib.php b/portfolio/type/mahara/lib.php index 2105cbeafea..8688644e18d 100644 --- a/portfolio/type/mahara/lib.php +++ b/portfolio/type/mahara/lib.php @@ -195,22 +195,40 @@ class portfolio_plugin_mahara extends portfolio_plugin_pull_base { if (isset($response->querystring)) { $this->continueurl = $response->querystring; } + // if we're not queuing the logging might have already happened + $this->exporter->update_log_url($this->get_static_continue_url()); } - public function get_continue_url() { - $this->ensure_mnethost(); - $this->ensure_environment(); - $mnetauth = get_auth_plugin('mnet'); + public function get_static_continue_url() { $remoteurl = '/artefact/file/';// @todo penny this might change later when we change formats. if (isset($this->continueurl)) { $remoteurl .= $this->continueurl; } + return $remoteurl; + } + + public function resolve_static_continue_url($remoteurl) { + static $sessions = array(); + // if this is called mutliple times for the same host, stuff breaks + // so we have to keep track and just replace the wantsurl bit + // in case things go to different plugins or whatever + if (array_key_exists($this->get_config('mnethostid'), $sessions)) { + return preg_replace('/wantsurl=[^&]*&/', 'wantsurl=' . urlencode($remoteurl) . '&', $sessions[$this->get_config('mnethostid')]); + } + $this->ensure_mnethost(); + $this->ensure_environment(); + $mnetauth = get_auth_plugin('mnet'); if (!$url = $mnetauth->start_jump_session($this->get_config('mnethostid'), $remoteurl)) { return false; } + $sessions[$this->get_config('mnethostid')] = $url; return $url; } + public function get_interactive_continue_url() { + return $this->resolve_static_continue_url($this->get_static_continue_url()); + } + public function steal_control($stage) { if ($stage != PORTFOLIO_STAGE_CONFIG) { return false; diff --git a/portfolio/type/picasa/lib.php b/portfolio/type/picasa/lib.php index 763945a527b..0632a7a0ee8 100644 --- a/portfolio/type/picasa/lib.php +++ b/portfolio/type/picasa/lib.php @@ -24,7 +24,7 @@ class portfolio_plugin_picasa extends portfolio_plugin_push_base { return true; } - public function get_continue_url(){ + public function get_interactive_continue_url(){ return 'http://picasaweb.google.com/'; } diff --git a/user/portfoliologs.php b/user/portfoliologs.php index 078b622efc0..b059d9e6704 100644 --- a/user/portfoliologs.php +++ b/user/portfoliologs.php @@ -130,14 +130,19 @@ if ($logcount > 0) { $pluginname = ''; try { $plugin = portfolio_instance($log->portfolio); - $pluginname = $plugin->get('name'); + $url = $plugin->resolve_static_continue_url($log->continueurl); + if ($url) { + $pluginname = '' . $plugin->get('name') . ''; + } else { + $pluginname = $plugin->get('name'); + } } catch (portfolio_exception $e) { // may have been deleted $pluginname = get_string('unknownplugin', 'portfolio'); } $table->data[] = array( $pluginname, - call_user_func(array($class, 'display_name')), + '' . call_user_func(array($class, 'display_name')) . '', userdate($log->time), ); }