Resources: Use ResourceShowCourseResourcesInSessionInterface

Instead of ShowCourseResourcesInSessionTrait

+ add tests
pull/4006/head
Julio 4 years ago
parent e7013d98da
commit e6ef0a3bc7
  1. 7
      src/CoreBundle/Entity/AbstractResource.php
  2. 2
      src/CoreBundle/Entity/ResourceShowCourseResourcesInSessionInterface.php
  3. 12
      src/CoreBundle/Repository/ResourceRepository.php
  4. 3
      src/CoreBundle/Traits/PersonalResourceTrait.php
  5. 20
      src/CoreBundle/Traits/ShowCourseResourcesInSessionTrait.php
  6. 8
      src/CourseBundle/Entity/CCourseDescription.php
  7. 6
      src/CourseBundle/Entity/CDocument.php
  8. 6
      src/CourseBundle/Entity/CLp.php
  9. 5
      src/CourseBundle/Entity/CQuiz.php
  10. 6
      src/CourseBundle/Entity/CQuizQuestionCategory.php
  11. 6
      src/CourseBundle/Entity/CTool.php
  12. 54
      src/CourseBundle/Repository/CToolRepository.php
  13. 8
      tests/CourseBundle/Repository/CCourseDescriptionRepositoryTest.php
  14. 36
      tests/CourseBundle/Repository/CQuizRepositoryTest.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) {

@ -6,6 +6,6 @@ declare(strict_types=1);
namespace Chamilo\CoreBundle\Entity;
interface ResourceToCourseInterface
interface ResourceShowCourseResourcesInSessionInterface
{
}

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

@ -6,9 +6,6 @@ declare(strict_types=1);
namespace Chamilo\CoreBundle\Traits;
/**
* Trait ShowCourseResourcesInSessionTrait.
*/
trait PersonalResourceTrait
{
protected bool $loadPersonalResources = true;

@ -1,20 +0,0 @@
<?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Traits;
/**
* Trait ShowCourseResourcesInSessionTrait.
*/
trait ShowCourseResourcesInSessionTrait
{
protected bool $loadCourseResourcesInSession = true;
public function isLoadCourseResourcesInSession(): bool
{
return $this->loadCourseResourcesInSession;
}
}

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

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

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

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

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

@ -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"})
*

@ -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;
}*/
}

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

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

Loading…
Cancel
Save