diff --git a/course/externallib.php b/course/externallib.php index 27d2629f990..3e8744cc99d 100644 --- a/course/externallib.php +++ b/course/externallib.php @@ -318,7 +318,28 @@ class core_course_external extends external_api { require_once($CFG->dirroot . '/mod/' . $cm->modname . '/lib.php'); $getcontentfunction = $cm->modname.'_export_contents'; if (function_exists($getcontentfunction)) { - if (empty($filters['excludecontents']) and $contents = $getcontentfunction($cm, $baseurl)) { + $contents = $getcontentfunction($cm, $baseurl); + $module['contentsinfo'] = array( + 'filescount' => count($contents), + 'filessize' => 0, + 'lastmodified' => 0, + 'mimetypes' => array(), + ); + foreach ($contents as $content) { + if (isset($content['filesize'])) { + $module['contentsinfo']['filessize'] += $content['filesize']; + } + if (isset($content['timemodified']) && + ($content['timemodified'] > $module['contentsinfo']['lastmodified'])) { + + $module['contentsinfo']['lastmodified'] = $content['timemodified']; + } + if (isset($content['mimetype'])) { + $module['contentsinfo']['mimetypes'][$content['mimetype']] = $content['mimetype']; + } + } + + if (empty($filters['excludecontents']) and !empty($contents)) { $module['contents'] = $contents; } else { $module['contents'] = array(); @@ -470,7 +491,18 @@ class core_course_external extends external_api { 'license' => new external_value(PARAM_TEXT, 'Content license'), ) ), VALUE_DEFAULT, array() - ) + ), + 'contentsinfo' => new external_single_structure( + array( + 'filescount' => new external_value(PARAM_INT, 'Total number of files.'), + 'filessize' => new external_value(PARAM_INT, 'Total files size.'), + 'lastmodified' => new external_value(PARAM_INT, 'Last time files were modified.'), + 'mimetypes' => new external_multiple_structure( + new external_value(PARAM_RAW, 'File mime type.'), + 'Files mime types.' + ), + ), 'Contents summary information.', VALUE_OPTIONAL + ), ) ), 'list of module' ) diff --git a/course/tests/externallib_test.php b/course/tests/externallib_test.php index 7520c64ca5a..ad77f90a026 100644 --- a/course/tests/externallib_test.php +++ b/course/tests/externallib_test.php @@ -1264,6 +1264,58 @@ class core_course_externallib_testcase extends externallib_advanced_testcase { $this->assertEquals('text/plain', $customdata['filedetails']['mimetype']); } + /** + * Test contents info is returned. + */ + public function test_get_course_contents_contentsinfo() { + global $USER; + + $this->resetAfterTest(true); + + $this->setAdminUser(); + $course = self::getDataGenerator()->create_course(); + + $record = new stdClass(); + $record->course = $course->id; + // One resource with one file. + $resource1 = self::getDataGenerator()->create_module('resource', $record); + + $timenow = time(); + // More type of files. + $record->files = file_get_unused_draft_itemid(); + $usercontext = context_user::instance($USER->id); + $extensions = array('txt', 'png', 'pdf'); + foreach ($extensions as $key => $extension) { + // Add actual file there. + $filerecord = array('component' => 'user', 'filearea' => 'draft', + 'contextid' => $usercontext->id, 'itemid' => $record->files, + 'filename' => 'resource' . $key . '.' . $extension, 'filepath' => '/'); + $fs = get_file_storage(); + $fs->create_file_from_string($filerecord, 'Test resource ' . $key . ' file'); + } + + $resource2 = self::getDataGenerator()->create_module('resource', $record); + + $result = core_course_external::get_course_contents($course->id); + $result = external_api::clean_returnvalue(core_course_external::get_course_contents_returns(), $result); + $this->assertCount(2, $result[0]['modules']); + foreach ($result[0]['modules'] as $module) { + if ($module['instance'] == $resource1->id) { + $this->assertEquals(1, $module['contentsinfo']['filescount']); + $this->assertGreaterThanOrEqual($timenow, $module['contentsinfo']['lastmodified']); + $this->assertEquals($module['contents'][0]['filesize'], $module['contentsinfo']['filessize']); + $this->assertEquals(array('text/plain'), $module['contentsinfo']['mimetypes']); + } else { + $this->assertEquals(count($extensions), $module['contentsinfo']['filescount']); + $filessize = $module['contents'][0]['filesize'] + $module['contents'][1]['filesize'] + + $module['contents'][2]['filesize']; + $this->assertEquals($filessize, $module['contentsinfo']['filessize']); + $this->assertGreaterThanOrEqual($timenow, $module['contentsinfo']['lastmodified']); + $this->assertEquals(array('text/plain', 'image/png', 'application/pdf'), $module['contentsinfo']['mimetypes']); + } + } + } + /** * Test duplicate_course */ diff --git a/course/upgrade.txt b/course/upgrade.txt index f23582e251b..efa1b2f604d 100644 --- a/course/upgrade.txt +++ b/course/upgrade.txt @@ -2,8 +2,10 @@ This files describes API changes in /course/*, information provided here is intended especially for developers. === 3.7 === + * External function core_course_external::get_course_contents new returns the following additional completiondata field: - valueused (indicates whether the completion state affects the availability of other content) + * External function core_course_external::get_course_contents now returns a new contentsinfo field with summary files information. === 3.6 ===