|
|
|
@ -12,42 +12,6 @@ require_once 'fileManage.lib.php'; |
|
|
|
|
require_once 'fileUpload.lib.php'; |
|
|
|
|
require_once 'document.lib.php'; |
|
|
|
|
|
|
|
|
|
//define ("TOOL_NOT_AVAILABLE", "0"); |
|
|
|
|
//define ("TOOL_PUBLIC", "1"); |
|
|
|
|
//define ("TOOL_PRIVATE", "2"); |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* infinite |
|
|
|
|
*/ |
|
|
|
|
define("INFINITE", "99999"); |
|
|
|
|
/** |
|
|
|
|
* No limit on the number of users in a group |
|
|
|
|
*/ |
|
|
|
|
define("MEMBER_PER_GROUP_NO_LIMIT", "0"); |
|
|
|
|
/** |
|
|
|
|
* No limit on the number of groups per user |
|
|
|
|
*/ |
|
|
|
|
define("GROUP_PER_MEMBER_NO_LIMIT", "0"); |
|
|
|
|
/** |
|
|
|
|
* Constants for the available group tools |
|
|
|
|
*/ |
|
|
|
|
define("GROUP_TOOL_FORUM", "0"); |
|
|
|
|
define("GROUP_TOOL_DOCUMENTS", "1"); |
|
|
|
|
define("GROUP_TOOL_CALENDAR","2"); |
|
|
|
|
define("GROUP_TOOL_ANNOUNCEMENT","3"); |
|
|
|
|
define("GROUP_TOOL_WORK","4"); |
|
|
|
|
define("GROUP_TOOL_WIKI", "5"); |
|
|
|
|
define("GROUP_TOOL_CHAT", "6"); |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Fixed id's for group categories |
|
|
|
|
* - VIRTUAL_COURSE_CATEGORY: in this category groups are created based on the |
|
|
|
|
* virtual course of a course |
|
|
|
|
* - DEFAULT_GROUP_CATEGORY: When group categories aren't available (platform- |
|
|
|
|
* setting), all groups are created in this 'dummy'-category |
|
|
|
|
*/ |
|
|
|
|
define("VIRTUAL_COURSE_CATEGORY", 1); |
|
|
|
|
define("DEFAULT_GROUP_CATEGORY", 2); |
|
|
|
|
/** |
|
|
|
|
* This library contains some functions for group-management. |
|
|
|
|
* @author Bart Mollet |
|
|
|
@ -56,19 +20,47 @@ define("DEFAULT_GROUP_CATEGORY", 2); |
|
|
|
|
* be used outside a session. |
|
|
|
|
*/ |
|
|
|
|
class GroupManager { |
|
|
|
|
//CLASS CONSTANTS |
|
|
|
|
//- VIRTUAL_COURSE_CATEGORY: in this category groups are created based on the virtual course of a course |
|
|
|
|
CONST VIRTUAL_COURSE_CATEGORY = 1; |
|
|
|
|
|
|
|
|
|
//DEFAULT_GROUP_CATEGORY: When group categories aren't available (platform-setting), all groups are created in this 'dummy'-category |
|
|
|
|
CONST DEFAULT_GROUP_CATEGORY = 2; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* infinite |
|
|
|
|
*/ |
|
|
|
|
CONST INFINITE = 99999; |
|
|
|
|
/** |
|
|
|
|
* No limit on the number of users in a group |
|
|
|
|
*/ |
|
|
|
|
CONST MEMBER_PER_GROUP_NO_LIMIT = 0; |
|
|
|
|
/** |
|
|
|
|
* No limit on the number of groups per user |
|
|
|
|
*/ |
|
|
|
|
CONST GROUP_PER_MEMBER_NO_LIMIT = 0; |
|
|
|
|
/** |
|
|
|
|
* The tools of a group can have 3 states |
|
|
|
|
* - not available |
|
|
|
|
* - public |
|
|
|
|
* - private |
|
|
|
|
*/ |
|
|
|
|
const TOOL_NOT_AVAILABLE = 0; |
|
|
|
|
const TOOL_PUBLIC = 1; |
|
|
|
|
const TOOL_PRIVATE = 2; |
|
|
|
|
const VIRTUAL_COURSE_CATEGORY = 1; |
|
|
|
|
const DEFAULT_GROUP_CATEGORY = 2; |
|
|
|
|
const MEMBER_PER_GROUP_NO_LIMIT = 0; |
|
|
|
|
CONST TOOL_NOT_AVAILABLE = 0; |
|
|
|
|
CONST TOOL_PUBLIC = 1; |
|
|
|
|
CONST TOOL_PRIVATE = 2; |
|
|
|
|
/** |
|
|
|
|
* Constants for the available group tools |
|
|
|
|
*/ |
|
|
|
|
CONST GROUP_TOOL_FORUM = 0; |
|
|
|
|
CONST GROUP_TOOL_DOCUMENTS = 1; |
|
|
|
|
CONST GROUP_TOOL_CALENDAR = 2; |
|
|
|
|
CONST GROUP_TOOL_ANNOUNCEMENT = 3; |
|
|
|
|
CONST GROUP_TOOL_WORK = 4; |
|
|
|
|
CONST GROUP_TOOL_WIKI = 5; |
|
|
|
|
CONST GROUP_TOOL_CHAT = 6; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//GROUP FUNCTIONS |
|
|
|
@ -183,7 +175,7 @@ class GroupManager { |
|
|
|
|
$groups = array (); |
|
|
|
|
$thisGroup= array(); |
|
|
|
|
while ($thisGroup = Database::fetch_array($groupList)) { |
|
|
|
|
if ($thisGroup['category_id'] == VIRTUAL_COURSE_CATEGORY) { |
|
|
|
|
if ($thisGroup['category_id'] == self::VIRTUAL_COURSE_CATEGORY) { |
|
|
|
|
$sql = "SELECT title FROM $table_course WHERE code = '".$thisGroup['name']."'"; |
|
|
|
|
$obj = Database::fetch_object(Database::query($sql)); |
|
|
|
|
$thisGroup['name'] = $obj->title; |
|
|
|
@ -298,7 +290,7 @@ class GroupManager { |
|
|
|
|
public static function create_subgroups ($group_id, $number_of_groups) { |
|
|
|
|
$course_id = api_get_course_int_id(); |
|
|
|
|
$table_group = Database :: get_course_table(TABLE_GROUP); |
|
|
|
|
$category_id = self :: create_category('Subgroups', '', TOOL_PRIVATE, TOOL_PRIVATE, 0, 0, 1, 1); |
|
|
|
|
$category_id = self :: create_category('Subgroups', '', GroupManager::TOOL_PRIVATE, GroupManager::TOOL_PRIVATE, 0, 0, 1, 1); |
|
|
|
|
$users = self :: get_users($group_id); |
|
|
|
|
$group_ids = array (); |
|
|
|
|
|
|
|
|
@ -320,12 +312,12 @@ class GroupManager { |
|
|
|
|
* Create groups from all virtual courses in the given course. |
|
|
|
|
*/ |
|
|
|
|
public static function create_groups_from_virtual_courses() { |
|
|
|
|
self :: delete_category(VIRTUAL_COURSE_CATEGORY); |
|
|
|
|
$id = self :: create_category(get_lang('GroupsFromVirtualCourses'), '', TOOL_NOT_AVAILABLE, TOOL_NOT_AVAILABLE, 0, 0, 1, 1); |
|
|
|
|
self :: delete_category(self::VIRTUAL_COURSE_CATEGORY); |
|
|
|
|
$id = self :: create_category(get_lang('GroupsFromVirtualCourses'), '', GroupManager::TOOL_NOT_AVAILABLE, GroupManager::TOOL_NOT_AVAILABLE, 0, 0, 1, 1); |
|
|
|
|
$table_group_cat = Database :: get_course_table(TABLE_GROUP_CATEGORY); |
|
|
|
|
$course_id = api_get_course_int_id(); |
|
|
|
|
|
|
|
|
|
$sql = "UPDATE ".$table_group_cat." SET id=".VIRTUAL_COURSE_CATEGORY." WHERE c_id = $course_id AND id=$id"; |
|
|
|
|
$sql = "UPDATE ".$table_group_cat." SET id=".self::VIRTUAL_COURSE_CATEGORY." WHERE c_id = $course_id AND id=$id"; |
|
|
|
|
Database::query($sql); |
|
|
|
|
$course = api_get_course_info(); |
|
|
|
|
$course['code'] = $course['sysCode']; |
|
|
|
@ -342,7 +334,7 @@ class GroupManager { |
|
|
|
|
$members[] = $user['user_id']; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
$id = self :: create_group($group_course['code'], VIRTUAL_COURSE_CATEGORY, 0, count($members)); |
|
|
|
|
$id = self :: create_group($group_course['code'], self::VIRTUAL_COURSE_CATEGORY, 0, count($members)); |
|
|
|
|
self :: subscribe_users($members, $id); |
|
|
|
|
$ids[] = $id; |
|
|
|
|
} |
|
|
|
@ -678,7 +670,7 @@ class GroupManager { |
|
|
|
|
max_student = '".Database::escape_string($maximum_number_of_students)."' "; |
|
|
|
|
Database::query($sql); |
|
|
|
|
$id = Database::insert_id(); |
|
|
|
|
if ($id == VIRTUAL_COURSE_CATEGORY) { |
|
|
|
|
if ($id == self::VIRTUAL_COURSE_CATEGORY) { |
|
|
|
|
$sql = "UPDATE ".$table_group_category." SET id = ". ($id +1)." WHERE c_id = $course_id AND id = $id"; |
|
|
|
|
Database::query($sql); |
|
|
|
|
return $id +1; |
|
|
|
@ -858,8 +850,10 @@ class GroupManager { |
|
|
|
|
* @return void |
|
|
|
|
*/ |
|
|
|
|
public static function fill_groups ($group_ids) { |
|
|
|
|
global $_course; |
|
|
|
|
|
|
|
|
|
$group_ids = is_array($group_ids) ? $group_ids : array ($group_ids); |
|
|
|
|
$group_ids = array_map('intval',$group_ids); |
|
|
|
|
$group_ids = array_map('intval', $group_ids); |
|
|
|
|
|
|
|
|
|
if (api_is_course_coach()) { |
|
|
|
|
for ($i=0 ; $i< count($group_ids) ; $i++) { |
|
|
|
@ -873,7 +867,6 @@ class GroupManager { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
global $_course; |
|
|
|
|
$category = self::get_category_from_group($group_ids[0]); |
|
|
|
|
|
|
|
|
|
$groups_per_user = $category['groups_per_user']; |
|
|
|
@ -882,7 +875,7 @@ class GroupManager { |
|
|
|
|
$session_id = api_get_session_id(); |
|
|
|
|
|
|
|
|
|
$complete_user_list = CourseManager :: get_real_and_linked_user_list($_course['code'], true, $session_id); |
|
|
|
|
$number_groups_per_user = ($groups_per_user == GROUP_PER_MEMBER_NO_LIMIT ? INFINITE : $groups_per_user); |
|
|
|
|
$number_groups_per_user = ($groups_per_user == self::GROUP_PER_MEMBER_NO_LIMIT ? self::INFINITE : $groups_per_user); |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
* Retrieve all the groups where enrollment is still allowed |
|
|
|
@ -890,16 +883,14 @@ class GroupManager { |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
$course_id = api_get_course_int_id(); |
|
|
|
|
|
|
|
|
|
$sql = "SELECT g.id gid, g.max_student-count(ug.user_id) nbPlaces, g.max_student |
|
|
|
|
FROM ".$group_table." g |
|
|
|
|
LEFT JOIN ".$group_user_table." ug |
|
|
|
|
ON g.id = ug.group_id |
|
|
|
|
LEFT JOIN ".$group_user_table." ug ON |
|
|
|
|
g.c_id = $course_id AND ug.c_id = $course_id AND g.id = ug.group_id |
|
|
|
|
WHERE |
|
|
|
|
g.c_id = $course_id AND |
|
|
|
|
g.id IN (".implode(',', $group_ids).") |
|
|
|
|
GROUP BY (g.id) |
|
|
|
|
HAVING (nbPlaces > 0 OR g.max_student = ".MEMBER_PER_GROUP_NO_LIMIT.") |
|
|
|
|
HAVING (nbPlaces > 0 OR g.max_student = ".GroupManager::MEMBER_PER_GROUP_NO_LIMIT.") |
|
|
|
|
ORDER BY nbPlaces DESC"; |
|
|
|
|
$sql_result = Database::query($sql); |
|
|
|
|
$group_available_place = array (); |
|
|
|
@ -986,7 +977,7 @@ class GroupManager { |
|
|
|
|
$db_result = Database::query("SELECT max_student FROM $table_group WHERE c_id = $course_id AND id = $group_id"); |
|
|
|
|
$db_object = Database::fetch_object($db_result); |
|
|
|
|
if ($db_object->max_student == 0) { |
|
|
|
|
return INFINITE; |
|
|
|
|
return self::INFINITE; |
|
|
|
|
} |
|
|
|
|
return $db_object->max_student; |
|
|
|
|
} |
|
|
|
@ -1082,8 +1073,8 @@ class GroupManager { |
|
|
|
|
$result = CourseManager :: is_user_subscribed_in_real_or_linked_course($user_id, $course_code); |
|
|
|
|
$result = !self :: is_subscribed($user_id, $group_id); |
|
|
|
|
$result &= (self :: number_of_students($group_id) < self :: maximum_number_of_students($group_id)); |
|
|
|
|
if ($category['groups_per_user'] == GROUP_PER_MEMBER_NO_LIMIT) { |
|
|
|
|
$category['groups_per_user'] = INFINITE; |
|
|
|
|
if ($category['groups_per_user'] == self::GROUP_PER_MEMBER_NO_LIMIT) { |
|
|
|
|
$category['groups_per_user'] = self::INFINITE; |
|
|
|
|
} |
|
|
|
|
$result &= (self :: user_in_number_of_groups($user_id, $category['id']) < $category['groups_per_user']); |
|
|
|
|
$result &= !self :: is_tutor_of_group($user_id, $group_id); |
|
|
|
@ -1421,7 +1412,7 @@ class GroupManager { |
|
|
|
|
public static function get_complete_list_of_users_that_can_be_added_to_group ($course_code, $group_id) { |
|
|
|
|
global $_course, $_user; |
|
|
|
|
$category = self :: get_category_from_group($group_id, $course_code); |
|
|
|
|
$number_of_groups_limit = $category['groups_per_user'] == GROUP_PER_MEMBER_NO_LIMIT ? INFINITE : $category['groups_per_user']; |
|
|
|
|
$number_of_groups_limit = $category['groups_per_user'] == self::GROUP_PER_MEMBER_NO_LIMIT ? self::INFINITE : $category['groups_per_user']; |
|
|
|
|
$real_course_code = $_course['sysCode']; |
|
|
|
|
$real_course_info = Database :: get_course_info($real_course_code); |
|
|
|
|
$real_course_user_list = CourseManager :: get_user_list_from_course_code($real_course_code); |
|
|
|
@ -1545,25 +1536,25 @@ class GroupManager { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch ($tool) { |
|
|
|
|
case GROUP_TOOL_FORUM : |
|
|
|
|
case self::GROUP_TOOL_FORUM : |
|
|
|
|
$state_key = 'forum_state'; |
|
|
|
|
break; |
|
|
|
|
case GROUP_TOOL_DOCUMENTS : |
|
|
|
|
case self::GROUP_TOOL_DOCUMENTS : |
|
|
|
|
$state_key = 'doc_state'; |
|
|
|
|
break; |
|
|
|
|
case GROUP_TOOL_CALENDAR : |
|
|
|
|
case self::GROUP_TOOL_CALENDAR : |
|
|
|
|
$state_key = 'calendar_state'; |
|
|
|
|
break; |
|
|
|
|
case GROUP_TOOL_ANNOUNCEMENT : |
|
|
|
|
case self::GROUP_TOOL_ANNOUNCEMENT : |
|
|
|
|
$state_key = 'announcements_state'; |
|
|
|
|
break; |
|
|
|
|
case GROUP_TOOL_WORK : |
|
|
|
|
case self::GROUP_TOOL_WORK : |
|
|
|
|
$state_key = 'work_state'; |
|
|
|
|
break; |
|
|
|
|
case GROUP_TOOL_WIKI : |
|
|
|
|
case self::GROUP_TOOL_WIKI : |
|
|
|
|
$state_key = 'wiki_state'; |
|
|
|
|
break; |
|
|
|
|
case GROUP_TOOL_CHAT : |
|
|
|
|
case self::GROUP_TOOL_CHAT : |
|
|
|
|
$state_key = 'chat_state'; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
@ -1580,24 +1571,24 @@ class GroupManager { |
|
|
|
|
|
|
|
|
|
if (!empty($category_group_info)) { |
|
|
|
|
//if exists check the category group status first |
|
|
|
|
if ($category_group_info[$state_key] == TOOL_NOT_AVAILABLE) { |
|
|
|
|
if ($category_group_info[$state_key] == GroupManager::TOOL_NOT_AVAILABLE) { |
|
|
|
|
return false; |
|
|
|
|
} elseif($category_group_info[$state_key] == TOOL_PRIVATE && !$user_is_in_group) { |
|
|
|
|
} elseif($category_group_info[$state_key] == GroupManager::TOOL_PRIVATE && !$user_is_in_group) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//is_user_in_group() is more complete that the is_subscribed() function |
|
|
|
|
|
|
|
|
|
if ($group_info[$state_key] == TOOL_NOT_AVAILABLE) { |
|
|
|
|
if ($group_info[$state_key] == GroupManager::TOOL_NOT_AVAILABLE) { |
|
|
|
|
return false; |
|
|
|
|
} elseif ($group_info[$state_key] == TOOL_PUBLIC) { |
|
|
|
|
} elseif ($group_info[$state_key] == self::TOOL_PUBLIC) { |
|
|
|
|
return true; |
|
|
|
|
} elseif (api_is_allowed_to_edit(false,true)) { |
|
|
|
|
return true; |
|
|
|
|
} elseif($group_info['tutor_id'] == $user_id) { //this tutor implementation was dropped |
|
|
|
|
return true; |
|
|
|
|
} elseif($group_info[$state_key] == TOOL_PRIVATE && !$user_is_in_group) { |
|
|
|
|
} elseif($group_info[$state_key] == GroupManager::TOOL_PRIVATE && !$user_is_in_group) { |
|
|
|
|
return false; |
|
|
|
|
} else { |
|
|
|
|
return $user_is_in_group; |
|
|
|
@ -1657,7 +1648,7 @@ class GroupManager { |
|
|
|
|
$group_user_table = Database :: get_course_table(TABLE_GROUP_USER); |
|
|
|
|
$session_id = api_get_session_id(); |
|
|
|
|
$complete_user_list = CourseManager :: get_real_and_linked_user_list($_course['sysCode'], true, $session_id); |
|
|
|
|
$number_groups_per_user = ($groups_per_user == GROUP_PER_MEMBER_NO_LIMIT ? INFINITE : $groups_per_user); |
|
|
|
|
$number_groups_per_user = ($groups_per_user == self::GROUP_PER_MEMBER_NO_LIMIT ? self::INFINITE : $groups_per_user); |
|
|
|
|
$course_id = api_get_course_int_id(); |
|
|
|
|
/* |
|
|
|
|
* Retrieve all the groups where enrollment is still allowed |
|
|
|
@ -1671,7 +1662,7 @@ class GroupManager { |
|
|
|
|
ug.c_id = $course_id AND |
|
|
|
|
g.id IN (".implode(',', $group_ids).") |
|
|
|
|
GROUP BY (g.id) |
|
|
|
|
HAVING (nbPlaces > 0 OR g.max_student = ".MEMBER_PER_GROUP_NO_LIMIT.") |
|
|
|
|
HAVING (nbPlaces > 0 OR g.max_student = ".GroupManager::MEMBER_PER_GROUP_NO_LIMIT.") |
|
|
|
|
ORDER BY nbPlaces DESC"; |
|
|
|
|
$sql_result = Database::query($sql); |
|
|
|
|
$group_available_place = array (); |
|
|
|
@ -1693,7 +1684,7 @@ class GroupManager { |
|
|
|
|
//first sort by user_id to filter out duplicates |
|
|
|
|
$complete_user_list = TableSort :: sort_table($complete_user_list, 'user_id'); |
|
|
|
|
$complete_user_list = self :: filter_duplicates($complete_user_list, 'user_id'); |
|
|
|
|
// $complete_user_list = self :: filter_only_students($complete_user_list); // #5526 |
|
|
|
|
$complete_user_list = self :: filter_only_students($complete_user_list); |
|
|
|
|
//now sort by # of group left |
|
|
|
|
$complete_user_list = TableSort :: sort_table($complete_user_list, 'number_groups_left', SORT_DESC); |
|
|
|
|
return $complete_user_list; |
|
|
|
|