From c26196587119c2dff954b7692f8a9e9dae6d642d Mon Sep 17 00:00:00 2001 From: Angel Fernando Quiroz Campos Date: Wed, 27 Nov 2019 17:11:20 -0500 Subject: [PATCH] MigrationMoodle: Add task for question categories - refs BT#15992 --- plugin/migrationmoodle/admin.php | 4 + plugin/migrationmoodle/lang/english.php | 1 + .../src/Loader/QuestionCategoriesLoader.php | 40 +++++++++ .../src/Task/QuestionCategoriesTask.php | 62 ++++++++++++++ ...LoadedCourseFromQuestionCategoryLookup.php | 81 +++++++++++++++++++ 5 files changed, 188 insertions(+) create mode 100644 plugin/migrationmoodle/src/Loader/QuestionCategoriesLoader.php create mode 100644 plugin/migrationmoodle/src/Task/QuestionCategoriesTask.php create mode 100644 plugin/migrationmoodle/src/Transformer/Property/LoadedCourseFromQuestionCategoryLookup.php diff --git a/plugin/migrationmoodle/admin.php b/plugin/migrationmoodle/admin.php index 5ac9469f20..836fd55fca 100644 --- a/plugin/migrationmoodle/admin.php +++ b/plugin/migrationmoodle/admin.php @@ -104,6 +104,10 @@ $menu = [ 'action' => 'files_for_quizzes', 'parent' => 21, ], + 23 => [ + 'action' => 'question_categories', + 'parent' => 21, + ], ]; Display::display_header($plugin->get_title()); diff --git a/plugin/migrationmoodle/lang/english.php b/plugin/migrationmoodle/lang/english.php index 5b161c31f6..c562ec04a0 100644 --- a/plugin/migrationmoodle/lang/english.php +++ b/plugin/migrationmoodle/lang/english.php @@ -30,3 +30,4 @@ $strings['CQuizTask'] = 'C Quiz'; $strings['RoleAssignmentsTask'] = 'Role assignments'; $strings['QuizzesTask'] = 'Quizzes'; $strings['FilesForQuizzesTask'] = 'Files for quizzes'; +$strings['QuestionCategoriesTask'] = 'Question categories'; diff --git a/plugin/migrationmoodle/src/Loader/QuestionCategoriesLoader.php b/plugin/migrationmoodle/src/Loader/QuestionCategoriesLoader.php new file mode 100644 index 0000000000..8a10b85830 --- /dev/null +++ b/plugin/migrationmoodle/src/Loader/QuestionCategoriesLoader.php @@ -0,0 +1,40 @@ +name = $incomingData['name']; + $category->description = $incomingData['description']; + + $id = $category->save($incomingData['c_id']); + + if (false === $id) { + throw new \Exception("The quiz category \"{$incomingData['name']}\" already exists."); + } + + return $id; + } +} diff --git a/plugin/migrationmoodle/src/Task/QuestionCategoriesTask.php b/plugin/migrationmoodle/src/Task/QuestionCategoriesTask.php new file mode 100644 index 0000000000..e7e222308c --- /dev/null +++ b/plugin/migrationmoodle/src/Task/QuestionCategoriesTask.php @@ -0,0 +1,62 @@ + BaseExtractor::class, + 'query' => "SELECT qc.id, qc.name, qc.info, c.contextlevel, c.instanceid + FROM mdl_question_categories qc + INNER JOIN mdl_context c ON qc.contextid = c.id + WHERE c.contextlevel IN (50, 70) + AND qc.parent != 0", + ]; + } + + /** + * @return array + */ + public function getTransformConfiguration() + { + return [ + 'class' => BaseTransformer::class, + 'map' => [ + 'c_id' => [ + 'class' => LoadedCourseFromQuestionCategoryLookup::class, + 'properties' => ['contextlevel', 'instanceid'] + ], + 'name' => 'name', + 'description' => 'info', + ], + ]; + } + + /** + * @return array + */ + public function getLoadConfiguration() + { + return [ + 'class' => QuestionCategoriesLoader::class, + ]; + } +} diff --git a/plugin/migrationmoodle/src/Transformer/Property/LoadedCourseFromQuestionCategoryLookup.php b/plugin/migrationmoodle/src/Transformer/Property/LoadedCourseFromQuestionCategoryLookup.php new file mode 100644 index 0000000000..03c3277b52 --- /dev/null +++ b/plugin/migrationmoodle/src/Transformer/Property/LoadedCourseFromQuestionCategoryLookup.php @@ -0,0 +1,81 @@ +searchInModuleContext($instanceId); + break; + } + + if (empty($mCourseId)) { + throw new \Exception("Course not found for context $instanceId with level $contextLevel"); + } + + return parent::transform([$mCourseId]); + } + + /** + * @param int $instanceId + * + * @throws \Exception + * + * @return int + */ + private function searchInModuleContext($instanceId) + { + try { + $connection = \MigrationMoodlePlugin::create()->getConnection(); + } catch (DBALException $e) { + throw new \Exception('Unable to start connection.', 0, $e); + } + + $query = "SELECT course FROM mdl_course_modules WHERE id = ?"; + + try { + $statement = $connection->executeQuery($query, [$instanceId]); + } catch (DBALException $e) { + throw new \Exception("Unable to execute query \"$query\".", 0, $e); + } + + $result = $statement->fetch(FetchMode::ASSOCIATIVE); + + $connection->close(); + + if (false === $result) { + return 0; + } + + return (int) $result['course']; + } +}