diff --git a/main/exercice/exercise.class.php b/main/exercice/exercise.class.php index 8f81b7d4ff..4f410ca4ba 100644 --- a/main/exercice/exercise.class.php +++ b/main/exercice/exercise.class.php @@ -142,7 +142,7 @@ class Exercise } /* Make sure that we have a valid $course_info. */ if (!isset($course_info['real_id'])) { - throw new Exception('Could not get a valid $course_info with the provided $course_id: ' . $course_id . '.'); + throw new Exception('Could not get a valid $course_info with the provided $course_id: '.$course_id.'.'); } $this->course_id = $course_info['real_id']; $this->course = $course_info; @@ -948,17 +948,6 @@ class Exercise $categoryParentInfo['parent_id'] = null; break; } - /* - if (isset($path) && isset($path[$index])) { - $categoryParentId = $path[$index]->getIid(); - - $categoryParentInfo['id'] = $categoryParentId; - $categoryParentInfo['iid'] = $categoryParentId; - $categoryParentInfo['parent_path'] = null; - $categoryParentInfo['title'] = $path[$index]->getTitle(); - $categoryParentInfo['name'] = $path[$index]->getTitle(); - $categoryParentInfo['parent_id'] = null; - }*/ } $cat['parent_info'] = $categoryParentInfo; $newCategoryList[$categoryId] = array( @@ -1190,6 +1179,7 @@ class Exercise { return $this->questionSelectionType; } + /** * @param array $categories */ @@ -2157,11 +2147,6 @@ class Exercise $form->addElement('html', ''); } - // Category selection. - $cat = new Testcategory(); - $cat_form = $cat->returnCategoryForm($this); - $form->addElement('html', $cat_form); - // submit $text = isset($_GET['exerciseId']) ? get_lang('ModifyExercise') : get_lang('ProcedToQuestions'); @@ -5831,6 +5816,7 @@ class Exercise } /** + * Get categories added in the exercise--category matrix * @return bool */ public function get_categories_in_exercise() @@ -6830,7 +6816,7 @@ class Exercise } /** - * Returns an array of categories' details for the questions of the current + * Returns an array of categories details for the questions of the current * exercise. * @return array */ diff --git a/main/exercice/exercise_admin.php b/main/exercice/exercise_admin.php index 28a2cd18f7..6e156642be 100644 --- a/main/exercice/exercise_admin.php +++ b/main/exercice/exercise_admin.php @@ -13,7 +13,6 @@ use \ChamiloSession as Session; - require_once 'exercise.class.php'; require_once 'question.class.php'; require_once 'answer.class.php'; diff --git a/main/exercice/testcategory.class.php b/main/exercice/testcategory.class.php index f095d93626..70daaf08f5 100644 --- a/main/exercice/testcategory.class.php +++ b/main/exercice/testcategory.class.php @@ -491,11 +491,10 @@ class Testcategory * @return array of category id (integer) * @author hubert.borderiou 07-04-2011, Julio Montoya */ - public static function getListOfCategoriesIDForTest($exercise_id, $grouped_by_category = true) + public static function getListOfCategoriesIDForTest($exercise_id, $grouped_by_category = true, $courseId = null) { // parcourir les questions d'un test, recup les categories uniques dans un tableau - $categories_in_exercise = array(); - $exercise = new Exercise(); + $exercise = new Exercise($courseId); $exercise->read($exercise_id, false); $categories_in_exercise = $exercise->getQuestionWithCategories(); $categories = array(); @@ -506,21 +505,12 @@ class Testcategory } } return $categories; - - /* - // the array given by selectQuestionList start at indice 1 and not at indice 0 !!! ??? - foreach ($question_list as $question_id) { - $category_list = Testcategory::getCategoryForQuestion($question_id); - if (!empty($category_list)) { - $categories_in_exercise = array_merge($categories_in_exercise, $category_list); - } - } - if (!empty($categories_in_exercise)) { - $categories_in_exercise = array_unique(array_filter($categories_in_exercise)); - } - return $categories_in_exercise;*/ } + /** + * @param Exercise $exercise_obj + * @return array + */ public static function getListOfCategoriesIDForTestObject(Exercise $exercise_obj) { // parcourir les questions d'un test, recup les categories uniques dans un tableau @@ -552,14 +542,13 @@ class Testcategory * * @author function rewrote by jmontoya */ - public static function getListOfCategoriesNameForTest($exercise_id, $grouped_by_category = true) + public static function getListOfCategoriesNameForTest($exercise_id, $grouped_by_category = true, $courseId = null) { $result = array(); - $categories = self::getListOfCategoriesIDForTest($exercise_id, $grouped_by_category); + $categories = self::getListOfCategoriesIDForTest($exercise_id, $grouped_by_category, $courseId); foreach ($categories as $catInfo) { $categoryId = $catInfo['iid']; - ///$cat = new Testcategory($cat_id); if (!empty($categoryId)) { $result[$categoryId] = array( 'title' => $catInfo['title'], @@ -780,9 +769,9 @@ class Testcategory } /** - * Display signs [+] and/or (>0) after question title if question has options - * scoreAlwaysPositive and/or uncheckedMayScore - */ + * Display signs [+] and/or (>0) after question title if question has options + * scoreAlwaysPositive and/or uncheckedMayScore + */ public function displayQuestionOption($in_objQuestion) { if ($in_objQuestion->type == MULTIPLE_ANSWER && $in_objQuestion->scoreAlwaysPositive) { echo " (>0)"; @@ -793,7 +782,7 @@ class Testcategory } /** - * key of $array are the categopy id (0 for not in a category) + * key of $array are the category id (0 for not in a category) * value is the array of question id of this category * Sort question by Category */ @@ -819,7 +808,8 @@ class Testcategory * return total score for test exe_id for all question in the category $in_cat_id for user * If no question for this category, return "" */ - public static function getCatScoreForExeidForUserid($in_cat_id, $in_exe_id, $in_user_id) { + public static function getCatScoreForExeidForUserid($in_cat_id, $in_exe_id, $in_user_id) + { $tbl_track_attempt = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT); $tbl_question_rel_category = Database::get_course_table(TABLE_QUIZ_QUESTION_REL_CATEGORY); $in_cat_id = intval($in_cat_id); @@ -959,7 +949,7 @@ class Testcategory * Returns a category summary report * * @param int exercise id - * @param array prefilled array with the category_id, score, and weight example: array(1 => array('score' => '10', 'total' => 20)); + * @param array pre-filled array with the category_id, score, and weight example: array(1 => array('score' => '10', 'total' => 20)); * @param bool $categoryMinusOne shows category - 1 see BT#6540 * @return string */ diff --git a/main/inc/Entity/CQuizDistribution.php b/main/inc/Entity/CQuizDistribution.php index e2d645e862..179e6b89b7 100644 --- a/main/inc/Entity/CQuizDistribution.php +++ b/main/inc/Entity/CQuizDistribution.php @@ -10,7 +10,7 @@ use Doctrine\Common\Collections\ArrayCollection; * CQuizDistribution * * @ORM\Table(name="c_quiz_distribution") - * @ORM\Entity + * @ORM\Entity(repositoryClass="Entity\Repository\CQuizDistributionRepository") */ class CQuizDistribution { diff --git a/main/inc/Entity/CQuizDistributionRelSession.php b/main/inc/Entity/CQuizDistributionRelSession.php index 005ee89b0f..9c268bf799 100644 --- a/main/inc/Entity/CQuizDistributionRelSession.php +++ b/main/inc/Entity/CQuizDistributionRelSession.php @@ -51,7 +51,6 @@ class CQuizDistributionRelSession */ private $quizDistributionId; - /** * Get id * diff --git a/main/inc/Entity/Repository/CQuizDistributionRepository.php b/main/inc/Entity/Repository/CQuizDistributionRepository.php new file mode 100644 index 0000000000..44739a0b98 --- /dev/null +++ b/main/inc/Entity/Repository/CQuizDistributionRepository.php @@ -0,0 +1,150 @@ +getExerciseId(); + $exercise = new \Exercise(); + $exercise->read($exerciseId); + $questionList = $exercise->getQuestionList(); + $distribution->setDataTracking(implode(',', $questionList)); + + $em = $this->getEntityManager(); + $em->persist($distribution); + $em->flush(); + + // 2. 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); + } + } + + // 3. Saving to the DB + $em->flush(); + + // 4. Getting questions per categories added in the current exercise // related via the matrix + $categoriesInExercise = $exercise->get_categories_in_exercise(); + + // 5. Getting questions from each category + $questionsPerCategoryInExercise = array(); + foreach ($categoriesInExercise as $categoryInfo) { + $categoryId = $categoryInfo['category_id']; + + $questions = \Testcategory::getQuestionsByCategory($categoryId); + $questionsPerCategoryInExercise[$categoryId] = $questions; + } + + // 6. Checking if the quiz distribution exists + $criteria = array('quizDistributionId' => $distribution->getId()); + + $currentDistributionQuestions = $em->getRepository('Entity\CQuizDistributionQuestions')->findBy($criteria); + + // 6. Checking if the quiz distribution exists + $criteria = array('exerciseId' => $exerciseId); + $distributionsInExercise = $em->getRepository('Entity\CQuizDistribution')->findBy($criteria); + $distributionIdList = array(); + if ($distributionsInExercise) { + foreach ($distributionsInExercise as $distributionItem) { + // Avoid current dist + if ($distributionItem->getId() == $distribution->getId()) { + continue; + } + $distributionIdList[] = $distributionItem->getId(); + } + } + + $questionsPerCategoryInDistribution = array(); + /** @var \Entity\CQuizDistributionQuestions $question */ + foreach ($currentDistributionQuestions as $question) { + $questionsPerCategoryInDistribution[$question->getCategoryId()][] = $question->getQuestionId(); + } + + /** @var \Entity\CQuizDistributionQuestions $question */ + foreach ($currentDistributionQuestions as $question) { + $result = array(); + + if (!empty($distributionIdList)) { + + // Checking if there are questions from this category that are not added yet + $qb = $em->getRepository('Entity\CQuizDistributionQuestions')->createQueryBuilder('e'); + $qb->where('e.categoryId = :categoryId') + ->andWhere('e.questionId = :questionId') + ->andWhere($qb->expr()->in('e.quizDistributionId', $distributionIdList)) + ->setParameters( + array( + 'categoryId' => $question->getCategoryId(), + 'questionId' => $question->getQuestionId() + ) + ) + ; + $result = $qb->getQuery()->getArrayResult(); + } + + // Doubles found + if (count($result) > 0) { + $questionListFromDistribution = $questionsPerCategoryInDistribution[$question->getCategoryId()]; + $questionListFromExercise = $questionsPerCategoryInExercise[$question->getCategoryId()]; + + $diff = array_diff($questionListFromExercise, $questionListFromDistribution); + + // Found some questions. Great! now we can select one question. + if (!empty($diff)) { + shuffle($diff); + $selectedQuestionId = current($diff); + } else { + // Nothing found take one random question from the question list in the exercise + shuffle($questionListFromExercise); + $selectedQuestionId = current($questionListFromExercise); + } + + // $selectedQuestionId contains the new question id + if (!empty($selectedQuestionId)) { + $questionsPerCategoryInDistribution[$question->getCategoryId()][] = $selectedQuestionId; + // Update the relationship + $question->setQuestionId($selectedQuestionId); + $em->persist($question); + $em->flush(); + } + } + } + + $criteria = array('quizDistributionId' => $distribution->getId()); + $currentDistributionQuestions = $em + ->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(); + } +} diff --git a/main/template/minedu/admin/questionmanager/exercise_distribution/add_many.tpl b/main/template/minedu/admin/questionmanager/exercise_distribution/add_many.tpl new file mode 100644 index 0000000000..c94faffe5d --- /dev/null +++ b/main/template/minedu/admin/questionmanager/exercise_distribution/add_many.tpl @@ -0,0 +1,10 @@ +{% extends app.template_style ~ "/layout/layout_1_col.tpl" %} +{% block content %} + + {{ 'List' |trans }} + +
+
+ {{ form_widget(form) }} +
+{% endblock %} diff --git a/main/template/minedu/admin/questionmanager/exercise_distribution/list.tpl b/main/template/minedu/admin/questionmanager/exercise_distribution/list.tpl index e46d8e8a31..bd3d807483 100644 --- a/main/template/minedu/admin/questionmanager/exercise_distribution/list.tpl +++ b/main/template/minedu/admin/questionmanager/exercise_distribution/list.tpl @@ -1,9 +1,20 @@ {% extends app.template_style ~ "/layout/layout_1_col.tpl" %} {% block content %} - - {{ 'Add' |trans }} - +
+ + {{ 'Back' |trans }} + + + {{ 'Add' |trans }} + +
+ + + + + + {% for item in items %} + diff --git a/src/ChamiloLMS/Controller/Admin/QuestionManager/ExerciseDistributionController.php b/src/ChamiloLMS/Controller/Admin/QuestionManager/ExerciseDistributionController.php index 79a19e2f7f..1e7afb395b 100644 --- a/src/ChamiloLMS/Controller/Admin/QuestionManager/ExerciseDistributionController.php +++ b/src/ChamiloLMS/Controller/Admin/QuestionManager/ExerciseDistributionController.php @@ -12,6 +12,7 @@ use Symfony\Component\Routing\Annotation\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use ChamiloLMS\Form\CQuizDistributionType; use Doctrine\Common\Collections\Criteria; +use Doctrine\Common\Collections\ArrayCollection; /** * Class DistributionController @@ -28,12 +29,31 @@ class ExerciseDistributionController extends CommonController */ public function indexAction($exerciseId) { + $template = $this->get('template'); + $em = $this->getManager(); + $courseId = api_get_course_int_id(); + + if (empty($courseId)) { + throw new \Exception('Could not get a valid course with the provided $course_id: '.$courseId.'.'); + } + $criteria = array('exerciseId' => $exerciseId); $items = $this->getRepository()->findBy($criteria); - $template = $this->get('template'); + $distributionRelSessions = $em->getRepository('Entity\CQuizDistributionRelSession')->findBy($criteria); + + $selectedExerciseDistributionIdList = array(); + if ($distributionRelSessions) { + foreach ($distributionRelSessions as $distributionRelSession) { + $selectedExerciseDistributionIdList[] = $distributionRelSession->getQuizDistributionId(); + } + } + + $template->assign('selected_distribution_id_list', $selectedExerciseDistributionIdList); $template->assign('exerciseId', $exerciseId); $template->assign('items', $items); + $template->assign('exerciseUrl', api_get_path(WEB_CODE_PATH).'exercice/exercice.php?'.api_get_cidreq()); + $template->assign('links', $this->generateLinks()); $response = $template->render_template($this->getTemplatePath().'list.tpl'); return new Response($response, 200, array()); @@ -54,7 +74,7 @@ class ExerciseDistributionController extends CommonController * @Route("/{exerciseId}/distribution/{id}/toggle_visibility", requirements={"id" = "\d+"}) * @Method({"GET"}) */ - public function toogleVisibilityAction($exerciseId, $id) + public function toggleVisibilityAction($exerciseId, $id) { $criteria = array('exerciseId' => $exerciseId, 'id' => $id); /** @var Entity\CQuizDistribution $distribution */ @@ -71,149 +91,112 @@ class ExerciseDistributionController extends CommonController } /** - * @Route("/{exerciseId}/distribution/{id}/apply") + * @Route("/{exerciseId}/distribution/{id}/toggle_activation") * @Method({"GET"}) */ - public function applyDistributionAction($exerciseId, $id) + public function toggleActivationAction($exerciseId, $id) { $em = $this->getManager(); - $criteria = array('exerciseId' => $exerciseId); + $criteria = array('exerciseId' => $exerciseId, 'quizDistributionId' => $id); $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());*/ + $this->get('session')->getFlashBag()->add('warning', "Distribution removed"); + $url = $this->createUrl('list_link'); + return $this->redirect($url); - $distributionRelSession->setCId(api_get_course_int_id()); - $distributionRelSession->setSessionId(api_get_session_id()); + } else { + + $distributionRelSession = new Entity\CQuizDistributionRelSession(); + $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); + } - $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") + * @Route("/{exerciseId}/distribution/add-many") * @Method({"GET"}) */ - public function addDistributionAction($exerciseId) + public function addManyDistributionAction($exerciseId) { + $builder = $this->createFormBuilder(); + $builder->add('number_of_distributions', 'text'); + $builder->add('submit', 'submit'); + $form = $builder->getForm(); + + $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); + $data = $form->getData(); + if ($data['number_of_distributions'] > 0) { + for ($i = 0; $i < $data['number_of_distributions']; $i++) { + $distribution = new \Entity\CQuizDistribution(); + $distribution->setAuthorUserId($this->getUser()->getUserId()); + $distribution->setExerciseId($exerciseId); + $counter = $i + 1; + $distribution->setTitle($counter); + $distribution->setActive(true); + $distribution->setAuthorUserId($this->getUser()->getUserId()); + $this->getManager()->getRepository('Entity\CQuizDistribution')->addDistribution($distribution); } } - // Checking from all distributions - $em->flush(); + $this->get('session')->getFlashBag()->add('success', "Added"); + $url = $this->createUrl('list_link'); + return $this->redirect($url); + } - $categoriesInExercise = $exercise->get_categories_in_exercise(); + $template->assign('links', $this->generateLinks()); + $template->assign('form', $form->createView()); - $questionsPerCategory = array(); - foreach ($categoriesInExercise as $categoryInfo) { - $categoryId = $categoryInfo['category_id']; - $questions = \Testcategory::getQuestionsByCategory($categoryId); - $questionsPerCategory[$categoryId] = $questions; - } + $response = $template->render_template($this->getTemplatePath().'add_many.tpl'); + return new Response($response, 200, array()); + } - $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(); - } - } - } + /** + * @Route("/{exerciseId}/distribution/add") + * @Method({"GET"}) + */ + public function addDistributionAction($exerciseId) + { + $template = $this->get('template'); + $this->exerciseId = $exerciseId; + $template->assign('exerciseId', $exerciseId); + $request = $this->getRequest(); - $currentDistributionQuestions = $this->getManager()->getRepository('Entity\CQuizDistributionQuestions')->findBy($criteria); - $questionList = array(); - foreach($currentDistributionQuestions as $question) { - $questionList[] = $question->getQuestionId(); - } + $distribution = $this->getDefaultEntity(); + $form = $this->createForm($this->getFormType(), $distribution); - // Rebuild question list - $distribution->setDataTracking(implode(',', $questionList)); - $em->persist($distribution); - $em->flush(); + $form->handleRequest($request); + + if ($form->isValid()) { + + /** @var Entity\CQuizDistribution $distribution */ + $distribution = $form->getData(); + $distribution->setAuthorUserId($this->getUser()->getUserId()); + + $this->getManager()->getRepository('Entity\CQuizDistribution')->addDistribution($distribution); $this->get('session')->getFlashBag()->add('success', "Added"); $url = $this->createUrl('list_link'); @@ -235,7 +218,7 @@ class ExerciseDistributionController extends CommonController */ public function editDistributionAction($exerciseId, $id) { - $repo = $this->getRepository(); + /*$repo = $this->getRepository(); $request = $this->getRequest(); $item = $repo->findOneById($id); @@ -265,7 +248,7 @@ class ExerciseDistributionController extends CommonController return new Response($response, 200, array()); } else { return $this->createNotFoundException(); - } + }*/ } /** @@ -288,10 +271,6 @@ class ExerciseDistributionController extends CommonController } } - - - - protected function getExtraParameters() { return array('exerciseId');
{{ 'Name' | trans }}{{ 'Selected distribution' | trans }}{{ 'Questions' | trans }}{{ 'Actions' | trans }}
@@ -12,17 +23,32 @@ - {{ item.active }} + {% if item.id in selected_distribution_id_list %} + + {% else %} + + {% endif %} - {{ 'Edit' |trans }} - {{ 'Visible' |trans }} - {{ 'Apply distribution' |trans }} + {{ item.dataTracking |replace({',': ', '}) }} + + {% if item.active == 1 %} + + + + {% else %} + + + + {% endif %} + + {{ 'Change activation' |trans }} - {{ 'Delete' |trans }}