فهرست منبع

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

Julio Montoya 11 سال پیش
والد
کامیت
3aca2840b5

+ 1 - 1
main/exercice/exercise.class.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();
 

+ 8 - 0
main/exercice/testcategory.class.php

@@ -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) {

+ 25 - 0
main/inc/Entity/Repository/TrackExerciseRepository.php

@@ -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');

+ 38 - 23
main/inc/ajax/exercise.ajax.php

@@ -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:

+ 15 - 9
main/template/minedu/admin/exercise_statistics/exercise_distribution/index.tpl

@@ -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>

+ 34 - 9
src/ChamiloLMS/Controller/Admin/ExerciseStatistics/ExerciseStatisticsController.php

@@ -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());
     }