Merge branch 'master' of git.beeznest.com:minedu-chamilo

skala
Julio Montoya 12 years ago
commit 8cb86f0fb8
  1. 27
      main/exercice/exercise.class.php
  2. 4
      main/exercice/exercise.lib.php
  3. 7
      main/exercice/testcategory.class.php
  4. 2
      main/inc/lib/events.lib.inc.php
  5. 19
      main/inc/lib/exercise.lib.php
  6. 6
      src/ChamiloLMS/Transaction/Envelope.php
  7. 32
      src/ChamiloLMS/Transaction/ExerciseAttemptTransactionLog.php
  8. 2
      src/ChamiloLMS/Transaction/TransactionLogController.php

@ -163,9 +163,10 @@ class Exercise
* @todo use Doctrine to manage read/writes * @todo use Doctrine to manage read/writes
* @param int $id - exercise ID * @param int $id - exercise ID
* @param bool parse exercise question list * @param bool parse exercise question list
* @param int $chamilo_session_id - chamilo session ID
* @return boolean - true if exercise exists, otherwise false * @return boolean - true if exercise exists, otherwise false
*/ */
public function read($id, $parseQuestionList = true) public function read($id, $parseQuestionList = true, $chamilo_session_id = null)
{ {
if (empty($this->course_id)) { if (empty($this->course_id)) {
return false; return false;
@ -243,7 +244,7 @@ class Exercise
$this->trackExercise = $this->getStatTrackExerciseInfo(); $this->trackExercise = $this->getStatTrackExerciseInfo();
if ($parseQuestionList) { if ($parseQuestionList) {
$this->setQuestionList($this->loadDistributions); $this->setQuestionList($this->loadDistributions, $chamilo_session_id);
} }
return true; return true;
} }
@ -849,7 +850,8 @@ class Exercise
$questionsPerMainCategory = array(); $questionsPerMainCategory = array();
foreach ($temp_question_list as $categoryId => $questionList) { foreach ($temp_question_list as $categoryId => $questionList) {
$parentId = $categoriesAddedInExercise[$categoryId]['parent_id']; $parentId = $categoriesAddedInExercise[$categoryId]['parent_id'];
$cat = new Testcategory(); // Default values and the course_id passed.
$cat = new Testcategory(0, '', '', 0, 'simple', $this->course_id);
$cat->getCategory($parentId); $cat->getCategory($parentId);
if (!isset($questionsPerMainCategory[$cat->parent_id])) { if (!isset($questionsPerMainCategory[$cat->parent_id])) {
@ -885,8 +887,8 @@ class Exercise
'category_with_questions_list' => array() 'category_with_questions_list' => array()
); );
// Order/random categories // Order/random categories. Default values and the course_id passed.
$cat = new Testcategory(); $cat = new Testcategory(0, '', '', 0, 'simple', $this->course_id);
$courseId = $this->course_id; $courseId = $this->course_id;
@ -1047,7 +1049,8 @@ class Exercise
if (!empty($questions_by_category)) { if (!empty($questions_by_category)) {
foreach ($questions_by_category as $categoryId => $questionList) { foreach ($questions_by_category as $categoryId => $questionList) {
$cat = new Testcategory($categoryId); // Default values and the course_id passed.
$cat = new Testcategory($categoryId, '', '', 0, 'simple', $this->course_id);
$cat = (array)$cat; $cat = (array)$cat;
$cat['iid'] = $cat['id']; $cat['iid'] = $cat['id'];
$cat['name'] = $cat['title']; $cat['name'] = $cat['title'];
@ -2968,7 +2971,8 @@ class Exercise
$safe_lp_item_id = 0, $safe_lp_item_id = 0,
$safe_lp_item_view_id = 0, $safe_lp_item_view_id = 0,
$questionList = array(), $questionList = array(),
$weight = 0 $weight = 0,
$chamilo_session_id = null
) { ) {
$track_exercises = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES); $track_exercises = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
$safe_lp_id = intval($safe_lp_id); $safe_lp_id = intval($safe_lp_id);
@ -2994,10 +2998,13 @@ class Exercise
$questionList = array_map('intval', $questionList); $questionList = array_map('intval', $questionList);
$weight = Database::escape_string($weight); $weight = Database::escape_string($weight);
if (!$chamilo_session_id) {
$chamilo_session_id = api_get_session_id();
}
$sql = "INSERT INTO $track_exercises $sql = "INSERT INTO $track_exercises
($sql_fields exe_exo_id, exe_user_id, c_id, status, session_id, data_tracking, start_date, orig_lp_id, orig_lp_item_id, exe_weighting, quiz_distribution_id) ($sql_fields exe_exo_id, exe_user_id, c_id, status, session_id, data_tracking, start_date, orig_lp_id, orig_lp_item_id, exe_weighting, quiz_distribution_id)
VALUES VALUES
( $sql_fields_values '".$this->id."','".api_get_user_id()."','".api_get_course_int_id()."', 'incomplete','".api_get_session_id()."','".implode(',', $questionList)."', '".api_get_utc_datetime()."', '$safe_lp_id', '$safe_lp_item_id', '$weight', '".$this->distributionId."')"; ( $sql_fields_values '".$this->id."','".api_get_user_id()."','".$this->course_id."', 'incomplete','".$chamilo_session_id."','".implode(',', $questionList)."', '".api_get_utc_datetime()."', '$safe_lp_id', '$safe_lp_item_id', '$weight', '".$this->distributionId."')";
Database::query($sql); Database::query($sql);
$id = Database::insert_id(); $id = Database::insert_id();
@ -5595,13 +5602,15 @@ class Exercise
/** /**
* Sets the question list when the exercise->read() is executed * Sets the question list when the exercise->read() is executed
*/ */
public function setQuestionList($loadDistributions = false) public function setQuestionList($loadDistributions = false, $sessionId = null)
{ {
// Getting question list. // Getting question list.
$questionList = $this->selectQuestionList(true); $questionList = $this->selectQuestionList(true);
// Looking for distributions // Looking for distributions
if (!$sessionId) {
$sessionId = api_get_session_id(); $sessionId = api_get_session_id();
}
if (!empty($sessionId)) { if (!empty($sessionId)) {
$dataExists = !empty($this->trackExercise) && isset($this->trackExercise['data_tracking']) && !empty($this->trackExercise['data_tracking']) ? true : false; $dataExists = !empty($this->trackExercise) && isset($this->trackExercise['data_tracking']) && !empty($this->trackExercise['data_tracking']) ? true : false;

@ -789,8 +789,10 @@ function get_exercise_track_exercise_info($exe_id) {
/** /**
* Validates the time control key * Validates the time control key
*/ */
function exercise_time_control_is_valid($exercise_id, $lp_id = 0 , $lp_item_id = 0) { function exercise_time_control_is_valid($exercise_id, $lp_id = 0 , $lp_item_id = 0, $course_id = null) {
if (!$course_id) {
$course_id = api_get_course_int_id(); $course_id = api_get_course_int_id();
}
$exercise_id = intval($exercise_id); $exercise_id = intval($exercise_id);
$TBL_EXERCICES = Database::get_course_table(TABLE_QUIZ_TEST); $TBL_EXERCICES = Database::get_course_table(TABLE_QUIZ_TEST);
$sql = "SELECT expired_time FROM $TBL_EXERCICES WHERE c_id = $course_id AND id = $exercise_id"; $sql = "SELECT expired_time FROM $TBL_EXERCICES WHERE c_id = $course_id AND id = $exercise_id";

@ -36,7 +36,7 @@ class Testcategory
public function Testcategory($in_id = 0, $in_name = '', $in_description = "", $parent_id = 0, $type = 'simple', $course_id = null, $visibility = 1) public function Testcategory($in_id = 0, $in_name = '', $in_description = "", $parent_id = 0, $type = 'simple', $course_id = null, $visibility = 1)
{ {
if ($in_id != 0 && $in_name == "") { if ($in_id != 0 && $in_name == "") {
$tmpobj = new Testcategory(); $tmpobj = new Testcategory(0, '', '', 0, 'simple', $course_id);
$tmpobj->getCategory($in_id); $tmpobj->getCategory($in_id);
$this->id = $tmpobj->id; $this->id = $tmpobj->id;
$this->name = $tmpobj->name; $this->name = $tmpobj->name;
@ -44,12 +44,13 @@ class Testcategory
$this->description = $tmpobj->description; $this->description = $tmpobj->description;
$this->parent_id = $tmpobj->parent_id; $this->parent_id = $tmpobj->parent_id;
$this->parent_path = $this->name; $this->parent_path = $this->name;
$this->c_id = $tmpobj->c_id; $this->c_id = isset($course_id) ? $course_id : $tmpobj->c_id;
$this->root = $tmpobj->root; $this->root = $tmpobj->root;
$this->visibility = $tmpobj->visibility; $this->visibility = $tmpobj->visibility;
if (!empty($tmpobj->parent_id)) { if (!empty($tmpobj->parent_id)) {
$category = new Testcategory($tmpobj->parent_id); // Default values and the course_id passed.
$category = new Testcategory($tmpobj->parent_id, '', '', 0, 'simple', $course_id);
$this->parent_path = $category->parent_path.' > '.$this->name; $this->parent_path = $category->parent_path.' > '.$this->name;
} }
} else { } else {

@ -493,7 +493,7 @@ function saveQuestionAttempt(
} }
//Validation in case of fraud with active control time //Validation in case of fraud with active control time
if (!ExerciseLib::exercise_time_control_is_valid($exercise_id, $learnpath_id, $learnpath_item_id)) { if (!ExerciseLib::exercise_time_control_is_valid($exercise_id, $learnpath_id, $learnpath_item_id, $course_id, $session_id)) {
if ($debug) { if ($debug) {
error_log("exercise_time_control_is_valid is false"); error_log("exercise_time_control_is_valid is false");
} }

@ -48,16 +48,21 @@ class ExerciseLib
/** /**
* Validates the time control key * Validates the time control key
*/ */
public static function exercise_time_control_is_valid($exercise_id, $lp_id = 0, $lp_item_id = 0) public static function exercise_time_control_is_valid($exercise_id, $lp_id = 0, $lp_item_id = 0, $course_id = null, $session_id = null)
{ {
if (!$course_id) {
$course_id = api_get_course_int_id(); $course_id = api_get_course_int_id();
}
if (!$session_id) {
$session_id = api_get_session_id();
}
$exercise_id = intval($exercise_id); $exercise_id = intval($exercise_id);
$TBL_EXERCICES = Database::get_course_table(TABLE_QUIZ_TEST); $TBL_EXERCICES = Database::get_course_table(TABLE_QUIZ_TEST);
$sql = "SELECT expired_time FROM $TBL_EXERCICES WHERE c_id = $course_id AND iid = $exercise_id"; $sql = "SELECT expired_time FROM $TBL_EXERCICES WHERE c_id = $course_id AND iid = $exercise_id";
$result = Database::query($sql); $result = Database::query($sql);
$row = Database::fetch_array($result, 'ASSOC'); $row = Database::fetch_array($result, 'ASSOC');
if (!empty($row['expired_time'])) { if (!empty($row['expired_time'])) {
$current_expired_time_key = ExerciseLib::get_time_control_key($exercise_id, $lp_id, $lp_item_id); $current_expired_time_key = ExerciseLib::get_time_control_key($exercise_id, $lp_id, $lp_item_id, $course_id, $session_id);
if (isset($_SESSION['expired_time'][$current_expired_time_key])) { if (isset($_SESSION['expired_time'][$current_expired_time_key])) {
$current_time = time(); $current_time = time();
$expired_time = api_strtotime($_SESSION['expired_time'][$current_expired_time_key], 'UTC'); $expired_time = api_strtotime($_SESSION['expired_time'][$current_expired_time_key], 'UTC');
@ -88,12 +93,18 @@ class ExerciseLib
/** /**
Generates the time control key Generates the time control key
*/ */
public static function get_time_control_key($exercise_id, $lp_id = 0, $lp_item_id = 0) public static function get_time_control_key($exercise_id, $lp_id = 0, $lp_item_id = 0, $course_id = null, $session_id = null)
{ {
$exercise_id = intval($exercise_id); $exercise_id = intval($exercise_id);
$lp_id = intval($lp_id); $lp_id = intval($lp_id);
$lp_item_id = intval($lp_item_id); $lp_item_id = intval($lp_item_id);
return api_get_course_int_id().'_'.api_get_session_id().'_'.$exercise_id.'_'.api_get_user_id().'_'.$lp_id.'_'.$lp_item_id; if (!$course_id) {
$course_id = api_get_course_int_id();
}
if (!$session_id) {
$session_id = api_get_session_id();
}
return $course_id.'_'.$session_id.'_'.$exercise_id.'_'.api_get_user_id().'_'.$lp_id.'_'.$lp_item_id;
} }
/** /**

@ -218,7 +218,11 @@ class Envelope
if ($blob === FALSE) { if ($blob === FALSE) {
throw new UnwrapException('Invalid blob format passed: Empty content.'); throw new UnwrapException('Invalid blob format passed: Empty content.');
} }
$this->transactions = $this->wrapperPlugin->unwrap($blob, $blob_metadata); $transactions = $this->wrapperPlugin->unwrap($blob, $blob_metadata);
foreach ($transactions as $transaction) {
// @fixme Decouple!
$this->transactions[] = TransactionLogController::createTransaction($transaction->action, (array)$transaction);
}
$this->state |= self::STATE_OPEN; $this->state |= self::STATE_OPEN;
} }
catch (Exception $exception) { catch (Exception $exception) {

@ -85,40 +85,40 @@ class ExerciseAttemptTransactionLog extends TransactionLog
throw new TransactionImportException('Undefined item_id'); throw new TransactionImportException('Undefined item_id');
} }
$attempt_id = $this->item_id; $attempt_id = $this->item_id;
if (empty($this->data['stat_info'])) { if (empty($this->data->stat_info)) {
throw new TransactionImportException('Undefined exercise stat information.'); throw new TransactionImportException('Undefined exercise stat information.');
} }
$stat_info = $this->data['stat_info']; $stat_info = $this->data->stat_info;
if (empty($this->data['attempt_info'])) { if (empty($this->data->attempt_info)) {
throw new TransactionImportException('Undefined exercise attempt information.'); throw new TransactionImportException('Undefined exercise attempt information.');
} }
$attempt_info = $this->data['attempt_info']; $attempt_info = (array)$this->data->attempt_info;
// By pass one level which does not provide useful information. // By pass one level which does not provide useful information.
$attempt_info = array_shift($attempt_info); $attempt_info = array_shift($attempt_info);
// Review consistency of provided information. // Review consistency of provided information.
if (empty($stat_info['c_id'])) { if (empty($stat_info->c_id)) {
throw new TransactionImportException('Undefined course id on stat information.'); throw new TransactionImportException('Undefined course id on stat information.');
} }
$course_id = $stat_info['c_id']; $course_id = $stat_info->c_id;
$course_info = api_get_course_info_by_id($course_id); $course_info = api_get_course_info_by_id($course_id);
if (empty($course_info)) { if (empty($course_info)) {
throw new TransactionImportException(sprintf('The included course id "%d" does not currently exist in the database.', $course_id)); throw new TransactionImportException(sprintf('The included course id "%d" does not currently exist in the database.', $course_id));
} }
if (empty($stat_info['exe_exo_id'])) { if (empty($stat_info->exe_exo_id)) {
throw new TransactionImportException('Undefined exercise id on stat information.'); throw new TransactionImportException('Undefined exercise id on stat information.');
} }
$exercise_id = $stat_info['exe_exo_id']; $exercise_id = $stat_info->exe_exo_id;
$exercise = new Exercise($course_id); $exercise = new Exercise($course_id);
// Exercise read expects course id set. // Exercise read expects course id set.
$exercise->course_id = $course_id; $exercise->course_id = $course_id;
if (!$exercise->read($exercise_id)) { if (!$exercise->read($exercise_id, true, $stat_info->session_id)) {
throw new TransactionImportException(sprintf('The included exercise id "%d" on course with id "%d" does not currently exist in the database.', $exercise_id, $course_id)); throw new TransactionImportException(sprintf('The included exercise id "%d" on course with id "%d" does not currently exist in the database.', $exercise_id, $course_id));
} }
if (empty($stat_info['exe_user_id'])) { if (empty($stat_info->exe_user_id)) {
throw new TransactionImportException('Undefined user id on stat information.'); throw new TransactionImportException('Undefined user id on stat information.');
} }
$user_id = $stat_info['exe_user_id']; $user_id = $stat_info->exe_user_id;
$user_info = api_get_user_info($user_id); $user_info = api_get_user_info($user_id);
if (!$user_info) { if (!$user_info) {
throw new TransactionImportException(sprintf('The included user id "%d" does not currently exist in the database.', $user_id)); throw new TransactionImportException(sprintf('The included user id "%d" does not currently exist in the database.', $user_id));
@ -129,17 +129,17 @@ class ExerciseAttemptTransactionLog extends TransactionLog
// Process the attempt results. // Process the attempt results.
// First, create the exercise attempt to obtain an id in the // First, create the exercise attempt to obtain an id in the
// destination system. // destination system.
$question_list = explode(',', $stat_info['data_tracking']); $question_list = explode(',', $stat_info->data_tracking);
$imported_exe_id = $exercise->save_stat_track_exercise_info($stat_info['expired_time_control'], $stat_info['orig_lp_id'], $stat_info['orig_lp_item_id'], 0, $question_list, $stat_info['exe_weighting']); $imported_exe_id = $exercise->save_stat_track_exercise_info($stat_info->expired_time_control, $stat_info->orig_lp_id, $stat_info->orig_lp_item_id, 0, $question_list, $stat_info->exe_weighting, $stat_info->session_id);
if (!$imported_exe_id) { if (!$imported_exe_id) {
throw new TransactionImportException(sprintf('Could not create exercise stat information correctly on course with id "%d" for exercise_id "%d"', $course_id, $exercise_id)); throw new TransactionImportException(sprintf('Could not create exercise stat information correctly on course with id "%d" for exercise_id "%d"', $course_id, $exercise_id));
} }
// Then, process the results. // Then, process the results.
foreach ($attempt_info['question_list'] as $question_id => $attempt_answer_info) { foreach ($attempt_info->question_list as $question_id => $attempt_answer_info) {
// Use saveExerciseAttempt($score, $answer, $question_id, $exe_id, $position, $exercise_id = 0, $nano = null, $user_id = null, $course_id = null, $session_id = null, $learnpath_id = null, $learnpath_item_id = null) // Use saveQuestionAttempt($score, $answer, $question_id, $exe_id, $position, $exercise_id = 0, $updateResults = false, $nano = null, $user_id = null, $course_id = null, $session_id = null, $learnpath_id = null, $learnpath_item_id = null)
// @fixme What nano means and there to retrieve it? // @fixme What nano means and there to retrieve it?
$nano = null; $nano = null;
$attempt_answer_id = saveExerciseAttempt($attempt_answer_info['marks'], $attempt_answer_info['answer'], $question_id, $imported_exe_id, $attempt_answer_info['position'], $exercise_id, $nano, $user_id, $course_id, $stat_info['session_id'], $stat_info['orig_lp_id'], $stat_info['orig_lp_item_id']); $attempt_answer_id = saveQuestionAttempt($attempt_answer_info->marks, $attempt_answer_info->answer, $question_id, $imported_exe_id, $attempt_answer_info->position, $exercise_id, false, $nano, $user_id, $course_id, $stat_info->session_id, $stat_info->orig_lp_id, $stat_info->orig_lp_item_id);
} }
// Finally return the associated id. // Finally return the associated id.

@ -147,6 +147,8 @@ class TransactionLogController
{ {
$added_transactions = array(); $added_transactions = array();
foreach ($exported_transactions as $exported_transaction) { foreach ($exported_transactions as $exported_transaction) {
// Make sure it's an array.
$exported_transaction = (array) $exported_transaction;
// Set the right id in the new system. // Set the right id in the new system.
$exported_transaction['transaction_id'] = $exported_transaction['id']; $exported_transaction['transaction_id'] = $exported_transaction['id'];
unset($exported_transaction['id']); unset($exported_transaction['id']);

Loading…
Cancel
Save