Fix #2388 - refs BT#14009 (#2389)

* Fix visibility for documents - refs BT#14009 #2388

* Add hide_invisible_documents_for_session configuration - refs BT#14009 #2388

It avoid show the invisible documents (from basis course) in session course

* Minor - Solve CodeClimate - refs BT#14009 #2388

* Rename configuration setting to hide_invisible_course_documents_in_sessions - refs BT#14027 #2388

* Minor - Add context comments to code - refs BT#14027 #2388

* Minor - Fixes for codacy - refs BT#14027 #2388
pull/2458/head
Angel Fernando Quiroz Campos 8 years ago committed by GitHub
parent d2e0f0eead
commit baad87a111
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      main/document/document.php
  2. 2
      main/document/document_quota.php
  3. 2
      main/document/remote.php
  4. 189
      main/inc/lib/document.lib.php
  5. 2
      main/inc/lib/javascript/svgedit/extensions/imagelib/groups.php
  6. 2
      main/inc/lib/javascript/svgedit/extensions/imagelib/index.php
  7. 2
      main/inc/lib/svg-edit/extensions/imagelib/groups.php
  8. 2
      main/inc/lib/svg-edit/extensions/imagelib/index.php
  9. 2
      main/inc/lib/webservices/Rest.php
  10. 3
      main/install/configuration.dist.php

@ -870,7 +870,7 @@ $htmlHeadXtra[] = '<script type="text/javascript" src="'.$js_path
.'jquery-jplayer/jplayer/jquery.jplayer.min.js"></script>';
$mediaplayer_path = api_get_path(WEB_LIBRARY_PATH).'mediaplayer/player.swf';
$documentAndFolders = DocumentManager::get_all_document_data(
$documentAndFolders = DocumentManager::getAllDocumentData(
$courseInfo,
$curdirpath,
$groupIid,
@ -1544,7 +1544,7 @@ if (isset($_GET['curdirpath']) &&
/* GET ALL DOCUMENT DATA FOR CURDIRPATH */
if (isset($_GET['keyword']) && !empty($_GET['keyword'])) {
$documentAndFolders = DocumentManager::get_all_document_data(
$documentAndFolders = DocumentManager::getAllDocumentData(
$courseInfo,
$curdirpath,
$groupIid,
@ -1553,7 +1553,7 @@ if (isset($_GET['keyword']) && !empty($_GET['keyword'])) {
true
);
} else {
$documentAndFolders = DocumentManager::get_all_document_data(
$documentAndFolders = DocumentManager::getAllDocumentData(
$courseInfo,
$curdirpath,
$groupIid,

@ -78,7 +78,7 @@ if (!empty($group_list)) {
}
}
// Showing weight of documents uploaded by user
$document_list = DocumentManager::get_all_document_data($_course);
$document_list = DocumentManager::getAllDocumentData($_course);
if (is_array($document_list)) {
foreach ($document_list as $document_data) {
if ($document_data['insert_user_id'] == api_get_user_id() && $document_data['filetype'] == 'file') {

@ -62,7 +62,7 @@ if ($action == 'list') {
}
// get files list
$files = DocumentManager::get_all_document_data($_course, $cwd, 0, null, false);
$files = DocumentManager::getAllDocumentData($_course, $cwd, 0, null, false);
// adding download link to files
foreach ($files as $k => $f) {

@ -427,38 +427,39 @@ class DocumentManager
/**
* Fetches all document data for the given user/group
*
* @param array $_course
* @param array $courseInfo
* @param string $path
* @param int $to_group_id iid
* @param int $to_user_id
* @param boolean $can_see_invisible
* @param int $toGroupId iid
* @param int $toUserId
* @param boolean $canSeeInvisible
* @param boolean $search
* @param int $sessionId
* @return array with all document data
* @throws \Doctrine\DBAL\DBALException
*/
public static function get_all_document_data(
$_course,
public static function getAllDocumentData(
$courseInfo,
$path = '/',
$to_group_id = 0,
$to_user_id = null,
$can_see_invisible = false,
$toGroupId = 0,
$toUserId = null,
$canSeeInvisible = false,
$search = false,
$sessionId = 0
) {
$TABLE_ITEMPROPERTY = Database::get_course_table(TABLE_ITEM_PROPERTY);
$TABLE_DOCUMENT = Database::get_course_table(TABLE_DOCUMENT);
$tblItemProperty = Database::get_course_table(TABLE_ITEM_PROPERTY);
$tblDocument = Database::get_course_table(TABLE_DOCUMENT);
$userGroupFilter = '';
if (!is_null($to_user_id)) {
$to_user_id = intval($to_user_id);
$userGroupFilter = "last.to_user_id = $to_user_id";
if (empty($to_user_id)) {
if (!is_null($toUserId)) {
$toUserId = intval($toUserId);
$userGroupFilter = "last.to_user_id = $toUserId";
if (empty($toUserId)) {
$userGroupFilter = " (last.to_user_id = 0 OR last.to_user_id IS NULL) ";
}
} else {
$to_group_id = intval($to_group_id);
$userGroupFilter = "last.to_group_id = $to_group_id";
if (empty($to_group_id)) {
$toGroupId = intval($toGroupId);
$userGroupFilter = "last.to_group_id = $toGroupId";
if (empty($toGroupId)) {
$userGroupFilter = "( last.to_group_id = 0 OR last.to_group_id IS NULL) ";
}
}
@ -467,20 +468,20 @@ class DocumentManager
$originalPath = $path;
$path = str_replace('_', '\_', $path);
$visibility_bit = ' <> 2';
$visibilityBit = ' <> 2';
// The given path will not end with a slash, unless it's the root '/'
// so no root -> add slash
$added_slash = $path == '/' ? '' : '/';
$addedSlash = $path == '/' ? '' : '/';
// Condition for the session
$sessionId = $sessionId ?: api_get_session_id();
$condition_session = " AND (last.session_id = '$sessionId' OR (last.session_id = '0' OR last.session_id IS NULL) )";
$condition_session .= self::getSessionFolderFilters($originalPath, $sessionId);
$conditionSession = " AND (last.session_id = '$sessionId' OR (last.session_id = '0' OR last.session_id IS NULL) )";
$conditionSession .= self::getSessionFolderFilters($originalPath, $sessionId);
$sharedCondition = null;
if ($originalPath == '/shared_folder') {
$students = CourseManager::get_user_list_from_course_code($_course['code'], $sessionId);
$students = CourseManager::get_user_list_from_course_code($courseInfo['code'], $sessionId);
if (!empty($students)) {
$conditionList = [];
foreach ($students as $studentId => $studentInfo) {
@ -503,134 +504,104 @@ class DocumentManager
last.lastedit_date,
last.visibility,
last.insert_user_id
FROM $TABLE_ITEMPROPERTY AS last
INNER JOIN $TABLE_DOCUMENT AS docs
FROM $tblItemProperty AS last
INNER JOIN $tblDocument AS docs
ON (
docs.id = last.ref AND
docs.c_id = last.c_id
)
WHERE
last.tool = '".TOOL_DOCUMENT."' AND
docs.c_id = {$_course['real_id']} AND
last.c_id = {$_course['real_id']} AND
docs.path LIKE '".Database::escape_string($path.$added_slash.'%')."' AND
docs.path NOT LIKE '" . Database::escape_string($path.$added_slash.'%/%')."' AND
docs.c_id = {$courseInfo['real_id']} AND
last.c_id = {$courseInfo['real_id']} AND
docs.path LIKE '".Database::escape_string($path.$addedSlash.'%')."' AND
docs.path NOT LIKE '" . Database::escape_string($path.$addedSlash.'%/%')."' AND
docs.path NOT LIKE '%_DELETED_%' AND
$userGroupFilter AND
last.visibility $visibility_bit
$condition_session
last.visibility $visibilityBit
$conditionSession
$sharedCondition
ORDER BY last.iid DESC, last.session_id DESC
";
$result = Database::query($sql);
$doc_list = [];
$document_data = [];
$is_allowed_to_edit = api_is_allowed_to_edit(null, true);
$documentData = [];
$isAllowedToEdit = api_is_allowed_to_edit(null, true);
$isCoach = api_is_coach();
if ($result !== false && Database::num_rows($result) != 0) {
$rows = [];
$hideInvisibleDocuments = api_get_configuration_value('hide_invisible_course_documents_in_sessions');
while ($row = Database::fetch_array($result, 'ASSOC')) {
if ($isCoach) {
// Looking for course items that are invisible to hide it in the session
if (in_array($row['id'], array_keys($doc_list))) {
if ($doc_list[$row['id']]['item_property_session_id'] == 0 &&
$doc_list[$row['id']]['session_id'] == 0
) {
if ($doc_list[$row['id']]['visibility'] == 0) {
unset($document_data[$row['id']]);
continue;
}
}
}
$doc_list[$row['id']] = $row;
if (isset($rows[$row['id']])) {
continue;
}
if (!$isCoach && !$is_allowed_to_edit) {
$doc_list[] = $row;
// If we are in session and hide_invisible_course_documents_in_sessions is enabled
// Then we avoid the documents that have visibility in session but that they come from a base course
if ($hideInvisibleDocuments && $sessionId) {
if ($row['item_property_session_id'] == $sessionId && empty($row['session_id'])) {
continue;
}
}
$rows[$row['id']] = $row;
}
// If we are in session and hide_invisible_course_documents_in_sessions is enabled
// Or if we are students
// Then don't list the invisible or deleted documents
if (($sessionId && $hideInvisibleDocuments) || (!$isCoach && !$isAllowedToEdit)) {
$rows = array_filter($rows, function ($row) {
if (in_array($row['visibility'], ['0', '2'])) {
return false;
}
return true;
});
}
foreach ($rows as $row) {
if ($row['filetype'] == 'file' &&
pathinfo($row['path'], PATHINFO_EXTENSION) == 'html'
) {
// Templates management
$table_template = Database::get_main_table(TABLE_MAIN_TEMPLATES);
$sql = "SELECT id FROM $table_template
$tblTemplate = Database::get_main_table(TABLE_MAIN_TEMPLATES);
$sql = "SELECT id FROM $tblTemplate
WHERE
course_code = '".$_course['code']."' AND
course_code = '".$courseInfo['code']."' AND
user_id = '".api_get_user_id()."' AND
ref_doc = '".$row['id']."'";
$template_result = Database::query($sql);
$row['is_template'] = (Database::num_rows($template_result) > 0) ? 1 : 0;
$templateResult = Database::query($sql);
$row['is_template'] = (Database::num_rows($templateResult) > 0) ? 1 : 0;
}
$row['basename'] = basename($row['path']);
// Just filling $document_data.
$document_data[$row['id']] = $row;
$documentData[$row['id']] = $row;
}
// Only for the student we filter the results see BT#1652
if (!$isCoach && !$is_allowed_to_edit) {
$ids_to_remove = [];
$my_repeat_ids = $temp = [];
// Selecting repeated ids
foreach ($doc_list as $row) {
if (in_array($row['id'], array_keys($temp))) {
$my_repeat_ids[] = $row['id'];
}
$temp[$row['id']] = $row;
}
//@todo use the self::is_visible function
// Checking visibility in a session
foreach ($my_repeat_ids as $id) {
foreach ($doc_list as $row) {
if ($id == $row['id']) {
if ($row['visibility'] == 0 && $row['item_property_session_id'] == 0) {
$delete_repeated[$id] = true;
}
if ($row['visibility'] == 0 && $row['item_property_session_id'] != 0) {
$delete_repeated[$id] = true;
}
}
}
}
foreach ($doc_list as $key => $row) {
if (in_array($row['visibility'], ['0', '2']) &&
!in_array($row['id'], $my_repeat_ids)
) {
$ids_to_remove[] = $row['id'];
unset($doc_list[$key]);
}
}
foreach ($document_data as $row) {
if (in_array($row['id'], $ids_to_remove)) {
unset($document_data[$row['id']]);
}
if (isset($delete_repeated[$row['id']]) && $delete_repeated[$row['id']]) {
unset($document_data[$row['id']]);
}
}
if (!$isCoach && !$isAllowedToEdit) {
// Checking parents visibility.
$final_document_data = [];
foreach ($document_data as $row) {
$is_visible = self::check_visibility_tree(
$finalDocumentData = [];
foreach ($documentData as $row) {
$isVisible = self::check_visibility_tree(
$row['id'],
$_course['code'],
$courseInfo['code'],
$sessionId,
api_get_user_id(),
$to_group_id
$toGroupId
);
if ($is_visible) {
$final_document_data[$row['id']] = $row;
if ($isVisible) {
$finalDocumentData[$row['id']] = $row;
}
}
} else {
$final_document_data = $document_data;
$finalDocumentData = $documentData;
}
return $final_document_data;
return $finalDocumentData;
} else {
return false;
}

@ -22,7 +22,7 @@ $group_disk_path = api_get_path(SYS_COURSE_PATH).$course_info['path'].'/document
$group_web_path = api_get_path(WEB_COURSE_PATH).$course_info['path'].'/document'.$groupdirpath.'/';
//get all group files and folders
$docs_and_folders = DocumentManager::get_all_document_data(
$docs_and_folders = DocumentManager::getAllDocumentData(
$course_info,
$groupdirpath,
$groupIid,

@ -15,7 +15,7 @@ $curdirpath='/images/gallery'; //path of library directory
$course_info = api_get_course_info();
// Get all files and folders
$docs_and_folders = DocumentManager::get_all_document_data(
$docs_and_folders = DocumentManager::getAllDocumentData(
$course_info,
$curdirpath,
0,

@ -25,7 +25,7 @@ $group_disk_path = api_get_path(SYS_COURSE_PATH).$course_info['path'].'/document
$group_web_path = api_get_path(WEB_COURSE_PATH).$course_info['path'].'/document'.$groupdirpath.'/';
//get all group files and folders
$docs_and_folders = DocumentManager::get_all_document_data(
$docs_and_folders = DocumentManager::getAllDocumentData(
$course_info,
$groupdirpath,
$groupIid,

@ -16,7 +16,7 @@ $curdirpath='/images/gallery'; //path of library directory
$course_info = api_get_course_info();
//get all files and folders
$docs_and_folders = DocumentManager::get_all_document_data(
$docs_and_folders = DocumentManager::getAllDocumentData(
$course_info,
$curdirpath,
0,

@ -298,7 +298,7 @@ class Rest extends WebService
}
$courseInfo = api_get_course_info_by_id($this->course->getId());
$documents = DocumentManager::get_all_document_data(
$documents = DocumentManager::getAllDocumentData(
$courseInfo,
$path,
0,

@ -762,6 +762,9 @@ ALTER TABLE skill_rel_item_rel_user ADD result_id INT DEFAULT NULL;
// LP view custom settings
// $_configuration['lp_view_settings'] = ['display' => ['show_reporting_icon' => true]];
// Force to hide the invisible course documents in sessions
//$_configuration['hide_invisible_course_documents_in_sessions'] = false;
// Show more expected choice and status in exercise results BT#13950
//$_configuration['show_exercise_expected_choice'] = false;

Loading…
Cancel
Save