Browse Source

Add limit of 1000 records when dumping user data BT#14753

Julio Montoya 6 years ago
parent
commit
918ada2d63
2 changed files with 57 additions and 42 deletions
  1. 8 1
      main/social/personal_data.php
  2. 49 41
      src/Chamilo/UserBundle/Repository/UserRepository.php

+ 8 - 1
main/social/personal_data.php

@@ -240,7 +240,7 @@ if ($allowSocial) {
 $personalDataContent = '<ul>';
 $properties = json_decode($propertiesToJson);
 $webCoursePath = api_get_path(WEB_COURSE_PATH);
-
+$showWarningMessage = false;
 foreach ($properties as $key => $value) {
     if (is_array($value) || is_object($value)) {
         switch ($key) {
@@ -282,6 +282,9 @@ foreach ($properties as $key => $value) {
                     if (empty($subValue)) {
                         $personalDataContent .= '<li>'.get_lang('NoData').'</li>';
                     } else {
+                        if (count($subValue) === 1000) {
+                            $showWarningMessage = true;
+                        }
                         foreach ($subValue as $subSubValue) {
                             if ($category === 'DocumentsAdded') {
                                 $documentLink = Display::url(
@@ -432,6 +435,10 @@ if (api_get_setting('allow_terms_conditions') === 'true') {
     $termLink = Display::url(get_lang('ReadTermsAndConditions'), $url);
 }
 
+if ($showWarningMessage) {
+    Display::addFlash(Display::return_message(get_lang('MoreDataAvailableInTheDatabaseButTrunkedForEfficiencyReasons')));
+}
+
 // Block Social Avatar
 SocialManager::setSocialUserBlock($tpl, api_get_user_id(), 'messages');
 if (api_get_setting('allow_social_tool') === 'true') {

+ 49 - 41
src/Chamilo/UserBundle/Repository/UserRepository.php

@@ -645,14 +645,51 @@ class UserRepository extends EntityRepository
             $trackECourseAccessList[] = implode(', ', $list);
         }
 
-        // TrackELogin
-        $criteria = [
-            'loginUserId' => $userId,
+        $checkEntities = [
+            'ChamiloCoreBundle:TrackELogin' => 'loginUserId',
+            'ChamiloCoreBundle:TrackEAccess' => 'accessUserId',
+            'ChamiloCoreBundle:TrackEOnline' => 'loginUserId',
+            'ChamiloCoreBundle:TrackEDefault' => 'defaultUserId',
+            'ChamiloCoreBundle:TrackELastaccess' => 'accessUserId',
+            'ChamiloCoreBundle:TrackEUploads' => 'uploadUserId',
+            'ChamiloCoreBundle:GradebookResult' => 'userId',
+            'ChamiloCoreBundle:TrackEDownloads' => 'downUserId',
         ];
-        $result = $em->getRepository('ChamiloCoreBundle:TrackELogin')->findBy($criteria);
+
+        $maxResults = 1000;
+        $trackResults = [];
+        foreach ($checkEntities as $entity => $field) {
+            $qb = $em->createQueryBuilder();
+            $qb->select($qb->expr()->count('l'))
+                ->from($entity, 'l')
+                ->where("l.$field = :login")
+                ->setParameter('login', $userId);
+            $query = $qb->getQuery();
+            $count = $query->getSingleScalarResult();
+
+            if ($count > $maxResults) {
+                $qb = $em->getRepository($entity)->createQueryBuilder('l');
+                $qb
+                    ->select('l')
+                    ->where("l.$field = :login")
+                    ->setParameter('login', $userId);
+                $qb
+                    ->setFirstResult(0)
+                    ->setMaxResults($maxResults)
+                ;
+                $result = $qb->getQuery()->getResult();
+            } else {
+                $criteria = [
+                    $field => $userId,
+                ];
+                $result = $em->getRepository($entity)->findBy($criteria);
+            }
+            $trackResults[$entity] = $result;
+        }
+
         $trackELoginList = [];
         /** @var TrackELogin $item */
-        foreach ($result as $item) {
+        foreach ($trackResults['ChamiloCoreBundle:TrackELogin'] as $item) {
             $startDate = $item->getLoginDate() ? $item->getLoginDate()->format($dateFormat) : '';
             $endDate = $item->getLogoutDate() ? $item->getLogoutDate()->format($dateFormat) : '';
             $list = [
@@ -664,13 +701,9 @@ class UserRepository extends EntityRepository
         }
 
         // TrackEAccess
-        $criteria = [
-            'accessUserId' => $userId,
-        ];
-        $result = $em->getRepository('ChamiloCoreBundle:TrackEAccess')->findBy($criteria);
         $trackEAccessList = [];
         /** @var TrackEAccess $item */
-        foreach ($result as $item) {
+        foreach ($trackResults['ChamiloCoreBundle:TrackEAccess'] as $item) {
             $date = $item->getAccessDate() ? $item->getAccessDate()->format($dateFormat) : '';
             $list = [
                 'IP: '.$item->getUserIp(),
@@ -681,13 +714,8 @@ class UserRepository extends EntityRepository
         }
 
         // TrackEOnline
-        $criteria = [
-            'loginUserId' => $userId,
-        ];
-        $result = $em->getRepository('ChamiloCoreBundle:TrackEOnline')->findBy($criteria);
-        $trackEOnlineList = [];
         /** @var TrackEOnline $item */
-        foreach ($result as $item) {
+        foreach ($trackResults['ChamiloCoreBundle:TrackEOnline'] as $item) {
             $date = $item->getLoginDate() ? $item->getLoginDate()->format($dateFormat) : '';
             $list = [
                 'IP: '.$item->getUserIp(),
@@ -699,13 +727,9 @@ class UserRepository extends EntityRepository
         }
 
         // TrackEDefault
-        $criteria = [
-            'defaultUserId' => $userId,
-        ];
-        $result = $em->getRepository('ChamiloCoreBundle:TrackEDefault')->findBy($criteria);
         $trackEDefault = [];
         /** @var TrackEDefault $item */
-        foreach ($result as $item) {
+        foreach ($trackResults['ChamiloCoreBundle:TrackEDefault'] as $item) {
             $date = $item->getDefaultDate() ? $item->getDefaultDate()->format($dateFormat) : '';
             $list = [
                 'Type: '.$item->getDefaultEventType(),
@@ -719,13 +743,9 @@ class UserRepository extends EntityRepository
         }
 
         // TrackELastaccess
-        $criteria = [
-            'accessUserId' => $userId,
-        ];
-        $result = $em->getRepository('ChamiloCoreBundle:TrackELastaccess')->findBy($criteria);
         $trackELastaccess = [];
         /** @var TrackELastaccess $item */
-        foreach ($result as $item) {
+        foreach ($trackResults['ChamiloCoreBundle:TrackELastaccess'] as $item) {
             $date = $item->getAccessDate() ? $item->getAccessDate()->format($dateFormat) : '';
             $list = [
                 'Course #'.$item->getCId(),
@@ -737,13 +757,9 @@ class UserRepository extends EntityRepository
         }
 
         // TrackEUploads
-        $criteria = [
-            'uploadUserId' => $userId,
-        ];
-        $result = $em->getRepository('ChamiloCoreBundle:TrackEUploads')->findBy($criteria);
         $trackEUploads = [];
         /** @var TrackEUploads $item */
-        foreach ($result as $item) {
+        foreach ($trackResults['ChamiloCoreBundle:TrackEUploads'] as $item) {
             $date = $item->getUploadDate() ? $item->getUploadDate()->format($dateFormat) : '';
             $list = [
                 'Course #'.$item->getCId(),
@@ -753,13 +769,9 @@ class UserRepository extends EntityRepository
             $trackEUploads[] = implode(', ', $list);
         }
 
-        $criteria = [
-            'userId' => $userId,
-        ];
-        $result = $em->getRepository('ChamiloCoreBundle:GradebookResult')->findBy($criteria);
         $gradebookResult = [];
         /** @var GradebookResult $item */
-        foreach ($result as $item) {
+        foreach ($trackResults['ChamiloCoreBundle:GradebookResult'] as $item) {
             $date = $item->getCreatedAt() ? $item->getCreatedAt()->format($dateFormat) : '';
             $list = [
                 'Evaluation id# '.$item->getEvaluationId(),
@@ -769,13 +781,9 @@ class UserRepository extends EntityRepository
             $gradebookResult[] = implode(', ', $list);
         }
 
-        $criteria = [
-            'downUserId' => $userId,
-        ];
-        $result = $em->getRepository('ChamiloCoreBundle:TrackEDownloads')->findBy($criteria);
         $trackEDownloads = [];
         /** @var TrackEDownloads $item */
-        foreach ($result as $item) {
+        foreach ($trackResults['ChamiloCoreBundle:TrackEDownloads'] as $item) {
             $date = $item->getDownDate() ? $item->getDownDate()->format($dateFormat) : '';
             $list = [
                 'File: '.$item->getDownDocPath(),