/** * This code is executed when a new session is created. * * new object : prePersist * edited object: preUpdate * * @param Session $session * @param LifecycleEventArgs $args * * @throws \Exception */ public function prePersist(Session $session, LifecycleEventArgs $args) { /** @var AccessUrlRelSession $urlRelSession */ $urlRelSession = $session->getUrls()->first(); $url = $urlRelSession->getUrl(); $repo = $args->getEntityManager()->getRepository('ChamiloCoreBundle:Session'); $this->checkLimit($repo, $url); }
/** * @Given I have a session :arg1 */ public function iHaveASession($arg1) { $em = $this->getEntityManager(); $entity = new Session(); $entity->setName($arg1); $em->persist($entity); $em->flush(); }
/** * Get the last acquired skill by a user on course and/or session * @param User $user The user * @param Course $course The course * @param Session $session The session * @return Skill */ public function getLastByUser(User $user, Course $course = null, Session $session = null) { $qb = $this->createQueryBuilder('s'); $qb->innerJoin('ChamiloCoreBundle:SkillRelUser', 'su', Join::WITH, $qb->expr()->eq('s', 'su.skill'))->where($qb->expr()->eq('su.user', $user->getId())); if ($course) { $qb->andWhere($qb->expr()->eq('su.course', $course->getId())); } if ($session) { $qb->andWhere($qb->expr()->eq('su.session', $session->getId())); } $qb->setMaxResults(1)->orderBy('su.id', 'DESC'); return $qb->getQuery()->getOneOrNullResult(); }
/** * Check if user has access to a session * * @param string $attribute * @param Session $session * @param User $user * @return bool */ protected function isGranted($attribute, $session, $user = null) { // make sure there is a user object (i.e. that the user is logged in) if (!$user instanceof UserInterface) { return false; } // Checks if the current user was set up $course = $session->getCurrentCourse(); if ($course == false) { error_log('sss'); return false; } $authChecker = $this->container->get('security.authorization_checker'); // Admins have access to everything if ($authChecker->isGranted('ROLE_ADMIN')) { return true; } if (!$session->isActive()) { return false; } switch ($attribute) { case self::VIEW: if (!$session->hasUserInCourse($user, $course)) { $user->addRole('ROLE_CURRENT_SESSION_COURSE_STUDENT'); return true; } break; case self::EDIT: case self::DELETE: // General coach check $generalCoach = $session->getGeneralCoach(); if ($generalCoach) { $coachId = $generalCoach->getId(); $userId = $user->getId(); if ($coachId == $userId) { $user->addRole('ROLE_CURRENT_SESSION_COURSE_TEACHER'); return true; } } // Course session coach check if (!$session->hasCoachInCourseWithStatus($user, $course)) { $user->addRole('ROLE_CURRENT_SESSION_COURSE_TEACHER'); return true; } break; } // User don't have access to the session return false; }
/** * Get session's courses ordered by position in session_rel_course * @param Session $session The session * * @return \Doctrine\ORM\QueryBuilder */ public function getCoursesOrderedByPosition(Session $session) { $queryBuilder = $this->createQueryBuilder('s'); $queryBuilder->select('DISTINCT c ')->innerJoin('s.courses', 'src')->innerJoin('ChamiloCoreBundle:Course', 'c', Join::WITH, 'src.course = c.id')->where($queryBuilder->expr()->eq('s.id', $session->getId()))->orderBy('src.position'); return $queryBuilder->getQuery()->getResult(); }
/** * Get the coaches for a course within a session * @param Session $session The session * @param Course $course The course * @return \Doctrine\ORM\QueryBuilder */ public function getCoachesForSessionCourse(Session $session, Course $course) { $queryBuilder = $this->createQueryBuilder('u'); $queryBuilder->select('u')->innerJoin('ChamiloCoreBundle:SessionRelCourseRelUser', 'scu', Join::WITH, 'scu.user = u')->where($queryBuilder->expr()->andX($queryBuilder->expr()->eq('scu.session', $session->getId()), $queryBuilder->expr()->eq('scu.course', $course->getId()), $queryBuilder->expr()->eq('scu.status', SessionRelCourseRelUser::STATUS_COURSE_COACH))); return $queryBuilder->getQuery()->getResult(); }
/** * @inheritdoc */ public function buildForm(FormBuilderInterface $builder, array $options) { $builderData = $builder->getData(); $builder->add('name', 'text')->add('general_coach', 'entity', array('class' => 'ChamiloUserBundle:User', 'property' => 'username'))->add('session_admin_id', 'entity', array('class' => 'ChamiloUserBundle:User', 'property' => 'username'))->add('visibility', 'choice', array('choices' => Session::getStatusList()))->add('session_category_id', 'entity', array('class' => 'ChamiloCoreBundle:SessionCategory', 'property' => 'name'))->add('promotion_id', 'entity', array('class' => 'ChamiloCoreBundle:Promotion', 'property' => 'name'))->add('display_start_date', 'sonata_type_datetime_picker')->add('display_end_date', 'sonata_type_datetime_picker')->add('access_start_date', 'sonata_type_datetime_picker')->add('access_end_date', 'sonata_type_datetime_picker')->add('coach_access_start_date', 'sonata_type_datetime_picker')->add('coach_access_end_date', 'sonata_type_datetime_picker')->add('save', 'submit', array('label' => 'Update')); }
/** * @param $status * @param User $user * @param Course $course * @param Session $session */ private function addUserInCourse($status, User $user, Course $course, Session $session) { if ($session->isActive() && $user->getIsActive() && $course->isActive()) { if ($session->hasCourse($course)) { switch ($status) { case Session::DRH: if ($user->hasRole('ROLE_RRHH')) { $session->addUserInSession(Session::DRH, $user); } break; case Session::STUDENT: $session->addUserInSession(Session::STUDENT, $user); $session->addUserInCourse(Session::STUDENT, $user, $course); break; case Session::COACH: if ($user->hasRole('ROLE_TEACHER')) { $session->addUserInCourse(Session::COACH, $user, $course); } break; } } } }
/** * Very important in order to save the related entities! * @param \Chamilo\CoreBundle\Entity\Session $session * @return mixed|void */ public function preUpdate($session) { $session->setCourses($session->getCourses()); }
/** * @param Session $session * @return $this */ public function setCurrentSession(Session $session) { // If the session is registered in the course session list. if ($this->getSessions()->contains($session->getId())) { $this->currentSession = $session; } return $this; }
/** * Get the user status for the session * @param int $userId The user ID * @param \Chamilo\CoreBundle\Entity\Session $session The session * @return string */ private function getUserStatusForSession($userId, \Chamilo\CoreBundle\Entity\Session $session) { if (empty($userId)) { return 'NO'; } $entityManager = Database::getManager(); $scuRepo = $entityManager->getRepository('ChamiloCoreBundle:SessionRelCourseRelUser'); $buySaleTable = Database::get_main_table(self::TABLE_SALE); // Check if user bought the course $sale = Database::select('COUNT(1) as qty', $buySaleTable, ['where' => ['user_id = ? AND product_type = ? AND product_id = ? AND status = ?' => [$userId, self::PRODUCT_TYPE_SESSION, $session->getId(), self::SALE_STATUS_PENDING]]], 'first'); if ($sale['qty'] > 0) { return "TMP"; } // Check if user is already subscribe to session $userSubscription = $scuRepo->findBy(['session' => $session, 'user' => $userId]); if (!empty($userSubscription)) { return 'YES'; } return 'NO'; }
/** * @param Session $session * @return $this */ public function setCurrentSession(Session $session) { // If the session is registered in the course session list. /*if ($this->getSessions()->contains($session->getId())) { $this->currentSession = $session; }*/ $list = $this->getSessions(); /** @var SessionRelCourse $item */ foreach ($list as $item) { if ($item->getSession()->getId() == $session->getId()) { $this->currentSession = $session; break; } } return $this; }
/** * Create a session * @author Carlos Vargas <*****@*****.**>, from existing code * @param string $name * @param string $startDate (YYYY-MM-DD hh:mm:ss) * @param string $endDate (YYYY-MM-DD hh:mm:ss) * @param string $displayStartDate (YYYY-MM-DD hh:mm:ss) * @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 integer, this is the session coach id, if string, the coach ID will be looked for from the user table * @param integer $sessionCategoryId ID of the session category in which this session is registered * @param integer $visibility Visibility after end date (0 = read-only, 1 = invisible, 2 = accessible) * @param bool $fixSessionNameIfExists * @param string $duration * @param string $description Optional. The session description * @param int $showDescription Optional. Whether show the session description * @param array $extraFields * @param int $sessionAdminId Optional. If this sessions was created by a session admin, assign it to him * @param boolean $sendSubscritionNotification Optional. * Whether send a mail notification to users being subscribed * @todo use an array to replace all this parameters or use the model.lib.php ... * @return mixed Session ID on success, error message otherwise * */ public static function create_session($name, $startDate, $endDate, $displayStartDate, $displayEndDate, $coachStartDate, $coachEndDate, $coachId, $sessionCategoryId, $visibility = 1, $fixSessionNameIfExists = false, $duration = null, $description = null, $showDescription = 0, $extraFields = array(), $sessionAdminId = 0, $sendSubscritionNotification = false) { $em = Database::getManager(); /* if (is_array($_configuration[$access_url_id]) && isset($_configuration[$access_url_id]['hosting_limit_sessions']) && $_configuration[$access_url_id]['hosting_limit_sessions'] > 0 ) { $num = self::count_sessions(); if ($num >= $_configuration[$access_url_id]['hosting_limit_sessions']) { api_warn_hosting_contact('hosting_limit_sessions'); return get_lang('PortalSessionsLimitReached'); } }*/ $name = trim($name); $sessionCategoryId = intval($sessionCategoryId); $visibility = intval($visibility); $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); if (empty($name)) { $msg = get_lang('SessionNameIsRequired'); return $msg; } elseif (empty($coachId)) { $msg = get_lang('CoachIsRequired'); return $msg; } elseif (!empty($startDate) && !api_is_valid_date($startDate, 'Y-m-d H:i') && !api_is_valid_date($startDate, 'Y-m-d H:i:s')) { $msg = get_lang('InvalidStartDate'); return $msg; } elseif (!empty($endDate) && !api_is_valid_date($endDate, 'Y-m-d H:i') && !api_is_valid_date($endDate, 'Y-m-d H:i:s')) { $msg = get_lang('InvalidEndDate'); return $msg; } elseif (!empty($startDate) && !empty($endDate) && $startDate >= $endDate) { $msg = get_lang('StartDateShouldBeBeforeEndDate'); return $msg; } else { $ready_to_create = false; if ($fixSessionNameIfExists) { $name = self::generateNextSessionName($name); if ($name) { $ready_to_create = true; } else { $msg = get_lang('SessionNameAlreadyExists'); return $msg; } } else { $rs = Database::query("SELECT 1 FROM {$tbl_session} WHERE name='" . $name . "'"); if (Database::num_rows($rs)) { $msg = get_lang('SessionNameAlreadyExists'); return $msg; } $ready_to_create = true; } if ($ready_to_create) { $sessionAdminId = !empty($sessionAdminId) ? $sessionAdminId : api_get_user_id(); $session = new Session(); $session->setName($name)->setVisibility($visibility)->setDescription($description)->setShowDescription($showDescription)->setSendSubscriptionNotification($sendSubscritionNotification)->setSessionAdminId($sessionAdminId); if (!empty($coachId)) { $coach = UserManager::getManager()->find($coachId); if ($coach) { $session->setGeneralCoach($coach); } } if (!empty($startDate)) { $session->setAccessStartDate(new \DateTime($startDate)); } if (!empty($endDate)) { $session->setAccessEndDate(new \DateTime($endDate)); } if (!empty($displayStartDate)) { $session->setDisplayStartDate(new \DateTime($displayStartDate)); } if (!empty($displayEndDate)) { $session->setDisplayEndDate(new \DateTime($displayEndDate)); } if (!empty($coachStartDate)) { $session->setCoachAccessStartDate(new \DateTime($coachStartDate)); } if (!empty($coachEndDate)) { $session->setCoachAccessEndDate(new \DateTime($coachEndDate)); } if (!empty($sessionCategoryId)) { $session->setCategory($sessionCategoryId); } $duration = intval($duration); if (!empty($duration)) { $session->setDuration($duration); $session->setAccessStartDate(null); $session->setAccessEndDate(null); $session->setDisplayStartDate(null); $session->setDisplayEndDate(null); $session->setCoachAccessStartDate(null); $session->setCoachAccessEndDate(null); } else { $session->setDuration(0); } $url = $em->getRepository('ChamiloCoreBundle:AccessUrl')->find(api_get_current_access_url_id()); $accessRelSession = new \Chamilo\CoreBundle\Entity\AccessUrlRelSession(); $accessRelSession->setUrl($url); $session->addUrls($accessRelSession); $em->persist($session); $em->flush(); $session_id = $session->getId(); if (!empty($session_id)) { $extraFields['item_id'] = $session_id; $sessionFieldValue = new ExtraFieldValue('session'); $sessionFieldValue->saveFieldValues($extraFields); /* Sends a message to the user_id = 1 $user_info = api_get_user_info(1); $complete_name = $user_info['firstname'].' '.$user_info['lastname']; $subject = api_get_setting('platform.site_name').' - '.get_lang('ANewSessionWasCreated'); $message = get_lang('ANewSessionWasCreated')." <br /> ".get_lang('NameOfTheSession').' : '.$name; api_mail_html($complete_name, $user_info['email'], $subject, $message); * */ //Adding to the correct URL $access_url_id = api_get_current_access_url_id(); UrlManager::add_session_to_url($session_id, $access_url_id); // add event to system log $user_id = api_get_user_id(); Event::addEvent(LOG_SESSION_CREATE, LOG_SESSION_ID, $session_id, api_get_utc_datetime(), $user_id); } return $session_id; } } }