diff --git a/public/main/exercise/exercise.php b/public/main/exercise/exercise.php index f700566172..6ce9f00449 100644 --- a/public/main/exercise/exercise.php +++ b/public/main/exercise/exercise.php @@ -89,7 +89,8 @@ if ($is_allowedToEdit && !empty($action)) { case 'add_shortcut': $repo = Container::getShortcutRepository(); $courseEntity = api_get_course_entity(api_get_course_int_id()); - $repo->addShortCut($exerciseEntity, $courseEntity, $courseEntity, api_get_session_entity()); + $user = api_get_user_entity(); + $repo->addShortCut($exerciseEntity, $user, $courseEntity, api_get_session_entity()); Display::addFlash(Display::return_message(get_lang('Updated'))); diff --git a/public/main/lp/learnpath.class.php b/public/main/lp/learnpath.class.php index a1f769e72a..ff0c7ad170 100644 --- a/public/main/lp/learnpath.class.php +++ b/public/main/lp/learnpath.class.php @@ -3282,10 +3282,8 @@ class learnpath return false; } $repoShortcut = Container::getShortcutRepository(); - $courseEntity = api_get_course_entity(); - if ($addShortcut) { - $repoShortcut->addShortCut($lp, $courseEntity, $courseEntity, api_get_session_entity()); + $repoShortcut->addShortCut($lp, api_get_user_entity(), api_get_course_entity(), api_get_session_entity()); } else { $repoShortcut->removeShortCut($lp); } @@ -3320,7 +3318,7 @@ class learnpath $repoShortcut = Container::getShortcutRepository(); if ($addShortcut) { $courseEntity = api_get_course_entity(api_get_course_int_id()); - $repoShortcut->addShortCut($category, $courseEntity, $courseEntity, api_get_session_entity()); + $repoShortcut->addShortCut($category, api_get_user_entity(), $courseEntity, api_get_session_entity()); } else { $repoShortcut->removeShortCut($category); } diff --git a/src/CourseBundle/Entity/CQuizQuestionCategory.php b/src/CourseBundle/Entity/CQuizQuestionCategory.php index 9c4104c288..7ddb2cba38 100644 --- a/src/CourseBundle/Entity/CQuizQuestionCategory.php +++ b/src/CourseBundle/Entity/CQuizQuestionCategory.php @@ -11,13 +11,10 @@ use Chamilo\CoreBundle\Entity\ResourceInterface; use Chamilo\CoreBundle\Entity\ResourceShowCourseResourcesInSessionInterface; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; -use Doctrine\ORM\Event\LifecycleEventArgs; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; /** - * CQuizQuestionCategory. - * * @ORM\Table( * name="c_quiz_question_category", * indexes={ @@ -116,17 +113,6 @@ class CQuizQuestionCategory extends AbstractResource implements ResourceInterfac return $this->description; } - /** - * @ORM\PostPersist() - */ - public function postPersist(LifecycleEventArgs $args): void - { - // Update id with iid value - /*$em = $args->getEntityManager(); - $em->persist($this); - $em->flush();*/ - } - /** * @return Collection|CQuizQuestion[] */ diff --git a/src/CourseBundle/Repository/CShortcutRepository.php b/src/CourseBundle/Repository/CShortcutRepository.php index 38c6db6ff3..88be694b70 100644 --- a/src/CourseBundle/Repository/CShortcutRepository.php +++ b/src/CourseBundle/Repository/CShortcutRepository.php @@ -9,12 +9,10 @@ namespace Chamilo\CourseBundle\Repository; use Chamilo\CoreBundle\Entity\AbstractResource; use Chamilo\CoreBundle\Entity\Course; use Chamilo\CoreBundle\Entity\ResourceInterface; -use Chamilo\CoreBundle\Entity\ResourceNode; use Chamilo\CoreBundle\Entity\Session; +use Chamilo\CoreBundle\Entity\User; use Chamilo\CoreBundle\Repository\ResourceRepository; -use Chamilo\CourseBundle\Entity\CGroup; use Chamilo\CourseBundle\Entity\CShortcut; -use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; final class CShortcutRepository extends ResourceRepository @@ -24,7 +22,7 @@ final class CShortcutRepository extends ResourceRepository parent::__construct($registry, CShortcut::class); } - public function getShortcutFromResource(AbstractResource $resource): ?CShortcut + public function getShortcutFromResource(ResourceInterface $resource): ?CShortcut { $criteria = [ 'shortCutNode' => $resource->getResourceNode(), @@ -33,16 +31,16 @@ final class CShortcutRepository extends ResourceRepository return $this->findOneBy($criteria); } - public function addShortCut(AbstractResource $resource, ResourceInterface $parent, Course $course, Session $session = null): CShortcut + public function addShortCut(ResourceInterface $resource, User $user, Course $course, Session $session = null): CShortcut { $shortcut = $this->getShortcutFromResource($resource); if (null === $shortcut) { - $shortcut = new CShortcut(); - $shortcut + $shortcut = (new CShortcut()) ->setName($resource->getResourceName()) ->setShortCutNode($resource->getResourceNode()) - ->setParent($parent) + ->setCreator($user) + ->setParent($course) ->addCourseLink($course, $session) ; @@ -52,7 +50,7 @@ final class CShortcutRepository extends ResourceRepository return $shortcut; } - public function removeShortCut(AbstractResource $resource): bool + public function removeShortCut(ResourceInterface $resource): bool { $em = $this->getEntityManager(); $shortcut = $this->getShortcutFromResource($resource); @@ -65,26 +63,4 @@ final class CShortcutRepository extends ResourceRepository return false; } - - /*public function getResources(ResourceNode $parentNode, Course $course = null, Session $session = null, CGroup $group = null): QueryBuilder - { - $qb = $this->createQueryBuilder('resource') - ->select('resource') - //->from($className, 'resource') - ->innerJoin( - 'resource.resourceNode', - 'node' - ) - ->leftJoin('node.resourceFile', 'file') - //->innerJoin('node.resourceLinks', 'links') - //->where('node.resourceType = :type') - //->setParameter('type',$type) - ; - if (null !== $parentNode) { - $qb->andWhere('node.parent = :parentNode'); - $qb->setParameter('parentNode', $parentNode); - } - - return $qb; - }*/ } diff --git a/src/LtiBundle/Controller/CourseController.php b/src/LtiBundle/Controller/CourseController.php index 7f6201e5f1..6288144601 100644 --- a/src/LtiBundle/Controller/CourseController.php +++ b/src/LtiBundle/Controller/CourseController.php @@ -467,9 +467,11 @@ class CourseController extends ToolBaseController $em->flush(); $this->addFlash('success', $this->trans('External tool added')); + /** @var User $user */ + $user = $this->getUser(); if (!$externalTool->isActiveDeepLinking()) { - $this->shortcutRepository->addShortCut($externalTool, $course, $course); + $this->shortcutRepository->addShortCut($externalTool, $user, $course); return $this->redirectToRoute( 'chamilo_core_course_home', @@ -788,7 +790,9 @@ class CourseController extends ToolBaseController $em->persist($newTool); $em->flush(); - $this->shortcutRepository->addShortCut($newTool, $course, $course); + /** @var User $user */ + $user = $this->getUser(); + $this->shortcutRepository->addShortCut($newTool, $user, $course); return $newTool; } diff --git a/tests/CourseBundle/Repository/CCourseSettingRepositoryTest.php b/tests/CourseBundle/Repository/CCourseSettingRepositoryTest.php index 3ec4d85831..9ef81415a9 100644 --- a/tests/CourseBundle/Repository/CCourseSettingRepositoryTest.php +++ b/tests/CourseBundle/Repository/CCourseSettingRepositoryTest.php @@ -28,6 +28,10 @@ class CCourseSettingRepositoryTest extends AbstractApiTest ->setTitle('test') ->setVariable('test') ->setCategory('cat') + ->setSubkey('subkey') + ->setType('type') + ->setComment('comment') + ->setSubkeytext('text') ->setCId($courseId) ; $this->assertHasNoEntityViolations($item); diff --git a/tests/CourseBundle/Repository/CExerciseCategoryRepositoryTest.php b/tests/CourseBundle/Repository/CExerciseCategoryRepositoryTest.php index e49891f389..3b0000cf9d 100644 --- a/tests/CourseBundle/Repository/CExerciseCategoryRepositoryTest.php +++ b/tests/CourseBundle/Repository/CExerciseCategoryRepositoryTest.php @@ -36,5 +36,6 @@ class CExerciseCategoryRepositoryTest extends AbstractApiTest $this->assertSame('cat', (string) $item); $this->assertSame(1, $repo->count([])); + $this->assertCount(1, $repo->getCategories($course->getId())); } } diff --git a/tests/CourseBundle/Repository/CForumThreadRepositoryTest.php b/tests/CourseBundle/Repository/CForumThreadRepositoryTest.php index a0c7202dda..5a218775f1 100644 --- a/tests/CourseBundle/Repository/CForumThreadRepositoryTest.php +++ b/tests/CourseBundle/Repository/CForumThreadRepositoryTest.php @@ -57,6 +57,9 @@ class CForumThreadRepositoryTest extends AbstractApiTest $forum = $forumRepo->find($forum->getIid()); $this->assertSame('thread title', (string) $thread); + + $qb = $threadRepo->findAllByCourse($course); + $this->assertCount(1, $qb->getQuery()->getResult()); $this->assertSame(1, $threadRepo->count([])); $this->assertSame(1, $forumRepo->count([])); $this->assertSame(1, $forum->getThreads()->count()); diff --git a/tests/CourseBundle/Repository/CLpItemRepositoryTest.php b/tests/CourseBundle/Repository/CLpItemRepositoryTest.php index 2c1c34baff..396437fbcd 100644 --- a/tests/CourseBundle/Repository/CLpItemRepositoryTest.php +++ b/tests/CourseBundle/Repository/CLpItemRepositoryTest.php @@ -8,6 +8,8 @@ namespace Chamilo\Tests\CourseBundle\Repository; use Chamilo\CourseBundle\Entity\CLp; use Chamilo\CourseBundle\Entity\CLpItem; +use Chamilo\CourseBundle\Entity\CLpItemView; +use Chamilo\CourseBundle\Entity\CLpView; use Chamilo\CourseBundle\Repository\CLpItemRepository; use Chamilo\CourseBundle\Repository\CLpRepository; use Chamilo\Tests\AbstractApiTest; @@ -24,6 +26,7 @@ class CLpItemRepositoryTest extends AbstractApiTest $course = $this->createCourse('new'); $teacher = $this->createUser('teacher'); + $student = $this->createUser('student'); $lp = (new CLp()) ->setName('lp') @@ -42,12 +45,58 @@ class CLpItemRepositoryTest extends AbstractApiTest ->setDescription('lp') ->setTitle('lp item') ->setRef('ref') + ->setMinScore(100) + ->setMaxScore(100) + ->setMasteryScore(100) + ->setPreviousItemId(0) + ->setNextItemId(0) + ->setDisplayOrder(1) + ->setPrerequisite('') + ->setParameters('') + ->setLaunchData('') + ->setMaxTimeAllowed('100') + ->setTerms('') + ->setSearchDid(0) + ->setAudio('') + ->setPrerequisiteMinScore(100) + ->setPrerequisiteMaxScore(100) + ->setParent(null) + ->setLvl(0) ->setLp($lp) ->setItemType('document') ; $this->assertHasNoEntityViolations($lpItem); $lpItemRepo->create($lpItem); + $em = $this->getEntityManager(); + $view = (new CLpView()) + ->setUser($student) + ->setViewCount(1) + ->setLastItem(0) + ->setLp($lp) + ->setProgress(0) + ->setCourse($course) + ->setSession(null) + ; + $em->persist($view); + + $itemView = (new CLpItemView()) + ->setStatus('ok') + ->setCoreExit('exit') + ->setItem($lpItem) + ->setLessonLocation('') + ->setMaxScore('100') + ->setScore(100) + ->setStartTime(time()) + ->setSuspendData('') + ->setTotalTime(100) + ->setView($view) + ->setViewCount(1) + ; + + $em->persist($itemView); + $em->flush(); + $this->assertSame(1, $lp->getItems()->count()); $this->assertSame('lp', (string) $lp); $this->assertNotEmpty((string) $lpItem); diff --git a/tests/CourseBundle/Repository/CQuizQuestionCategoryRepositoryTest.php b/tests/CourseBundle/Repository/CQuizQuestionCategoryRepositoryTest.php new file mode 100644 index 0000000000..dfd8c9585a --- /dev/null +++ b/tests/CourseBundle/Repository/CQuizQuestionCategoryRepositoryTest.php @@ -0,0 +1,39 @@ +get(CQuizQuestionCategoryRepository::class); + + $course = $this->createCourse('new'); + $teacher = $this->createUser('teacher'); + + $category = (new CQuizQuestionCategory()) + ->setTitle('category') + ->setDescription('desc') + ->setParent($course) + ->setCreator($teacher) + ; + $this->assertHasNoEntityViolations($category); + $categoryRepo->create($category); + + $category = $categoryRepo->find($category->getIid()); + + $this->assertSame(0, $category->getQuestions()->count()); + $this->assertSame(1, $categoryRepo->count([])); + } +} diff --git a/tests/CourseBundle/Repository/CQuizQuestionRepositoryTest.php b/tests/CourseBundle/Repository/CQuizQuestionRepositoryTest.php index e76f96ad19..6da08eb982 100644 --- a/tests/CourseBundle/Repository/CQuizQuestionRepositoryTest.php +++ b/tests/CourseBundle/Repository/CQuizQuestionRepositoryTest.php @@ -7,7 +7,9 @@ declare(strict_types=1); namespace Chamilo\Tests\CourseBundle\Repository; use Chamilo\CourseBundle\Entity\CQuiz; +use Chamilo\CourseBundle\Entity\CQuizAnswer; use Chamilo\CourseBundle\Entity\CQuizQuestion; +use Chamilo\CourseBundle\Entity\CQuizQuestionCategory; use Chamilo\CourseBundle\Entity\CQuizRelQuestion; use Chamilo\CourseBundle\Repository\CQuizQuestionRepository; use Chamilo\Tests\AbstractApiTest; @@ -20,7 +22,7 @@ class CQuizQuestionRepositoryTest extends AbstractApiTest public function testCreate(): void { $em = $this->getEntityManager(); - $repo = self::getContainer()->get(CQuizQuestionRepository::class); + $questionRepo = self::getContainer()->get(CQuizQuestionRepository::class); $course = $this->createCourse('new'); $teacher = $this->createUser('teacher'); @@ -32,6 +34,13 @@ class CQuizQuestionRepositoryTest extends AbstractApiTest ; $em->persist($exercise); + $category = (new CQuizQuestionCategory()) + ->setTitle('category') + ->setParent($course) + ->setCreator($teacher) + ; + $em->persist($category); + $question = (new CQuizQuestion()) ->setQuestionCode('code') ->setQuestion('question') @@ -42,10 +51,15 @@ class CQuizQuestionRepositoryTest extends AbstractApiTest ->setLevel(1) ->setPonderation(100) ->setPosition(1) + ->setPicture('') ->setParent($course) ->addCourseLink($course) ->setCreator($teacher) ; + + $question->addCategory($category); + $question->updateCategory($category); + $em->persist($question); $quizRelQuestion = (new CQuizRelQuestion()) @@ -57,8 +71,29 @@ class CQuizQuestionRepositoryTest extends AbstractApiTest $em->flush(); + $answer = (new CQuizAnswer()) + ->setComment('comment') + ->setQuestion($question) + ->setPosition(1) + ->setAnswer('answer') + ->setAnswerCode('answer') + ->setDestination('') + ->setCorrect(1) + ->setHotspotCoordinates('') + ->setHotspotType('') + ->setPonderation(100) + ; + $em->persist($answer); + $em->flush(); + $em->clear(); + + $question = $questionRepo->find($question->getIid()); + + $this->assertSame(1, $question->getAnswers()->count()); $this->assertSame(1, $exercise->getQuestions()->count()); - $this->assertSame(1, $repo->count([])); - $this->assertSame('', $repo->getHotSpotImageUrl($question)); + $this->assertSame(1, $questionRepo->count([])); + $this->assertSame(1, $quizRelQuestion->getQuestionOrder()); + $this->assertSame('', $questionRepo->getHotSpotImageUrl($question)); + $this->assertSame(1, $question->getCategories()->count()); } } diff --git a/tests/CourseBundle/Repository/CShortcutRepositoryTest.php b/tests/CourseBundle/Repository/CShortcutRepositoryTest.php new file mode 100644 index 0000000000..7046b4dd0c --- /dev/null +++ b/tests/CourseBundle/Repository/CShortcutRepositoryTest.php @@ -0,0 +1,66 @@ +getEntityManager(); + $shortcutRepo = self::getContainer()->get(CShortcutRepository::class); + $forumRepo = self::getContainer()->get(CForumRepository::class); + + $course = $this->createCourse('new'); + $teacher = $this->createUser('teacher'); + + $resource = (new CForum()) + ->setForumTitle('forum') + ->setParent($course) + ->setCreator($teacher) + ->addCourseLink($course) + ; + $em->persist($resource); + $em->flush(); + + $shortcut = (new CShortcut()) + ->setName($resource->getResourceName()) + ->setShortCutNode($resource->getResourceNode()) + ->setCreator($teacher) + ->setParent($resource) + ->addCourseLink($course) + ; + $this->assertHasNoEntityViolations($shortcut); + $em->persist($shortcut); + $em->flush(); + + $this->assertSame(1, $shortcutRepo->count([])); + $this->assertSame($resource->getResourceName(), (string) $shortcut); + $this->assertNotNull($shortcut->getUrl()); + $this->assertNotNull($shortcut->getTool()); + + $shortcut = $shortcutRepo->getShortcutFromResource($resource); + $this->assertInstanceOf(CShortcut::class, $shortcut); + + $shortcutRepo->removeShortCut($resource); + + $this->assertSame(0, $shortcutRepo->count([])); + $this->assertSame(1, $forumRepo->count([])); + + $shortcutRepo->addShortCut($resource, $teacher, $course); + + $this->assertSame(1, $shortcutRepo->count([])); + } +}