示例#1
0
/**
 * Gets the session visibility by session id
 * @param int       session id
 * @return int      0 = session still available, SESSION_VISIBLE_READ_ONLY = 1, SESSION_VISIBLE = 2, SESSION_INVISIBLE = 3
 */
function api_get_session_visibility($session_id, $course_code = null, $ignore_visibility_for_admins = true)
{
    if (api_is_platform_admin()) {
        if ($ignore_visibility_for_admins) {
            return SESSION_AVAILABLE;
        }
    }
    $session_info = api_get_session_info($session_id);
    $visibility = SESSION_AVAILABLE;
    if (!empty($session_info)) {
        $visibility = $session_info['visibility'];
        // 1. Checking session date validation
        $date_validation = api_get_session_date_validation($session_info, $course_code, $ignore_visibility_for_admins);
        if ($date_validation) {
            return SessionManager::DEFAULT_VISIBILITY;
            //visible
        } else {
            /*
                        $is_coach = api_is_coach($session_id, $course_code);
                        if (!$is_coach) {
                            //Student - check the moved_to variable
                            $user_status = SessionManager::get_user_status_in_session($session_id, api_get_user_id());
                            if (isset($user_status['moved_to']) && $user_status['moved_to'] != 0) {
                                return $visibility;
                            }
                        }*/
            return $visibility;
        }
    }
    return $visibility;
}
示例#2
0
 /**
  * Gives a list of [session_category][session_id] for the current user.
  * @todo check with 1.10
  * @param integer $user_id
  * @param boolean optional true if we want to see expired sessions, false otherwise
  * @param boolean Whether to return only a count (true) or the full result (false)
  * @param boolean Whether to order by alphabetical order (false) or reverse-alphabetical (used in history to show latest sessions on top)
  * @return array  list of statuses [session_category][session_id]
  * @todo ensure multiple access urls are managed correctly
  */
 public static function get_sessions_by_category($user_id, $is_time_over = false, $get_count = false, $reverse_order = false, $start = 0, $maxPerPage = null, $categoryFilter = null, $ignore_visibility_for_admins = false)
 {
     // Database Table Definitions
     $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
     $tbl_session_course_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
     $tbl_session_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
     $tbl_session_category = Database::get_main_table(TABLE_MAIN_SESSION_CATEGORY);
     if ($user_id != strval(intval($user_id))) {
         return array();
     }
     $categories = array();
     $now = api_get_utc_datetime();
     // Get the list of sessions per user
     $condition_date_start1 = null;
     $condition_date_start2 = null;
     $condition_date_end1 = null;
     $condition_date_end2 = null;
     $order = ' ORDER BY name ';
     if ($reverse_order) {
         $order = ' ORDER BY name DESC ';
     }
     if ($is_time_over) {
         $condition_date_end1 = " AND ((session.access_end_date < '{$now}' AND access_end_date IS NOT NULL AND session.access_end_date != '0000-00-00 00:00:00' AND session.access_end_date != '' ) OR moved_to <> 0) ";
         $condition_date_end2 = " AND ((session.access_end_date < '{$now}' AND access_end_date IS NOT NULL AND session.access_end_date != '0000-00-00 00:00:00' AND session.access_end_date != '') ) ";
     } else {
         if (api_is_allowed_to_create_course()) {
             //Teachers can access the session depending in the access_coach date
             //$condition_date_start1 = " AND (session.coach_access_start_date <= '$now' OR session.coach_access_start_date = '0000-00-00 00:00:00') ";
             //$condition_date_start2 = " AND (session.coach_access_start_date <= '$now' OR session.coach_access_start_date = '0000-00-00 00:00:00') ";
         } else {
             //Student can't access before the start date or after the end date
             //$condition_date_start1 = " AND (session.access_start_date <= '$now' OR session.access_start_date = '0000-00-00 00:00:00') ";
             //$condition_date_start2 = " AND (session.access_start_date <= '$now' OR session.access_start_date = '0000-00-00 00:00:00') ";
             $condition_date_end1 = " AND (session.access_end_date >= '{$now}' OR session.access_end_date = '0000-00-00 00:00:00' OR session.access_end_date IS NULL ) ";
             $condition_date_end2 = " AND (session.access_end_date >= '{$now}' OR session.access_end_date = '0000-00-00 00:00:00' OR session.access_end_date IS NULL ) ";
         }
     }
     $select = "SELECT DISTINCT " . " session.id, " . " session.name, " . " access_start_date, " . " access_end_date, " . " coach_access_start_date, " . " coach_access_end_date, " . " display_start_date, " . " display_end_date, " . " session_category_id, " . " session_category.name as session_category_name, " . " session_category.date_start session_category_date_start, " . " session_category.date_end session_category_date_end, " . " id_coach ";
     $select_1 = ", moved_to, " . " moved_status, " . " scu.user_id ";
     if ($get_count) {
         $select = "SELECT count(session.id) as total_rows ";
     }
     $select1 = " {$select} " . ($get_count ? '' : $select_1) . "\n                    FROM {$tbl_session} as session\n                    LEFT JOIN {$tbl_session_category} session_category\n                    ON (session_category_id = session_category.id) ";
     $sql1 = $select1 . " INNER JOIN {$tbl_session_course_user} as scu\n                ON (scu.session_id = session.id and scu.user_id = {$user_id})\n                LEFT JOIN {$tbl_session_user} su\n                ON su.session_id = session.id AND su.user_id = scu.user_id\n                WHERE scu.user_id = {$user_id} {$condition_date_end1}";
     // This is bad because we asumme the user is a coach which is not the case
     // Select specific to session coaches
     $select2 = "\n            {$select} FROM {$tbl_session} as session\n            LEFT JOIN {$tbl_session_category} session_category\n            ON (session_category_id = session_category.id)\n        ";
     $sql2 = $select2 . " WHERE session.id_coach = {$user_id} {$condition_date_end2} ";
     if (isset($categoryFilter) && $categoryFilter != '') {
         switch ($categoryFilter) {
             case 'no_category':
                 $sql1 .= "AND (session_category_id = 0 OR session_category_id IS NULL)";
                 $sql2 .= "AND (session_category_id = 0 OR session_category_id IS NULL)";
                 break;
             case 'with_category':
                 $sql1 .= "AND (session_category_id <> 0 AND session_category_id IS NOT NULL) ";
                 $sql2 .= "AND (session_category_id <> 0 AND session_category_id IS NOT NULL)";
                 break;
             default:
                 if (!empty($categoryFilter) && is_numeric($categoryFilter)) {
                     $categoryFilter = intval($categoryFilter);
                     $sql1 .= "AND session_category_id = {$categoryFilter}";
                     $sql2 .= "AND session_category_id = {$categoryFilter}";
                 }
                 break;
         }
     }
     $sql3 = null;
     if ($get_count) {
         //$sql3 = $sql2;
         $sql3 = $sql1;
     } else {
         $sql1 .= $order;
         $sql2 .= $order;
     }
     if (isset($start) && isset($maxPerPage)) {
         $start = intval($start);
         $maxPerPage = intval($maxPerPage);
         $limitCondition = " LIMIT {$start}, {$maxPerPage}";
         $sql1 .= $limitCondition;
         $sql2 .= $limitCondition;
     }
     $join = array();
     $ordered_join = array();
     $ids = array();
     if ($get_count) {
         $result3 = Database::query($sql3);
         $row = Database::fetch_array($result3);
         return $row['total_rows'];
     } else {
         $result1 = Database::query($sql1);
         $result2 = Database::query($sql2);
     }
     if (Database::num_rows($result2) > 0) {
         // First take $row2, as it contains less data and this data is enough
         while ($row2 = Database::fetch_array($result2)) {
             $join[] = $row2;
             $ordered_join[] = $row2;
             $ids[] = $row2['id'];
         }
     }
     if (Database::num_rows($result1) > 0) {
         // Now add the diff with $row1, ordering elements as planned by query
         $i = 0;
         while ($row1 = Database::fetch_array($result1)) {
             if (!in_array($row1['id'], $ids)) {
                 if ($reverse_order) {
                     while (isset($join[$i]) && strcmp($row1['session_category_name'], $join[$i]['session_category_name']) <= 0) {
                         $ordered_join[] = $join[$i];
                         $i++;
                     }
                 } else {
                     while (isset($join[$i]) && strcmp($row1['session_category_name'], $join[$i]['session_category_name']) > 0) {
                         $ordered_join[] = $join[$i];
                         $i++;
                     }
                     if (isset($join[$i]) && strcmp($row1['session_category_name'], $join[$i]['session_category_name']) === 0) {
                         while (isset($join[$i]) && isset($row1['short_name']) && strcmp($row1['short_name'], $join[$i]['short_name']) > 0) {
                             $ordered_join[] = $join[$i];
                             $i++;
                         }
                     }
                 }
                 $ordered_join[] = $row1;
                 $join[] = $row1;
             }
         }
     }
     if (count($ordered_join) == 0) {
         $ordered_join = $join;
     }
     if (count($ordered_join) > 0) {
         foreach ($ordered_join as $row) {
             if ($get_count) {
                 return $row['total_rows'];
             }
             $categories[$row['session_category_id']]['session_category']['id'] = $row['session_category_id'];
             $categories[$row['session_category_id']]['session_category']['name'] = $row['session_category_name'];
             $categories[$row['session_category_id']]['session_category']['date_start'] = $row['session_category_date_start'];
             $categories[$row['session_category_id']]['session_category']['date_end'] = $row['session_category_date_end'];
             $session_id = $row['id'];
             // The only usage of $session_info is to call
             // api_get_session_date_validation, which only needs id and
             // dates from the session itself, so really no need to query
             // the session table again
             $session_info = $row;
             // Checking session visibility
             $visibility = api_get_session_visibility($session_id, null, $ignore_visibility_for_admins);
             switch ($visibility) {
                 case SESSION_VISIBLE_READ_ONLY:
                 case SESSION_VISIBLE:
                 case SESSION_AVAILABLE:
                     break;
                 case SESSION_INVISIBLE:
                     continue 2;
             }
             if ($is_time_over == false) {
                 $date_validation = api_get_session_date_validation($session_info, null, false, false);
                 if (!$date_validation) {
                     continue;
                 }
             }
             $categories[$row['session_category_id']]['sessions'][$row['id']]['session_name'] = $row['name'];
             $categories[$row['session_category_id']]['sessions'][$row['id']]['session_id'] = $row['id'];
             $categories[$row['session_category_id']]['sessions'][$row['id']]['id_coach'] = $row['id_coach'];
             if (isset($row['id_coach']) && !empty($row['id_coach'])) {
                 $user_info = api_get_user_info($row['id_coach']);
                 $categories[$row['session_category_id']]['sessions'][$row['id']]['coach_info'] = $user_info;
             }
             $categories[$row['session_category_id']]['sessions'][$row['id']]['access_start_date'] = $row['access_start_date'];
             $categories[$row['session_category_id']]['sessions'][$row['id']]['access_end_date'] = $row['access_end_date'];
             $categories[$row['session_category_id']]['sessions'][$row['id']]['coach_access_start_date'] = $row['coach_access_start_date'];
             $categories[$row['session_category_id']]['sessions'][$row['id']]['coach_access_end_date'] = $row['coach_access_end_date'];
             $date_message = SessionManager::parseSessionDates($row);
             $categories[$row['session_category_id']]['sessions'][$row['id']]['date_message'] = $date_message;
             $courses = UserManager::get_courses_list_by_session($user_id, $row['id']);
             $course_list = array();
             foreach ($courses as $course) {
                 // Checking course session visibility
                 $visibility = api_get_session_visibility($session_id, $course['real_id']);
                 if ($visibility == SESSION_INVISIBLE) {
                     continue;
                 }
                 $user_status_in_course = CourseManager::get_user_in_course_status($user_id, $course['code']);
                 $course['user_status_in_course'] = $user_status_in_course;
                 $course_list[] = $course;
             }
             $categories[$row['session_category_id']]['sessions'][$row['id']]['courses'] = $course_list;
             $categories[$row['session_category_id']]['sessions'][$row['id']]['moved_to'] = isset($row['moved_to']) ? $row['moved_to'] : null;
             $categories[$row['session_category_id']]['sessions'][$row['id']]['moved_status'] = isset($row['moved_status']) ? $row['moved_status'] : null;
         }
     }
     return $categories;
 }