Session: Allow creating/editing with multiple general coaches

pull/3995/head
Angel Fernando Quiroz Campos 4 years ago
parent 32f675add7
commit 7806d003fb
  1. 90
      public/main/inc/lib/sessionmanager.lib.php
  2. 2
      public/main/session/session_add.php
  3. 102
      public/main/session/session_edit.php
  4. 6
      public/main/template/default/session/resume_session.html.twig
  5. 41
      src/CoreBundle/Entity/Session.php
  6. 2
      tests/ChamiloTestTrait.php
  7. 2
      tests/CoreBundle/Repository/Node/SessionRepositoryTest.php
  8. 2
      tests/CoreBundle/Repository/SessionRepositoryTest.php
  9. 2
      tests/CourseBundle/Repository/CDocumentRepositoryTest.php

@ -61,7 +61,7 @@ class SessionManager
$result = [
'id' => $session->getId(),
'id_coach' => $session->getGeneralCoach() ? $session->getGeneralCoach()->getId() : null,
'id_coach' => null, //$session->getGeneralCoach() ? $session->getGeneralCoach()->getId() : null,
'session_category_id' => $session->getCategory() ? $session->getCategory()->getId() : null,
'name' => $session->getName(),
'description' => $session->getDescription(),
@ -73,24 +73,12 @@ class SessionManager
'session_admin_id' => $session->getSessionAdmin()->getId(),
'visibility' => $session->getVisibility(),
'promotion_id' => $session->getPromotion() ? $session->getPromotion()->getId() : 0,
'display_start_date' => $session->getDisplayStartDate()
? $session->getDisplayStartDate()->format('Y-m-d H:i:s')
: null,
'display_end_date' => $session->getDisplayEndDate()
? $session->getDisplayEndDate()->format('Y-m-d H:i:s')
: null,
'access_start_date' => $session->getAccessStartDate()
? $session->getAccessStartDate()->format('Y-m-d H:i:s')
: null,
'access_end_date' => $session->getAccessEndDate()
? $session->getAccessEndDate()->format('Y-m-d H:i:s')
: null,
'coach_access_start_date' => $session->getCoachAccessStartDate()
? $session->getCoachAccessStartDate()->format('Y-m-d H:i:s')
: null,
'coach_access_end_date' => $session->getCoachAccessEndDate()
? $session->getCoachAccessEndDate()->format('Y-m-d H:i:s')
: null,
'display_start_date' => $session->getDisplayStartDate()?->format('Y-m-d H:i:s'),
'display_end_date' => $session->getDisplayEndDate()?->format('Y-m-d H:i:s'),
'access_start_date' => $session->getAccessStartDate()?->format('Y-m-d H:i:s'),
'access_end_date' => $session->getAccessEndDate()?->format('Y-m-d H:i:s'),
'coach_access_start_date' => $session->getCoachAccessStartDate()?->format('Y-m-d H:i:s'),
'coach_access_end_date' => $session->getCoachAccessEndDate()?->format('Y-m-d H:i:s'),
'send_subscription_notification' => $session->getSendSubscriptionNotification(),
];
@ -135,7 +123,7 @@ class SessionManager
* @param string $displayEndDate (YYYY-MM-DD hh:mm:ss)
* @param string $coachStartDate (YYYY-MM-DD hh:mm:ss)
* @param string $coachEndDate (YYYY-MM-DD hh:mm:ss)
* @param mixed $coachId If int, this is the session coach id,
* @param array $coachesId If int, this is the session coach id,
* if string, the coach ID will be looked for from the user table
* @param int $sessionCategoryId ID of the session category in which this session is registered
* @param int $visibility Visibility after end date (0 = read-only, 1 = invisible, 2 = accessible)
@ -162,7 +150,7 @@ class SessionManager
$displayEndDate,
$coachStartDate,
$coachEndDate,
$coachId,
$coachesId,
$sessionCategoryId,
$visibility = 1,
$fixSessionNameIfExists = false,
@ -249,7 +237,6 @@ class SessionManager
$session = new Session();
$session
->setName($name)
->setGeneralCoach(api_get_user_entity($coachId))
->setSessionAdmin(api_get_user_entity($sessionAdminId))
->setVisibility($visibility)
->setDescription($description)
@ -257,6 +244,10 @@ class SessionManager
->setSendSubscriptionNotification((bool) $sendSubscriptionNotification)
;
foreach ($coachesId as $coachId) {
$session->addGeneralCoach(api_get_user_entity($coachId));
}
$startDate = $startDate ? api_get_utc_datetime($startDate, true, true) : null;
$endDate = $endDate ? api_get_utc_datetime($endDate, true, true) : null;
$displayStartDate = $displayStartDate ? api_get_utc_datetime($displayStartDate, true, true) : null;
@ -1578,7 +1569,7 @@ class SessionManager
* @param string $displayEndDate
* @param string $coachStartDate
* @param string $coachEndDate
* @param int $coachId
* @param array $coachesId
* @param int $sessionCategoryId
* @param int $visibility
* @param string $description
@ -1600,7 +1591,7 @@ class SessionManager
$displayEndDate,
$coachStartDate,
$coachEndDate,
$coachId,
$coachesId,
$sessionCategoryId,
$visibility,
$description = null,
@ -1613,7 +1604,7 @@ class SessionManager
) {
$id = (int) $id;
$status = (int) $status;
$coachId = (int) $coachId;
$coachesId = array_map(fn($id) => (int) $id, $coachesId);
$sessionCategoryId = (int) $sessionCategoryId;
$visibility = (int) $visibility;
$duration = (int) $duration;
@ -1626,7 +1617,7 @@ class SessionManager
);
return false;
} elseif (empty($coachId)) {
} elseif (empty($coachesId)) {
Display::addFlash(
Display::return_message(get_lang('You must select a coach'), 'warning')
);
@ -1684,9 +1675,12 @@ class SessionManager
->setDisplayEndDate(null)
->setCoachAccessStartDate(null)
->setCoachAccessEndDate(null)
->setGeneralCoach(api_get_user_entity($coachId))
;
foreach ($coachesId as $coachId) {
$sessionEntity->addGeneralCoach(api_get_user_entity($coachId));
}
if (!empty($sessionAdminId)) {
$sessionEntity->setSessionAdmin(api_get_user_entity($sessionAdminId));
}
@ -7701,22 +7695,11 @@ class SessionManager
}
/**
* @param array $sessionInfo Optional
*
* @return array
* @throws Exception
*/
public static function setForm(FormValidator $form, array $sessionInfo = [])
public static function setForm(FormValidator $form, Session $session = null): array
{
$sessionId = 0;
$coachInfo = [];
if (!empty($sessionInfo)) {
$sessionId = (int) $sessionInfo['id'];
$coachInfo = api_get_user_info($sessionInfo['id_coach']);
}
$categoriesList = self::get_all_session_category();
$userInfo = api_get_user_info();
$categoriesOptions = [
'0' => get_lang('none'),
@ -7740,19 +7723,22 @@ class SessionManager
$form->addRule('name', get_lang('Session name already exists'), 'callback', 'check_session_name');
if (!api_is_platform_admin() && api_is_teacher()) {
$form->addSelect(
$form->addSelectFromCollection(
'coach_username',
get_lang('Coach name'),
[api_get_user_id() => $userInfo['complete_name']],
[api_get_user_entity()],
[
'id' => 'coach_username',
'style' => 'width:370px;',
]
'multiple' => true,
],
false,
'getFullname'
);
} else {
$sql = "SELECT COUNT(1) FROM $tbl_user WHERE status = 1";
$rs = Database::query($sql);
$countUsers = (int) Database::result($rs, 0, 0);
$countUsers = (int) Database::result($rs, 0, '0');
if ($countUsers < 50) {
$orderClause = 'ORDER BY ';
@ -7793,17 +7779,27 @@ class SessionManager
[
'id' => 'coach_username',
'style' => 'width:370px;',
'multiple' => true,
]
);
} else {
$coaches = [];
if ($session) {
foreach ($session->getGeneralCoaches() as $coach) {
$coaches[$coach->getId()] = $coach->getFullName();
}
}
$form->addSelectAjax(
'coach_username',
get_lang('Coach name'),
$coachInfo ? [$coachInfo['id'] => $coachInfo['complete_name_with_username']] : [],
$coaches,
[
'url' => api_get_path(WEB_AJAX_PATH).'session.ajax.php?a=search_general_coach',
'width' => '100%',
'id' => 'coach_username',
'multiple' => true,
]
);
}
@ -7815,7 +7811,7 @@ class SessionManager
$form->addButtonAdvancedSettings('advanced_params');
$form->addElement('html', '<div id="advanced_params_options" style="display:none">');
if (empty($sessionId)) {
if (null === $session) {
$form->addSelectAjax(
'session_template',
get_lang('Session template'),
@ -7988,7 +7984,7 @@ class SessionManager
// Extra fields
$extra_field = new ExtraFieldModel('session');
$extra = $extra_field->addElements($form, $sessionId);
$extra = $extra_field->addElements($form, $session ? $session->getId() : 0);
$form->addElement('html', '</div>');

@ -367,7 +367,7 @@ if ($form->validate()) {
$coachStartDate = $displayStartDate;
}
$coachEndDate = $params['coach_access_end_date'];
$coach_username = intval($params['coach_username']);
$coach_username = $params['coach_username'];
$id_session_category = $params['session_category'];
$id_visibility = $params['session_visibility'];
$duration = isset($params['duration']) ? $params['duration'] : null;

@ -2,88 +2,24 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\User;
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
// setting the section (for the tabs)
$this_section = SECTION_PLATFORM_ADMIN;
$formSent = 0;
// Database Table Definitions
$tbl_user = Database::get_main_table(TABLE_MAIN_USER);
$tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
$id = (int) $_GET['id'];
$session = api_get_session_entity($id);
SessionManager::protectSession($session);
$sessionInfo = SessionManager::fetch($id);
// Sets to local time to show it correctly when you edit a session
if (!empty($sessionInfo['display_start_date'])) {
$sessionInfo['display_start_date'] = api_get_local_time($sessionInfo['display_start_date']);
}
if (!empty($sessionInfo['display_end_date'])) {
$sessionInfo['display_end_date'] = api_get_local_time($sessionInfo['display_end_date']);
}
if (!empty($sessionInfo['access_start_date'])) {
$sessionInfo['access_start_date'] = api_get_local_time($sessionInfo['access_start_date']);
}
if (!empty($sessionInfo['access_end_date'])) {
$sessionInfo['access_end_date'] = api_get_local_time($sessionInfo['access_end_date']);
}
if (!empty($sessionInfo['coach_access_start_date'])) {
$sessionInfo['coach_access_start_date'] = api_get_local_time($sessionInfo['coach_access_start_date']);
}
if (!empty($sessionInfo['coach_access_end_date'])) {
$sessionInfo['coach_access_end_date'] = api_get_local_time($sessionInfo['coach_access_end_date']);
}
$tool_name = get_lang('Edit this session');
$interbreadcrumb[] = ['url' => 'session_list.php', 'name' => get_lang('Session list')];
$interbreadcrumb[] = ['url' => 'resume_session.php?id_session='.$id, 'name' => get_lang('Session overview')];
if (isset($_POST['formSent']) && $_POST['formSent']) {
$formSent = 1;
}
$order_clause = 'ORDER BY ';
$order_clause .= api_sort_by_first_name() ? 'firstname, lastname, username' : 'lastname, firstname, username';
$sql = "SELECT id as user_id,lastname,firstname,username
FROM $tbl_user
WHERE status='1'".$order_clause;
if (api_is_multiple_url_enabled()) {
$table_access_url_rel_user = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
$access_url_id = api_get_current_access_url_id();
if (-1 != $access_url_id) {
$sql = "SELECT DISTINCT u.id as user_id,lastname,firstname,username
FROM $tbl_user u
INNER JOIN $table_access_url_rel_user url_rel_user
ON (url_rel_user.user_id = u.id)
WHERE status='1' AND access_url_id = '$access_url_id' $order_clause";
}
}
$result = Database::query($sql);
$coaches = Database::store_result($result);
$thisYear = date('Y');
$coachesOption = [
'' => '----- '.get_lang('none').' -----',
];
foreach ($coaches as $coach) {
$personName = api_get_person_name($coach['firstname'], $coach['lastname']);
$coachesOption[$coach['user_id']] = "$personName ({$coach['username']})";
}
$categoriesList = SessionManager::get_all_session_category();
$categoriesOption = [
@ -104,8 +40,7 @@ $formAction .= http_build_query([
$form = new FormValidator('edit_session', 'post', $formAction);
$form->addElement('header', $tool_name);
$result = SessionManager::setForm($form, $sessionInfo);
$result = SessionManager::setForm($form, $session);
$htmlHeadXtra[] = '
<script>
$(function() {
@ -115,11 +50,28 @@ $(function() {
$form->addButtonUpdate(get_lang('Edit this session'));
$formDefaults = $sessionInfo;
$formDefaults['coach_username'] = $sessionInfo['id_coach'];
$formDefaults['session_category'] = $sessionInfo['session_category_id'];
$formDefaults['session_visibility'] = $sessionInfo['visibility'];
$formDefaults = [
'id' => $session->getId(),
'session_category' => $session->getCategory()?->getId(),
'name' => $session->getName(),
'description' => $session->getDescription(),
'show_description' => $session->getShowDescription(),
'duration' => $session->getDuration(),
'session_visibility' => $session->getVisibility(),
'display_start_date' => $session->getDisplayStartDate() ? api_get_local_time($session->getDisplayStartDate()) : null,
'display_end_date' => $session->getDisplayEndDate() ? api_get_local_time($session->getDisplayEndDate()) : null,
'access_start_date' => $session->getAccessStartDate() ? api_get_local_time($session->getAccessStartDate()) : null,
'access_end_date' => $session->getAccessEndDate() ? api_get_local_time($session->getAccessEndDate()) : null,
'coach_access_start_date' => $session->getCoachAccessStartDate() ? api_get_local_time($session->getCoachAccessStartDate()) : null,
'coach_access_end_date' => $session->getCoachAccessEndDate() ? api_get_local_time($session->getCoachAccessEndDate()) : null,
'send_subscription_notification' => $session->getSendSubscriptionNotification(),
'coach_username' => array_map(
function (User $user) {
return $user->getId();
},
$session->getGeneralCoaches()->getValues()
),
];
$form->setDefaults($formDefaults);
@ -133,7 +85,7 @@ if ($form->validate()) {
$displayEndDate = $params['display_end_date'];
$coachStartDate = $params['coach_access_start_date'];
$coachEndDate = $params['coach_access_end_date'];
$coach_username = intval($params['coach_username']);
$coach_username = $params['coach_username'];
$id_session_category = $params['session_category'];
$id_visibility = $params['session_visibility'];
$duration = isset($params['duration']) ? $params['duration'] : null;
@ -194,7 +146,7 @@ $form->display();
<script>
$(function() {
<?php
if (!empty($sessionInfo['duration'])) {
if ($session->getDuration() > 0) {
echo 'accessSwitcher(0);';
} else {
echo 'accessSwitcher(1);';

@ -12,7 +12,11 @@
</tr>
<tr>
<td>{{ 'General coach' | get_lang}} :</td>
<td>{{ session.generalCoach | user_complete_name_with_link }}</td>
<td>
{% for coach in session.generalCoaches %}
{{ coach | user_complete_name_with_link }}<br>
{% endfor %}
</td>
</tr>
{% if session.category %}
<tr>

@ -27,7 +27,6 @@ use Symfony\Component\Validator\Constraints as Assert;
* @ORM\UniqueConstraint(name="name", columns={"name"})
* },
* indexes={
* @ORM\Index(name="idx_id_coach", columns={"id_coach"}),
* @ORM\Index(name="idx_id_session_admin_id", columns={"session_admin_id"})
* }
* )
@ -76,6 +75,7 @@ class Session implements ResourceWithAccessUrlInterface
public const STUDENT = 0;
public const DRH = 1;
public const COURSE_COACH = 2;
public const SESSION_COACH = 3;
/**
* @Groups({"session:read", "session_rel_user:read"})
@ -742,11 +742,44 @@ class Session implements ResourceWithAccessUrlInterface
return $this->generalCoach;
}
public function setGeneralCoach(User $coach): self
public function getGeneralCoaches(): Collection
{
$this->generalCoach = $coach;
return $this
->getGeneralCoachesSubscriptions()
->map(function (SessionRelUser $subscription) {
return $subscription->getUser();
})
;
}
return $this;
public function getGeneralCoachesSubscriptions(): Collection
{
$criteria = Criteria::create()
->where(
Criteria::expr()->eq('relationType', self::SESSION_COACH)
)
;
return $this->users->matching($criteria);
}
public function hasUserAsGeneralCoach(User $user): bool
{
$criteria = Criteria::create()
->where(
Criteria::expr()->eq('relationType', self::SESSION_COACH)
)
->andWhere(
Criteria::expr()->eq('user', $user)
)
;
return $this->users->matching($criteria)->count() > 0;
}
public function addGeneralCoach(User $coach): self
{
return $this->addUserInSession(self::SESSION_COACH, $coach);
}
public function getCategory(): ?SessionCategory

@ -67,7 +67,7 @@ trait ChamiloTestTrait
$session = (new Session())
->setName($title)
->setGeneralCoach($this->getUser('admin'))
->addGeneralCoach($this->getUser('admin'))
->addAccessUrl($this->getAccessUrl())
;
$repo->update($session);

@ -46,7 +46,7 @@ class SessionRepositoryTest extends AbstractApiTest
$session = (new Session())
->setName($name)
->setGeneralCoach($this->getUser('admin'))
->addGeneralCoach($this->getUser('admin'))
->addAccessUrl($this->getAccessUrl())
;
$errors = $this->getViolations($session);

@ -39,7 +39,7 @@ class SessionRepositoryTest extends AbstractApiTest
$session = (new Session())
->setName('session 1')
->setGeneralCoach($coach)
->addGeneralCoach($coach)
->addAccessUrl($url)
->setCategory($category)

@ -695,7 +695,7 @@ class CDocumentRepositoryTest extends AbstractApiTest
$session = (new Session())
->setName('session 1')
->setGeneralCoach($teacher)
->addGeneralCoach($teacher)
->addAccessUrl($this->getAccessUrl())
;
$em->persist($session);

Loading…
Cancel
Save