MigrationMoodle: Add task for question attempts - refs BT#15992

pull/3127/head
Angel Fernando Quiroz Campos 6 years ago
parent f3eeb5e381
commit c2d0ab6a19
  1. 1
      plugin/migrationmoodle/admin.php
  2. 1
      plugin/migrationmoodle/lang/english.php
  3. 30
      plugin/migrationmoodle/src/Loader/UserQuestionAttemptLoader.php
  4. 112
      plugin/migrationmoodle/src/Task/UserQuestionAttemptsTask.php
  5. 22
      plugin/migrationmoodle/src/Transformer/Property/LoadedUserQuizLookup.php
  6. 45
      plugin/migrationmoodle/src/Transformer/Property/UserQuestionAnswer.php

@ -106,6 +106,7 @@ $menu = [
],
'users_learn_paths_quizzes' => [
'users_quizzes_attempts',
'user_question_attempts',
],
];

@ -65,3 +65,4 @@ $strings['UsersLearnPathsLessonBranchTask'] = 'Lesson branch to total time in le
$strings['UsersLearnPathsLessonAttemptsTask'] = 'Lesson attempts to total time in learn paths quizzes';
$strings['UsersLearnPathsQuizzesTask'] = 'Quizzes attempts to learn paths quizzes attempts';
$strings['UsersQuizzesAttemptsTask'] = 'Quiz attempts of users';
$strings['UserQuestionAttemptsTask'] = 'Question attempts of users';

@ -0,0 +1,30 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\MigrationMoodle\Loader;
use Chamilo\PluginBundle\MigrationMoodle\Interfaces\LoaderInterface;
/**
* Class UserQuestionAttemptLoader.
*
* @package Chamilo\PluginBundle\MigrationMoodle\Loader
*/
class UserQuestionAttemptLoader implements LoaderInterface
{
/**
* @inheritDoc
*/
public function load(array $incomingData)
{
$incomingData['marks'] = (float) $incomingData['marks'];
$incomingData['teacher_comment'] = '';
$incomingData['tms'] = $incomingData['tms']->format('Y-m-d H:i:s');
$incomingData['position'] = 0;
return \Database::insert(
\Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT),
$incomingData
);
}
}

@ -0,0 +1,112 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\MigrationMoodle\Task;
use Chamilo\PluginBundle\MigrationMoodle\Extractor\LoadedUsersFilterExtractor;
use Chamilo\PluginBundle\MigrationMoodle\Loader\UserQuestionAttemptLoader;
use Chamilo\PluginBundle\MigrationMoodle\Transformer\BaseTransformer;
use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\DateTimeObject;
use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedCourseLookup;
use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedQuestionLookup;
use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedUserLookup;
use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedUserQuizLookup;
use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedUserSessionLookup;
use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\UserQuestionAnswer;
/**
* Class UserQuestionAttemptsTask.
*
* @package Chamilo\PluginBundle\MigrationMoodle\Task
*/
class UserQuestionAttemptsTask extends BaseTask
{
/**
* @inheritDoc
*/
public function getExtractConfiguration()
{
$userFilter = $this->plugin->getUserFilterSetting();
$userFilterCondition = !empty($userFilter) ? "AND u.username LIKE '$userFilter%'" : '';
return [
'class' => LoadedUsersFilterExtractor::class,
'query' => "SELECT
qqa.id,
qa.userid,
qa.id quiz_attempt,
qqa.questionid,
qqa.rightanswer,
qqa.responsesummary,
qqa.timemodified,
qqas.fraction,
q.course,
qq.defaultmark,
qq.qtype
FROM mdl_question_attempts qqa
INNER JOIN mdl_quiz_attempts qa ON qqa.questionusageid = qa.uniqueid
INNER JOIN mdl_question_attempt_steps qqas
ON (qqa.id = qqas.questionattemptid AND qa.userid = qqas.userid)
INNER JOIN mdl_question_attempt_step_data qqasd ON qqas.id = qqasd.attemptstepid
INNER JOIN mdl_question qq ON (qqa.questionid = qq.id)
INNER JOIN mdl_quiz q ON (qa.quiz = q.id)
INNER JOIN mdl_user u ON (qqas.userid = u.id)
WHERE qqas.state NOT IN ('todo', 'complete')
AND (qqasd.name = '-finish' AND qqasd.value = 1)
$userFilterCondition
ORDER BY qa.userid, qa.quiz, qqa.slot",
];
}
/**
* @inheritDoc
*/
public function getTransformConfiguration()
{
return [
'class' => BaseTransformer::class,
'map' => [
'exe_id' => [
'class' => LoadedUserQuizLookup::class,
'properties' => ['quiz_attempt'],
],
'user_id' => [
'class' => LoadedUserLookup::class,
'properties' => ['userid'],
],
'question_id' => [
'class' => LoadedQuestionLookup::class,
'properties' => ['questionid'],
],
'answer' => [
'class' => UserQuestionAnswer::class,
'properties' => ['qtype', 'rightanswer', 'responsesummary', 'fraction', 'defaultmark'],
],
'marks' => 'fraction',
'c_id' => [
'class' => LoadedCourseLookup::class,
'properties' => ['course'],
],
'tms' => [
'class' => DateTimeObject::class,
'properties' => ['timemodified'],
],
'session_id' => [
'class' => LoadedUserSessionLookup::class,
'properties' => ['userid'],
],
],
];
}
/**
* @inheritDoc
*/
public function getLoadConfiguration()
{
return [
'class' => UserQuestionAttemptLoader::class,
];
}
}

@ -0,0 +1,22 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\MigrationMoodle\Transformer\Property;
use Chamilo\PluginBundle\MigrationMoodle\Task\UsersQuizzesAttemptsTask;
/**
* Class LoadedUserQuizLookup.
*
* @package Chamilo\PluginBundle\MigrationMoodle\Transformer\Property
*/
class LoadedUserQuizLookup extends LoadedKeyLookup
{
/**
* LoadedUserQuizLookup constructor.
*/
public function __construct()
{
$this->calledClass = UsersQuizzesAttemptsTask::class;
}
}

@ -0,0 +1,45 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\MigrationMoodle\Transformer\Property;
use Chamilo\PluginBundle\MigrationMoodle\Interfaces\TransformPropertyInterface;
use Chamilo\PluginBundle\MigrationMoodle\Loader\LessonAnswersShortAnswerLoader;
/**
* Class UserQuestionAnswer.
*
* @package Chamilo\PluginBundle\MigrationMoodle\Transformer\Property
*/
class UserQuestionAnswer implements TransformPropertyInterface
{
/**
* @inheritDoc
*/
public function transform(array $data)
{
list($mQType, $mRightAnswer, $mResponseSummary, $mFraction, $mDefaultMark) = array_values($data);
switch ($mQType) {
case 'shortanswer':
return $this->showAnswer($mRightAnswer, $mResponseSummary, $mFraction, $mDefaultMark);
default:
return '';
}
}
/**
* @param string $mRightAnswer
* @param string $mResponseSummary
* @param float $mFraction
* @param float $mDefaultMark
*
* @return string
*/
private function showAnswer($mRightAnswer, $mResponseSummary, $mFraction, $mDefaultMark)
{
$width = LessonAnswersShortAnswerLoader::INPUT_WIDTH;
return "[$mRightAnswer][$mResponseSummary][$mFraction]::$mDefaultMark:$width:0@";
}
}
Loading…
Cancel
Save