diff --git a/mod/forum/classes/subscriptions.php b/mod/forum/classes/subscriptions.php index 8f7aa2fea65..ada9b4d9e96 100644 --- a/mod/forum/classes/subscriptions.php +++ b/mod/forum/classes/subscriptions.php @@ -825,4 +825,39 @@ class subscriptions { return true; } + /** + * Gets the default subscription value for the logged in user. + * + * @param \stdClass $forum The forum record + * @param \context $context The course context + * @param \cm_info $cm cm_info + * @param int|null $discussionid The discussion we are checking against + * @return bool Default subscription + * @throws coding_exception + */ + public static function get_user_default_subscription($forum, $context, $cm, $discussionid = null) { + global $USER; + $manageactivities = has_capability('moodle/course:manageactivities', $context); + if (self::subscription_disabled($forum) && !$manageactivities) { + // User does not have permission to subscribe to this discussion at all. + $discussionsubscribe = false; + } else if (self::is_forcesubscribed($forum)) { + // User does not have permission to unsubscribe from this discussion at all. + $discussionsubscribe = true; + } else { + if (isset($discussion) && self::is_subscribed($USER->id, $forum, $discussionid, $cm)) { + // User is subscribed to the discussion - continue the subscription. + $discussionsubscribe = true; + } else if (!isset($discussionid) && self::is_subscribed($USER->id, $forum, null, $cm)) { + // Starting a new discussion, and the user is subscribed to the forum - subscribe to the discussion. + $discussionsubscribe = true; + } else { + // User is not subscribed to either forum or discussion. Follow user preference. + $discussionsubscribe = $USER->autosubscribe ? $USER->autosubscribe : false; + } + } + + return $discussionsubscribe; + } + } diff --git a/mod/forum/externallib.php b/mod/forum/externallib.php index a92d3bd5b05..6a0aaa0b19b 100644 --- a/mod/forum/externallib.php +++ b/mod/forum/externallib.php @@ -823,9 +823,14 @@ class mod_forum_external extends external_api { $context = context_module::instance($cm->id); self::validate_context($context); + $coursecontext = \context_course::instance($course->id); + $discussionsubscribe = \mod_forum\subscriptions::get_user_default_subscription($forum, $coursecontext, + $cm, null); + // Validate options. $options = array( - 'discussionsubscribe' => true, + 'discussionsubscribe' => $discussionsubscribe, + 'private' => false, 'inlineattachmentsid' => 0, 'attachmentsid' => null ); @@ -896,9 +901,11 @@ class mod_forum_external extends external_api { $completion->update_state($cm, COMPLETION_COMPLETE); } - $settings = new stdClass(); - $settings->discussionsubscribe = $options['discussionsubscribe']; - forum_post_subscription($settings, $forum, $discussion); + if ($options['discussionsubscribe']) { + $settings = new stdClass(); + $settings->discussionsubscribe = $options['discussionsubscribe']; + forum_post_subscription($settings, $forum, $discussion); + } } else { throw new moodle_exception('couldnotadd', 'forum'); }