Skip to content

Commit 3f253f0

Browse files
Allow users without capability 'allowforcesubscribe' to optionally subscribe in forcedsubscription mode
1 parent 8ae3237 commit 3f253f0

File tree

7 files changed

+74
-70
lines changed

7 files changed

+74
-70
lines changed

classes/subscriptions.php

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,11 @@ class subscriptions {
9898
*
9999
* @return bool
100100
*/
101-
public static function is_subscribed($userid, $moodleoverflow, $discussionid = null) {
101+
public static function is_subscribed($userid, $moodleoverflow, $context, $discussionid = null) {
102102

103103
// Is the user forced to be subscribed to the moodleoverflow?
104-
if (self::is_forcesubscribed($moodleoverflow)) {
104+
if (self::is_forcesubscribed($moodleoverflow) &&
105+
has_capability('mod/moodleoverflow:allowforcesubscribe', $context, $userid)) {
105106
return true;
106107
}
107108

@@ -539,13 +540,7 @@ public static function get_subscribed_users($moodleoverflow, $context, $fields =
539540
u.picture, u.timezone, u.theme, u.lang, u.trackforums, u.mnethostid";
540541
}
541542

542-
// Check if the user is forced to e subscribed to a moodleoverflow.
543-
if (self::is_forcesubscribed($moodleoverflow)) {
544-
545-
// Find the list of potential subscribers.
546-
$results = self::get_potential_subscribers($context, $fields, 'u.email ASC');
547-
548-
} else if (self::subscription_disabled($moodleoverflow)) {
543+
if (self::subscription_disabled($moodleoverflow)) {
549544
$results = [];
550545
} else {
551546

@@ -588,6 +583,12 @@ public static function get_subscribed_users($moodleoverflow, $context, $fields =
588583

589584
// Fetch the data.
590585
$results = $DB->get_records_sql($sql, $params);
586+
587+
if (self::is_forcesubscribed($moodleoverflow)) {
588+
foreach (self::get_potential_subscribers($context, $fields, 'u.email ASC') as $id => $user) {
589+
$results[$id] = $user;
590+
}
591+
}
591592
}
592593

593594
// Remove all guest users from the results. They should never be subscribed to a moodleoverflow.
@@ -647,7 +648,7 @@ public static function subscribe_user($userid, $moodleoverflow, $context, $userr
647648
global $DB;
648649

649650
// Check if the user is already subscribed.
650-
if (self::is_subscribed($userid, $moodleoverflow)) {
651+
if (self::is_subscribed($userid, $moodleoverflow, $context)) {
651652
return true;
652653
}
653654

@@ -914,7 +915,7 @@ public static function unsubscribe_user_from_discussion($userid, $discussion, $c
914915
* Generate and return the subscribe or unsubscribe link for a moodleoverflow.
915916
*
916917
* @param object $moodleoverflow the moodleoverflow. Fields used are $moodleoverflow->id and $moodleoverflow->forcesubscribe.
917-
* @param object $context the context object for this moodleoverflow.
918+
* @param \context $context the context object for this moodleoverflow.
918919
* @param array $messages text used for the link in its various states
919920
* (subscribed, unsubscribed, forcesubscribed or cantsubscribe).
920921
* Any strings not passed in are taken from the $defaultmessages array
@@ -953,7 +954,7 @@ public static function moodleoverflow_get_subscribe_link($moodleoverflow, $conte
953954
}
954955

955956
// Check whether the user is subscribed.
956-
$issubscribed = self::is_subscribed($USER->id, $moodleoverflow);
957+
$issubscribed = self::is_subscribed($USER->id, $moodleoverflow, $context);
957958

958959
// Define the text of the link depending on the subscription state.
959960
if ($issubscribed) {
@@ -984,7 +985,7 @@ public static function moodleoverflow_get_subscribe_link($moodleoverflow, $conte
984985
* @param object $fromform The submitted form
985986
* @param \stdClass $moodleoverflow The moodleoverflow record
986987
* @param \stdClass $discussion The discussion record
987-
* @param \context_course $modulecontext The context of the module
988+
* @param \context_module $modulecontext The context of the module
988989
*
989990
* @return bool
990991
*/
@@ -996,15 +997,15 @@ public static function moodleoverflow_post_subscription($fromform, $moodleoverfl
996997
$disabled = self::subscription_disabled($moodleoverflow);
997998

998999
// Do not continue if the user is already forced to be subscribed.
999-
if ($force) {
1000+
if ($force && has_capability('mod/moodleoverflow:allowforcesubscribe', $modulecontext)) {
10001001
return false;
10011002
}
10021003

10031004
// Do not continue if subscriptions are disabled.
10041005
if ($disabled) {
10051006

10061007
// If the user is subscribed, unsubscribe him.
1007-
$subscribed = self::is_subscribed($USER->id, $moodleoverflow);
1008+
$subscribed = self::is_subscribed($USER->id, $moodleoverflow, $modulecontext);
10081009
$coursecontext = \context_course::instance($moodleoverflow->course);
10091010
$canmanage = has_capability('moodle/course:manageactivities', $coursecontext, $USER->id);
10101011
if ($subscribed AND !$canmanage) {
@@ -1025,18 +1026,19 @@ public static function moodleoverflow_post_subscription($fromform, $moodleoverfl
10251026
* Return the markup for the discussion subscription toggling icon.
10261027
*
10271028
* @param object $moodleoverflow The forum moodleoverflow.
1029+
* @param \context $context
10281030
* @param int $discussionid The discussion to create an icon for.
10291031
*
10301032
* @return string The generated markup.
10311033
*/
1032-
public static function get_discussion_subscription_icon($moodleoverflow, $discussionid) {
1034+
public static function get_discussion_subscription_icon($moodleoverflow, $context, $discussionid) {
10331035
global $OUTPUT, $PAGE, $USER;
10341036

10351037
// Set the url to return to.
10361038
$returnurl = $PAGE->url->out();
10371039

10381040
// Check if the discussion is subscrived.
1039-
$status = self::is_subscribed($USER->id, $moodleoverflow, $discussionid);
1041+
$status = self::is_subscribed($USER->id, $moodleoverflow, $context, $discussionid);
10401042

10411043
// Create a link to subscribe or unsubscribe to the discussion.
10421044
$array = array(

index.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@
141141
// Get information about the subscription state.
142142
$cansubscribe = \mod_moodleoverflow\subscriptions::is_subscribable($moodleoverflow);
143143
$moodleoverflow->cansubscribe = $cansubscribe || has_capability('mod/moodleoverflow:managesubscriptions', $modulecontext);
144-
$moodleoverflow->issubscribed = \mod_moodleoverflow\subscriptions::is_subscribed($USER->id, $moodleoverflow, null);
144+
$moodleoverflow->issubscribed = \mod_moodleoverflow\subscriptions::is_subscribed($USER->id, $moodleoverflow, $modulecontext);
145145
$showsubscriptioncolumns = $showsubscriptioncolumns || $moodleoverflow->issubscribed || $moodleoverflow->cansubscribe;
146146

147147
// Add the moodleoverflow to the cache.
@@ -196,7 +196,7 @@
196196
if (!$forcesubscribed) {
197197

198198
// Check the current state.
199-
$subscribed = \mod_moodleoverflow\subscriptions::is_subscribed($USER->id, $moodleoverflow, null);
199+
$subscribed = \mod_moodleoverflow\subscriptions::is_subscribed($USER->id, $moodleoverflow, $modulecontext);
200200
$subscribable = \mod_moodleoverflow\subscriptions::is_subscribable($moodleoverflow);
201201

202202
// Check whether to subscribe or unsubscribe the user.

lib.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,8 @@ function moodleoverflow_extend_settings_navigation(settings_navigation $settings
489489
$canmanage = has_capability('mod/moodleoverflow:managesubscriptions', $PAGE->cm->context);
490490
$forcesubscribed = \mod_moodleoverflow\subscriptions::is_forcesubscribed($moodleoverflow);
491491
$subscdisabled = \mod_moodleoverflow\subscriptions::subscription_disabled($moodleoverflow);
492-
$cansubscribe = ($activeenrolled AND !$forcesubscribed AND (!$subscdisabled OR $canmanage));
492+
$cansubscribe = $activeenrolled && (!$subscdisabled || $canmanage) &&
493+
!($forcesubscribed && has_capability('mod/moodleoverflow:allowforcesubscribe', $PAGE->cm->context));
493494
$cantrack = \mod_moodleoverflow\readtracking::moodleoverflow_can_track_moodleoverflows($moodleoverflow);
494495

495496
// Display a link to the index.
@@ -511,7 +512,7 @@ function moodleoverflow_extend_settings_navigation(settings_navigation $settings
511512
if ($cansubscribe) {
512513

513514
// Choose the linktext depending on the current state of subscription.
514-
$issubscribed = \mod_moodleoverflow\subscriptions::is_subscribed($USER->id, $moodleoverflow, null);
515+
$issubscribed = \mod_moodleoverflow\subscriptions::is_subscribed($USER->id, $moodleoverflow, $PAGE->cm->context);
515516
if ($issubscribed) {
516517
$linktext = get_string('unsubscribe', 'moodleoverflow');
517518
} else {
@@ -779,7 +780,7 @@ function moodleoverflow_send_mails() {
779780
$iscm = $coursemodules[$moodleoverflow->id];
780781
$uid = $userto->id;
781782
$did = $post->discussion;
782-
$issubscribed = \mod_moodleoverflow\subscriptions::is_subscribed($uid, $moodleoverflow, $did);
783+
$issubscribed = \mod_moodleoverflow\subscriptions::is_subscribed($uid, $moodleoverflow, $modulecontext, $did);
783784
if (!$issubscribed) {
784785
continue;
785786
}

locallib.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ function moodleoverflow_print_latest_discussions($moodleoverflow, $cm, $page = -
334334
// Discussion subscription.
335335
if (\mod_moodleoverflow\subscriptions::is_subscribable($moodleoverflow)) {
336336
$preparedarray[$i]['discussionsubicon'] = \mod_moodleoverflow\subscriptions::get_discussion_subscription_icon(
337-
$moodleoverflow, $discussion->discussion);
337+
$moodleoverflow, $context, $discussion->discussion);
338338
}
339339
}
340340

subscribe.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@
9797
}
9898

9999
// Check if the user is already subscribed.
100-
$issubscribed = \mod_moodleoverflow\subscriptions::is_subscribed($user->id, $moodleoverflow, $discussionid, $cm);
100+
$issubscribed = \mod_moodleoverflow\subscriptions::is_subscribed($user->id, $moodleoverflow, $context, $discussionid);
101101

102102
// To subscribe to a moodleoverflow or a discussion, the user needs to be logged in.
103103
require_login($course, false, $cm);
@@ -184,7 +184,7 @@
184184

185185
// Redirect the user back if the user is forced to be subscribed.
186186
$isforced = \mod_moodleoverflow\subscriptions::is_forcesubscribed($moodleoverflow);
187-
if ($isforced) {
187+
if ($isforced && has_capability('mod/moodleoverflow:allowforcesubscribe', $context)) {
188188
redirect($returnto, $strings['everyoneisnowsubscribed'], null, $notify['success']);
189189
exit;
190190
}

tests/locallib_test.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public function test_moodleoverflow_auto_subscribe_on_create() {
7171
$result = \mod_moodleoverflow\subscriptions::get_subscribed_users($mo, $context);
7272
$this->assertEquals($usercount, count($result));
7373
foreach ($users as $user) {
74-
$this->assertTrue(\mod_moodleoverflow\subscriptions::is_subscribed($user->id, $mo));
74+
$this->assertTrue(\mod_moodleoverflow\subscriptions::is_subscribed($user->id, $mo, $context));
7575
}
7676
}
7777

@@ -103,7 +103,7 @@ public function test_moodleoverflow_forced_subscribe_on_create() {
103103
$result = \mod_moodleoverflow\subscriptions::get_subscribed_users($mo, $context);
104104
$this->assertEquals($usercount, count($result));
105105
foreach ($users as $user) {
106-
$this->assertTrue(\mod_moodleoverflow\subscriptions::is_subscribed($user->id, $mo));
106+
$this->assertTrue(\mod_moodleoverflow\subscriptions::is_subscribed($user->id, $mo, $context));
107107
}
108108
}
109109

@@ -134,7 +134,7 @@ public function test_moodleoverflow_optional_subscribe_on_create() {
134134
$result = \mod_moodleoverflow\subscriptions::get_subscribed_users($mo, $context);
135135
$this->assertEquals(0, count($result));
136136
foreach ($users as $user) {
137-
$this->assertFalse(\mod_moodleoverflow\subscriptions::is_subscribed($user->id, $mo));
137+
$this->assertFalse(\mod_moodleoverflow\subscriptions::is_subscribed($user->id, $mo, $context));
138138
}
139139
}
140140

@@ -165,7 +165,7 @@ public function test_moodleoverflow_disallow_subscribe_on_create() {
165165
$result = \mod_moodleoverflow\subscriptions::get_subscribed_users($mo, $context);
166166
$this->assertEquals(0, count($result));
167167
foreach ($users as $user) {
168-
$this->assertFalse(\mod_moodleoverflow\subscriptions::is_subscribed($user->id, $mo));
168+
$this->assertFalse(\mod_moodleoverflow\subscriptions::is_subscribed($user->id, $mo, $context));
169169
}
170170
}
171171

0 commit comments

Comments
 (0)