diff --git a/mod/forum/lib.php b/mod/forum/lib.php index 39c27ccd95e..83a7bc22ca0 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -1338,86 +1338,6 @@ function forum_search_posts($searchterms, $courseid=0, $limitfrom=0, $limitnum=5 return $DB->get_records_sql($searchsql, $params, $limitfrom, $limitnum); } -/** - * Returns a list of all new posts that have not been mailed yet - * - * @param int $starttime posts created after this time - * @param int $endtime posts created before this - * @param int $now used for timed discussions only - * @return array - */ -function forum_get_unmailed_posts($starttime, $endtime, $now=null) { - global $CFG, $DB; - - $params = array(); - $params['mailed'] = FORUM_MAILED_PENDING; - $params['ptimestart'] = $starttime; - $params['ptimeend'] = $endtime; - $params['mailnow'] = 1; - - if (!empty($CFG->forum_enabletimedposts)) { - if (empty($now)) { - $now = time(); - } - $selectsql = "AND (p.created >= :ptimestart OR d.timestart >= :pptimestart)"; - $params['pptimestart'] = $starttime; - $timedsql = "AND (d.timestart < :dtimestart AND (d.timeend = 0 OR d.timeend > :dtimeend))"; - $params['dtimestart'] = $now; - $params['dtimeend'] = $now; - } else { - $timedsql = ""; - $selectsql = "AND p.created >= :ptimestart"; - } - - return $DB->get_records_sql("SELECT p.*, d.course, d.forum - FROM {forum_posts} p - JOIN {forum_discussions} d ON d.id = p.discussion - WHERE p.mailed = :mailed - $selectsql - AND (p.created < :ptimeend OR p.mailnow = :mailnow) - $timedsql - ORDER BY p.modified ASC", $params); -} - -/** - * Marks posts before a certain time as being mailed already - * - * @global object - * @global object - * @param int $endtime - * @param int $now Defaults to time() - * @return bool - */ -function forum_mark_old_posts_as_mailed($endtime, $now=null) { - global $CFG, $DB; - - if (empty($now)) { - $now = time(); - } - - $params = array(); - $params['mailedsuccess'] = FORUM_MAILED_SUCCESS; - $params['now'] = $now; - $params['endtime'] = $endtime; - $params['mailnow'] = 1; - $params['mailedpending'] = FORUM_MAILED_PENDING; - - if (empty($CFG->forum_enabletimedposts)) { - return $DB->execute("UPDATE {forum_posts} - SET mailed = :mailedsuccess - WHERE (created < :endtime OR mailnow = :mailnow) - AND mailed = :mailedpending", $params); - } else { - return $DB->execute("UPDATE {forum_posts} - SET mailed = :mailedsuccess - WHERE discussion NOT IN (SELECT d.id - FROM {forum_discussions} d - WHERE d.timestart > :now) - AND (created < :endtime OR mailnow = :mailnow) - AND mailed = :mailedpending", $params); - } -} - /** * Get all the posts for a user in a forum suitable for forum_print_post * diff --git a/mod/forum/tests/lib_test.php b/mod/forum/tests/lib_test.php index cce78611b44..8099d0cffa7 100644 --- a/mod/forum/tests/lib_test.php +++ b/mod/forum/tests/lib_test.php @@ -2961,65 +2961,6 @@ class mod_forum_lib_testcase extends advanced_testcase { $this->assertEmpty($neighbours['next']); } - /** - * @dataProvider forum_get_unmailed_posts_provider - */ - public function test_forum_get_unmailed_posts($discussiondata, $enabletimedposts, $expectedcount, $expectedreplycount) { - global $CFG, $DB; - - $this->resetAfterTest(); - - // Configure timed posts. - $CFG->forum_enabletimedposts = $enabletimedposts; - - $course = $this->getDataGenerator()->create_course(); - $forum = $this->getDataGenerator()->create_module('forum', ['course' => $course->id]); - $user = $this->getDataGenerator()->create_user(); - $forumgen = $this->getDataGenerator()->get_plugin_generator('mod_forum'); - - // Keep track of the start time of the test. Do not use time() after this point to prevent random failures. - $time = time(); - - $record = new stdClass(); - $record->course = $course->id; - $record->userid = $user->id; - $record->forum = $forum->id; - if (isset($discussiondata['timecreated'])) { - $record->timemodified = $time + $discussiondata['timecreated']; - } - if (isset($discussiondata['timestart'])) { - $record->timestart = $time + $discussiondata['timestart']; - } - if (isset($discussiondata['timeend'])) { - $record->timeend = $time + $discussiondata['timeend']; - } - if (isset($discussiondata['mailed'])) { - $record->mailed = $discussiondata['mailed']; - } - - $discussion = $forumgen->create_discussion($record); - - // Fetch the unmailed posts. - $timenow = $time; - $endtime = $timenow - $CFG->maxeditingtime; - $starttime = $endtime - 2 * DAYSECS; - - $unmailed = forum_get_unmailed_posts($starttime, $endtime, $timenow); - $this->assertCount($expectedcount, $unmailed); - - // Add a reply just outside the maxeditingtime. - $replyto = $DB->get_record('forum_posts', array('discussion' => $discussion->id)); - $reply = new stdClass(); - $reply->userid = $user->id; - $reply->discussion = $discussion->id; - $reply->parent = $replyto->id; - $reply->created = max($replyto->created, $endtime - 1); - $forumgen->create_post($reply); - - $unmailed = forum_get_unmailed_posts($starttime, $endtime, $timenow); - $this->assertCount($expectedreplycount, $unmailed); - } - /** * Test for forum_is_author_hidden. */ @@ -3055,163 +2996,6 @@ class mod_forum_lib_testcase extends advanced_testcase { forum_is_author_hidden($post, $forum); } - public function forum_get_unmailed_posts_provider() { - return [ - 'Untimed discussion; Single post; maxeditingtime not expired' => [ - 'discussion' => [ - ], - 'timedposts' => false, - 'postcount' => 0, - 'replycount' => 0, - ], - 'Untimed discussion; Single post; maxeditingtime expired' => [ - 'discussion' => [ - 'timecreated' => - DAYSECS, - ], - 'timedposts' => false, - 'postcount' => 1, - 'replycount' => 2, - ], - 'Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime not expired' => [ - 'discussion' => [ - 'timecreated' => - WEEKSECS, - 'timestart' => 0, - ], - 'timedposts' => true, - 'postcount' => 0, - 'replycount' => 0, - ], - 'Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime expired' => [ - 'discussion' => [ - 'timecreated' => - WEEKSECS, - 'timestart' => - DAYSECS, - ], - 'timedposts' => true, - 'postcount' => 1, - 'replycount' => 2, - ], - 'Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime expired; timeend not reached' => [ - 'discussion' => [ - 'timecreated' => - WEEKSECS, - 'timestart' => - DAYSECS, - 'timeend' => + DAYSECS - ], - 'timedposts' => true, - 'postcount' => 1, - 'replycount' => 2, - ], - 'Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime expired; timeend passed' => [ - 'discussion' => [ - 'timecreated' => - WEEKSECS, - 'timestart' => - DAYSECS, - 'timeend' => - HOURSECS, - ], - 'timedposts' => true, - 'postcount' => 0, - 'replycount' => 0, - ], - 'Timed discussion; Single post; Posted 1 week ago; timeend not reached' => [ - 'discussion' => [ - 'timecreated' => - WEEKSECS, - 'timeend' => + DAYSECS - ], - 'timedposts' => true, - 'postcount' => 0, - 'replycount' => 1, - ], - 'Timed discussion; Single post; Posted 1 week ago; timeend passed' => [ - 'discussion' => [ - 'timecreated' => - WEEKSECS, - 'timeend' => - DAYSECS, - ], - 'timedposts' => true, - 'postcount' => 0, - 'replycount' => 0, - ], - - 'Previously mailed; Untimed discussion; Single post; maxeditingtime not expired' => [ - 'discussion' => [ - 'mailed' => 1, - ], - 'timedposts' => false, - 'postcount' => 0, - 'replycount' => 0, - ], - - 'Previously mailed; Untimed discussion; Single post; maxeditingtime expired' => [ - 'discussion' => [ - 'timecreated' => - DAYSECS, - 'mailed' => 1, - ], - 'timedposts' => false, - 'postcount' => 0, - 'replycount' => 1, - ], - 'Previously mailed; Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime not expired' => [ - 'discussion' => [ - 'timecreated' => - WEEKSECS, - 'timestart' => 0, - 'mailed' => 1, - ], - 'timedposts' => true, - 'postcount' => 0, - 'replycount' => 0, - ], - 'Previously mailed; Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime expired' => [ - 'discussion' => [ - 'timecreated' => - WEEKSECS, - 'timestart' => - DAYSECS, - 'mailed' => 1, - ], - 'timedposts' => true, - 'postcount' => 0, - 'replycount' => 1, - ], - 'Previously mailed; Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime expired; timeend not reached' => [ - 'discussion' => [ - 'timecreated' => - WEEKSECS, - 'timestart' => - DAYSECS, - 'timeend' => + DAYSECS, - 'mailed' => 1, - ], - 'timedposts' => true, - 'postcount' => 0, - 'replycount' => 1, - ], - 'Previously mailed; Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime expired; timeend passed' => [ - 'discussion' => [ - 'timecreated' => - WEEKSECS, - 'timestart' => - DAYSECS, - 'timeend' => - HOURSECS, - 'mailed' => 1, - ], - 'timedposts' => true, - 'postcount' => 0, - 'replycount' => 0, - ], - 'Previously mailed; Timed discussion; Single post; Posted 1 week ago; timeend not reached' => [ - 'discussion' => [ - 'timecreated' => - WEEKSECS, - 'timeend' => + DAYSECS, - 'mailed' => 1, - ], - 'timedposts' => true, - 'postcount' => 0, - 'replycount' => 1, - ], - 'Previously mailed; Timed discussion; Single post; Posted 1 week ago; timeend passed' => [ - 'discussion' => [ - 'timecreated' => - WEEKSECS, - 'timeend' => - DAYSECS, - 'mailed' => 1, - ], - 'timedposts' => true, - 'postcount' => 0, - 'replycount' => 0, - ], - ]; - } - /** * Test the forum_discussion_is_locked function. *