Admin: Add config course_sequence_valid_only_in_same_session BT#17789

Check only same course session
pull/3628/head
Julio Montoya 5 years ago
parent 3d5201c7c4
commit d676dc9dd6
  1. 3
      main/auth/courses.php
  2. 14
      main/gradebook/lib/be/category.class.php
  3. 12
      main/inc/ajax/sequence.ajax.php
  4. 33
      main/inc/lib/CoursesAndSessionsCatalog.class.php
  5. 6
      main/inc/lib/course.lib.php
  6. 2
      main/inc/local.inc.php
  7. 3
      main/install/configuration.dist.php
  8. 29
      src/Chamilo/CoreBundle/Entity/Repository/SequenceResourceRepository.php

@ -623,7 +623,8 @@ switch ($action) {
$requirementsData = $repository->checkRequirementsForUser( $requirementsData = $repository->checkRequirementsForUser(
$sequences, $sequences,
SequenceResource::SESSION_TYPE, SequenceResource::SESSION_TYPE,
$userId $userId,
$sessionId
); );
$continueWithSubscription = $repository->checkSequenceAreCompleted($requirementsData); $continueWithSubscription = $repository->checkSequenceAreCompleted($requirementsData);

@ -2777,24 +2777,22 @@ class Category implements GradebookItem
* *
* @return float The score * @return float The score
*/ */
private static function calculateCurrentScore( private static function calculateCurrentScore($userId, $category)
$userId, {
$category
) {
if (empty($category)) { if (empty($category)) {
return 0; return 0;
} }
$courseEvaluations = $category->get_evaluations( $courseEvaluations = $category->get_evaluations($userId, true);
$userId,
true
);
$courseLinks = $category->get_links($userId, true); $courseLinks = $category->get_links($userId, true);
$evaluationsAndLinks = array_merge($courseEvaluations, $courseLinks); $evaluationsAndLinks = array_merge($courseEvaluations, $courseLinks);
$categoryScore = 0; $categoryScore = 0;
for ($i = 0; $i < count($evaluationsAndLinks); $i++) { for ($i = 0; $i < count($evaluationsAndLinks); $i++) {
/** @var AbstractLink $item */ /** @var AbstractLink $item */
$item = $evaluationsAndLinks[$i]; $item = $evaluationsAndLinks[$i];
// Set session id from category
$item->set_session_id($category->get_session_id());
$score = $item->calc_score($userId); $score = $item->calc_score($userId);
$itemValue = 0; $itemValue = 0;
if (!empty($score)) { if (!empty($score)) {

@ -401,8 +401,10 @@ switch ($action) {
break; break;
case 'get_requirements': case 'get_requirements':
$sessionId = isset($_REQUEST['sid']) ? (int) $_REQUEST['sid'] : 0;
$userId = api_get_user_id(); $userId = api_get_user_id();
$resourceName = '';
$template = '';
switch ($type) { switch ($type) {
case SequenceResource::SESSION_TYPE: case SequenceResource::SESSION_TYPE:
$resourceData = api_get_session_info($id); $resourceData = api_get_session_info($id);
@ -416,7 +418,7 @@ switch ($action) {
break; break;
} }
if (empty($resourceData)) { if (empty($resourceData) || empty($template)) {
exit; exit;
} }
@ -426,7 +428,7 @@ switch ($action) {
exit; exit;
} }
$sequenceList = $sequenceResourceRepository->checkRequirementsForUser($sequences, $type, $userId); $sequenceList = $sequenceResourceRepository->checkRequirementsForUser($sequences, $type, $userId, $sessionId);
$allowSubscription = $sequenceResourceRepository->checkSequenceAreCompleted($sequenceList); $allowSubscription = $sequenceResourceRepository->checkSequenceAreCompleted($sequenceList);
$view = new Template(null, false, false, false, false, false); $view = new Template(null, false, false, false, false, false);
@ -445,9 +447,7 @@ switch ($action) {
); );
} }
$template = $view->get_template('sequence_resource/'.$template); $view->display($view->get_template('sequence_resource/'.$template));
$view->display($template);
break; break;
} }

@ -332,7 +332,7 @@ class CoursesAndSessionsCatalog
1=1 1=1
$avoidCoursesCondition $avoidCoursesCondition
$visibilityCondition $visibilityCondition
ORDER BY title $limitFilter "; ORDER BY title $limitFilter ";
} else { } else {
$sql = "SELECT *, id as real_id FROM $tbl_course course $sql = "SELECT *, id as real_id FROM $tbl_course course
WHERE WHERE
@ -1200,15 +1200,13 @@ class CoursesAndSessionsCatalog
$btnBing = false $btnBing = false
) { ) {
$sessionId = (int) $sessionId; $sessionId = (int) $sessionId;
$class = 'btn-sm';
if ($btnBing) { if ($btnBing) {
$btnBing = 'btn-lg btn-block'; $class = 'btn-lg btn-block';
} else {
$btnBing = 'btn-sm';
} }
if ($checkRequirements) { if ($checkRequirements) {
return self::getRequirements($sessionId, SequenceResource::SESSION_TYPE, $includeText, $btnBing); return self::getRequirements($sessionId, SequenceResource::SESSION_TYPE, $includeText, $class);
} }
$catalogSessionAutoSubscriptionAllowed = false; $catalogSessionAutoSubscriptionAllowed = false;
@ -1231,7 +1229,7 @@ class CoursesAndSessionsCatalog
'pencil', 'pencil',
'primary', 'primary',
[ [
'class' => $btnBing.' ajax', 'class' => $class.' ajax',
'data-title' => get_lang('AreYouSureToSubscribe'), 'data-title' => get_lang('AreYouSureToSubscribe'),
'data-size' => 'md', 'data-size' => 'md',
'title' => get_lang('Subscribe'), 'title' => get_lang('Subscribe'),
@ -1250,7 +1248,7 @@ class CoursesAndSessionsCatalog
$url, $url,
'pencil', 'pencil',
'primary', 'primary',
['class' => $btnBing], ['class' => $class],
$includeText $includeText
); );
} }
@ -1270,18 +1268,17 @@ class CoursesAndSessionsCatalog
return $result; return $result;
} }
public static function getRequirements($id, $type, $includeText, $btnBing) public static function getRequirements($id, $type, $includeText, $class, $sessionId = 0)
{ {
$id = (int) $id; $id = (int) $id;
$type = (int) $type; $type = (int) $type;
$url = api_get_path(WEB_AJAX_PATH).'sequence.ajax.php?';
$url = api_get_path(WEB_AJAX_PATH);
$url .= 'sequence.ajax.php?';
$url .= http_build_query( $url .= http_build_query(
[ [
'a' => 'get_requirements', 'a' => 'get_requirements',
'id' => $id, 'id' => $id,
'type' => $type, 'type' => $type,
'sid' => $sessionId
] ]
); );
@ -1291,7 +1288,7 @@ class CoursesAndSessionsCatalog
'shield', 'shield',
'info', 'info',
[ [
'class' => $btnBing.' ajax', 'class' => $class.' ajax',
'data-title' => get_lang('CheckRequirements'), 'data-title' => get_lang('CheckRequirements'),
'data-size' => 'md', 'data-size' => 'md',
'title' => get_lang('CheckRequirements'), 'title' => get_lang('CheckRequirements'),
@ -1648,14 +1645,8 @@ class CoursesAndSessionsCatalog
? api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php?a=get_user_popup&user_id='.$coachId ? api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php?a=get_user_popup&user_id='.$coachId
: '', : '',
'coach_name' => $coachName, 'coach_name' => $coachName,
'coach_avatar' => UserManager::getUserPicture( 'coach_avatar' => UserManager::getUserPicture($coachId, USER_IMAGE_SIZE_SMALL),
$coachId, 'is_subscribed' => SessionManager::isUserSubscribedAsStudent($session->getId(), $userId),
USER_IMAGE_SIZE_SMALL
),
'is_subscribed' => SessionManager::isUserSubscribedAsStudent(
$session->getId(),
$userId
),
'icon' => self::getSessionIcon($session->getName()), 'icon' => self::getSessionIcon($session->getName()),
'date' => $sessionDates['display'], 'date' => $sessionDates['display'],
'price' => !empty($isThisSessionOnSale['html']) ? $isThisSessionOnSale['html'] : '', 'price' => !empty($isThisSessionOnSale['html']) ? $isThisSessionOnSale['html'] : '',

@ -4485,12 +4485,11 @@ class CourseManager
$repo = $entityManager->getRepository('ChamiloCoreBundle:SequenceResource'); $repo = $entityManager->getRepository('ChamiloCoreBundle:SequenceResource');
$sequences = $repo->getRequirements($course_info['real_id'], SequenceResource::COURSE_TYPE); $sequences = $repo->getRequirements($course_info['real_id'], SequenceResource::COURSE_TYPE);
$sequenceList = $repo->checkRequirementsForUser($sequences, SequenceResource::COURSE_TYPE, $user_id); $sequenceList = $repo->checkRequirementsForUser($sequences, SequenceResource::COURSE_TYPE, $user_id, $session_id);
$completed = $repo->checkSequenceAreCompleted($sequenceList); $completed = $repo->checkSequenceAreCompleted($sequenceList);
$params['completed'] = $completed; $params['completed'] = $completed;
$params['requirements'] = ''; $params['requirements'] = '';
if ($sequences && false === $completed) { if ($sequences && false === $completed) {
$hasRequirements = false; $hasRequirements = false;
foreach ($sequences as $sequence) { foreach ($sequences as $sequence) {
@ -4504,7 +4503,8 @@ class CourseManager
$course_info['real_id'], $course_info['real_id'],
SequenceResource::COURSE_TYPE, SequenceResource::COURSE_TYPE,
false, false,
false false,
$session_id
); );
} }
} }

@ -1370,7 +1370,7 @@ if ((isset($uidReset) && $uidReset) || $cidReset) {
$sequences = $repo->getRequirements($_real_cid, SequenceResource::COURSE_TYPE); $sequences = $repo->getRequirements($_real_cid, SequenceResource::COURSE_TYPE);
if ($sequences) { if ($sequences) {
$sequenceList = $repo->checkRequirementsForUser($sequences, SequenceResource::COURSE_TYPE, $user_id); $sequenceList = $repo->checkRequirementsForUser($sequences, SequenceResource::COURSE_TYPE, $user_id, $session_id);
$completed = $repo->checkSequenceAreCompleted($sequenceList); $completed = $repo->checkSequenceAreCompleted($sequenceList);
if (false === $completed) { if (false === $completed) {

@ -1724,6 +1724,9 @@ $_configuration['auth_password_links'] = [
//ALTER TABLE c_quiz_question_rel_category ADD COLUMN mandatory INT DEFAULT 0; //ALTER TABLE c_quiz_question_rel_category ADD COLUMN mandatory INT DEFAULT 0;
//$_configuration['allow_mandatory_question_in_category'] = false; //$_configuration['allow_mandatory_question_in_category'] = false;
// Resource sequence: Validate course in the same session.
//$_configuration['course_sequence_valid_only_in_same_session'] = false;
// KEEP THIS AT THE END // KEEP THIS AT THE END
// -------- Custom DB changes // -------- Custom DB changes
// Add user activation by confirmation email // Add user activation by confirmation email

@ -1,10 +1,12 @@
<?php <?php
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Entity\Repository; namespace Chamilo\CoreBundle\Entity\Repository;
use Chamilo\CoreBundle\Entity\Course; use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\SequenceResource; use Chamilo\CoreBundle\Entity\SequenceResource;
use Chamilo\CoreBundle\Entity\SessionRelUser;
use Doctrine\ORM\EntityRepository; use Doctrine\ORM\EntityRepository;
use Fhaculty\Graph\Set\Vertices; use Fhaculty\Graph\Set\Vertices;
use Fhaculty\Graph\Vertex; use Fhaculty\Graph\Vertex;
@ -204,10 +206,11 @@ class SequenceResourceRepository extends EntityRepository
* @param array $sequences The sequences * @param array $sequences The sequences
* @param int $type The type of sequence resource * @param int $type The type of sequence resource
* @param int $userId * @param int $userId
* @param int $sessionId
* *
* @return array * @return array
*/ */
public function checkRequirementsForUser(array $sequences, $type, $userId) public function checkRequirementsForUser(array $sequences, $type, $userId, $sessionId = 0)
{ {
$sequenceList = []; $sequenceList = [];
$em = $this->getEntityManager(); $em = $this->getEntityManager();
@ -215,11 +218,17 @@ class SequenceResourceRepository extends EntityRepository
$sessionUserList = []; $sessionUserList = [];
if (SequenceResource::COURSE_TYPE == $type) { if (SequenceResource::COURSE_TYPE == $type) {
$criteria = ['user' => $userId]; $checkOnlySameSession = api_get_configuration_value('course_sequence_valid_only_in_same_session');
$sessions = $em->getRepository('ChamiloCoreBundle:SessionRelUser')->findBy($criteria); if ($checkOnlySameSession) {
if ($sessions) { $sessionUserList = [$sessionId];
foreach ($sessions as $sessionRelUser) { } else {
$sessionUserList[] = $sessionRelUser->getSession()->getId(); $criteria = ['user' => $userId];
$sessions = $em->getRepository('ChamiloCoreBundle:SessionRelUser')->findBy($criteria);
if ($sessions) {
/** @var SessionRelUser $sessionRelUser */
foreach ($sessions as $sessionRelUser) {
$sessionUserList[] = $sessionRelUser->getSession()->getId();
}
} }
} }
} }
@ -241,10 +250,8 @@ class SequenceResourceRepository extends EntityRepository
]; ];
$sessionsCourses = $resource->getCourses(); $sessionsCourses = $resource->getCourses();
foreach ($sessionsCourses as $sessionCourse) { foreach ($sessionsCourses as $sessionCourse) {
$course = $sessionCourse->getCourse(); $course = $sessionCourse->getCourse();
$gradebooks = $gradebookCategoryRepo->findBy( $gradebooks = $gradebookCategoryRepo->findBy(
[ [
'courseCode' => $course->getCode(), 'courseCode' => $course->getCode(),
@ -255,7 +262,6 @@ class SequenceResourceRepository extends EntityRepository
foreach ($gradebooks as $gradebook) { foreach ($gradebooks as $gradebook) {
$category = \Category::createCategoryObjectFromEntity($gradebook); $category = \Category::createCategoryObjectFromEntity($gradebook);
if (!empty($userId)) { if (!empty($userId)) {
$resourceItem['status'] = $resourceItem['status'] && \Category::userFinishedCourse( $resourceItem['status'] = $resourceItem['status'] && \Category::userFinishedCourse(
$userId, $userId,
@ -264,20 +270,16 @@ class SequenceResourceRepository extends EntityRepository
} }
} }
} }
break; break;
case SequenceResource::COURSE_TYPE: case SequenceResource::COURSE_TYPE:
$id = $resource->getId(); $id = $resource->getId();
$status = $this->checkCourseRequirements($userId, $resource, 0); $status = $this->checkCourseRequirements($userId, $resource, 0);
//var_dump($status);
if (false === $status) { if (false === $status) {
$sessionsInCourse = \SessionManager::get_session_by_course($id); $sessionsInCourse = \SessionManager::get_session_by_course($id);
foreach ($sessionsInCourse as $session) { foreach ($sessionsInCourse as $session) {
if (in_array($session['id'], $sessionUserList)) { if (in_array($session['id'], $sessionUserList)) {
$status = $this->checkCourseRequirements($userId, $resource, $session['id']); $status = $this->checkCourseRequirements($userId, $resource, $session['id']);
//var_dump($status.' - '.$session['id']);
if (true === $status) { if (true === $status) {
break; break;
} }
@ -331,7 +333,6 @@ class SequenceResourceRepository extends EntityRepository
$category, $category,
true true
); );
if (0 === $sessionId) { if (0 === $sessionId) {
if (false === $userFinishedCourse) { if (false === $userFinishedCourse) {
$status = false; $status = false;

Loading…
Cancel
Save