From ad0f69061fab98486d94aa39e496b29506e4d06e Mon Sep 17 00:00:00 2001 From: jmontoyaa Date: Fri, 14 Apr 2017 15:20:13 +0200 Subject: [PATCH] Change moderated workflow see BT#10894 If forum is moderated and user are able to edit posts: - Student send post (status = "waiting moderation") - Teacher rejects the post - Student can see his post and can edit the post. After editing the post changes to "waiting moderation" (automatically) - Teacher accepts the post. - Student can't change the published post. --- main/forum/forumfunction.inc.php | 43 +++++++++++++++++++++------- main/forum/viewthread.php | 12 +++----- main/forum/viewthread_flat.inc.php | 35 +++++++++++----------- main/forum/viewthread_nested.inc.php | 14 +++++---- 4 files changed, 63 insertions(+), 41 deletions(-) diff --git a/main/forum/forumfunction.inc.php b/main/forum/forumfunction.inc.php index 7df01fe5a2..f44359dd35 100755 --- a/main/forum/forumfunction.inc.php +++ b/main/forum/forumfunction.inc.php @@ -1985,13 +1985,13 @@ function getPosts( ->addCriteria($criteria) ->addOrderBy('p.postId', $orderDirection); - if ($filterModerated && $forumInfo['moderated'] == 1) { if (!api_is_allowed_to_edit(false, true)) { $userId = api_get_user_id(); $qb->andWhere( "p.status = 1 OR (p.status = ".CForumPost::STATUS_WAITING_MODERATION." AND p.posterId = $userId) OR + (p.status = ".CForumPost::STATUS_REJECTED." AND p.posterId = $userId) OR (p.status IS NULL AND p.posterId = $userId) " ); @@ -3564,7 +3564,7 @@ function show_edit_post_form( $form->addElement('html', ''); } - if ($current_forum['moderated']) { + if ($current_forum['moderated'] && api_is_allowed_to_edit(null, true)) { $group = array(); $group[] = $form->createElement('radio', 'status', null, get_lang('Validated'), 1); $group[] = $form->createElement('radio', 'status', null, get_lang('WaitingModeration'), 2); @@ -3687,19 +3687,27 @@ function store_edit_post($forumInfo, $values) } $status = ''; + $updateStatus = false; if ($forumInfo['moderated']) { - $status = $values['status']['status']; + if (api_is_allowed_to_edit(null, true)) { + $status = $values['status']['status']; + $updateStatus = true; + } else { + $status = CForumPost::STATUS_WAITING_MODERATION; + $updateStatus = true; + } } // Update the post_title and the post_text. $params = [ - 'status' => $status, 'post_title' => $values['post_title'], 'post_text' => $values['post_text'], 'post_notification' => isset($values['post_notification']) ? $values['post_notification'] : '', ]; + if ($updateStatus) { + $params['status'] = $status; + } $where = ['c_id = ? AND post_id = ?' => [$course_id, $values['post_id']]]; - Database::update($table_posts, $params, $where); // Update attached files @@ -5968,8 +5976,13 @@ function getPostStatus($current_forum, $row, $addWrapper = true) $row['status'] = empty($row['status']) ? 2 : $row['status']; $addUrl = false; + $showStatus = false; if (api_is_allowed_to_edit(false, true)) { $addUrl = true; + } else { + if ($row['user_id'] == api_get_user_id()) { + $showStatus = true; + } } $label = ''; @@ -6002,10 +6015,12 @@ function getPostStatus($current_forum, $row, $addWrapper = true) ['class' => 'change_post_status'] ); } else { - $statusIcon .= Display::label( - Display::returnFontAwesomeIcon($icon).$label, - $buttonType - ); + if ($showStatus) { + $statusIcon .= Display::label( + Display::returnFontAwesomeIcon($icon).$label, + $buttonType + ); + } } if ($addWrapper) { @@ -6059,9 +6074,15 @@ function postIsEditableByStudent($forum, $post) if (is_null($post['status'])) { return true; } else { - return $post['status'] == CForumPost::STATUS_WAITING_MODERATION; + return in_array($post['status'], + [ + CForumPost::STATUS_WAITING_MODERATION, + CForumPost::STATUS_REJECTED, + ] + ); } } else { return true; } -} \ No newline at end of file +} + diff --git a/main/forum/viewthread.php b/main/forum/viewthread.php index 5e7a4705db..ccfbbf164f 100755 --- a/main/forum/viewthread.php +++ b/main/forum/viewthread.php @@ -125,8 +125,7 @@ if (!empty($groupId)) { // If the user is not a course administrator and the forum is hidden // then the user is not allowed here. -if ( - !api_is_allowed_to_edit(false, true) && +if (!api_is_allowed_to_edit(false, true) && ($current_forum['visibility'] == 0 || $current_thread['visibility'] == 0) ) { api_not_allowed(false); @@ -134,8 +133,7 @@ if ( /* Actions */ $my_action = isset($_GET['action']) ? $_GET['action'] : ''; -if ( - $my_action == 'delete' && +if ($my_action == 'delete' && isset($_GET['content']) && isset($_GET['id']) && (api_is_allowed_to_edit(false, true) || @@ -181,8 +179,7 @@ if ($my_message != 'PostDeletedSpecial') { // The reply to thread link should only appear when the forum_category is // not locked AND the forum is not locked AND the thread is not locked. // If one of the three levels is locked then the link should not be displayed. - if ( - ($current_forum_category && + if (($current_forum_category && $current_forum_category['locked'] == 0) && $current_forum['locked'] == 0 && $current_thread['locked'] == 0 || @@ -199,8 +196,7 @@ if ($my_message != 'PostDeletedSpecial') { . ''; } // new thread link - if ( - ( + if (( api_is_allowed_to_edit(false, true) && !(api_is_course_coach() && $current_forum['session_id'] != $sessionId) ) || diff --git a/main/forum/viewthread_flat.inc.php b/main/forum/viewthread_flat.inc.php index 29f4319b98..2d5cabcd9e 100755 --- a/main/forum/viewthread_flat.inc.php +++ b/main/forum/viewthread_flat.inc.php @@ -30,17 +30,14 @@ if (isset($current_thread['thread_id'])) { $increment = 0; $clean_forum_id = intval($_GET['forum']); $clean_thread_id = intval($_GET['thread']); - $locked = api_resource_is_locked_by_gradebook( $clean_thread_id, LINK_FORUM_THREAD ); $closedPost = null; - if (!empty($rows)) { $postCount = count($rows); - foreach ($rows as $row) { if ($row['user_id'] == '0') { $name = prepare4display($row['poster_name']); @@ -141,13 +138,13 @@ if (isset($current_thread['thread_id'])) { if ($origin != 'learnpath') { $html .= Display::tag( 'p', - api_convert_and_format_date($row['post_date']), + Display::dateToStringAgoAndLongDate($row['post_date']), array('class' => 'post-date') ); } else { $html .= Display::tag( 'p', - api_convert_and_format_date($row['post_date'], DATE_TIME_FORMAT_SHORT), + Display::dateToStringAgoAndLongDate($row['post_date']), array('class' => 'text-muted') ); } @@ -157,8 +154,6 @@ if (isset($current_thread['thread_id'])) { $id_attach = !empty($attachment_list) ? $attachment_list['iid'] : ''; $iconEdit = ''; $statusIcon = ''; - - // The user who posted it can edit his thread only if the course admin allowed // this in the properties of the forum // The course admin him/herself can do this off course always @@ -171,7 +166,7 @@ if (isset($current_thread['thread_id'])) { ) ) { if (api_is_allowed_to_session_edit(false, true)) { - if ($locked == false) { + if ($locked == false && postIsEditableByStudent($current_forum, $row)) { $iconEdit .= "" @@ -206,13 +201,13 @@ if (isset($current_thread['thread_id'])) { } } - if ( - GroupManager::is_tutor_of_group($userId, $groupInfo) || - (api_is_allowed_to_edit(false, true) && - !(api_is_course_coach() && $current_forum['session_id'] != $sessionId) - ) + $statusIcon = getPostStatus($current_forum, $row); + + if (GroupManager::is_tutor_of_group($userId, $groupInfo) || + (api_is_allowed_to_edit(false, true) && + !(api_is_course_coach() && $current_forum['session_id'] != $sessionId) + ) ) { - $statusIcon = getPostStatus($current_forum, $row); $iconEdit .= return_visible_invisible_icon( 'post', $row['post_id'], @@ -245,9 +240,12 @@ if (isset($current_thread['thread_id'])) { } $userCanEdit = $current_thread['thread_peer_qualify'] == 1 && $row['poster_id'] != $userId; + /*if ($row['poster_id'] != $userId && $current_forum['moderated'] == 1 && $row['status']) { + }*/ if (api_is_allowed_to_edit(null, true)) { $userCanEdit = true; } + if ($increment > 0 && $locked == false && $userCanEdit) { $iconEdit .= " "; } } - if ($iconEdit != '') { - $html .= '
' . $iconEdit . $statusIcon.'
'; + + if (!empty($iconEdit)) { + $html .= '
'.$iconEdit.' '.$statusIcon.'
'; + } else { + if (!empty(strip_tags($statusIcon))) { + $html .= '
'.$statusIcon.'
'; + } } $html .= $closedPost; $html .= ''; diff --git a/main/forum/viewthread_nested.inc.php b/main/forum/viewthread_nested.inc.php index b6debbfaea..78b274bd28 100755 --- a/main/forum/viewthread_nested.inc.php +++ b/main/forum/viewthread_nested.inc.php @@ -23,7 +23,7 @@ if (isset($_GET['action']) && // Decide whether we show the latest post first $sortDirection = isset($_GET['posts_order']) && $_GET['posts_order'] === 'desc' ? 'DESC' : ($origin != 'learnpath' ? 'ASC' : 'DESC'); -$rows = getPosts($current_forum, $_GET['thread'], $sortDirection, true); +$posts = getPosts($current_forum, $_GET['thread'], $sortDirection, true); $count = 0; $clean_forum_id = intval($_GET['forum']); $clean_thread_id = intval($_GET['thread']); @@ -37,7 +37,7 @@ $postCount = 1; $allowUserImageForum = api_get_course_setting('allow_user_image_forum'); -foreach ($rows as $post) { +foreach ($posts as $post) { // The style depends on the status of the message: approved or not. if ($post['visible'] == '0') { $titleclass = 'forum_message_post_title_2_be_approved'; @@ -162,8 +162,7 @@ foreach ($rows as $post) { } } - if ( - api_is_allowed_to_edit(false, true) && + if (api_is_allowed_to_edit(false, true) && !( api_is_course_coach() && $current_forum['session_id'] != $sessionId @@ -213,9 +212,12 @@ foreach ($rows as $post) { } $statusIcon = getPostStatus($current_forum, $post); - - if ($iconEdit != '') { + if (!empty($iconEdit)) { $html .= '
'.$iconEdit.' '.$statusIcon.'
'; + } else { + if (!empty(strip_tags($statusIcon))) { + $html .= '
'.$statusIcon.'
'; + } } $buttonReply = '';