No using session when doing stats (only admin can access this stats).

skala
Julio Montoya 12 years ago
parent 8903a0b7df
commit 3aca2840b5
  1. 2
      main/exercice/exercise.class.php
  2. 8
      main/exercice/testcategory.class.php
  3. 25
      main/inc/Entity/Repository/TrackExerciseRepository.php
  4. 61
      main/inc/ajax/exercise.ajax.php
  5. 24
      main/template/minedu/admin/exercise_statistics/exercise_distribution/index.tpl
  6. 43
      src/ChamiloLMS/Controller/Admin/ExerciseStatistics/ExerciseStatisticsController.php

@ -710,7 +710,7 @@ class Exercise
* Gets the question list ordered by the question_order setting (drag and drop)
* @return array
*/
private function getQuestionOrderedList()
public function getQuestionOrderedList()
{
$questionList = array();

@ -1068,8 +1068,15 @@ class Testcategory
$globalCategoryScore = array();
foreach ($category_list as $category_id => $category_item) {
/** @var Entity\CQuizCategory $cat */
$cat = $em->find('Entity\CQuizCategory', $category_id);
if (empty($cat)) {
continue;
}
$path = $repo->getPath($cat);
if ($loadChildren) {
@ -1078,6 +1085,7 @@ class Testcategory
}
$categoryName = $category_name_list[$category_id];
//$categoryName = $category_item['name'];
$index = 0;
if ($categoryMinusOne) {

@ -64,6 +64,31 @@ class TrackExerciseRepository extends EntityRepository
return $results;
}
/**
* @param int $exerciseId
* @param int $courseId
* @param int $distributionId
* @return array
*/
public function getResultsWithNoSession($exerciseId, $courseId, $distributionId)
{
$qb = $this->createQueryBuilder('e');
$qb->select('e.exeId, e.exeResult')
->where('e.exeExoId = :exerciseId AND e.cId = :courseId AND e.status = :status')
->andWhere('e.quizDistributionId = :distributionId')
->setParameters(
array(
'exerciseId' => $exerciseId,
'courseId' => $courseId,
'status' => '',
'distributionId' => $distributionId
)
);
$results = $qb->getQuery()->getArrayResult();
$results = \array_column($results, 'exeResult', 'exeId');
return $results;
}
/*public function getResultsPerGlobalCategory($exerciseId, $courseId, $sessionId, $distributionId, $globalCategory)
{
$qb = $this->createQueryBuilder('e');

@ -751,9 +751,17 @@ switch ($action) {
echo 0;
break;
case 'get_modificator':
$sessions = SessionManager::get_session_by_course($_REQUEST['cId']);
if (empty($sessions)) {
echo '0.00';
} else {
$sessionInfo = current($sessions);
$sessionId = $sessionInfo['id'];
}
$params = array(
'exerciseId' => $_REQUEST['exerciseId'],
'sessionId' => $_REQUEST['sessionId'],
'sessionId' => $sessionId,
'cId' => $_REQUEST['cId'],
'quizDistributionId' => $_REQUEST['distributionId'],
'categoryId' => $_REQUEST['categoryId']
@ -768,32 +776,39 @@ switch ($action) {
}
break;
case 'save_modificator':
$params = array(
'exerciseId' => $_REQUEST['exerciseId'],
'sessionId' => $_REQUEST['sessionId'],
'cId' => $_REQUEST['cId'],
'quizDistributionId' => $_REQUEST['distributionId'],
'categoryId' => $_REQUEST['categoryId']
);
// Save to all sessions from this course:
$sessions = SessionManager::get_session_by_course($_REQUEST['cId']);
foreach ($sessions as $session) {
$sessionId = $session['id'];
$params = array(
'exerciseId' => $_REQUEST['exerciseId'],
'sessionId' => $sessionId,
'cId' => $_REQUEST['cId'],
'quizDistributionId' => $_REQUEST['distributionId'],
'categoryId' => $_REQUEST['categoryId']
);
$quizDistributionRelSessionRelCategory = $app['orm.em']->getRepository('Entity\CQuizDistributionRelSessionRelCategory')->findOneBy($params);
if (empty($quizDistributionRelSessionRelCategory)) {
$quizDistributionRelSessionRelCategory = new Entity\CQuizDistributionRelSessionRelCategory();
$quizDistributionRelSessionRelCategory->setExerciseId($_REQUEST['exerciseId']);
$quizDistributionRelSessionRelCategory->setSessionId($_REQUEST['sessionId']);
$quizDistributionRelSessionRelCategory->setCId($_REQUEST['cId']);
$quizDistributionRelSessionRelCategory->setQuizDistributionId($_REQUEST['distributionId']);
$quizDistributionRelSessionRelCategory->setCategoryId($_REQUEST['categoryId']);
}
$quizDistributionRelSessionRelCategory = $app['orm.em']->getRepository('Entity\CQuizDistributionRelSessionRelCategory')->findOneBy($params);
if (empty($quizDistributionRelSessionRelCategory)) {
$quizDistributionRelSessionRelCategory = new Entity\CQuizDistributionRelSessionRelCategory();
$quizDistributionRelSessionRelCategory->setExerciseId($_REQUEST['exerciseId']);
$quizDistributionRelSessionRelCategory->setSessionId($sessionId);
$quizDistributionRelSessionRelCategory->setCId($_REQUEST['cId']);
$quizDistributionRelSessionRelCategory->setQuizDistributionId($_REQUEST['distributionId']);
$quizDistributionRelSessionRelCategory->setCategoryId($_REQUEST['categoryId']);
}
$quizDistributionRelSessionRelCategory->setModifier($_REQUEST['value']);
$quizDistributionRelSessionRelCategory->setModifier($_REQUEST['value']);
event_system('update_modificator', 'modifier', $_REQUEST['value']);
event_system('update_modificator', 'exerciseId', $_REQUEST['exerciseId']);
event_system('update_modificator', 'distributionId', $_REQUEST['distributionId']);
event_system('update_modificator', 'modifier', $_REQUEST['value']);
event_system('update_modificator', 'exerciseId', $_REQUEST['exerciseId']);
event_system('update_modificator', 'distributionId', $_REQUEST['distributionId']);
$app['orm.em']->persist($quizDistributionRelSessionRelCategory);
$app['orm.em']->flush();
$app['orm.em']->persist($quizDistributionRelSessionRelCategory);
$app['orm.em']->flush();
}
echo 1;
break;
default:

@ -67,10 +67,13 @@
<table class="table">
<tr>
<td>
Categorias / Formas id
</td>
{% for distribution in distributions %}
{% for distributionId in distributions %}
<td>
{{ distribution.distribution.id }} (# intentos {{ results[distribution.distribution.id].counter }} )
#{{ distributionId }}
<br />
{{ results[distributionId].counter }} intentos
</td>
{% endfor %}
</tr>
@ -80,13 +83,16 @@
<td>
{{ category.title }}
</td>
{% for distribution in distributions %}
{% for distributionId in distributions %}
<td>
{% if results[distribution.distribution.id] and results[distribution.distribution.id][category.id] %}
{% set average = results[distribution.distribution.id][category.id].result / results[distribution.distribution.id].counter %}
{{ average|number_format(2) }} ({{ results[distribution.distribution.id][category.id].result }})
{% if results[distributionId] and results[distributionId][category.id] %}
{% set average = results[distributionId][category.id].result / results[distributionId].counter %}
{% set id = distribution.distribution.id ~ "_" ~ category.id %}
Promedio: {{ average|number_format(2) }}
<br>
Resultado: {{ results[distributionId][category.id].result }}
{% set id = distributionId ~ "_" ~ category.id %}
<a id="button_{{ id }}" class="btn edit">+</a>
@ -128,9 +134,9 @@
<td>
Total
</td>
{% for distribution in distributions %}
{% for distributionId in distributions %}
<td>
{{ results[distribution.distribution.id].total }}
{{ results[distributionId].total }}
</td>
{% endfor %}
</tr>

@ -13,6 +13,7 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use ChamiloLMS\Form\CQuizDistributionType;
use Doctrine\Common\Collections\Criteria;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Tests\ValidationVisitorTest;
/**
* Class ExerciseStatisticsController
@ -29,6 +30,10 @@ class ExerciseStatisticsController extends CommonController
*/
public function indexAction($exerciseId)
{
if (!api_is_platform_admin()) {
return $this->abort(500);
}
set_time_limit(0);
$template = $this->get('template');
@ -44,12 +49,25 @@ class ExerciseStatisticsController extends CommonController
/** @var Gedmo\Tree\Entity\Repository\NestedTreeRepository $repo */
$repo = $em->getRepository('Entity\CQuizCategory');
// Getting categories
//$questionList = $exercise->getQuestionList();
$questionList = $exercise->getQuestionOrderedList();
// Getting categories
$categories = $exercise->getListOfCategoriesWithQuestionForTest();
$cat = new \Testcategory();
$categoriesAddedInExercise = $cat->getCategoryExerciseTree($exerciseId, $courseId, 'root, lft ASC', false, true, false);
$categories = \Testcategory::getQuestionsByCat($exerciseId, $questionList, $categoriesAddedInExercise, $courseId);
$categories = $exercise->fillQuestionByCategoryArray($categories);
$categories = $exercise->getListOfCategoriesWithQuestionForTest($categories);
$globalCategories = \Testcategory::globalizeCategories($exerciseId, $courseId, $categories, true, true);
$categoryList = array();
$categoryListInverse = array();
foreach ($globalCategories as $categoryId => & $data) {
$data['id'] = $categoryId;
$cat = $em->find('Entity\CQuizCategory', $categoryId);
@ -73,6 +91,7 @@ class ExerciseStatisticsController extends CommonController
}
}
if (empty($categories) || empty($globalCategories)) {
throw new \Exception('No categories in this exercise.');
}
@ -82,13 +101,15 @@ class ExerciseStatisticsController extends CommonController
foreach ($categories as $categoryData) {
foreach ($categoryData['question_list'] as $questionId) {
//$questionListWithCategory[$questionId] = $categoryData['id'];
$questionListWithCategory[$questionId] = $categoryListInverse[$categoryData['id']];
if (isset($categoryListInverse[$categoryData['id']])) {
$questionListWithCategory[$questionId] = $categoryListInverse[$categoryData['id']];
}
}
}
$params = array(
'exerciseId' => $exerciseId,
'sessionId' => $sessionId,
//'sessionId' => $sessionId,
'cId' => $course->getId()
);
@ -101,21 +122,24 @@ class ExerciseStatisticsController extends CommonController
// Getting results per distribution
$attemptsPerDistribution = array();
/** @var Entity\CQuizDistributionRelSession $distribution */
$distributionIdList = array();
foreach ($quizDistributionRelSessions as $distribution) {
$attemptsPerDistribution[$distribution->getQuizDistributionId()] = $em->getRepository("Entity\TrackExercise")->getResults(
$attemptsPerDistribution[$distribution->getQuizDistributionId()] = $em->getRepository("Entity\TrackExercise")->getResultsWithNoSession(
$exerciseId,
$courseId,
$sessionId,
//$sessionId,
$distribution->getQuizDistributionId()
);
}
$distributionIdList = array_keys($attemptsPerDistribution);
if (empty($attemptsPerDistribution)) {
throw new \Exception('Not enough data. TrackExercise has not quizDistributionId');
}
foreach ($quizDistributionRelSessions as $distribution) {
$distributionId = $distribution->getQuizDistributionId();
foreach ($distributionIdList as $distributionId) {
$attemptList = $attemptsPerDistribution[$distributionId];
$exeIdList = array_keys($attemptList);
$markPerQuestions = $em->getRepository("Entity\TrackAttempt")->getResults(
@ -125,6 +149,9 @@ class ExerciseStatisticsController extends CommonController
$total = 0;
if (!empty($markPerQuestions)) {
foreach ($markPerQuestions as $questionId => $marks) {
/*if (!isset($questionListWithCategory[$questionId])) {
continue;
}*/
$categoryId = $questionListWithCategory[$questionId];
if (!isset($finalResults[$distributionId][$categoryId])) {
$finalResults[$distributionId][$categoryId]['result'] = 0;
@ -145,10 +172,8 @@ class ExerciseStatisticsController extends CommonController
$template->assign('total', $total);
$template->assign('cId', $this->getCourseId());
$template->assign('exerciseId', $exerciseId);
$template->assign('sessionId', $this->getSessionId());
$template->assign('distributions', $quizDistributionRelSessions);
$template->assign('distributions', $distributionIdList);
$response = $template->render_template($this->getTemplatePath().'index.tpl');
return new Response($response, 200, array());
}

Loading…
Cancel
Save