Adding distribution changes see #6718
parent
30674e425a
commit
ab3a81aa44
@ -0,0 +1,11 @@ |
||||
{% extends app.template_style ~ "/layout/layout_1_col.tpl" %} |
||||
{% block content %} |
||||
|
||||
<a href="{{ url('exercise_distribution.controller:indexAction', {'exerciseId' : exerciseId }) }}"> |
||||
{{ 'List' |trans }} |
||||
</a> |
||||
<hr /> |
||||
<form action="{{ url('exercise_distribution.controller:addDistributionAction', {'exerciseId' : exerciseId }) }}" method="post" {{ form_enctype(form) }}> |
||||
{{ form_widget(form) }} |
||||
</form> |
||||
{% endblock %} |
||||
@ -0,0 +1,11 @@ |
||||
{% extends app.template_style ~ "/layout/layout_1_col.tpl" %} |
||||
{% block content %} |
||||
|
||||
<a href="{{ url('exercise_distribution.controller:indexAction', {'exerciseId' : exerciseId }) }}"> |
||||
{{ 'List' |trans }} |
||||
</a> |
||||
<hr /> |
||||
<form action="{{ url('exercise_distribution.controller:editDistributionAction', {'exerciseId' : exerciseId, 'id' : id }) }}" method="post" {{ form_enctype(form) }}> |
||||
{{ form_widget(form) }} |
||||
</form> |
||||
{% endblock %} |
||||
@ -0,0 +1,31 @@ |
||||
{% extends app.template_style ~ "/layout/layout_1_col.tpl" %} |
||||
{% block content %} |
||||
<a href="{{ url('exercise_distribution.controller:addDistributionAction', {'exerciseId' : exerciseId }) }}"> |
||||
{{ 'Add' |trans }} |
||||
</a> |
||||
<table class="table"> |
||||
{% for item in items %} |
||||
<tr> |
||||
<td> |
||||
<a href="{{ url('exercise_distribution.controller:readAction', { 'exerciseId' : exerciseId, 'id' : item.id }) }}"> |
||||
{{ item.title }} |
||||
</a> |
||||
</td> |
||||
<td> |
||||
{{ item.active }} |
||||
</td> |
||||
<td> |
||||
<a class="btn" href="{{ url('exercise_distribution.controller:editDistributionAction', |
||||
{ 'exerciseId' : exerciseId, id: item.id }) }}"> {{ 'Edit' |trans }}</a> |
||||
<a class="btn" href="{{ url('exercise_distribution.controller:toogleVisibilityAction', |
||||
{ 'exerciseId' : exerciseId, id: item.id }) }}"> {{ 'Visible' |trans }}</a> |
||||
<a class="btn" href="{{ url('exercise_distribution.controller:applyDistributionAction', |
||||
{ 'exerciseId' : exerciseId, id: item.id }) }}"> {{ 'Apply distribution' |trans }}</a> |
||||
|
||||
<a class="btn" href="{{ url('exercise_distribution.controller:deleteDistributionAction', |
||||
{ 'exerciseId' : exerciseId, id: item.id }) }}"> {{ 'Delete' |trans }}</a> |
||||
</td> |
||||
</tr> |
||||
{% endfor %} |
||||
</table> |
||||
{% endblock %} |
||||
@ -0,0 +1,31 @@ |
||||
{% extends app.template_style ~ "/layout/layout_1_col.tpl" %} |
||||
{% block content %} |
||||
<a href="{{ url(links.list_link) }}"> |
||||
List |
||||
</a> |
||||
|
||||
<h3>#{{ item.id }} {{ item.branchName }} </h3> |
||||
|
||||
{% if item.getUsers %} |
||||
<hr /> |
||||
<h4> {{ 'Users' | trans }} </h4> |
||||
|
||||
<a class="btn" href="{{ url('branch.controller:addDirectorAction', { "id" : item.id }) }}"> Add users </a> |
||||
{% for branchUsers in item.getUsers %} |
||||
<li> |
||||
{{ branchUsers.user.getCompleteName }} - {{ branchUsers.role.name }} |
||||
<a class="btn btn-danger" href="{{ url('branch.controller:removeDirectorAction', { 'id': item.id, 'userId':branchUsers.user.userId }) }}"> |
||||
Remove |
||||
</a> |
||||
</li> |
||||
{% endfor %} |
||||
{% endif %} |
||||
<hr /> |
||||
<ul> |
||||
{% for subitem in subitems %} |
||||
<li> |
||||
<a href="{{ url(links.read_link, { id: subitem.id} ) }}">{{ subitem.branchName }}</a> |
||||
</li> |
||||
{% endfor %} |
||||
</ul> |
||||
{% endblock %} |
||||
@ -0,0 +1,343 @@ |
||||
<?php |
||||
/* For licensing terms, see /license.txt */ |
||||
|
||||
namespace ChamiloLMS\Controller\Admin\QuestionManager; |
||||
|
||||
use Silex\Application; |
||||
use ChamiloLMS\Controller\CommonController; |
||||
use Entity; |
||||
use Symfony\Component\Form\Extension\Validator\Constraints\FormValidator; |
||||
use Symfony\Component\HttpFoundation\Response; |
||||
use Symfony\Component\Routing\Annotation\Route; |
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; |
||||
use ChamiloLMS\Form\CQuizDistributionType; |
||||
use Doctrine\Common\Collections\Criteria; |
||||
|
||||
/** |
||||
* Class DistributionController |
||||
* @package ChamiloLMS\Controller |
||||
* @author Julio Montoya <gugli100@gmail.com> |
||||
*/ |
||||
class ExerciseDistributionController extends CommonController |
||||
{ |
||||
public $exerciseId = null; |
||||
|
||||
/** |
||||
* @Route("/{exerciseId}/distribution/list") |
||||
* @Method({"GET"}) |
||||
*/ |
||||
public function indexAction($exerciseId) |
||||
{ |
||||
$criteria = array('exerciseId' => $exerciseId); |
||||
$items = $this->getRepository()->findBy($criteria); |
||||
|
||||
$template = $this->get('template'); |
||||
$template->assign('exerciseId', $exerciseId); |
||||
$template->assign('items', $items); |
||||
$template->assign('links', $this->generateLinks()); |
||||
$response = $template->render_template($this->getTemplatePath().'list.tpl'); |
||||
return new Response($response, 200, array()); |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @Route("/{exerciseId}/distribution/{id}", requirements={"id" = "\d+"}) |
||||
* @Method({"GET"}) |
||||
*/ |
||||
public function readAction($id) |
||||
{ |
||||
return parent::readAction($id); |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @Route("/{exerciseId}/distribution/{id}/toggle_visibility", requirements={"id" = "\d+"}) |
||||
* @Method({"GET"}) |
||||
*/ |
||||
public function toogleVisibilityAction($exerciseId, $id) |
||||
{ |
||||
$criteria = array('exerciseId' => $exerciseId, 'id' => $id); |
||||
/** @var Entity\CQuizDistribution $distribution */ |
||||
$distribution = $this->getRepository()->findOneBy($criteria); |
||||
|
||||
$distribution->setActive(!$distribution->getActive()); |
||||
|
||||
$this->getManager()->persist($distribution); |
||||
$this->getManager()->flush(); |
||||
|
||||
$this->get('session')->getFlashBag()->add('success', "Visibility changed"); |
||||
$url = $this->createUrl('list_link'); |
||||
return $this->redirect($url); |
||||
} |
||||
|
||||
/** |
||||
* @Route("/{exerciseId}/distribution/{id}/apply") |
||||
* @Method({"GET"}) |
||||
*/ |
||||
public function applyDistributionAction($exerciseId, $id) |
||||
{ |
||||
$em = $this->getManager(); |
||||
$criteria = array('exerciseId' => $exerciseId); |
||||
$distributionRelSession = $em->getRepository('Entity\CQuizDistributionRelSession')->findOneBy($criteria); |
||||
|
||||
if ($distributionRelSession) { |
||||
$em->remove($distributionRelSession); |
||||
$em->flush(); |
||||
} |
||||
|
||||
$distributionRelSession = new Entity\CQuizDistributionRelSession(); |
||||
/*$distributionRelSession->setCId($this->getCourse()->getId()); |
||||
$distributionRelSession->setSessionId($this->getSession()->getId());*/ |
||||
|
||||
$distributionRelSession->setCId(api_get_course_int_id()); |
||||
$distributionRelSession->setSessionId(api_get_session_id()); |
||||
|
||||
$distributionRelSession->setQuizDistributionId($id); |
||||
$distributionRelSession->setExerciseId($exerciseId); |
||||
$em->persist($distributionRelSession); |
||||
$em->flush(); |
||||
|
||||
$this->get('session')->getFlashBag()->add('success', "Distribution applied"); |
||||
$url = $this->createUrl('list_link'); |
||||
return $this->redirect($url); |
||||
} |
||||
|
||||
/** |
||||
* @Route("/{exerciseId}/distribution/add") |
||||
* @Method({"GET"}) |
||||
*/ |
||||
public function addDistributionAction($exerciseId) |
||||
{ |
||||
$template = $this->get('template'); |
||||
$em = $this->getManager(); |
||||
$this->exerciseId = $exerciseId; |
||||
$template->assign('exerciseId', $exerciseId); |
||||
|
||||
$request = $this->getRequest(); |
||||
$distribution = $this->getDefaultEntity(); |
||||
$form = $this->createForm($this->getFormType(), $distribution); |
||||
|
||||
$form->handleRequest($request); |
||||
|
||||
if ($form->isValid()) { |
||||
|
||||
$exercise = new \Exercise(); |
||||
$exercise->read($exerciseId); |
||||
$questionList = $exercise->getQuestionList(); |
||||
$exercise->get_categories_in_exercise(); |
||||
|
||||
/** @var Entity\CQuizDistribution $distribution */ |
||||
$distribution = $form->getData(); |
||||
|
||||
$distribution->setDataTracking(implode(',', $questionList)); |
||||
$distribution->setAuthorUserId($this->getUser()->getUserId()); |
||||
|
||||
$em->persist($distribution); |
||||
// Registering quiz distribution + quiz distribution questions |
||||
if ($distribution) { |
||||
foreach ($questionList as $questionId) { |
||||
$distributionQuestion = new Entity\CQuizDistributionQuestions(); |
||||
|
||||
$questionObj = \Question::read($questionId); |
||||
$categories = $questionObj->get_categories_from_question(); |
||||
if (!empty($categories)) { |
||||
$categoryId = current($categories); |
||||
$distributionQuestion->setCategoryId($categoryId); |
||||
} |
||||
$distributionQuestion->setQuestionId($questionId); |
||||
$distributionQuestion->setDistribution($distribution); |
||||
$em->persist($distributionQuestion); |
||||
} |
||||
} |
||||
|
||||
// Checking from all distributions |
||||
$em->flush(); |
||||
|
||||
$categoriesInExercise = $exercise->get_categories_in_exercise(); |
||||
|
||||
$questionsPerCategory = array(); |
||||
foreach ($categoriesInExercise as $categoryInfo) { |
||||
$categoryId = $categoryInfo['category_id']; |
||||
$questions = \Testcategory::getQuestionsByCategory($categoryId); |
||||
$questionsPerCategory[$categoryId] = $questions; |
||||
} |
||||
|
||||
$criteria = array('quizDistributionId' => $distribution->getId()); |
||||
$currentDistributionQuestions = $this->getManager()->getRepository('Entity\CQuizDistributionQuestions')->findBy($criteria); |
||||
|
||||
/** @var Entity\CQuizDistributionQuestions $question */ |
||||
foreach ($currentDistributionQuestions as $question) { |
||||
$criteria = array('categoryId' => $question->getCategoryId(), 'questionId' => $question->getQuestionId()); |
||||
$result = $this->getManager()->getRepository('Entity\CQuizDistributionQuestions')->findBy($criteria); |
||||
|
||||
// doubles found ! |
||||
if (count($result) > 1) { |
||||
|
||||
// Question list of this category |
||||
$questionList = $questionsPerCategory[$question->getCategoryId()]; |
||||
|
||||
// Checking if there are questions that are not added yet |
||||
$qb = $this->getManager()->getRepository('Entity\CQuizDistributionQuestions')->createQueryBuilder('e'); |
||||
$qb->where('e.categoryId = :categoryId') |
||||
->andWhere($qb->expr()->notIn('e.questionId', $questionList)) |
||||
->setParameters(array('categoryId' => $question->getCategoryId())); |
||||
|
||||
$result = $qb->getQuery()->getArrayResult(); |
||||
// Found some questions |
||||
if (count($result) > 0) { |
||||
shuffle($result); |
||||
$selected = current($result); |
||||
} else { |
||||
// Nothing found take one question |
||||
shuffle($questionList); |
||||
$selected = current($questionList); |
||||
} |
||||
// $selected contains the new question id |
||||
if (!empty($selected)) { |
||||
//remove the old and create a new one |
||||
$newQuestionDistribution = $question; |
||||
$em->remove($question); |
||||
$newQuestionDistribution->setQuestionId($selected); |
||||
$em->persist($newQuestionDistribution); |
||||
$em->flush(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
$currentDistributionQuestions = $this->getManager()->getRepository('Entity\CQuizDistributionQuestions')->findBy($criteria); |
||||
$questionList = array(); |
||||
foreach($currentDistributionQuestions as $question) { |
||||
$questionList[] = $question->getQuestionId(); |
||||
} |
||||
|
||||
// Rebuild question list |
||||
$distribution->setDataTracking(implode(',', $questionList)); |
||||
$em->persist($distribution); |
||||
$em->flush(); |
||||
|
||||
$this->get('session')->getFlashBag()->add('success', "Added"); |
||||
$url = $this->createUrl('list_link'); |
||||
return $this->redirect($url); |
||||
} |
||||
|
||||
$template = $this->get('template'); |
||||
$template->assign('links', $this->generateLinks()); |
||||
$template->assign('form', $form->createView()); |
||||
$response = $template->render_template($this->getTemplatePath().'add.tpl'); |
||||
return new Response($response, 200, array()); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* |
||||
* @Route("/{exerciseId}/distribution/{id}/edit", requirements={"id" = "\d+"}) |
||||
* @Method({"GET"}) |
||||
*/ |
||||
public function editDistributionAction($exerciseId, $id) |
||||
{ |
||||
$repo = $this->getRepository(); |
||||
$request = $this->getRequest(); |
||||
$item = $repo->findOneById($id); |
||||
|
||||
$this->exerciseId = $exerciseId; |
||||
$template = $this->get('template'); |
||||
$template->assign('exerciseId', $exerciseId); |
||||
$template->assign('id', $id); |
||||
|
||||
if ($item) { |
||||
|
||||
$form = $this->createForm($this->getFormType(), $item); |
||||
|
||||
$form->handleRequest($request); |
||||
|
||||
if ($form->isValid()) { |
||||
$data = $form->getData(); |
||||
$this->updateAction($data); |
||||
$this->get('session')->getFlashBag()->add('success', "Updated"); |
||||
$url = $this->createUrl('list_link'); |
||||
return $this->redirect($url); |
||||
} |
||||
|
||||
$template->assign('item', $item); |
||||
$template->assign('form', $form->createView()); |
||||
$template->assign('links', $this->generateLinks()); |
||||
$response = $template->render_template($this->getTemplatePath().'edit.tpl'); |
||||
return new Response($response, 200, array()); |
||||
} else { |
||||
return $this->createNotFoundException(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @Route("/{exerciseId}/distribution/{id}/delete", requirements={"id" = "\d+"}) |
||||
* @Method({"GET"}) |
||||
*/ |
||||
public function deleteDistributionAction($exerciseId, $id) |
||||
{ |
||||
$this->exerciseId = $exerciseId; |
||||
$template = $this->get('template'); |
||||
$template->assign('exerciseId', $exerciseId); |
||||
|
||||
$result = $this->removeEntity($id); |
||||
if ($result) { |
||||
$url = $this->createUrl('list_link'); |
||||
$this->get('session')->getFlashBag()->add('success', "Deleted"); |
||||
|
||||
return $this->redirect($url); |
||||
} |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
protected function getExtraParameters() |
||||
{ |
||||
return array('exerciseId'); |
||||
} |
||||
|
||||
protected function getControllerAlias() |
||||
{ |
||||
return 'exercise_distribution.controller'; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function getTemplatePath() |
||||
{ |
||||
return 'admin/questionmanager/exercise_distribution/'; |
||||
} |
||||
|
||||
/** |
||||
* @return \Entity\Repository\JuryRepository |
||||
*/ |
||||
protected function getRepository() |
||||
{ |
||||
return $this->get('orm.em')->getRepository('Entity\CQuizDistribution'); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function getNewEntity() |
||||
{ |
||||
return new Entity\CQuizDistribution(); |
||||
} |
||||
|
||||
protected function getDefaultEntity() |
||||
{ |
||||
$dist = new Entity\CQuizDistribution(); |
||||
$dist ->setExerciseId($this->exerciseId); |
||||
return $dist; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function getFormType() |
||||
{ |
||||
return new CQuizDistributionType(); |
||||
} |
||||
} |
||||
@ -0,0 +1,33 @@ |
||||
<?php |
||||
|
||||
namespace ChamiloLMS\Form; |
||||
|
||||
use Symfony\Component\Form\AbstractType; |
||||
use Symfony\Component\Form\FormBuilderInterface; |
||||
use Symfony\Component\OptionsResolver\OptionsResolverInterface; |
||||
use Entity; |
||||
|
||||
class CQuizDistributionType extends AbstractType |
||||
{ |
||||
public function buildForm(FormBuilderInterface $builder, array $options) |
||||
{ |
||||
$builder->add('title', 'text'); |
||||
$builder->add('active', 'checkbox', array('required' => false)); |
||||
$builder->add('exerciseId', 'hidden'); |
||||
$builder->add('submit', 'submit'); |
||||
} |
||||
|
||||
public function setDefaultOptions(OptionsResolverInterface $resolver) |
||||
{ |
||||
$resolver->setDefaults( |
||||
array( |
||||
'data_class' => 'Entity\CQuizDistribution' |
||||
) |
||||
); |
||||
} |
||||
|
||||
public function getName() |
||||
{ |
||||
return 'quiz_distribution'; |
||||
} |
||||
} |
||||
Loading…
Reference in new issue