Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions public/main/admin/usergroups.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
.' <a href="add_users_to_usergroup.php?id=\'+options.rowId+\'">'.Display::getMdiIcon(ObjectIcon::USER, 'ch-tool-icon', null, ICON_SIZE_MEDIUM, get_lang('Subscribe users to class')).'</a>'
.' <a href="add_courses_to_usergroup.php?id=\'+options.rowId+\'">'.Display::getMdiIcon(ObjectIcon::COURSE, 'ch-tool-icon', null, ICON_SIZE_MEDIUM, get_lang('Subscribe class to courses')).'</a>'
.' <a href="add_sessions_to_usergroup.php?id=\'+options.rowId+\'">'.Display::getMdiIcon(ObjectIcon::SESSION, 'ch-tool-icon', null, ICON_SIZE_MEDIUM, get_lang('Subscribe class to sessions')).'</a>'
.' <a href="/main/admin/classes/\'+options.rowId+\'/overview">'.Display::getMdiIcon(ObjectIcon::USER_LIST, 'ch-tool-icon', null, ICON_SIZE_MEDIUM, get_lang('Overview students and courses subscribed to the class')).'</a>'
.' <a href="?action=edit&id=\'+options.rowId+\'">'.Display::getMdiIcon(ActionIcon::EDIT, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Edit')).'</a>'
.' <a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("Please confirm your choice"), ENT_QUOTES))."\'".')) return false;" href="?action=delete&id=\'+options.rowId+\'">'.Display::getMdiIcon(ActionIcon::DELETE, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Delete')).'</a>\';
}';
Expand Down
36 changes: 27 additions & 9 deletions public/main/inc/ajax/model.ajax.php
Original file line number Diff line number Diff line change
Expand Up @@ -2585,13 +2585,24 @@ function getWhereClause($col, $oper, $val)
$course_id,
api_get_session_id()
)) {
$url = 'class.php?action=remove_class_from_course&id='.$group['id'].'&'.api_get_cidreq(
).'&id_session='.api_get_session_id();
$icon = Display::getMdiIcon(ActionIcon::DELETE, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Remove'));
$actions = [
[
'icon' => Display::getMdiIcon(ObjectIcon::USER_LIST, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Overview students subscribed to the class')),
'url' => 'overview?usergroup='.$group['id'].'&course='.$course_id,
],
[
'icon' => Display::getMdiIcon(ActionIcon::DELETE, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Remove')),
'url' => 'class.php?action=remove_class_from_course&id=' . $group['id'] . '&' . api_get_cidreq() . '&id_session=' . api_get_session_id(),
'onclick' => "if (!confirm('". get_lang('Are you sure you want to remove the class') . "')) return false;"
],
];
} else {
$url = 'class.php?action=add_class_to_course&id='.$group['id'].'&'.api_get_cidreq(
).'&type=not_registered';
$icon = Display::getMdiIcon(ActionIcon::ADD, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Add'));
$actions = [
[
'icon' => Display::getMdiIcon(ActionIcon::ADD, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Add')),
'url' => 'class.php?action=add_class_to_course&id=' . $group['id'] . '&' . api_get_cidreq() . '&type=not_registered',
]
];
}

switch ($group['group_type']) {
Expand All @@ -2611,10 +2622,17 @@ function getWhereClause($col, $oper, $val)
if ($obj->allowTeachers() && $group['author_id'] == $currentUserId) {
$group['actions'] .= Display::url(
Display::getMdiIcon(ToolIcon::TRACKING, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Statistics')),
$urlUserGroup.'&id='.$group['id']
).'&nbsp;';
$urlUserGroup . '&id=' . $group['id']
) . '&nbsp;';
}

for ($i = 0; $i < count($actions); $i++) {
$group['actions'] .= Display::url(
$actions[$i]['icon'],
$actions[$i]['url'] ?? null,
['onclick' => $actions[$i]['onclick'] ?? '']
);
}
$group['actions'] .= Display::url($icon, $url);
}
$new_result[] = $group;
}
Expand Down
145 changes: 132 additions & 13 deletions public/main/inc/lib/usergroup.lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
use Chamilo\CoreBundle\Enums\ObjectIcon;
use Chamilo\CoreBundle\Enums\ToolIcon;
use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CoreBundle\Service\StandardizationService;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Polyfill\Intl\Normalizer\Normalizer;


/**
* Class UserGroup.
Expand Down Expand Up @@ -1209,6 +1212,36 @@ public function unsubscribe_courses_from_usergroup($usergroup_id, $delete_items,
}
}

public function unsubscribe_only_courses_from_usergroup($usergroup_id, $delete_items, $sessionId = 0)
{
$sessionId = (int) $sessionId;
// Deleting items.
if (!empty($delete_items)) {
$user_list = $this->get_users_by_usergroup($usergroup_id);

$groupId = isset($_GET['id']) ? (int) $_GET['id'] : 0;
foreach ($delete_items as $course_id) {
$course_info = api_get_course_info_by_id($course_id);
if ($course_info) {
Database::delete(
$this->usergroup_rel_course_table,
[
'usergroup_id = ? AND course_id = ?' => [
$usergroup_id,
$course_id,
],
]
);
}
if (0 != $sessionId && 0 != $groupId) {
$this->subscribe_sessions_to_usergroup($groupId, [0]);
} else {
$s = $sessionId;
}
}
}
}

/**
* Subscribe users to a group.
*
Expand Down Expand Up @@ -1799,7 +1832,7 @@ public function getUserListByUserGroup($id, $orderBy = '')
INNER JOIN $this->usergroup_rel_user_table c
ON c.user_id = u.id
WHERE u.active <> ".USER_SOFT_DELETED." AND c.usergroup_id = $id"
;
;
if (!empty($orderBy)) {
$orderBy = Database::escape_string($orderBy);
$sql .= " ORDER BY $orderBy ";
Expand Down Expand Up @@ -1838,7 +1871,7 @@ public function setForm($form, $type = 'add', Usergroup $userGroup = null)
true,
false,
[
'ToolbarSet' => 'Minimal',
'ToolbarSet' => 'Minimal',
]
);
$form->applyFilter('description', 'trim');
Expand Down Expand Up @@ -2587,7 +2620,7 @@ public function show_group_column_information($group_id, $user_id, $show = '')
// I'm just a reader
$relation_group_title = get_lang('I am a reader');
$links .= '<li class="'.('invite_friends' == $show ? 'active' : '').'"><a href="group_invitation.php?id='.$group_id.'">'.
Display::getMdiIcon(ObjectIcon::INVITATION, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Invite friends')).get_lang('Invite friends').'</a></li>';
Display::getMdiIcon(ObjectIcon::INVITATION, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Invite friends')).get_lang('Invite friends').'</a></li>';
if (self::canLeave($group_info)) {
$links .= '<li><a href="group_view.php?id='.$group_id.'&action=leave&u='.api_get_user_id().'">'.
Display::getMdiIcon(ActionIcon::EXIT, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Leave group')).get_lang('Leave group').'</a></li>';
Expand All @@ -2596,11 +2629,11 @@ public function show_group_column_information($group_id, $user_id, $show = '')
case GROUP_USER_PERMISSION_ADMIN:
$relation_group_title = get_lang('I am an admin');
$links .= '<li class="'.('group_edit' == $show ? 'active' : '').'"><a href="group_edit.php?id='.$group_id.'">'.
Display::getMdiIcon(ActionIcon::EDIT, 'ch-tool-icon', null, ICON_SIZE_MEDIUM, get_lang('Edit this group')).get_lang('Edit this group').'</a></li>';
Display::getMdiIcon(ActionIcon::EDIT, 'ch-tool-icon', null, ICON_SIZE_MEDIUM, get_lang('Edit this group')).get_lang('Edit this group').'</a></li>';
$links .= '<li class="'.('member_list' == $show ? 'active' : '').'"><a href="group_waiting_list.php?id='.$group_id.'">'.
Display::getMdiIcon(ObjectIcon::WAITING_LIST, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Waiting list')).get_lang('Waiting list').'</a></li>';
Display::getMdiIcon(ObjectIcon::WAITING_LIST, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Waiting list')).get_lang('Waiting list').'</a></li>';
$links .= '<li class="'.('invite_friends' == $show ? 'active' : '').'"><a href="group_invitation.php?id='.$group_id.'">'.
Display::getMdiIcon(ObjectIcon::INVITATION, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Invite friends')).get_lang('Invite friends').'</a></li>';
Display::getMdiIcon(ObjectIcon::INVITATION, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Invite friends')).get_lang('Invite friends').'</a></li>';
if (self::canLeave($group_info)) {
$links .= '<li><a href="group_view.php?id='.$group_id.'&action=leave&u='.api_get_user_id().'">'.
Display::getMdiIcon(ActionIcon::EXIT, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Leave group')).get_lang('Leave group').'</a></li>';
Expand All @@ -2619,10 +2652,10 @@ public function show_group_column_information($group_id, $user_id, $show = '')
//$links .= '<li><a href="group_members.php?id='.$group_id.'">'. Display::getMdiIcon(ObjectIcon::GROUP, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Members list')).'<span class="'.($show=='member_list'?'social-menu-text-active':'social-menu-text4').'" >'.get_lang('Members list').'</span></a></li>';
if (GROUP_PERMISSION_CLOSED == $group_info['visibility']) {
$links .= '<li><a href="group_waiting_list.php?id='.$group_id.'">'.
Display::getMdiIcon(ObjectIcon::WAITING_LIST, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Waiting list')).get_lang('Waiting list').'</a></li>';
Display::getMdiIcon(ObjectIcon::WAITING_LIST, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Waiting list')).get_lang('Waiting list').'</a></li>';
}
$links .= '<li><a href="group_invitation.php?id='.$group_id.'">'.
Display::getMdiIcon(ObjectIcon::INVITATION, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Invite friends')).get_lang('Invite friends').'</a></li>';
Display::getMdiIcon(ObjectIcon::INVITATION, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Invite friends')).get_lang('Invite friends').'</a></li>';
if (self::canLeave($group_info)) {
$links .= '<li><a href="group_view.php?id='.$group_id.'&action=leave&u='.api_get_user_id().'">'.
Display::getMdiIcon(ActionIcon::EXIT, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Leave group')).get_lang('Leave group').'</a></li>';
Expand All @@ -2631,15 +2664,15 @@ public function show_group_column_information($group_id, $user_id, $show = '')
case GROUP_USER_PERMISSION_HRM:
$relation_group_title = get_lang('I am a human resources manager');
$links .= '<li><a href="'.api_get_path(WEB_CODE_PATH).'social/message_for_group_form.inc.php?view_panel=1&height=400&width=610&&user_friend='.api_get_user_id().'&group_id='.$group_id.'&action=add_message_group" class="ajax" title="'.get_lang('Compose message').'" data-size="lg" data-title="'.get_lang('Compose message').'">'.
Display::getMdiIcon(ActionIcon::EDIT, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Create thread')).get_lang('Create thread').'</a></li>';
Display::getMdiIcon(ActionIcon::EDIT, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Create thread')).get_lang('Create thread').'</a></li>';
$links .= '<li><a href="group_view.php?id='.$group_id.'">'.
Display::getMdiIcon(ToolIcon::MESSAGE, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Messages list')).get_lang('Messages list').'</a></li>';
Display::getMdiIcon(ToolIcon::MESSAGE, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Messages list')).get_lang('Messages list').'</a></li>';
$links .= '<li><a href="group_invitation.php?id='.$group_id.'">'.
Display::getMdiIcon(ObjectIcon::INVITATION, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Invite friends')).get_lang('Invite friends').'</a></li>';
Display::getMdiIcon(ObjectIcon::INVITATION, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Invite friends')).get_lang('Invite friends').'</a></li>';
$links .= '<li><a href="group_members.php?id='.$group_id.'">'.
Display::getMdiIcon(ObjectIcon::GROUP, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Members list')).get_lang('Members list').'</a></li>';
Display::getMdiIcon(ObjectIcon::GROUP, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Members list')).get_lang('Members list').'</a></li>';
$links .= '<li><a href="group_view.php?id='.$group_id.'&action=leave&u='.api_get_user_id().'">'.
Display::getMdiIcon(ActionIcon::EXIT, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Leave group')).get_lang('Leave group').'</a></li>';
Display::getMdiIcon(ActionIcon::EXIT, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Leave group')).get_lang('Leave group').'</a></li>';
break;
default:
//$links .= '<li><a href="groups.php?id='.$group_id.'&action=join&u='.api_get_user_id().'">'.Display::return_icon('addd.gif', get_lang('Join group'), array('hspace'=>'6')).'<span class="social-menu-text4" >'.get_lang('Join group').'</a></span></li>';
Expand Down Expand Up @@ -3085,6 +3118,92 @@ public function getGroupsByLpCategory($categoryId, $courseId, $sessionId)
return Database::store_result($result, 'ASSOC');
}

public function getUsersInAndOutOfCourse($usergroupId, $courseId): array
{
$usergroupModel = new UserGroupModel();

$usersInUsergroup = $usergroupModel->get_users_by_usergroup($usergroupId);

$data = [];
$data['error'] = null;
$data['warning'] = null;
$data['usersSubscribedToCourse'] = [];
$data['usersNotSubscribedToCourse'] = [];

if (sizeof($usersInUsergroup) > 0) {

$userManager = new UserManager();
$userRepository = $userManager->getRepository();

$courseManager = new CourseManager();
$usersInCourse = $courseManager->get_user_list_from_course_code($courseId);

$usersSubscribedToCourse = [];
$usersNotSubscribedToCourse = [];
foreach ($usersInUsergroup as $userId) {
$user = $userRepository->find($userId);
if (array_key_exists($userId, $usersInCourse)) {
$usersSubscribedToCourse[] = $user;
} else {
$usersNotSubscribedToCourse[] = $user;
}
}

$data['usersSubscribedToCourse'] = StandardizationService::sortByNameByCountryAndStandardizeName($usersSubscribedToCourse, true);
$data['usersNotSubscribedToCourse'] = StandardizationService::sortByNameByCountryAndStandardizeName($usersNotSubscribedToCourse, true);;
} else {
$data['warning'] = get_lang('No user is subscribed to this class');
}

return $data;
}

public function getUsersAndCoursesSubscribedToAUserGroup($usergroupId):array
{
$data = [];
$data['error'] = null;
$data['warning'] = null;
$data['usersSubscribedToUsergroup'] = [];
$data['coursesSubscribedToUsergroup'] = [];

$usergroupLib = new UserGroupModel();

$userManager = new UserManager();
$userRepository = $userManager->getRepository();
$usersSubscribedToUsergroupIds = $usergroupLib->get_users_by_usergroup($usergroupId);
if (count($usersSubscribedToUsergroupIds) > 0) {
$usersSubscribedToUsergroup = [];
foreach ($usersSubscribedToUsergroupIds as $userId) {
$usersSubscribedToUsergroup[] = $userRepository->find($userId);
}
$data['usersSubscribedToUsergroup'] = StandardizationService::sortByNameByCountryAndStandardizeName($usersSubscribedToUsergroup, true);
}

$courseManager = new CourseManager();
$coursesSubscribedToUsergroupIds = $usergroupLib->get_courses_by_usergroup($usergroupId);
if (count($coursesSubscribedToUsergroupIds) > 0) {
$coursesSubscribedToUsergroup = [];
foreach ($coursesSubscribedToUsergroupIds as $courseId) {
$coursesSubscribedToUsergroup[] = [
'code' => $courseManager->get_course_code_from_course_id($courseId),
'name' => $courseManager->getCourseNameFromCode($courseManager->get_course_code_from_course_id($courseId)),
];
}
$data['coursesSubscribedToUsergroup'] = StandardizationService::sort($coursesSubscribedToUsergroup);
}

if (count($usersSubscribedToUsergroupIds) + count($coursesSubscribedToUsergroupIds) == 0) {
$data['warning'] = get_lang('No user and no course are subscribed to this class');
} else if (count($usersSubscribedToUsergroupIds) == 0) {
$data['warning'] = get_lang('No user are subscribed to this class');
} else if (count($coursesSubscribedToUsergroupIds) == 0) {
$data['warning'] = get_lang('No course are subscribed to this class');
}

return $data;
}


public static function getRoleName($relation)
{
switch ((int) $relation) {
Expand Down
30 changes: 30 additions & 0 deletions src/CoreBundle/Controller/ClassController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

declare(strict_types=1);

namespace Chamilo\CoreBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use UserGroupModel;

class ClassController extends AbstractController
{
#[Route('/main/admin/classes/{id}/overview', name: 'class_overview')]
public function overview(int $id): Response
{
$usergroupLib = new UserGroupModel();
$usergroup = $usergroupLib->get($id);

$data = $usergroupLib->getUsersAndCoursesSubscribedToAUserGroup($id);

return $this->render('@ChamiloCore/Class/overview.html.twig', [
'usergroupName' => $usergroup['title'],
'usersSubscribedToUsergroup' => $data['usersSubscribedToUsergroup'],
'coursesSubscribedToUsergroup' => $data['coursesSubscribedToUsergroup'],
'warning' => $data['warning'],
'error' => $data['error'],
]);
}
}
Loading
Loading