Session: Use session_rel_user instead of session_admin_id

Includes migration
pull/3995/head
Angel Fernando Quiroz Campos 4 years ago
parent 743a7afed4
commit 188040eff5
  1. 15
      public/main/forum/forumfunction.inc.php
  2. 10
      public/main/inc/ajax/session.ajax.php
  3. 2
      public/main/inc/lib/course.lib.php
  4. 11
      public/main/inc/lib/sessionmanager.lib.php
  5. 3
      public/main/session/session_course_user.php
  6. 49
      src/CoreBundle/Entity/Session.php
  7. 15
      src/CoreBundle/Migrations/Schema/V200/Version20190210182615.php
  8. 2
      src/CoreBundle/Security/Authorization/Voter/SessionVoter.php

@ -1494,8 +1494,9 @@ function get_thread_users_details($thread_id)
$session = api_get_session_entity();
if ($session) {
$coachesId = $session->getGeneralCoaches()->map(fn(User $coach) => $coach->getId())->getValues();
$coachesId[] = $session->getSessionAdmin()->getId();
$generalCoachesId = $session->getGeneralCoaches()->map(fn(User $coach) => $coach->getId())->getValues();
$sessionAdminsId = $session->getSessionAdmins()->map(fn(User $admin) => $admin->getId())->getValues();
$coachesId = array_merge($generalCoachesId, $sessionAdminsId);
$user_to_avoid = implode(', ', $coachesId);
//not showing coaches
$sql = "SELECT DISTINCT user.id, user.lastname, user.firstname, thread_id
@ -1558,8 +1559,9 @@ function get_thread_users_qualify($thread_id)
$session = api_get_session_entity();
if ($session) {
$coachesId = $session->getGeneralCoaches()->map(fn(User $coach) => $coach->getId())->getValues();
$coachesId[] = $session->getSessionAdmin()->getId();
$generalCoachesId = $session->getGeneralCoaches()->map(fn(User $coach) => $coach->getId())->getValues();
$sessionAdminsId = $session->getSessionAdmins()->map(fn(User $admin) => $admin->getId())->getValues();
$coachesId = array_merge($generalCoachesId, $sessionAdminsId);
$user_to_avoid = implode(', ', $coachesId);
//not showing coaches
$sql = "SELECT DISTINCT post.poster_id, user.lastname, user.firstname, post.thread_id,user.id,qualify.qualify
@ -1644,8 +1646,9 @@ function get_thread_users_not_qualify($thread_id)
$session = api_get_session_entity();
if ($session) {
$coachesId = $session->getGeneralCoaches()->map(fn(User $coach) => $coach->getId())->getValues();
$coachesId[] = $session->getSessionAdmin()->getId();
$generalCoachesId = $session->getGeneralCoaches()->map(fn(User $coach) => $coach->getId())->getValues();
$sessionAdminsId = $session->getSessionAdmins()->map(fn(User $admin) => $admin->getId())->getValues();
$coachesId = array_merge($generalCoachesId, $sessionAdminsId);
$user_to_avoid = implode(', ', $coachesId);
//not showing coaches
$sql = "SELECT DISTINCT user.id, user.lastname, user.firstname, post.thread_id

@ -243,7 +243,7 @@ switch ($action) {
case 'get_basic_course_documents_form':
$courseId = isset($_GET['course']) ? (int) $_GET['course'] : 0;
$sessionId = isset($_GET['session']) ? (int) $_GET['session'] : 0;
$currentUserId = api_get_user_id();
$currentUser = api_get_user_entity();
$em = Database::getManager();
$course = api_get_course_entity($courseId);
@ -253,7 +253,7 @@ switch ($action) {
break;
}
if (!api_is_platform_admin(true) || $session->getSessionAdmin()->getId() != $currentUserId) {
if (!api_is_platform_admin(true) || !$session->hasUserAsSessionAdmin($currentUser)) {
break;
}
@ -269,7 +269,7 @@ switch ($action) {
$newFolderData = create_unexisting_directory(
$courseInfo,
$currentUserId,
$currentUser->getId(),
$session->getId(),
0,
0,
@ -383,13 +383,13 @@ switch ($action) {
$courseInfo = api_get_course_info_by_id($courseId);
$session = api_get_session_entity($sessionId);
$currentUserId = api_get_user_id();
$currentUser = api_get_user_entity();
if (empty($courseInfo) || !$session) {
break;
}
if (!api_is_platform_admin(true) || $session->getSessionAdmin()->getId() != $currentUserId) {
if (!api_is_platform_admin(true) || !$session->hasUserAsSessionAdmin($currentUser)) {
break;
}

@ -645,7 +645,7 @@ class CourseManager
$session->setDisplayEndDate($endDate);
$session->setSendSubscriptionNotification(false);
$adminId = api_get_configuration_value('session_automatic_creation_user_id') ?: 1;
$session->setSessionAdmin(api_get_user_entity($adminId));
$session->addSessionAdmin(api_get_user_entity($adminId));
$session->addUserInSession(0, $user);
Database::getManager()->persist($session);
try {

@ -69,7 +69,6 @@ class SessionManager
'nbr_courses' => $session->getNbrCourses(),
'nbr_users' => $session->getNbrUsers(),
'nbr_classes' => $session->getNbrClasses(),
'session_admin_id' => $session->getSessionAdmin()->getId(),
'visibility' => $session->getVisibility(),
'promotion_id' => $session->getPromotion() ? $session->getPromotion()->getId() : 0,
'display_start_date' => $session->getDisplayStartDate()?->format('Y-m-d H:i:s'),
@ -236,7 +235,7 @@ class SessionManager
$session = new Session();
$session
->setName($name)
->setSessionAdmin(api_get_user_entity($sessionAdminId))
->addSessionAdmin(api_get_user_entity($sessionAdminId))
->setVisibility($visibility)
->setDescription($description)
->setShowDescription(1 === $showDescription)
@ -1681,7 +1680,7 @@ class SessionManager
}
if (!empty($sessionAdminId)) {
$sessionEntity->setSessionAdmin(api_get_user_entity($sessionAdminId));
$sessionEntity->addSessionAdmin(api_get_user_entity($sessionAdminId));
}
if (!empty($startDate)) {
@ -1772,6 +1771,7 @@ class SessionManager
$ticket = Database::get_main_table(TABLE_TICKET_TICKET);
$em = Database::getManager();
$userId = api_get_user_id();
$user = api_get_user_entity();
$repo = Container::getSequenceResourceRepository();
$sequenceResource = $repo->findRequirementForResource(
@ -1796,8 +1796,7 @@ class SessionManager
}
if (self::allowed($sessionEntity) && !$from_ws) {
$sessionAdminId = $sessionEntity->getSessionAdmin()->getId();
if ($sessionAdminId != $userId && !api_is_platform_admin()) {
if (!$sessionEntity->hasUserAsSessionAdmin($user) && !api_is_platform_admin()) {
api_not_allowed(true);
}
}
@ -9728,7 +9727,7 @@ class SessionManager
'true' !== api_get_setting('allow_session_admins_to_manage_all_sessions')
) {
if ($user->getId() === $session->getSessionAdmin()->getId()) {
if ($session->hasUserAsSessionAdmin($user)) {
return true;
}
}

@ -22,8 +22,9 @@ $id_user = intval($_GET['id_user']);
$em = Database::getManager();
$session = api_get_session_entity($id_session);
$user = api_get_user_entity($id_user);
$currentUser = api_get_user_entity();
if (!api_is_platform_admin() && $session->getSessionAdmin()->getId() != api_get_user_id()) {
if (!api_is_platform_admin() && !$session->hasUserAsSessionAdmin($currentUser)) {
api_not_allowed(true);
}

@ -25,9 +25,6 @@ use Symfony\Component\Validator\Constraints as Assert;
* name="session",
* uniqueConstraints={
* @ORM\UniqueConstraint(name="name", columns={"name"})
* },
* indexes={
* @ORM\Index(name="idx_id_session_admin_id", columns={"session_admin_id"})
* }
* )
* @ORM\EntityListeners({"Chamilo\CoreBundle\Entity\Listener\SessionListener"})
@ -76,6 +73,7 @@ class Session implements ResourceWithAccessUrlInterface
public const DRH = 1;
public const COURSE_COACH = 2;
public const SESSION_COACH = 3;
public const SESSION_ADMIN = 4;
/**
* @Groups({"session:read", "session_rel_user:read"})
@ -193,13 +191,6 @@ class Session implements ResourceWithAccessUrlInterface
*/
protected int $nbrClasses;
/**
* @Groups({"session:read", "session:write"})
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\User")
* @ORM\JoinColumn(name="session_admin_id", referencedColumnName="id", nullable=true)
*/
protected ?User $sessionAdmin = null;
/**
* @Groups({"session:read", "session:write"})
* @ORM\Column(name="visibility", type="integer")
@ -1089,16 +1080,44 @@ class Session implements ResourceWithAccessUrlInterface
return $this;
}
public function getSessionAdmin(): ?User
public function getSessionAdmins(): Collection
{
return $this->sessionAdmin;
return $this
->getGeneralAdminsSubscriptions()
->map(function (SessionRelUser $subscription) {
return $subscription->getUser();
})
;
}
public function setSessionAdmin(User $sessionAdmin): self
public function getGeneralAdminsSubscriptions(): Collection
{
$this->sessionAdmin = $sessionAdmin;
$criteria = Criteria::create()
->where(
Criteria::expr()->eq('relationType', self::SESSION_ADMIN)
)
;
return $this;
return $this->users->matching($criteria);
}
public function hasUserAsSessionAdmin(User $user): bool
{
$criteria = Criteria::create()
->where(
Criteria::expr()->eq('relationType', self::SESSION_ADMIN)
)
->andWhere(
Criteria::expr()->eq('user', $user)
)
;
return $this->users->matching($criteria)->count() > 0;
}
public function addSessionAdmin(User $sessionAdmin): self
{
return $this->addUserInSession(self::SESSION_ADMIN, $sessionAdmin);
}
/**

@ -107,23 +107,30 @@ class Version20190210182615 extends AbstractMigrationChamilo
}
// Move id_coach to session_rel_user
$result = $connection->executeQuery("SELECT id, id_coach FROM session");
$result = $connection->executeQuery("SELECT id, session_admin_id, id_coach FROM session");
$items = $result->fetchAllAssociative();
foreach ($items as $item) {
$coachId = $item['id_coach'];
$adminId = $item['session_admin_id'];
$sessionId = $item['id'];
if (empty($coachId)) {
continue;
if (!empty($coachId)) {
$this->addSql("INSERT INTO session_rel_user (relation_type, duration, registered_at, user_id, session_id) VALUES (3, 0, NOW(), $coachId, $sessionId)");
}
$this->addSql("INSERT INTO session_rel_user (relation_type, duration, registered_at, user_id, session_id) VALUES (3, 0, NOW(), $coachId, $sessionId)");
if (!empty($adminId)) {
$this->addSql("INSERT INTO session_rel_user (relation_type, duration, registered_at, user_id, session_id) VALUES (4, 0, NOW(), $adminId, $sessionId)");
}
}
$this->addSql('ALTER TABLE session DROP FOREIGN KEY FK_D044D5D4D1DC2CFC');
$this->addSql("DROP INDEX idx_id_coach ON session");
$this->addSql("ALTER TABLE session DROP COLUMN id_coach");
$this->addSql('ALTER TABLE session DROP FOREIGN KEY FK_D044D5D4EF87E278');
$this->addSql("DROP INDEX idx_id_session_admin_id ON session");
$this->addSql("ALTER TABLE session DROP COLUMN session_admin_id");
}
public function down(Schema $schema): void

@ -231,7 +231,7 @@ class SessionVoter extends Voter
if ($this->security->isGranted('ROLE_SESSION_MANAGER') &&
'true' !== $this->settingsManager->getSetting('session.allow_session_admins_to_manage_all_sessions') &&
$session->getSessionAdmin()->getId() !== $user->getId()
!$session->hasUserAsSessionAdmin($user)
) {
return false;
}

Loading…
Cancel
Save