Skip to content
Browse files

MDL-34290 repository API: do not confuse source and reference

make sure that repository function get_file_source_info receives as argument the source of the file,
and get_file receives a reference;
reference is a value of DB field files_reference.reference and result of get_file_reference(source).
Fix dropbox as the only repository that have different values in those fields;
also added information about user in dropbox reference and original
  • Loading branch information...
1 parent c9fa5b1 commit 56e7d14f26b476ae6fb7e8bfba61052dca711ad6 @marinaglancy marinaglancy committed Jul 31, 2012
Showing with 66 additions and 39 deletions.
  1. +31 −18 repository/dropbox/lib.php
  2. +10 −7 repository/filepicker.php
  3. +14 −6 repository/lib.php
  4. +11 −8 repository/repository_ajax.php
View
49 repository/dropbox/lib.php
@@ -281,15 +281,22 @@ public function get_option($config = '') {
}
/**
+ * Downloads a file from external repository and saves it in temp dir
*
- * @param string $photo_id
- * @param string $file
- * @return string
+ * @throws moodle_exception when file could not be downloaded
+ *
+ * @param string $reference the content of files.reference field
+ * @param string $filename filename (without path) to save the downloaded file in the
+ * temporary directory, if omitted or file already exists the new filename will be generated
+ * @return array with elements:
+ * path: internal location of the file
+ * url: URL to the source (from parameters)
*/
- public function get_file($filepath, $saveas = '') {
- $this->dropbox->set_access_token($this->access_key, $this->access_secret);
+ public function get_file($reference, $saveas = '') {
+ $reference = unserialize($reference);
+ $this->dropbox->set_access_token($reference->access_key, $reference->access_secret);
$saveas = $this->prepare_file($saveas);
- return $this->dropbox->get_file($filepath, $saveas);
+ return $this->dropbox->get_file($reference->path, $saveas);
}
/**
* Add Plugin settings input to Moodle form
@@ -354,10 +361,13 @@ public function supported_returntypes() {
* @return string file referece
*/
public function get_file_reference($source) {
+ global $USER;
$reference = new stdClass;
$reference->path = $source;
$reference->access_key = get_user_preferences($this->setting.'_access_key', '');
$reference->access_secret = get_user_preferences($this->setting.'_access_secret', '');
+ $reference->userid = $USER->id;
+ $reference->username = fullname($USER);
return serialize($reference);
}
@@ -380,13 +390,13 @@ public function get_file_by_reference($reference) {
$this->set_access_secret($reference->access_secret);
$path = $this->get_file($reference->path);
$cachedfilepath = cache_file::create_from_file($reference, $path['path']);
- }
+ }
if ($cachedfilepath && is_readable($cachedfilepath)) {
return (object)array('filepath' => $cachedfilepath);
} else {
return null;
}
- }
+ }
/**
* Get file from external repository by reference
@@ -399,8 +409,8 @@ public function get_file_by_reference($reference) {
*/
public function cache_file_by_reference($reference, $storedfile) {
$reference = unserialize($reference);
- $path = $this->get_file($reference->path);
- cache_file::create_from_file($reference, $path['path']);
+ $path = $this->get_file($reference);
+ cache_file::create_from_file($reference->path, $path['path']);
}
/**
@@ -412,8 +422,12 @@ public function cache_file_by_reference($reference, $storedfile) {
* @return string
*/
public function get_reference_details($reference, $filestatus = 0) {
+ global $USER;
$ref = unserialize($reference);
$details = $this->get_name();
+ if (isset($ref->userid) && $ref->userid != $USER->id && isset($ref->username)) {
+ $details .= ' ('.$ref->username.')';
+ }
if (isset($ref->path)) {
$details .= ': '. $ref->path;
}
@@ -428,11 +442,12 @@ public function get_reference_details($reference, $filestatus = 0) {
/**
* Return the source information
*
- * @param stdClass $filepath
- * @return string|null
+ * @param string $source
+ * @return string
*/
- public function get_file_source_info($filepath) {
- return 'Dropbox: ' . $filepath;
+ public function get_file_source_info($source) {
+ global $USER;
+ return 'Dropbox ('.fullname($USER).'): ' . $source;
}
/**
@@ -471,10 +486,8 @@ public function cron() {
$cachedfile = cache_file::get($reference);
if ($cachedfile === false) {
// Re-fetch resource.
- $this->set_access_key($reference->access_key);
- $this->set_access_secret($reference->access_secret);
- $path = $this->get_file($reference->path);
- cache_file::create_from_file($reference, $path['path']);
+ $path = $this->get_file($reference);
+ cache_file::create_from_file($reference->path, $path['path']);
}
}
}
View
17 repository/filepicker.php
@@ -282,20 +282,26 @@
if (!$repo->file_is_accessible($fileurl)) {
print_error('storedfilecannotread');
}
+ $record = new stdClass();
+ $reference = $repo->get_file_reference($fileurl);
+
+ $sourcefield = $repo->get_file_source_info($fileurl);
+ $record->source = repository::build_source_field($sourcefield);
// If file is already a reference, set $fileurl = file source, $repo = file repository
// note that in this case user may not have permission to access the source file directly
// so no file_browser/file_info can be used below
if ($repo->has_moodle_files()) {
$file = repository::get_moodle_file($fileurl);
if ($file && $file->is_external_file()) {
- $fileurl = $file->get_reference();
+ $sourcefield = $file->get_source(); // remember the original source
+ $record->source = $repo::build_source_field($sourcefield);
+ $reference = $file->get_reference();
$repo_id = $file->get_repository_id();
$repo = repository::get_repository_by_id($repo_id, $contextid, $repooptions);
}
}
- $record = new stdClass();
$record->filepath = $savepath;
$record->filename = $filename;
$record->component = 'user';
@@ -311,14 +317,11 @@
$record->contextid = $user_context->id;
$record->sortorder = 0;
- $sourcefield = $repo->get_file_source_info($fileurl);
- $record->source = repository::build_source_field($sourcefield);
-
if ($repo->has_moodle_files()) {
- $fileinfo = $repo->copy_to_area($fileurl, $record, $maxbytes);
+ $fileinfo = $repo->copy_to_area($reference, $record, $maxbytes);
redirect($home_url, get_string('downloadsucc', 'repository'));
} else {
- $thefile = $repo->get_file($fileurl, $filename);
+ $thefile = $repo->get_file($reference, $filename);
if (!empty($thefile['path'])) {
$filesize = filesize($thefile['path']);
if ($maxbytes != -1 && $filesize>$maxbytes) {
View
20 repository/lib.php
@@ -1164,9 +1164,8 @@ public function sync_individual_file(stored_file $storedfile) {
/**
* Return human readable reference information
- * {@link stored_file::get_reference()}
*
- * @param string $reference
+ * @param string $reference value of DB field files_reference.reference
* @param int $filestatus status of the file, 0 - ok, 666 - source missing
* @return string
*/
@@ -1258,14 +1257,23 @@ public function get_file_by_reference($reference) {
/**
* Return the source information
*
- * @param stdClass $url
+ * The result of the function is stored in files.source field. It may be analysed
+ * when the source file is lost or repository may use it to display human-readable
+ * location of reference original.
+ *
+ * This method is called when file is picked for the first time only. When file
+ * (either copy or a reference) is already in moodle and it is being picked
+ * again to another file area (also as a copy or as a reference), the value of
+ * files.source is copied.
+ *
+ * @param string $source the value that repository returned in listing as 'source'
* @return string|null
*/
- public function get_file_source_info($url) {
+ public function get_file_source_info($source) {
if ($this->has_moodle_files()) {
- return $this->get_reference_details($url, 0);
+ return $this->get_reference_details($source, 0);
}
- return $url;
+ return $source;
}
/**
View
19 repository/repository_ajax.php
@@ -220,24 +220,27 @@
throw new file_exception('storedfilecannotread');
}
+ // {@link repository::build_source_field()}
+ $sourcefield = $repo->get_file_source_info($source);
+ $record->source = $repo::build_source_field($sourcefield);
+
+ $reference = $repo->get_file_reference($source);
+
// If file is already a reference, set $source = file source, $repo = file repository
// note that in this case user may not have permission to access the source file directly
// so no file_browser/file_info can be used below
if ($repo->has_moodle_files()) {
$file = repository::get_moodle_file($source);
if ($file && $file->is_external_file()) {
- $source = $file->get_reference();
+ $sourcefield = $file->get_source(); // remember the original source
+ $record->source = $repo::build_source_field($sourcefield);
+ $reference = $file->get_reference();
$repo_id = $file->get_repository_id();
$repo = repository::get_repository_by_id($repo_id, $contextid, $repooptions);
}
}
- // {@link repository::build_source_field()}
- $sourcefield = $repo->get_file_source_info($source);
- $record->source = $repo::build_source_field($sourcefield);
-
if ($usefilereference) {
- $reference = $repo->get_file_reference($source);
// get reference life time from repo
$record->referencelifetime = $repo->get_reference_file_lifetime($reference);
// Check if file exists.
@@ -281,13 +284,13 @@
// If the moodle file is an alias we copy this alias, otherwise we copy the file
// {@link repository::copy_to_area()}.
- $fileinfo = $repo->copy_to_area($source, $record, $maxbytes);
+ $fileinfo = $repo->copy_to_area($reference, $record, $maxbytes);
echo json_encode($fileinfo);
die;
} else {
// Download file to moodle.
- $downloadedfile = $repo->get_file($source, $saveas_filename);
+ $downloadedfile = $repo->get_file($reference, $saveas_filename);
if (empty($downloadedfile['path'])) {
$err->error = get_string('cannotdownload', 'repository');
die(json_encode($err));

0 comments on commit 56e7d14

Please sign in to comment.
Something went wrong with that request. Please try again.