// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
$PAGE->set_context($context);
// If contactdataprotectionofficer is disabled, send the user back to the profile page, or the privacy policy page.
-if (!\tool_dataprivacy\api::can_contact_dpo()) {
- redirect($returnurl, get_string('contactdpoviaprivacypolicy', 'tool_dataprivacy'), \core\output\notification::NOTIFY_ERROR);
+// That is, unless you have sufficient capabilities to perform this on behalf of a user.
+if (!$manage && !\tool_dataprivacy\api::can_contact_dpo()) {
+ redirect($returnurl, get_string('contactdpoviaprivacypolicy', 'tool_dataprivacy'), 0, \core\output\notification::NOTIFY_ERROR);
}
$mform = new tool_dataprivacy_data_request_form($url->out(false), ['manage' => !empty($manage)]);
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
/** @var array Info or error messages to show. */
protected $messages = [];
+ /** @var bool This is an existing user (rather than non-loggedin/guest). */
+ protected $isexistinguser;
+
/**
* Prepare the page for rendering.
*
$this->action = $action;
+ $this->isexistinguser = isloggedin() && !isguestuser();
$behalfid = $behalfid ?: $USER->id;
if ($realuser->id != $behalfid) {
$this->behalfuser = core_user::get_user($behalfid, '*', MUST_EXIST);
protected function accept_and_revoke_policies() {
global $USER;
- if (!empty($USER->id)) {
+ if ($this->isexistinguser) {
// Existing user.
if (!empty($this->action) && confirm_sesskey()) {
// The form has been sent. Update policies acceptances according to $this->agreedocs.
* Before display the consent page, the user has to view all the still-non-accepted policy docs.
* This function checks if the non-accepted policy docs have been shown and redirect to them.
*
- * @param array $userid User identifier who wants to access to the consent page.
- * @param url $returnurl URL to return after shown the policy docs.
+ * @param int $userid User identifier who wants to access to the consent page.
+ * @param moodle_url $returnurl URL to return after shown the policy docs.
*/
protected function redirect_to_policies($userid, $returnurl = null) {
- global $USER;
-
- $acceptances = api::get_user_acceptances($userid);
$allpolicies = $this->policies;
- if (!empty($userid)) {
+ if ($this->isexistinguser) {
+ $acceptances = api::get_user_acceptances($userid);
foreach ($allpolicies as $policy) {
if (api::is_user_version_accepted($userid, $policy->id, $acceptances)) {
// If this version is accepted by the user, remove from the pending policies list.
}
/**
- * Redirect to $SESSION->wantsurl if defined or to $CFG->wwwroot if not.
+ * Redirect to signup page if defined or to $CFG->wwwroot if not.
*/
protected function redirect_to_previous_url() {
global $SESSION;
- if (!empty($SESSION->wantsurl)) {
- $returnurl = $SESSION->wantsurl;
- unset($SESSION->wantsurl);
+ if ($this->isexistinguser) {
+ // Existing user.
+ if (!empty($SESSION->wantsurl)) {
+ $returnurl = $SESSION->wantsurl;
+ unset($SESSION->wantsurl);
+ } else {
+ $returnurl = new moodle_url('/admin/tool/policy/user.php');
+ }
} else {
- $returnurl = (new moodle_url('/admin/tool/policy/user.php'))->out();
+ // Non-authenticated user.
+ $issignup = \cache::make('core', 'presignup')->get('tool_policy_issignup');
+ if ($issignup) {
+ // User came here from signup page - redirect back there.
+ $returnurl = new moodle_url('/login/signup.php');
+ \cache::make('core', 'presignup')->set('tool_policy_issignup', false);
+ } else {
+ // Guests should not be on this page unless it's part of signup - redirect home.
+ $returnurl = new moodle_url('/');
+ }
}
redirect($returnurl);
* @param int $userid
*/
protected function prepare_global_page_access($userid) {
- global $PAGE, $SESSION, $SITE, $USER;
+ global $PAGE, $SITE, $USER;
// Guest users or not logged users (but the users during the signup process) are not allowed to access to this page.
- $newsignupuser = !empty($SESSION->wantsurl) && strpos($SESSION->wantsurl, 'login/signup.php') !== false;
- if (isguestuser() || (empty($USER->id) && !$newsignupuser)) {
+ $newsignupuser = \cache::make('core', 'presignup')->get('tool_policy_issignup');
+ if (!$this->isexistinguser && !$newsignupuser) {
$this->redirect_to_previous_url();
}
// Check for correct user capabilities.
- if (!empty($USER->id)) {
+ if ($this->isexistinguser) {
// For existing users, it's needed to check if they have the capability for accepting policies.
api::can_accept_policies($this->behalfid, true);
} else {
// For new users, the behalfid parameter is ignored.
- if ($this->behalfid != $USER->id) {
+ if ($this->behalfid) {
redirect(new moodle_url('/admin/tool/policy/index.php'));
}
}
// If the current user has the $USER->policyagreed = 1 or $userpolicyagreed = 1
- // and $SESSION->wantsurl is defined, redirect to the return page.
- $hasagreedsignupuser = empty($USER->id) && $this->signupuserpolicyagreed;
+ // redirect to the return page.
+ $hasagreedsignupuser = !$this->isexistinguser && $this->signupuserpolicyagreed;
$hasagreedloggeduser = $USER->id == $userid && !empty($USER->policyagreed);
if (!is_siteadmin() && ($hasagreedsignupuser || $hasagreedloggeduser)) {
$this->redirect_to_previous_url();
}
$myparams = [];
- if (!empty($USER->id) && !empty($this->behalfid) && $this->behalfid != $USER->id) {
+ if ($this->isexistinguser && !empty($this->behalfid) && $this->behalfid != $USER->id) {
$myparams['userid'] = $this->behalfid;
}
$myurl = new moodle_url('/admin/tool/policy/index.php', $myparams);
global $USER;
// Get all the policy version acceptances for this user.
- $acceptances = api::get_user_acceptances($userid);
$lang = current_language();
foreach ($this->policies as $policy) {
// Get a link to display the full policy document.
$policymodal = html_writer::link($policy->url, $policy->name, $policyattributes);
// Check if this policy version has been agreed or not.
- if (!empty($userid)) {
+ if ($this->isexistinguser) {
// Existing user.
$versionagreed = false;
+ $acceptances = api::get_user_acceptances($userid);
$policy->versionacceptance = api::get_user_version_acceptance($userid, $policy->id, $acceptances);
if (!empty($policy->versionacceptance)) {
// The policy version has ever been agreed. Check if status = 1 to know if still is accepted.
* Export the page data for the mustache template.
*
* @param renderer_base $output renderer to be used to render the page elements.
- * @return stdClass
+ * @return \stdClass
*/
public function export_for_template(renderer_base $output) {
global $USER;
$myparams = [];
- if (!empty($USER->id) && !empty($this->behalfid) && $this->behalfid != $USER->id) {
+ if ($this->isexistinguser && !empty($this->behalfid) && $this->behalfid != $USER->id) {
$myparams['userid'] = $this->behalfid;
}
$data = (object) [
$PAGE->set_url('/admin/tool/policy/index.php');
$PAGE->set_popup_notification_allowed(false);
-if (!empty($USER->id)) {
+if (isloggedin() && !isguestuser()) {
// Existing user.
$haspermissionagreedocs = api::can_accept_policies($behalfid);
} else {
* Hooks redirection to policy acceptance pages before sign up.
*/
function tool_policy_pre_signup_requests() {
- global $CFG, $SESSION;
+ global $CFG;
// Do nothing if we are not set as the site policies handler.
if (empty($CFG->sitepolicyhandler) || $CFG->sitepolicyhandler !== 'tool_policy') {
$userpolicyagreed = cache::make('core', 'presignup')->get('tool_policy_userpolicyagreed');
if (!empty($policies) && !$userpolicyagreed) {
// Redirect to "Policy" pages for consenting before creating the user.
- $SESSION->wantsurl = (new \moodle_url('/login/signup.php'))->out();
+ cache::make('core', 'presignup')->set('tool_policy_issignup', 1);
redirect(new \moodle_url('/admin/tool/policy/index.php'));
}
}
And I should see "Policies and agreements"
And I should see "No permission to agree to the policies on behalf of this user"
And I should see "Sorry, you do not have the required permission to agree to the following policies on behalf of User 1"
+
+ Scenario: Accept policy on sign up as a guest, one policy
+ Given the following config values are set as admin:
+ | registerauth | email |
+ | passwordpolicy | 0 |
+ | sitepolicyhandler | tool_policy |
+ Given the following policies exist:
+ | Policy | Name | Revision | Content | Summary | Status |
+ | P1 | This site policy | | full text1 | short text1 | archived |
+ | P1 | This site policy | | full text2 | short text2 | active |
+ | P1 | This site policy | | full text3 | short text3 | draft |
+ And I am on site homepage
+ And I follow "Log in"
+ # First log in as a guest
+ And I press "Log in as a guest"
+ # Now sign up
+ And I follow "Log in"
+ When I press "Create new account"
+ Then I should see "This site policy"
+ And I should see "short text2"
+ And I should see "full text2"
+ And I press "Next"
+ And I should see "Please agree to the following policies"
+ And I should see "This site policy"
+ And I should see "short text2"
+ And I should not see "full text2"
+ And I set the field "I agree to the This site policy" to "1"
+ And I press "Next"
+ And I should not see "I understand and agree"
+ And I set the following fields to these values:
+ | Username | user1 |
+ | Password | user1 |
+ | Email address | user1@address.invalid |
+ | Email (again) | user1@address.invalid |
+ | First name | User1 |
+ | Surname | L1 |
+ And I press "Create my new account"
+ And I should see "Confirm your account"
+ And I should see "An email should have been sent to your address at user1@address.invalid"
+ And I confirm email for "user1"
+ And I should see "Thanks, User1 L1"
+ And I should see "Your registration has been confirmed"
+ And I open my profile in edit mode
+ And the field "First name" matches value "User1"
+ And I log out
+ # Confirm that user can login and browse the site.
+ And I log in as "user1"
+ And I follow "Profile" in the user menu
+ # User can see his own agreements in the profile.
+ And I follow "Policies and agreements"
+ And "Agreed" "icon" should exist in the "This site policy" "table_row"
+ And I log out
global $DB;
// Grab the course category context.
- $context = \context_coursecat::instance($this->_categoryid);
-
- // Delete the files.
- $fs = get_file_storage();
- $files = $fs->get_area_files($context->id, 'tool_recyclebin', TOOL_RECYCLEBIN_COURSECAT_BIN_FILEAREA, $item->id);
- foreach ($files as $file) {
- $file->delete();
+ $context = \context_coursecat::instance($this->_categoryid, IGNORE_MISSING);
+ if (!empty($context)) {
+ // Delete the files.
+ $fs = get_file_storage();
+ $fs->delete_area_files($context->id, 'tool_recyclebin', TOOL_RECYCLEBIN_COURSECAT_BIN_FILEAREA, $item->id);
+ } else {
+ // Course category has been deleted. Find records using $item->id as this is unique for coursecat recylebin.
+ $files = $DB->get_recordset('files', [
+ 'component' => 'tool_recyclebin',
+ 'filearea' => TOOL_RECYCLEBIN_COURSECAT_BIN_FILEAREA,
+ 'itemid' => $item->id,
+ ]);
+ $fs = get_file_storage();
+ foreach ($files as $filer) {
+ $file = $fs->get_file_instance($filer);
+ $file->delete();
+ }
+ $file->close();
}
// Delete the record.
'id' => $item->id
));
+ // The coursecat might have been deleted, check we have a context before triggering event.
+ if (!$context) {
+ return;
+ }
+
// Fire event.
$event = \tool_recyclebin\event\category_bin_item_deleted::create(array(
'objectid' => $item->id,
global $DB;
// Grab the course context.
- $context = \context_course::instance($this->_courseid);
-
- // Delete the files.
- $fs = get_file_storage();
- $files = $fs->get_area_files($context->id, 'tool_recyclebin', TOOL_RECYCLEBIN_COURSE_BIN_FILEAREA, $item->id);
- foreach ($files as $file) {
- $file->delete();
+ $context = \context_course::instance($this->_courseid, IGNORE_MISSING);
+
+ if (!empty($context)) {
+ // Delete the files.
+ $fs = get_file_storage();
+ $fs->delete_area_files($context->id, 'tool_recyclebin', TOOL_RECYCLEBIN_COURSE_BIN_FILEAREA, $item->id);
+ } else {
+ // Course context has been deleted. Find records using $item->id as this is unique for course bin recyclebin.
+ $files = $DB->get_recordset('files', [
+ 'component' => 'tool_recyclebin',
+ 'filearea' => TOOL_RECYCLEBIN_COURSE_BIN_FILEAREA,
+ 'itemid' => $item->id,
+ ]);
+ $fs = get_file_storage();
+ foreach ($files as $filer) {
+ $file = $fs->get_file_instance($filer);
+ $file->delete();
+ }
+ $files->close();
}
// Delete the record.
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
* @param course_in_list $course The currently selected course.
* @param int $page The page being displayed.
* @param int $perpage The number of courses to display per page.
+ * @param string|null $viewmode The view mode the page is in, one out of 'default', 'combined', 'courses' or 'categories'.
* @return string
*/
- public function course_listing(coursecat $category = null, course_in_list $course = null, $page = 0, $perpage = 20) {
+ public function course_listing(coursecat $category = null, course_in_list $course = null, $page = 0, $perpage = 20,
+ $viewmode = 'default') {
if ($category === null) {
$html = html_writer::start_div('select-a-category');
$html .= html_writer::tag('h3', $category->get_formatted_name(),
array('id' => 'course-listing-title', 'tabindex' => '0'));
$html .= $this->course_listing_actions($category, $course, $perpage);
- $html .= $this->listing_pagination($category, $page, $perpage);
+ $html .= $this->listing_pagination($category, $page, $perpage, false, $viewmode);
$html .= html_writer::start_tag('ul', array('class' => 'ml-1 course-list', 'role' => 'group'));
foreach ($category->get_courses($options) as $listitem) {
$html .= $this->course_listitem($category, $listitem, $courseid);
}
$html .= html_writer::end_tag('ul');
- $html .= $this->listing_pagination($category, $page, $perpage, true);
+ $html .= $this->listing_pagination($category, $page, $perpage, true, $viewmode);
$html .= $this->course_bulk_actions($category);
$html .= html_writer::end_div();
return $html;
* @param int $page The current page.
* @param int $perpage The number of courses to display per page.
* @param bool $showtotals Set to true to show the total number of courses and what is being displayed.
+ * @param string|null $viewmode The view mode the page is in, one out of 'default', 'combined', 'courses' or 'categories'.
* @return string
*/
- protected function listing_pagination(coursecat $category, $page, $perpage, $showtotals = false) {
+ protected function listing_pagination(coursecat $category, $page, $perpage, $showtotals = false, $viewmode = 'default') {
$html = '';
$totalcourses = $category->get_courses_count();
$totalpages = ceil($totalcourses / $perpage);
}
}
$items = array();
- $baseurl = new moodle_url('/course/management.php', array('categoryid' => $category->id));
+ if ($viewmode !== 'default') {
+ $baseurl = new moodle_url('/course/management.php', array('categoryid' => $category->id,
+ 'view' => $viewmode));
+ } else {
+ $baseurl = new moodle_url('/course/management.php', array('categoryid' => $category->id));
+ }
if ($page > 0) {
$items[] = $this->action_button(new moodle_url($baseurl, array('page' => 0)), get_string('first'));
$items[] = $this->action_button(new moodle_url($baseurl, array('page' => $page - 1)), get_string('prev'));
upgrade_plugin_savepoint(true, 2018030900, 'format', 'topics');
}
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
upgrade_plugin_savepoint(true, 2018030900, 'format', 'weeks');
}
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
if ($displaycourselisting) {
echo $renderer->grid_column_start($coursesize, 'course-listing');
if (!$issearching) {
- echo $renderer->course_listing($category, $course, $page, $perpage);
+ echo $renderer->course_listing($category, $course, $page, $perpage, $viewmode);
} else {
list($courses, $coursescount, $coursestotal) =
\core_course\management\helper::search_courses($search, $blocklist, $modulelist, $page, $perpage);
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
public function profile_guided_allocate($features, $nbuckets, $instance) {
// No profile guided allocation is required in phpunit.
- if (defined('PHPUNIT_TEST')) {
+ if (defined('PHPUNIT_TEST') && PHPUNIT_TEST) {
return false;
}
$totalweight += $weight;
}
- if ($totalweight && !defined('BEHAT_DISABLE_HISTOGRAM') && $instance == $nbuckets && !defined('PHPUNIT_TEST')) {
+ if ($totalweight && !defined('BEHAT_DISABLE_HISTOGRAM') && $instance == $nbuckets
+ && (!defined('PHPUNIT_TEST') || !PHPUNIT_TEST)) {
echo "Bucket weightings:\n";
foreach ($weights as $k => $weight) {
echo $k + 1 . ": " . str_repeat('*', 70 * $nbuckets * $weight / $totalweight) . PHP_EOL;
unset($features[$key]);
} else {
$featurestocheck = $this->get_components_features();
- if (!isset($featurestocheck[$key]) && !defined('PHPUNIT_TEST')) {
+ if (!isset($featurestocheck[$key]) && (!defined('PHPUNIT_TEST') || !PHPUNIT_TEST)) {
behat_error(BEHAT_EXITCODE_REQUIREMENT, 'Blacklisted feature "' . $blacklistpath . '" not found.');
}
}
* @param \core\oauth2\issuer $issuer The desired OAuth issuer
*/
protected static function guess_image($issuer) {
- if (empty($issuer->get('image'))) {
+ if (empty($issuer->get('image')) && !empty($issuer->get('baseurl'))) {
$baseurl = parse_url($issuer->get('baseurl'));
$imageurl = $baseurl['scheme'] . '://' . $baseurl['host'] . '/favicon.ico';
$issuer->set('image', $imageurl);
upgrade_main_savepoint(true, 2018050900.01);
}
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
return $sqls;
}
+ public function getAlterFieldSQL($xmldb_table, $xmldb_field, $skip_type_clause = NULL, $skip_default_clause = NULL, $skip_notnull_clause = NULL)
+ {
+ $tablename = $xmldb_table->getName();
+ $dbcolumnsinfo = $this->mdb->get_columns($tablename);
+
+ if (($this->mdb->has_breaking_change_sqlmode()) &&
+ ($dbcolumnsinfo[$xmldb_field->getName()]->meta_type == 'X') &&
+ ($xmldb_field->getType() == XMLDB_TYPE_INTEGER)) {
+ // Ignore 1292 ER_TRUNCATED_WRONG_VALUE Truncated incorrect INTEGER value: '%s'.
+ $altercolumnsqlorig = $this->alter_column_sql;
+ $this->alter_column_sql = str_replace('ALTER TABLE', 'ALTER IGNORE TABLE', $this->alter_column_sql);
+ $result = parent::getAlterFieldSQL($xmldb_table, $xmldb_field, $skip_type_clause, $skip_default_clause, $skip_notnull_clause);
+ // Restore the original ALTER SQL statement pattern.
+ $this->alter_column_sql = $altercolumnsqlorig;
+
+ return $result;
+ }
+
+ return parent::getAlterFieldSQL($xmldb_table, $xmldb_field, $skip_type_clause, $skip_default_clause, $skip_notnull_clause);
+ }
+
/**
* Given one correct xmldb_table, returns the SQL statements
* to create temporary table (inside one array).
return version_compare($version, '10.2.7', '>=');
}
+ public function has_breaking_change_sqlmode() {
+ $version = $this->get_server_info()['version'];
+ // Breaking change since 10.2.4: https://mariadb.com/kb/en/the-mariadb-library/sql-mode/#setting-sql_mode.
+ return version_compare($version, '10.2.4', '>=');
+ }
+
/**
* It is time to require transactions everywhere.
*
return false;
}
+ /**
+ * Indicates whether SQL_MODE default value has changed in a not backward compatible way.
+ * @return boolean True when SQL_MODE breaks BC; otherwise, false.
+ */
+ public function has_breaking_change_sqlmode() {
+ return false;
+ }
+
/**
* Returns moodle column info for raw column from information schema.
* @param stdClass $rawcolumn
upgrade_plugin_savepoint(true, 2018051401, 'editor', 'atto');
}
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
5/ execute cli/update_lang_files.php and review changes in lang/en/editor_tinymce.php
Changes:
-lib/editor/tinymce/tiny_mce/3.5.11/plugins/fullscreen/editor_plugin_src.js:31-33 - Added checks to see if required functions exist.
-After these changes you need to use uglifier to compress the js into lib/editor/tinymce/tiny_mce/3.5.11/plugins/fullscreen/editor_plugin.js
-(I used "uglifyjs editor_plugin_src.js -c -m -v -o editor_plugin.js")
+- MDL-62381 - Icon sizing is being overwritten on images.
+- lib/editor/tinymce/tiny_mce/3.5.11/plugins/fullscreen/editor_plugin_src.js:31-33 - Added checks to see if required functions exist.
+ After these changes you need to use uglifier to compress the js into lib/editor/tinymce/tiny_mce/3.5.11/plugins/fullscreen/editor_plugin.js
+ (I used "uglifyjs editor_plugin_src.js -c -m -v -o editor_plugin.js")
Copy the moodle skin to the new version:
lib/editor/tinymce/tiny_mce/3.5.10/theme/advanced/skins/moodle/
.moodleSkin .mceToolbar .mceToolbarStart span, .moodleSkin .mceToolbar .mceToolbarEnd span {display:none;}
.moodleSkin .mceToolbar .mceToolbarEndListBox span, .moodleSkin .mceToolbar .mceToolbarStartListBox span {display:none}
.moodleSkin span.mceIcon {display:block;}
-.moodleSkin img.mceIcon {display:block; width:16px; height:16px; padding: 2px 0 0 2px;}
+.moodleSkin img.mceIcon:not(img) {display:block; width:16px; height:16px; padding: 2px 0 0 2px;}
.moodleSkin td.mceCenter {text-align:center;}
.moodleSkin td.mceCenter table {margin:0 auto; text-align:left;}
.moodleSkin td.mceRight table {margin:0 0 0 auto;}
* Define consumer profile member variable for ToolConsumer class
* Added context type property for Context class
* Set context type if 'context_type' parameter was submitted through POST
-These changes can be reverted once the following pull requests have been integrated upstream:
+* Do not require tool_consumer_instance_guid
+These changes can be reverted once the following pull requests/issues have been integrated upstream:
* https://github.com/IMSGlobal/LTI-Tool-Provider-Library-PHP/pull/10/commits/a9a1641f1a593eba4638133245c21d9ad47d8680
* https://github.com/IMSGlobal/LTI-Tool-Provider-Library-PHP/pull/11/commits/0bae60389bd020a02be5554516b86336e651e237
+* https://github.com/IMSGlobal/LTI-Tool-Provider-Library-PHP/issues/19
It is recommended by upstream to install depdencies via composer - but the composer installation is bundled
with an autoloader so it's better to do it manually.
if (!$this->ok) {
$this->reason = 'Request is from an invalid tool consumer.';
}
- } else {
- $this->ok = isset($_POST['tool_consumer_instance_guid']);
- if (!$this->ok) {
- $this->reason = 'A tool consumer GUID must be included in the launch request.';
- }
}
}
if ($this->ok) {
{{/options}}
</select>
<noscript>
- <input type="submit" role="button" class="btn btn-secondary" value="{{#str}}go, core{{/str}}">
+ <input type="submit" class="btn btn-secondary" value="{{#str}}go, core{{/str}}">
</noscript>
</form>
</div>
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
offset: offset,
});
+ // Link to mark read page before loading the actual link.
+ notification.contexturl = URL.relativeUrl('message/output/popup/mark_notification_read.php', {
+ redirecturl: notification.contexturl,
+ notificationid: notification.id,
+ });
+
var promise = Templates.render('message_popup/notification_content_item', notification)
.then(function(html, js) {
return {html: html, js: js};
}.bind(this));
};
- /**
- * Send a request to the server to mark a single notification as read and update
- * the unread count and unread notification elements appropriately.
- *
- * @param {jQuery} element
- * @return {Promise|boolean}
- * @method markAllAsRead
- */
- NotificationPopoverController.prototype.markNotificationAsRead = function(element) {
- if (!element.hasClass('unread')) {
- return false;
- }
-
- return NotificationRepo.markAsRead(element.attr('data-id'))
- .then(function() {
- this.unreadCount--;
- element.removeClass('unread');
- }.bind(this));
- };
-
/**
* Add all of the required event listeners for this notification popover.
*
// Mark individual notification read if the user activates it.
this.root.on(CustomEvents.events.activate, SELECTORS.NOTIFICATION_LINK, function(e) {
var element = $(e.target).closest(SELECTORS.NOTIFICATION);
- this.markNotificationAsRead(element);
+
+ if (element.hasClass('unread')) {
+ this.unreadCount--;
+ element.removeClass('unread');
+ }
+
e.stopPropagation();
}.bind(this));
upgrade_plugin_savepoint(true, 2018032800, 'message', 'popup');
}
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// 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/>.
+
+/**
+ * Mark a notification read and redirect to the relevant content.
+ *
+ * @package message_popup
+ * @copyright 2018 Michael Hawkins
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+require_once(__DIR__ . '/../../../config.php');
+
+require_login(null, false);
+
+if (isguestuser()) {
+ redirect($CFG->wwwroot);
+}
+
+$notificationid = required_param('notificationid', PARAM_INT);
+$redirecturl = optional_param('redirecturl', $CFG->wwwroot, PARAM_LOCALURL);
+$notification = $DB->get_record('notifications', array('id' => $notificationid));
+
+// Check notification belongs to this user.
+if ($USER->id != $notification->useridto) {
+ redirect($CFG->wwwroot);
+}
+
+\core_message\api::mark_notification_as_read($notification);
+redirect($redirecturl);
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
upgrade_mod_savepoint(true, 2017111301, 'chat');
}
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
upgrade_mod_savepoint(true, 2018032900, 'forum');
}
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
FROM {forum_discussions} d
JOIN {forum_posts} p ON p.discussion = d.id
JOIN {user} u ON p.userid = u.id
- WHERE d.forum = {$forum->id} AND p.parent = 0 AND p.deleted <> 0
+ WHERE d.forum = {$forum->id} AND p.parent = 0 AND p.deleted <> 1
$timelimit $groupselect $newsince
ORDER BY $forumsort";
return array($sql, $params);
{forum_posts} p,
{user} u
WHERE d.forum = {$forum->id} AND
- p.discussion = d.id AND p.deleted <> 0 AND
+ p.discussion = d.id AND p.deleted <> 1 AND
u.id = p.userid $newsince
$groupselect
ORDER BY p.created desc";
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// 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/>.
+
+/**
+ * Tests for the forum implementation of the RSS component.
+ *
+ * @package mod_forum
+ * @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+global $CFG;
+require_once(__DIR__ . '/helper.php');
+require_once("{$CFG->dirroot}/mod/forum/rsslib.php");
+
+/**
+ * Tests for the forum implementation of the RSS component.
+ *
+ * @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class mod_forum_rsslib_testcase extends advanced_testcase {
+ // Include the mod_forum test helpers.
+ // This includes functions to create forums, users, discussions, and posts.
+ use helper;
+
+ /**
+ * Ensure that deleted posts are not included.
+ */
+ public function test_forum_rss_feed_discussions_sql_respect_deleted() {
+ global $DB;
+
+ $this->resetAfterTest();
+
+ $course = $this->getDataGenerator()->create_course();
+ $forum = $this->getDataGenerator()->create_module('forum', ['course' => $course->id]);
+ $cm = get_coursemodule_from_instance('forum', $forum->id);
+
+ list($user, $otheruser) = $this->helper_create_users($course, 2);
+
+ // Post twice.
+ $this->helper_post_to_forum($forum, $otheruser);
+ list($discussion, $post) = $this->helper_post_to_forum($forum, $otheruser);
+
+ list($sql, $params) = forum_rss_feed_discussions_sql($forum, $cm);
+ $discussions = $DB->get_records_sql($sql, $params);
+ $this->assertCount(2, $discussions);
+
+ $post->deleted = 1;
+ $DB->update_record('forum_posts', $post);
+
+ list($sql, $params) = forum_rss_feed_discussions_sql($forum, $cm);
+ $discussions = $DB->get_records_sql($sql, $params);
+ $this->assertCount(1, $discussions);
+ }
+
+
+ /**
+ * Ensure that deleted posts are not included.
+ */
+ public function test_forum_rss_feed_posts_sql_respect_deleted() {
+ global $DB;
+
+ $this->resetAfterTest();
+
+ $course = $this->getDataGenerator()->create_course();
+ $forum = $this->getDataGenerator()->create_module('forum', ['course' => $course->id]);
+ $cm = get_coursemodule_from_instance('forum', $forum->id);
+
+ list($user, $otheruser) = $this->helper_create_users($course, 2);
+
+ // Post twice.
+ $this->helper_post_to_forum($forum, $otheruser);
+ list($discussion, $post) = $this->helper_post_to_forum($forum, $otheruser);
+
+ list($sql, $params) = forum_rss_feed_posts_sql($forum, $cm);
+ $posts = $DB->get_records_sql($sql, $params);
+ $this->assertCount(2, $posts);
+
+ $post->deleted = 1;
+ $DB->update_record('forum_posts', $post);
+
+ list($sql, $params) = forum_rss_feed_posts_sql($forum, $cm);
+ $posts = $DB->get_records_sql($sql, $params);
+ $this->assertCount(1, $posts);
+ }
+}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
if ($oldversion < 2018051401) {
// Fetch the module ID for the glossary module.
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
$pagetable->cellspacing = 0;
$pagetable->cellpadding = '5px';
$pagetable->data = array();
- $pagetable->id = 'lesson-' . $pageid;
$pageheading = new html_table_cell();
- $pageheading->text = format_string($page->title);
+ $pageheading->text = html_writer::tag('a', '', array('id' => 'lesson-' . $pageid)) . format_string($page->title);
if ($canedit) {
$pageheading->text .= ' '.$this->page_action_links($page, $npages);
}
$pagetable = $page->display_answers($pagetable);
- $content .= html_writer::start_tag('div', array('class' => 'no-overflow'));
+ $content .= html_writer::start_tag('div');
$content .= html_writer::table($pagetable);
$content .= html_writer::end_tag('div');
And I follow "Expanded"
Scenario: Edit lesson content page
- Given I click on "//th[normalize-space(.)='First page name']/descendant::a[2]" "xpath_element"
+ Given I click on "//th[normalize-space(.)='First page name']/descendant::a[3]" "xpath_element"
When I set the following fields to these values:
| id_answer_editor_1 | |
And I press "Save page"
And I should see "Your score is 1 (out of 1)."
Scenario: Edit lesson question page
- Given I click on "//th[normalize-space(.)='Hardest question ever']/descendant::a[2]" "xpath_element"
+ Given I click on "//th[normalize-space(.)='Hardest question ever']/descendant::a[3]" "xpath_element"
When I set the following fields to these values:
| id_answer_editor_1 | |
And I press "Save page"
And I press "Save page"
Scenario: Edit lesson cluster page
- Given I click on "//th[normalize-space(.)='Cluster']/descendant::a[2]" "xpath_element"
+ Given I click on "//th[normalize-space(.)='Cluster']/descendant::a[3]" "xpath_element"
When I set the following fields to these values:
| Page title | Modified name |
| Page contents | Modified contents |
And I press "Save page"
Then I should see "Modified name"
- And I click on "//th[normalize-space(.)='Modified name']/descendant::a[2]" "xpath_element"
+ And I click on "//th[normalize-space(.)='Modified name']/descendant::a[3]" "xpath_element"
And I should see "Unseen question within a cluster"
And I press "Cancel"
- And I click on "//th[normalize-space(.)='End of cluster']/descendant::a[2]" "xpath_element"
+ And I click on "//th[normalize-space(.)='End of cluster']/descendant::a[3]" "xpath_element"
And I set the following fields to these values:
| Page title | Modified end |
| Page contents | Modified end contents |
And I press "Save page"
Scenario: Edit lesson content page
- Given I click on "//th[normalize-space(.)='Second page name']/descendant::a[2]" "xpath_element"
+ Given I click on "//th[normalize-space(.)='Second page name']/descendant::a[3]" "xpath_element"
When I set the following fields to these values:
| Page title | Modified second page |
| Page contents | Modified contents |
And I should see "Your score is 1 (out of 1)."
Scenario: Edit lesson question page
- Given I click on "//th[normalize-space(.)='Hardest question ever']/descendant::a[2]" "xpath_element"
+ Given I click on "//th[normalize-space(.)='Hardest question ever']/descendant::a[3]" "xpath_element"
When I set the following fields to these values:
| Page title | New hardest question |
| Page contents | 1 + 2? |
upgrade_mod_savepoint(true, 2017111301, 'lti');
}
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
upgrade_mod_savepoint(true, 2018040800, 'quiz');
}
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
upgrade_plugin_savepoint(true, 2018021800, 'quiz', 'overview');
}
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
upgrade_mod_savepoint(true, 2018041100, 'scorm');
}
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
upgrade_mod_savepoint(true, 2018042700, 'workshop');
}
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Essay savepoint reached.
upgrade_plugin_savepoint(true, 2018021800, 'qtype', 'essay');
}
+
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
* @param course_in_list $course The currently selected course.
* @param int $page The page being displayed.
* @param int $perpage The number of courses to display per page.
+ * @param string|null $viewmode The view mode the page is in, one out of 'default', 'combined', 'courses' or 'categories'.
* @return string
*/
- public function course_listing(coursecat $category = null, course_in_list $course = null, $page = 0, $perpage = 20) {
+ public function course_listing(coursecat $category = null, course_in_list $course = null,
+ $page = 0, $perpage = 20, $viewmode = 'default') {
if ($category === null) {
$html = html_writer::start_div('select-a-category');
array('id' => 'course-listing-title', 'tabindex' => '0', 'class' => 'card-header'));
$html .= html_writer::start_div('card-body');
$html .= $this->course_listing_actions($category, $course, $perpage);
- $html .= $this->listing_pagination($category, $page, $perpage);
+ $html .= $this->listing_pagination($category, $page, $perpage, false, $viewmode);
$html .= html_writer::start_tag('ul', array('class' => 'ml course-list', 'role' => 'group'));
foreach ($category->get_courses($options) as $listitem) {
$html .= $this->course_listitem($category, $listitem, $courseid);
}
$html .= html_writer::end_tag('ul');
- $html .= $this->listing_pagination($category, $page, $perpage, true);
+ $html .= $this->listing_pagination($category, $page, $perpage, true, $viewmode);
$html .= $this->course_bulk_actions($category);
$html .= html_writer::end_div();
$html .= html_writer::end_div();
// Automatically generated Moodle v3.4.0 release upgrade line.
// Put any upgrade step following this.
+ // Automatically generated Moodle v3.5.0 release upgrade line.
+ // Put any upgrade step following this.
+
return true;
}
* @param Exception $ex
*/
protected function send_error($ex = null) {
+ $this->response = $this->generate_error($ex);
$this->send_headers();
- echo $this->generate_error($ex);
+ echo $this->response;
}
/**