Sending my changes of this see #5544 r ea080a27a871

skala
Julio Montoya 13 years ago
parent f093bfde20
commit d520ea28e6
  1. 145
      main/inc/lib/groupmanager.lib.php

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

Loading…
Cancel
Save