<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Forum class.
*
* @package mod_forum
* @copyright 2019 Ryan Wyllie <ryan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_forum\local\entities;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot . '/mod/forum/lib.php');
require_once($CFG->dirroot . '/rating/lib.php');
use mod_forum\local\entities\discussion as discussion_entity;
use context;
use stdClass;
/**
* Forum class.
*
* @copyright 2019 Ryan Wyllie <ryan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class forum {
/** @var context $context The forum module context */
private $context;
/** @var stdClass $coursemodule The forum course module record */
private $coursemodule;
/** @var stdClass $course The forum course record */
private $course;
/** @var int $effectivegroupmode The effective group mode */
private $effectivegroupmode;
/** @var int $id ID */
private $id;
/** @var int $courseid Id of the course this forum is in */
private $courseid;
/** @var string $type The forum type, e.g. single, qanda, etc */
private $type;
/** @var string $name Name of the forum */
private $name;
/** @var string $intro Intro text */
private $intro;
/** @var int $introformat Format of the intro text */
private $introformat;
/** @var int $assessed The forum rating aggregate */
private $assessed;
/** @var int $assesstimestart Timestamp to begin assessment */
private $assesstimestart;
/** @var int $assesstimefinish Timestamp to end assessment */
private $assesstimefinish;
/** @var int $scale The rating scale */
private $scale;
/** @var int $gradeforum The grade for the forum when grading holistically */
private $gradeforum;
/** @var bool $gradeforumnotify Whether to notify students when the forum is graded holistically */
private $gradeforumnotify;
/** @var int $maxbytes Maximum attachment size */
private $maxbytes;
/** @var int $maxattachments Maximum number of attachments */
private $maxattachments;
/** @var int $forcesubscribe Does the forum force users to subscribe? */
private $forcesubscribe;
/** @var int $trackingtype Tracking type */
private $trackingtype;
/** @var int $rsstype RSS type */
private $rsstype;
/** @var int $rssarticles RSS articles */
private $rssarticles;
/** @var int $timemodified Timestamp when the forum was last modified */
private $timemodified;
/** @var int $warnafter Warn after */
private $warnafter;
/** @var int $blockafter Block after */
private $blockafter;
/** @var int $blockperiod Block period */
private $blockperiod;
/** @var int $completiondiscussions Completion discussions */
private $completiondiscussions;
/** @var int $completionreplies Completion replies */
private $completionreplies;
/** @var int $completionposts Completion posts */
private $completionposts;
< /** @var bool $displaywordcounts Should display word counts in posts */
< private $displaywordcounts;
> /** @var bool $displaywordcount Should display word counts in posts */
> private $displaywordcount;
/** @var bool $lockdiscussionafter Timestamp after which discussions should be locked */
private $lockdiscussionafter;
/** @var int $duedate Timestamp that represents the due date for forum posts */
private $duedate;
/** @var int $cutoffdate Timestamp after which forum posts will no longer be accepted */
private $cutoffdate;
/**
* Constructor
*
* @param context $context The forum module context
* @param stdClass $coursemodule The forum course module record
* @param stdClass $course The forum course record
* @param int $effectivegroupmode The effective group mode
* @param int $id ID
* @param int $courseid Id of the course this forum is in
* @param string $type The forum type, e.g. single, qanda, etc
* @param string $name Name of the forum
* @param string $intro Intro text
* @param int $introformat Format of the intro text
* @param int $assessed The forum rating aggregate
* @param int $assesstimestart Timestamp to begin assessment
* @param int $assesstimefinish Timestamp to end assessment
* @param int $scale The rating scale
* @param int $gradeforum The holistic grade
* @param bool $gradeforumnotify Default for whether to notify students when grade holistically
* @param int $maxbytes Maximum attachment size
* @param int $maxattachments Maximum number of attachments
* @param int $forcesubscribe Does the forum force users to subscribe?
* @param int $trackingtype Tracking type
* @param int $rsstype RSS type
* @param int $rssarticles RSS articles
* @param int $timemodified Timestamp when the forum was last modified
* @param int $warnafter Warn after
* @param int $blockafter Block after
* @param int $blockperiod Block period
* @param int $completiondiscussions Completion discussions
* @param int $completionreplies Completion replies
* @param int $completionposts Completion posts
* @param bool $displaywordcount Should display word counts in posts
* @param int $lockdiscussionafter Timestamp after which discussions should be locked
* @param int $duedate Timestamp that represents the due date for forum posts
* @param int $cutoffdate Timestamp after which forum posts will no longer be accepted
*/
public function __construct(
context $context,
stdClass $coursemodule,
stdClass $course,
int $effectivegroupmode,
int $id,
int $courseid,
string $type,
string $name,
string $intro,
int $introformat,
int $assessed,
int $assesstimestart,
int $assesstimefinish,
int $scale,
int $gradeforum,
bool $gradeforumnotify,
int $maxbytes,
int $maxattachments,
int $forcesubscribe,
int $trackingtype,
int $rsstype,
int $rssarticles,
int $timemodified,
int $warnafter,
int $blockafter,
int $blockperiod,
int $completiondiscussions,
int $completionreplies,
int $completionposts,
bool $displaywordcount,
int $lockdiscussionafter,
int $duedate,
int $cutoffdate
) {
$this->context = $context;
$this->coursemodule = $coursemodule;
$this->course = $course;
$this->effectivegroupmode = $effectivegroupmode;
$this->id = $id;
$this->courseid = $courseid;
$this->type = $type;
$this->name = $name;
$this->intro = $intro;
$this->introformat = $introformat;
$this->assessed = $assessed;
$this->assesstimestart = $assesstimestart;
$this->assesstimefinish = $assesstimefinish;
$this->scale = $scale;
$this->gradeforum = $gradeforum;
$this->gradeforumnotify = $gradeforumnotify;
$this->maxbytes = $maxbytes;
$this->maxattachments = $maxattachments;
$this->forcesubscribe = $forcesubscribe;
$this->trackingtype = $trackingtype;
$this->rsstype = $rsstype;
$this->rssarticles = $rssarticles;
$this->timemodified = $timemodified;
$this->warnafter = $warnafter;
$this->blockafter = $blockafter;
$this->blockperiod = $blockperiod;
$this->completiondiscussions = $completiondiscussions;
$this->completionreplies = $completionreplies;
$this->completionposts = $completionposts;
$this->displaywordcount = $displaywordcount;
$this->lockdiscussionafter = $lockdiscussionafter;
$this->duedate = $duedate;
$this->cutoffdate = $cutoffdate;
}
/**
* Get the forum module context.
*
* @return context
*/
public function get_context() : context {
return $this->context;
}
/**
* Get the forum course module record
*
* @return stdClass
*/
public function get_course_module_record() : stdClass {
return $this->coursemodule;
}
/**
* Get the effective group mode.
*
* @return int
*/
public function get_effective_group_mode() : int {
return $this->effectivegroupmode;
}
/**
* Check if the forum is set to group mode.
*
* @return bool
*/
public function is_in_group_mode() : bool {
return $this->get_effective_group_mode() !== NOGROUPS;
}
/**
* Get the course record.
*
* @return stdClass
*/
public function get_course_record() : stdClass {
return $this->course;
}
/**
* Get the forum id.
*
* @return int
*/
public function get_id() : int {
return $this->id;
}
/**
* Get the id of the course that the forum belongs to.
*
* @return int
*/
public function get_course_id() : int {
return $this->courseid;
}
/**
* Get the forum type.
*
* @return string
*/
public function get_type() : string {
return $this->type;
}
/**
* Get the forum name.
*
* @return string
*/
public function get_name() : string {
return $this->name;
}
/**
* Get the forum intro text.
*
* @return string
*/
public function get_intro() : string {
return $this->intro;
}
/**
* Get the forum intro text format.
*
* @return int
*/
public function get_intro_format() : int {
return $this->introformat;
}
/**
* Get the rating aggregate.
*
* @return int
*/
public function get_rating_aggregate() : int {
return $this->assessed;
}
/**
* Does the forum have a rating aggregate?
*
* @return bool
*/
public function has_rating_aggregate() : bool {
return $this->get_rating_aggregate() != RATING_AGGREGATE_NONE;
}
/**
* Get the timestamp for when the assessment period begins.
*
* @return int
*/
public function get_assess_time_start() : int {
return $this->assesstimestart;
}
/**
* Get the timestamp for when the assessment period ends.
*
* @return int
*/
public function get_assess_time_finish() : int {
return $this->assesstimefinish;
}
/**
* Get the rating scale.
*
* @return int
*/
public function get_scale() : int {
return $this->scale;
}
/**
* Get the grade for the forum when grading holistically.
*
* @return int
*/
public function get_grade_for_forum() : int {
return $this->gradeforum;
}
/**
* Whether grading is enabled for this item.
*
* @return bool
*/
public function is_grading_enabled(): bool {
return $this->get_grade_for_forum() !== 0;
}
/**
* Get the default for whether the students should be notified when grading holistically.
*
* @return bool
*/
public function should_notify_students_default_when_grade_for_forum(): bool {
return $this->gradeforumnotify;
}
/**
* Get the maximum bytes.
*
* @return int
*/
public function get_max_bytes() : int {
return $this->maxbytes;
}
/**
* Get the maximum number of attachments.
*
* @return int
*/
public function get_max_attachments() : int {
return $this->maxattachments;
}
/**
* Get the subscription mode.
*
* @return int
*/
public function get_subscription_mode() : int {
return $this->forcesubscribe;
}
/**
* Is the subscription mode set to optional.
*
* @return bool
*/
public function is_subscription_optional() : bool {
return $this->get_subscription_mode() === FORUM_CHOOSESUBSCRIBE;
}
/**
* Is the subscription mode set to forced.
*
* @return bool
*/
public function is_subscription_forced() : bool {
return $this->get_subscription_mode() === FORUM_FORCESUBSCRIBE;
}
/**
* Is the subscription mode set to automatic.
*
* @return bool
*/
public function is_subscription_automatic() : bool {
return $this->get_subscription_mode() === FORUM_INITIALSUBSCRIBE;
}
/**
* Is the subscription mode set to disabled.
*
* @return bool
*/
public function is_subscription_disabled() : bool {
return $this->get_subscription_mode() === FORUM_DISALLOWSUBSCRIBE;
}
/**
* Get the tracking type.
*
* @return int
*/
public function get_tracking_type() : int {
return $this->trackingtype;
}
/**
* Get the RSS type.
*
* @return int
*/
public function get_rss_type() : int {
return $this->rsstype;
}
/**
* Get the RSS articles.
*
* @return int
*/
public function get_rss_articles() : int {
return $this->rssarticles;
}
/**
* Get the timestamp for when the forum was last modified.
*
* @return int
*/
public function get_time_modified() : int {
return $this->timemodified;
}
/**
* Get warn after.
*
* @return int
*/
public function get_warn_after() : int {
return $this->warnafter;
}
/**
* Get block after.
*
* @return int
*/
public function get_block_after() : int {
return $this->blockafter;
}
/**
* Get the block period.
*
* @return int
*/
public function get_block_period() : int {
return $this->blockperiod;
}
/**
* Does the forum have blocking enabled?
*
* @return bool
*/
public function has_blocking_enabled() : bool {
return !empty($this->get_block_after()) && !empty($this->get_block_period());
}
/**
* Get the completion discussions.
*
* @return int
*/
public function get_completion_discussions() : int {
return $this->completiondiscussions;
}
/**
* Get the completion replies.
*
* @return int
*/
public function get_completion_replies() : int {
return $this->completionreplies;
}
/**
* Get the completion posts.
*
* @return int
*/
public function get_completion_posts() : int {
return $this->completionposts;
}
/**
* Should the word counts be shown in the posts?
*
* @return bool
*/
public function should_display_word_count() : bool {
return $this->displaywordcount;
}
/**
* Get the timestamp after which the discussion should be locked.
*
* @return int
*/
public function get_lock_discussions_after() : int {
return $this->lockdiscussionafter;
}
/**
* Does the forum have a discussion locking timestamp?
*
* @return bool
*/
public function has_lock_discussions_after() : bool {
return !empty($this->get_lock_discussions_after());
}
/**
* Check whether the discussion is locked based on forum's time based locking criteria
*
* @param discussion_entity $discussion
* @return bool
*/
public function is_discussion_time_locked(discussion_entity $discussion) : bool {
if (!$this->has_lock_discussions_after()) {
return false;
}
if ($this->get_type() === 'single') {
// It does not make sense to lock a single discussion forum.
return false;
}
return (($discussion->get_time_modified() + $this->get_lock_discussions_after()) < time());
}
/**
* Get the cutoff date.
*
* @return int
*/
public function get_cutoff_date() : int {
return $this->cutoffdate;
}
/**
* Does the forum have a cutoff date?
*
* @return bool
*/
public function has_cutoff_date() : bool {
return !empty($this->get_cutoff_date());
}
/**
* Is the cutoff date for the forum reached?
*
* @return bool
*/
public function is_cutoff_date_reached() : bool {
if ($this->has_cutoff_date() && ($this->get_cutoff_date() < time())) {
return true;
}
return false;
}
/**
* Get the due date.
*
* @return int
*/
public function get_due_date() : int {
return $this->duedate;
}
/**
* Does the forum have a due date?
*
* @return bool
*/
public function has_due_date() : bool {
return !empty($this->get_due_date());
}
/**
* Is the due date for the forum reached?
*
* @return bool
*/
public function is_due_date_reached() : bool {
if ($this->has_due_date() && ($this->get_due_date() < time())) {
return true;
}
return false;
}
/**
* Is the discussion locked? - Takes into account both discussion settings AND forum's criteria
*
* @param discussion_entity $discussion The discussion to check
* @return bool
*/
public function is_discussion_locked(discussion_entity $discussion) : bool {
if ($discussion->is_locked()) {
return true;
}
return $this->is_discussion_time_locked($discussion);
}
}