From e6ef0a3bc7dadd3dae51b634691684fe729142dc Mon Sep 17 00:00:00 2001 From: Julio Date: Thu, 30 Sep 2021 13:51:21 +0200 Subject: [PATCH] Resources: Use ResourceShowCourseResourcesInSessionInterface Instead of ShowCourseResourcesInSessionTrait + add tests --- src/CoreBundle/Entity/AbstractResource.php | 7 ++- ...ShowCourseResourcesInSessionInterface.php} | 2 +- .../Repository/ResourceRepository.php | 12 ++++- .../Traits/PersonalResourceTrait.php | 3 -- .../ShowCourseResourcesInSessionTrait.php | 20 ------- .../Entity/CCourseDescription.php | 8 +-- src/CourseBundle/Entity/CDocument.php | 6 +-- src/CourseBundle/Entity/CLp.php | 6 +-- src/CourseBundle/Entity/CQuiz.php | 5 +- .../Entity/CQuizQuestionCategory.php | 6 +-- src/CourseBundle/Entity/CTool.php | 6 +-- .../Repository/CToolRepository.php | 54 ------------------- .../CCourseDescriptionRepositoryTest.php | 8 ++- .../Repository/CQuizRepositoryTest.php | 36 ++++++++++--- 14 files changed, 59 insertions(+), 120 deletions(-) rename src/CoreBundle/Entity/{ResourceToCourseInterface.php => ResourceShowCourseResourcesInSessionInterface.php} (68%) delete mode 100644 src/CoreBundle/Traits/ShowCourseResourcesInSessionTrait.php diff --git a/src/CoreBundle/Entity/AbstractResource.php b/src/CoreBundle/Entity/AbstractResource.php index 1ed3a7c064..cbc4ed4e10 100644 --- a/src/CoreBundle/Entity/AbstractResource.php +++ b/src/CoreBundle/Entity/AbstractResource.php @@ -410,10 +410,9 @@ abstract class AbstractResource public function isVisible(Course $course, Session $session = null): bool { $link = $this->getFirstResourceLinkFromCourseSession($course, $session); - if (null === $link) { - if ((new ReflectionClass($this))->hasProperty('loadCourseResourcesInSession')) { - $link = $this->getFirstResourceLinkFromCourseSession($course); - } + + if (null === $link && $this instanceof ResourceShowCourseResourcesInSessionInterface) { + $link = $this->getFirstResourceLinkFromCourseSession($course); } if (null === $link) { diff --git a/src/CoreBundle/Entity/ResourceToCourseInterface.php b/src/CoreBundle/Entity/ResourceShowCourseResourcesInSessionInterface.php similarity index 68% rename from src/CoreBundle/Entity/ResourceToCourseInterface.php rename to src/CoreBundle/Entity/ResourceShowCourseResourcesInSessionInterface.php index 616c945b0f..2e4d0b95f5 100644 --- a/src/CoreBundle/Entity/ResourceToCourseInterface.php +++ b/src/CoreBundle/Entity/ResourceShowCourseResourcesInSessionInterface.php @@ -6,6 +6,6 @@ declare(strict_types=1); namespace Chamilo\CoreBundle\Entity; -interface ResourceToCourseInterface +interface ResourceShowCourseResourcesInSessionInterface { } diff --git a/src/CoreBundle/Repository/ResourceRepository.php b/src/CoreBundle/Repository/ResourceRepository.php index 077674f5ab..8c2c13864e 100644 --- a/src/CoreBundle/Repository/ResourceRepository.php +++ b/src/CoreBundle/Repository/ResourceRepository.php @@ -14,6 +14,7 @@ use Chamilo\CoreBundle\Entity\ResourceInterface; use Chamilo\CoreBundle\Entity\ResourceLink; use Chamilo\CoreBundle\Entity\ResourceNode; use Chamilo\CoreBundle\Entity\ResourceRight; +use Chamilo\CoreBundle\Entity\ResourceShowCourseResourcesInSessionInterface; use Chamilo\CoreBundle\Entity\ResourceType; use Chamilo\CoreBundle\Entity\Session; use Chamilo\CoreBundle\Entity\User; @@ -268,9 +269,10 @@ abstract class ResourceRepository extends ServiceEntityRepository ->andWhere('links.visibility = :visibility') ->setParameter('visibility', ResourceLink::VISIBILITY_PUBLISHED, Types::INTEGER) ; - // @todo Add start/end visibility restrictions. } + // @todo Add start/end visibility restrictions. + return $qb; } @@ -289,7 +291,11 @@ abstract class ResourceRepository extends ServiceEntityRepository $reflectionClass = $this->getClassMetadata()->getReflectionClass(); // Check if this resource type requires to load the base course resources when using a session - $loadBaseSessionContent = $reflectionClass->hasProperty('loadCourseResourcesInSession'); + $loadBaseSessionContent = \in_array( + ResourceShowCourseResourcesInSessionInterface::class, + $reflectionClass->getInterfaceNames(), + true + ); $this->addCourseQueryBuilder($course, $qb); @@ -374,6 +380,8 @@ abstract class ResourceRepository extends ServiceEntityRepository $this->addCourseQueryBuilder($course, $qb); $this->addVisibilityQueryBuilder($qb); + $qb->andWhere('links.session IS NULL'); + return $qb; } diff --git a/src/CoreBundle/Traits/PersonalResourceTrait.php b/src/CoreBundle/Traits/PersonalResourceTrait.php index 5103629ac3..c00f15c141 100644 --- a/src/CoreBundle/Traits/PersonalResourceTrait.php +++ b/src/CoreBundle/Traits/PersonalResourceTrait.php @@ -6,9 +6,6 @@ declare(strict_types=1); namespace Chamilo\CoreBundle\Traits; -/** - * Trait ShowCourseResourcesInSessionTrait. - */ trait PersonalResourceTrait { protected bool $loadPersonalResources = true; diff --git a/src/CoreBundle/Traits/ShowCourseResourcesInSessionTrait.php b/src/CoreBundle/Traits/ShowCourseResourcesInSessionTrait.php deleted file mode 100644 index 20d7c16356..0000000000 --- a/src/CoreBundle/Traits/ShowCourseResourcesInSessionTrait.php +++ /dev/null @@ -1,20 +0,0 @@ -loadCourseResourcesInSession; - } -} diff --git a/src/CourseBundle/Entity/CCourseDescription.php b/src/CourseBundle/Entity/CCourseDescription.php index e53bfbb20b..c0016c5c82 100644 --- a/src/CourseBundle/Entity/CCourseDescription.php +++ b/src/CourseBundle/Entity/CCourseDescription.php @@ -8,20 +8,16 @@ namespace Chamilo\CourseBundle\Entity; use Chamilo\CoreBundle\Entity\AbstractResource; use Chamilo\CoreBundle\Entity\ResourceInterface; -use Chamilo\CoreBundle\Traits\ShowCourseResourcesInSessionTrait; +use Chamilo\CoreBundle\Entity\ResourceShowCourseResourcesInSessionInterface; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; /** - * CCourseDescription. - * * @ORM\Table(name="c_course_description") * @ORM\Entity(repositoryClass="Chamilo\CourseBundle\Repository\CCourseDescriptionRepository") */ -class CCourseDescription extends AbstractResource implements ResourceInterface +class CCourseDescription extends AbstractResource implements ResourceInterface, ResourceShowCourseResourcesInSessionInterface { - use ShowCourseResourcesInSessionTrait; - public const TYPE_DESCRIPTION = 1; public const TYPE_OBJECTIVES = 2; public const TYPE_TOPICS = 3; diff --git a/src/CourseBundle/Entity/CDocument.php b/src/CourseBundle/Entity/CDocument.php index 1175408337..7f520be570 100644 --- a/src/CourseBundle/Entity/CDocument.php +++ b/src/CourseBundle/Entity/CDocument.php @@ -17,7 +17,7 @@ use Chamilo\CoreBundle\Controller\Api\UpdateDocumentFileAction; use Chamilo\CoreBundle\Controller\Api\UpdateVisibilityDocument; use Chamilo\CoreBundle\Entity\AbstractResource; use Chamilo\CoreBundle\Entity\ResourceInterface; -use Chamilo\CoreBundle\Traits\ShowCourseResourcesInSessionTrait; +use Chamilo\CoreBundle\Entity\ResourceShowCourseResourcesInSessionInterface; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; @@ -166,10 +166,8 @@ use Symfony\Component\Validator\Constraints as Assert; 'resourceNode.resourceFile.size', 'resourceNode.updatedAt', ])] -class CDocument extends AbstractResource implements ResourceInterface +class CDocument extends AbstractResource implements ResourceInterface, ResourceShowCourseResourcesInSessionInterface { - use ShowCourseResourcesInSessionTrait; - /** * @ORM\Column(name="iid", type="integer") * @ORM\Id diff --git a/src/CourseBundle/Entity/CLp.php b/src/CourseBundle/Entity/CLp.php index 19ba80f21b..7dc816246b 100644 --- a/src/CourseBundle/Entity/CLp.php +++ b/src/CourseBundle/Entity/CLp.php @@ -9,7 +9,7 @@ namespace Chamilo\CourseBundle\Entity; use Chamilo\CoreBundle\Entity\AbstractResource; use Chamilo\CoreBundle\Entity\Asset; use Chamilo\CoreBundle\Entity\ResourceInterface; -use Chamilo\CoreBundle\Traits\ShowCourseResourcesInSessionTrait; +use Chamilo\CoreBundle\Entity\ResourceShowCourseResourcesInSessionInterface; use DateTime; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; @@ -25,10 +25,8 @@ use Symfony\Component\Validator\Constraints as Assert; * ) * @ORM\Entity(repositoryClass="Chamilo\CourseBundle\Repository\CLpRepository") */ -class CLp extends AbstractResource implements ResourceInterface +class CLp extends AbstractResource implements ResourceInterface, ResourceShowCourseResourcesInSessionInterface { - use ShowCourseResourcesInSessionTrait; - public const LP_TYPE = 1; public const SCORM_TYPE = 2; public const AICC_TYPE = 3; diff --git a/src/CourseBundle/Entity/CQuiz.php b/src/CourseBundle/Entity/CQuiz.php index d55349c775..9cfc581cf6 100644 --- a/src/CourseBundle/Entity/CQuiz.php +++ b/src/CourseBundle/Entity/CQuiz.php @@ -8,7 +8,7 @@ namespace Chamilo\CourseBundle\Entity; use Chamilo\CoreBundle\Entity\AbstractResource; use Chamilo\CoreBundle\Entity\ResourceInterface; -use Chamilo\CoreBundle\Traits\ShowCourseResourcesInSessionTrait; +use Chamilo\CoreBundle\Entity\ResourceShowCourseResourcesInSessionInterface; use DateTime; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; @@ -25,9 +25,8 @@ use Symfony\Component\Validator\Constraints as Assert; * ) * @ORM\Entity(repositoryClass="Chamilo\CourseBundle\Repository\CQuizRepository") */ -class CQuiz extends AbstractResource implements ResourceInterface +class CQuiz extends AbstractResource implements ResourceInterface, ResourceShowCourseResourcesInSessionInterface { - use ShowCourseResourcesInSessionTrait; public const ALL_ON_ONE_PAGE = 1; public const ONE_PER_PAGE = 2; diff --git a/src/CourseBundle/Entity/CQuizQuestionCategory.php b/src/CourseBundle/Entity/CQuizQuestionCategory.php index ddd0d6687c..9c4104c288 100644 --- a/src/CourseBundle/Entity/CQuizQuestionCategory.php +++ b/src/CourseBundle/Entity/CQuizQuestionCategory.php @@ -8,7 +8,7 @@ namespace Chamilo\CourseBundle\Entity; use Chamilo\CoreBundle\Entity\AbstractResource; use Chamilo\CoreBundle\Entity\ResourceInterface; -use Chamilo\CoreBundle\Traits\ShowCourseResourcesInSessionTrait; +use Chamilo\CoreBundle\Entity\ResourceShowCourseResourcesInSessionInterface; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Event\LifecycleEventArgs; @@ -25,10 +25,8 @@ use Symfony\Component\Validator\Constraints as Assert; * ) * @ORM\Entity(repositoryClass="Chamilo\CourseBundle\Repository\CQuizQuestionCategoryRepository") */ -class CQuizQuestionCategory extends AbstractResource implements ResourceInterface +class CQuizQuestionCategory extends AbstractResource implements ResourceInterface, ResourceShowCourseResourcesInSessionInterface { - use ShowCourseResourcesInSessionTrait; - /** * @ORM\Column(name="iid", type="integer") * @ORM\Id diff --git a/src/CourseBundle/Entity/CTool.php b/src/CourseBundle/Entity/CTool.php index 963868f7df..df79ebd0d3 100644 --- a/src/CourseBundle/Entity/CTool.php +++ b/src/CourseBundle/Entity/CTool.php @@ -9,9 +9,9 @@ namespace Chamilo\CourseBundle\Entity; use Chamilo\CoreBundle\Entity\AbstractResource; use Chamilo\CoreBundle\Entity\Course; use Chamilo\CoreBundle\Entity\ResourceInterface; +use Chamilo\CoreBundle\Entity\ResourceShowCourseResourcesInSessionInterface; use Chamilo\CoreBundle\Entity\Session; use Chamilo\CoreBundle\Entity\Tool; -use Chamilo\CoreBundle\Traits\ShowCourseResourcesInSessionTrait; use Doctrine\ORM\Event\LifecycleEventArgs; use Doctrine\ORM\Mapping as ORM; use Gedmo\Mapping\Annotation as Gedmo; @@ -31,10 +31,8 @@ use Symfony\Component\Validator\Constraints as Assert; * ) * @ORM\Entity(repositoryClass="Chamilo\CourseBundle\Repository\CToolRepository") */ -class CTool extends AbstractResource implements ResourceInterface +class CTool extends AbstractResource implements ResourceInterface, ResourceShowCourseResourcesInSessionInterface { - use ShowCourseResourcesInSessionTrait; - /** * @Groups({"ctool:read"}) * diff --git a/src/CourseBundle/Repository/CToolRepository.php b/src/CourseBundle/Repository/CToolRepository.php index f44257b8fb..8729033209 100644 --- a/src/CourseBundle/Repository/CToolRepository.php +++ b/src/CourseBundle/Repository/CToolRepository.php @@ -23,58 +23,4 @@ final class CToolRepository extends ResourceRepository { parent::__construct($registry, CTool::class); } - - /*public function getResources(User $user, ResourceNode $parentNode, Course $course = null, Session $session = null, CGroup $group = null): QueryBuilder - { - $checker = $this->getAuthorizationChecker(); - $reflectionClass = $this->getClassMetadata()->getReflectionClass(); - - // Check if this resource type requires to load the base course resources when using a session - $loadBaseSessionContent = $reflectionClass->hasProperty('loadCourseResourcesInSession'); - //$loadBaseSessionContent = true; - //$classes = class_implements($this); - - $resourceTypeName = $this->getResourceTypeName(); - $qb = $this->createQueryBuilder('resource') - ->select('resource') - ->innerJoin( - 'resource.resourceNode', - 'node' - ) - ->innerJoin('node.resourceLinks', 'links') - ->innerJoin('node.resourceType', 'type') - ->where('type.name = :type') - ->setParameter('type', $resourceTypeName) - ->andWhere('links.course = :course') - ->setParameter('course', $course) - ; - - $isAdmin = $checker->isGranted('ROLE_ADMIN') || $checker->isGranted('ROLE_CURRENT_COURSE_TEACHER'); - - if (!$isAdmin) { - $qb - ->andWhere('links.visibility = :visibility') - ->setParameter('visibility', ResourceLink::VISIBILITY_PUBLISHED) - ; - } - - if (null === $session) { - $qb->andWhere('links.session IS NULL'); - } elseif ($loadBaseSessionContent) { - // Load course base content. - $qb->andWhere('links.session = :session OR links.session IS NULL'); - $qb->setParameter('session', $session); - } else { - // Load only session resources. - $qb->andWhere('links.session = :session'); - $qb->setParameter('session', $session); - } - - $qb->andWhere('node.parent = :parentNode'); - $qb->setParameter('parentNode', $parentNode); - - $qb->andWhere('links.group IS NULL'); - - return $qb; - }*/ } diff --git a/tests/CourseBundle/Repository/CCourseDescriptionRepositoryTest.php b/tests/CourseBundle/Repository/CCourseDescriptionRepositoryTest.php index fe3549326d..2e53f00cb6 100644 --- a/tests/CourseBundle/Repository/CCourseDescriptionRepositoryTest.php +++ b/tests/CourseBundle/Repository/CCourseDescriptionRepositoryTest.php @@ -10,6 +10,7 @@ use Chamilo\CourseBundle\Entity\CCourseDescription; use Chamilo\CourseBundle\Repository\CCourseDescriptionRepository; use Chamilo\Tests\AbstractApiTest; use Chamilo\Tests\ChamiloTestTrait; +use function count; class CCourseDescriptionRepositoryTest extends AbstractApiTest { @@ -50,7 +51,6 @@ class CCourseDescriptionRepositoryTest extends AbstractApiTest $course = $this->createCourse('Test'); $session = $this->createSession('Test Session'); - $admin = $this->getUser('admin'); $item = (new CCourseDescription()) @@ -68,11 +68,9 @@ class CCourseDescriptionRepositoryTest extends AbstractApiTest $em->flush(); $descriptionsInCourse = $repo->findByTypeInCourse(CCourseDescription::TYPE_DESCRIPTION, $course); - - $this->assertSame(1, \count($descriptionsInCourse)); + $this->assertCount(1, $descriptionsInCourse); $descriptionsInSession = $repo->findByTypeInCourse(CCourseDescription::TYPE_DESCRIPTION, $course, $session); - - $this->assertSame(1, \count($descriptionsInSession)); + $this->assertCount(1, $descriptionsInSession); } } diff --git a/tests/CourseBundle/Repository/CQuizRepositoryTest.php b/tests/CourseBundle/Repository/CQuizRepositoryTest.php index 9ea5687599..e7ea948dac 100644 --- a/tests/CourseBundle/Repository/CQuizRepositoryTest.php +++ b/tests/CourseBundle/Repository/CQuizRepositoryTest.php @@ -119,8 +119,10 @@ class CQuizRepositoryTest extends AbstractApiTest ; $repo->create($exercise); + $this->assertTrue($exercise->isVisible($course)); + $qb = $repo->findAllByCourse($course); - $this->assertSame(2, \count($qb->getQuery()->getResult())); + $this->assertCount(2, $qb->getQuery()->getResult()); $found = $repo->findCourseResourceByTitle('exercise 1', $course->getResourceNode(), $course); $this->assertNotNull($found); @@ -139,18 +141,40 @@ class CQuizRepositoryTest extends AbstractApiTest // Find resources. $foundList = $repo->findCourseResourcesByTitle('exercise 1', $course->getResourceNode(), $course); - $this->assertSame(2, \count($foundList)); + $this->assertCount(2, $foundList); $items = $repo->getResourcesByCourseOnly($course, $course->getResourceNode())->getQuery()->getResult(); - $this->assertTrue(\count($items) > 0); + $this->assertCount(2, $items); $qb = $repo->getResourcesByCreator($teacher, $course->getResourceNode()); - $this->assertSame(2, \count($qb->getQuery()->getResult())); + $this->assertCount(2, $qb->getQuery()->getResult()); $qb = $repo->getResourcesByCourseLinkedToUser($teacher, $course); - $this->assertSame(2, \count($qb->getQuery()->getResult())); + $this->assertCount(2, $qb->getQuery()->getResult()); $qb = $repo->getResourcesByLinkedUser($teacher, $course->getResourceNode()); - $this->assertSame(0, \count($qb->getQuery()->getResult())); + $this->assertCount(0, $qb->getQuery()->getResult()); + + $session = $this->createSession('session 1'); + + $exercise = (new CQuiz()) + ->setTitle('exercise 2') + ->setParent($course) + ->setCreator($teacher) + ->addCourseLink($course, $session) + ; + $repo->create($exercise); + + $items = $repo->getResourcesByCourseOnly($course, $course->getResourceNode())->getQuery()->getResult(); + $this->assertCount(2, $items); + + $items = $repo->getResourcesByCourse($course)->getQuery()->getResult(); + $this->assertCount(2, $items); + + $items = $repo->getResourcesByCourse($course, $session)->getQuery()->getResult(); + $this->assertCount(3, $items); + + $this->assertFalse($exercise->isVisible($course)); + $this->assertTrue($exercise->isVisible($course, $session)); } }