Example #1
0
    /**
     * Trigger the course module viewed event.
     *
     * @param int $scormid the scorm instance id
     * @return array of warnings and status result
     * @since Moodle 3.0
     * @throws moodle_exception
     */
    public static function view_scorm($scormid) {
        global $DB, $CFG;
        require_once($CFG->dirroot . '/mod/scorm/lib.php');

        $params = self::validate_parameters(self::view_scorm_parameters(),
                                            array(
                                                'scormid' => $scormid
                                            ));
        $warnings = array();

        // Request and permission validation.
        $scorm = $DB->get_record('scorm', array('id' => $params['scormid']), '*', MUST_EXIST);
        list($course, $cm) = get_course_and_cm_from_instance($scorm, 'scorm');

        $context = context_module::instance($cm->id);
        self::validate_context($context);

        // Call the scorm/lib API.
        scorm_view($scorm, $course, $cm, $context);

        $result = array();
        $result['status'] = true;
        $result['warnings'] = $warnings;
        return $result;
    }
Example #2
0
    /**
     * Simulate the imscp/view.php web interface page: trigger events, completion, etc...
     *
     * @param int $imscpid the imscp instance id
     * @return array of warnings and status result
     * @since Moodle 3.0
     * @throws moodle_exception
     */
    public static function view_imscp($imscpid) {
        global $DB, $CFG;
        require_once($CFG->dirroot . "/mod/imscp/lib.php");

        $params = self::validate_parameters(self::view_imscp_parameters(),
                                            array(
                                                'imscpid' => $imscpid
                                            ));
        $warnings = array();

        // Request and permission validation.
        $imscp = $DB->get_record('imscp', array('id' => $params['imscpid']), '*', MUST_EXIST);
        list($course, $cm) = get_course_and_cm_from_instance($imscp, 'imscp');

        $context = context_module::instance($cm->id);
        self::validate_context($context);

        require_capability('mod/imscp:view', $context);

        // Call the imscp/lib API.
        imscp_view($imscp, $course, $cm, $context);

        $result = array();
        $result['status'] = true;
        $result['warnings'] = $warnings;
        return $result;
    }
 /**
  * Search a list of modules.
  *
  * @param $modulecode
  * @return array [string]
  * @throws \invalid_parameter_exception
  */
 public static function get_submission_status($submissionid)
 {
     global $DB, $USER;
     $params = self::validate_parameters(self::get_submission_status_parameters(), array('submissionid' => $submissionid));
     $submissionid = $params['submissionid'];
     $submission = $DB->get_record('turnitintooltwo_submissions', array('id' => $submissionid));
     if (!$submission) {
         return array('status' => 'error');
     }
     // Grab more data.
     $turnitintooltwo = $DB->get_record('turnitintooltwo', array('id' => $submission->turnitintooltwoid));
     list($course, $cm) = get_course_and_cm_from_instance($turnitintooltwo, 'turnitintooltwo');
     // Check this is our submission.
     if ($USER->id !== $submission->userid && !has_capability('mod/turnitintooltwo:grade', \context_module::instance($cm->id))) {
         return array('status' => 'nopermission');
     }
     // What is the status?
     $status = $DB->get_record('turnitintooltwo_sub_status', array('submissionid' => $submissionid));
     if (!$status) {
         return array('status' => 'queued');
     }
     // Decode the receipt.
     $digitalreceipt = (array) json_decode($status->receipt);
     // Woo!
     if ($status->status == \mod_turnitintooltwo\task\submit_assignment::STATUS_SUCCESS) {
         $turnitintooltwoview = new \turnitintooltwo_view();
         $digitalreceipt = $turnitintooltwoview->show_digital_receipt($digitalreceipt);
         $digitalreceipt = \html_writer::tag("div", $digitalreceipt, array("id" => "box_receipt"));
         return array('status' => 'success', 'message' => $digitalreceipt);
     }
     return array('status' => 'failed', 'message' => \html_writer::tag("div", $digitalreceipt["message"], array("class" => "alert alert-danger")));
 }
Example #4
0
 /**
  * Returns our CMID.
  */
 public function get_cmid()
 {
     if (!isset($this->cmid)) {
         list($course, $cm) = get_course_and_cm_from_instance($this->id, 'qa');
         $this->cmid = $cm->id;
     }
     return $this->cmid;
 }
 public function execute()
 {
     global $CFG, $DB;
     require_once $CFG->dirroot . "/mod/turnitintooltwo/lib.php";
     require_once $CFG->dirroot . "/mod/turnitintooltwo/turnitintooltwo_view.class.php";
     $data = (array) $this->get_custom_data();
     // Make sure we are still wanted.
     $submission = $DB->get_record('turnitintooltwo_submissions', array('id' => $data['submissionid']));
     if (!$submission) {
         return true;
     }
     cli_writeln("Processing Turnitintooltwo submission: " . $data['submissionid']);
     $user = $DB->get_record('user', array('id' => $data['userid']));
     \core\session\manager::set_user($user);
     $turnitintooltwo = $DB->get_record('turnitintooltwo', array('id' => $data['tiiid']));
     list($course, $cm) = get_course_and_cm_from_instance($turnitintooltwo, 'turnitintooltwo');
     try {
         $turnitintooltwoassignment = new \turnitintooltwo_assignment($turnitintooltwo->id, $turnitintooltwo);
         $turnitintooltwosubmission = new \turnitintooltwo_submission($data['submissionid'], "moodle", $turnitintooltwoassignment);
         $parts = $turnitintooltwoassignment->get_parts();
         $tiisubmission = $turnitintooltwosubmission->do_tii_submission($cm, $turnitintooltwoassignment);
         // Update submission.
         $DB->update_record('turnitintooltwo_submissions', array('id' => $data['submissionid'], 'submission_modified' => $data['subtime']));
     } catch (\Exception $e) {
         $tiisubmission = array('success' => false, 'message' => $e->getMessage());
         cli_writeln($e->getMessage());
     }
     $digitalreceipt = $tiisubmission;
     $digitalreceipt['is_manual'] = 0;
     $digitalreceipt = json_encode($digitalreceipt);
     $this->update_sub_status($data['submissionid'], $tiisubmission['success'], $digitalreceipt);
     if ($tiisubmission['success'] === true) {
         $lockedassignment = new \stdClass();
         $lockedassignment->id = $turnitintooltwoassignment->turnitintooltwo->id;
         $lockedassignment->submitted = 1;
         $DB->update_record('turnitintooltwo', $lockedassignment);
         $lockedpart = new \stdClass();
         $lockedpart->id = $data['submissionpart'];
         $lockedpart->submitted = 1;
         // Disable anonymous marking if post date has passed.
         if ($parts[$data['submissionpart']]->dtpost <= time()) {
             $lockedpart->unanon = 1;
         }
         $DB->update_record('turnitintooltwo_parts', $lockedpart);
         cli_writeln("Finished processing successful submission: " . $data['submissionid']);
     } else {
         turnitintooltwo_add_to_log($course->id, "errored submission", 'view.php?id=' . $cm->id, "Failed to submit '" . $turnitintooltwosubmission->submission_title . "'", $cm->id, $user->id, array('submissionid' => $data['submissionid']));
         cli_writeln("Finished processing unsuccessful submission: " . $data['submissionid']);
     }
     \core\session\manager::set_user(get_admin());
     return $tiisubmission['success'];
 }
Example #6
0
 /**
  * Simulate the book/view.php web interface page: trigger events, completion, etc...
  *
  * @param int $bookid the book instance id
  * @param int $chapterid the book chapter id
  * @return array of warnings and status result
  * @since Moodle 3.0
  * @throws moodle_exception
  */
 public static function view_book($bookid, $chapterid = 0)
 {
     global $DB, $CFG;
     require_once $CFG->dirroot . "/mod/book/lib.php";
     require_once $CFG->dirroot . "/mod/book/locallib.php";
     $params = self::validate_parameters(self::view_book_parameters(), array('bookid' => $bookid, 'chapterid' => $chapterid));
     $bookid = $params['bookid'];
     $chapterid = $params['chapterid'];
     $warnings = array();
     // Request and permission validation.
     $book = $DB->get_record('book', array('id' => $bookid), '*', MUST_EXIST);
     list($course, $cm) = get_course_and_cm_from_instance($book, 'book');
     $context = context_module::instance($cm->id);
     self::validate_context($context);
     require_capability('mod/book:read', $context);
     $chapters = book_preload_chapters($book);
     $firstchapterid = 0;
     $lastchapterid = 0;
     foreach ($chapters as $ch) {
         if ($ch->hidden) {
             continue;
         }
         if (!$firstchapterid) {
             $firstchapterid = $ch->id;
         }
         $lastchapterid = $ch->id;
     }
     if (!$chapterid) {
         // Trigger the module viewed events since we are displaying the book.
         book_view($book, null, false, $course, $cm, $context);
         $chapterid = $firstchapterid;
     }
     // Check if book is empty (warning).
     if (!$chapterid) {
         $warnings[] = array('item' => 'book', 'itemid' => $book->id, 'warningcode' => '1', 'message' => get_string('nocontent', 'mod_book'));
     } else {
         $chapter = $DB->get_record('book_chapters', array('id' => $chapterid, 'bookid' => $book->id));
         $viewhidden = has_capability('mod/book:viewhiddenchapters', $context);
         if (!$chapter or $chapter->hidden and !$viewhidden) {
             throw new moodle_exception('errorchapter', 'mod_book');
         }
         // Trigger the chapter viewed event.
         $islastchapter = $chapter->id == $lastchapterid ? true : false;
         book_view($book, $chapter, $islastchapter, $course, $cm, $context);
     }
     $result = array();
     $result['status'] = true;
     $result['warnings'] = $warnings;
     return $result;
 }
Example #7
0
 /**
  * Simulate the folder/view.php web interface page: trigger events, completion, etc...
  *
  * @param int $folderid the folder instance id
  * @return array of warnings and status result
  * @since Moodle 3.0
  * @throws moodle_exception
  */
 public static function view_folder($folderid)
 {
     global $DB, $CFG;
     require_once $CFG->dirroot . "/mod/folder/lib.php";
     $params = self::validate_parameters(self::view_folder_parameters(), array('folderid' => $folderid));
     $warnings = array();
     // Request and permission validation.
     $folder = $DB->get_record('folder', array('id' => $params['folderid']), '*', MUST_EXIST);
     list($course, $cm) = get_course_and_cm_from_instance($folder, 'folder');
     $context = context_module::instance($cm->id);
     self::validate_context($context);
     require_capability('mod/folder:view', $context);
     // Call the page/lib API.
     folder_view($folder, $course, $cm, $context);
     $result = array();
     $result['status'] = true;
     $result['warnings'] = $warnings;
     return $result;
 }
Example #8
0
require_once $CFG->dirroot . '/mod/quiz/lib.php';
require_once $CFG->dirroot . '/mod/quiz/locallib.php';
require_once $CFG->dirroot . '/mod/quiz/override_form.php';
$cmid = optional_param('cmid', 0, PARAM_INT);
$overrideid = optional_param('id', 0, PARAM_INT);
$action = optional_param('action', null, PARAM_ALPHA);
$reset = optional_param('reset', false, PARAM_BOOL);
$override = null;
if ($overrideid) {
    if (!($override = $DB->get_record('quiz_overrides', array('id' => $overrideid)))) {
        print_error('invalidoverrideid', 'quiz');
    }
    if (!($quiz = $DB->get_record('quiz', array('id' => $override->quiz)))) {
        print_error('invalidcoursemodule');
    }
    list($course, $cm) = get_course_and_cm_from_instance($quiz, 'quiz');
} else {
    if ($cmid) {
        list($course, $cm) = get_course_and_cm_from_cmid($cmid, 'quiz');
        $quiz = $DB->get_record('quiz', array('id' => $cm->instance), '*', MUST_EXIST);
    } else {
        print_error('invalidcoursemodule');
    }
}
$course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
$url = new moodle_url('/mod/quiz/overrideedit.php');
if ($action) {
    $url->param('action', $action);
}
if ($overrideid) {
    $url->param('id', $overrideid);
Example #9
0
 /**
  * Simulate the forum/discuss.php web interface page: trigger events
  *
  * @param int $discussionid the discussion id
  * @return array of warnings and status result
  * @since Moodle 2.9
  * @throws moodle_exception
  */
 public static function view_forum_discussion($discussionid)
 {
     global $DB, $CFG;
     require_once $CFG->dirroot . "/mod/forum/lib.php";
     $params = self::validate_parameters(self::view_forum_discussion_parameters(), array('discussionid' => $discussionid));
     $warnings = array();
     $discussion = $DB->get_record('forum_discussions', array('id' => $params['discussionid']), '*', MUST_EXIST);
     $forum = $DB->get_record('forum', array('id' => $discussion->forum), '*', MUST_EXIST);
     list($course, $cm) = get_course_and_cm_from_instance($forum, 'forum');
     // 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);
     require_capability('mod/forum:viewdiscussion', $modcontext, null, true, 'noviewdiscussionspermission', 'forum');
     // Call the forum/lib API.
     forum_discussion_view($modcontext, $forum, $discussion);
     $result = array();
     $result['status'] = true;
     $result['warnings'] = $warnings;
     return $result;
 }
Example #10
0
 *
 * @author Andreas Grabs
 * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
 * @package mod_feedback
 */
require_once "../../config.php";
require_once "lib.php";
feedback_init_feedback_session();
$itemid = optional_param('id', false, PARAM_INT);
if (!$itemid) {
    $cmid = required_param('cmid', PARAM_INT);
    $typ = required_param('typ', PARAM_ALPHA);
}
if ($itemid) {
    $item = $DB->get_record('feedback_item', array('id' => $itemid), '*', MUST_EXIST);
    list($course, $cm) = get_course_and_cm_from_instance($item->feedback, 'feedback');
    $url = new moodle_url('/mod/feedback/edit_item.php', array('id' => $itemid));
    $typ = $item->typ;
} else {
    $item = null;
    list($course, $cm) = get_course_and_cm_from_cmid($cmid, 'feedback');
    $url = new moodle_url('/mod/feedback/edit_item.php', array('cmid' => $cm->id, 'typ' => $typ));
    $item = (object) ['id' => null, 'position' => -1, 'typ' => $typ, 'options' => ''];
}
require_login($course, true, $cm);
$context = context_module::instance($cm->id);
require_capability('mod/feedback:edititems', $context);
$feedback = $PAGE->activityrecord;
$editurl = new moodle_url('/mod/feedback/edit.php', array('id' => $cm->id));
$PAGE->set_url($url);
// If the typ is pagebreak so the item will be saved directly.
Example #11
0
 /**
  * Validate a glossary via ID.
  *
  * @param  int $id The glossary ID.
  * @return array Contains glossary, context, course and cm.
  */
 protected static function validate_glossary($id)
 {
     global $DB;
     $glossary = $DB->get_record('glossary', array('id' => $id), '*', MUST_EXIST);
     list($course, $cm) = get_course_and_cm_from_instance($glossary, 'glossary');
     $context = context_module::instance($cm->id);
     self::validate_context($context);
     return array($glossary, $context, $course, $cm);
 }
Example #12
0
 /**
  * Trigger the course module viewed event and update the module completion status.
  *
  * @param int $quizid quiz instance id
  * @return array of warnings and status result
  * @since Moodle 3.1
  * @throws moodle_exception
  */
 public static function view_quiz($quizid)
 {
     global $DB;
     $params = self::validate_parameters(self::view_quiz_parameters(), array('quizid' => $quizid));
     $warnings = array();
     // Request and permission validation.
     $quiz = $DB->get_record('quiz', array('id' => $params['quizid']), '*', MUST_EXIST);
     list($course, $cm) = get_course_and_cm_from_instance($quiz, 'quiz');
     $context = context_module::instance($cm->id);
     self::validate_context($context);
     // Trigger course_module_viewed event and completion.
     quiz_view($quiz, $course, $cm, $context);
     $result = array();
     $result['status'] = true;
     $result['warnings'] = $warnings;
     return $result;
 }
Example #13
0
    /**
     * Add a new discussion into an existing forum.
     *
     * @param int $forumid the forum instance id
     * @param string $subject new discussion subject
     * @param string $message new discussion message (only html format allowed)
     * @param int $groupid the user course group
     * @param array $options optional settings
     * @return array of warnings and the new discussion id
     * @since Moodle 3.0
     * @throws moodle_exception
     */
    public static function add_discussion($forumid, $subject, $message, $groupid = -1, $options = array()) {
        global $DB, $CFG;
        require_once($CFG->dirroot . "/mod/forum/lib.php");

        $params = self::validate_parameters(self::add_discussion_parameters(),
                                            array(
                                                'forumid' => $forumid,
                                                'subject' => $subject,
                                                'message' => $message,
                                                'groupid' => $groupid,
                                                'options' => $options
                                            ));
        // Validate options.
        $options = array(
            'discussionsubscribe' => true
        );
        foreach ($params['options'] as $option) {
            $name = trim($option['name']);
            switch ($name) {
                case 'discussionsubscribe':
                    $value = clean_param($option['value'], PARAM_BOOL);
                    break;
                default:
                    throw new moodle_exception('errorinvalidparam', 'webservice', '', $name);
            }
            $options[$name] = $value;
        }

        $warnings = array();

        // Request and permission validation.
        $forum = $DB->get_record('forum', array('id' => $params['forumid']), '*', MUST_EXIST);
        list($course, $cm) = get_course_and_cm_from_instance($forum, 'forum');

        $context = context_module::instance($cm->id);
        self::validate_context($context);

        // Normalize group.
        if (!groups_get_activity_groupmode($cm)) {
            // Groups not supported, force to -1.
            $groupid = -1;
        } else {
            // Check if we receive the default or and empty value for groupid,
            // in this case, get the group for the user in the activity.
            if ($groupid === -1 or empty($params['groupid'])) {
                $groupid = groups_get_activity_group($cm);
            } else {
                // Here we rely in the group passed, forum_user_can_post_discussion will validate the group.
                $groupid = $params['groupid'];
            }
        }

        if (!forum_user_can_post_discussion($forum, $groupid, -1, $cm, $context)) {
            throw new moodle_exception('cannotcreatediscussion', 'forum');
        }

        $thresholdwarning = forum_check_throttling($forum, $cm);
        forum_check_blocking_threshold($thresholdwarning);

        // Create the discussion.
        $discussion = new stdClass();
        $discussion->course = $course->id;
        $discussion->forum = $forum->id;
        $discussion->message = $params['message'];
        $discussion->messageformat = FORMAT_HTML;   // Force formatting for now.
        $discussion->messagetrust = trusttext_trusted($context);
        $discussion->itemid = 0;
        $discussion->groupid = $groupid;
        $discussion->mailnow = 0;
        $discussion->subject = $params['subject'];
        $discussion->name = $discussion->subject;
        $discussion->timestart = 0;
        $discussion->timeend = 0;

        if ($discussionid = forum_add_discussion($discussion)) {

            $discussion->id = $discussionid;

            // Trigger events and completion.

            $params = array(
                'context' => $context,
                'objectid' => $discussion->id,
                'other' => array(
                    'forumid' => $forum->id,
                )
            );
            $event = \mod_forum\event\discussion_created::create($params);
            $event->add_record_snapshot('forum_discussions', $discussion);
            $event->trigger();

            $completion = new completion_info($course);
            if ($completion->is_enabled($cm) &&
                    ($forum->completiondiscussions || $forum->completionposts)) {
                $completion->update_state($cm, COMPLETION_COMPLETE);
            }

            $settings = new stdClass();
            $settings->discussionsubscribe = $options['discussionsubscribe'];
            forum_post_subscription($settings, $forum, $discussion);
        } else {
            throw new moodle_exception('couldnotadd', 'forum');
        }

        $result = array();
        $result['discussionid'] = $discussionid;
        $result['warnings'] = $warnings;
        return $result;
    }
Example #14
0
 /**
  * Check if the current user can add discussions in the given forum (and optionally for the given group).
  *
  * @param int $forumid the forum instance id
  * @param int $groupid the group to check, default to active group. Use -1 to check if the user can post in all the groups.
  * @return array of warnings and the status (true if the user can add discussions)
  * @since Moodle 3.1
  * @throws moodle_exception
  */
 public static function can_add_discussion($forumid, $groupid = null)
 {
     global $DB, $CFG;
     require_once $CFG->dirroot . "/mod/forum/lib.php";
     $params = self::validate_parameters(self::can_add_discussion_parameters(), array('forumid' => $forumid, 'groupid' => $groupid));
     $warnings = array();
     // Request and permission validation.
     $forum = $DB->get_record('forum', array('id' => $params['forumid']), '*', MUST_EXIST);
     list($course, $cm) = get_course_and_cm_from_instance($forum, 'forum');
     $context = context_module::instance($cm->id);
     self::validate_context($context);
     $status = forum_user_can_post_discussion($forum, $params['groupid'], -1, $cm, $context);
     $result = array();
     $result['status'] = $status;
     $result['warnings'] = $warnings;
     return $result;
 }
Example #15
0
 /**
  * Test that the useridlist cache will retive the correct values
  * when using assign::get_useridlist_key and assign::get_useridlist_key_id.
  */
 public function test_useridlist_cache()
 {
     // Create an assignment object, we will use this to test the key generation functions.
     $course = self::getDataGenerator()->create_course();
     $assign = self::getDataGenerator()->create_module('assign', array('course' => $course->id));
     list($courserecord, $cm) = get_course_and_cm_from_instance($assign->id, 'assign');
     $context = context_module::instance($cm->id);
     $assign = new assign($context, $cm, $courserecord);
     // Create the cache.
     $cache = cache::make_from_params(cache_store::MODE_SESSION, 'mod_assign', 'useridlist');
     // Create an entry that we will insert into the cache.
     $entry = array(0 => '5', 1 => '6325', 2 => '67783');
     // Insert the value into the cache.
     $cache->set($assign->get_useridlist_key(), $entry);
     // Now test we can retrive the entry.
     $this->assertEquals($entry, $cache->get($assign->get_useridlist_key()));
     $useridlistid = clean_param($assign->get_useridlist_key_id(), PARAM_ALPHANUM);
     $this->assertEquals($entry, $cache->get($assign->get_useridlist_key($useridlistid)));
     // Check it will not retrive anything on an invalid key.
     $this->assertFalse($cache->get($assign->get_useridlist_key('notvalid')));
 }
 /**
  * Test that the summary, when generated from the intro text, does not strip out images or trim the text in anyway.
  * @throws \coding_exception
  * @throws \moodle_exception
  */
 public function test_get_page_mod_intro_summary()
 {
     $this->resetAfterTest();
     $generator = $this->getDataGenerator();
     $course = $generator->create_course();
     $pagegen = $generator->get_plugin_generator('mod_page');
     $page = $pagegen->create_instance(['course' => $course->id, 'intro' => '<img src="http://fakeurl.local/testimg.png" alt="some alt text" />' . '<p>Some content text</p>' . str_pad('-', 200)]);
     $cm = get_course_and_cm_from_instance($page->id, 'page', $course->id)[1];
     $pagemod = local::get_page_mod($cm);
     // Ensure summary contains text and is sitll within tags.
     $this->assertContains('<p>Some content text</p>', $pagemod->summary);
     // Ensure summary contains images.
     $this->assertContains('<img', $pagemod->summary);
     // Make sure summary text can be greater than 200 chars.
     $this->assertGreaterThan(200, strlen($pagemod->summary));
 }
Example #17
0
 /**
  * Trigger the course module viewed event and update the module completion status.
  *
  * @param int $chatid the chat instance id
  * @return array of warnings and status result
  * @since Moodle 3.0
  * @throws moodle_exception
  */
 public static function view_chat($chatid)
 {
     global $DB, $CFG;
     $params = self::validate_parameters(self::view_chat_parameters(), array('chatid' => $chatid));
     $warnings = array();
     // Request and permission validation.
     $chat = $DB->get_record('chat', array('id' => $params['chatid']), '*', MUST_EXIST);
     list($course, $cm) = get_course_and_cm_from_instance($chat, 'chat');
     $context = context_module::instance($cm->id);
     self::validate_context($context);
     require_capability('mod/chat:chat', $context);
     // Call the url/lib API.
     chat_view($chat, $course, $cm, $context);
     $result = array();
     $result['status'] = true;
     $result['warnings'] = $warnings;
     return $result;
 }
Example #18
0
 /**
  * Trigger the course module viewed event and update the module completion status.
  *
  * @param int $ltiid the lti instance id
  * @return array of warnings and status result
  * @since Moodle 3.0
  * @throws moodle_exception
  */
 public static function view_lti($ltiid)
 {
     global $DB;
     $params = self::validate_parameters(self::view_lti_parameters(), array('ltiid' => $ltiid));
     $warnings = array();
     // Request and permission validation.
     $lti = $DB->get_record('lti', array('id' => $params['ltiid']), '*', MUST_EXIST);
     list($course, $cm) = get_course_and_cm_from_instance($lti, 'lti');
     $context = context_module::instance($cm->id);
     self::validate_context($context);
     require_capability('mod/lti:view', $context);
     // Trigger course_module_viewed event and completion.
     lti_view($lti, $course, $cm, $context);
     $result = array();
     $result['status'] = true;
     $result['warnings'] = $warnings;
     return $result;
 }
Example #19
0
 /**
  * Returns the list of files from a specific subwiki.
  *
  * @param int $wikiid The wiki instance ID.
  * @param int $groupid The group ID. If not defined, use current group.
  * @param int $userid The user ID. If not defined, use current user.
  * @return array Containing a list of warnings and a list of files.
  * @since Moodle 3.1
  * @throws moodle_exception
  */
 public static function get_subwiki_files($wikiid, $groupid = -1, $userid = 0)
 {
     $returnedfiles = array();
     $warnings = array();
     $params = self::validate_parameters(self::get_subwiki_files_parameters(), array('wikiid' => $wikiid, 'groupid' => $groupid, 'userid' => $userid));
     // Get wiki instance.
     if (!($wiki = wiki_get_wiki($params['wikiid']))) {
         throw new moodle_exception('incorrectwikiid', 'wiki');
     }
     list($course, $cm) = get_course_and_cm_from_instance($wiki, 'wiki');
     $context = context_module::instance($cm->id);
     self::validate_context($context);
     // Determine groupid and userid to use.
     list($groupid, $userid) = self::determine_group_and_user($cm, $wiki, $params['groupid'], $params['userid']);
     // Get subwiki and validate it.
     $subwiki = wiki_get_subwiki_by_group_and_user_with_validation($wiki, $groupid, $userid);
     // Get subwiki based on group and user.
     if ($subwiki === false) {
         throw new moodle_exception('cannotviewfiles', 'wiki');
     } else {
         if ($subwiki->id != -1) {
             // The subwiki exists, let's get the files.
             $fs = get_file_storage();
             if ($files = $fs->get_area_files($context->id, 'mod_wiki', 'attachments', $subwiki->id, 'filename', false)) {
                 foreach ($files as $file) {
                     $filename = $file->get_filename();
                     $fileurl = moodle_url::make_webservice_pluginfile_url($context->id, 'mod_wiki', 'attachments', $subwiki->id, '/', $filename);
                     $returnedfiles[] = array('filename' => $filename, 'mimetype' => $file->get_mimetype(), 'fileurl' => $fileurl->out(false), 'filepath' => $file->get_filepath(), 'filesize' => $file->get_filesize(), 'timemodified' => $file->get_timemodified());
                 }
             }
         }
     }
     $result = array();
     $result['files'] = $returnedfiles;
     $result['warnings'] = $warnings;
     return $result;
 }
Example #20
0
 /**
  * Trigger the submission status viewed event.
  *
  * @param int $assignid assign instance id
  * @return array of warnings and status result
  * @since Moodle 3.1
  */
 public static function view_submission_status($assignid)
 {
     global $DB, $CFG;
     require_once "{$CFG->dirroot}/mod/assign/locallib.php";
     $warnings = array();
     $params = array('assignid' => $assignid);
     $params = self::validate_parameters(self::view_submission_status_parameters(), $params);
     // Request and permission validation.
     $assign = $DB->get_record('assign', array('id' => $params['assignid']), 'id', MUST_EXIST);
     list($course, $cm) = get_course_and_cm_from_instance($assign, 'assign');
     $context = context_module::instance($cm->id);
     // Please, note that is not required to check mod/assign:view because is done by validate_context->require_login.
     self::validate_context($context);
     $assign = new assign($context, $cm, $course);
     \mod_assign\event\submission_status_viewed::create_from_assign($assign)->trigger();
     $result = array();
     $result['status'] = true;
     $result['warnings'] = $warnings;
     return $result;
 }
Example #21
0
 /**
  * Starts a new attempt at a quiz.
  *
  * @param int $quizid quiz instance id
  * @param array $preflightdata preflight required data (like passwords)
  * @param bool $forcenew Whether to force a new attempt or not.
  * @return array of warnings and the attempt basic data
  * @since Moodle 3.1
  * @throws moodle_quiz_exception
  */
 public static function start_attempt($quizid, $preflightdata = array(), $forcenew = false)
 {
     global $DB, $USER;
     $warnings = array();
     $attempt = array();
     $params = array('quizid' => $quizid, 'preflightdata' => $preflightdata, 'forcenew' => $forcenew);
     $params = self::validate_parameters(self::start_attempt_parameters(), $params);
     $forcenew = $params['forcenew'];
     // Request and permission validation.
     $quiz = $DB->get_record('quiz', array('id' => $params['quizid']), '*', MUST_EXIST);
     list($course, $cm) = get_course_and_cm_from_instance($quiz, 'quiz');
     $context = context_module::instance($cm->id);
     self::validate_context($context);
     $quizobj = quiz::create($cm->instance, $USER->id);
     // Check questions.
     if (!$quizobj->has_questions()) {
         throw new moodle_quiz_exception($quizobj, 'noquestionsfound');
     }
     // Create an object to manage all the other (non-roles) access rules.
     $timenow = time();
     $accessmanager = $quizobj->get_access_manager($timenow);
     // Validate permissions for creating a new attempt and start a new preview attempt if required.
     list($currentattemptid, $attemptnumber, $lastattempt, $messages, $page) = quiz_validate_new_attempt($quizobj, $accessmanager, $forcenew, -1, false);
     // Check access.
     if (!$quizobj->is_preview_user() && $messages) {
         // Create warnings with the exact messages.
         foreach ($messages as $message) {
             $warnings[] = array('item' => 'quiz', 'itemid' => $quiz->id, 'warningcode' => '1', 'message' => clean_text($message, PARAM_TEXT));
         }
     } else {
         if ($accessmanager->is_preflight_check_required($currentattemptid)) {
             // Need to do some checks before allowing the user to continue.
             $provideddata = array();
             foreach ($params['preflightdata'] as $data) {
                 $provideddata[$data['name']] = $data['value'];
             }
             $errors = $accessmanager->validate_preflight_check($provideddata, [], $currentattemptid);
             if (!empty($errors)) {
                 throw new moodle_quiz_exception($quizobj, array_shift($errors));
             }
             // Pre-flight check passed.
             $accessmanager->notify_preflight_check_passed($currentattemptid);
         }
         if ($currentattemptid) {
             if ($lastattempt->state == quiz_attempt::OVERDUE) {
                 throw new moodle_quiz_exception($quizobj, 'stateoverdue');
             } else {
                 throw new moodle_quiz_exception($quizobj, 'attemptstillinprogress');
             }
         }
         $attempt = quiz_prepare_and_start_new_attempt($quizobj, $attemptnumber, $lastattempt);
     }
     $result = array();
     $result['attempt'] = $attempt;
     $result['warnings'] = $warnings;
     return $result;
 }
Example #22
0
 /**
  * Submit the answers for a given survey.
  *
  * @param int $surveyid the survey instance id
  * @param array $answers the survey answers
  * @return array of warnings and status result
  * @since Moodle 3.0
  * @throws moodle_exception
  */
 public static function submit_answers($surveyid, $answers)
 {
     global $DB, $USER;
     $params = self::validate_parameters(self::submit_answers_parameters(), array('surveyid' => $surveyid, 'answers' => $answers));
     $warnings = array();
     // Request and permission validation.
     $survey = $DB->get_record('survey', array('id' => $params['surveyid']), '*', MUST_EXIST);
     list($course, $cm) = get_course_and_cm_from_instance($survey, 'survey');
     $context = context_module::instance($cm->id);
     self::validate_context($context);
     require_capability('mod/survey:participate', $context);
     if (survey_already_done($survey->id, $USER->id)) {
         throw new moodle_exception("alreadysubmitted", "survey");
     }
     // Build the answers array. Data is cleaned inside the survey_save_answers function.
     $answers = array();
     foreach ($params['answers'] as $answer) {
         $key = $answer['key'];
         $answers[$key] = $answer['value'];
     }
     survey_save_answers($survey, $answers, $course, $context);
     $result = array();
     $result['status'] = true;
     $result['warnings'] = $warnings;
     return $result;
 }
Example #23
0
 /**
  * Utility function for validating an assign.
  *
  * @param int $assignid assign instance id
  * @return array array containing the assign, course, context and course module objects
  * @since  Moodle 3.2
  */
 protected static function validate_assign($assignid)
 {
     global $DB;
     // Request and permission validation.
     $assign = $DB->get_record('assign', array('id' => $assignid), 'id', MUST_EXIST);
     list($course, $cm) = get_course_and_cm_from_instance($assign, 'assign');
     $context = context_module::instance($cm->id);
     // Please, note that is not required to check mod/assign:view because is done by validate_context->require_login.
     self::validate_context($context);
     $assign = new assign($context, $cm, $course);
     return array($assign, $course, $cm, $context);
 }
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
require_once dirname(dirname(dirname(__FILE__))) . '/config.php';
require_once dirname(__FILE__) . '/locallib.php';
require_once dirname(__FILE__) . '/comment_form.php';
$id = required_param('id', PARAM_INT);
$delete = optional_param('delete', 0, PARAM_INT);
$confirm = optional_param('confirm', 0, PARAM_INT);
if (!($gallery = $DB->get_record('lightboxgallery', array('id' => $id)))) {
    print_error('invalidlightboxgalleryid', 'lightboxgallery');
}
list($course, $cm) = get_course_and_cm_from_instance($gallery, 'lightboxgallery');
if ($delete && !($comment = $DB->get_record('lightboxgallery_comments', array('gallery' => $gallery->id, 'id' => $delete)))) {
    print_error('Invalid comment ID');
}
require_login($course, true, $cm);
$PAGE->set_cm($cm);
$PAGE->set_url('/mod/lightboxgallery/view.php', array('id' => $id));
$PAGE->set_title($gallery->name);
$PAGE->set_heading($course->shortname);
$context = context_module::instance($cm->id);
$galleryurl = $CFG->wwwroot . '/mod/lightboxgallery/view.php?id=' . $cm->id;
if ($delete && has_capability('mod/lightboxgallery:edit', $context)) {
    if ($confirm && confirm_sesskey()) {
        $DB->delete_records('lightboxgallery_comments', array('id' => $comment->id));
        redirect($galleryurl);
    } else {
 /**
  * Trigger the grading_table_viewed event.
  *
  * @param int $seplid the sepl instance id
  * @return array of warnings and status result
  * @since Moodle 3.0
  * @throws moodle_exception
  */
 public static function view_grading_table($seplid)
 {
     global $DB, $CFG;
     require_once $CFG->dirroot . "/mod/sepl/locallib.php";
     $params = self::validate_parameters(self::view_grading_table_parameters(), array('seplid' => $seplid));
     $warnings = array();
     // Request and permission validation.
     $sepl = $DB->get_record('sepl', array('id' => $params['seplid']), 'id', MUST_EXIST);
     list($course, $cm) = get_course_and_cm_from_instance($sepl, 'sepl');
     $context = context_module::instance($cm->id);
     self::validate_context($context);
     require_capability('mod/sepl:view', $context);
     $sepl = new sepl($context, null, null);
     $sepl->require_view_grades();
     \mod_sepl\event\grading_table_viewed::create_from_sepl($sepl)->trigger();
     $result = array();
     $result['status'] = true;
     $result['warnings'] = $warnings;
     return $result;
 }
Example #26
0
 /**
  * Utility function for validating a quiz.
  *
  * @param int $quizid quiz instance id
  * @return array array containing the quiz, course, context and course module objects
  * @since  Moodle 3.1
  */
 protected static function validate_quiz($quizid)
 {
     global $DB;
     // Request and permission validation.
     $quiz = $DB->get_record('quiz', array('id' => $quizid), '*', MUST_EXIST);
     list($course, $cm) = get_course_and_cm_from_instance($quiz, 'quiz');
     $context = context_module::instance($cm->id);
     self::validate_context($context);
     return array($quiz, $course, $cm, $context);
 }
 /**
  * Tests function for getting $course and $cm at once quickly from modinfo
  * based on instance id or record.
  */
 public function test_get_course_and_cm_from_instance()
 {
     global $CFG, $DB;
     $this->resetAfterTest();
     // Create a course and an activity.
     $generator = $this->getDataGenerator();
     $course = $generator->create_course(array('shortname' => 'Halls'));
     $page = $generator->create_module('page', array('course' => $course->id, 'name' => 'Annie'));
     // Successful usage.
     list($course, $cm) = get_course_and_cm_from_instance($page->id, 'page');
     $this->assertEquals('Halls', $course->shortname);
     $this->assertInstanceOf('cm_info', $cm);
     $this->assertEquals('Annie', $cm->name);
     // With id in object.
     $fakeinstance = (object) array('id' => $page->id);
     list($course, $cm) = get_course_and_cm_from_instance($fakeinstance, 'page');
     $this->assertEquals('Halls', $course->shortname);
     $this->assertEquals('Annie', $cm->name);
     // With both id and course in object.
     $fakeinstance->course = $course->id;
     list($course, $cm) = get_course_and_cm_from_instance($fakeinstance, 'page');
     $this->assertEquals('Halls', $course->shortname);
     $this->assertEquals('Annie', $cm->name);
     // With supplied course id.
     list($course, $cm) = get_course_and_cm_from_instance($page->id, 'page', $course->id);
     $this->assertEquals('Annie', $cm->name);
     // With supplied course object (modified just so we can check it is
     // indeed reusing the supplied object).
     $course->silly = true;
     list($course, $cm) = get_course_and_cm_from_instance($page->id, 'page', $course);
     $this->assertEquals('Annie', $cm->name);
     $this->assertTrue($course->silly);
     // Doesn't exist (or is wrong type).
     try {
         get_course_and_cm_from_instance($page->id, 'forum');
         $this->fail();
     } catch (moodle_exception $e) {
         $this->assertInstanceOf('dml_exception', $e);
     }
     // Invalid module name.
     try {
         get_course_and_cm_from_cmid($page->cmid, '1337 h4x0ring');
         $this->fail();
     } catch (coding_exception $e) {
         $this->assertContains('Invalid modulename parameter', $e->getMessage());
     }
     // Create a second hidden activity.
     $hiddenpage = $generator->create_module('page', array('course' => $course->id, 'name' => 'Annie', 'visible' => 0));
     // Create 2 user accounts, one is a manager who can see everything.
     $user = $generator->create_user();
     $generator->enrol_user($user->id, $course->id);
     $manager = $generator->create_user();
     $generator->enrol_user($manager->id, $course->id, $DB->get_field('role', 'id', array('shortname' => 'manager'), MUST_EXIST));
     // User can see the normal page but not the hidden one.
     list($course, $cm) = get_course_and_cm_from_cmid($page->cmid, 'page', 0, $user->id);
     $this->assertTrue($cm->uservisible);
     list($course, $cm) = get_course_and_cm_from_cmid($hiddenpage->cmid, 'page', 0, $user->id);
     $this->assertFalse($cm->uservisible);
     // Manager can see the hidden one too.
     list($course, $cm) = get_course_and_cm_from_cmid($hiddenpage->cmid, 'page', 0, $manager->id);
     $this->assertTrue($cm->uservisible);
 }
Example #28
0
 */
require_once dirname(__FILE__) . '/../../config.php';
require_once $CFG->dirroot . '/mod/lesson/lib.php';
require_once $CFG->dirroot . '/mod/lesson/locallib.php';
require_once $CFG->dirroot . '/mod/lesson/override_form.php';
$cmid = optional_param('cmid', 0, PARAM_INT);
$overrideid = optional_param('id', 0, PARAM_INT);
$action = optional_param('action', null, PARAM_ALPHA);
$reset = optional_param('reset', false, PARAM_BOOL);
$override = null;
if ($overrideid) {
    if (!($override = $DB->get_record('lesson_overrides', array('id' => $overrideid)))) {
        print_error('invalidoverrideid', 'lesson');
    }
    $lesson = new lesson($DB->get_record('lesson', array('id' => $override->lessonid), '*', MUST_EXIST));
    list($course, $cm) = get_course_and_cm_from_instance($lesson, 'lesson');
} else {
    if ($cmid) {
        list($course, $cm) = get_course_and_cm_from_cmid($cmid, 'lesson');
        $lesson = new lesson($DB->get_record('lesson', array('id' => $cm->instance), '*', MUST_EXIST));
    } else {
        print_error('invalidcoursemodule');
    }
}
$course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
$url = new moodle_url('/mod/lesson/overrideedit.php');
if ($action) {
    $url->param('action', $action);
}
if ($overrideid) {
    $url->param('id', $overrideid);
Example #29
0
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
/**
 * Prints a particular question.
 *
 * @package    mod_qa
 * @copyright  2015 Skylar Kelty <*****@*****.**>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
// Replace qa with the name of your module and remove this line.
require_once dirname(dirname(dirname(__FILE__))) . '/config.php';
require_once dirname(__FILE__) . '/lib.php';
$qid = required_param('id', PARAM_INT);
$question = \mod_qa\question::from_id($qid);
list($course, $cm) = get_course_and_cm_from_instance($question->qaid, 'qa');
require_login($course, true, $cm);
$PAGE->set_url('/mod/qa/question.php', array('id' => $qid));
$PAGE->navbar->add($question->title);
$PAGE->set_title(format_string($question->title));
$PAGE->set_heading(format_string($course->fullname));
$PAGE->requires->css('/mod/qa/styles.css');
$renderer = $PAGE->get_renderer('mod_qa');
// Output starts here.
echo $OUTPUT->header();
echo $OUTPUT->heading($question->title);
echo $renderer->render_question_view($question);
echo $renderer->render_question_replies($question->get_replies());
$url = new \moodle_url('/mod/qa/reply.php', array('qaqid' => $question->id));
echo \html_writer::tag('p', \html_writer::link($url, get_string('questionreply', 'mod_qa')));
// Finish the page.
 */
/// (Replace stopwatch with the name of your module and remove this line)
require_once dirname(dirname(__DIR__)) . '/config.php';
require_once $CFG->dirroot . '/mod/stopwatch/lib.php';
require_once $CFG->dirroot . '/mod/stopwatch/locallib.php';
require_once $CFG->libdir . '/completionlib.php';
$cmid = optional_param('id', 0, PARAM_INT);
// course_module ID, or
$stopwatchid = optional_param('s', 0, PARAM_INT);
// stopwatch instance ID - it should be named as the first character of the module
$cmd = optional_param('cmd', null, PARAM_ALPHA);
$durationstr = optional_param('durationstr', null, PARAM_NOTAGS);
if ($cmid) {
    list($course, $cm) = get_course_and_cm_from_cmid($cmid, 'stopwatch');
} elseif ($stopwatchid) {
    list($course, $cm) = get_course_and_cm_from_instance($stopwatchid, 'stopwatch');
} else {
    print_error('You must specify a course_module ID or an instance ID');
}
require_login($course, true, $cm);
$stopwatch = $PAGE->activityrecord;
$cmcontext = context_module::instance($cm->id);
$cansubmit = has_capability('mod/stopwatch:submit', $cmcontext, null, false);
$cangrade = has_capability('mod/stopwatch:grade', $cmcontext);
if ($cmd === 'updateduration' && $cansubmit && $durationstr && confirm_sesskey()) {
    mod_stopwatch_update_timer($cm, $stopwatch, mod_stopwatch_string_to_duration($durationstr));
    redirect($cm->url);
}
if ($cmd === 'updategrades' && $cangrade && confirm_sesskey()) {
    $durationarray = optional_param_array('duration', array(), PARAM_NOTAGS);
    $gradearray = optional_param_array('grade', array(), PARAM_FLOAT);