MDL-65069 mod_forum: Remove unused code and additional dev docs.
authorPeter <peter@moodle.com>
Wed, 17 Apr 2019 03:03:49 +0000 (11:03 +0800)
committerPeter <peter@moodle.com>
Wed, 24 Apr 2019 04:01:37 +0000 (12:01 +0800)
Additional updates to setting default subscription value for discussions

lib/form/submit.php
lib/form/templates/element-submit-inline.mustache
lib/form/templates/element-submit.mustache
lib/upgrade.txt
mod/forum/classes/local/renderers/discussion_list.php
mod/forum/classes/post_form.php
mod/forum/classes/subscriptions.php
mod/forum/post.php
mod/forum/tests/subscriptions_test.php

index 23c1ff7..d44b1a2 100644 (file)
@@ -49,7 +49,11 @@ class MoodleQuickForm_submit extends HTML_QuickForm_submit implements templatabl
     protected $primary;
 
     /**
     protected $primary;
 
     /**
-     * Any class apart from 'btn' would be override with this content
+     * Any class apart from 'btn' would be overridden with this content.
+     *
+     * By default, submit buttons will utilize the btn-primary OR btn-secondary classes. However there are cases where we
+     * require a submit button with different stylings (e.g. btn-link). In these cases, $customclassoverride will override
+     * the defaults mentioned previously and utilize the provided class(es).
      *
      * @var string $customclassoverride Custom class override for the input element
      */
      *
      * @var string $customclassoverride Custom class override for the input element
      */
@@ -62,8 +66,11 @@ class MoodleQuickForm_submit extends HTML_QuickForm_submit implements templatabl
      * @param string $value (optional) field label
      * @param string $attributes (optional) Either a typical HTML attribute string or an associative array
      * @param bool|null $primary Is this button a primary button?
      * @param string $value (optional) field label
      * @param string $attributes (optional) Either a typical HTML attribute string or an associative array
      * @param bool|null $primary Is this button a primary button?
+     * @param array $options Options to further customise the submit button. Currently accepted options are:
+     *                  customclassoverride String The CSS class to use for the button instead of the standard
+     *                                             btn-primary and btn-secondary classes.
      */
      */
-    public function __construct($elementName=null, $value=null, $attributes=null, $primary = null) {
+    public function __construct($elementName=null, $value=null, $attributes=null, $primary = null, $options = []) {
         parent::__construct($elementName, $value, $attributes);
 
         // Fallback to legacy behaviour if no value specified.
         parent::__construct($elementName, $value, $attributes);
 
         // Fallback to legacy behaviour if no value specified.
@@ -73,11 +80,7 @@ class MoodleQuickForm_submit extends HTML_QuickForm_submit implements templatabl
             $this->primary = $primary;
         }
 
             $this->primary = $primary;
         }
 
-        $class = $this->getAttribute('customclassoverride');
-        if ($class) {
-            $this->removeAttribute('customclassoverride');
-            $this->customclassoverride = $class;
-        }
+        $this->customclassoverride = $options['customclassoverride'] ?? false;
     }
 
     /**
     }
 
     /**
@@ -146,7 +149,7 @@ class MoodleQuickForm_submit extends HTML_QuickForm_submit implements templatabl
         }
 
         if ($this->customclassoverride) {
         }
 
         if ($this->customclassoverride) {
-            $context['customclass'] = $this->customclassoverride;
+            $context['customclassoverride'] = $this->customclassoverride;
         }
         return $context;
     }
         }
         return $context;
     }
index d576e57..8c2c047 100644 (file)
@@ -3,12 +3,12 @@
         {{^element.frozen}}
         <input type="submit"
                 class="btn
         {{^element.frozen}}
         <input type="submit"
                 class="btn
-                    {{^element.customclass}}
+                    {{^element.customclassoverride}}
                         {{^element.secondary}}btn-primary{{/element.secondary}}
                         {{#element.secondary}}btn-secondary{{/element.secondary}}
                         {{^element.secondary}}btn-primary{{/element.secondary}}
                         {{#element.secondary}}btn-secondary{{/element.secondary}}
-                    {{/element.customclass}}
+                    {{/element.customclassoverride}}
                     {{#error}} btn-danger {{/error}}
                     {{#error}} btn-danger {{/error}}
-                    {{#element.customclass}}{{element.customclass}}{{/element.customclass}}"
+                    {{#element.customclassoverride}}{{element.customclassoverride}}{{/element.customclassoverride}}"
                 name="{{element.name}}"
                 id="{{element.id}}"
                 value="{{element.value}}"
                 name="{{element.name}}"
                 id="{{element.id}}"
                 value="{{element.value}}"
index 5ca3e53..cd8b8fa 100644 (file)
@@ -3,13 +3,13 @@
         {{^element.frozen}}
             <input type="submit"
                 class="btn
         {{^element.frozen}}
             <input type="submit"
                 class="btn
-                    {{^element.customclass}}
+                    {{^element.customclassoverride}}
                         {{^element.secondary}}btn-primary{{/element.secondary}}
                         {{#element.secondary}}btn-secondary{{/element.secondary}}
                         {{^element.secondary}}btn-primary{{/element.secondary}}
                         {{#element.secondary}}btn-secondary{{/element.secondary}}
-                    {{/element.customclass}}
+                    {{/element.customclassoverride}}
                     {{#error}} btn-danger {{/error}}
                     {{element.extraclasses}}
                     {{#error}} btn-danger {{/error}}
                     {{element.extraclasses}}
-                    {{#element.customclass}}{{element.customclass}}{{/element.customclass}}"
+                    {{#element.customclassoverride}}{{element.customclassoverride}}{{/element.customclassoverride}}"
                 name="{{element.name}}"
                 id="{{element.id}}"
                 {{#error}}
                 name="{{element.name}}"
                 id="{{element.id}}"
                 {{#error}}
index bf54dcd..1fa619a 100644 (file)
@@ -41,6 +41,7 @@ is disabled).
 * New optional parameter $throwexception for \get_complete_user_data(). If true, an exception will be thrown when there's no
   matching record found or when there are multiple records found for the given field value. If false, it will simply return false.
   Defaults to false when not set.
 * New optional parameter $throwexception for \get_complete_user_data(). If true, an exception will be thrown when there's no
   matching record found or when there are multiple records found for the given field value. If false, it will simply return false.
   Defaults to false when not set.
+* Exposed submit button to allow custom styling (via customclassoverride variable) which can override btn-primary/btn-secondary classes
 
 === 3.6 ===
 
 
 === 3.6 ===
 
index aef9757..3ca9199 100644 (file)
@@ -203,8 +203,6 @@ class discussion_list {
      * @return string The rendered html
      */
     private function get_discussion_form(stdClass $user, \cm_info $cm, ?int $groupid) {
      * @return string The rendered html
      */
     private function get_discussion_form(stdClass $user, \cm_info $cm, ?int $groupid) {
-        global $PAGE;
-
         $forum = $this->forum;
         $forumrecord = $this->legacydatamapperfactory->get_forum_data_mapper()->to_legacy_object($forum);
         $modcontext = \context_module::instance($cm->id);
         $forum = $this->forum;
         $forumrecord = $this->legacydatamapperfactory->get_forum_data_mapper()->to_legacy_object($forum);
         $modcontext = \context_module::instance($cm->id);
@@ -221,7 +219,7 @@ class discussion_list {
             'messagetrust' => 0,
             'groupid' => $groupid,
         ];
             'messagetrust' => 0,
             'groupid' => $groupid,
         ];
-        $thresholdwarning = forum_check_throttling($forum, $cm);
+        $thresholdwarning = forum_check_throttling($forumrecord, $cm);
 
         $formparams = array(
             'course' => $forum->get_course_record(),
 
         $formparams = array(
             'course' => $forum->get_course_record(),
@@ -237,6 +235,7 @@ class discussion_list {
             'edit' => 0
         );
         $mformpost = new \mod_forum_post_form('post.php', $formparams, 'post', '', array('id' => 'mformforum'));
             'edit' => 0
         );
         $mformpost = new \mod_forum_post_form('post.php', $formparams, 'post', '', array('id' => 'mformforum'));
+        $discussionsubscribe = \mod_forum\subscriptions::get_user_default_subscription($forumrecord, $coursecontext, $cm, null);
 
         $params = array('reply' => 0, 'forum' => $forumrecord->id, 'edit' => 0) +
             (isset($post->groupid) ? array('groupid' => $post->groupid) : array()) +
 
         $params = array('reply' => 0, 'forum' => $forumrecord->id, 'edit' => 0) +
             (isset($post->groupid) ? array('groupid' => $post->groupid) : array()) +
@@ -244,7 +243,8 @@ class discussion_list {
                 'userid' => $post->userid,
                 'parent' => $post->parent,
                 'discussion' => $post->discussion,
                 'userid' => $post->userid,
                 'parent' => $post->parent,
                 'discussion' => $post->discussion,
-                'course' => $forum->get_course_id()
+                'course' => $forum->get_course_id(),
+                'discussionsubscribe' => $discussionsubscribe
             );
         $mformpost->set_data($params);
 
             );
         $mformpost->set_data($params);
 
index 40b421d..bea04eb 100644 (file)
@@ -95,9 +95,9 @@ class mod_forum_post_form extends moodleform {
         $thresholdwarning = $this->_customdata['thresholdwarning'];
         $canreplyprivately = array_key_exists('canreplyprivately', $this->_customdata) ?
             $this->_customdata['canreplyprivately'] : false;
         $thresholdwarning = $this->_customdata['thresholdwarning'];
         $canreplyprivately = array_key_exists('canreplyprivately', $this->_customdata) ?
             $this->_customdata['canreplyprivately'] : false;
-        $stripped = isset($this->_customdata['inpagereply']) ? $this->_customdata['inpagereply'] : false;
+        $inpagereply = $this->_customdata['inpagereply'] ?? false;
 
 
-        if (!$stripped) {
+        if (!$inpagereply) {
             // Fill in the data depending on page params later using set_data.
             $mform->addElement('header', 'general', '');
         }
             // Fill in the data depending on page params later using set_data.
             $mform->addElement('header', 'general', '');
         }
@@ -120,23 +120,23 @@ class mod_forum_post_form extends moodleform {
         $mform->setType('message', PARAM_RAW);
         $mform->addRule('message', get_string('required'), 'required', null, 'client');
 
         $mform->setType('message', PARAM_RAW);
         $mform->addRule('message', get_string('required'), 'required', null, 'client');
 
-        if (!$stripped) {
+        if (!$inpagereply) {
             $manageactivities = has_capability('moodle/course:manageactivities', $coursecontext);
 
             if (\mod_forum\subscriptions::is_forcesubscribed($forum)) {
             $manageactivities = has_capability('moodle/course:manageactivities', $coursecontext);
 
             if (\mod_forum\subscriptions::is_forcesubscribed($forum)) {
-                $mform->addElement('advcheckbox', 'discussionsubscribe', get_string('discussionsubscription', 'forum'));
+                $mform->addElement('checkbox', 'discussionsubscribe', get_string('discussionsubscription', 'forum'));
                 $mform->freeze('discussionsubscribe');
                 $mform->setDefaults('discussionsubscribe', 0);
                 $mform->addHelpButton('discussionsubscribe', 'forcesubscribed', 'forum');
 
             } else if (\mod_forum\subscriptions::subscription_disabled($forum) && !$manageactivities) {
                 $mform->freeze('discussionsubscribe');
                 $mform->setDefaults('discussionsubscribe', 0);
                 $mform->addHelpButton('discussionsubscribe', 'forcesubscribed', 'forum');
 
             } else if (\mod_forum\subscriptions::subscription_disabled($forum) && !$manageactivities) {
-                $mform->addElement('advcheckbox', 'discussionsubscribe', get_string('discussionsubscription', 'forum'));
+                $mform->addElement('checkbox', 'discussionsubscribe', get_string('discussionsubscription', 'forum'));
                 $mform->freeze('discussionsubscribe');
                 $mform->setDefaults('discussionsubscribe', 0);
                 $mform->addHelpButton('discussionsubscribe', 'disallowsubscription', 'forum');
 
             } else {
                 $mform->freeze('discussionsubscribe');
                 $mform->setDefaults('discussionsubscribe', 0);
                 $mform->addHelpButton('discussionsubscribe', 'disallowsubscription', 'forum');
 
             } else {
-                $mform->addElement('advcheckbox', 'discussionsubscribe', get_string('discussionsubscription', 'forum'));
+                $mform->addElement('checkbox', 'discussionsubscribe', get_string('discussionsubscription', 'forum'));
                 $mform->addHelpButton('discussionsubscribe', 'discussionsubscription', 'forum');
             }
 
                 $mform->addHelpButton('discussionsubscribe', 'discussionsubscription', 'forum');
             }
 
@@ -168,79 +168,75 @@ class mod_forum_post_form extends moodleform {
                     $mform->addElement('checkbox', 'mailnow', get_string('mailnow', 'forum'));
                 }
 
                     $mform->addElement('checkbox', 'mailnow', get_string('mailnow', 'forum'));
                 }
 
-                if ($groupmode = groups_get_activity_groupmode($cm, $course)) {
-                    $groupdata = groups_get_activity_allowed_groups($cm);
-
-                    $groupinfo = array();
-                    foreach ($groupdata as $groupid => $group) {
-                        // Check whether this user can post in this group.
-                        // We must make this check because all groups are returned for a visible grouped activity.
-                        if (forum_user_can_post_discussion($forum, $groupid, null, $cm, $modcontext)) {
-                            // Build the data for the groupinfo select.
-                            $groupinfo[$groupid] = $group->name;
-                        } else {
-                            unset($groupdata[$groupid]);
-                        }
-                    }
-                    $groupcount = count($groupinfo);
-
-                    // Check whether a user can post to all of their own groups.
-
-                    // Posts to all of my groups are copied to each group that the user is a member of. Certain conditions must be met.
-                    // 1) It only makes sense to allow this when a user is in more than one group.
-                    // Note: This check must come before we consider adding accessallgroups, because that is not a real group.
-                    $canposttoowngroups = empty($post->edit) && $groupcount > 1;
-
-                    // 2) Important: You can *only* post to multiple groups for a top level post. Never any reply.
-                    $canposttoowngroups = $canposttoowngroups && empty($post->parent);
-
-                    // 3) You also need the canposttoowngroups capability.
-                    $canposttoowngroups = $canposttoowngroups && has_capability('mod/forum:canposttomygroups', $modcontext);
-                    if ($canposttoowngroups) {
-                        // This user is in multiple groups, and can post to all of their own groups.
-                        // Note: This is not the same as accessallgroups. This option will copy a post to all groups that a
-                        // user is a member of.
-                        $mform->addElement('checkbox', 'posttomygroups', get_string('posttomygroups', 'forum'));
-                        $mform->addHelpButton('posttomygroups', 'posttomygroups', 'forum');
-                        $mform->disabledIf('groupinfo', 'posttomygroups', 'checked');
-                    }
-
-                    // Check whether this user can post to all groups.
-                    // Posts to the 'All participants' group go to all groups, not to each group in a list.
-                    // It makes sense to allow this, even if there currently aren't any groups because there may be in the future.
-                    if (forum_user_can_post_discussion($forum, -1, null, $cm, $modcontext)) {
-                        // Note: We must reverse in this manner because array_unshift renumbers the array.
-                        $groupinfo = array_reverse($groupinfo, true);
-                        $groupinfo[-1] = get_string('allparticipants');
-                        $groupinfo = array_reverse($groupinfo, true);
-                        $groupcount++;
+                $groupinfo = array();
+                foreach ($groupdata as $groupid => $group) {
+                    // Check whether this user can post in this group.
+                    // We must make this check because all groups are returned for a visible grouped activity.
+                    if (forum_user_can_post_discussion($forum, $groupid, null, $cm, $modcontext)) {
+                        // Build the data for the groupinfo select.
+                        $groupinfo[$groupid] = $group->name;
+                    } else {
+                        unset($groupdata[$groupid]);
                     }
                     }
+                }
+                $groupcount = count($groupinfo);
+
+                // Check whether a user can post to all of their own groups.
+
+                // Posts to all of my groups are copied to each group that the user is a member of. Certain conditions must be met.
+                // 1) It only makes sense to allow this when a user is in more than one group.
+                // Note: This check must come before we consider adding accessallgroups, because that is not a real group.
+                $canposttoowngroups = empty($post->edit) && $groupcount > 1;
+
+                // 2) Important: You can *only* post to multiple groups for a top level post. Never any reply.
+                $canposttoowngroups = $canposttoowngroups && empty($post->parent);
+
+                // 3) You also need the canposttoowngroups capability.
+                $canposttoowngroups = $canposttoowngroups && has_capability('mod/forum:canposttomygroups', $modcontext);
+                if ($canposttoowngroups) {
+                    // This user is in multiple groups, and can post to all of their own groups.
+                    // Note: This is not the same as accessallgroups. This option will copy a post to all groups that a
+                    // user is a member of.
+                    $mform->addElement('checkbox', 'posttomygroups', get_string('posttomygroups', 'forum'));
+                    $mform->addHelpButton('posttomygroups', 'posttomygroups', 'forum');
+                    $mform->disabledIf('groupinfo', 'posttomygroups', 'checked');
+                }
 
 
-                    // Determine whether the user can select a group from the dropdown. The dropdown is available for several reasons.
-                    // 1) This is a new post (not an edit), and there are at least two groups to choose from.
-                    $canselectgroupfornew = empty($post->edit) && $groupcount > 1;
-
-                    // 2) This is editing of an existing post and the user is allowed to movediscussions.
-                    // We allow this because the post may have been moved from another forum where groups are not available.
-                    // We show this even if no groups are available as groups *may* have been available but now are not.
-                    $canselectgroupformove =
-                        $groupcount && !empty($post->edit) && has_capability('mod/forum:movediscussions', $modcontext);
-
-                    // Important: You can *only* change the group for a top level post. Never any reply.
-                    $canselectgroup = empty($post->parent) && ($canselectgroupfornew || $canselectgroupformove);
+                // Check whether this user can post to all groups.
+                // Posts to the 'All participants' group go to all groups, not to each group in a list.
+                // It makes sense to allow this, even if there currently aren't any groups because there may be in the future.
+                if (forum_user_can_post_discussion($forum, -1, null, $cm, $modcontext)) {
+                    // Note: We must reverse in this manner because array_unshift renumbers the array.
+                    $groupinfo = array_reverse($groupinfo, true);
+                    $groupinfo[-1] = get_string('allparticipants');
+                    $groupinfo = array_reverse($groupinfo, true);
+                    $groupcount++;
+                }
 
 
-                    if ($canselectgroup) {
-                        $mform->addElement('select', 'groupinfo', get_string('group'), $groupinfo);
-                        $mform->setDefault('groupinfo', $post->groupid);
-                        $mform->setType('groupinfo', PARAM_INT);
+                // Determine whether the user can select a group from the dropdown. The dropdown is available for several reasons.
+                // 1) This is a new post (not an edit), and there are at least two groups to choose from.
+                $canselectgroupfornew = empty($post->edit) && $groupcount > 1;
+
+                // 2) This is editing of an existing post and the user is allowed to movediscussions.
+                // We allow this because the post may have been moved from another forum where groups are not available.
+                // We show this even if no groups are available as groups *may* have been available but now are not.
+                $canselectgroupformove =
+                    $groupcount && !empty($post->edit) && has_capability('mod/forum:movediscussions', $modcontext);
+
+                // Important: You can *only* change the group for a top level post. Never any reply.
+                $canselectgroup = empty($post->parent) && ($canselectgroupfornew || $canselectgroupformove);
+
+                if ($canselectgroup) {
+                    $mform->addElement('select', 'groupinfo', get_string('group'), $groupinfo);
+                    $mform->setDefault('groupinfo', $post->groupid);
+                    $mform->setType('groupinfo', PARAM_INT);
+                } else {
+                    if (empty($post->groupid)) {
+                        $groupname = get_string('allparticipants');
                     } else {
                     } else {
-                        if (empty($post->groupid)) {
-                            $groupname = get_string('allparticipants');
-                        } else {
-                            $groupname = format_string($groupdata[$post->groupid]->name);
-                        }
-                        $mform->addElement('static', 'groupinfo', get_string('group'), $groupname);
+                        $groupname = format_string($groupdata[$post->groupid]->name);
                     }
                     }
+                    $mform->addElement('static', 'groupinfo', get_string('group'), $groupname);
                 }
             }
 
                 }
             }
 
@@ -284,7 +280,10 @@ class mod_forum_post_form extends moodleform {
         $mform->registerNoSubmitButton('advancedadddiscussion');
 
         // This is an inpage add discussion which requires custom buttons.
         $mform->registerNoSubmitButton('advancedadddiscussion');
 
         // This is an inpage add discussion which requires custom buttons.
-        if ($stripped) {
+        if ($inpagereply) {
+            $mform->addElement('hidden', 'discussionsubscribe');
+            $mform->setType('discussionsubscribe', PARAM_INT);
+            $mform->disable_form_change_checker();
             $buttonarray = array();
             $buttonarray[] = &$mform->createElement('submit', 'submitbutton', $submitstring);
             $buttonarray[] = &$mform->createElement('button', 'cancelbtn',
             $buttonarray = array();
             $buttonarray[] = &$mform->createElement('submit', 'submitbutton', $submitstring);
             $buttonarray[] = &$mform->createElement('button', 'cancelbtn',
@@ -292,7 +291,7 @@ class mod_forum_post_form extends moodleform {
                 // Additional attribs to handle collapsible div.
                 ['data-toggle' => 'collapse', 'data-target' => "#collapseAddForm"]);
             $buttonarray[] = &$mform->createElement('submit', 'advancedadddiscussion',
                 // Additional attribs to handle collapsible div.
                 ['data-toggle' => 'collapse', 'data-target' => "#collapseAddForm"]);
             $buttonarray[] = &$mform->createElement('submit', 'advancedadddiscussion',
-                get_string('advanced'), ['customclassoverride' => 'btn-link']);
+                get_string('advanced'), null, null, ['customclassoverride' => 'btn-link']);
 
             $mform->addGroup($buttonarray, 'buttonar', '', array(' '), false);
             $mform->closeHeaderBefore('buttonar');
 
             $mform->addGroup($buttonarray, 'buttonar', '', array(' '), false);
             $mform->closeHeaderBefore('buttonar');
index 8f7aa2f..5f50eb8 100644 (file)
@@ -825,4 +825,38 @@ class subscriptions {
         return true;
     }
 
         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, ?int $discussionid) {
+        global $USER;
+        $manageactivities = has_capability('moodle/course:manageactivities', $context);
+        if (\mod_forum\subscriptions::subscription_disabled($forum) && !$manageactivities) {
+            // User does not have permission to subscribe to this discussion at all.
+            $discussionsubscribe = false;
+        } else if (\mod_forum\subscriptions::is_forcesubscribed($forum)) {
+            // User does not have permission to unsubscribe from this discussion at all.
+            $discussionsubscribe = true;
+        } else {
+            if (isset($discussion) && \mod_forum\subscriptions::is_subscribed($USER->id, $forum, $discussionid, $cm)) {
+                // User is subscribed to the discussion - continue the subscription.
+                $discussionsubscribe = true;
+            } else if (!isset($discussionid) && \mod_forum\subscriptions::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 ?? false;
+            }
+        }
+
+        return $discussionsubscribe;
+    }
 }
 }
index fdea9c0..d01153a 100644 (file)
@@ -720,26 +720,8 @@ $postid = empty($post->id) ? null : $post->id;
 $draftideditor = file_get_submitted_draft_itemid('message');
 $editoropts = mod_forum_post_form::editor_options($modcontext, $postid);
 $currenttext = file_prepare_draft_area($draftideditor, $modcontext->id, 'mod_forum', 'post', $postid, $editoropts, $post->message);
 $draftideditor = file_get_submitted_draft_itemid('message');
 $editoropts = mod_forum_post_form::editor_options($modcontext, $postid);
 $currenttext = file_prepare_draft_area($draftideditor, $modcontext->id, 'mod_forum', 'post', $postid, $editoropts, $post->message);
-
-$manageactivities = has_capability('moodle/course:manageactivities', $coursecontext);
-if (\mod_forum\subscriptions::subscription_disabled($forum) && !$manageactivities) {
-    // User does not have permission to subscribe to this discussion at all.
-    $discussionsubscribe = false;
-} else if (\mod_forum\subscriptions::is_forcesubscribed($forum)) {
-    // User does not have permission to unsubscribe from this discussion at all.
-    $discussionsubscribe = true;
-} else {
-    if (isset($discussion) && \mod_forum\subscriptions::is_subscribed($USER->id, $forum, $discussion->id, $cm)) {
-        // User is subscribed to the discussion - continue the subscription.
-        $discussionsubscribe = true;
-    } else if (!isset($discussion) && \mod_forum\subscriptions::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;
-    }
-}
+$discussionid = isset($discussion) ? $discussion->id : null;
+$discussionsubscribe = \mod_forum\subscriptions::get_user_default_subscription($forum, $coursecontext, $cm, $discussionid);
 
 $mformpost->set_data(
     array(
 
 $mformpost->set_data(
     array(
index 65479ba..823140a 100644 (file)
@@ -1378,4 +1378,48 @@ class mod_forum_subscriptions_testcase extends advanced_testcase {
 
         $this->assertEquals($expect, \mod_forum\subscriptions::is_subscribable($forum));
     }
 
         $this->assertEquals($expect, \mod_forum\subscriptions::is_subscribable($forum));
     }
+
+    public function test_get_user_default_subscription() {
+        global $DB;
+        $this->resetAfterTest(true);
+
+        // Create a course, with a forum.
+        $course = $this->getDataGenerator()->create_course();
+        $context = \context_course::instance($course->id);
+        $options['course'] = $course->id;
+        $forum = $this->getDataGenerator()->create_module('forum', $options);
+        $cm = get_coursemodule_from_instance("forum", $forum->id, $course->id);
+
+        // Create a user enrolled in the course as a student.
+        list($author, $student) = $this->helper_create_users($course, 2, 'student');
+        // Post a discussion to the forum.
+        list($discussion, $post) = $this->helper_post_to_forum($forum, $author);
+
+        // A guest user.
+        $this->setUser(0);
+        $this->assertFalse((boolean)\mod_forum\subscriptions::get_user_default_subscription($forum, $context, $cm, $discussion->id));
+        $this->assertFalse((boolean)\mod_forum\subscriptions::get_user_default_subscription($forum, $context, $cm, null));
+
+        // A user enrolled in the course.
+        $this->setUser($author->id);
+        $this->assertTrue((boolean)\mod_forum\subscriptions::get_user_default_subscription($forum, $context, $cm, $discussion->id));
+        $this->assertTrue((boolean)\mod_forum\subscriptions::get_user_default_subscription($forum, $context, $cm, null));
+
+        // Subscribption disabled.
+        $this->setUser($student->id);
+        \mod_forum\subscriptions::set_subscription_mode($forum->id, FORUM_DISALLOWSUBSCRIBE);
+        $forum = $DB->get_record('forum', array('id' => $forum->id));
+        $this->assertFalse((boolean)\mod_forum\subscriptions::get_user_default_subscription($forum, $context, $cm, $discussion->id));
+        $this->assertFalse((boolean)\mod_forum\subscriptions::get_user_default_subscription($forum, $context, $cm, null));
+
+        \mod_forum\subscriptions::set_subscription_mode($forum->id, FORUM_FORCESUBSCRIBE);
+        $forum = $DB->get_record('forum', array('id' => $forum->id));
+        $this->assertTrue((boolean)\mod_forum\subscriptions::get_user_default_subscription($forum, $context, $cm, $discussion->id));
+        $this->assertTrue((boolean)\mod_forum\subscriptions::get_user_default_subscription($forum, $context, $cm, null));
+
+        // Admin user.
+        $this->setAdminUser();
+        $this->assertTrue((boolean)\mod_forum\subscriptions::get_user_default_subscription($forum, $context, $cm, $discussion->id));
+        $this->assertTrue((boolean)\mod_forum\subscriptions::get_user_default_subscription($forum, $context, $cm, null));
+    }
 }
 }