diff --git a/src/ChamiloLMS/Controller/Admin/Administrator/BranchController.php b/src/ChamiloLMS/Controller/Admin/Administrator/BranchController.php index 646d67f583..d9de6e2d3e 100644 --- a/src/ChamiloLMS/Controller/Admin/Administrator/BranchController.php +++ b/src/ChamiloLMS/Controller/Admin/Administrator/BranchController.php @@ -10,6 +10,7 @@ use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; use Entity; use ChamiloLMS\Form\BranchType; +use ChamiloLMS\Form\BranchUsersType; use Symfony\Component\Routing\Annotation\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; @@ -38,8 +39,9 @@ class BranchController extends CommonController $addChildren = 'Add children'; $readLink = ''.$row['branchName'].''; $editLink = 'Edit'; + $addDirector = 'Add director'; $deleteLink = 'Delete'; - return $readLink.' '.$addChildren.' '.$editLink.' '.$deleteLink; + return $readLink.' '.$addChildren.' '.$addDirector.' '.$editLink.' '.$deleteLink; } //'representationField' => 'slug', //'html' => true @@ -63,6 +65,83 @@ class BranchController extends CommonController return new Response($response, 200, array()); } + /** + * + * @Route("/{id}/add-director", requirements={"id" = "\d+"}) + * @Method({"GET"}) + */ + public function addDirectorAction($id) + { + $extraJS[] = ''; + + $type = new BranchUsersType(); + $branchUsers = new Entity\BranchUsers(); + + $form = $this->createForm($type, $branchUsers); + $request = $this->getRequest(); + if ($request->getMethod() == 'POST') { + $form->bind($request); + if ($form->isValid()) { + $item = $form->getData(); + + $userIdList = $item->getUserId(); + $userId = ($userIdList[0]); + $user = $this->getManager()->getRepository('Entity\User')->find($userId); + if (!$user) { + throw new \Exception('Unable to found User'); + } + + $branch = $this->getRepository()->find($id); + + if (!$branch) { + throw new \Exception('Unable to found branch'); + } + + $branchUsers->setUser($user); + $branchUsers->setBranch($branch); + + $em = $this->getManager(); + $em->persist($branchUsers); + $em->flush(); + + $this->get('session')->getFlashBag()->add('success', "Saved"); + $url = $this->get('url_generator')->generate('branch.controller:readAction', array('id' => $id)); + return $this->redirect($url); + } + } + + + $template = $this->get('template'); + $template->assign('form', $form->createView()); + $template->assign('id', $id); + $response = $template->render_template($this->getTemplatePath().'add_director.tpl'); + return new Response($response, 200, array()); + } + + /** + * + * @Route("/{id}/remove-director/{userId}", requirements={"id" = "\d+"}) + * @Method({"GET"}) + */ + public function removeDirectorAction($id, $userId) + { + $criteria = array( + 'branchId' => $id, + 'userId' => $userId + ); + $branchUser = $this->getManager()->getRepository('Entity\BranchUsers')->findOneBy($criteria); + + if (!$branchUser) { + $this->createNotFoundException(); + } + $this->getManager()->remove($branchUser); + $this->getManager()->flush(); + + $url = $this->createUrl('read_link', array('id' => $id)); + $this->get('session')->getFlashBag()->add('success', "User removed"); + return $this->redirect($url); + } + /** * * @Route("/{id}", requirements={"id" = "\d+"}) diff --git a/src/ChamiloLMS/Controller/Admin/Administrator/JuryController.php b/src/ChamiloLMS/Controller/Admin/Administrator/JuryController.php index 42e5ab5184..57dcc7eeb4 100644 --- a/src/ChamiloLMS/Controller/Admin/Administrator/JuryController.php +++ b/src/ChamiloLMS/Controller/Admin/Administrator/JuryController.php @@ -105,9 +105,17 @@ class JuryController extends CommonController { $request = $this->getRequest(); $keyword = $request->get('tag'); - $repo = $this->get('orm.em')->getRepository('Entity\User'); - $entities = $repo->searchUserByKeyword($keyword); + $role = $request->get('role'); + /** @var Entity\Repository\UserRepository $repo */ + $repo = $this->getManager()->getRepository('Entity\User'); + + if (empty($role)) { + $entities = $repo->searchUserByKeyword($keyword); + } else { + $entities = $repo->searchUserByKeywordAndRole($keyword, $role); + } + $data = array(); if ($entities) { /** @var \Entity\User $entity */ @@ -127,16 +135,16 @@ class JuryController extends CommonController */ public function addMembersAction(Application $app, $id) { - $extraJS[] = ''; - $extraJS[] = ''; + $extraJS = array( + '', + '' + ); $app['extraJS'] = $extraJS; $juryUserType = new JuryMembersType(); $juryMember = new Entity\JuryMembers(); $juryMember->setJuryId($id); - - $form = $this->get('form.factory')->create($juryUserType, $juryMember); - + $form = $this->createForm($juryUserType, $juryMember); $request = $this->getRequest(); if ($request->getMethod() == 'POST') { $form->bind($request); diff --git a/src/ChamiloLMS/Controller/Admin/Director/BranchDirectorController.php b/src/ChamiloLMS/Controller/Admin/Director/BranchDirectorController.php index 3fa2fcc743..ffcb71e640 100644 --- a/src/ChamiloLMS/Controller/Admin/Director/BranchDirectorController.php +++ b/src/ChamiloLMS/Controller/Admin/Director/BranchDirectorController.php @@ -5,6 +5,8 @@ namespace ChamiloLMS\Controller\Admin\Director; use ChamiloLMS\Controller\CommonController; use ChamiloLMS\Form\BranchType; +use ChamiloLMS\Form\DirectorJuryUserType; + use ChamiloLMS\Form\JuryType; use Entity; use Silex\Application; @@ -28,12 +30,7 @@ class BranchDirectorController extends CommonController */ public function indexAction() { - $token = $this->get('security')->getToken(); - - if (null !== $token) { - $user = $token->getUser(); - $userId = $user->getUserId(); - } + $userId = $this->getUser()->getUserId(); $options = array( 'decorate' => true, @@ -41,10 +38,31 @@ class BranchDirectorController extends CommonController 'rootClose' => '', 'childOpen' => '
  • ', 'childClose' => '
  • ', - 'nodeDecorator' => function($row) { - //$addChildren = 'Add children'; - $readLink = $row['branchName'].' Assign users'; - return $readLink; + 'nodeDecorator' => function ($row) { + /** @var Entity\BranchSync $branch */ + $branch = $this->getManager()->getRepository('Entity\BranchSync')->find($row['id']); + $juries = $branch->getJuries(); + /** @var Entity\Jury $jury */ + $juryList = null; + foreach ($juries as $jury) { + $juryId = $jury->getId(); + + $url = $this->generateUrl( + 'branch_director.controller:listUsersAction', + array('juryId' => $juryId, 'branchId' => $row['id']) + ); + $viewUsers = ' User list'; + $url = $this->generateUrl( + 'branch_director.controller:addUsersAction', + array('juryId' => $juryId, 'branchId' => $row['id']) + ); + $addUserLink = ' Add users'; + + $juryList .= $jury->getName() . ' '.$addUserLink.$viewUsers.'
    '; + } + + + return $row['branchName'].'
    '.$juryList; } //'representationField' => 'slug', //'html' => true @@ -57,6 +75,9 @@ class BranchDirectorController extends CommonController ->createQueryBuilder() ->select('node') ->from('Entity\BranchSync', 'node') + ->innerJoin('node.users', 'u') + ->where('u.userId = :userId') + ->setParameter('userId', $userId) ->orderBy('node.root, node.lft', 'ASC') ->getQuery(); @@ -83,13 +104,14 @@ class BranchDirectorController extends CommonController $item = $this->getEntity($id); $template->assign('item', $item); - $form = $this->get('form.factory')->create(new JuryType()); + $form = $this->createForm(new JuryType()); - if ($request->getMethod() == 'POST') { + if ($request->isMethod('POST')) { $form->bind($this->getRequest()); if ($form->isValid()) { + } } @@ -98,17 +120,71 @@ class BranchDirectorController extends CommonController return new Response($response, 200, array()); } - private function saveUsers() + /** + * + * @Route("branches/{branchId}/jury/{juryId}/add-user") + * @Method({"GET"}) + */ + public function addUsersAction($juryId, $branchId) { + $template = $this->get('template'); + $request = $this->getRequest(); - } + $type = new DirectorJuryUserType(); - private function getUserFormType($users) - { + $user = new Entity\User(); + $form = $this->createForm($type, $user); + + $form->handleRequest($request); + if ($form->isValid()) { + + $jury = $this->getManager()->getRepository('Entity\Jury')->find($juryId); + + $factory = $this->get('security.encoder_factory'); + $encoder = $factory->getEncoder($user); + $pass = $encoder->encodePassword($user->getPassword(), $user->getSalt()); + $user->setPassword($pass); + $user->setStatus(STUDENT); + $user->setChatcallUserId(0); + $user->setChatcallDate(null); + $user->setCurriculumItems(null); + $user->setChatcallText(' '); + $user->setActive(true); + $em = $this->getManager(); + $em->persist($user); + + $user->getUserId(); + $role = current($user->getRoles()); + + $juryMember = new Entity\JuryMembers(); + $juryMember->setJury($jury); + $juryMember->setRole($role); + $juryMember->setUser($user); + + $em->persist($juryMember); + $em->flush(); + $this->get('session')->getFlashBag()->add('success', "User saved"); + //return $this->redirect($url); + + } + + $template->assign('form', $form->createView()); + $template->assign('juryId', $juryId); + $template->assign('branchId', $branchId); + $response = $template->render_template($this->getTemplatePath().'add_user.tpl'); + return new Response($response, 200, array()); } + /** + * + * @Route("branches/{branchId}/jury/{juryId}/list-user") + * @Method({"GET"}) + */ + public function listUsersAction() + { + } protected function getControllerAlias() { diff --git a/src/ChamiloLMS/Controller/Admin/JuryMember/JuryMemberController.php b/src/ChamiloLMS/Controller/Admin/JuryMember/JuryMemberController.php index 8782ef064c..93bff0801b 100644 --- a/src/ChamiloLMS/Controller/Admin/JuryMember/JuryMemberController.php +++ b/src/ChamiloLMS/Controller/Admin/JuryMember/JuryMemberController.php @@ -9,18 +9,20 @@ use Entity; use Silex\Application; use Symfony\Component\Form\Extension\Validator\Constraints\FormValidator; use Symfony\Component\HttpFoundation\Response; +use Doctrine\Common\Collections\Criteria; use Symfony\Component\Routing\Annotation\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; /** - * Class RoleController - * @todo @route and @method function don't work yet + * Class JuryMemberController * @package ChamiloLMS\Controller * @author Julio Montoya */ class JuryMemberController extends CommonController { + public $maxCountOfMemberToVoteToConsiderEvaluated = 3; + /** * @Route("/") * @Method({"GET"}) @@ -37,43 +39,195 @@ class JuryMemberController extends CommonController */ public function listUsersAction() { + $userId = $this->getUser()->getUserId(); + + /** @var Entity\Jury $jury */ + + $jury = $this->getRepository()->getJuryByUserId($userId); + + if (!$jury) { + $this->get('session')->getFlashBag()->add('warning', "No tiene un comité asignado."); + $url = $this->get('url_generator')->generate('jury_president.controller:indexAction'); + return $this->redirect($url); + } + + $attempts = $jury->getExerciseAttempts(); + + // @todo move logic in a repository + /** @var Entity\TrackExercise $attempt */ + $relations = array(); + $myStudentStatus = array(); + foreach ($attempts as $attempt) { + + $user = $attempt->getUser(); + $juryAttempts = $attempt->getJuryAttempts(); + + /** @var Entity\TrackExerciseAttemptJury $juryAttempt */ + $tempAttempt = array(); + foreach ($juryAttempts as $juryAttempt) { + if (!isset($tempAttempt[$juryAttempt->getJuryUserId()])) { + $tempAttempt[$juryAttempt->getJuryUserId()] = 1; + } else { + $tempAttempt[$juryAttempt->getJuryUserId()]++; + } + } + + $juryCorrections = 1; + foreach ($tempAttempt as $memberId => $answerCount) { + $relations[$attempt->getExeId()][$user->getUserId()][$memberId] = $answerCount; + + // the jury_member correct the attempt + if (!empty($answerCount) && $userId == $memberId) { + $myStudentStatus[$attempt->getExeId()][$user->getUserId()] = true; + } + $juryCorrections++; + } + } + + $members = $jury->getMembers(); + /** @var Entity\JuryMembers $member */ + $studentsByMember = array(); + foreach ($members as $member) { + $students = $member->getStudents(); + foreach ($students as $student) { + $studentsByMember[$member->getUserId()][] = $student->getUserId(); + } + } + + $template = $this->get('template'); + + $template->assign('my_student_status', $myStudentStatus); + $template->assign('relations', $relations); + $template->assign('attempts', $attempts); + $template->assign('members', $members); + $template->assign('students_by_member', $studentsByMember); + $template->assign('considered_evaluated', $this->maxCountOfMemberToVoteToConsiderEvaluated); + $template->assign('jury', $jury); + $response = $template->render_template($this->getTemplatePath().'assign_members.tpl'); + + return new Response($response, 200, array()); } /** - * @Route("/score-user/{exeId}") + * @Route("/score-attempt/{exeId}/jury/{juryId}") * @Method({"GET"}) */ - public function scoreUserAction($exeId) + public function scoreAttemptAction($exeId, $juryId) { + $userId = $this->getUser()->getUserId(); $trackExercise = \ExerciseLib::get_exercise_track_exercise_info($exeId); + if (empty($trackExercise)) { $this->createNotFoundException(); } + /** @var \Entity\Jury $jury */ + $jury = $this->getRepository()->find($juryId); + + if (empty($jury)) { + $this->createNotFoundException('Jury does not exists'); + } + + if ($jury->getExerciseId() != $trackExercise['exe_exo_id']) { + $this->createNotFoundException('Exercise attempt is not related with this jury.'); + } + + $members = $jury->getMembers(); + + $criteria = Criteria::create() + ->where(Criteria::expr()->eq("userId", $userId)) + ->setFirstResult(0) + ->setMaxResults(1); + /** @var Entity\JuryMembers $member */ + $member = $members->matching($criteria)->first(); + + if (empty($member)) { + $this->createNotFoundException('You are not part of the jury.'); + } + + $students = $member->getStudents(); + + $criteria = Criteria::create() + ->where(Criteria::expr()->eq("userId", $trackExercise['exe_user_id'])) + ->setFirstResult(0) + ->setMaxResults(1); + /** @var Entity\JuryMembers $member */ + $student = $students->matching($criteria)->first(); + + if (empty($student)) { + $this->createNotFoundException('You are not assigned to this user.'); + } + + $security = $this->get('security'); + + // Setting member only for president. + if ($security->isGranted('ROLE_JURY_PRESIDENT')) { + // Relating user with president + if ($member) { + $this->getManager()->getRepository('Entity\JuryMembers')->assignUserToJuryMember( + $trackExercise['exe_user_id'], + $member->getId() + ); + } + } + + $questionScoreTypeModel = array(); + + $criteria = array( + 'exeId' => $exeId, + 'juryUserId' => $userId + ); + + $trackJury = $this->getManager()->getRepository('Entity\TrackExerciseAttemptJury')->findBy($criteria); + + if ($trackJury) { + $this->get('session')->getFlashBag()->add('info', "You already review this exercise attempt."); + /** @var Entity\TrackExerciseAttemptJury $track */ + foreach ($trackJury as $track) { + $questionScoreTypeModel[$track->getQuestionId()] = $track->getQuestionScoreNameId(); + } + } + $questionList = explode(',', $trackExercise['data_tracking']); $exerciseResult = \ExerciseLib::getExerciseResult($trackExercise); $counter = 1; - $objExercise = new \Exercise(); + $objExercise = new \Exercise($trackExercise['c_id']); $objExercise->read($trackExercise['exe_exo_id']); - $show_results = true; $totalScore = $totalWeighting = 0; - $show_media = true; - $tempParentId = null; $mediaCounter = 0; $media_list = array(); + $modelType = $objExercise->getScoreTypeModel(); + + $options = array(); + + if ($modelType) { + /** @var \Entity\QuestionScore $questionScoreName */ + $questionScore = $this->get('orm.em')->getRepository('Entity\QuestionScore')->find($modelType); + if ($questionScore) { + $items = $questionScore->getItems(); + /** @var \Entity\QuestionScoreName $score */ + foreach ($items as $score) { + $options[$score->getId().':'.$score->getScore()] = $score; + } + } + } else { + return $this->createNotFoundException('The exercise does not contain a model type.'); + } + $exerciseContent = null; foreach ($questionList as $questionId) { ob_start(); - $choice = $exerciseResult[$questionId]; + $choice = isset($exerciseResult[$questionId]) ? $exerciseResult[$questionId] : null; // Creates a temporary Question object + /** @var \Question $objQuestionTmp */ $objQuestionTmp = \Question::read($questionId); if ($objQuestionTmp->parent_id != 0) { @@ -94,7 +248,17 @@ class JuryMemberController extends CommonController $questionWeighting = $objQuestionTmp->selectWeighting(); $answerType = $objQuestionTmp->selectType(); - $question_result = $objExercise->manageAnswers($exeId, $questionId, $choice,'exercise_show', array(), false, true, $show_results); + $question_result = $objExercise->manageAnswers( + $exeId, + $questionId, + $choice, + 'exercise_show', + array(), + false, + true, + true + ); + $questionScore = $question_result['score']; $totalScore += $question_result['score']; @@ -103,23 +267,42 @@ class JuryMemberController extends CommonController $totalWeighting += $questionWeighting; $score = array(); - if ($show_results) { - $score['result'] = get_lang('Score')." : ".\ExerciseLib::show_score($my_total_score, $my_total_weight, false, false); - $score['pass'] = $my_total_score >= $my_total_weight ? true : false; - $score['type'] = $answerType; - $score['score'] = $my_total_score; - $score['weight'] = $my_total_weight; - $score['comments'] = isset($comnt) ? $comnt : null; - } + + $score['result'] = get_lang('Score')." : ".\ExerciseLib::show_score($my_total_score, $my_total_weight, false, false); + $score['pass'] = $my_total_score >= $my_total_weight ? true : false; + $score['type'] = $answerType; + $score['score'] = $my_total_score; + $score['weight'] = $my_total_weight; + $score['comments'] = isset($comnt) ? $comnt : null; $contents = ob_get_clean(); $question_content = '
    '; - $question_content .= $objQuestionTmp->return_header(null, $counter, $score, $show_media, $mediaCounter); + $question_content .= $objQuestionTmp->return_header($objExercise->feedback_type, $counter, $score, $show_media, $mediaCounter); + $question_content .= ''; // display question category, if any $question_content .= \Testcategory::getCategoryNamesForQuestion($questionId); - $question_content .= $contents; + + $defaultValue = isset($questionScoreTypeModel[$questionId]) ? $questionScoreTypeModel[$questionId] : null; + + //$question_content .= \Display::select('options['.$questionId.']', $options, $defaultValue); + foreach ($options as $value => $score) { + $attributes = array(); + if ($score->getId() == $defaultValue) { + $attributes = array('checked' => 'checked'); + } + $question_content .= ''; + } $question_content .= '
    '; $exerciseContent .= $question_content; @@ -127,19 +310,72 @@ class JuryMemberController extends CommonController } $template = $this->get('template'); - $template->assign('exercise', $exerciseContent); - - $response = $this->get('template')->render_template($this->getTemplatePath().'score_user.tpl'); + $template->assign('exe_id', $exeId); + $template->assign('jury_id', $juryId); + $response = $this->get('template')->render_template($this->getTemplatePath().'score_attempt.tpl'); return new Response($response, 200, array()); } /** - * @Route("/save-score") + * @Route("/save-score/{exeId}/jury/{juryId}") * @Method({"POST"}) */ - public function saveScoreAction() + public function saveScoreAction($exeId, $juryId) { + $questionsAndScore = $this->getRequest()->get('options'); + /** @var \Entity\TrackExercise $attempt */ + $attempt = $this->getManager()->getRepository('Entity\TrackExercise')->find($exeId); + + $totalScore = 0; + + if ($attempt) { + $userId = $this->getUser()->getUserId(); + $em = $this->getManager(); + + if (!empty($questionsAndScore)) { + foreach ($questionsAndScore as $questionId => $scoreInfo) { + $scoreInfo = explode(':', $scoreInfo); + $questionScoreNameId = $scoreInfo[0]; + $score = $scoreInfo[1]; + + $criteria = array( + 'exeId' => $exeId, + 'questionId' => $questionId, + 'juryUserId' => $userId + ); + + $totalScore += $score; + + $obj = $this->getManager()->getRepository('Entity\TrackExerciseAttemptJury')->findOneBy($criteria); + if ($obj) { + $obj->setQuestionScoreNameId($questionScoreNameId); + $obj->setScore($score); + } else { + $obj = new Entity\TrackExerciseAttemptJury(); + $obj->setJuryUserId($userId); + $obj->setAttempt($attempt); + $obj->setQuestionScoreNameId($questionScoreNameId); + $obj->setScore($score); + $obj->setQuestionId($questionId); + } + $em->persist($obj); + } + } + + // Updating TrackExercise do not + $attempt->setJuryId($juryId); + //$attempt->setJuryScore($totalScore); + $em->persist($attempt); + $em->flush(); + + $this->get('session')->getFlashBag()->add('success', "Saved"); + //$url = $this->generateUrl('jury_member.controller:scoreAttemptAction', array('exeId' => $exeId, 'juryId' => $juryId)); + $url = $this->generateUrl('jury_member.controller:listUsersAction'); + return $this->redirect($url); + } else { + return $this->createNotFoundException('Attempt not found'); + } } @@ -157,7 +393,7 @@ class JuryMemberController extends CommonController } /** - * @return \Entity\Repository\BranchSyncRepository + * @return \Entity\Repository\JuryRepository */ protected function getRepository() { diff --git a/src/ChamiloLMS/Controller/Admin/JuryPresident/JuryPresidentController.php b/src/ChamiloLMS/Controller/Admin/JuryPresident/JuryPresidentController.php index 56e4a4cd31..2cdaf8b2c5 100644 --- a/src/ChamiloLMS/Controller/Admin/JuryPresident/JuryPresidentController.php +++ b/src/ChamiloLMS/Controller/Admin/JuryPresident/JuryPresidentController.php @@ -10,9 +10,11 @@ use Entity; use Silex\Application; use Symfony\Component\Form\Extension\Validator\Constraints\FormValidator; use Symfony\Component\HttpFoundation\Response; +use Doctrine\Common\Collections\Criteria; use Symfony\Component\Routing\Annotation\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; +use Whoops\Example\Exception; /** * Class RoleController @@ -22,6 +24,7 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; */ class JuryPresidentController extends CommonController { + public $maxCountOfMemberToVoteToConsiderEvaluated = 3; /** * @Route("/") * @Method({"GET"}) @@ -37,23 +40,22 @@ class JuryPresidentController extends CommonController * @Route("/open-jury") * @Method({"GET, POST"}) */ - public function openJuryAction(Application $app) + public function openJuryAction() { - $token = $app['security']->getToken(); - if (null !== $token) { - $user = $token->getUser(); - } + $user = $this->getUser(); // @todo where is get this value? $juryId = null; /** @var Entity\Jury $jury */ + $jury = $this->getEntity($juryId); $jury->setOpeningDate(new \DateTime()); $jury->setOpeningUserId($user->getUserId()); $this->updateAction($jury); $this->get('session')->getFlashBag()->add('success', "Comité abierto"); + //$this->get('session')->getFlashBag()->add('success', "Comité no encontrado"); $url = $this->get('url_generator')->generate('jury_president.controller:indexAction'); return $this->redirect($url); } @@ -64,10 +66,7 @@ class JuryPresidentController extends CommonController */ public function closeJuryAction(Application $app) { - $token = $app['security']->getToken(); - if (null !== $token) { - $user = $token->getUser(); - } + $user = $this->getUser(); // @todo where is get this value? $juryId = null; @@ -87,12 +86,9 @@ class JuryPresidentController extends CommonController * @Route("/close-score") * @Method({"GET, POST"}) */ - public function closeScoreAction(Application $app) + public function closeScoreAction() { - $token = $app['security']->getToken(); - if (null !== $token) { - $user = $token->getUser(); - } + $user = $this->getUser(); // @todo where is get this value? $juryId = null; @@ -109,20 +105,100 @@ class JuryPresidentController extends CommonController } /** - * @Route("/assign-members") + * @Route("/assign-user/{userId}/{juryMemberId}") * @Method({"GET"}) */ - public function assignMembersAction() + public function assignUserToJuryMemberAction($userId, $juryMemberId) { - $token = $this->get('security')->getToken(); + return $this->getManager()->getRepository('Entity\JuryMembers')->assignUserToJuryMember($userId, $juryMemberId); + } - if (null !== $token) { - $user = $token->getUser(); - $userId = $user->getUserId(); + /** + * @Route("/remove-user/{userId}/{juryMemberId}") + * @Method({"GET"}) + */ + public function removeUserToJuryMemberAction($userId, $juryMemberId) + { + return $this->getManager()->getRepository('Entity\JuryMembers')->removeUserToJuryMember($userId, $juryMemberId); + } + + /** + * @Route("/auto-assign-users/{juryId}") + * @Method({"GET"}) + */ + public function autoAssignUsersAction($juryId) + { + $userId = $this->getUser()->getUserId(); + + /** @var \Entity\Jury $jury */ + $jury = $this->getRepository()->find($juryId); + + if (empty($jury)) { + $this->createNotFoundException('Jury does not exists'); + } + + $members = $jury->getMembers(); + + $criteria = Criteria::create() + ->where(Criteria::expr()->eq("userId", $userId)) + ->setFirstResult(0) + ->setMaxResults(1); + + /** @var Entity\JuryMembers $member */ + $member = $members->matching($criteria)->first(); + + if (empty($member)) { + $this->createNotFoundException('You are not part of the jury.'); } + $exerciseAttempt = $jury->getExerciseAttempts(); + + $hasStudents = $this->getRepository()->getStudentsByJury($juryId); + + // Nothing was saved and no assignation exists + if (empty($trackJuryAttempts) && $hasStudents == false) { + $userList = array(); + /** @var Entity\TrackExercise $attempt */ + foreach ($exerciseAttempt as $attempt) { + $studentId = $attempt->getExeUserId(); + if (!in_array($studentId, $userList)) { + $userList[] = $attempt->getExeUserId(); + } + } + + $members = $jury->getMembers()->getValues(); + $count = count($members); + + $maxCount = $this->maxCountOfMemberToVoteToConsiderEvaluated; + if ($count < $this->maxCountOfMemberToVoteToConsiderEvaluated) { + $maxCount = $count; + } + foreach ($userList as $userId) { + $randomMembers = array_rand($members, $maxCount); + foreach ($randomMembers as $randomMember) { + $member = $members[$randomMember]; + $this->getManager()->getRepository('Entity\JuryMembers')->assignUserToJuryMember($userId, $member->getId()); + } + } + $this->get('session')->getFlashBag()->add('success', "Los usuarios fueron asignados al azar"); + $url = $this->get('url_generator')->generate('jury_president.controller:assignMembersAction'); + return $this->redirect($url); + } + } + + + /** + * @Route("/assign-members") + * @Method({"GET"}) + */ + public function assignMembersAction() + { + $user = $this->getUser(); + $userId = $user->getUserId(); + /** @var Entity\Jury $jury */ - $jury = $this->getRepository()->getJuryByPresidentId($userId); + + $jury = $this->getRepository()->getJuryByUserId($userId); if (!$jury) { $this->get('session')->getFlashBag()->add('warning', "No tiene un comité asignado."); @@ -130,52 +206,67 @@ class JuryPresidentController extends CommonController return $this->redirect($url); } - // @todo add to a repository - // $students = $this->getRepository()->getStudentsByJury($jury->getId()); - $attempts = $jury->getExerciseAttempts(); // @todo move logic in a repository /** @var Entity\TrackExercise $attempt */ - $students = array(); $relations = array(); - $myStatusForStudent = array(); + $globalStudentStatus = array(); + $myStudentStatus = array(); foreach ($attempts as $attempt) { - $user = $attempt->getUser(); - $students[] = $user; $juryAttempts = $attempt->getJuryAttempts(); /** @var Entity\TrackExerciseAttemptJury $juryAttempt */ $tempAttempt = array(); foreach ($juryAttempts as $juryAttempt) { - if (!isset($tempAttempt[$juryAttempt->getJuryMemberId()])) { - $tempAttempt[$juryAttempt->getJuryMemberId()] = 1; + if (!isset($tempAttempt[$juryAttempt->getJuryUserId()])) { + $tempAttempt[$juryAttempt->getJuryUserId()] = 1; } else { - $tempAttempt[$juryAttempt->getJuryMemberId()]++; + $tempAttempt[$juryAttempt->getJuryUserId()]++; } } + $juryCorrections = 1; foreach ($tempAttempt as $memberId => $answerCount) { - $relations[$user->getUserId()][$memberId] = $answerCount; - if ($userId == $memberId) { - if ($answerCount == 3) { - $myStatusForStudent[$user->getUserId()] = true; - } else { - $myStatusForStudent[$user->getUserId()] = false; - } + $relations[$attempt->getExeId()][$user->getUserId()][$memberId] = $answerCount; + + // the jury_member correct the attempt + if (!empty($answerCount) && $userId == $memberId) { + $myStudentStatus[$attempt->getExeId()][$user->getUserId()] = true; } + + if ($juryCorrections == $this->maxCountOfMemberToVoteToConsiderEvaluated) { + $globalStudentStatus[$user->getUserId()] = true; + } else { + $globalStudentStatus[$user->getUserId()] = false; + } + $juryCorrections++; } } $members = $jury->getMembers(); + /** @var Entity\JuryMembers $member */ + $studentsByMember = array(); + foreach ($members as $member) { + $students = $member->getStudents(); + foreach ($students as $student) { + $studentsByMember[$member->getUserId()][] = $student->getUserId(); + } + } + + $hasStudents = $this->getRepository()->getStudentsByJury($jury->getId()); + $template = $this->get('template'); - $template->assign('my_status_for_student', $myStatusForStudent); + $template->assign('has_students', $hasStudents); + $template->assign('global_student_status', $globalStudentStatus); + $template->assign('my_student_status', $myStudentStatus); $template->assign('relations', $relations); $template->assign('attempts', $attempts); $template->assign('members', $members); - //$template->assign('students', $students); + $template->assign('students_by_member', $studentsByMember); + $template->assign('considered_evaluated', $this->maxCountOfMemberToVoteToConsiderEvaluated); $template->assign('jury', $jury); $response = $template->render_template($this->getTemplatePath().'assign_members.tpl'); diff --git a/src/ChamiloLMS/Controller/IndexController.php b/src/ChamiloLMS/Controller/IndexController.php index 95a0cb396e..460cdfa52e 100644 --- a/src/ChamiloLMS/Controller/IndexController.php +++ b/src/ChamiloLMS/Controller/IndexController.php @@ -100,31 +100,6 @@ class IndexController extends CommonController $app['this_section'] = SECTION_CAMPUS; $request = $app['request']; - /* - $sql = 'SELECT * from user WHERE user_id = 1'; - var_dump($sql); - $result = \Database::query($sql); - var_dump(\Database::fetch_object($result));*/ - - // Testing translation using translator - //echo $app['translator']->trans('Wiki Search Results'); - //echo $app['translator']->trans('Profile'); - - //$token = $app['security']->getToken(); - - //$article = $app['orm.em']->getRepository('Entity\Course'); - //$courses_query = $app['orm.em']->createQuery('SELECT a FROM Entity\Course a'); - //$a = new Course(); - //$article = $app['orm.em']->getRepository('Course'); - //var_dump($article); - //$courses_query = $app['orm.em']->createQuery('SELECT a FROM Entity\Course a'); - /* - $paginator = new Doctrine\ORM\Tools\Pagination\Paginator($courses_query, $fetchJoinCollection = true); - $c = count($paginator); - foreach ($paginator as $course) { - echo $course->getCode() . "\n"; - } - exit; */ if (api_get_setting('allow_terms_conditions') == 'true') { unset($_SESSION['term_and_condition']); } diff --git a/src/ChamiloLMS/Controller/Tool/Curriculum/CurriculumController.php b/src/ChamiloLMS/Controller/Tool/Curriculum/CurriculumController.php index c1c2ff5eab..afbc883a13 100644 --- a/src/ChamiloLMS/Controller/Tool/Curriculum/CurriculumController.php +++ b/src/ChamiloLMS/Controller/Tool/Curriculum/CurriculumController.php @@ -24,7 +24,7 @@ class CurriculumController extends CommonController * @Route("/") * @Method({"GET"}) */ - public function indexAction($course) + public function indexAction() { // Redirecting to curriculum user // @todo Fix redirection diff --git a/src/ChamiloLMS/Form/JuryMembersType.php b/src/ChamiloLMS/Form/JuryMembersType.php index a66b11e00e..64ffd0e8dd 100644 --- a/src/ChamiloLMS/Form/JuryMembersType.php +++ b/src/ChamiloLMS/Form/JuryMembersType.php @@ -29,14 +29,13 @@ class JuryMembersType extends AbstractType $factory = $builder->getFormFactory(); // Fixes issue with the ajax select, waiting this workaround until symfony add ajax search into the core - $builder->addEventListener(FormEvents::PRE_BIND, function($event) use ($factory, $builder) { + $builder->addEventListener(FormEvents::PRE_SUBMIT, function($event) use ($factory, $builder) { $form = $event->getForm(); $case = $event->getData(); $id = $case['user_id'][0]; if ($case) { $form->remove('user_id'); - $form->add($factory->createNamed('user_id', 'hidden', $id, array('auto_initialize' => false))); } });