/** * Returns a list of quora discussions optionally sorted and paginated. * * @param int $quoraid the quora instance id * @param string $sortby sort by this element (id, timemodified, timestart or timeend) * @param string $sortdirection sort direction: ASC or DESC * @param int $page page number * @param int $perpage items per page * * @return array the quora discussion details including warnings * @since Moodle 2.8 */ public static function get_quora_discussions_paginated($quoraid, $sortby = 'timemodified', $sortdirection = 'DESC', $page = -1, $perpage = 0) { global $CFG, $DB, $USER; require_once $CFG->dirroot . "/mod/quora/lib.php"; $warnings = array(); $discussions = array(); $params = self::validate_parameters(self::get_quora_discussions_paginated_parameters(), array('quoraid' => $quoraid, 'sortby' => $sortby, 'sortdirection' => $sortdirection, 'page' => $page, 'perpage' => $perpage)); // Compact/extract functions are not recommended. $quoraid = $params['quoraid']; $sortby = $params['sortby']; $sortdirection = $params['sortdirection']; $page = $params['page']; $perpage = $params['perpage']; $sortallowedvalues = array('id', 'timemodified', 'timestart', 'timeend'); if (!in_array($sortby, $sortallowedvalues)) { throw new invalid_parameter_exception('Invalid value for sortby parameter (value: ' . $sortby . '),' . 'allowed values are: ' . implode(',', $sortallowedvalues)); } $sortdirection = strtoupper($sortdirection); $directionallowedvalues = array('ASC', 'DESC'); if (!in_array($sortdirection, $directionallowedvalues)) { throw new invalid_parameter_exception('Invalid value for sortdirection parameter (value: ' . $sortdirection . '),' . 'allowed values are: ' . implode(',', $directionallowedvalues)); } $quora = $DB->get_record('quora', array('id' => $quoraid), '*', MUST_EXIST); $course = $DB->get_record('course', array('id' => $quora->course), '*', MUST_EXIST); $cm = get_coursemodule_from_instance('quora', $quora->id, $course->id, false, MUST_EXIST); // Validate the module context. It checks everything that affects the module visibility (including groupings, etc..). $modcontext = context_module::instance($cm->id); self::validate_context($modcontext); // Check they have the view quora capability. require_capability('mod/quora:viewdiscussion', $modcontext, null, true, 'noviewdiscussionspermission', 'quora'); $sort = 'd.' . $sortby . ' ' . $sortdirection; $alldiscussions = quora_get_discussions($cm, $sort, true, -1, -1, true, $page, $perpage); if ($alldiscussions) { $canviewfullname = has_capability('moodle/site:viewfullnames', $modcontext); // Get the unreads array, this takes a quora id and returns data for all discussions. $unreads = array(); if ($cantrack = quora_tp_can_track_quoras($quora)) { if ($quoratracked = quora_tp_is_tracked($quora)) { $unreads = quora_get_discussions_unread($cm); } } // The quora function returns the replies for all the discussions in a given quora. $replies = quora_count_discussion_replies($quoraid, $sort, -1, $page, $perpage); foreach ($alldiscussions as $discussion) { // This function checks for qanda quoras. // Note that the quora_get_discussions returns as id the post id, not the discussion id so we need to do this. $discussionrec = clone $discussion; $discussionrec->id = $discussion->discussion; if (!quora_user_can_see_discussion($quora, $discussionrec, $modcontext)) { $warning = array(); // Function quora_get_discussions returns quora_posts ids not quora_discussions ones. $warning['item'] = 'post'; $warning['itemid'] = $discussion->id; $warning['warningcode'] = '1'; $warning['message'] = 'You can\'t see this discussion'; $warnings[] = $warning; continue; } $discussion->numunread = 0; if ($cantrack && $quoratracked) { if (isset($unreads[$discussion->discussion])) { $discussion->numunread = (int) $unreads[$discussion->discussion]; } } $discussion->numreplies = 0; if (!empty($replies[$discussion->discussion])) { $discussion->numreplies = (int) $replies[$discussion->discussion]->replies; } // Load user objects from the results of the query. $user = new stdclass(); $user->id = $discussion->userid; $user = username_load_fields_from_object($user, $discussion); $discussion->userfullname = fullname($user, $canviewfullname); // We can have post written by users that are deleted. In this case, those users don't have a valid context. $usercontext = context_user::instance($user->id, IGNORE_MISSING); if ($usercontext) { $discussion->userpictureurl = moodle_url::make_webservice_pluginfile_url($usercontext->id, 'user', 'icon', null, '/', 'f1')->out(false); } else { $discussion->userpictureurl = ''; } $usermodified = new stdclass(); $usermodified->id = $discussion->usermodified; $usermodified = username_load_fields_from_object($usermodified, $discussion, 'um'); $discussion->usermodifiedfullname = fullname($usermodified, $canviewfullname); // We can have post written by users that are deleted. In this case, those users don't have a valid context. $usercontext = context_user::instance($usermodified->id, IGNORE_MISSING); if ($usercontext) { $discussion->usermodifiedpictureurl = moodle_url::make_webservice_pluginfile_url($usercontext->id, 'user', 'icon', null, '/', 'f1')->out(false); } else { $discussion->usermodifiedpictureurl = ''; } // Rewrite embedded images URLs. list($discussion->message, $discussion->messageformat) = external_format_text($discussion->message, $discussion->messageformat, $modcontext->id, 'mod_quora', 'post', $discussion->id); // List attachments. if (!empty($discussion->attachment)) { $discussion->attachments = array(); $fs = get_file_storage(); if ($files = $fs->get_area_files($modcontext->id, 'mod_quora', 'attachment', $discussion->id, "filename", false)) { foreach ($files as $file) { $filename = $file->get_filename(); $discussion->attachments[] = array('filename' => $filename, 'mimetype' => $file->get_mimetype(), 'fileurl' => file_encode_url($CFG->wwwroot . '/webservice/pluginfile.php', '/' . $modcontext->id . '/mod_quora/attachment/' . $discussion->id . '/' . $filename)); } } } $discussions[] = $discussion; } } $result = array(); $result['discussions'] = $discussions; $result['warnings'] = $warnings; return $result; }
/** * Adds information about unread messages, that is only required for the course view page (and * similar), to the course-module object. * @param cm_info $cm Course-module object */ function quora_cm_info_view(cm_info $cm) { global $CFG; if (quora_tp_can_track_quoras()) { if ($unread = quora_tp_count_quora_unread_posts($cm, $cm->get_course())) { $out = '<span class="unread"> <a href="' . $cm->url . '">'; if ($unread == 1) { $out .= get_string('unreadpostsone', 'quora'); } else { $out .= get_string('unreadpostsnumber', 'quora', $unread); } $out .= '</a></span>'; $cm->set_after_link($out); } } }
$strsubscribe = get_string('subscribe', 'quora'); $strunsubscribe = get_string('unsubscribe', 'quora'); $stryes = get_string('yes'); $strno = get_string('no'); $strrss = get_string('rss'); $stremaildigest = get_string('emaildigest'); $searchform = quora_search_form($course); // Retrieve the list of quora digest options for later. $digestoptions = quora_get_user_digest_options(); $digestoptions_selector = new single_select(new moodle_url('/mod/quora/maildigest.php', array('backtoindex' => 1)), 'maildigest', $digestoptions, null, ''); $digestoptions_selector->method = 'post'; // Start of the table for General Forums $generaltable = new html_table(); $generaltable->head = array($strquora, $strdescription, $strdiscussions); $generaltable->align = array('left', 'left', 'center'); if ($usetracking = quora_tp_can_track_quoras()) { $untracked = quora_tp_get_untracked_quoras($USER->id, $course->id); $generaltable->head[] = $strunreadposts; $generaltable->align[] = 'center'; $generaltable->head[] = $strtracking; $generaltable->align[] = 'center'; } // Fill the subscription cache for this course and user combination. \mod_quora\subscriptions::fill_subscription_cache_for_course($course->id, $USER->id); $can_subscribe = is_enrolled($coursecontext); if ($can_subscribe) { $generaltable->head[] = $strsubscribed; $generaltable->align[] = 'center'; $generaltable->head[] = $stremaildigest . ' ' . $OUTPUT->help_icon('emaildigesttype', 'mod_quora'); $generaltable->align[] = 'center'; }
if ($parent) { // If flat AND parent, then force nested display this time if ($displaymode == FORUM_MODE_FLATOLDEST or $displaymode == FORUM_MODE_FLATNEWEST) { $displaymode = FORUM_MODE_NESTED; } } else { $parent = $discussion->firstpost; } if (!($post = quora_get_post_full($parent))) { print_error("notexists", 'quora', "{$CFG->wwwroot}/mod/quora/view.php?f={$quora->id}"); } if (!quora_user_can_see_post($quora, $discussion, $post, null, $cm)) { print_error('noviewdiscussionspermission', 'quora', "{$CFG->wwwroot}/mod/quora/view.php?id={$quora->id}"); } if ($mark == 'read' or $mark == 'unread') { if ($CFG->quora_usermarksread && quora_tp_can_track_quoras($quora) && quora_tp_is_tracked($quora)) { if ($mark == 'read') { quora_tp_add_read_record($USER->id, $postid); } else { // unread quora_tp_delete_read_records($USER->id, $postid); } } } $searchform = quora_search_form($course); $quoranode = $PAGE->navigation->find($cm->id, navigation_node::TYPE_ACTIVITY); if (empty($quoranode)) { $quoranode = $PAGE->navbar; } else { $quoranode->make_active(); }
// The quora to subscribe or unsubscribe to $returnpage = optional_param('returnpage', 'index.php', PARAM_FILE); // Page to return to. require_sesskey(); if (!($quora = $DB->get_record("quora", array("id" => $id)))) { print_error('invalidquoraid', 'quora'); } if (!($course = $DB->get_record("course", array("id" => $quora->course)))) { print_error('invalidcoursemodule'); } if (!($cm = get_coursemodule_from_instance("quora", $quora->id, $course->id))) { print_error('invalidcoursemodule'); } require_login($course, false, $cm); $returnto = quora_go_back_to($returnpage . '?id=' . $course->id . '&f=' . $quora->id); if (!quora_tp_can_track_quoras($quora)) { redirect($returnto); } $info = new stdClass(); $info->name = fullname($USER); $info->quora = format_string($quora->name); $eventparams = array('context' => context_module::instance($cm->id), 'relateduserid' => $USER->id, 'other' => array('quoraid' => $quora->id)); if (quora_tp_is_tracked($quora)) { if (quora_tp_stop_tracking($quora->id)) { $event = \mod_quora\event\readtracking_disabled::create($eventparams); $event->trigger(); redirect($returnto, get_string("nownottracking", "quora", $info), 1); } else { print_error('cannottrack', '', get_local_referer(false)); } } else {
/** * Test the logic in the quora_tp_can_track_quoras() function. */ public function test_quora_tp_can_track_quoras() { global $CFG; $this->resetAfterTest(); $useron = $this->getDataGenerator()->create_user(array('trackquoras' => 1)); $useroff = $this->getDataGenerator()->create_user(array('trackquoras' => 0)); $course = $this->getDataGenerator()->create_course(); $options = array('course' => $course->id, 'trackingtype' => FORUM_TRACKING_OFF); // Off. $quoraoff = $this->getDataGenerator()->create_module('quora', $options); $options = array('course' => $course->id, 'trackingtype' => FORUM_TRACKING_FORCED); // On. $quoraforce = $this->getDataGenerator()->create_module('quora', $options); $options = array('course' => $course->id, 'trackingtype' => FORUM_TRACKING_OPTIONAL); // Optional. $quoraoptional = $this->getDataGenerator()->create_module('quora', $options); // Allow force. $CFG->quora_allowforcedreadtracking = 1; // User on, quora off, should be off. $result = quora_tp_can_track_quoras($quoraoff, $useron); $this->assertEquals(false, $result); // User on, quora on, should be on. $result = quora_tp_can_track_quoras($quoraforce, $useron); $this->assertEquals(true, $result); // User on, quora optional, should be on. $result = quora_tp_can_track_quoras($quoraoptional, $useron); $this->assertEquals(true, $result); // User off, quora off, should be off. $result = quora_tp_can_track_quoras($quoraoff, $useroff); $this->assertEquals(false, $result); // User off, quora force, should be on. $result = quora_tp_can_track_quoras($quoraforce, $useroff); $this->assertEquals(true, $result); // User off, quora optional, should be off. $result = quora_tp_can_track_quoras($quoraoptional, $useroff); $this->assertEquals(false, $result); // Don't allow force. $CFG->quora_allowforcedreadtracking = 0; // User on, quora off, should be off. $result = quora_tp_can_track_quoras($quoraoff, $useron); $this->assertEquals(false, $result); // User on, quora on, should be on. $result = quora_tp_can_track_quoras($quoraforce, $useron); $this->assertEquals(true, $result); // User on, quora optional, should be on. $result = quora_tp_can_track_quoras($quoraoptional, $useron); $this->assertEquals(true, $result); // User off, quora off, should be off. $result = quora_tp_can_track_quoras($quoraoff, $useroff); $this->assertEquals(false, $result); // User off, quora force, should be off. $result = quora_tp_can_track_quoras($quoraforce, $useroff); $this->assertEquals(false, $result); // User off, quora optional, should be off. $result = quora_tp_can_track_quoras($quoraoptional, $useroff); $this->assertEquals(false, $result); }