MDL-58399 webservice: Return additional file fields for repositories

We should be detecting when we are treating files that are linked to
external repositories.
For doing that we'd need to return some additional fields via Web
Services:
- isexternalfile
- mimetype (google docs files use an special one)
- repositorytype (the repository plugin name)
This commit is contained in:
Juan Leyva 2017-03-27 14:20:37 +02:00
parent 216ea39be7
commit 1104a9fa44
11 changed files with 70 additions and 1 deletions

View File

@ -363,6 +363,11 @@ class core_course_external extends external_api {
'timecreated' => new external_value(PARAM_INT, 'Time created'),
'timemodified' => new external_value(PARAM_INT, 'Time modified'),
'sortorder' => new external_value(PARAM_INT, 'Content sort order'),
'mimetype' => new external_value(PARAM_RAW, 'File mime type.', VALUE_OPTIONAL),
'isexternalfile' => new external_value(PARAM_BOOL, 'Whether is an external file.',
VALUE_OPTIONAL),
'repositorytype' => new external_value(PARAM_PLUGIN, 'The repository type for external files.',
VALUE_OPTIONAL),
// copyright related info
'userid' => new external_value(PARAM_INT, 'User who added this content to moodle'),

View File

@ -1309,6 +1309,10 @@ class external_util {
$file['mimetype'] = $areafile->get_mimetype();
$file['filesize'] = $areafile->get_filesize();
$file['timemodified'] = $areafile->get_timemodified();
$file['isexternalfile'] = $areafile->is_external_file();
if ($file['isexternalfile']) {
$file['repositorytype'] = $areafile->get_repository_type();
}
$fileitemid = $useitemidinurl ? $areafile->get_itemid() : null;
$file['fileurl'] = moodle_url::make_webservice_pluginfile_url($contextid, $component, $filearea,
$fileitemid, $areafile->get_filepath(), $areafile->get_filename())->out(false);
@ -1345,6 +1349,8 @@ class external_files extends external_multiple_structure {
'fileurl' => new external_value(PARAM_URL, 'Downloadable file url.', VALUE_OPTIONAL),
'timemodified' => new external_value(PARAM_INT, 'Time modified.', VALUE_OPTIONAL),
'mimetype' => new external_value(PARAM_RAW, 'File mime type.', VALUE_OPTIONAL),
'isexternalfile' => new external_value(PARAM_BOOL, 'Whether is an external file.', VALUE_OPTIONAL),
'repositorytype' => new external_value(PARAM_PLUGIN, 'The repository type for external files.', VALUE_OPTIONAL),
),
'File.'
),
@ -1397,6 +1403,18 @@ class external_files extends external_multiple_structure {
'optional' => true,
'null' => NULL_NOT_ALLOWED,
),
'isexternalfile' => array(
'type' => PARAM_BOOL,
'description' => 'Whether is an external file.',
'optional' => true,
'null' => NULL_NOT_ALLOWED,
),
'repositorytype' => array(
'type' => PARAM_PLUGIN,
'description' => 'The repository type for the external files.',
'optional' => true,
'null' => NULL_ALLOWED,
),
];
}
}

View File

@ -806,6 +806,22 @@ class stored_file {
}
}
/**
* Returns repository type.
*
* @return mixed str|null the repository type or null if is not an external file
* @since Moodle 3.3
*/
public function get_repository_type() {
if (!empty($this->repository)) {
return $this->repository->get_typename();
} else {
return null;
}
}
/**
* get reference file id
* @return int

View File

@ -510,6 +510,7 @@ class core_externallib_testcase extends advanced_testcase {
'timemodified' => $timemodified,
'filesize' => $filesize,
'mimetype' => 'text/plain',
'isexternalfile' => false,
);
// Get all the files for the area.
$files = external_util::get_area_files($context, $component, $filearea, false);
@ -529,7 +530,8 @@ class core_externallib_testcase extends advanced_testcase {
$description = new external_files();
// First check that the expected default values and keys are returned.
$expectedkeys = array_flip(array('filename', 'filepath', 'filesize', 'fileurl', 'timemodified', 'mimetype'));
$expectedkeys = array_flip(array('filename', 'filepath', 'filesize', 'fileurl', 'timemodified', 'mimetype',
'isexternalfile', 'repositorytype'));
$returnedkeys = array_flip(array_keys($description->content->keys));
$this->assertEquals($expectedkeys, $returnedkeys);
$this->assertEquals('List of files.', $description->desc);

View File

@ -584,6 +584,11 @@ function book_export_contents($cm, $baseurl) {
$file['userid'] = $fileinfo->get_userid();
$file['author'] = $fileinfo->get_author();
$file['license'] = $fileinfo->get_license();
$file['mimetype'] = $fileinfo->get_mimetype();
$file['isexternalfile'] = $fileinfo->is_external_file();
if ($file['isexternalfile']) {
$file['repositorytype'] = $fileinfo->get_repository_type();
}
$contents[] = $file;
}
}

View File

@ -317,6 +317,11 @@ function folder_export_contents($cm, $baseurl) {
$file['userid'] = $fileinfo->get_userid();
$file['author'] = $fileinfo->get_author();
$file['license'] = $fileinfo->get_license();
$file['mimetype'] = $fileinfo->get_mimetype();
$file['isexternalfile'] = $fileinfo->is_external_file();
if ($file['isexternalfile']) {
$file['repositorytype'] = $fileinfo->get_repository_type();
}
$contents[] = $file;
}

View File

@ -323,6 +323,7 @@ class mod_forum_external_testcase extends externallib_advanced_testcase {
$discussion1reply1->id, '/', $filename),
'timemodified' => $timepost,
'mimetype' => 'image/jpeg',
'isexternalfile' => false,
)
),
'totalscore' => $discussion1reply1->totalscore,

View File

@ -411,6 +411,11 @@ function imscp_export_contents($cm, $baseurl) {
$file['userid'] = $fileinfo->get_userid();
$file['author'] = $fileinfo->get_author();
$file['license'] = $fileinfo->get_license();
$file['mimetype'] = $fileinfo->get_mimetype();
$file['isexternalfile'] = $fileinfo->is_external_file();
if ($file['isexternalfile']) {
$file['repositorytype'] = $fileinfo->get_repository_type();
}
$contents[] = $file;
}

View File

@ -415,6 +415,11 @@ function page_export_contents($cm, $baseurl) {
$file['userid'] = $fileinfo->get_userid();
$file['author'] = $fileinfo->get_author();
$file['license'] = $fileinfo->get_license();
$file['mimetype'] = $fileinfo->get_mimetype();
$file['isexternalfile'] = $fileinfo->is_external_file();
if ($file['isexternalfile']) {
$file['repositorytype'] = $fileinfo->get_repository_type();
}
$contents[] = $file;
}

View File

@ -449,6 +449,11 @@ function resource_export_contents($cm, $baseurl) {
$file['userid'] = $fileinfo->get_userid();
$file['author'] = $fileinfo->get_author();
$file['license'] = $fileinfo->get_license();
$file['mimetype'] = $fileinfo->get_mimetype();
$file['isexternalfile'] = $fileinfo->is_external_file();
if ($file['isexternalfile']) {
$file['repositorytype'] = $fileinfo->get_repository_type();
}
$contents[] = $file;
}

View File

@ -1074,6 +1074,7 @@ class mod_wiki_external_testcase extends externallib_advanced_testcase {
'filename' => $file['filename'],
'filepath' => $file['filepath'],
'mimetype' => 'image/jpeg',
'isexternalfile' => false,
'filesize' => strlen($content),
'timemodified' => $file['timemodified'],
'fileurl' => moodle_url::make_webservice_pluginfile_url($file['contextid'], $file['component'],
@ -1128,6 +1129,7 @@ class mod_wiki_external_testcase extends externallib_advanced_testcase {
'filename' => $file['filename'],
'filepath' => $file['filepath'],
'mimetype' => 'image/jpeg',
'isexternalfile' => false,
'filesize' => strlen($content),
'timemodified' => $file['timemodified'],
'fileurl' => moodle_url::make_webservice_pluginfile_url($file['contextid'], $file['component'],