Merge branch 'MDL-49776-master' of git://github.com/lameze/moodle
authorDan Poltawski <dan@moodle.com>
Tue, 26 May 2015 10:53:34 +0000 (11:53 +0100)
committerDan Poltawski <dan@moodle.com>
Tue, 26 May 2015 10:53:34 +0000 (11:53 +0100)
16 files changed:
backup/restorefile_form.php
backup/util/helper/backup_anonymizer_helper.class.php
blog/index.php
blog/lib.php
blog/tests/behat/blog_visibility.feature [new file with mode: 0644]
cache/classes/helper.php
grade/report/user/lib.php
grade/tests/behat/grade_average.feature [new file with mode: 0644]
lib/classes/event/role_capabilities_updated.php
lib/moodlelib.php
lib/outputrenderers.php
lib/pagelib.php
mod/assign/gradingtable.php
mod/upgrade.txt
notes/lib.php
webservice/soap/locallib.php

index f903415..eec70f9 100644 (file)
@@ -30,6 +30,7 @@ class course_restore_form extends moodleform {
         $mform->addElement('hidden', 'contextid', $contextid);
         $mform->setType('contextid', PARAM_INT);
         $mform->addElement('filepicker', 'backupfile', get_string('files'));
+        $mform->addRule('backupfile', get_string('required'), 'required');
         $submit_string = get_string('restore');
         $this->add_action_buttons(false, $submit_string);
     }
index 04a9d2d..f3b5925 100644 (file)
@@ -167,4 +167,48 @@ class backup_anonymizer_helper {
     public static function process_user_imagealt($value) {
         return ''; // No user imagealt
     }
+
+    /**
+     * Anonymises user's phonetic name field
+     * @param string $value value of the user field
+     * @return string anonymised phonetic name
+     */
+    public static function process_user_firstnamephonetic($value) {
+        static $counter = 0;
+        $counter++;
+        return 'anonfirstnamephonetic' . $counter; // Just a counter.
+    }
+
+    /**
+     * Anonymises user's phonetic last name field
+     * @param string $value value of the user field
+     * @return string anonymised last phonetic name
+     */
+    public static function process_user_lastnamephonetic($value) {
+        static $counter = 0;
+        $counter++;
+        return 'anonlastnamephonetic' . $counter; // Just a counter.
+    }
+
+    /**
+     * Anonymises user's middle name field
+     * @param string $value value of the user field
+     * @return string anonymised middle name
+     */
+    public static function process_user_middlename($value) {
+        static $counter = 0;
+        $counter++;
+        return 'anonmiddlename' . $counter; // Just a counter.
+    }
+
+    /**
+     * Anonymises user's alternate name field
+     * @param string $value value of the user field
+     * @return string anonymised alternate name
+     */
+    public static function process_user_alternatename($value) {
+        static $counter = 0;
+        $counter++;
+        return 'anonalternatename' . $counter; // Just a counter.
+    }
 }
index 1f5217a..ddbdf45 100644 (file)
@@ -76,7 +76,9 @@ $sitecontext = context_system::instance();
 
 if (isset($userid) && $USER->id == $userid) {
     $blognode = $PAGE->navigation->find('siteblog', null);
-    $blognode->make_inactive();
+    if ($blognode) {
+        $blognode->make_inactive();
+    }
 }
 
 // Check basic permissions.
index 50eaa35..0be7e58 100644 (file)
@@ -1023,12 +1023,17 @@ function blog_page_type_list($pagetype, $parentcontext, $currentcontext) {
  * @return bool
  */
 function core_blog_myprofile_navigation(core_user\output\myprofile\tree $tree, $user, $iscurrentuser, $course) {
+    global $CFG;
     if (!blog_is_enabled_for_user() || isguestuser($user)) {
         // The guest user cannot post, so it is not possible to view any posts.
         // Also blogs might be disabled.
         // May as well just bail aggressively here.
         return true;
     }
+    if ($CFG->bloglevel == BLOG_USER_LEVEL && !$iscurrentuser) {
+        // Blogs are only viewable by the owner.
+        return true;
+    }
     $url = new moodle_url("/blog/index.php", array('userid' => $user->id));
     if (!empty($course)) {
         $url->param('courseid', $course->id);
diff --git a/blog/tests/behat/blog_visibility.feature b/blog/tests/behat/blog_visibility.feature
new file mode 100644 (file)
index 0000000..bd38cad
--- /dev/null
@@ -0,0 +1,37 @@
+@core @core_blog
+Feature: Blogs can be set to be only visible by the author.
+  In order to make blogs personal only
+  As a user
+  I need to set the blog level to Users can only see their own blogs.
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email |
+      | testuser | Test | User | moodle@example.com |
+      | testuser2 | Test2 | User2 | moodle2@example.com |
+    And the following "courses" exist:
+      | fullname | shortname |
+      | Course 1 | C1 |
+    And the following "course enrolments" exist:
+      | user      | course | role    |
+      | testuser  | C1     | student |
+      | testuser2 | C1     | student |
+    And I log in as "admin"
+    And I am on site homepage
+    And I navigate to "Blog" node in "Site administration > Appearance"
+    And I set the following fields to these values:
+      | Blog visibility | Users can only see their own blog |
+    And I press "Save changes"
+    And I log out
+
+  @javascript
+  Scenario: A student can not see another student's blog entries.
+    Given I log in as "testuser"
+    And I follow "Course 1"
+    And I follow "Participants"
+    And I follow "Test2 User2"
+    And I should see "Miscellaneous"
+    Then I should not see "Blog entries"
+    And I follow "Profile" in the user menu
+    And I follow "Blog entries"
+    And I should see "User blog: Test User"
index e272ee4..eca785f 100644 (file)
@@ -318,6 +318,8 @@ class cache_helper {
                 $definitionkey = $definition->get_component().'/'.$definition->get_area();
                 if (isset($inuse[$definitionkey])) {
                     $inuse[$definitionkey]->purge();
+                } else {
+                    cache::make($definition->get_component(), $definition->get_area())->purge();
                 }
 
                 // We should only log events for application and session caches.
index 49cb1a9..7552bb8 100644 (file)
@@ -859,7 +859,7 @@ class grade_report_user extends grade_report {
      * Builds the grade item averages.
      */
     function calculate_averages() {
-        global $USER, $DB;
+        global $USER, $DB, $CFG;
 
         if ($this->showaverage) {
             // This settings are actually grader report settings (not user report)
@@ -882,7 +882,11 @@ class grade_report_user extends grade_report {
             list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
 
             // Limit to users with an active enrolment.
-            list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context);
+            $coursecontext = $this->context->get_course_context(true);
+            $defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol);
+            $showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol);
+            $showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $coursecontext);
+            list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context, '', 0, $showonlyactiveenrol);
 
             $params = array_merge($this->groupwheresql_params, $gradebookrolesparams, $enrolledparams, $relatedctxparams);
             $params['courseid'] = $this->courseid;
diff --git a/grade/tests/behat/grade_average.feature b/grade/tests/behat/grade_average.feature
new file mode 100644 (file)
index 0000000..1899e4d
--- /dev/null
@@ -0,0 +1,67 @@
+@core @core_grades
+Feature: Average grades are displayed in the gradebook
+  In order to check the expected results are displayed
+  As an admin
+  I need to assign grades and check that they display correctly in the gradebook.
+
+  Background:
+    Given the following "courses" exist:
+      | fullname | shortname | format |
+      | Course 1 | C1 | topics |
+    And the following "users" exist:
+      | username | firstname | lastname | email |
+      | teacher1 | Teacher | 1 | teacher1@example.com |
+      | student1 | Student | 1 | student1@example.com |
+      | student2 | Student | 2 | student2@example.com |
+      | student3 | Student | 3 | student3@example.com |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+      | student1 | C1 | student |
+      | student2 | C1 | student |
+      | student3 | C1 | student |
+    And I log in as "admin"
+    And I am on site homepage
+    And I follow "Course 1"
+    # Enable averages
+    And I navigate to "Grades" node in "Course administration"
+    And I navigate to "Course grade settings" node in "Grade administration > Setup"
+    And I set the following fields to these values:
+      | Show average | Show |
+    And I press "Save changes"
+    # Add a manual grade item
+    And I navigate to "Categories and items" node in "Grade administration > Setup"
+    And I press "Add grade item"
+    And I set the following fields to these values:
+      | Item name | Manual item 1 |
+    And I press "Save changes"
+    # Give all student the same grade for the manual grade item
+    And I navigate to "Grader report" node in "Grade administration"
+    And I turn editing mode on
+    And I give the grade "50.00" to the user "Student 1" for the grade item "Manual item 1"
+    And I give the grade "50.00" to the user "Student 2" for the grade item "Manual item 1"
+    And I give the grade "50.00" to the user "Student 3" for the grade item "Manual item 1"
+    And I press "Save changes"
+    And I turn editing mode off
+    # Suspend a user
+    And I navigate to "Enrolled users" node in "Course administration > Users"
+    And I click on "Edit" "link" in the "Student 2" "table_row"
+    And I set the following fields to these values:
+      | Status | Suspended |
+    And I press "Save changes"
+
+  Scenario: Grade a grade item and ensure the results display correctly in the gradebook
+    # Check the admin grade table
+    And I navigate to "Grades" node in "Course administration"
+    Then I should see "50.00" in the ".avg.r0.lastrow .c1" "css_element"
+    Then I should see "50.00" in the ".avg.r0.lastrow .c2" "css_element"
+    And I log out
+
+    # Check the user grade table
+    And I log in as "student1"
+    And I am on site homepage
+    And I follow "Course 1"
+    And I navigate to "Grades" node in "Course administration"
+    Then I should see "50.00" in the ".level2.column-grade" "css_element"
+    Then I should see "50.00" in the ".level2.column-average" "css_element"
+    And I log out
index 19ab5cf..887c8e3 100644 (file)
@@ -72,7 +72,7 @@ class role_capabilities_updated extends base {
      * @return \moodle_url
      */
     public function get_url() {
-        if ($this->contextlevel === CONTEXT_SYSTEM) {
+        if ($this->contextlevel == CONTEXT_SYSTEM) {
             return new \moodle_url('/admin/roles/define.php', array('action' => 'view', 'roleid' => $this->objectid));
         } else {
             return new \moodle_url('/admin/roles/override.php', array('contextid' => $this->contextid,
index 33b0324..dbac0a3 100644 (file)
@@ -408,7 +408,7 @@ define('FEATURE_COMPLETION_HAS_RULES', 'completion_has_rules');
 
 /** True if module has no 'view' page (like label) */
 define('FEATURE_NO_VIEW_LINK', 'viewlink');
-/** True if module supports outcomes */
+/** True (which is default) if the module wants support for setting the ID number for grade calculation purposes. */
 define('FEATURE_IDNUMBER', 'idnumber');
 /** True if module supports groups */
 define('FEATURE_GROUPS', 'groups');
index ab26c4b..8c25e02 100644 (file)
@@ -2921,23 +2921,23 @@ EOD;
             $output .= get_string('page') . ':';
 
             if (!empty($pagingbar->previouslink)) {
-                $output .= '&#160;(' . $pagingbar->previouslink . ')&#160;';
+                $output .= ' (' . $pagingbar->previouslink . ') ';
             }
 
             if (!empty($pagingbar->firstlink)) {
-                $output .= '&#160;' . $pagingbar->firstlink . '&#160;...';
+                $output .= ' ' . $pagingbar->firstlink . ' ...';
             }
 
             foreach ($pagingbar->pagelinks as $link) {
-                $output .= "&#160;&#160;$link";
+                $output .= "  $link";
             }
 
             if (!empty($pagingbar->lastlink)) {
-                $output .= '&#160;...' . $pagingbar->lastlink . '&#160;';
+                $output .= ' ...' . $pagingbar->lastlink . ' ';
             }
 
             if (!empty($pagingbar->nextlink)) {
-                $output .= '&#160;&#160;(' . $pagingbar->nextlink . ')';
+                $output .= '  (' . $pagingbar->nextlink . ')';
             }
         }
 
index 0c0e99b..d1a5d78 100644 (file)
@@ -1828,6 +1828,11 @@ class moodle_page {
      * @throws coding_exception
      */
     protected function ensure_theme_not_set() {
+        // This is explicitly allowed for webservices though which may process many course contexts in a single request.
+        if (WS_SERVER) {
+            return;
+        }
+
         if (!is_null($this->_theme)) {
             throw new coding_exception('The theme has already been set up for this page ready for output. ' .
                     'Therefore, you can no longer change the theme, or anything that might affect what ' .
index f1d65dc..eeec278 100644 (file)
@@ -717,10 +717,7 @@ class assign_grading_table extends table_sql implements renderable {
      * @return string
      */
     public function col_picture(stdClass $row) {
-        if ($row->picture) {
-            return $this->output->user_picture($row);
-        }
-        return '';
+        return $this->output->user_picture($row);
     }
 
     /**
index 7985d9d..bff2c99 100644 (file)
@@ -2,7 +2,12 @@ This files describes API changes in /mod/* - activity modules,
 information provided here is intended especially for developers.
 
 === 2.9 ===
+
 * Added Grade to pass field to mod_form for activities that support grading.
+* The method moodleform_mod::add_intro_editor() used in mod_form.php form
+  definitions has been deprecated. Replace it with the new
+  moodleform_mod::standard_intro_elements() method that takes the new site
+  configuration requiremodintro into account (MDL-49101).
 
 === 2.8 ===
 
index 7b86046..ea05994 100644 (file)
@@ -379,6 +379,13 @@ function note_view($context, $userid) {
  * @return bool
  */
 function core_notes_myprofile_navigation(core_user\output\myprofile\tree $tree, $user, $iscurrentuser, $course) {
+    global $CFG;
+
+    if (empty($CFG->enablenotes)) {
+        // Notes are disabled, nothing to do.
+        return false;
+    }
+
     $url = new moodle_url("/notes/index.php", array('user' => $user->id));
     $title = get_string('notes', 'core_notes');
     if (empty($course)) {
index 8ccd317..1386256 100644 (file)
@@ -273,11 +273,6 @@ class webservice_soap_server extends webservice_zend_server {
      */
     protected function generate_simple_struct_class(external_single_structure $structdesc) {
         global $USER;
-        // let's use unique class name, there might be problem in unit tests
-        $classname = 'webservices_struct_class_000000';
-        while(class_exists($classname)) {
-            $classname++;
-        }
 
         $fields = array();
         foreach ($structdesc->keys as $name => $fieldsdesc) {
@@ -286,6 +281,12 @@ class webservice_soap_server extends webservice_zend_server {
                         '    public $'.$name.';';
         }
 
+        // We do this after the call to get_phpdoc_type() to avoid duplicate class creation.
+        $classname = 'webservices_struct_class_000000';
+        while (class_exists($classname)) {
+            $classname++;
+        }
+
         $code = '
 /**
  * Virtual struct class for web services for user id '.$USER->id.' in context '.$this->restricted_context->id.'.