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(
$sequences,
SequenceResource::SESSION_TYPE,
$userId
$userId,
$sessionId
);
$continueWithSubscription = $repository->checkSequenceAreCompleted($requirementsData);

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

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

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

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

@ -1370,7 +1370,7 @@ if ((isset($uidReset) && $uidReset) || $cidReset) {
$sequences = $repo->getRequirements($_real_cid, SequenceResource::COURSE_TYPE);
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);
if (false === $completed) {

@ -1724,6 +1724,9 @@ $_configuration['auth_password_links'] = [
//ALTER TABLE c_quiz_question_rel_category ADD COLUMN mandatory INT DEFAULT 0;
//$_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
// -------- Custom DB changes
// Add user activation by confirmation email

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

Loading…
Cancel
Save