Ejemplo n.º 1
0
 /**
  * Test that after toggling the quora subscription as another user,
  * the discussion subscription functionality works as expected.
  */
 public function test_quora_subscribe_toggle_as_other_repeat_subscriptions()
 {
     global $DB;
     $this->resetAfterTest(true);
     // Create a course, with a quora.
     $course = $this->getDataGenerator()->create_course();
     $options = array('course' => $course->id, 'forcesubscribe' => FORUM_CHOOSESUBSCRIBE);
     $quora = $this->getDataGenerator()->create_module('quora', $options);
     // Create a user enrolled in the course as a student.
     list($user) = $this->helper_create_users($course, 1);
     // Post a discussion to the quora.
     list($discussion, $post) = $this->helper_post_to_quora($quora, $user);
     // Confirm that the user is currently not subscribed to the quora.
     $this->assertFalse(\mod_quora\subscriptions::is_subscribed($user->id, $quora));
     // Confirm that the user is unsubscribed from the discussion too.
     $this->assertFalse(\mod_quora\subscriptions::is_subscribed($user->id, $quora, $discussion->id));
     // Confirm that we have no records in either of the subscription tables.
     $this->assertEquals(0, $DB->count_records('quora_subscriptions', array('userid' => $user->id, 'quora' => $quora->id)));
     $this->assertEquals(0, $DB->count_records('quora_discussion_subs', array('userid' => $user->id, 'discussion' => $discussion->id)));
     // Subscribing to the quora should create a record in the subscriptions table, but not the quora discussion
     // subscriptions table.
     \mod_quora\subscriptions::subscribe_user($user->id, $quora);
     $this->assertEquals(1, $DB->count_records('quora_subscriptions', array('userid' => $user->id, 'quora' => $quora->id)));
     $this->assertEquals(0, $DB->count_records('quora_discussion_subs', array('userid' => $user->id, 'discussion' => $discussion->id)));
     // Now unsubscribe from the discussion. This should return true.
     $this->assertTrue(\mod_quora\subscriptions::unsubscribe_user_from_discussion($user->id, $discussion));
     // Attempting to unsubscribe again should return false because no change was made.
     $this->assertFalse(\mod_quora\subscriptions::unsubscribe_user_from_discussion($user->id, $discussion));
     // Subscribing to the discussion again should return truthfully as the subscription preference was removed.
     $this->assertTrue(\mod_quora\subscriptions::subscribe_user_to_discussion($user->id, $discussion));
     // Attempting to subscribe again should return false because no change was made.
     $this->assertFalse(\mod_quora\subscriptions::subscribe_user_to_discussion($user->id, $discussion));
     // Now unsubscribe from the discussion. This should return true once more.
     $this->assertTrue(\mod_quora\subscriptions::unsubscribe_user_from_discussion($user->id, $discussion));
     // And unsubscribing from the quora but not as a request from the user should maintain their preference.
     \mod_quora\subscriptions::unsubscribe_user($user->id, $quora);
     $this->assertEquals(0, $DB->count_records('quora_subscriptions', array('userid' => $user->id, 'quora' => $quora->id)));
     $this->assertEquals(1, $DB->count_records('quora_discussion_subs', array('userid' => $user->id, 'discussion' => $discussion->id)));
     // Subscribing to the discussion should return truthfully because a change was made.
     $this->assertTrue(\mod_quora\subscriptions::subscribe_user_to_discussion($user->id, $discussion));
     $this->assertEquals(0, $DB->count_records('quora_subscriptions', array('userid' => $user->id, 'quora' => $quora->id)));
     $this->assertEquals(1, $DB->count_records('quora_discussion_subs', array('userid' => $user->id, 'discussion' => $discussion->id)));
 }
Ejemplo n.º 2
0
 public function test_optional_with_unsubscribed_discussion_in_subscribed_quora()
 {
     $this->resetAfterTest(true);
     // Create a course, with a quora.
     $course = $this->getDataGenerator()->create_course();
     $options = array('course' => $course->id, 'forcesubscribe' => FORUM_CHOOSESUBSCRIBE);
     $quora = $this->getDataGenerator()->create_module('quora', $options);
     // Create two users enrolled in the course as students.
     list($author, $recipient) = $this->helper_create_users($course, 2);
     // Post a discussion to the quora.
     list($discussion, $post) = $this->helper_post_to_quora($quora, $author);
     // Unsubscribe the 'recipient' user from the discussion.
     \mod_quora\subscriptions::subscribe_user($recipient->id, $quora);
     // Then unsubscribe them from the discussion.
     \mod_quora\subscriptions::unsubscribe_user_from_discussion($recipient->id, $discussion);
     // We don't expect any users to receive this post.
     $expected = 0;
     // Run cron and check that the expected number of users received the notification.
     $messages = $this->helper_run_cron_check_count($post, $expected);
 }
Ejemplo n.º 3
0
/**
 * Given a new post, subscribes or unsubscribes as appropriate.
 * Returns some text which describes what happened.
 *
 * @param object $fromform The submitted form
 * @param stdClass $quora The quora record
 * @param stdClass $discussion The quora discussion record
 * @return string
 */
function quora_post_subscription($fromform, $quora, $discussion)
{
    global $USER;
    if (\mod_quora\subscriptions::is_forcesubscribed($quora)) {
        return "";
    } else {
        if (\mod_quora\subscriptions::subscription_disabled($quora)) {
            $subscribed = \mod_quora\subscriptions::is_subscribed($USER->id, $quora);
            if ($subscribed && !has_capability('moodle/course:manageactivities', context_course::instance($quora->course), $USER->id)) {
                // This user should not be subscribed to the quora.
                \mod_quora\subscriptions::unsubscribe_user($USER->id, $quora);
            }
            return "";
        }
    }
    $info = new stdClass();
    $info->name = fullname($USER);
    $info->discussion = format_string($discussion->name);
    $info->quora = format_string($quora->name);
    if (isset($fromform->discussionsubscribe) && $fromform->discussionsubscribe) {
        if ($result = \mod_quora\subscriptions::subscribe_user_to_discussion($USER->id, $discussion)) {
            return html_writer::tag('p', get_string('discussionnowsubscribed', 'quora', $info));
        }
    } else {
        if ($result = \mod_quora\subscriptions::unsubscribe_user_from_discussion($USER->id, $discussion)) {
            return html_writer::tag('p', get_string('discussionnownotsubscribed', 'quora', $info));
        }
    }
    return '';
}
Ejemplo n.º 4
0
            echo $OUTPUT->confirm(get_string('confirmunsubscribediscussion', 'quora', $a), $PAGE->url, $viewurl);
        } else {
            echo $OUTPUT->confirm(get_string('confirmunsubscribe', 'quora', format_string($quora->name)), $PAGE->url, $viewurl);
        }
        echo $OUTPUT->footer();
        exit;
    }
    require_sesskey();
    if ($discussionid === null) {
        if (\mod_quora\subscriptions::unsubscribe_user($user->id, $quora, $context, true)) {
            redirect($returnto, get_string("nownotsubscribed", "quora", $info), 1);
        } else {
            print_error('cannotunsubscribe', 'quora', get_local_referer(false));
        }
    } else {
        if (\mod_quora\subscriptions::unsubscribe_user_from_discussion($user->id, $discussion, $context)) {
            $info->discussion = $discussion->name;
            redirect($returnto, get_string("discussionnownotsubscribed", "quora", $info), 1);
        } else {
            print_error('cannotunsubscribe', 'quora', get_local_referer(false));
        }
    }
} else {
    // subscribe
    if (\mod_quora\subscriptions::subscription_disabled($quora) && !has_capability('mod/quora:managesubscriptions', $context)) {
        print_error('disallowsubscribe', 'quora', get_local_referer(false));
    }
    if (!has_capability('mod/quora:viewdiscussion', $context)) {
        print_error('noviewdiscussionspermission', 'quora', get_local_referer(false));
    }
    if (is_null($sesskey)) {
Ejemplo n.º 5
0
        }
    }
    $DB->set_field('quora_discussions', 'quora', $quorato->id, array('id' => $discussion->id));
    $DB->set_field('quora_read', 'quoraid', $quorato->id, array('discussionid' => $discussion->id));
    // Delete the existing per-discussion subscriptions and replace them with the newly calculated ones.
    $DB->delete_records('quora_discussion_subs', array('discussion' => $discussion->id));
    $newdiscussion = clone $discussion;
    $newdiscussion->quora = $quorato->id;
    foreach ($subscriptionchanges as $userid => $preference) {
        if ($preference != \mod_quora\subscriptions::FORUM_DISCUSSION_UNSUBSCRIBED) {
            // Users must have viewdiscussion to a discussion.
            if (has_capability('mod/quora:viewdiscussion', $destinationctx, $userid)) {
                \mod_quora\subscriptions::subscribe_user_to_discussion($userid, $newdiscussion, $destinationctx);
            }
        } else {
            \mod_quora\subscriptions::unsubscribe_user_from_discussion($userid, $newdiscussion, $destinationctx);
        }
    }
    $params = array('context' => $destinationctx, 'objectid' => $discussion->id, 'other' => array('fromquoraid' => $quora->id, 'toquoraid' => $quorato->id));
    $event = \mod_quora\event\discussion_moved::create($params);
    $event->add_record_snapshot('quora_discussions', $discussion);
    $event->add_record_snapshot('quora', $quora);
    $event->add_record_snapshot('quora', $quorato);
    $event->trigger();
    // Delete the RSS files for the 2 quoras to force regeneration of the feeds
    require_once $CFG->dirroot . '/mod/quora/rsslib.php';
    quora_rss_delete_file($quora);
    quora_rss_delete_file($quorato);
    redirect($return . '&moved=-1&sesskey=' . sesskey());
}
// Trigger discussion viewed event.
Ejemplo n.º 6
0
 /**
  * Test that the correct context is used in the events when subscribing
  * users.
  */
 public function test_quora_subscription_page_context_valid()
 {
     global $CFG, $PAGE;
     require_once $CFG->dirroot . '/mod/quora/lib.php';
     // Setup test data.
     $course = $this->getDataGenerator()->create_course();
     $user = $this->getDataGenerator()->create_user();
     $this->getDataGenerator()->enrol_user($user->id, $course->id);
     $options = array('course' => $course->id, 'forcesubscribe' => FORUM_CHOOSESUBSCRIBE);
     $quora = $this->getDataGenerator()->create_module('quora', $options);
     $quiz = $this->getDataGenerator()->create_module('quiz', $options);
     // Add a discussion.
     $record = array();
     $record['course'] = $course->id;
     $record['quora'] = $quora->id;
     $record['userid'] = $user->id;
     $discussion = $this->getDataGenerator()->get_plugin_generator('mod_quora')->create_discussion($record);
     // Add a post.
     $record = array();
     $record['discussion'] = $discussion->id;
     $record['userid'] = $user->id;
     $post = $this->getDataGenerator()->get_plugin_generator('mod_quora')->create_post($record);
     // Set up the default page event to use this quora.
     $PAGE = new moodle_page();
     $cm = get_coursemodule_from_instance('quora', $discussion->quora);
     $context = \context_module::instance($cm->id);
     $PAGE->set_context($context);
     $PAGE->set_cm($cm, $course, $quora);
     // Trigger and capturing the event.
     $sink = $this->redirectEvents();
     // Trigger the event by subscribing the user to the quora.
     \mod_quora\subscriptions::subscribe_user($user->id, $quora);
     $events = $sink->get_events();
     $sink->clear();
     $this->assertCount(1, $events);
     $event = reset($events);
     // Checking that the event contains the expected values.
     $this->assertInstanceOf('\\mod_quora\\event\\subscription_created', $event);
     $this->assertEquals($context, $event->get_context());
     // Trigger the event by unsubscribing the user to the quora.
     \mod_quora\subscriptions::unsubscribe_user($user->id, $quora);
     $events = $sink->get_events();
     $sink->clear();
     $this->assertCount(1, $events);
     $event = reset($events);
     // Checking that the event contains the expected values.
     $this->assertInstanceOf('\\mod_quora\\event\\subscription_deleted', $event);
     $this->assertEquals($context, $event->get_context());
     // Trigger the event by subscribing the user to the discussion.
     \mod_quora\subscriptions::subscribe_user_to_discussion($user->id, $discussion);
     $events = $sink->get_events();
     $sink->clear();
     $this->assertCount(1, $events);
     $event = reset($events);
     // Checking that the event contains the expected values.
     $this->assertInstanceOf('\\mod_quora\\event\\discussion_subscription_created', $event);
     $this->assertEquals($context, $event->get_context());
     // Trigger the event by unsubscribing the user from the discussion.
     \mod_quora\subscriptions::unsubscribe_user_from_discussion($user->id, $discussion);
     $events = $sink->get_events();
     $sink->clear();
     $this->assertCount(1, $events);
     $event = reset($events);
     // Checking that the event contains the expected values.
     $this->assertInstanceOf('\\mod_quora\\event\\discussion_subscription_deleted', $event);
     $this->assertEquals($context, $event->get_context());
     // Now try with the context for a different module (quiz).
     $PAGE = new moodle_page();
     $cm = get_coursemodule_from_instance('quiz', $quiz->id);
     $quizcontext = \context_module::instance($cm->id);
     $PAGE->set_context($quizcontext);
     $PAGE->set_cm($cm, $course, $quiz);
     // Trigger and capturing the event.
     $sink = $this->redirectEvents();
     // Trigger the event by subscribing the user to the quora.
     \mod_quora\subscriptions::subscribe_user($user->id, $quora);
     $events = $sink->get_events();
     $sink->clear();
     $this->assertCount(1, $events);
     $event = reset($events);
     // Checking that the event contains the expected values.
     $this->assertInstanceOf('\\mod_quora\\event\\subscription_created', $event);
     $this->assertEquals($context, $event->get_context());
     // Trigger the event by unsubscribing the user to the quora.
     \mod_quora\subscriptions::unsubscribe_user($user->id, $quora);
     $events = $sink->get_events();
     $sink->clear();
     $this->assertCount(1, $events);
     $event = reset($events);
     // Checking that the event contains the expected values.
     $this->assertInstanceOf('\\mod_quora\\event\\subscription_deleted', $event);
     $this->assertEquals($context, $event->get_context());
     // Trigger the event by subscribing the user to the discussion.
     \mod_quora\subscriptions::subscribe_user_to_discussion($user->id, $discussion);
     $events = $sink->get_events();
     $sink->clear();
     $this->assertCount(1, $events);
     $event = reset($events);
     // Checking that the event contains the expected values.
     $this->assertInstanceOf('\\mod_quora\\event\\discussion_subscription_created', $event);
     $this->assertEquals($context, $event->get_context());
     // Trigger the event by unsubscribing the user from the discussion.
     \mod_quora\subscriptions::unsubscribe_user_from_discussion($user->id, $discussion);
     $events = $sink->get_events();
     $sink->clear();
     $this->assertCount(1, $events);
     $event = reset($events);
     // Checking that the event contains the expected values.
     $this->assertInstanceOf('\\mod_quora\\event\\discussion_subscription_deleted', $event);
     $this->assertEquals($context, $event->get_context());
     // Now try with the course context - the module context should still be used.
     $PAGE = new moodle_page();
     $coursecontext = \context_course::instance($course->id);
     $PAGE->set_context($coursecontext);
     // Trigger the event by subscribing the user to the quora.
     \mod_quora\subscriptions::subscribe_user($user->id, $quora);
     $events = $sink->get_events();
     $sink->clear();
     $this->assertCount(1, $events);
     $event = reset($events);
     // Checking that the event contains the expected values.
     $this->assertInstanceOf('\\mod_quora\\event\\subscription_created', $event);
     $this->assertEquals($context, $event->get_context());
     // Trigger the event by unsubscribing the user to the quora.
     \mod_quora\subscriptions::unsubscribe_user($user->id, $quora);
     $events = $sink->get_events();
     $sink->clear();
     $this->assertCount(1, $events);
     $event = reset($events);
     // Checking that the event contains the expected values.
     $this->assertInstanceOf('\\mod_quora\\event\\subscription_deleted', $event);
     $this->assertEquals($context, $event->get_context());
     // Trigger the event by subscribing the user to the discussion.
     \mod_quora\subscriptions::subscribe_user_to_discussion($user->id, $discussion);
     $events = $sink->get_events();
     $sink->clear();
     $this->assertCount(1, $events);
     $event = reset($events);
     // Checking that the event contains the expected values.
     $this->assertInstanceOf('\\mod_quora\\event\\discussion_subscription_created', $event);
     $this->assertEquals($context, $event->get_context());
     // Trigger the event by unsubscribing the user from the discussion.
     \mod_quora\subscriptions::unsubscribe_user_from_discussion($user->id, $discussion);
     $events = $sink->get_events();
     $sink->clear();
     $this->assertCount(1, $events);
     $event = reset($events);
     // Checking that the event contains the expected values.
     $this->assertInstanceOf('\\mod_quora\\event\\discussion_subscription_deleted', $event);
     $this->assertEquals($context, $event->get_context());
 }