From cb4d9cdcb637996907ab0206494969e3f370dd02 Mon Sep 17 00:00:00 2001 From: Sara Arjona Date: Mon, 6 Nov 2023 14:04:03 +0100 Subject: [PATCH] MDL-74129 h5p: Preserve metadata information The metadata information was not restored when an H5P file was uploaded (it was saved when it was edited directly from the Content bank, but the original information in the H5P file was lost). This patch includes all the metadata fields and its values in the original H5P file to preserve this information too. --- h5p/classes/framework.php | 7 +++ h5p/classes/helper.php | 26 +++++++++ h5p/tests/fixtures/guess-the-answer.h5p | Bin 881604 -> 903352 bytes h5p/tests/framework_test.php | 51 ++++++++++++++++++ h5p/tests/helper_test.php | 50 +++++++++++++++++ .../tests/behat/add_h5pactivity.feature | 21 +++++--- 6 files changed, 149 insertions(+), 6 deletions(-) diff --git a/h5p/classes/framework.php b/h5p/classes/framework.php index 33cba574f32..10e7c32d77d 100644 --- a/h5p/classes/framework.php +++ b/h5p/classes/framework.php @@ -907,6 +907,13 @@ class framework implements H5PFrameworkInterface { $params->title = $content['title']; $content['params'] = json_encode($params); } + // Add metadata to 'params'. + if (!empty($content['metadata'])) { + $params = json_decode($content['params']); + $params->metadata = $content['metadata']; + $content['params'] = json_encode($params); + } + $data = [ 'jsoncontent' => $content['params'], 'displayoptions' => $content['disable'], diff --git a/h5p/classes/helper.php b/h5p/classes/helper.php index 72da2fc8799..df5789863f1 100644 --- a/h5p/classes/helper.php +++ b/h5p/classes/helper.php @@ -66,6 +66,32 @@ class helper { if (!empty($h5pvalidator->h5pC->mainJsonData['title'])) { $content['title'] = $h5pvalidator->h5pC->mainJsonData['title']; } + + // If exists, add the metadata from 'h5p.json' to avoid loosing this information. + $data = $h5pvalidator->h5pC->mainJsonData; + if (!empty($data)) { + // The metadata fields are defined in 'joubel/core/h5p-metadata.class.php'. + $metadatafields = [ + 'title', + 'a11yTitle', + 'changes', + 'authors', + 'source', + 'license', + 'licenseVersion', + 'licenseExtras', + 'authorComments', + 'yearFrom', + 'yearTo', + 'defaultLanguage', + ]; + $content['metadata'] = array_reduce($metadatafields, function ($array, $field) use ($data) { + if (array_key_exists($field, $data)) { + $array[$field] = $data[$field]; + } + return $array; + }, []); + } $h5pstorage->savePackage($content, null, $skipcontent, $options); return $h5pstorage->contentId; diff --git a/h5p/tests/fixtures/guess-the-answer.h5p b/h5p/tests/fixtures/guess-the-answer.h5p index e33f3cbe6c967e36708efde2e2f8239b6325cc6c..3ca4d1cb6ead679b40d57247d121ccfde6e4471a 100644 GIT binary patch delta 42219 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νiqMa+ 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['disable'], $h5pcontent->displayoptions); } + /** + * Test the behaviour of updateContent() with metadata. + * + * @covers ::updateContent + */ + public function test_updateContent_withmetadata(): void { + global $DB; + + $this->resetAfterTest(); + + /** @var \core_h5p_generator $generator */ + $generator = $this->getDataGenerator()->get_plugin_generator('core_h5p'); + + // Create a library record. + $lib = $generator->create_library_record('TestLibrary', 'Test', 1, 1, 2); + + // Create an h5p content with 'TestLibrary' as it's main library. + $contentid = $generator->create_h5p_record($lib->id); + + $params = ['param2' => 'Test2']; + $metadata = [ + 'license' => 'CC BY', + 'licenseVersion' => '4.0', + 'yearFrom' => 2000, + 'yearTo' => 2023, + 'defaultLanguage' => 'ca', + ]; + $content = [ + 'id' => $contentid, + 'params' => json_encode($params), + 'library' => [ + 'libraryId' => $lib->id, + ], + 'disable' => 8, + 'metadata' => $metadata, + ]; + + // Update the h5p content. + $this->framework->updateContent($content); + + $h5pcontent = $DB->get_record('h5p', ['id' => $contentid]); + + // Make sure the h5p content was properly updated. + $this->assertNotEmpty($h5pcontent); + $this->assertNotEmpty($h5pcontent->pathnamehash); + $this->assertNotEmpty($h5pcontent->contenthash); + $this->assertEquals(json_encode(array_merge($params, ['metadata' => $metadata])), $h5pcontent->jsoncontent); + $this->assertEquals($content['library']['libraryId'], $h5pcontent->mainlibraryid); + $this->assertEquals($content['disable'], $h5pcontent->displayoptions); + } + /** * Test the behaviour of saveLibraryDependencies(). */ diff --git a/h5p/tests/helper_test.php b/h5p/tests/helper_test.php index 2f47bcd5313..66be51cd030 100644 --- a/h5p/tests/helper_test.php +++ b/h5p/tests/helper_test.php @@ -200,6 +200,56 @@ class helper_test extends \advanced_testcase { $this->assertStringContainsString('Hello world!', $h5p->jsoncontent); } + /** + * Test the behaviour of save_h5p() when the H5P file contains metadata. + * + * @runInSeparateProcess + * @covers ::save_h5p + */ + public function test_save_h5p_metadata(): void { + global $DB; + + $this->resetAfterTest(); + $factory = new \core_h5p\factory(); + + // Create a user. + $user = $this->getDataGenerator()->create_user(); + $this->setUser($user); + + // This is a valid .H5P file. + $path = __DIR__ . '/fixtures/guess-the-answer.h5p'; + $file = helper::create_fake_stored_file_from_path($path, (int)$user->id); + $factory->get_framework()->set_file($file); + + $config = (object)[ + 'frame' => 1, + 'export' => 1, + 'embed' => 0, + 'copyright' => 1, + ]; + // The required libraries exist in the system before saving the .h5p file. + $generator = $this->getDataGenerator()->get_plugin_generator('core_h5p'); + $lib = $generator->create_library_record('H5P.GuessTheAnswer', 'Guess the Answer', 1, 5); + $generator->create_library_record('H5P.Image', 'Image', 1, 1); + $generator->create_library_record('FontAwesome', 'Font Awesome', 4, 5); + $h5pid = helper::save_h5p($factory, $file, $config); + $this->assertNotEmpty($h5pid); + + // No errors are raised. + $errors = $factory->get_framework()->getMessages('error'); + $this->assertCount(0, $errors); + + // And the content in the .h5p file has been saved as expected. + $h5p = $DB->get_record('h5p', ['id' => $h5pid]); + $this->assertEquals($lib->id, $h5p->mainlibraryid); + $this->assertEquals(helper::get_display_options($factory->get_core(), $config), $h5p->displayoptions); + $this->assertStringContainsString('Which fruit is this?', $h5p->jsoncontent); + // Metadata has been also saved. + $this->assertStringContainsString('This is licence extras information added for testing purposes.', $h5p->jsoncontent); + $this->assertStringContainsString('H5P Author', $h5p->jsoncontent); + $this->assertStringContainsString('Add metadata information', $h5p->jsoncontent); + } + /** * Test the behaviour of save_h5p() when the .h5p file is invalid. * @runInSeparateProcess diff --git a/mod/h5pactivity/tests/behat/add_h5pactivity.feature b/mod/h5pactivity/tests/behat/add_h5pactivity.feature index ca2570a825b..c4c8bec2d83 100644 --- a/mod/h5pactivity/tests/behat/add_h5pactivity.feature +++ b/mod/h5pactivity/tests/behat/add_h5pactivity.feature @@ -21,7 +21,7 @@ Feature: Add H5P activity And I am on "Course 1" course homepage with editing mode on @javascript - Scenario: Add a h5pactivity activity to a course + Scenario: Add an h5pactivity to a course Given the following "activity" exists: | activity | h5pactivity | | course | C1 | @@ -38,7 +38,7 @@ Feature: Add H5P activity And I should not see "Embed" @javascript - Scenario: Add a h5pactivity activity with download + Scenario: Add an h5pactivity with download display option Given the following "activity" exists: | activity | h5pactivity | | course | C1 | @@ -53,7 +53,7 @@ Feature: Add H5P activity And I should not see "Embed" @javascript - Scenario: Add a h5pactivity activity with embed + Scenario: Add an h5pactivity with embed display option Given the following "activity" exists: | activity | h5pactivity | | course | C1 | @@ -68,22 +68,31 @@ Feature: Add H5P activity And I should see "Embed" @javascript - Scenario: Add a h5pactivity activity with copyright + Scenario: Add an h5pactivity with copyright display option using a content with copyright Given the following "activity" exists: | activity | h5pactivity | | course | C1 | | name | Awesome H5P package | | displayoptions | 6 | | packagefilepath | h5p/tests/fixtures/guess-the-answer.h5p | + And I change window size to "large" When I am on the "Awesome H5P package" "h5pactivity activity" page Then I switch to "h5p-player" class iframe And I switch to "h5p-iframe" class iframe And "Reuse" "text" should not exist in the ".h5p-actions" "css_element" And I should see "Rights of use" And I should not see "Embed" + And I click on "Rights of use" "button" in the ".h5p-actions" "css_element" + And I should see "Fruits" + And I should see "Attribution (CC BY) 4.0 International (CC BY 4.0)" + And I should see "H5P Author" + And I should see "https://h5p.org (Originator)" + And I should see "2000-2023" + And I should see "This is licence extras information added for testing purposes." + And I should see "Add metadata information, Another user, 01-11-23" @javascript - Scenario: Add a h5pactivity activity with copyright in a content without copyright + Scenario: Add an h5pactivity with copyright display option using a content without copyright Given the following "activity" exists: | activity | h5pactivity | | course | C1 | @@ -98,7 +107,7 @@ Feature: Add H5P activity And I should not see "Embed" @javascript - Scenario: Add a h5pactivity activity to a course with all display options enabled + Scenario: Add an h5pactivity with all display options enabled Given the following "activity" exists: | activity | h5pactivity | | course | C1 |