From 57d16acd74d778cdc86163df103c7b17d01d51ca Mon Sep 17 00:00:00 2001 From: Ankit Agarwal Date: Fri, 21 Jun 2013 11:51:02 +0800 Subject: [PATCH] MDL-40039 webservices: Add support for alternate to contextid parameter to core_files_external::upload() --- files/externallib.php | 44 ++++++++++++++++++++------------ files/tests/externallib_test.php | 33 ++++++++++++++++++++---- 2 files changed, 55 insertions(+), 22 deletions(-) diff --git a/files/externallib.php b/files/externallib.php index dd221389d12..0b1d9e6f42d 100644 --- a/files/externallib.php +++ b/files/externallib.php @@ -63,7 +63,7 @@ class core_files_external extends external_api { * * @param int $contextid context id * @param int $component component - * @param int $filearea file aera + * @param int $filearea file area * @param int $itemid item id * @param string $filepath file path * @param string $filename file name @@ -206,13 +206,17 @@ class core_files_external extends external_api { public static function upload_parameters() { return new external_function_parameters( array( - 'contextid' => new external_value(PARAM_INT, 'context id'), + 'contextid' => new external_value(PARAM_INT, 'context id', VALUE_DEFAULT, null), 'component' => new external_value(PARAM_COMPONENT, 'component'), 'filearea' => new external_value(PARAM_AREA, 'file area'), 'itemid' => new external_value(PARAM_INT, 'associated id'), 'filepath' => new external_value(PARAM_PATH, 'file path'), 'filename' => new external_value(PARAM_FILE, 'file name'), - 'filecontent' => new external_value(PARAM_TEXT, 'file content') + 'filecontent' => new external_value(PARAM_TEXT, 'file content'), + 'contextlevel' => new external_value(PARAM_ALPHA, 'The context level to put the file in, + (block, course, coursecat, system, user, module)', VALUE_DEFAULT, null), + 'instanceid' => new external_value(PARAM_INT, 'The Instance id of item associated + with the context level', VALUE_DEFAULT, null) ) ); } @@ -220,22 +224,25 @@ class core_files_external extends external_api { /** * Uploading a file to moodle * - * @param int $contextid context id - * @param string $component component - * @param string $filearea file aera - * @param int $itemid item id - * @param string $filepath file path - * @param string $filename file name - * @param string $filecontent file content + * @param int $contextid context id + * @param string $component component + * @param string $filearea file area + * @param int $itemid item id + * @param string $filepath file path + * @param string $filename file name + * @param string $filecontent file content + * @param string $contextlevel Context level (block, course, coursecat, system, user or module) + * @param int $instanceid Instance id of the item associated with the context level * @return array * @since Moodle 2.2 */ - public static function upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent) { + public static function upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent, $contextlevel, $instanceid) { global $USER, $CFG; $fileinfo = self::validate_parameters(self::upload_parameters(), array( - 'contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea, 'itemid'=>$itemid, - 'filepath'=>$filepath, 'filename'=>$filename, 'filecontent'=>$filecontent)); + 'contextid' => $contextid, 'component' => $component, 'filearea' => $filearea, 'itemid' => $itemid, + 'filepath' => $filepath, 'filename' => $filename, 'filecontent' => $filecontent, 'contextlevel' => $contextlevel, + 'instanceid' => $instanceid)); if (!isset($fileinfo['filecontent'])) { throw new moodle_exception('nofile'); @@ -271,12 +278,15 @@ class core_files_external extends external_api { throw new coding_exception('itemid cannot be empty'); } - if (!empty($fileinfo['contextid'])) { - $context = context::instance_by_id($fileinfo['contextid']); - } else { - $context = get_system_context(); + // We need to preserve backword compatibility. Context id is no more a required. + if (empty($fileinfo['contextid'])) { + unset($fileinfo['contextid']); } + // Get and validate context. + $context = self::get_context_from_params($fileinfo); + self::validate_context($context); + if (!($fileinfo['component'] == 'user' and $fileinfo['filearea'] == 'private')) { throw new coding_exception('File can be uploaded to user private area only'); } else { diff --git a/files/tests/externallib_test.php b/files/tests/externallib_test.php index 385aa140cfd..38472be16df 100644 --- a/files/tests/externallib_test.php +++ b/files/tests/externallib_test.php @@ -50,6 +50,8 @@ class test_external_files extends advanced_testcase { $filepath = "/"; $filename = "Simple.txt"; $filecontent = base64_encode("Let us create a nice simple file"); + $contextlevel = null; + $instanceid = null; $browser = get_file_browser(); // Make sure no file exists. @@ -57,7 +59,8 @@ class test_external_files extends advanced_testcase { $this->assertEmpty($file); // Call the api to create a file. - core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent); + core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath, + $filename, $filecontent, $contextlevel, $instanceid); // Make sure the file was created. $file = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, $filename); @@ -70,14 +73,28 @@ class test_external_files extends advanced_testcase { $this->assertEmpty($file); // Call the api to create a file. - $fileinfo = core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent); + $fileinfo = core_files_external::upload($contextid, $component, $filearea, $itemid, + $filepath, $filename, $filecontent, $contextlevel, $instanceid); // Make sure itemid is always set to 0. $this->assertEquals(0, $fileinfo['itemid']); + // Let us try creating a file using contextlevel and instance id. + $itemid = 0; + $filename = "Simple5.txt"; + $contextid = 0; + $contextlevel = "user"; + $instanceid = $USER->id; + $file = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, $filename); + $this->assertEmpty($file); + $fileinfo = core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath, + $filename, $filecontent, $contextlevel, $instanceid); + $this->assertEmpty($file); + // Make sure the same file cannot be created again. $this->setExpectedException("moodle_exception"); - core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent); + core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath, + $filename, $filecontent, $contextlevel, $instanceid); } /* @@ -96,10 +113,13 @@ class test_external_files extends advanced_testcase { $filepath = "/"; $filename = "Simple3.txt"; $filecontent = base64_encode("Let us create a nice simple file"); + $contextlevel = null; + $instanceid = null; // Make sure exception is thrown. $this->setExpectedException("coding_exception"); - core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent); + core_files_external::upload($contextid, $component, $filearea, $itemid, + $filepath, $filename, $filecontent, $contextlevel, $instanceid); } /* @@ -118,10 +138,13 @@ class test_external_files extends advanced_testcase { $filepath = "/"; $filename = "Simple4.txt"; $filecontent = base64_encode("Let us create a nice simple file"); + $contextlevel = null; + $instanceid = null; // Make sure exception is thrown. $this->setExpectedException("coding_exception"); - core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent); + core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath, + $filename, $filecontent, $contextlevel, $instanceid); } } \ No newline at end of file