public function test_subscription_modes() { global $DB; $this->resetAfterTest(true); // Create a course, with a quora. $course = $this->getDataGenerator()->create_course(); $options = array('course' => $course->id); $quora = $this->getDataGenerator()->create_module('quora', $options); \mod_quora\subscriptions::set_subscription_mode($quora->id, FORUM_FORCESUBSCRIBE); $quora = $DB->get_record('quora', array('id' => $quora->id)); $this->assertEquals(FORUM_FORCESUBSCRIBE, \mod_quora\subscriptions::get_subscription_mode($quora)); $this->assertTrue(\mod_quora\subscriptions::is_forcesubscribed($quora)); $this->assertFalse(\mod_quora\subscriptions::is_subscribable($quora)); $this->assertFalse(\mod_quora\subscriptions::subscription_disabled($quora)); \mod_quora\subscriptions::set_subscription_mode($quora->id, FORUM_DISALLOWSUBSCRIBE); $quora = $DB->get_record('quora', array('id' => $quora->id)); $this->assertEquals(FORUM_DISALLOWSUBSCRIBE, \mod_quora\subscriptions::get_subscription_mode($quora)); $this->assertTrue(\mod_quora\subscriptions::subscription_disabled($quora)); $this->assertFalse(\mod_quora\subscriptions::is_subscribable($quora)); $this->assertFalse(\mod_quora\subscriptions::is_forcesubscribed($quora)); \mod_quora\subscriptions::set_subscription_mode($quora->id, FORUM_INITIALSUBSCRIBE); $quora = $DB->get_record('quora', array('id' => $quora->id)); $this->assertEquals(FORUM_INITIALSUBSCRIBE, \mod_quora\subscriptions::get_subscription_mode($quora)); $this->assertTrue(\mod_quora\subscriptions::is_subscribable($quora)); $this->assertFalse(\mod_quora\subscriptions::subscription_disabled($quora)); $this->assertFalse(\mod_quora\subscriptions::is_forcesubscribed($quora)); \mod_quora\subscriptions::set_subscription_mode($quora->id, FORUM_CHOOSESUBSCRIBE); $quora = $DB->get_record('quora', array('id' => $quora->id)); $this->assertEquals(FORUM_CHOOSESUBSCRIBE, \mod_quora\subscriptions::get_subscription_mode($quora)); $this->assertTrue(\mod_quora\subscriptions::is_subscribable($quora)); $this->assertFalse(\mod_quora\subscriptions::subscription_disabled($quora)); $this->assertFalse(\mod_quora\subscriptions::is_forcesubscribed($quora)); }
/** * Form definition * * @return void */ function definition() { global $CFG, $OUTPUT; $mform =& $this->_form; $course = $this->_customdata['course']; $cm = $this->_customdata['cm']; $coursecontext = $this->_customdata['coursecontext']; $modcontext = $this->_customdata['modcontext']; $quora = $this->_customdata['quora']; $post = $this->_customdata['post']; $subscribe = $this->_customdata['subscribe']; $edit = $this->_customdata['edit']; $thresholdwarning = $this->_customdata['thresholdwarning']; $mform->addElement('header', 'general', ''); //fill in the data depending on page params later using set_data // If there is a warning message and we are not editing a post we need to handle the warning. if (!empty($thresholdwarning) && !$edit) { // Here we want to display a warning if they can still post but have reached the warning threshold. if ($thresholdwarning->canpost) { $message = get_string($thresholdwarning->errorcode, $thresholdwarning->module, $thresholdwarning->additional); $mform->addElement('html', $OUTPUT->notification($message)); } } $mform->addElement('text', 'subject', get_string('subject', 'quora'), 'size="48"'); $mform->setType('subject', PARAM_TEXT); $mform->addRule('subject', get_string('required'), 'required', null, 'client'); $mform->addRule('subject', get_string('maximumchars', '', 255), 'maxlength', 255, 'client'); $mform->addElement('editor', 'message', get_string('message', 'quora'), null, self::editor_options($modcontext, empty($post->id) ? null : $post->id)); $mform->setType('message', PARAM_RAW); $mform->addRule('message', get_string('required'), 'required', null, 'client'); $manageactivities = has_capability('moodle/course:manageactivities', $coursecontext); if (\mod_quora\subscriptions::is_forcesubscribed($quora)) { $mform->addElement('checkbox', 'discussionsubscribe', get_string('discussionsubscription', 'quora')); $mform->freeze('discussionsubscribe'); $mform->setDefaults('discussionsubscribe', 0); $mform->addHelpButton('discussionsubscribe', 'forcesubscribed', 'quora'); } else { if (\mod_quora\subscriptions::subscription_disabled($quora) && !$manageactivities) { $mform->addElement('checkbox', 'discussionsubscribe', get_string('discussionsubscription', 'quora')); $mform->freeze('discussionsubscribe'); $mform->setDefaults('discussionsubscribe', 0); $mform->addHelpButton('discussionsubscribe', 'disallowsubscription', 'quora'); } else { $mform->addElement('checkbox', 'discussionsubscribe', get_string('discussionsubscription', 'quora')); $mform->addHelpButton('discussionsubscribe', 'discussionsubscription', 'quora'); } } if (!empty($quora->maxattachments) && $quora->maxbytes != 1 && has_capability('mod/quora:createattachment', $modcontext)) { // 1 = No attachments at all $mform->addElement('filemanager', 'attachments', get_string('attachment', 'quora'), null, self::attachment_options($quora)); $mform->addHelpButton('attachments', 'attachment', 'quora'); } if (empty($post->id) && $manageactivities) { $mform->addElement('checkbox', 'mailnow', get_string('mailnow', 'quora')); } if (!empty($CFG->quora_enabletimedposts) && !$post->parent && has_capability('mod/quora:viewhiddentimedposts', $coursecontext)) { // hack alert $mform->addElement('header', 'displayperiod', get_string('displayperiod', 'quora')); $mform->addElement('date_selector', 'timestart', get_string('displaystart', 'quora'), array('optional' => true)); $mform->addHelpButton('timestart', 'displaystart', 'quora'); $mform->addElement('date_selector', 'timeend', get_string('displayend', 'quora'), array('optional' => true)); $mform->addHelpButton('timeend', 'displayend', 'quora'); } else { $mform->addElement('hidden', 'timestart'); $mform->setType('timestart', PARAM_INT); $mform->addElement('hidden', 'timeend'); $mform->setType('timeend', PARAM_INT); $mform->setConstants(array('timestart' => 0, 'timeend' => 0)); } if ($groupmode = groups_get_activity_groupmode($cm, $course)) { // hack alert $groupdata = groups_get_activity_allowed_groups($cm); $groupcount = count($groupdata); $groupinfo = array(); $modulecontext = context_module::instance($cm->id); // Check whether the user has access to all groups in this quora from the accessallgroups cap. if ($groupmode == VISIBLEGROUPS || has_capability('moodle/site:accessallgroups', $modulecontext)) { // Only allow posting to all groups if the user has access to all groups. $groupinfo = array('0' => get_string('allparticipants')); $groupcount++; } $contextcheck = has_capability('mod/quora:movediscussions', $modulecontext) && empty($post->parent) && $groupcount > 1; if ($contextcheck) { if (has_capability('mod/quora:canposttomygroups', $modulecontext) && !isset($post->edit)) { $mform->addElement('checkbox', 'posttomygroups', get_string('posttomygroups', 'quora')); $mform->addHelpButton('posttomygroups', 'posttomygroups', 'quora'); $mform->disabledIf('groupinfo', 'posttomygroups', 'checked'); } foreach ($groupdata as $grouptemp) { $groupinfo[$grouptemp->id] = $grouptemp->name; } $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 { $groupname = format_string($groupdata[$post->groupid]->name); } $mform->addElement('static', 'groupinfo', get_string('group'), $groupname); } } //------------------------------------------------------------------------------- // buttons if (isset($post->edit)) { // hack alert $submit_string = get_string('savechanges'); } else { $submit_string = get_string('posttoquora', 'quora'); } $this->add_action_buttons(true, $submit_string); $mform->addElement('hidden', 'course'); $mform->setType('course', PARAM_INT); $mform->addElement('hidden', 'quora'); $mform->setType('quora', PARAM_INT); $mform->addElement('hidden', 'discussion'); $mform->setType('discussion', PARAM_INT); $mform->addElement('hidden', 'parent'); $mform->setType('parent', PARAM_INT); $mform->addElement('hidden', 'userid'); $mform->setType('userid', PARAM_INT); $mform->addElement('hidden', 'groupid'); $mform->setType('groupid', PARAM_INT); $mform->addElement('hidden', 'edit'); $mform->setType('edit', PARAM_INT); $mform->addElement('hidden', 'reply'); $mform->setType('reply', PARAM_INT); }
/** * Helper to determine whether the specified quora can be subscribed to. * * @param \stdClass $quora The record of the quora to test * @return bool */ public static function is_subscribable($quora) { return !\mod_quora\subscriptions::is_forcesubscribed($quora) && !\mod_quora\subscriptions::subscription_disabled($quora); }
/** * Adds module specific settings to the settings block * * @param settings_navigation $settings The settings navigation object * @param navigation_node $quoranode The node to add module settings to */ function quora_extend_settings_navigation(settings_navigation $settingsnav, navigation_node $quoranode) { global $USER, $PAGE, $CFG, $DB, $OUTPUT; $quoraobject = $DB->get_record("quora", array("id" => $PAGE->cm->instance)); if (empty($PAGE->cm->context)) { $PAGE->cm->context = context_module::instance($PAGE->cm->instance); } $params = $PAGE->url->params(); if (!empty($params['d'])) { $discussionid = $params['d']; } // for some actions you need to be enrolled, beiing admin is not enough sometimes here $enrolled = is_enrolled($PAGE->cm->context, $USER, '', false); $activeenrolled = is_enrolled($PAGE->cm->context, $USER, '', true); $canmanage = has_capability('mod/quora:managesubscriptions', $PAGE->cm->context); $subscriptionmode = \mod_quora\subscriptions::get_subscription_mode($quoraobject); $cansubscribe = $activeenrolled && !\mod_quora\subscriptions::is_forcesubscribed($quoraobject) && (!\mod_quora\subscriptions::subscription_disabled($quoraobject) || $canmanage); if ($canmanage) { $mode = $quoranode->add(get_string('subscriptionmode', 'quora'), null, navigation_node::TYPE_CONTAINER); $allowchoice = $mode->add(get_string('subscriptionoptional', 'quora'), new moodle_url('/mod/quora/subscribe.php', array('id' => $quoraobject->id, 'mode' => FORUM_CHOOSESUBSCRIBE, 'sesskey' => sesskey())), navigation_node::TYPE_SETTING); $forceforever = $mode->add(get_string("subscriptionforced", "quora"), new moodle_url('/mod/quora/subscribe.php', array('id' => $quoraobject->id, 'mode' => FORUM_FORCESUBSCRIBE, 'sesskey' => sesskey())), navigation_node::TYPE_SETTING); $forceinitially = $mode->add(get_string("subscriptionauto", "quora"), new moodle_url('/mod/quora/subscribe.php', array('id' => $quoraobject->id, 'mode' => FORUM_INITIALSUBSCRIBE, 'sesskey' => sesskey())), navigation_node::TYPE_SETTING); $disallowchoice = $mode->add(get_string('subscriptiondisabled', 'quora'), new moodle_url('/mod/quora/subscribe.php', array('id' => $quoraobject->id, 'mode' => FORUM_DISALLOWSUBSCRIBE, 'sesskey' => sesskey())), navigation_node::TYPE_SETTING); switch ($subscriptionmode) { case FORUM_CHOOSESUBSCRIBE: // 0 $allowchoice->action = null; $allowchoice->add_class('activesetting'); break; case FORUM_FORCESUBSCRIBE: // 1 $forceforever->action = null; $forceforever->add_class('activesetting'); break; case FORUM_INITIALSUBSCRIBE: // 2 $forceinitially->action = null; $forceinitially->add_class('activesetting'); break; case FORUM_DISALLOWSUBSCRIBE: // 3 $disallowchoice->action = null; $disallowchoice->add_class('activesetting'); break; } } else { if ($activeenrolled) { switch ($subscriptionmode) { case FORUM_CHOOSESUBSCRIBE: // 0 $notenode = $quoranode->add(get_string('subscriptionoptional', 'quora')); break; case FORUM_FORCESUBSCRIBE: // 1 $notenode = $quoranode->add(get_string('subscriptionforced', 'quora')); break; case FORUM_INITIALSUBSCRIBE: // 2 $notenode = $quoranode->add(get_string('subscriptionauto', 'quora')); break; case FORUM_DISALLOWSUBSCRIBE: // 3 $notenode = $quoranode->add(get_string('subscriptiondisabled', 'quora')); break; } } } if ($cansubscribe) { if (\mod_quora\subscriptions::is_subscribed($USER->id, $quoraobject, null, $PAGE->cm)) { $linktext = get_string('unsubscribe', 'quora'); } else { $linktext = get_string('subscribe', 'quora'); } $url = new moodle_url('/mod/quora/subscribe.php', array('id' => $quoraobject->id, 'sesskey' => sesskey())); $quoranode->add($linktext, $url, navigation_node::TYPE_SETTING); if (isset($discussionid)) { if (\mod_quora\subscriptions::is_subscribed($USER->id, $quoraobject, $discussionid, $PAGE->cm)) { $linktext = get_string('unsubscribediscussion', 'quora'); } else { $linktext = get_string('subscribediscussion', 'quora'); } $url = new moodle_url('/mod/quora/subscribe.php', array('id' => $quoraobject->id, 'sesskey' => sesskey(), 'd' => $discussionid, 'returnurl' => $PAGE->url->out())); $quoranode->add($linktext, $url, navigation_node::TYPE_SETTING); } } if (has_capability('mod/quora:viewsubscribers', $PAGE->cm->context)) { $url = new moodle_url('/mod/quora/subscribers.php', array('id' => $quoraobject->id)); $quoranode->add(get_string('showsubscribers', 'quora'), $url, navigation_node::TYPE_SETTING); } if ($enrolled && quora_tp_can_track_quoras($quoraobject)) { // keep tracking info for users with suspended enrolments if ($quoraobject->trackingtype == FORUM_TRACKING_OPTIONAL || !$CFG->quora_allowforcedreadtracking && $quoraobject->trackingtype == FORUM_TRACKING_FORCED) { if (quora_tp_is_tracked($quoraobject)) { $linktext = get_string('notrackquora', 'quora'); } else { $linktext = get_string('trackquora', 'quora'); } $url = new moodle_url('/mod/quora/settracking.php', array('id' => $quoraobject->id, 'sesskey' => sesskey())); $quoranode->add($linktext, $url, navigation_node::TYPE_SETTING); } } if (!isloggedin() && $PAGE->course->id == SITEID) { $userid = guest_user()->id; } else { $userid = $USER->id; } $hascourseaccess = $PAGE->course->id == SITEID || can_access_course($PAGE->course, $userid); $enablerssfeeds = !empty($CFG->enablerssfeeds) && !empty($CFG->quora_enablerssfeeds); if ($enablerssfeeds && $quoraobject->rsstype && $quoraobject->rssarticles && $hascourseaccess) { if (!function_exists('rss_get_url')) { require_once "{$CFG->libdir}/rsslib.php"; } if ($quoraobject->rsstype == 1) { $string = get_string('rsssubscriberssdiscussions', 'quora'); } else { $string = get_string('rsssubscriberssposts', 'quora'); } $url = new moodle_url(rss_get_url($PAGE->cm->context->id, $userid, "mod_quora", $quoraobject->id)); $quoranode->add($string, $url, settings_navigation::TYPE_SETTING, null, null, new pix_icon('i/rss', '')); } }
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)) { // We came here via link in email. $PAGE->set_title($course->shortname); $PAGE->set_heading($course->fullname); echo $OUTPUT->header(); $viewurl = new moodle_url('/mod/quora/view.php', array('f' => $id)); if ($discussionid) { $a = new stdClass(); $a->quora = format_string($quora->name); $a->discussion = format_string($discussion->name);
$formheading = ''; if (!empty($parent)) { $heading = get_string("yourreply", "quora"); $formheading = get_string('reply', 'quora'); } else { if ($quora->type == 'qanda') { $heading = get_string('yournewquestion', 'quora'); } else { $heading = get_string('yournewtopic', 'quora'); } } $postid = empty($post->id) ? null : $post->id; $draftid_editor = file_get_submitted_draft_itemid('message'); $currenttext = file_prepare_draft_area($draftid_editor, $modcontext->id, 'mod_quora', 'post', $postid, mod_quora_post_form::editor_options($modcontext, $postid), $post->message); $manageactivities = has_capability('moodle/course:manageactivities', $coursecontext); if (\mod_quora\subscriptions::subscription_disabled($quora) && !$manageactivities) { // User does not have permission to subscribe to this discussion at all. $discussionsubscribe = false; } else { if (\mod_quora\subscriptions::is_forcesubscribed($quora)) { // User does not have permission to unsubscribe from this discussion at all. $discussionsubscribe = true; } else { if (isset($discussion) && \mod_quora\subscriptions::is_subscribed($USER->id, $quora, $discussion->id, $cm)) { // User is subscribed to the discussion - continue the subscription. $discussionsubscribe = true; } else { if (!isset($discussion) && \mod_quora\subscriptions::is_subscribed($USER->id, $quora, null, $cm)) { // Starting a new discussion, and the user is subscribed to the quora - subscribe to the discussion. $discussionsubscribe = true; } else {