Add course sequences BT#16255

pull/3092/head
Julio 6 years ago
parent a83aa68b87
commit c231b66911
  1. 10
      main/admin/course_list.php
  2. 5
      main/auth/courses_controller.php
  3. 1
      main/course_info/about.php
  4. 6
      main/gradebook/gradebook_statistics.php
  5. 7
      main/gradebook/gradebook_view_result.php
  6. 3
      main/gradebook/lib/be/category.class.php
  7. 20
      main/gradebook/lib/be/evaluation.class.php
  8. 1
      main/inc/ajax/sequence.ajax.php
  9. 71
      main/inc/lib/course.lib.php
  10. 18
      main/inc/local.inc.php
  11. 6
      main/template/default/sequence_resource/course_requirements.tpl
  12. 11
      main/template/default/user_portal/classic_session.tpl
  13. 139
      src/Chamilo/CoreBundle/Entity/Repository/SequenceResourceRepository.php

@ -97,7 +97,7 @@ function get_course_data($from, $number_of_items, $column, $direction)
{
$course_table = Database::get_main_table(TABLE_MAIN_COURSE);
$sql = "SELECT
$sql = "SELECT
code AS col0,
title AS col1,
code AS col2,
@ -432,8 +432,10 @@ if (isset($_GET['search']) && $_GET['search'] === 'advanced') {
];
$tool_name = get_lang('CourseList');
if (isset($_GET['delete_course'])) {
CourseManager::delete_course($_GET['delete_course']);
Display::addFlash(Display::return_message(get_lang('Deleted')));
$result = CourseManager::delete_course($_GET['delete_course']);
if ($result) {
Display::addFlash(Display::return_message(get_lang('Deleted')));
}
}
// Create a search-box
$form = new FormValidator(
@ -516,7 +518,7 @@ if (isset($_GET['search']) && $_GET['search'] === 'advanced') {
if (!sessionId) {
return;
}
window.location = "'.$courseListUrl.'?session_id="+sessionId;
});
});

@ -611,7 +611,7 @@ class CoursesController
);
$hasRequirements = false;
foreach ($sequences['sequences'] as $sequence) {
foreach ($sequences as $sequence) {
if (count($sequence['requirements']) === 0) {
continue;
}
@ -676,8 +676,7 @@ class CoursesController
),
];
$sessionsBlock = array_merge($sessionsBlock, $sequences);
$sessionsBlocks[] = $sessionsBlock;
$sessionsBlocks[] = array_merge($sessionsBlock, $sequences);
}
return $sessionsBlocks;

@ -1,7 +1,6 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\CourseRelUser;
use Chamilo\CoreBundle\Entity\ExtraField;
use Chamilo\CoreBundle\Entity\Repository\SequenceResourceRepository;

@ -1,11 +1,7 @@
<?php
/* For licensing terms, see /license.txt */
/**
* Script.
*
* @package chamilo.gradebook
*/
require_once __DIR__.'/../inc/global.inc.php';
api_block_anonymous_users();

@ -1,11 +1,7 @@
<?php
/* For licensing terms, see /license.txt */
/**
* Script.
*
* @package chamilo.gradebook
*/
require_once __DIR__.'/../inc/global.inc.php';
require_once api_get_path(SYS_CODE_PATH).'gradebook/lib/fe/exportgradebook.php';
@ -193,7 +189,6 @@ if (isset($_GET['editres'])) {
$result->set_score($row_value);
}
$result->save();
if ($allowMultipleAttempts && !empty($result->get_id())) {
$table = Database::get_main_table(TABLE_MAIN_GRADEBOOK_RESULT_ATTEMPT);
$now = api_get_utc_datetime();

@ -2358,9 +2358,8 @@ class Category implements GradebookItem
);
$minCertificateScore = $category->getCertificateMinScore();
$passedCourse = $currentScore >= $minCertificateScore;
return $passedCourse;
return $currentScore >= $minCertificateScore;
}
/**

@ -423,7 +423,7 @@ class Evaluation implements GradebookItem
public function delete()
{
$table = Database::get_main_table(TABLE_MAIN_GRADEBOOK_EVALUATION);
$sql = 'DELETE FROM '.$table.'
$sql = 'DELETE FROM '.$table.'
WHERE id = '.$this->get_id();
Database::query($sql);
}
@ -443,8 +443,8 @@ class Evaluation implements GradebookItem
$parent = $this->category;
}
$tbl_grade_evaluations = Database::get_main_table(TABLE_MAIN_GRADEBOOK_EVALUATION);
$sql = "SELECT count(id) AS number
FROM $tbl_grade_evaluations
$sql = "SELECT count(id) AS number
FROM $tbl_grade_evaluations
WHERE name = '".Database::escape_string($name)."'";
if (api_is_allowed_to_edit()) {
@ -778,12 +778,12 @@ class Evaluation implements GradebookItem
$tbl_user = Database::get_main_table(TABLE_MAIN_USER);
$table = Database::get_main_table(TABLE_MAIN_GRADEBOOK_RESULT);
$sql = "SELECT user_id,lastname,firstname,username
FROM $tbl_user
WHERE
lastname LIKE '".Database::escape_string($first_letter_user)."%' AND
$sql = "SELECT user_id,lastname,firstname,username
FROM $tbl_user
WHERE
lastname LIKE '".Database::escape_string($first_letter_user)."%' AND
status = ".STUDENT." AND user_id NOT IN (
SELECT user_id FROM $table
SELECT user_id FROM $table
WHERE evaluation_id = ".$this->get_id()."
)
ORDER BY lastname";
@ -838,8 +838,8 @@ class Evaluation implements GradebookItem
public function lock($locked)
{
$table_evaluation = Database::get_main_table(TABLE_MAIN_GRADEBOOK_EVALUATION);
$sql = "UPDATE $table_evaluation
SET locked = '".intval($locked)."'
$sql = "UPDATE $table_evaluation
SET locked = '".intval($locked)."'
WHERE id='".$this->get_id()."'";
Database::query($sql);
}

@ -80,7 +80,6 @@ switch ($action) {
$link = '';
$linkDelete = $linkUndo = '';
$resourceName = '';
switch ($type) {
case SequenceResource::SESSION_TYPE:
$resourceData = api_get_session_info($id);

@ -3,6 +3,8 @@
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\ExtraField as EntityExtraField;
use Chamilo\CoreBundle\Entity\Repository\SequenceResourceRepository;
use Chamilo\CoreBundle\Entity\SequenceResource;
use Chamilo\CourseBundle\Component\CourseCopy\CourseBuilder;
use Chamilo\CourseBundle\Component\CourseCopy\CourseRestorer;
use ChamiloSession as Session;
@ -2292,12 +2294,30 @@ class CourseManager
$res = Database::query($sql);
if (Database::num_rows($res) == 0) {
return;
return false;
}
$course = Database::fetch_array($res);
$courseId = $course['id']; // int
/** @var SequenceResourceRepository $repo */
$repo = Database::getManager()->getRepository('ChamiloCoreBundle:SequenceResource');
$sequenceResource = $repo->findRequirementForResource(
$courseId,
SequenceResource::COURSE_TYPE
);
if ($sequenceResource) {
Display::addFlash(
Display::return_message(
get_lang('ThereIsASequenceResourceLinkedToThisCourseYouNeedToDeleteItFirst'),
'error'
)
);
return false;
}
$count = 0;
if (api_is_multiple_url_enabled()) {
$url_id = 1;
@ -2403,6 +2423,11 @@ class CourseManager
$sql = "UPDATE $table SET course_id = NULL WHERE course_id = $courseId";
Database::query($sql);
$repo->deleteResource(
$courseId,
SequenceResource::COURSE_TYPE
);
// Class
$table = Database::get_main_table(TABLE_USERGROUP_REL_COURSE);
$sql = "DELETE FROM $table
@ -2445,6 +2470,8 @@ class CourseManager
api_get_user_id(),
$courseId
);
return true;
}
}
@ -3802,6 +3829,8 @@ class CourseManager
// Browse through all courses.
$courseAdded = [];
$courseList = [];
$courseController = new CoursesController();
while ($row = Database::fetch_array($result)) {
$course_info = api_get_course_info_by_id($row['id']);
if (empty($course_info)) {
@ -3818,6 +3847,9 @@ class CourseManager
if (in_array($course_info['real_id'], $courseAdded)) {
continue;
}
//$course_info['requirements'] = $courseController->getRequirements($course_info['real_id'], SequenceResource::COURSE_TYPE, true, true);
$course_info['id_session'] = null;
$course_info['status'] = $row['status'];
// For each course, get if there is any notification icon to show
@ -4145,6 +4177,43 @@ class CourseManager
$params['html_image'] = Display::return_icon('session.png', $course_info['name'], ['class' => 'img-responsive'], ICON_SIZE_LARGE, $course_info['name']);
}
$params['link'] = $session_url;
$courseController = new CoursesController();
$entityManager = Database::getManager();
/** @var SequenceResourceRepository $repo */
$repo = $entityManager->getRepository('ChamiloCoreBundle:SequenceResource');
/*$sequences = $repo->getRequirementsAndDependenciesWithinSequences(
$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);
$completed = $repo->checkSequenceAreCompleted($sequenceList);
//var_dump($course_info['real_id'], $completed);
$params['completed'] = $completed;
$params['requirements'] = '';
if ($sequences && false === $completed) {
$hasRequirements = false;
foreach ($sequences as $sequence) {
if (!empty($sequence['requirements'])) {
$hasRequirements = true;
break;
}
}
if ($hasRequirements) {
$params['requirements'] = $courseController->getRequirements(
$course_info['real_id'],
SequenceResource::COURSE_TYPE,
false,
false
);
}
}
$params['title'] = $session_title;
$params['name'] = $course_info['name'];
$params['edit_actions'] = '';

@ -2,6 +2,8 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Component\Utils\ChamiloApi;
use Chamilo\CoreBundle\Entity\Repository\SequenceResourceRepository;
use Chamilo\CoreBundle\Entity\SequenceResource;
use ChamiloSession as Session;
/**
@ -1350,12 +1352,28 @@ if ((isset($uidReset) && $uidReset) || $cidReset) {
}
break;
case '0': //Student
$is_courseMember = true;
$is_courseTutor = false;
$is_courseAdmin = false;
$is_session_general_coach = false;
$is_sessionAdmin = false;
// Check course dependency
$entityManager = Database::getManager();
/** @var SequenceResourceRepository $repo */
$repo = $entityManager->getRepository('ChamiloCoreBundle:SequenceResource');
$sequences = $repo->getRequirements($_real_cid, SequenceResource::COURSE_TYPE);
if ($sequences) {
$sequenceList = $repo->checkRequirementsForUser($sequences, SequenceResource::COURSE_TYPE, $user_id);
$completed = $repo->checkSequenceAreCompleted($sequenceList);
if (false === $completed) {
api_not_allowed(true);
}
}
break;
default:
//unregister user

@ -7,11 +7,11 @@
<div class="parent">
<div class="big-icon">
<img src="{{ 'item-sequence.png'|icon(48) }}" width="48" height="48">
<p class="sequence-course">{{ course.title }}</p>
<p class="sequence-course">{{ course.name }}</p>
{% if _u.logged %}
<span class="label {{ session.status ? 'label-success' : 'label-danger' }}">
{% if session.status %}
<span class="label {{ course.status ? 'label-success' : 'label-danger' }}">
{% if course.status %}
<em class="fa fa-check"></em> {{ 'Complete'|get_lang }}
{% else %}
<em class="fa fa-exclamation-triangle"></em> {{ 'Incomplete'|get_lang }}

@ -97,8 +97,15 @@
</a>
</div>
<div class="col-md-10">
<h4>{{ item.title }}</h4>
<div class="list-teachers">
{% if item.requirements %}
<h4>{{ item.name }}</h4>
{% else %}
<h4>{{ item.title }}</h4>
{% endif %}
<div class="list-teachers">
{{ item.requirements }}
{% if item.coaches|length > 0 %}
<img src="{{ 'teacher.png'|icon(16) }}" width="16" height="16">
{% for coach in item.coaches %}

@ -3,6 +3,7 @@
namespace Chamilo\CoreBundle\Entity\Repository;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\SequenceResource;
use Doctrine\ORM\EntityRepository;
use Fhaculty\Graph\Set\Vertices;
@ -108,7 +109,7 @@ class SequenceResourceRepository extends EntityRepository
public function getRequirements($resourceId, $type)
{
$sequencesResource = $this->findBy(['resourceId' => $resourceId, 'type' => $type]);
$em = $this->getEntityManager();
$result = [];
/** @var SequenceResource $sequenceResource */
foreach ($sequencesResource as $sequenceResource) {
@ -131,12 +132,12 @@ class SequenceResourceRepository extends EntityRepository
$resource = null;
switch ($type) {
case SequenceResource::SESSION_TYPE:
$repo = $this->getEntityManager()->getRepository('ChamiloCoreBundle:Session');
$repo = $em->getRepository('ChamiloCoreBundle:Session');
$resource = $repo->find($vertexId);
break;
case SequenceResource::COURSE_TYPE:
$repo = $this->getEntityManager()->getRepository('ChamiloCoreBundle:Course');
$repo = $em->getRepository('ChamiloCoreBundle:Course');
$resource = $repo->find($vertexId);
break;
@ -184,15 +185,8 @@ class SequenceResourceRepository extends EntityRepository
$from = $vertex->getVerticesEdgeFrom();
$to = $vertex->getVerticesEdgeTo();
$requirements = [];
$dependencies = [];
switch ($type) {
case SequenceResource::SESSION_TYPE:
$requirements = $this->findSessionFromVerticesEdges($from);
$dependencies = $this->findSessionFromVerticesEdges($to);
break;
}
$requirements = $this->findVerticesEdges($from, $type);
$dependencies = $this->findVerticesEdges($to, $type);
$result[$sequence->getId()] = [
'name' => $sequence->getName(),
@ -201,33 +195,38 @@ class SequenceResourceRepository extends EntityRepository
];
}
return [
'sequences' => $result,
];
return $result;
}
/**
* Get sessions from vertices.
*
* @param Vertices $verticesEdges The vertices
* @param int $type
*
* @return array
*/
protected function findSessionFromVerticesEdges(Vertices $verticesEdges)
protected function findVerticesEdges(Vertices $verticesEdges, $type)
{
$sessionVertices = [];
$em = $this->getEntityManager();
foreach ($verticesEdges as $supVertex) {
$vertexId = $supVertex->getId();
$session = $this->getEntityManager()->getReference(
'ChamiloCoreBundle:Session',
$vertexId
);
switch ($type) {
case SequenceResource::SESSION_TYPE:
$resource = $em->getRepository('ChamiloCoreBundle:Session')->find($vertexId);
break;
case SequenceResource::COURSE_TYPE:
$resource = $em->getRepository('ChamiloCoreBundle:Course')->find($vertexId);
break;
}
if (empty($session)) {
if (empty($resource)) {
continue;
}
$sessionVertices[$vertexId] = $session;
$sessionVertices[$vertexId] = $resource;
}
return $sessionVertices;
@ -245,7 +244,19 @@ class SequenceResourceRepository extends EntityRepository
public function checkRequirementsForUser(array $sequences, $type, $userId)
{
$sequenceList = [];
$gradebookCategoryRepo = $this->getEntityManager()->getRepository('ChamiloCoreBundle:GradebookCategory');
$em = $this->getEntityManager();
$gradebookCategoryRepo = $em->getRepository('ChamiloCoreBundle:GradebookCategory');
$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();
}
}
}
foreach ($sequences as $sequenceId => $sequence) {
$item = [
@ -292,30 +303,27 @@ class SequenceResourceRepository extends EntityRepository
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;
}
}
}
}
$resourceItem = [
'name' => $resource->getTitle(),
'status' => true,
'status' => $status,
];
$gradebooks = $gradebookCategoryRepo->findBy(
[
'courseCode' => $resource->getCode(),
'sessionId' => 0,
'isRequirement' => true,
]
);
foreach ($gradebooks as $gradebook) {
$category = \Category::createCategoryObjectFromEntity($gradebook);
if (!empty($userId)) {
$resourceItem['status'] = $resourceItem['status'] && \Category::userFinishedCourse(
$userId,
$category
);
}
}
break;
}
@ -331,6 +339,51 @@ class SequenceResourceRepository extends EntityRepository
return $sequenceList;
}
public function checkCourseRequirements($userId, Course $course, $sessionId)
{
$em = $this->getEntityManager();
$sessionId = (int) $sessionId;
$gradebookCategoryRepo = $em->getRepository('ChamiloCoreBundle:GradebookCategory');
$gradebooks = $gradebookCategoryRepo->findBy(
[
'courseCode' => $course->getCode(),
'sessionId' => $sessionId,
'isRequirement' => true,
]
);
if (empty($gradebooks)) {
return false;
}
$status = true;
foreach ($gradebooks as $gradebook) {
$category = \Category::createCategoryObjectFromEntity($gradebook);
$userFinishedCourse = \Category::userFinishedCourse(
$userId,
$category,
true
);
//var_dump($gradebook, $userFinishedCourse);
if (0 === $sessionId) {
if (false === $userFinishedCourse) {
$status = false;
break;
}
} else {
if (false === $userFinishedCourse) {
$status = false;
break;
}
}
}
return $status;
}
/**
* Check if at least one sequence are completed.
*

Loading…
Cancel
Save