Merge branch 'master' of github.com:chamilo/chamilo-lms

pull/2715/head
Angel Fernando Quiroz Campos 7 years ago
commit 91ef374830
  1. 312
      assets/css/base.css
  2. 46
      assets/css/scss/_base.scss
  3. 6
      config/packages/graphql.yaml
  4. 96
      main/announcements/announcements.php
  5. 2
      main/badge/assign.php
  6. 2
      main/badge/issued.php
  7. 5
      main/course_info/about.php
  8. 32
      main/course_info/infocours.php
  9. 25
      main/cron/import_csv.php
  10. 2
      main/exercise/overview.php
  11. 155
      main/inc/ajax/announcement.ajax.php
  12. 4
      main/inc/ajax/model.ajax.php
  13. 2
      main/inc/ajax/skill.ajax.php
  14. 93
      main/inc/lib/AnnouncementManager.php
  15. 4
      main/inc/lib/course.lib.php
  16. 2
      main/inc/lib/message.lib.php
  17. 195
      main/inc/lib/sessionmanager.lib.php
  18. 9
      main/inc/lib/social.lib.php
  19. 86
      main/session/add_users_to_session.php
  20. 8
      main/session/resume_session.php
  21. 2
      main/social/personal_data.php
  22. 4
      main/survey/ch_multipleresponse.php
  23. 73
      main/template/default/course_home/activity.html.twig
  24. 9
      main/template/default/course_progress/progress.html.twig
  25. 34
      main/tracking/messages.php
  26. 2
      plugin/ims_lti/add.php
  27. 55
      src/ApiBundle/GraphQL/Map/QueryMap.php
  28. 36
      src/ApiBundle/GraphQL/Resolver/CourseResolver.php
  29. 56
      src/ApiBundle/GraphQL/Resolver/UserResolver.php
  30. 2
      src/CoreBundle/Migrations/Schema/V200/Version20180927172830.php
  31. 1
      src/CourseBundle/ToolChain.php
  32. 28
      src/UserBundle/Entity/User.php

@ -1373,54 +1373,6 @@ a.unread {
text-align: right;
}
/* BIG TOOLS COURSE */
.title-tools {
font-weight: bold;
}
#course_tools .big_icon {
padding: 10px;
text-align: center;
}
#course_tools .content {
text-align: center;
margin-bottom: 20px;
margin-top: 10px;
width: 100%;
height: 50px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
#course_tools .content:hover {
width: auto;
white-space: initial;
overflow: visible;
cursor: pointer;
}
.course-tool .make_visible_and_invisible img {
margin-top: -3px;
margin-right: 5px;
}
.big_icon img {
padding: 5px;
border-radius: 10px;
box-shadow: 0 4px 8px #C8C8C8;
border: 1px solid #e6e6e6;
}
.big_icon img:hover {
box-shadow: 0 4px 18px #C8C8C8;
}
.courseadminview .big_icon a {
font-size: 12px;
}
/* Fixes the administration block section */
.admin_section div {
margin: 5px 0 14px 25px;
@ -5960,271 +5912,7 @@ div#chat-remote-video video {
display: inline-block;
width: 100%;
}
/*
.grid-courses .items .course-student-info {
background-color: #d9edf7;
border: 1px solid #bce8f1;
padding: 5px;
border-radius: 5px;
}
.grid-courses .items .code-title {
font-size: 10px;
font-weight: bold;
padding-top: 8px;
color: #666;
}
.grid-courses .items {
vertical-align: top;
white-space: normal;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
text-align: left;
background-color: #fff;
border: 1px solid #DFDFDF;
border-radius: 5px;
margin: auto auto 20px;
}
.grid-courses .items.my-courses {
box-shadow: 2px 4px 15px 0 rgba(46, 61, 73, .1);
transition: box-shadow .3s ease, border .3s ease;
}
.grid-courses .items.my-courses .course-student-info {
font-size: 10px;
text-align: center;
background: none;
border: none;
padding: 0;
}
.grid-courses .items.my-courses .title {
font-size: 14px;
}
.grid-courses .items.items-courses {
padding-bottom: 10px;
box-shadow: 2px 4px 15px 0 rgba(46, 61, 73, .1);
transition: box-shadow .3s ease, border .3s ease;
}
.grid-courses .items.items-sessions {
}
.grid-courses .items.items-courses:hover,
.grid-courses .items.my-courses:hover,
.grid-courses .items.items-hotcourse:hover {
box-shadow: 4px 5px 20px 0 rgba(46, 61, 73, .15);
transition: box-shadow .3s ease, border .3s ease;
}
.grid-courses .items.items-hotcourse {
box-shadow: 2px 4px 15px 0 rgba(46, 61, 73, .1);
transition: box-shadow .3s ease, border .3s ease;
}
.grid-courses .items .block-title {
margin: 10px 0;
}
.grid-courses .items .title {
line-height: 1.4;
padding: 0;
font-weight: bold;
margin: 0;
font-size: 14px;
}
.grid-courses .items .toolbar > div {
text-align: center;
}
.grid-courses .items .image .black-shadow {
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
box-sizing: border-box;
position: absolute;
background: rgba(0, 0, 0, 0.7) none repeat scroll 0 0;
padding: 40px 10px 10px;
}
.grid-courses .items .image .hovered-course {
opacity: 1;
transition: all 0.3s ease 0s;
}
.grid-courses .items .toolbar .info {
float: left;
font-size: 12px;
}
.grid-courses .session-date,
.grid-courses .session-info {
font-size: 12px;
padding: 5px 10px;
}
.grid-courses .items .block-info {
font-size: 12px;
}
.grid-courses .items .block-date {
padding: 5px 0;
font-size: 11px;
line-height: 18px;
}
.grid-courses .items .block-info .list-inline {
margin: 0;
padding: 0;
}
.grid-courses .items .image {
position: relative;
}
.grid-courses .items .image .img-responsive {
min-width: 100%;
}
.grid-courses .items .image .pin {
position: absolute;
top: -10px;
right: -10px;
z-index: 2;
}
.grid-courses .items .ranking {
font-size: 10px;
margin: 0 0 10px;
}
.grid-courses .items .notifications {
text-align: center;
}
.grid-courses .items .admin-actions,
.grid-courses .items .user-actions {
position: absolute;
bottom: 0;
left: 0;
}
.grid-courses .items .admin-actions .btn-sm,
.grid-courses .items .user-actions .btn-sm {
border-radius: 0;
border: none;
}
.grid-courses .items .admin-actions .registered {
background-color: #17AA1C;
color: #FFF;
}
.grid-courses .items .category {
position: absolute;
bottom: 0;
right: -10px;
background-color: #fd6600;
color: #fff;
padding: 5px 10px;
font-size: 10px;
text-transform: uppercase;
z-index: 2;
font-weight: bold;
height: 32px;
line-height: 23px;
max-width: 80%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.grid-courses .items .cribbon {
width: 0;
height: 0;
border-top: 10px solid #333333;
border-right: 10px solid transparent;
position: absolute;
bottom: -10px;
right: -10px;
}
.grid-courses .items .description {
padding: 5px 10px 5px;
min-height: 125px;
}
.grid-courses .items .description .text {
font-size: 12px;
}
.grid-courses .items .author-card {
display: flex;
margin-top: 5px;
margin-left: 5px;
}
.grid-courses .items .author-card img {
border: 2px solid #fff;
}
.grid-courses .items .author-card .teachers-details {
display: flex;
flex-direction: column;
justify-content: center;
}
.grid-courses .items .author-card .teachers-details h5 {
font-size: 10px;
font-weight: bold;
margin: 0 10px;
}
.grid-courses .items .author-card .teachers-details h5 a {
color: #fff;
}
.grid-courses .items .block-author {
display: flex;
margin: 5px 0 5px;
}
.grid-courses .items .block-author img {
border: 2px solid #fff;
}
.grid-courses .items .block-author .teachers-details {
display: flex;
flex-direction: column;
justify-content: center;
}
.grid-courses .items .block-author .teachers-details p {
font-size: 10px;
margin: 0 10px 0 10px;
padding: 0;
}
.grid-courses .items .block-author .teachers-details h5 {
font-size: 10px;
font-weight: bold;
margin: 0 10px;
}
.grid-courses .items .block-author .teachers-details h5 a {
color: #666;
}
.grid-courses {
margin-top: 15px;
margin-bottom: 15px;
}
*/
.title-session,
.title-courses {
text-align: center;

@ -343,3 +343,49 @@ footer {
}
}
.course-accordion{
.card-header{
padding: 0;
background-color: $default-white;
.btn-link{
display: inline-block;
width: 100%;
}
}
.card-body{
.tools{
width: 160px;
height: 160px;
display: block;
float: left;
text-align: center;
cursor: pointer;
position: relative;
background-color: transparent;
.big_icon{
position: absolute;
width: 84px;
height: 84px;
top: 40%;
margin-top: -50px;
left: 40%;
margin-left: -32px;
text-align: center;
border: 1px solid rgba(0, 0, 0, 0.125) ;
border-radius: 50%;
a{
display: block;
padding-top: 10px;
overflow: hidden;
}
}
.content{
position: absolute;
bottom: 0;
left: 0;
width: 100%;
z-index: 999;
}
}
}
}

@ -25,15 +25,15 @@ parameters:
services:
chamilo_api.graphql.resolver.user:
class: Chamilo\ApiBundle\GraphQL\Resolver\UserResolver
arguments: [ '@service_container' ]
arguments: ['@service_container']
chamilo_api.graphql.resolver.course:
class: Chamilo\ApiBundle\GraphQL\Resolver\CourseResolver
arguments: [ '@service_container' ]
arguments: ['@service_container']
chamilo_api.graphql.resolver.session:
class: Chamilo\ApiBundle\GraphQL\Resolver\SessionResolver
arguments: [ '@service_container' ]
arguments: ['@service_container']
Chamilo\ApiBundle\GraphQL\Map\:
resource: "../../src/ApiBundle/GraphQL/Map/*"

@ -156,8 +156,8 @@ switch ($action) {
break;
case 'view':
$interbreadcrumb[] = [
"url" => api_get_path(WEB_CODE_PATH).'announcements/announcements.php?'.api_get_cidreq(),
"name" => $nameTools,
'url' => api_get_path(WEB_CODE_PATH).'announcements/announcements.php?'.api_get_cidreq(),
'name' => $nameTools,
];
$nameTools = get_lang('View');
@ -309,8 +309,16 @@ switch ($action) {
if ($sessionId != 0 && api_is_allowed_to_session_edit(false, true) == false) {
api_not_allowed();
}
$delete = false;
if (api_is_platform_admin()) {
$delete = true;
}
if (!api_is_session_general_coach() || api_is_element_in_the_session(TOOL_ANNOUNCEMENT, $id)) {
$delete = true;
}
if ($delete) {
AnnouncementManager::delete_announcement($_course, $id);
Display::addFlash(Display::return_message(get_lang('AnnouncementDeleted')));
}
@ -382,7 +390,7 @@ switch ($action) {
$url = api_get_self().'?action='.$action.'&id='.$id.'&'.api_get_cidreq();
$form = new FormValidator(
'f1',
'announcement',
'post',
$url,
null,
@ -472,9 +480,23 @@ switch ($action) {
$announcement_to_modify = '';
}
$announcementInfo = AnnouncementManager::get_by_id($courseId, $id);
if (isset($announcementInfo) && !empty($announcementInfo)) {
$to = AnnouncementManager::load_edit_users('announcement', $id);
$announcementInfo = [];
if (!empty($id)) {
$announcementInfo = AnnouncementManager::get_by_id($courseId, $id);
}
$showSubmitButton = true;
if (!empty($announcementInfo)) {
$to = AnnouncementManager::loadEditUsers('announcement', $id);
if (!empty($group_id)) {
$separated = CourseManager::separateUsersGroups($to);
if (isset($separated['groups']) && count($separated['groups']) > 1) {
$form->freeze();
Display::addFlash(Display::return_message(get_lang('LockByTeacher')));
$showSubmitButton = false;
}
}
$defaults = [
'title' => $announcementInfo['title'],
@ -489,10 +511,47 @@ switch ($action) {
}
}
$ajaxUrl = api_get_path(WEB_AJAX_PATH).'announcement.ajax.php?'.api_get_cidreq().'&a=preview';
$form->addHtml("
<script>
$(document).on('ready', function () {
$('#announcement_preview').on('click', function() {
var users = [];
$('#users_to option').each(function() {
users.push($(this).val());
});
var form = $('#announcement').serialize();
$.ajax({
type: 'POST',
dataType: 'json',
url: '".$ajaxUrl."',
data: {users : JSON.stringify(users), form: form},
beforeSend: function() {
$('#announcement_preview_result').html('<i class=\"fa fa-spinner\"></i>');
$('#send_button').hide();
},
success: function(result) {
var resultToString = '';
$.each(result, function(index, value) {
resultToString += '&nbsp;' + value;
});
$('#announcement_preview_result').html('' +
'".addslashes(get_lang('AnnouncementWillBeSentTo'))."<br/>' + resultToString
);
$('#announcement_preview_result').show();
$('#send_button').show();
}
});
});
});
</script>
");
if (isset($defaults['users'])) {
foreach ($defaults['users'] as $value) {
$parts = explode(':', $value);
if (!isset($parts[1]) || empty($parts[1])) {
continue;
}
@ -543,12 +602,29 @@ switch ($action) {
$config = api_get_configuration_value('announcement.hide_send_to_hrm_users');
if ($config === false) {
$form->addCheckBox('send_to_hrm_users', null, get_lang('SendAnnouncementCopyToDRH'));
$form->addCheckBox(
'send_to_hrm_users',
null,
get_lang('SendAnnouncementCopyToDRH'),
['id' => 'send_to_hrm_users']
);
}
$form->addCheckBox('send_me_a_copy_by_email', null, get_lang('SendAnnouncementCopyToMyself'));
$defaults['send_me_a_copy_by_email'] = true;
$form->addButtonSave(get_lang('ButtonPublishAnnouncement'));
if ($showSubmitButton) {
$form->addLabel('',
Display::url(
get_lang('Preview'),
'javascript:void(0)',
['class' => 'btn btn-default', 'id' => 'announcement_preview']
).'<div id="announcement_preview_result" style="display:none"></div>'
);
$form->addHtml('<div id="send_button" style="display:none">');
$form->addButtonSave(get_lang('ButtonPublishAnnouncement'));
$form->addHtml('</div>');
}
$form->setDefaults($defaults);
if ($form->validate()) {
@ -619,7 +695,7 @@ switch ($action) {
$sendToUsersInSession
);
} else {
$insert_id = AnnouncementManager::add_group_announcement(
$insert_id = AnnouncementManager::addGroupAnnouncement(
$data['title'],
$data['content'],
$group_id,

@ -294,7 +294,7 @@ if ($form->validate()) {
$skillUser->setSkill($skill);
if ($showLevels) {
$level = $skillLevelRepo->find(intval($values['acquired_level']));
$level = $skillLevelRepo->find($values['acquired_level']);
$skillUser->setAcquiredLevel($level);
}

@ -184,7 +184,7 @@ if ($showLevels && $allowToEdit) {
if ($formAcquiredLevel->validate() && $allowComment) {
$values = $formAcquiredLevel->exportValues();
$level = $skillLevelRepo->find(intval($values['acquired_level']));
$level = $skillLevelRepo->find($values['acquired_level']);
$skillIssue->setAcquiredLevel($level);
$entityManager->persist($skillIssue);

@ -125,6 +125,10 @@ $topics = [
$subscriptionUser = CourseManager::is_user_subscribed_in_course($userId, $course->getCode());
$allowSubscribe = false;
if ($course->getSubscribe() == true || api_is_platform_admin()) {
$allowSubscribe = true;
}
$plugin = BuyCoursesPlugin::create();
$checker = $plugin->isEnabled();
$courseIsPremium = null;
@ -165,6 +169,7 @@ $template->assign('course', $courseItem);
$essence = new Essence\Essence();
$template->assign('essence', $essence);
$template->assign('is_premium', $courseIsPremium);
$template->assign('allow_subscribe', $allowSubscribe);
$template->assign('token', $token);
$template->assign('url', $urlCourse);
$layout = $template->get_template('course_home/about.tpl');

@ -22,28 +22,16 @@ $nameTools = get_lang('ModifInfo');
api_protect_course_script(true);
api_block_anonymous_users();
$_course = api_get_course_info();
/* Constants and variables */
define('MODULE_HELP_NAME', 'Settings');
define('COURSE_CHANGE_PROPERTIES', 'COURSE_CHANGE_PROPERTIES');
$currentCourseRepository = $_course['path'];
$is_allowedToEdit = api_is_course_admin() || api_is_platform_admin();
$isAllowToEdit = api_is_course_admin() || api_is_platform_admin();
$course_code = api_get_course_id();
$courseId = api_get_course_int_id();
$isEditable = true;
function is_settings_editable()
{
return isset($GLOBALS['course_info_is_editable']) && $GLOBALS['course_info_is_editable'];
}
/* MAIN CODE */
if (!$is_allowedToEdit) {
if (!$isAllowToEdit) {
api_not_allowed(true);
}
//$htmlHeadXtra[] = api_get_css_asset('cropper/dist/cropper.min.css');
//$htmlHeadXtra[] = api_get_asset('cropper/dist/cropper.min.js');
$show_delete_watermark_text_message = false;
if (api_get_setting('pdf_export_watermark_by_course') == 'true') {
if (isset($_GET['delete_watermark'])) {
@ -695,11 +683,11 @@ if ($exerciseInvisible === 'true' &&
$form->addGroup($group, '', [get_lang('ExerciseInvisibleInSession')]);
}
if (is_settings_editable()) {
if ($isEditable) {
$form->addButtonSave(get_lang('SaveSettings'), 'submit_save');
} else {
// Is it allowed to edit the course settings?
if (!is_settings_editable()) {
if (!$isEditable) {
$disabled_output = "disabled";
}
$form->freeze();
@ -753,11 +741,11 @@ if (api_get_configuration_value('allow_exercise_auto_launch')) {
$group[] = $form->createElement('radio', 'enable_exercise_auto_launch', null, get_lang('Deactivate'), 0);
$form->addGroup($group, '', [get_lang('ExerciseAutoLaunch')]);
if (is_settings_editable()) {
if ($isEditable) {
$form->addButtonSave(get_lang('SaveSettings'), 'submit_save');
} else {
// Is it allowed to edit the course settings?
if (!is_settings_editable()) {
if (!$isEditable) {
$disabled_output = "disabled";
}
$form->freeze();
@ -920,7 +908,7 @@ if (!isset($values['student_delete_own_publication'])) {
$form->setDefaults($values);
// Validate form
if ($form->validate() && is_settings_editable()) {
if ($form->validate() && $isEditable) {
$updateValues = $form->getSubmitValues();
// update course picture
@ -1031,10 +1019,8 @@ if ($show_delete_watermark_text_message) {
);
}
/* Header */
Display::display_header($nameTools, MODULE_HELP_NAME);
Display::display_header($nameTools, 'Settings');
// Display the form
echo '<div id="course_settings">';
$form->display();
echo '</div>';

@ -127,6 +127,8 @@ class ImportCsv
$teacherBackup = [];
$groupBackup = [];
$this->prepareImport();
if (!empty($files)) {
foreach ($files as $file) {
$fileInfo = pathinfo($file);
@ -193,8 +195,6 @@ class ImportCsv
return 0;
}
$this->prepareImport();
$sections = [
'students',
'teachers',
@ -453,6 +453,13 @@ class ImportCsv
''
);
CourseManager::create_course_extra_field(
'disable_import_calendar',
13,
'Disable import calendar',
''
);
// Create session extra field extra_external_session_id
SessionManager::create_session_extra_field(
$this->extraFieldIdNameList['session'],
@ -1015,6 +1022,8 @@ class ImportCsv
$eventsToCreate = [];
$errorFound = false;
$courseExtraFieldValue = new ExtraFieldValue('course');
foreach ($data as $row) {
$sessionId = null;
$externalSessionId = null;
@ -1032,6 +1041,18 @@ class ImportCsv
}
$courseInfo = api_get_course_info($courseCode);
$item = $courseExtraFieldValue->get_values_by_handler_and_field_variable(
$courseInfo['real_id'],
'disable_import_calendar'
);
if (!empty($item) && isset($item['value']) && $item['value'] == 1) {
$this->logger->addInfo(
"Course '".$courseInfo['code']."' has 'disable_import_calendar' turn on. Skip"
);
$errorFound = true;
}
if (empty($courseInfo)) {
$this->logger->addInfo("Course '$courseCode' does not exists");
} else {

@ -145,7 +145,7 @@ $visible_return = $objExercise->is_visible(
$learnpath_id,
$learnpath_item_id,
null,
false
true
);
// Exercise is not visible remove the button

@ -23,6 +23,161 @@ if (!empty($groupId)) {
}
switch ($action) {
case 'preview':
$allowToEdit = (
api_is_allowed_to_edit(false, true) ||
(api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())
);
$drhHasAccessToSessionContent = api_drh_can_access_all_session_content();
if (!empty($sessionId) && $drhHasAccessToSessionContent) {
$allowToEdit = $allowToEdit || api_is_drh();
}
if ($allowToEdit === false && !empty($groupId)) {
$groupProperties = GroupManager:: get_group_properties($groupId);
// Check if user is tutor group
$isTutor = GroupManager::is_tutor_of_group(api_get_user_id(), $groupProperties, $courseId);
if ($isTutor) {
$allowToEdit = true;
}
}
if ($allowToEdit === false) {
exit;
}
$users = isset($_REQUEST['users']) ? json_decode($_REQUEST['users']) : '';
$formParams = [];
if (isset($_REQUEST['form'])) {
parse_str($_REQUEST['form'], $formParams);
}
$previewGroups = [];
$previewUsers = [];
$previewTotal = [];
if (empty($groupId)) {
if (empty($users) ||
(!empty($users) && isset($users[0]) && $users[0] == 'everyone')
) {
// All users in course session
if (empty($sessionId)) {
$students = CourseManager::get_user_list_from_course_code($courseInfo['code']);
} else {
$students = CourseManager::get_user_list_from_course_code($courseInfo['code'], $sessionId);
}
foreach ($students as $student) {
$previewUsers[] = $student['user_id'];
}
$groupList = GroupManager::get_group_list(null, $courseInfo, null, $sessionId);
foreach ($groupList as $group) {
$previewGroups[] = $group['iid'];
}
} else {
$send_to = CourseManager::separateUsersGroups($users);
// Storing the selected groups
if (is_array($send_to['groups']) &&
!empty($send_to['groups'])
) {
$counter = 1;
foreach ($send_to['groups'] as $group) {
$previewGroups[] = $group;
}
}
// Storing the selected users
if (is_array($send_to['users'])) {
$counter = 1;
foreach ($send_to['users'] as $user) {
$previewUsers[] = $user;
}
}
}
} else {
$send_to_users = CourseManager::separateUsersGroups($users);
$sentToAllGroup = false;
if (empty($send_to_users['groups']) && empty($send_to_users['users'])) {
$previewGroups[] = $groupId;
$sentToAllGroup = true;
}
if ($sentToAllGroup === false) {
if (!empty($send_to_users['groups'])) {
foreach ($send_to_users['groups'] as $group) {
$previewGroups[] = $group;
}
}
if (!empty($send_to_users['users'])) {
foreach ($send_to_users['users'] as $user) {
$previewUsers[] = $user;
}
}
}
}
if (isset($formParams['send_to_users_in_session']) && $formParams['send_to_users_in_session'] == 1) {
$sessionList = SessionManager::get_session_by_course(api_get_course_int_id());
if (!empty($sessionList)) {
foreach ($sessionList as $sessionInfo) {
$sessionId = $sessionInfo['id'];
$userList = CourseManager::get_user_list_from_course_code(
$courseCode,
$sessionId
);
if (!empty($userList)) {
foreach ($userList as $user) {
$previewUsers[] = $user;
}
}
}
}
}
if (isset($formParams['send_to_hrm_users']) && $formParams['send_to_hrm_users'] == 1) {
foreach ($previewUsers as $userId) {
$userInfo = api_get_user_info($userId);
$drhList = UserManager::getDrhListFromUser($userId);
if (!empty($drhList)) {
foreach ($drhList as $drhInfo) {
$previewUsers[] = $drhInfo['id'];
}
}
}
}
if (isset($formParams['send_me_a_copy_by_email']) && $formParams['send_me_a_copy_by_email'] == 1) {
$previewUsers[] = api_get_user_id();
}
$previewUserNames = [];
$previewGroupNames = [];
if (!empty($previewGroups)) {
$previewGroups = array_unique($previewGroups);
foreach ($previewGroups as $groupId) {
$groupInfo = GroupManager::get_group_properties($groupId);
$previewGroupNames[] = Display::label($groupInfo['name'], 'info');
}
$previewTotal = $previewGroupNames;
}
if (!empty($previewUsers)) {
$previewUsers = array_unique($previewUsers);
foreach ($previewUsers as $userId) {
$userInfo = api_get_user_info($userId);
$previewUserNames[] = Display::label($userInfo['complete_name']);
}
$previewTotal = array_merge($previewTotal, $previewUserNames);
}
$previewTotal = array_map(function ($value) { return ''.$value; }, $previewTotal);
echo json_encode($previewTotal);
break;
case 'delete_item':
if ($isAllowedToEdit) {
if (empty($_REQUEST['id'])) {

@ -594,7 +594,7 @@ switch ($action) {
}
$startDate = Database::escape_string($_REQUEST['start_date']);
$whereCondition .= " AND exe_date > '$startDate' ";
$whereCondition .= " AND exe_date > '$startDate' AND te.status = '' ";
$count = ExerciseLib::get_count_exam_results(
$exerciseId,
$whereCondition,
@ -1351,6 +1351,8 @@ switch ($action) {
$columns[] = 'actions';
}
$whereCondition .= " AND te.status = '' ";
$result = ExerciseLib::get_exam_results_data(
$start,
$limit,

@ -491,7 +491,7 @@ switch ($action) {
$skillUser->setUser($user);
$skillUser->setSkill($skill);
/*if ($showLevels) {
$level = $skillLevelRepo->find(intval($values['acquired_level']));
$level = $skillLevelRepo->find($values['acquired_level']);
$skillUser->setAcquiredLevel($level);
}*/

@ -465,10 +465,10 @@ class AnnouncementManager
$allow = !api_get_configuration_value('hide_announcement_sent_to_users_info');
if (api_is_allowed_to_edit(false, true) && $allow) {
$sent_to = self::sent_to('announcement', $id);
$sent_to_form = self::sent_to_form($sent_to);
$sentToForm = self::sent_to_form($sent_to);
$html .= Display::tag(
'td',
get_lang('SentTo').': '.$sent_to_form,
get_lang('SentTo').': '.$sentToForm,
['class' => 'announcements_datum']
);
}
@ -572,7 +572,6 @@ class AnnouncementManager
$courseId = $courseInfo['real_id'];
$tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
$authorId = empty($authorId) ? api_get_user_id() : $authorId;
if (empty($end_date)) {
@ -684,17 +683,17 @@ class AnnouncementManager
}
/**
* @param $title
* @param $newContent
* @param $to
* @param $to_users
* @param string $title
* @param string $newContent
* @param int $groupId
* @param array $to_users
* @param array $file
* @param string $file_comment
* @param bool $sendToUsersInSession
*
* @return bool|int
*/
public static function add_group_announcement(
public static function addGroupAnnouncement(
$title,
$newContent,
$groupId,
@ -738,7 +737,6 @@ class AnnouncementManager
);
}
$send_to_groups = CourseManager::separateUsersGroups($to);
$send_to_users = CourseManager::separateUsersGroups($to_users);
// Store in item_property (first the groups, then the users)
@ -954,7 +952,7 @@ class AnnouncementManager
$courseInfo,
TOOL_ANNOUNCEMENT,
$announcementId,
"AnnouncementUpdated",
'AnnouncementUpdated',
api_get_user_id(),
0,
$user['user_id'],
@ -1118,15 +1116,17 @@ class AnnouncementManager
*
* @param string $tool
* @param int $id
* @param bool $includeGroupWhenLoadingUser
*
* @return array
*/
public static function load_edit_users($tool, $id)
public static function loadEditUsers($tool, $id, $includeGroupWhenLoadingUser = false)
{
$table = Database::get_course_table(TABLE_ITEM_PROPERTY);
$tool = Database::escape_string($tool);
$id = (int) $id;
$courseId = api_get_course_int_id();
$groupId = api_get_group_id();
$sql = "SELECT to_user_id, to_group_id FROM $table
WHERE c_id = $courseId AND tool='$tool' AND ref = $id";
@ -1136,6 +1136,9 @@ class AnnouncementManager
while ($row = Database::fetch_array($result)) {
// This is the iid of c_group_info
$toGroup = $row['to_group_id'];
if (empty($row['to_user_id']) && !empty($groupId) && $groupId != $toGroup) {
//continue;
}
switch ($toGroup) {
// it was send to one specific user
case null:
@ -1154,9 +1157,16 @@ class AnnouncementManager
if (!in_array('USER:'.$row['to_user_id'], $to)) {
$to[] = 'USER:'.$row['to_user_id'];
}
} else {
if (!in_array('GROUP:'.$toGroup, $to)) {
$to[] = 'GROUP:'.$toGroup;
}
}
if (!in_array('GROUP:'.$toGroup, $to)) {
$to[] = 'GROUP:'.$toGroup;
if ($includeGroupWhenLoadingUser) {
if (!in_array('GROUP:'.$toGroup, $to)) {
$to[] = 'GROUP:'.$toGroup;
}
}
break;
}
@ -1186,16 +1196,15 @@ class AnnouncementManager
$group_names = self::get_course_groups();
// we count the number of users and the number of groups
$number_users = 0;
if (isset($sent_to_array['users'])) {
$number_users = count($sent_to_array['users']);
} else {
$number_users = 0;
}
$number_groups = 0;
if (isset($sent_to_array['groups'])) {
$number_groups = count($sent_to_array['groups']);
} else {
$number_groups = 0;
}
$total_numbers = $number_users + $number_groups;
// starting the form if there is more than one user/group
@ -1204,33 +1213,52 @@ class AnnouncementManager
// outputting the name of the groups
if (is_array($sent_to_array['groups'])) {
foreach ($sent_to_array['groups'] as $group_id) {
$output[] = $group_names[$group_id]['name'];
$users = GroupManager::getStudents($group_id);
$userToArray = [];
foreach ($users as $student) {
$userToArray[] = $student['complete_name_with_username'];
}
$output[] =
'<br />'.
Display::label($group_names[$group_id]['name'], 'info').
'&nbsp;'.implode(', ', $userToArray);
}
}
if (isset($sent_to_array['users'])) {
if (is_array($sent_to_array['users'])) {
$usersToArray = [];
foreach ($sent_to_array['users'] as $user_id) {
$user_info = api_get_user_info($user_id);
$output[] = $user_info['complete_name_with_username'];
$usersToArray[] = $user_info['complete_name_with_username'];
}
$output[] = '<br />'.Display::label(get_lang('Users')).'&nbsp;'.implode(', ', $usersToArray);
}
}
} else {
// there is only one user/group
if (isset($sent_to_array['users']) and is_array($sent_to_array['users'])) {
if (isset($sent_to_array['users']) && is_array($sent_to_array['users'])) {
$user_info = api_get_user_info($sent_to_array['users'][0]);
$output[] = api_get_person_name($user_info['firstname'], $user_info['lastname']);
}
if (isset($sent_to_array['groups']) and
is_array($sent_to_array['groups']) and
isset($sent_to_array['groups'][0]) and
if (isset($sent_to_array['groups']) &&
is_array($sent_to_array['groups']) &&
isset($sent_to_array['groups'][0]) &&
$sent_to_array['groups'][0] !== 0
) {
$group_id = $sent_to_array['groups'][0];
$output[] = "&nbsp;".$group_names[$group_id]['name'];
$users = GroupManager::getStudents($group_id);
$userToArray = [];
foreach ($users as $student) {
$userToArray[] = $student['complete_name_with_username'];
}
$output[] =
'<br />'.
Display::label($group_names[$group_id]['name'], 'info').
'&nbsp;'.implode(', ', $userToArray);
}
if (empty($sent_to_array['groups']) and empty($sent_to_array['users'])) {
if (empty($sent_to_array['groups']) && empty($sent_to_array['users'])) {
$output[] = "&nbsp;".get_lang('Everybody');
}
}
@ -1238,7 +1266,7 @@ class AnnouncementManager
if (!empty($output)) {
$output = array_filter($output);
if (count($output) > 0) {
$output = implode(', ', $output);
$output = implode('<br />', $output);
}
return $output;
@ -1586,6 +1614,12 @@ class AnnouncementManager
ICON_SIZE_SMALL
);
$editIconDisable = Display::return_icon(
'edit_na.png',
get_lang('Edit'),
'',
ICON_SIZE_SMALL
);
$deleteIcon = Display::return_icon(
'delete.png',
get_lang('Delete'),
@ -1593,6 +1627,13 @@ class AnnouncementManager
ICON_SIZE_SMALL
);
$deleteIconDisable = Display::return_icon(
'delete_na.png',
get_lang('Delete'),
'',
ICON_SIZE_SMALL
);
$isTutor = false;
if (!empty($group_id)) {
$groupInfo = GroupManager::get_group_properties(api_get_group_id());

@ -6104,8 +6104,8 @@ class CourseManager
*/
public static function addGroupMultiSelect($form, $groupInfo, $to = [])
{
$group_users = GroupManager::get_subscribed_users($groupInfo);
$array = self::buildSelectOptions([$groupInfo], $group_users, $to);
$groupUsers = GroupManager::get_subscribed_users($groupInfo);
$array = self::buildSelectOptions([$groupInfo], $groupUsers, $to);
$result = [];
foreach ($array as $content) {

@ -699,7 +699,7 @@ class MessageManager
).' <br />'.$message;
self::send_message_simple(
$drhInfo['user_id'],
$drhInfo['id'],
$subject,
$message,
$sender_id,

@ -621,9 +621,9 @@ class SessionManager
foreach ($sessions as $session) {
$session_id = $session['id'];
if ($showCountUsers) {
$session['users'] = SessionManager::get_users_by_session(
$session['users'] = self::get_users_by_session(
$session['id'],
null,
0,
true
);
}
@ -1874,6 +1874,7 @@ class SessionManager
* @param array $userList
* @param int $session_visibility
* @param bool $empty_users
* @param bool $registerUsersToAllCourses
*
* @return bool
*/
@ -1881,7 +1882,8 @@ class SessionManager
$sessionId,
$userList,
$session_visibility = SESSION_VISIBLE_READ_ONLY,
$empty_users = true
$empty_users = true,
$registerUsersToAllCourses = true
) {
if ($sessionId != strval(intval($sessionId))) {
return false;
@ -1990,96 +1992,98 @@ class SessionManager
}
}
foreach ($course_list as $courseId) {
// for each course in the session
$nbr_users = 0;
$courseId = (int) $courseId;
$sql = "SELECT DISTINCT user_id
FROM $tbl_session_rel_course_rel_user
WHERE
session_id = $sessionId AND
c_id = $courseId AND
status = 0
";
$result = Database::query($sql);
$existingUsers = [];
while ($row = Database::fetch_array($result)) {
$existingUsers[] = $row['user_id'];
}
// Delete existing users
if ($empty_users) {
foreach ($existingUsers as $existing_user) {
if (!in_array($existing_user, $userList)) {
$sql = "DELETE FROM $tbl_session_rel_course_rel_user
WHERE
session_id = $sessionId AND
c_id = $courseId AND
user_id = $existing_user AND
status = 0 ";
$result = Database::query($sql);
Event::addEvent(
LOG_SESSION_DELETE_USER_COURSE,
LOG_USER_ID,
$existing_user,
api_get_utc_datetime(),
api_get_user_id(),
$courseId,
$sessionId
);
if ($registerUsersToAllCourses) {
foreach ($course_list as $courseId) {
// for each course in the session
$nbr_users = 0;
$courseId = (int) $courseId;
if (Database::affected_rows($result)) {
$nbr_users--;
}
}
$sql = "SELECT DISTINCT user_id
FROM $tbl_session_rel_course_rel_user
WHERE
session_id = $sessionId AND
c_id = $courseId AND
status = 0
";
$result = Database::query($sql);
$existingUsers = [];
while ($row = Database::fetch_array($result)) {
$existingUsers[] = $row['user_id'];
}
}
// Replace with this new function
// insert new users into session_rel_course_rel_user and ignore if they already exist
foreach ($userList as $enreg_user) {
if (!in_array($enreg_user, $existingUsers)) {
$status = self::get_user_status_in_course_session(
$enreg_user,
$courseId,
$sessionId
);
// Delete existing users
if ($empty_users) {
foreach ($existingUsers as $existing_user) {
if (!in_array($existing_user, $userList)) {
$sql = "DELETE FROM $tbl_session_rel_course_rel_user
WHERE
session_id = $sessionId AND
c_id = $courseId AND
user_id = $existing_user AND
status = 0 ";
$result = Database::query($sql);
Event::addEvent(
LOG_SESSION_DELETE_USER_COURSE,
LOG_USER_ID,
$existing_user,
api_get_utc_datetime(),
api_get_user_id(),
$courseId,
$sessionId
);
// Avoid duplicate entries.
if ($status === false || ($status !== false && $status != 0)) {
$enreg_user = (int) $enreg_user;
$sql = "INSERT IGNORE INTO $tbl_session_rel_course_rel_user (session_id, c_id, user_id, visibility, status)
VALUES($sessionId, $courseId, $enreg_user, $session_visibility, 0)";
$result = Database::query($sql);
if (Database::affected_rows($result)) {
$nbr_users++;
if (Database::affected_rows($result)) {
$nbr_users--;
}
}
}
}
Event::addEvent(
LOG_SESSION_ADD_USER_COURSE,
LOG_USER_ID,
// Replace with this new function
// insert new users into session_rel_course_rel_user and ignore if they already exist
foreach ($userList as $enreg_user) {
if (!in_array($enreg_user, $existingUsers)) {
$status = self::get_user_status_in_course_session(
$enreg_user,
api_get_utc_datetime(),
api_get_user_id(),
$courseId,
$sessionId
);
// Avoid duplicate entries.
if ($status === false || ($status !== false && $status != 0)) {
$enreg_user = (int) $enreg_user;
$sql = "INSERT IGNORE INTO $tbl_session_rel_course_rel_user (session_id, c_id, user_id, visibility, status)
VALUES($sessionId, $courseId, $enreg_user, $session_visibility, 0)";
$result = Database::query($sql);
if (Database::affected_rows($result)) {
$nbr_users++;
}
Event::addEvent(
LOG_SESSION_ADD_USER_COURSE,
LOG_USER_ID,
$enreg_user,
api_get_utc_datetime(),
api_get_user_id(),
$courseId,
$sessionId
);
}
}
}
}
// Count users in this session-course relation
$sql = "SELECT COUNT(user_id) as nbUsers
FROM $tbl_session_rel_course_rel_user
WHERE session_id = $sessionId AND c_id = $courseId AND status<>2";
$rs = Database::query($sql);
list($nbr_users) = Database::fetch_array($rs);
// update the session-course relation to add the users total
$sql = "UPDATE $tbl_session_rel_course SET nbr_users = $nbr_users
WHERE session_id = $sessionId AND c_id = $courseId";
Database::query($sql);
// Count users in this session-course relation
$sql = "SELECT COUNT(user_id) as nbUsers
FROM $tbl_session_rel_course_rel_user
WHERE session_id = $sessionId AND c_id = $courseId AND status<>2";
$rs = Database::query($sql);
list($nbr_users) = Database::fetch_array($rs);
// update the session-course relation to add the users total
$sql = "UPDATE $tbl_session_rel_course SET nbr_users = $nbr_users
WHERE session_id = $sessionId AND c_id = $courseId";
Database::query($sql);
}
}
// Delete users from the session
@ -2126,17 +2130,10 @@ class SessionManager
}
// update number of users in the session
$nbr_users = count($userList);
if ($empty_users) {
// update number of users in the session
$sql = "UPDATE $tbl_session SET nbr_users= $nbr_users
WHERE id = $sessionId ";
Database::query($sql);
} else {
$sql = "UPDATE $tbl_session SET nbr_users = nbr_users + $nbr_users
WHERE id = $sessionId";
Database::query($sql);
}
$sql = "UPDATE $tbl_session
SET nbr_users = (SELECT count(user_id) FROM $tbl_session_rel_user WHERE session_id = $sessionId)
WHERE id = $sessionId";
Database::query($sql);
}
/**
@ -7152,11 +7149,12 @@ SQL;
/**
* Get the count of user courses in session.
*
* @param int $sessionId The session id
* @param int $sessionId
* @param int $courseId
*
* @return array
*/
public static function getTotalUserCoursesInSession($sessionId)
public static function getTotalUserCoursesInSession($sessionId, $courseId = 0)
{
$tableUser = Database::get_main_table(TABLE_MAIN_USER);
$table = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
@ -7165,6 +7163,12 @@ SQL;
return [];
}
$courseCondition = '';
if (!empty($courseId)) {
$courseId = (int) $courseId;
$courseCondition = " c_id = $courseId AND ";
}
$sql = "SELECT
COUNT(u.id) as count,
u.id,
@ -7173,7 +7177,9 @@ SQL;
FROM $table scu
INNER JOIN $tableUser u
ON scu.user_id = u.id
WHERE scu.session_id = ".intval($sessionId)."
WHERE
$courseCondition
scu.session_id = ".intval($sessionId)."
GROUP BY u.id";
$result = Database::query($sql);
@ -8192,7 +8198,6 @@ SQL;
'name' => 'id',
'index' => 's.id',
'width' => '160',
'width' => '160',
'hidden' => 'true',
],
[

@ -1282,12 +1282,12 @@ class SocialManager extends UserManager
$course_url = '&amp;cidReq='.Security::remove_XSS($_GET['cidReq']);
}
$hide = api_get_configuration_value('hide_complete_name_in_whoisonline');
foreach ($user_list as $uid) {
$user_info = api_get_user_info($uid, true);
$lastname = $user_info['lastname'];
$firstname = $user_info['firstname'];
$completeName = $firstname.', '.$lastname;
$user_rol = $user_info['status'] == 1 ? Display::return_icon('teacher.png', get_lang('Teacher'), null, ICON_SIZE_TINY) : Display::return_icon('user.png', get_lang('Student'), null, ICON_SIZE_TINY);
$status_icon_chat = null;
if (isset($user_info['user_is_online_in_chat']) && $user_info['user_is_online_in_chat'] == 1) {
@ -1301,6 +1301,13 @@ class SocialManager extends UserManager
if (api_get_setting('show_official_code_whoisonline') == 'true') {
$officialCode .= '<div class="items-user-official-code"><p style="min-height: 30px;" title="'.get_lang('OfficialCode').'">'.$user_info['official_code'].'</p></div>';
}
if ($hide === true) {
$completeName = '';
$firstname = '';
$lastname = '';
}
$img = '<img class="img-responsive img-circle" title="'.$completeName.'" alt="'.$completeName.'" src="'.$userPicture.'">';
$url = null;

@ -281,6 +281,8 @@ function add_user_to_session (code, content) {
}
destination.options[destination.length] = new Option(content,code);
destination.selectedIndex = -1;
$("#remove_user").show();
sortOptions(destination.options);
}
@ -327,14 +329,14 @@ if (isset($_POST['form_sent']) && $_POST['form_sent']) {
}
if ($form_sent == 1) {
$notEmptyList = api_get_configuration_value('session_multiple_subscription_students_list_avoid_emptying');
//$notEmptyList = api_get_configuration_value('session_multiple_subscription_students_list_avoid_emptying');
// Added a parameter to send emails when registering a user
SessionManager::subscribeUsersToSession(
$id_session,
$UserList,
null,
!$notEmptyList
false
);
Display::addFlash(Display::return_message(get_lang('Updated')));
header('Location: resume_session.php?id_session='.$id_session);
@ -364,43 +366,6 @@ if ($orderListByOfficialCode === 'true') {
}
if ($ajax_search) {
$sql = "
SELECT u.id, u.lastname, u.firstname, u.username, session_id, u.official_code
FROM $tbl_user u
INNER JOIN $tbl_session_rel_user su
ON su.user_id = u.id
AND su.relation_type <> ".SESSION_RELATION_TYPE_RRHH."
AND su.session_id = ".intval($id_session)."
WHERE u.status<>".DRH."
AND u.status <> 6
$order_clause
";
if (api_is_multiple_url_enabled()) {
$tbl_user_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
$access_url_id = api_get_current_access_url_id();
if ($access_url_id != -1) {
$sql = "
SELECT u.id, u.lastname, u.firstname, u.username, session_id, u.official_code
FROM $tbl_user u
INNER JOIN $tbl_session_rel_user su
ON su.user_id = u.id
AND su.relation_type <> ".SESSION_RELATION_TYPE_RRHH."
AND su.session_id = ".intval($id_session)."
INNER JOIN $tbl_user_rel_access_url url_user ON (url_user.user_id = u.id)
WHERE access_url_id = $access_url_id
AND u.status <> ".DRH."
AND u.status <> 6
$order_clause
";
}
}
$result = Database::query($sql);
$users = Database::store_result($result);
foreach ($users as $user) {
$sessionUsersList[$user['id']] = $user;
}
$sessionUserInfo = SessionManager::getTotalUserCoursesInSession($id_session);
// Filter the user list in all courses in the session
@ -413,10 +378,6 @@ if ($ajax_search) {
if (!array_key_exists($sessionUser['id'], $sessionUsersList)) {
continue;
}
/*if ($sessionUser['count'] != $countSessionCoursesList) {
unset($sessionUsersList[$sessionUser['id']]);
}*/
}
unset($users); //clean to free memory
@ -686,11 +647,12 @@ $newLinks .= Display::url(
<div id="multiple-add-session" class="row">
<div class="col-md-4">
<div class="form-group">
<label><?php echo get_lang('UserListInPlatform'); ?> </label>
<?php
if (!($add_type == 'multiple')) {
?>
<input type="text" id="user_to_add" onkeyup="xajax_search_users(this.value,'single')"
<input
placeholder="<?php echo get_lang('Search'); ?>"
type="text" id="user_to_add" onkeyup="xajax_search_users(this.value,'single')"
class="form-control"/>
<div id="ajax_list_users_single" class="select-list-ajax"></div>
<?php
@ -749,12 +711,7 @@ $newLinks .= Display::url(
<?php
if ($ajax_search) {
?>
<div class="separate-action">
<button name="remove_user" class="btn btn-primary" type="button"
onclick="remove_item(document.getElementById('destination_users'))">
<em class="fa fa-chevron-left"></em>
</button>
</div>
<?php
} else {
?>
@ -787,30 +744,15 @@ $newLinks .= Display::url(
</div>
<div class="col-md-4">
<label><?php echo get_lang('UserListInSession'); ?> :</label>
<select id="destination_users" name="sessionUsersList[]" multiple="multiple" size="15"
class="form-control">
<?php
foreach ($sessionUsersList as $enreg) {
?>
<option value="<?php echo $enreg['id']; ?>">
<?php
$personName = $enreg['lastname'].' '.$enreg['firstname'].' ('.$enreg['username'].') '
.$enreg['official_code'];
if ($showOfficialCode) {
$officialCode =
!empty($enreg['official_code']) ? $enreg['official_code'].' - ' : '? - ';
$personName =
$officialCode.$enreg['lastname'].' '.$enreg['firstname'].' ('.$enreg['username']
.')';
}
echo $personName; ?>
</option>
<?php
}
unset($sessionUsersList);
?>
</select>
<br />
<button style="display:none" id="remove_user" name="remove_user" class="btn btn-primary" type="button"
onclick="remove_item(document.getElementById('destination_users'))">
<?php echo get_lang('Remove'); ?> <em class="fa fa-trash"></em>
</button>
</div>
</div>
</form>

@ -221,8 +221,10 @@ if ($session->getNbrCourses() === 0) {
api_get_path(WEB_CODE_PATH).'admin/skill_rel_course.php?session_id='.$sessionId.'&course_id='.$course->getId()
);
}
$courseItem .= $orderButtons;
$courseItem .= '<a href="add_users_to_session_course.php?id_session='.$sessionId.'&course_id='.$course->getId().'">'.
Display::return_icon('new_user.png', get_lang('AddUsers'), ['style' => 'width:22px'], ICON_SIZE_MEDIUM).'</a>';
$courseItem .= '<a href="session_course_user_list.php?id_session='.$sessionId.'&course_code='.$course->getCode().'">'.
Display::return_icon('user.png', get_lang('Users'), '', ICON_SIZE_SMALL).'</a>';
$courseItem .= '<a href="'.api_get_path(WEB_CODE_PATH).'user/user_import.php?action=import&cidReq='.$course->getCode().'&id_session='.$sessionId.'">'.
@ -243,8 +245,8 @@ if ($session->getNbrCourses() === 0) {
}
$courseListToShow .= '</table><br />';
$url = Display::url(
Display::return_icon('edit.png', get_lang('Edit'), [], ICON_SIZE_SMALL),
$url = '&nbsp;'.Display::url(
Display::return_icon('user_subscribe_session.png', get_lang('Add'), [], ICON_SIZE_SMALL),
"add_users_to_session.php?page=resume_session.php&id_session=$sessionId"
);
$url .= Display::url(

@ -128,7 +128,7 @@ switch ($action) {
$userInfo
);
$url = api_get_path(WEB_CODE_PATH).'admin/';
$url = api_get_path(WEB_CODE_PATH).'admin/user_list_consent.php';
$link = Display::url($url, $url);
$subject = get_lang('RequestForAccountDeletion');
$content = sprintf(

@ -49,9 +49,9 @@ class ch_multipleresponse extends survey_question
$answers = []
) {
if ($questionData['display'] == 'vertical') {
$class = 'checkbox';
$class = 'checkbox ';
} else {
$class = 'checkbox-inline';
$class = 'checkbox-inline ';
}
$name = 'question'.$questionData['question_id'];

@ -1,35 +1,50 @@
{% for block in blocks %}
{% if block.title %}
<h2 class="title-tools">{{ block.title }}</h2>
{% endif %}
<div class="accordion course-accordion" id="course-tools">
{% for block in blocks %}
<div class="card">
<div class="card-header" id="heading-{{ block.class }}">
{% if block.title %}
<button class="btn btn-link" type="button" data-toggle="collapse" data-target="#collapse-{{ block.class }}" aria-expanded="true" aria-controls="collapse-{{ block.class }}">
{{ block.title }}
</button>
{% endif %}
</div>
<div class="row {{ block.class }}">
{% if 'homepage_view'|api_get_setting == 'activity' %}
{% for item in block.content %}
<div class="col-md-4 course-tool">
{{ item.extra|raw }}
{{ item.visibility|raw }}
{{ item.icon|raw }}
{{ item.link|raw }}
</div>
{% endfor %}
{% endif %}
<div id="collapse-{{ block.class }}" class="collapse {{ ( block.title == 'Authoring') ? 'show' : '' }}" aria-labelledby="heading-{{ block.class }}" data-parent="#course-tools">
<div class="card-body">
<div class="row">
{% if 'homepage_view'|api_get_setting == 'activity_big' %}
{% for item in block.content %}
<div class="col-xs-6 col-md-3 course-tool">
<div class="big_icon">
{{ item.tool.image|raw }}
</div>
<div class="content">
<h4>
{{ item.visibility|raw }}
{% if 'homepage_view'|api_get_setting == 'activity' %}
{% for item in block.content %}
<div class="col-md-4 course-tool">
{{ item.extra|raw }}
{{ item.visibility|raw }}
{{ item.icon|raw }}
{{ item.link|raw }}
</h4>
</div>
</div>
{% endfor %}
{% endif %}
{% if 'homepage_view'|api_get_setting == 'activity_big' %}
{% for item in block.content %}
<div class="col-6 col-md-2 ">
<div class="tools mt-3 mb-3 p-2">
<div class="big_icon">
{{ item.tool.image|raw }}
</div>
<div class="content pt-2 pb-2">
{{ item.extra|raw }}
{{ item.link|raw }}
<div class="view">
{{ item.visibility|raw }}
</div>
</div>
</div>
</div>
{% endfor %}
{% endif %}
</div>
{% endfor %}
{% endif %}
</div>
</div>
</div>
{% endfor %}
{% endfor %}
</div>

@ -1,8 +1,9 @@
{% autoescape false %}
{{ actions }}
{{ message }}
{{ flash_messages }}
{% if data is not empty %}
{% set tutor = false|api_is_allowed_to_edit(true) %}
{# set tutor = false|api_is_allowed_to_edit(true) #}
<div id="course-progress" class="thematic">
<div class="row">
<div class="col-md-12">
@ -34,13 +35,14 @@
</div>
</td>
<td>
{#
{% if tutor %}
<div class="pull-right">
<a title="{{ 'EditThematicPlan' | get_lang }}" href="index.php?{{ _p.web_cid_query }}&origin=thematic_details&action=thematic_plan_list&thematic_id={{ item.id }}&width=700&height=500'" class="btn btn-default">
<i class="fa fa-pencil" aria-hidden="true"></i>
</a>
</div>
{% endif %}
{% endif %} #}
<div class="thematic_plan_{{ item.id }}">
{% if item.thematic_plan is empty %}
<div class="alert-thematic">
@ -123,4 +125,5 @@
</div>
{% else %}
<div class="alert alert-info" role="alert">{{ 'ThereIsNoAThematicSection' | get_lang }}</div>
{% endif %}
{% endif %}
{% endautoescape %}

@ -23,8 +23,38 @@ if (empty($fromUserId) || empty($toUserId)) {
if (api_is_drh()) {
$isFollowed = UserManager::is_user_followed_by_drh($fromUserId, api_get_user_id());
if (!$isFollowed) {
api_not_allowed(true);
if (api_drh_can_access_all_session_content()) {
$students = SessionManager::getAllUsersFromCoursesFromAllSessionFromStatus(
'drh_all',
api_get_user_id(),
false,
0, //$from,
null, //$limit,
null, //$column,
'desc', //$direction,
null, //$keyword,
null, //$active,
null, //$lastConnectionDate,
null,
null,
STUDENT
);
if (empty($students)) {
api_not_allowed(true);
}
$userIdList = [];
foreach ($students as $student) {
$userIdList[] = $student['user_id'];
}
if (!in_array($fromUserId, $userIdList)) {
api_not_allowed(true);
}
} else {
if (!$isFollowed) {
api_not_allowed(true);
}
}
}

@ -14,7 +14,7 @@ $em = Database::getManager();
$toolsRepo = $em->getRepository('ChamiloPluginBundle:ImsLti\ImsLtiTool');
/** @var ImsLtiTool $baseTool */
$baseTool = isset($_REQUEST['type']) ? $toolsRepo->find(intval($_REQUEST['type'])) : null;
$baseTool = isset($_REQUEST['type']) ? $toolsRepo->find($_REQUEST['type']) : null;
/** @var Course $course */
$course = $em->find('ChamiloCoreBundle:Course', api_get_course_int_id());

@ -4,7 +4,6 @@
namespace Chamilo\ApiBundle\GraphQL\Map;
use Chamilo\ApiBundle\GraphQL\ApiGraphQLTrait;
use Chamilo\ApiBundle\GraphQL\Resolver\ToolDescriptionResolver;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Message;
use Chamilo\CoreBundle\Entity\Session;
@ -262,7 +261,7 @@ class QueryMap extends ResolverMap implements ContainerAwareInterface
$resolver = $this->container->get('chamilo_api.graphql.resolver.course');
return $resolver->getPosts($thread, $context);
}
},
],
'CourseForumPost' => [
'id' => function (CForumPost $post) {
@ -285,7 +284,7 @@ class QueryMap extends ResolverMap implements ContainerAwareInterface
},
'parent' => function (CForumPost $post) {
$postRepo = $this->em->getRepository('ChamiloCourseBundle:CForumPost');
$parent = $postRepo->find((int) $post->getPostParentId());
$parent = $postRepo->find($post->getPostParentId());
return $parent;
},
@ -379,31 +378,6 @@ class QueryMap extends ResolverMap implements ContainerAwareInterface
];
}
/**
* @param string $fieldName
* @param object $object
* @param object|null $resolver
* @param Argument|null $args
* @param \ArrayObject|null $context
*
* @return mixed
*/
private function resolveField(
$fieldName,
$object,
$resolver = null,
Argument $args = null,
\ArrayObject $context = null
) {
$method = 'get'.ucfirst($fieldName);
if ($resolver && $args && $context && method_exists($resolver, $method)) {
return $resolver->$method($object, $args, $context);
}
return $object->$method();
}
/**
* @return User
*/
@ -480,4 +454,29 @@ class QueryMap extends ResolverMap implements ContainerAwareInterface
return $category;
}
/**
* @param string $fieldName
* @param object $object
* @param object|null $resolver
* @param Argument|null $args
* @param \ArrayObject|null $context
*
* @return mixed
*/
private function resolveField(
$fieldName,
$object,
$resolver = null,
Argument $args = null,
\ArrayObject $context = null
) {
$method = 'get'.ucfirst($fieldName);
if ($resolver && $args && $context && method_exists($resolver, $method)) {
return $resolver->$method($object, $args, $context);
}
return $object->$method();
}
}

@ -187,24 +187,6 @@ class CourseResolver implements ContainerAwareInterface
return self::getAnnouncementObject($announcementInfo['announcement'], $announcementInfo['item_property']);
}
/**
* @param CAnnouncement $a
* @param CItemProperty $ip
*
* @return \stdClass
*/
private static function getAnnouncementObject(CAnnouncement $a, CItemProperty $ip)
{
$announcement = new \stdClass();
$announcement->id = $a->getIid();
$announcement->title = $a->getTitle();
$announcement->content = $a->getContent();
$announcement->author = $ip->getInsertUser();
$announcement->lastUpdateDate = $ip->getLasteditDate();
return $announcement;
}
/**
* @param \ArrayObject $context
*
@ -563,6 +545,24 @@ class CourseResolver implements ContainerAwareInterface
return $lps;
}
/**
* @param CAnnouncement $a
* @param CItemProperty $ip
*
* @return \stdClass
*/
private static function getAnnouncementObject(CAnnouncement $a, CItemProperty $ip)
{
$announcement = new \stdClass();
$announcement->id = $a->getIid();
$announcement->title = $a->getTitle();
$announcement->content = $a->getContent();
$announcement->author = $ip->getInsertUser();
$announcement->lastUpdateDate = $ip->getLasteditDate();
return $announcement;
}
/**
* @param int $lpId
* @param Course $course

@ -113,6 +113,34 @@ class UserResolver implements ContainerAwareInterface
return $courses;
}
/**
* @param User $user
*
* @return array
*/
public function getSessions(User $user)
{
$this->protectCurrentUserData($user);
$sessionsId = $this->findUserSessions($user);
if (empty($sessionsId)) {
return [];
}
$qb = $this->em->createQueryBuilder();
$result = $qb
->select('s')
->from('ChamiloCoreBundle:Session', 's')
->where(
$qb->expr()->in('s.id', $sessionsId)
)
->getQuery()
->getResult();
return $result;
}
/**
* @param User $user
*
@ -252,32 +280,4 @@ class UserResolver implements ContainerAwareInterface
return $results;
}
/**
* @param User $user
*
* @return array
*/
public function getSessions(User $user)
{
$this->protectCurrentUserData($user);
$sessionsId = $this->findUserSessions($user);
if (empty($sessionsId)) {
return [];
}
$qb = $this->em->createQueryBuilder();
$result = $qb
->select('s')
->from('ChamiloCoreBundle:Session', 's')
->where(
$qb->expr()->in('s.id', $sessionsId)
)
->getQuery()
->getResult();
return $result;
}
}

@ -36,4 +36,4 @@ class Version20180927172830 extends AbstractMigrationChamilo
public function down(Schema $schema)
{
}
}
}

@ -12,7 +12,6 @@ use Chamilo\CourseBundle\Entity\CTool;
use Chamilo\CourseBundle\Tool\BaseTool;
use Chamilo\SettingsBundle\Manager\SettingsManager;
use Doctrine\Common\Persistence\ObjectManager;
use Sonata\AdminBundle\Form\Type\ModelReferenceType;
/**
* Class ToolChain.

@ -340,6 +340,20 @@ class User extends BaseUser implements ThemeUser, EquatableInterface //implement
*/
protected $sessions;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Chamilo\CourseBundle\Entity\CGroupRelUser", mappedBy="user")
*/
protected $courseGroupsAsMember;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Chamilo\CourseBundle\Entity\CGroupRelTutor", mappedBy="user")
*/
protected $courseGroupsAsTutor;
/**
* @var string
*
@ -473,20 +487,6 @@ class User extends BaseUser implements ThemeUser, EquatableInterface //implement
*/
private $receivedMessages;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Chamilo\CourseBundle\Entity\CGroupRelUser", mappedBy="user")
*/
protected $courseGroupsAsMember;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Chamilo\CourseBundle\Entity\CGroupRelTutor", mappedBy="user")
*/
protected $courseGroupsAsTutor;
/**
* Constructor.
*/

Loading…
Cancel
Save