Merge branch 'MDL-52585-master' of git://github.com/jleyva/moodle
authorAndrew Nicols <andrew@nicols.co.uk>
Tue, 12 Jan 2016 06:35:36 +0000 (14:35 +0800)
committerDan Poltawski <dan@moodle.com>
Tue, 12 Jan 2016 09:31:08 +0000 (09:31 +0000)
189 files changed:
.travis.yml
Gruntfile.js
backup/util/helper/restore_logs_processor.class.php
backup/util/plan/backup_structure_step.class.php
backup/util/plan/restore_structure_step.class.php
badges/tests/badgeslib_test.php
blocks/activity_results/tests/behat/highscoreswithscales.feature [new file with mode: 0644]
blocks/activity_results/tests/behat/highscoreswithscalesandgroups.feature [new file with mode: 0644]
blocks/activity_results/tests/behat/highscoreswithseperategroups.feature
blocks/activity_results/tests/behat/highscoreswithvisiblegroups.feature
blocks/activity_results/tests/behat/lowscoreswithscales.feature [new file with mode: 0644]
blocks/activity_results/tests/behat/lowscoreswithscalesandgroups.feature [new file with mode: 0644]
blocks/activity_results/tests/behat/lowscoreswithseperategroups.feature
blocks/activity_results/tests/behat/lowscoreswithvisiblegroups.feature
blocks/blog_menu/tests/behat/block_blog_menu.feature [new file with mode: 0644]
blocks/blog_menu/tests/behat/block_blog_menu_course.feature [new file with mode: 0644]
blocks/blog_menu/tests/behat/block_blog_menu_frontpage.feature [new file with mode: 0644]
blog/edit.php
blog/external_blogs.php
blog/index.php
blog/lib.php
blog/locallib.php
blog/renderer.php
blog/rsslib.php
blog/tests/lib_test.php [moved from blog/tests/bloglib_test.php with 82% similarity]
calendar/lib.php
completion/tests/behat/teacher_manual_completion.feature
composer.json
composer.lock
course/classes/management_renderer.php
course/format/social/tests/behat/social_adjust_discussion_count.feature
course/modedit.php
enrol/database/lib.php
enrol/externallib.php
enrol/guest/classes/enrol_guest_edit_form.php
enrol/guest/classes/external.php [new file with mode: 0644]
enrol/guest/db/services.php [new file with mode: 0644]
enrol/guest/lib.php
enrol/guest/tests/external_test.php [new file with mode: 0644]
enrol/guest/version.php
enrol/paypal/ipn.php
enrol/self/edit_form.php
enrol/self/externallib.php
enrol/self/lib.php
enrol/self/tests/externallib_test.php
enrol/tests/behat/manage_enrolments_from_participants.feature [new file with mode: 0644]
enrol/tests/externallib_test.php
filter/tex/latex.php
grade/report/singleview/index.php
grade/report/user/tests/lib_test.php [new file with mode: 0644]
grade/tests/behat/grade_hidden_items.feature [new file with mode: 0644]
group/lib.php
install/lang/es/moodle.php
install/lang/he/install.php
install/lang/hr/admin.php
install/lang/hr/error.php
install/lang/hr/install.php
install/lang/nl/moodle.php
install/lang/pt/admin.php
install/lang/pt/moodle.php
install/lang/pt_br/moodle.php
install/lang/zh_cn/error.php
install/lang/zh_tw/install.php
lib/behat/classes/behat_selectors.php
lib/behat/lib.php
lib/classes/plugininfo/cachestore.php
lib/db/services.php
lib/dml/moodle_database.php
lib/dml/tests/dml_test.php
lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button-debug.js
lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button-min.js
lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button.js
lib/editor/atto/plugins/rtl/yui/src/button/js/button.js
lib/filestorage/tests/file_storage_test.php
lib/grade/grade_grade.php
lib/modinfolib.php
lib/moodlelib.php
lib/myprofilelib.php
lib/outputcomponents.php
lib/pagelib.php
lib/phpunit/classes/util.php
lib/phpunit/tests/util_test.php [new file with mode: 0644]
lib/setuplib.php
lib/testing/classes/util.php
lib/testing/generator/data_generator.php
lib/testing/tests/generator_test.php
lib/tests/behat/largeforms.feature [new file with mode: 0644]
lib/tests/fixtures/max_input_vars.php [new file with mode: 0644]
lib/tests/myprofilelib_test.php [new file with mode: 0644]
lib/upgrade.txt
message/lib.php
message/output/airnotifier/classes/manager.php
message/tests/behat/display_history.feature
message/tests/behat/message_participants.feature
message/upgrade.txt
mod/assign/feedback/editpdf/tests/behat/annotate_pdf.feature
mod/assign/feedback/editpdf/yui/build/moodle-assignfeedback_editpdf-editor/moodle-assignfeedback_editpdf-editor-debug.js
mod/assign/feedback/editpdf/yui/build/moodle-assignfeedback_editpdf-editor/moodle-assignfeedback_editpdf-editor-min.js
mod/assign/feedback/editpdf/yui/build/moodle-assignfeedback_editpdf-editor/moodle-assignfeedback_editpdf-editor.js
mod/assign/feedback/editpdf/yui/src/editor/js/editor.js
mod/assign/lang/en/assign.php
mod/assign/locallib.php
mod/assign/tests/locallib_test.php
mod/chat/locallib.php
mod/data/field/date/field.class.php
mod/forum/classes/output/forum_post.php
mod/forum/externallib.php
mod/forum/lang/en/forum.php
mod/forum/lib.php
mod/forum/search.php
mod/forum/templates/forum_post_emaildigestbasic_htmlemail.mustache
mod/forum/tests/behat/discussion_navigation.feature
mod/forum/tests/generator/lib.php
mod/forum/tests/lib_test.php
mod/glossary/classes/entry_query_builder.php [new file with mode: 0644]
mod/glossary/classes/external.php
mod/glossary/db/services.php
mod/glossary/lib.php
mod/glossary/print.php
mod/glossary/showentry.php
mod/glossary/showentry_ajax.php
mod/glossary/sql.php
mod/glossary/tests/external_test.php
mod/glossary/tests/lib_test.php [new file with mode: 0644]
mod/glossary/version.php
mod/glossary/view.php
mod/lesson/lang/en/lesson.php
mod/lesson/lib.php
mod/lesson/tests/behat/completion_condition_time_spent.feature
mod/lesson/tests/behat/date_availability.feature
mod/lesson/tests/behat/lesson_complete_report.feature [new file with mode: 0644]
mod/lesson/tests/behat/lesson_student_resume.feature
mod/quiz/backup/moodle2/restore_quiz_activity_task.class.php
mod/quiz/locallib.php
mod/quiz/renderer.php
mod/scorm/classes/external.php
mod/scorm/datamodels/scorm_12.php
mod/scorm/datamodels/scorm_13.php
mod/scorm/db/services.php
mod/scorm/loadSCO.php
mod/scorm/locallib.php
mod/scorm/module.js
mod/scorm/report/interactions/classes/report.php
mod/scorm/report/interactions/lang/en/scormreport_interactions.php
mod/scorm/report/interactions/responsessettings_form.php
mod/scorm/report/interactions/version.php
mod/scorm/tests/externallib_test.php
mod/scorm/tests/packages/complexscorm.zip [new file with mode: 0644]
mod/scorm/version.php
mod/wiki/classes/external.php
mod/wiki/db/services.php
mod/wiki/lib.php
mod/wiki/prettyview.php
mod/wiki/tests/externallib_test.php
mod/wiki/tests/lib_test.php [new file with mode: 0644]
mod/wiki/version.php
mod/wiki/view.php
mod/workshop/styles.css
notes/lib.php
notes/tests/lib_test.php [new file with mode: 0644]
npm-shrinkwrap.json [new file with mode: 0644]
package.json
question/engine/renderer.php
question/tests/behat/behat_question.php
question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd-debug.js
question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd-min.js
question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd.js
question/type/ddimageortext/yui/src/ddimageortext/js/ddimageortext.js
question/type/ddwtos/yui/build/moodle-qtype_ddwtos-dd/moodle-qtype_ddwtos-dd-debug.js
question/type/ddwtos/yui/build/moodle-qtype_ddwtos-dd/moodle-qtype_ddwtos-dd-min.js
question/type/ddwtos/yui/build/moodle-qtype_ddwtos-dd/moodle-qtype_ddwtos-dd.js
question/type/ddwtos/yui/src/ddwtos/js/ddwtos.js
question/type/multianswer/edit_multianswer_form.php
report/log/tests/lib_test.php
report/outline/tests/lib_test.php
report/stats/tests/lib_test.php
report/usersessions/tests/lib_test.php [new file with mode: 0644]
repository/tests/repositorylib_test.php
theme/bootstrapbase/less/moodle/calendar.less
theme/bootstrapbase/less/moodle/core.less
theme/bootstrapbase/less/moodle/debug.less
theme/bootstrapbase/style/moodle.css
theme/clean/lang/en/theme_clean.php
theme/more/lang/en/theme_more.php
user/externallib.php
user/index.php
user/message.html
user/messageselect.php
version.php

index 08d8338..afae285 100644 (file)
@@ -58,6 +58,9 @@ cache:
       - $HOME/.composer/cache
 
 install:
+    # Disable xdebug. We aren't generating code coverage, and it has a huge impact upon test performance.
+    - rm /home/travis/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini
+
     # Set the encrypted GITHUB_TOKEN if it's available to raise the API limit.
     - if [ -n "$GITHUB_APITOKEN" ]; then composer config github-oauth.github.com $GITHUB_APITOKEN; fi
 
index dcc22a8..665bb44 100644 (file)
@@ -114,6 +114,10 @@ module.exports = function(grunt) {
                 args.push('--lint-stderr');
             }
 
+            if (grunt.option('no-color')) {
+                args.push('--color=false');
+            }
+
             var execShifter = function() {
 
                 shifter = exec("node", args, {
index 585d9b4..bc2c2b6 100644 (file)
@@ -89,11 +89,12 @@ class restore_logs_processor {
             }
             // Arrived here log is empty, no rule was able to perform the conversion, log the problem
             if (empty($newlog)) {
-                self::$task->log('Log module-action "' . $keyname . '" process problem. Not restored', backup::LOG_DEBUG);
+                self::$task->log('Log module-action "' . $keyname . '" process problem. Not restored. ' .
+                    json_encode($log), backup::LOG_DEBUG);
             }
 
         } else { // Action not found log the problem
-            self::$task->log('Log module-action "' . $keyname . '" unknown. Not restored', backup::LOG_DEBUG);
+            self::$task->log('Log module-action "' . $keyname . '" unknown. Not restored. '.json_encode($log), backup::LOG_DEBUG);
             $newlog = false;
 
         }
index 5d8cb55..e18ada4 100644 (file)
@@ -183,6 +183,10 @@ abstract class backup_structure_step extends backup_step {
      * @return void
      */
     protected function add_subplugin_structure($subplugintype, $element, $multiple, $plugintype = null, $pluginname = null) {
+        global $CFG;
+        // This global declaration is required, because where we do require_once($backupfile);
+        // That file may in turn try to do require_once($CFG->dirroot ...).
+        // That worked in the past, we should keep it working.
 
         // Verify if this is a BC call for an activity backup. See NOTE above for this special case.
         if ($plugintype === null and $pluginname === null) {
index de7b002..b59ac82 100644 (file)
@@ -313,6 +313,10 @@ abstract class restore_structure_step extends restore_step {
      * @return void
      */
     protected function add_subplugin_structure($subplugintype, $element, $plugintype = null, $pluginname = null) {
+        global $CFG;
+        // This global declaration is required, because where we do require_once($backupfile);
+        // That file may in turn try to do require_once($CFG->dirroot ...).
+        // That worked in the past, we should keep it working.
 
         // Verify if this is a BC call for an activity restore. See NOTE above for this special case.
         if ($plugintype === null and $pluginname === null) {
index 2de1122..a8d4382 100644 (file)
@@ -28,6 +28,7 @@ defined('MOODLE_INTERNAL') || die();
 
 global $CFG;
 require_once($CFG->libdir . '/badgeslib.php');
+require_once($CFG->dirroot . '/badges/lib.php');
 
 class core_badges_badgeslib_testcase extends advanced_testcase {
     protected $badgeid;
@@ -472,4 +473,69 @@ class core_badges_badgeslib_testcase extends advanced_testcase {
         $this->assertStringMatchesFormat($testassertion->class, json_encode($assertion->get_badge_class()));
         $this->assertStringMatchesFormat($testassertion->issuer, json_encode($assertion->get_issuer()));
     }
+
+    /**
+     * Tests the core_badges_myprofile_navigation() function.
+     */
+    public function test_core_badges_myprofile_navigation() {
+        // Set up the test.
+        $tree = new \core_user\output\myprofile\tree();
+        $this->setAdminUser();
+        $badge = new badge($this->badgeid);
+        $badge->issue($this->user->id, true);
+        $iscurrentuser = true;
+        $course = null;
+
+        // Enable badges.
+        set_config('enablebadges', true);
+
+        // Check the node tree is correct.
+        core_badges_myprofile_navigation($tree, $this->user, $iscurrentuser, $course);
+        $reflector = new ReflectionObject($tree);
+        $nodes = $reflector->getProperty('nodes');
+        $nodes->setAccessible(true);
+        $this->assertArrayHasKey('localbadges', $nodes->getValue($tree));
+    }
+
+    /**
+     * Tests the core_badges_myprofile_navigation() function with badges disabled..
+     */
+    public function test_core_badges_myprofile_navigation_badges_disabled() {
+        // Set up the test.
+        $tree = new \core_user\output\myprofile\tree();
+        $this->setAdminUser();
+        $badge = new badge($this->badgeid);
+        $badge->issue($this->user->id, true);
+        $iscurrentuser = false;
+        $course = null;
+
+        // Disable badges.
+        set_config('enablebadges', false);
+
+        // Check the node tree is correct.
+        core_badges_myprofile_navigation($tree, $this->user, $iscurrentuser, $course);
+        $reflector = new ReflectionObject($tree);
+        $nodes = $reflector->getProperty('nodes');
+        $nodes->setAccessible(true);
+        $this->assertArrayNotHasKey('localbadges', $nodes->getValue($tree));
+    }
+
+    /**
+     * Tests the core_badges_myprofile_navigation() function with a course badge.
+     */
+    public function test_core_badges_myprofile_navigation_with_course_badge() {
+        // Set up the test.
+        $tree = new \core_user\output\myprofile\tree();
+        $this->setAdminUser();
+        $badge = new badge($this->coursebadge);
+        $badge->issue($this->user->id, true);
+        $iscurrentuser = false;
+
+        // Check the node tree is correct.
+        core_badges_myprofile_navigation($tree, $this->user, $iscurrentuser, $this->course);
+        $reflector = new ReflectionObject($tree);
+        $nodes = $reflector->getProperty('nodes');
+        $nodes->setAccessible(true);
+        $this->assertArrayHasKey('localbadges', $nodes->getValue($tree));
+    }
 }
diff --git a/blocks/activity_results/tests/behat/highscoreswithscales.feature b/blocks/activity_results/tests/behat/highscoreswithscales.feature
new file mode 100644 (file)
index 0000000..1263382
--- /dev/null
@@ -0,0 +1,111 @@
+@block @block_activity_results
+Feature: The activity results block displays student scores as scales
+  In order to be display student scores as scales
+  As a user
+  I need to see the activity results block
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email | idnumber |
+      | teacher1 | Teacher | 1 | teacher1@example.com | T1 |
+      | student1 | Student | 1 | student1@example.com | S1 |
+      | student2 | Student | 2 | student2@example.com | S2 |
+      | student3 | Student | 3 | student3@example.com | S3 |
+      | student4 | Student | 4 | student4@example.com | S4 |
+      | student5 | Student | 5 | student5@example.com | S5 |
+    And the following "courses" exist:
+      | fullname | shortname | category |
+      | Course 1 | C1 | 0 |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+      | student1 | C1 | student |
+      | student2 | C1 | student |
+      | student3 | C1 | student |
+      | student4 | C1 | student |
+      | student5 | C1 | student |
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I navigate to "Grades" node in "Course administration"
+    And I navigate to "Scales" node in "Grade administration"
+    And I press "Add a new scale"
+    And I set the following fields to these values:
+      | Name | My Scale |
+      | Scale | Disappointing, Not good enough, Average, Good, Very good, Excellent! |
+    And I press "Save changes"
+    And I follow "Course 1"
+    And I turn editing mode on
+    And I add a "Assignment" to section "1" and I fill the form with:
+      | Assignment name | Test assignment |
+      | Description | Offline text |
+      | assignsubmission_file_enabled | 0 |
+      | id_modgrade_type | Scale |
+      | id_modgrade_scale | My Scale |
+    And I follow "Course 1"
+    And I navigate to "Grades" node in "Course administration"
+    And I turn editing mode on
+    And I give the grade "Excellent!" to the user "Student 1" for the grade item "Test assignment"
+    And I give the grade "Very good" to the user "Student 2" for the grade item "Test assignment"
+    And I give the grade "Good" to the user "Student 3" for the grade item "Test assignment"
+    And I give the grade "Average" to the user "Student 4" for the grade item "Test assignment"
+    And I give the grade "Not good enough" to the user "Student 5" for the grade item "Test assignment"
+    And I press "Save changes"
+    And I follow "Course 1"
+
+  Scenario: Configure the block on the course page to show 1 high score
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 1 |
+      | id_config_showworst | 0 |
+      | id_config_nameformat | Display full names |
+      | id_config_decimalpoints | 0 |
+    And I press "Save changes"
+    Then I should see "Student 1" in the "Activity results" "block"
+    And I should see "Excellent!" in the "Activity results" "block"
+
+  Scenario: Try to configure the block on the course page to show multiple high scores using full names
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 3 |
+      | id_config_showworst | 0 |
+      | id_config_nameformat | Display full names |
+    And I press "Save changes"
+    Then I should see "Student 1" in the "Activity results" "block"
+    And I should see "Excellent!" in the "Activity results" "block"
+    And I should see "Student 2" in the "Activity results" "block"
+    And I should see "Very good" in the "Activity results" "block"
+    And I should see "Student 3" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+
+  Scenario: Try to configure the block on the course page to show multiple high scores using ID numbers
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 3 |
+      | id_config_showworst | 0 |
+      | id_config_nameformat | Display only ID numbers |
+    And I press "Save changes"
+    Then I should see "User S1" in the "Activity results" "block"
+    And I should see "Excellent!" in the "Activity results" "block"
+    And I should see "User S2" in the "Activity results" "block"
+    And I should see "Very good" in the "Activity results" "block"
+    And I should see "User S3" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+
+  Scenario: Try to configure the block on the course page to show multiple high scores using anonymous names
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 3 |
+      | id_config_showworst | 0 |
+      | id_config_nameformat | Anonymous results |
+    And I press "Save changes"
+    Then I should see "User" in the "Activity results" "block"
+    And I should not see "Student 1" in the "Activity results" "block"
+    And I should see "Excellent!" in the "Activity results" "block"
+    And I should not see "Student 2" in the "Activity results" "block"
+    And I should see "Very good" in the "Activity results" "block"
+    And I should not see "Student 3" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
diff --git a/blocks/activity_results/tests/behat/highscoreswithscalesandgroups.feature b/blocks/activity_results/tests/behat/highscoreswithscalesandgroups.feature
new file mode 100644 (file)
index 0000000..7856da5
--- /dev/null
@@ -0,0 +1,153 @@
+@block @block_activity_results
+Feature: The activity results block displays student scores as scales
+  In order to be display student scores as scales
+  As a user
+  I need to see the activity results block
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email | idnumber |
+      | teacher1 | Teacher | 1 | teacher1@example.com | T1 |
+      | student1 | Student | 1 | student1@example.com | S1 |
+      | student2 | Student | 2 | student2@example.com | S2 |
+      | student3 | Student | 3 | student3@example.com | S3 |
+      | student4 | Student | 4 | student4@example.com | S4 |
+      | student5 | Student | 5 | student5@example.com | S5 |
+      | student6 | Student | 6 | student6@example.com | S6 |
+    And the following "courses" exist:
+      | fullname | shortname | category |
+      | Course 1 | C1 | 0 |
+    And the following "groups" exist:
+      | name | course | idnumber |
+      | Group 1 | C1 | G1 |
+      | Group 2 | C1 | G2 |
+      | Group 3 | C1 | G3 |
+      | Group 4 | C1 | G4 |
+      | Group 5 | C1 | G5 |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+      | student1 | C1 | student |
+      | student2 | C1 | student |
+      | student3 | C1 | student |
+      | student4 | C1 | student |
+      | student5 | C1 | student |
+      | student6 | C1 | student |
+    And the following "group members" exist:
+      | user     | group   |
+      | student1 | G1 |
+      | student2 | G1 |
+      | student3 | G2 |
+      | student4 | G2 |
+      | student5 | G3 |
+      | student6 | G3 |
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I navigate to "Grades" node in "Course administration"
+    And I navigate to "Scales" node in "Grade administration"
+    And I press "Add a new scale"
+    And I set the following fields to these values:
+      | Name | My Scale |
+      | Scale | Disappointing, Not good enough, Average, Good, Very good, Excellent! |
+    And I press "Save changes"
+    And I follow "Course 1"
+    And I turn editing mode on
+    And I add a "Assignment" to section "1" and I fill the form with:
+      | Assignment name | Test assignment |
+      | Description | Offline text |
+      | assignsubmission_file_enabled | 0 |
+      | id_modgrade_type | Scale |
+      | id_modgrade_scale | My Scale |
+      | Group mode | Separate groups |
+    And I follow "Course 1"
+    And I navigate to "Grades" node in "Course administration"
+    And I turn editing mode on
+    And I give the grade "Excellent!" to the user "Student 1" for the grade item "Test assignment"
+    And I give the grade "Very good" to the user "Student 2" for the grade item "Test assignment"
+    And I give the grade "Very good" to the user "Student 3" for the grade item "Test assignment"
+    And I give the grade "Good" to the user "Student 4" for the grade item "Test assignment"
+    And I give the grade "Good" to the user "Student 5" for the grade item "Test assignment"
+    And I give the grade "Average" to the user "Student 6" for the grade item "Test assignment"
+    And I press "Save changes"
+    And I follow "Course 1"
+
+  Scenario: Try to configure the block on the course page to show 1 high score
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 1 |
+      | id_config_showworst | 0 |
+      | id_config_nameformat | Display full names |
+      | id_config_usegroups | Yes |
+    And I press "Save changes"
+    Then I should see "Group 1" in the "Activity results" "block"
+    And I should see "Excellent!" in the "Activity results" "block"
+    And I log out
+    And I log in as "student1"
+    And I follow "Course 1"
+    And I should see "Student 1" in the "Activity results" "block"
+    And I should see "Excellent!" in the "Activity results" "block"
+
+  Scenario: Try to configure the block on the course page to show multiple high scores using full names
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 3 |
+      | id_config_showworst | 0 |
+      | id_config_nameformat | Display full names |
+      | id_config_usegroups | Yes |
+    And I press "Save changes"
+    Then I should see "Group 1" in the "Activity results" "block"
+    And I should see "Excellent!" in the "Activity results" "block"
+    And I should see "Group 2" in the "Activity results" "block"
+    And I should see "Very good" in the "Activity results" "block"
+    And I should see "Group 3" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+    And I log out
+    And I log in as "student3"
+    And I follow "Course 1"
+    And I should see "Student 3" in the "Activity results" "block"
+    And I should see "Very good" in the "Activity results" "block"
+    And I should see "Student 4" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+
+  Scenario: Try to configure the block on the course page to show multiple high scores using ID numbers
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 3 |
+      | id_config_showworst | 0 |
+      | id_config_nameformat | Display only ID numbers |
+      | id_config_usegroups | Yes |
+    And I press "Save changes"
+    Then I should see "Group" in the "Activity results" "block"
+    And I should see "Excellent!" in the "Activity results" "block"
+    And I should see "Very good" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+    And I log out
+    And I log in as "student1"
+    And I follow "Course 1"
+    And I should see "User S1" in the "Activity results" "block"
+    And I should see "Excellent!" in the "Activity results" "block"
+    And I should see "User S2" in the "Activity results" "block"
+    And I should see "Very good" in the "Activity results" "block"
+
+  Scenario: Try to configure the block on the course page to show multiple high scores using anonymous names
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 3 |
+      | id_config_showworst | 0 |
+      | id_config_nameformat | Anonymous results |
+      | id_config_usegroups | Yes |
+    And I press "Save changes"
+    Then I should see "Group" in the "Activity results" "block"
+    And I should see "Excellent!" in the "Activity results" "block"
+    And I should see "Very good" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+    And I log out
+    And I log in as "student1"
+    And I follow "Course 1"
+    And I should see "User" in the "Activity results" "block"
+    And I should see "Excellent!" in the "Activity results" "block"
+    And I should see "Very good" in the "Activity results" "block"
index 3939bd6..27807f8 100644 (file)
@@ -33,19 +33,15 @@ Feature: The activity results block displays student scores
       | student4 | C1 | student |
       | student5 | C1 | student |
       | student6 | C1 | student |
-
-  @javascript
-  Scenario: Configure the block on the course page to show 1 high score
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
+    And the following "group members" exist:
+      | user     | group   |
+      | student1 | G1 |
+      | student2 | G1 |
+      | student3 | G2 |
+      | student4 | G2 |
+      | student5 | G3 |
+      | student6 | G3 |
+    And I log in as "teacher1"
     And I follow "Course 1"
     And I turn editing mode on
     And I add a "Assignment" to section "1" and I fill the form with:
@@ -64,7 +60,9 @@ Feature: The activity results block displays student scores
     And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
     And I press "Save changes"
     And I follow "Course 1"
-    And I add the "Activity results" block
+
+  Scenario: Configure the block on the course page to show 1 high score
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 1 |
@@ -77,37 +75,8 @@ Feature: The activity results block displays student scores
     Then I should see "Group 1" in the "Activity results" "block"
     And I should see "95%" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show 1 high score as a fraction
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Separate groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 1 |
@@ -124,37 +93,8 @@ Feature: The activity results block displays student scores
     And I should see "Student 1" in the "Activity results" "block"
     And I should see "100.00/100.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show 1 high score as a absolute numbers
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Separate groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 1 |
@@ -171,37 +111,8 @@ Feature: The activity results block displays student scores
     And I should see "Student 1" in the "Activity results" "block"
     And I should see "100.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple high scores as percentages
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Separate groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 3 |
@@ -225,37 +136,8 @@ Feature: The activity results block displays student scores
     And I should see "Student 2" in the "Activity results" "block"
     And I should see "90%" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple high scores as fractions
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Separate groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 3 |
@@ -278,37 +160,8 @@ Feature: The activity results block displays student scores
     And I should see "Student 4" in the "Activity results" "block"
     And I should see "80.00/100.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple high scores as absolute numbers
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Separate groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 3 |
@@ -331,37 +184,8 @@ Feature: The activity results block displays student scores
     And I should see "Student 2" in the "Activity results" "block"
     And I should see "90.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple high scores using ID numbers
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Separate groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 3 |
@@ -382,37 +206,8 @@ Feature: The activity results block displays student scores
     And I should see "User S2" in the "Activity results" "block"
     And I should see "90.00%" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple high scores using anonymous names
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Separate groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 3 |
index 845e8ab..f5fd1bd 100644 (file)
@@ -33,19 +33,15 @@ Feature: The activity results block displays student scores
       | student4 | C1 | student |
       | student5 | C1 | student |
       | student6 | C1 | student |
-
-  @javascript
-  Scenario: Configure the block on the course page to show 1 high score
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
+    And the following "group members" exist:
+      | user     | group   |
+      | student1 | G1 |
+      | student2 | G1 |
+      | student3 | G2 |
+      | student4 | G2 |
+      | student5 | G3 |
+      | student6 | G3 |
+    And I log in as "teacher1"
     And I follow "Course 1"
     And I turn editing mode on
     And I add a "Assignment" to section "1" and I fill the form with:
@@ -64,7 +60,9 @@ Feature: The activity results block displays student scores
     And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
     And I press "Save changes"
     And I follow "Course 1"
-    And I add the "Activity results" block
+
+  Scenario: Configure the block on the course page to show 1 high score
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 1 |
@@ -77,37 +75,8 @@ Feature: The activity results block displays student scores
     Then I should see "Group 1" in the "Activity results" "block"
     And I should see "95%" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show 1 high score as a fraction
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Visible groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 1 |
@@ -122,37 +91,8 @@ Feature: The activity results block displays student scores
     And I should see "Group 1" in the "Activity results" "block"
     And I should see "95.00/100.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show 1 high score as a absolute numbers
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Visible groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 1 |
@@ -167,37 +107,8 @@ Feature: The activity results block displays student scores
     And I should see "Group 1" in the "Activity results" "block"
     And I should see "95.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple high scores as percentages
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Visible groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 3 |
@@ -217,37 +128,8 @@ Feature: The activity results block displays student scores
     And I should see "Group 3" in the "Activity results" "block"
     And I should see "75%" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple high scores as fractions
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Visible groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 3 |
@@ -266,37 +148,8 @@ Feature: The activity results block displays student scores
     And I should see "Group 3" in the "Activity results" "block"
     And I should see "75.00/100.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple high scores as absolute numbers
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Visible groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 3 |
@@ -315,37 +168,8 @@ Feature: The activity results block displays student scores
     And I should see "Group 3" in the "Activity results" "block"
     And I should see "75.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple high scores using ID numbers
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Visible groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 3 |
@@ -362,37 +186,8 @@ Feature: The activity results block displays student scores
     And I should see "85.00%" in the "Activity results" "block"
     And I should see "75.00%" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple high scores using anonymous names
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Visible groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 3 |
diff --git a/blocks/activity_results/tests/behat/lowscoreswithscales.feature b/blocks/activity_results/tests/behat/lowscoreswithscales.feature
new file mode 100644 (file)
index 0000000..149e0f6
--- /dev/null
@@ -0,0 +1,112 @@
+@block @block_activity_results
+Feature: The activity results block displays student scores as scales
+  In order to be display student scores as scales
+  As a user
+  I need to see the activity results block
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email | idnumber |
+      | teacher1 | Teacher | 1 | teacher1@example.com | T1 |
+      | student1 | Student | 1 | student1@example.com | S1 |
+      | student2 | Student | 2 | student2@example.com | S2 |
+      | student3 | Student | 3 | student3@example.com | S3 |
+      | student4 | Student | 4 | student4@example.com | S4 |
+      | student5 | Student | 5 | student5@example.com | S5 |
+    And the following "courses" exist:
+      | fullname | shortname | category |
+      | Course 1 | C1 | 0 |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+      | student1 | C1 | student |
+      | student2 | C1 | student |
+      | student3 | C1 | student |
+      | student4 | C1 | student |
+      | student5 | C1 | student |
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I navigate to "Grades" node in "Course administration"
+    And I navigate to "Scales" node in "Grade administration"
+    And I press "Add a new scale"
+    And I set the following fields to these values:
+      | Name | My Scale |
+      | Scale | Disappointing, Not good enough, Average, Good, Very good, Excellent! |
+    And I press "Save changes"
+    And I follow "Course 1"
+    And I turn editing mode on
+    And I add a "Assignment" to section "1" and I fill the form with:
+      | Assignment name | Test assignment |
+      | Description | Offline text |
+      | assignsubmission_file_enabled | 0 |
+      | id_modgrade_type | Scale |
+      | id_modgrade_scale | My Scale |
+    And I follow "Course 1"
+    And I navigate to "Grades" node in "Course administration"
+    And I turn editing mode on
+    And I give the grade "Excellent!" to the user "Student 1" for the grade item "Test assignment"
+    And I give the grade "Very good" to the user "Student 2" for the grade item "Test assignment"
+    And I give the grade "Good" to the user "Student 3" for the grade item "Test assignment"
+    And I give the grade "Average" to the user "Student 4" for the grade item "Test assignment"
+    And I give the grade "Not good enough" to the user "Student 5" for the grade item "Test assignment"
+    And I press "Save changes"
+    And I follow "Course 1"
+
+  Scenario: Configure the block on the course page to show 1 low score
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 0 |
+      | id_config_showworst | 1 |
+      | id_config_gradeformat | Percentages |
+      | id_config_nameformat | Display full names |
+      | id_config_decimalpoints | 0 |
+    And I press "Save changes"
+    Then I should see "Student 5" in the "Activity results" "block"
+    And I should see "Not good enough" in the "Activity results" "block"
+
+  Scenario: Try to configure the block on the course page to show multiple low scores using full names
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 0 |
+      | id_config_showworst | 3 |
+      | id_config_nameformat | Display full names |
+    And I press "Save changes"
+    Then I should see "Student 5" in the "Activity results" "block"
+    And I should see "Not good enough" in the "Activity results" "block"
+    And I should see "Student 4" in the "Activity results" "block"
+    And I should see "Average" in the "Activity results" "block"
+    And I should see "Student 3" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+
+  Scenario: Try to configure the block on the course page to show multiple low scores using ID numbers
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 0 |
+      | id_config_showworst | 3 |
+      | id_config_nameformat | Display only ID numbers |
+    And I press "Save changes"
+    Then I should see "User S5" in the "Activity results" "block"
+    And I should see "Not good enough" in the "Activity results" "block"
+    And I should see "User S4" in the "Activity results" "block"
+    And I should see "Average" in the "Activity results" "block"
+    And I should see "User S3" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+
+  Scenario: Try to configure the block on the course page to show multiple low scores using anonymous names
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 0 |
+      | id_config_showworst | 3 |
+      | id_config_nameformat | Anonymous results |
+    And I press "Save changes"
+    Then I should see "User" in the "Activity results" "block"
+    And I should not see "Student 5" in the "Activity results" "block"
+    And I should see "Not good enough" in the "Activity results" "block"
+    And I should not see "Student 4" in the "Activity results" "block"
+    And I should see "Average" in the "Activity results" "block"
+    And I should not see "Student 3" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
diff --git a/blocks/activity_results/tests/behat/lowscoreswithscalesandgroups.feature b/blocks/activity_results/tests/behat/lowscoreswithscalesandgroups.feature
new file mode 100644 (file)
index 0000000..9134339
--- /dev/null
@@ -0,0 +1,150 @@
+@block @block_activity_results
+Feature: The activity results block displays student scores as scales
+  In order to be display student scores as scales
+  As a user
+  I need to see the activity results block
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email | idnumber |
+      | teacher1 | Teacher | 1 | teacher1@example.com | T1 |
+      | student1 | Student | 1 | student1@example.com | S1 |
+      | student2 | Student | 2 | student2@example.com | S2 |
+      | student3 | Student | 3 | student3@example.com | S3 |
+      | student4 | Student | 4 | student4@example.com | S4 |
+      | student5 | Student | 5 | student5@example.com | S5 |
+      | student6 | Student | 6 | student6@example.com | S6 |
+    And the following "courses" exist:
+      | fullname | shortname | category |
+      | Course 1 | C1 | 0 |
+    And the following "groups" exist:
+      | name | course | idnumber |
+      | Group 1 | C1 | G1 |
+      | Group 2 | C1 | G2 |
+      | Group 3 | C1 | G3 |
+      | Group 4 | C1 | G4 |
+      | Group 5 | C1 | G5 |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+      | student1 | C1 | student |
+      | student2 | C1 | student |
+      | student3 | C1 | student |
+      | student4 | C1 | student |
+      | student5 | C1 | student |
+      | student6 | C1 | student |
+    And the following "group members" exist:
+      | user     | group   |
+      | student1 | G1 |
+      | student2 | G1 |
+      | student3 | G2 |
+      | student4 | G2 |
+      | student5 | G3 |
+      | student6 | G3 |
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I navigate to "Grades" node in "Course administration"
+    And I navigate to "Scales" node in "Grade administration"
+    And I press "Add a new scale"
+    And I set the following fields to these values:
+      | Name | My Scale |
+      | Scale | Disappointing, Not good enough, Average, Good, Very good, Excellent! |
+    And I press "Save changes"
+    And I follow "Course 1"
+    And I turn editing mode on
+    And I add a "Assignment" to section "1" and I fill the form with:
+      | Assignment name | Test assignment |
+      | Description | Offline text |
+      | assignsubmission_file_enabled | 0 |
+      | id_modgrade_type | Scale |
+      | id_modgrade_scale | My Scale |
+      | Group mode | Separate groups |
+    And I follow "Course 1"
+    And I navigate to "Grades" node in "Course administration"
+    And I turn editing mode on
+    And I give the grade "Excellent!" to the user "Student 1" for the grade item "Test assignment"
+    And I give the grade "Very good" to the user "Student 2" for the grade item "Test assignment"
+    And I give the grade "Very good" to the user "Student 3" for the grade item "Test assignment"
+    And I give the grade "Good" to the user "Student 4" for the grade item "Test assignment"
+    And I give the grade "Good" to the user "Student 5" for the grade item "Test assignment"
+    And I give the grade "Average" to the user "Student 6" for the grade item "Test assignment"
+    And I press "Save changes"
+    And I follow "Course 1"
+
+  Scenario: Try to configure the block on the course page to show 1 low score
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 0 |
+      | id_config_showworst | 1 |
+      | id_config_nameformat | Display full names |
+      | id_config_usegroups | Yes |
+    And I press "Save changes"
+    Then I should see "Group 3" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+    And I log out
+    And I log in as "student5"
+    And I follow "Course 1"
+    And I should see "Student 6" in the "Activity results" "block"
+    And I should see "Average" in the "Activity results" "block"
+
+  Scenario: Try to configure the block on the course page to show multiple high scores using full names
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 0 |
+      | id_config_showworst | 2 |
+      | id_config_nameformat | Display full names |
+      | id_config_usegroups | Yes |
+    And I press "Save changes"
+    Then I should see "Group 2" in the "Activity results" "block"
+    And I should see "Very good" in the "Activity results" "block"
+    And I should see "Group 3" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+    And I log out
+    And I log in as "student3"
+    And I follow "Course 1"
+    And I should see "Student 3" in the "Activity results" "block"
+    And I should see "Very good" in the "Activity results" "block"
+    And I should see "Student 4" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+
+  Scenario: Try to configure the block on the course page to show multiple high scores using ID numbers
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 0 |
+      | id_config_showworst | 2 |
+      | id_config_nameformat | Display only ID numbers |
+      | id_config_usegroups | Yes |
+    And I press "Save changes"
+    Then I should see "Group" in the "Activity results" "block"
+    And I should see "Very good" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+    And I log out
+    And I log in as "student5"
+    And I follow "Course 1"
+    And I should see "User S5" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+    And I should see "User S6" in the "Activity results" "block"
+    And I should see "Average" in the "Activity results" "block"
+
+  Scenario: Try to configure the block on the course page to show multiple high scores using anonymous names
+    Given I add the "Activity results" block
+    When I configure the "Activity results" block
+    And I set the following fields to these values:
+      | id_config_showbest | 0 |
+      | id_config_showworst | 2 |
+      | id_config_nameformat | Anonymous results |
+      | id_config_usegroups | Yes |
+    And I press "Save changes"
+    Then I should see "Group" in the "Activity results" "block"
+    And I should see "Very good" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+    And I log out
+    And I log in as "student5"
+    And I follow "Course 1"
+    And I should see "User" in the "Activity results" "block"
+    And I should see "Good" in the "Activity results" "block"
+    And I should see "Average" in the "Activity results" "block"
+
index f18ccf8..b5e0546 100644 (file)
@@ -33,19 +33,15 @@ Feature: The activity results block displays student scores
       | student4 | C1 | student |
       | student5 | C1 | student |
       | student6 | C1 | student |
-
-  @javascript
-  Scenario: Configure the block on the course page to show 1 low score
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
+    And the following "group members" exist:
+      | user     | group   |
+      | student1 | G1 |
+      | student2 | G1 |
+      | student3 | G2 |
+      | student4 | G2 |
+      | student5 | G3 |
+      | student6 | G3 |
+    And I log in as "teacher1"
     And I follow "Course 1"
     And I turn editing mode on
     And I add a "Assignment" to section "1" and I fill the form with:
@@ -64,7 +60,9 @@ Feature: The activity results block displays student scores
     And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
     And I press "Save changes"
     And I follow "Course 1"
-    And I add the "Activity results" block
+
+  Scenario: Configure the block on the course page to show 1 low score
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
@@ -77,37 +75,8 @@ Feature: The activity results block displays student scores
     Then I should see "Group 3" in the "Activity results" "block"
     And I should see "75%" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show 1 low score as a fraction
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Separate groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
@@ -124,37 +93,8 @@ Feature: The activity results block displays student scores
     And I should see "Student 6" in the "Activity results" "block"
     And I should see "70.00/100.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show 1 low score as a absolute numbers
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Separate groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
@@ -171,37 +111,8 @@ Feature: The activity results block displays student scores
     And I should see "Student 6" in the "Activity results" "block"
     And I should see "70.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple low scores as percentages
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Separate groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
@@ -223,37 +134,8 @@ Feature: The activity results block displays student scores
     And I should see "Student 5" in the "Activity results" "block"
     And I should see "80%" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple low scores as fractions
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Separate groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
@@ -274,37 +156,8 @@ Feature: The activity results block displays student scores
     And I should see "Student 4" in the "Activity results" "block"
     And I should see "80.00/100.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple low scores as absolute numbers
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Separate groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
@@ -325,37 +178,8 @@ Feature: The activity results block displays student scores
     And I should see "Student 6" in the "Activity results" "block"
     And I should see "70.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple low scores using ID numbers
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Separate groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
@@ -375,37 +199,8 @@ Feature: The activity results block displays student scores
     And I should see "User S2" in the "Activity results" "block"
     And I should see "90.00%" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple low scores using anonymous names
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Separate groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
index e02d58d..7049958 100644 (file)
@@ -33,19 +33,15 @@ Feature: The activity results block displays student scores
       | student4 | C1 | student |
       | student5 | C1 | student |
       | student6 | C1 | student |
-
-  @javascript
-  Scenario: Configure the block on the course page to show 1 low score
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
+    And the following "group members" exist:
+      | user     | group   |
+      | student1 | G1 |
+      | student2 | G1 |
+      | student3 | G2 |
+      | student4 | G2 |
+      | student5 | G3 |
+      | student6 | G3 |
+    And I log in as "teacher1"
     And I follow "Course 1"
     And I turn editing mode on
     And I add a "Assignment" to section "1" and I fill the form with:
@@ -64,7 +60,9 @@ Feature: The activity results block displays student scores
     And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
     And I press "Save changes"
     And I follow "Course 1"
-    And I add the "Activity results" block
+
+  Scenario: Configure the block on the course page to show 1 low score
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
@@ -77,37 +75,8 @@ Feature: The activity results block displays student scores
     Then I should see "Group 3" in the "Activity results" "block"
     And I should see "75%" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show 1 low score as a fraction
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Visible groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
@@ -122,37 +91,8 @@ Feature: The activity results block displays student scores
     And I should see "Group 3" in the "Activity results" "block"
     And I should see "75.00/100.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show 1 low score as a absolute numbers
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Visible groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
@@ -167,37 +107,8 @@ Feature: The activity results block displays student scores
     And I should see "Group 3" in the "Activity results" "block"
     And I should see "75.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple low scores as percentages
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Visible groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
@@ -219,37 +130,8 @@ Feature: The activity results block displays student scores
     And I should see "Group 3" in the "Activity results" "block"
     And I should see "75%" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple low scores as fractions
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Visible groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
@@ -266,37 +148,8 @@ Feature: The activity results block displays student scores
     And I should see "Group 3" in the "Activity results" "block"
     And I should see "75.00/100.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple low scores as absolute numbers
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Visible groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
@@ -313,37 +166,8 @@ Feature: The activity results block displays student scores
     And I should see "Group 3" in the "Activity results" "block"
     And I should see "75.00" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple low scores using ID numbers
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Visible groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
@@ -359,37 +183,8 @@ Feature: The activity results block displays student scores
     And I should see "85.00%" in the "Activity results" "block"
     And I should see "75.00%" in the "Activity results" "block"
 
-  @javascript
   Scenario: Try to configure the block on the course page to show multiple low scores using anonymous names
-    Given I log in as "teacher1"
-    And I follow "Course 1"
-    And I expand "Users" node
-    And I follow "Groups"
-    And I add "Student 1 (student1@example.com)" user to "Group 1" group members
-    And I add "Student 2 (student2@example.com)" user to "Group 1" group members
-    And I add "Student 3 (student3@example.com)" user to "Group 2" group members
-    And I add "Student 4 (student4@example.com)" user to "Group 2" group members
-    And I add "Student 5 (student5@example.com)" user to "Group 3" group members
-    And I add "Student 6 (student6@example.com)" user to "Group 3" group members
-    And I follow "Course 1"
-    And I turn editing mode on
-    And I add a "Assignment" to section "1" and I fill the form with:
-      | Assignment name | Test assignment |
-      | Description | Offline text |
-      | assignsubmission_file_enabled | 0 |
-      | Group mode | Visible groups |
-    And I follow "Course 1"
-    And I navigate to "Grades" node in "Course administration"
-    And I turn editing mode on
-    And I give the grade "100.00" to the user "Student 1" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 2" for the grade item "Test assignment"
-    And I give the grade "90.00" to the user "Student 3" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 4" for the grade item "Test assignment"
-    And I give the grade "80.00" to the user "Student 5" for the grade item "Test assignment"
-    And I give the grade "70.00" to the user "Student 6" for the grade item "Test assignment"
-    And I press "Save changes"
-    And I follow "Course 1"
-    And I add the "Activity results" block
+    Given I add the "Activity results" block
     When I configure the "Activity results" block
     And I set the following fields to these values:
       | id_config_showbest | 0 |
diff --git a/blocks/blog_menu/tests/behat/block_blog_menu.feature b/blocks/blog_menu/tests/behat/block_blog_menu.feature
new file mode 100644 (file)
index 0000000..b93728f
--- /dev/null
@@ -0,0 +1,81 @@
+@block @block_blog_menu
+Feature: Enable Block blog menu in a course
+  In order to enable the blog menu in a course
+  As a teacher
+  I can add blog menu block to a course
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email | idnumber |
+      | teacher1 | Teacher | 1 | teacher1@example.com | T1 |
+    And the following "courses" exist:
+      | fullname | shortname | category |
+      | Course 1 | C1 | 0 |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+
+  Scenario: Add the block to a the course when blogs are disabled
+    Given I log in as "admin"
+    And the following config values are set as admin:
+      | enableblogs | 0 |
+    And I log out
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I turn editing mode on
+    When I add the "Blog menu" block
+    Then I should see "Blogging is disabled!" in the "Blog menu" "block"
+
+  Scenario: Add the block to a the course when blog associations are disabled
+    Given I log in as "admin"
+    And the following config values are set as admin:
+      | useblogassociations | 0 |
+    And I log out
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I turn editing mode on
+    When I add the "Blog menu" block
+    Then I should see "Blog entries" in the "Blog menu" "block"
+    And I should see "Add a new entry" in the "Blog menu" "block"
+    And I should not see "View all entries for this course" in the "Blog menu" "block"
+    And I should not see "View my entries about this course" in the "Blog menu" "block"
+    And I should not see "Add an entry about this course" in the "Blog menu" "block"
+
+  Scenario: Add the block to a the course when blog associations are enabled
+    Given I log in as "admin"
+    And the following config values are set as admin:
+      | useblogassociations | 1 |
+    And I log out
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I turn editing mode on
+    When I add the "Blog menu" block
+    Then I should see "Blog entries" in the "Blog menu" "block"
+    And I should see "Add a new entry" in the "Blog menu" "block"
+    And I should see "View all entries for this course" in the "Blog menu" "block"
+    And I should see "View my entries about this course" in the "Blog menu" "block"
+    And I should see "Add an entry about this course" in the "Blog menu" "block"
+
+  Scenario: Add the block to a the course when RSS is disabled
+    Given I log in as "admin"
+    And the following config values are set as admin:
+      | enablerssfeeds | 0 |
+    And I log out
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I turn editing mode on
+    When I add the "Blog menu" block
+    Then I should not see "Blog RSS feed" in the "Blog menu" "block"
+    And I should see "Add a new entry" in the "Blog menu" "block"
+
+  Scenario: Add the block to a the course when RSS is enabled
+    Given I log in as "admin"
+    And the following config values are set as admin:
+      | enablerssfeeds | 1 |
+    And I log out
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I turn editing mode on
+    When I add the "Blog menu" block
+    Then I should see "Blog RSS feed" in the "Blog menu" "block"
+    And I should see "Add a new entry" in the "Blog menu" "block"
diff --git a/blocks/blog_menu/tests/behat/block_blog_menu_course.feature b/blocks/blog_menu/tests/behat/block_blog_menu_course.feature
new file mode 100644 (file)
index 0000000..f45f62f
--- /dev/null
@@ -0,0 +1,199 @@
+@block @block_blog_menu
+Feature: Enable Block blog menu in a course
+  In order to enable the blog menu in a course
+  As a teacher
+  I can add blog menu block to a course
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email | idnumber |
+      | teacher1 | Teacher | 1 | teacher1@example.com | T1 |
+      | student1 | Student | 1 | student1@example.com | S1 |
+      | student2 | Student | 2 | student2@example.com | S2 |
+    And the following "courses" exist:
+      | fullname | shortname | category |
+      | Course 1 | C1 | 0 |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+      | student1 | C1 | student |
+      | student2 | C1 | student |
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I turn editing mode on
+    And I add the "Blog menu" block
+    And I log out
+
+  Scenario: Students use the blog menu block to post blogs
+    Given I log in as "student1"
+    And I follow "Course 1"
+    And I follow "Add a new entry"
+    When I set the following fields to these values:
+      | Entry title | S1 First Blog |
+      | Blog entry body | This is my awesome blog! |
+    And I press "Save changes"
+    Then I should see "S1 First Blog"
+    And I should see "This is my awesome blog!"
+    And I follow "Dashboard"
+    And I follow "Course 1"
+    And I follow "Blog entries"
+    And I should see "S1 First Blog"
+    And I should see "This is my awesome blog!"
+
+  Scenario: Students use the blog menu block to view their blogs about the course
+    Given I log in as "student1"
+    And I follow "Course 1"
+    And I follow "Add an entry about this course"
+    And I set the following fields to these values:
+      | Entry title | S1 First Blog |
+      | Blog entry body | This is my awesome blog about this course! |
+    And I press "Save changes"
+    And I should see "S1 First Blog"
+    And I should see "This is my awesome blog about this course!"
+    And I should see "Associated Course: C1"
+    And I log out
+    And I log in as "student2"
+    And I follow "Course 1"
+    And I follow "Add a new entry"
+    And I set the following fields to these values:
+      | Entry title | S2 Second Blog |
+      | Blog entry body | My unrelated blog! |
+    And I press "Save changes"
+    And I should see "S2 Second Blog"
+    And I should see "My unrelated blog!"
+    And I should not see "Associated Course: C1"
+    And I follow "Dashboard"
+    And I follow "Course 1"
+    And I follow "Add an entry about this course"
+    And I set the following fields to these values:
+      | Entry title | S2 First Blog |
+      | Blog entry body | My course blog is better! |
+    And I press "Save changes"
+    And I should see "S2 First Blog"
+    And I should see "My course blog is better!"
+    And I should see "Associated Course: C1"
+    And I follow "Dashboard"
+    And I follow "Course 1"
+    When I follow "View my entries about this course"
+    Then I should see "S2 First Blog"
+    And I should not see "S2 Second Blog"
+    And I should not see "S1 First Blog"
+
+  Scenario: Students use the blog menu block to view all blogs about the course
+    Given I log in as "student1"
+    And I follow "Course 1"
+    And I follow "Add an entry about this course"
+    And I set the following fields to these values:
+      | Entry title | S1 First Blog |
+      | Blog entry body | This is my awesome blog about this course! |
+    And I press "Save changes"
+    And I should see "S1 First Blog"
+    And I should see "This is my awesome blog about this course!"
+    And I should see "Associated Course: C1"
+    And I log out
+    And I log in as "student2"
+    And I follow "Course 1"
+    And I follow "Add a new entry"
+    And I set the following fields to these values:
+      | Entry title | S2 Second Blog |
+      | Blog entry body | My unrelated blog! |
+    And I press "Save changes"
+    And I should see "S2 Second Blog"
+    And I should see "My unrelated blog!"
+    And I should not see "Associated Course: C1"
+    And I follow "Dashboard"
+    And I follow "Course 1"
+    And I follow "Add an entry about this course"
+    And I set the following fields to these values:
+      | Entry title | S2 First Blog |
+      | Blog entry body | My course blog is better! |
+    And I press "Save changes"
+    And I should see "S2 First Blog"
+    And I should see "My course blog is better!"
+    And I should see "Associated Course: C1"
+    And I follow "Dashboard"
+    And I follow "Course 1"
+    When I follow "View all entries for this course"
+    Then I should see "S1 First Blog"
+    And I should see "S2 First Blog"
+    And I should not see "S2 Second Blog"
+
+  Scenario: Students use the blog menu block to view all their blog entries
+    Given I log in as "student1"
+    And I follow "Course 1"
+    And I follow "Add an entry about this course"
+    And I set the following fields to these values:
+      | Entry title | S1 First Blog |
+      | Blog entry body | This is my awesome blog about this course! |
+    And I press "Save changes"
+    And I should see "S1 First Blog"
+    And I should see "This is my awesome blog about this course!"
+    And I should see "Associated Course: C1"
+    And I log out
+    And I log in as "student2"
+    And I follow "Course 1"
+    And I follow "Add a new entry"
+    And I set the following fields to these values:
+      | Entry title | S2 Second Blog |
+      | Blog entry body | My unrelated blog! |
+    And I press "Save changes"
+    And I should see "S2 Second Blog"
+    And I should see "My unrelated blog!"
+    And I should not see "Associated Course: C1"
+    And I follow "Dashboard"
+    And I follow "Course 1"
+    And I follow "Add an entry about this course"
+    And I set the following fields to these values:
+      | Entry title | S2 First Blog |
+      | Blog entry body | My course blog is better! |
+    And I press "Save changes"
+    And I should see "S2 First Blog"
+    And I should see "My course blog is better!"
+    And I should see "Associated Course: C1"
+    And I follow "Dashboard"
+    And I follow "Course 1"
+    When I follow "Blog entries"
+    Then I should see "S2 First Blog"
+    And I should see "S2 Second Blog"
+    And I should not see "S1 First Blog"
+
+  Scenario: Teacher searches for student blogs
+    Given I log in as "student1"
+    And I follow "Course 1"
+    And I follow "Add an entry about this course"
+    And I set the following fields to these values:
+      | Entry title | S1 First Blog |
+      | Blog entry body | This is my awesome blog about this course! |
+    And I press "Save changes"
+    And I should see "S1 First Blog"
+    And I should see "This is my awesome blog about this course!"
+    And I should see "Associated Course: C1"
+    And I log out
+    And I log in as "student2"
+    And I follow "Course 1"
+    And I follow "Add a new entry"
+    And I set the following fields to these values:
+      | Entry title | S2 Second Blog |
+      | Blog entry body | My unrelated blog! |
+    And I press "Save changes"
+    And I should see "S2 Second Blog"
+    And I should see "My unrelated blog!"
+    And I should not see "Associated Course: C1"
+    And I follow "Dashboard"
+    And I follow "Course 1"
+    And I follow "Add an entry about this course"
+    And I set the following fields to these values:
+      | Entry title | S2 First Blog |
+      | Blog entry body | My course blog is better! |
+    And I press "Save changes"
+    And I should see "S2 First Blog"
+    And I should see "My course blog is better!"
+    And I should see "Associated Course: C1"
+    And I log out
+    When I log in as "teacher1"
+    And I follow "Course 1"
+    And I set the field "blogsearchquery" to "First"
+    And I press "Search"
+    Then I should see "S1 First Blog"
+    And I should see "S2 First Blog"
+    And I should not see "S2 Second Blog"
diff --git a/blocks/blog_menu/tests/behat/block_blog_menu_frontpage.feature b/blocks/blog_menu/tests/behat/block_blog_menu_frontpage.feature
new file mode 100644 (file)
index 0000000..3c2936a
--- /dev/null
@@ -0,0 +1,30 @@
+@block @block_blog_menu
+Feature: Enable Block blog menu on the frontpage
+  In order to enable the blog menu on the frontpage
+  As an admin
+  I can add blog menu block to the frontpage
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email | idnumber |
+      | student1 | Student | 1 | student1@example.com | S1 |
+    And I log in as "admin"
+    And I am on site homepage
+    And I navigate to "Turn editing on" node in "Front page settings"
+    And I add the "Blog menu" block
+    And I log out
+
+  Scenario: Students use the blog menu block to post blogs
+    Given I log in as "student1"
+    And I am on site homepage
+    And I follow "Add a new entry"
+    When I set the following fields to these values:
+      | Entry title | S1 First Blog |
+      | Blog entry body | This is my awesome blog! |
+    And I press "Save changes"
+    Then I should see "S1 First Blog"
+    And I should see "This is my awesome blog!"
+    And I am on site homepage
+    And I follow "Blog entries"
+    And I should see "S1 First Blog"
+    And I should see "This is my awesome blog!"
index 14d4c87..634c511 100644 (file)
@@ -132,8 +132,12 @@ if ($action === 'delete') {
             redirect($returnurl);
         }
     } else if (blog_user_can_edit_entry($entry)) {
-        $optionsyes = array('entryid'=>$id, 'action'=>'delete', 'confirm'=>1, 'sesskey'=>sesskey(), 'courseid'=>$courseid);
-        $optionsno = array('userid'=>$entry->userid, 'courseid'=>$courseid);
+        $optionsyes = array('entryid' => $id,
+                            'action' => 'delete',
+                            'confirm' => 1,
+                            'sesskey' => sesskey(),
+                            'courseid' => $courseid);
+        $optionsno = array('userid' => $entry->userid, 'courseid' => $courseid);
         $PAGE->set_title("$SITE->shortname: $strblogs");
         $PAGE->set_heading($SITE->fullname);
         echo $OUTPUT->header();
@@ -182,9 +186,9 @@ if (!empty($entry->id)) {
 }
 
 require_once('edit_form.php');
-$summaryoptions = array('maxfiles'=> 99, 'maxbytes'=>$CFG->maxbytes, 'trusttext'=>true, 'context'=>$sitecontext,
-    'subdirs'=>file_area_contains_subdirs($sitecontext, 'blog', 'post', $entry->id));
-$attachmentoptions = array('subdirs'=>false, 'maxfiles'=> 99, 'maxbytes'=>$CFG->maxbytes);
+$summaryoptions = array('maxfiles' => 99, 'maxbytes' => $CFG->maxbytes, 'trusttext' => true, 'context' => $sitecontext,
+    'subdirs' => file_area_contains_subdirs($sitecontext, 'blog', 'post', $entry->id));
+$attachmentoptions = array('subdirs' => false, 'maxfiles' => 99, 'maxbytes' => $CFG->maxbytes);
 
 $blogeditform = new blog_edit_form(null, compact('entry',
                                                  'summaryoptions',
index 4b0d408..6595848 100644 (file)
@@ -94,7 +94,7 @@ if (!empty($blogs)) {
         $editurl = new moodle_url('/blog/external_blog_edit.php', array('id' => $blog->id));
         $editicon = $OUTPUT->action_icon($editurl, new pix_icon('t/edit', get_string('editexternalblog', 'blog')));
 
-        $deletelink = new moodle_url('/blog/external_blogs.php', array('delete' => $blog->id, 'sesskey'=>sesskey()));
+        $deletelink = new moodle_url('/blog/external_blogs.php', array('delete' => $blog->id, 'sesskey' => sesskey()));
         $deleteicon = $OUTPUT->action_icon($deletelink, new pix_icon('t/delete', get_string('deleteexternalblog', 'blog')));
 
         $table->data[] = new html_table_row(array($blog->name,
index 56ab7eb..bc3dd1e 100644 (file)
@@ -40,13 +40,13 @@ $search   = optional_param('search', null, PARAM_RAW);
 
 comment::init();
 
-$url_params = compact('id', 'start', 'tag', 'userid', 'tagid', 'modid', 'entryid', 'groupid', 'courseid', 'search');
-foreach ($url_params as $var => $val) {
+$urlparams = compact('id', 'start', 'tag', 'userid', 'tagid', 'modid', 'entryid', 'groupid', 'courseid', 'search');
+foreach ($urlparams as $var => $val) {
     if (empty($val)) {
-        unset($url_params[$var]);
+        unset($urlparams[$var]);
     }
 }
-$PAGE->set_url('/blog/index.php', $url_params);
+$PAGE->set_url('/blog/index.php', $urlparams);
 
 // Correct tagid if a text tag is provided as a param.
 if (!empty($tag)) {
@@ -121,7 +121,7 @@ if (!empty($groupid) && empty($courseid)) {
 
 if (!$userid && has_capability('moodle/blog:view', $sitecontext) && $CFG->bloglevel > BLOG_USER_LEVEL) {
     if ($entryid) {
-        if (!$entryobject = $DB->get_record('post', array('id'=>$entryid))) {
+        if (!$entryobject = $DB->get_record('post', array('id' => $entryid))) {
             print_error('nosuchentry', 'blog');
         }
         $userid = $entryobject->userid;
@@ -148,12 +148,12 @@ if ((empty($courseid) ? true : $courseid == SITEID) && empty($userid)) {
         print_error('cannotviewsiteblog', 'blog');
     }
 
-    $COURSE = $DB->get_record('course', array('format'=>'site'));
+    $COURSE = $DB->get_record('course', array('format' => 'site'));
     $courseid = $COURSE->id;
 }
 
 if (!empty($courseid)) {
-    if (!$course = $DB->get_record('course', array('id'=>$courseid))) {
+    if (!$course = $DB->get_record('course', array('id' => $courseid))) {
         print_error('invalidcourseid');
     }
 
@@ -176,7 +176,7 @@ if (!empty($groupid)) {
         print_error(get_string('invalidgroupid', 'blog'));
     }
 
-    if (!$course = $DB->get_record('course', array('id'=>$group->courseid))) {
+    if (!$course = $DB->get_record('course', array('id' => $group->courseid))) {
         print_error('invalidcourseid');
     }
 
@@ -200,7 +200,7 @@ if (!empty($userid)) {
         print_error('blogdisable', 'blog');
     }
 
-    if (!$user = $DB->get_record('user', array('id'=>$userid))) {
+    if (!$user = $DB->get_record('user', array('id' => $userid))) {
         print_error('invaliduserid');
     }
 
index f99ed31..00a1ffa 100644 (file)
@@ -332,9 +332,9 @@ function blog_get_all_options(moodle_page $page, stdClass $userid = null) {
             $userid = $page->context->instanceid;
         }
         // Check the userid var.
-        if (!is_null($userid) && $userid!==$USER->id) {
+        if (!is_null($userid) && $userid !== $USER->id) {
             // Load the user from the userid... it MUST EXIST throw a wobbly if it doesn't!
-            $user = $DB->get_record('user', array('id'=>$userid), '*', MUST_EXIST);
+            $user = $DB->get_record('user', array('id' => $userid), '*', MUST_EXIST);
         } else {
             $user = null;
         }
@@ -350,7 +350,7 @@ function blog_get_all_options(moodle_page $page, stdClass $userid = null) {
         // Get the options for the user.
         if ($user !== null and !isguestuser($user)) {
             // Load for the requested user.
-            $options[CONTEXT_USER+1] = blog_get_options_for_user($user);
+            $options[CONTEXT_USER + 1] = blog_get_options_for_user($user);
         }
         // Load for the current user.
         if (isloggedin() and !isguestuser()) {
@@ -413,7 +413,7 @@ function blog_get_options_for_user(stdClass $user=null) {
         // Not the current user, but we can view and its blogs are enabled for SITE or GLOBAL.
         $options['userentries'] = array(
             'string' => get_string('viewuserentries', 'blog', fullname($user)),
-            'link' => new moodle_url('/blog/index.php', array('userid'=>$user->id))
+            'link' => new moodle_url('/blog/index.php', array('userid' => $user->id))
         );
     } else {
         // It's the current user.
@@ -421,14 +421,14 @@ function blog_get_options_for_user(stdClass $user=null) {
             // We can view our own blogs .... BIG surprise.
             $options['view'] = array(
                 'string' => get_string('blogentries', 'blog'),
-                'link' => new moodle_url('/blog/index.php', array('userid'=>$USER->id))
+                'link' => new moodle_url('/blog/index.php', array('userid' => $USER->id))
             );
         }
         if (has_capability('moodle/blog:create', $sitecontext)) {
             // We can add to our own blog.
             $options['add'] = array(
                 'string' => get_string('addnewentry', 'blog'),
-                'link' => new moodle_url('/blog/edit.php', array('action'=>'add'))
+                'link' => new moodle_url('/blog/edit.php', array('action' => 'add'))
             );
         }
     }
@@ -560,13 +560,13 @@ function blog_get_options_for_module($module, $user=null) {
             $a->type = $modulename;
             $options['moduleview'] = array(
                 'string' => get_string('viewallmodentries', 'blog', $a),
-                'link' => new moodle_url('/blog/index.php', array('modid'=>$module->id))
+                'link' => new moodle_url('/blog/index.php', array('modid' => $module->id))
             );
         }
         // View MY entries about this module.
         $options['moduleviewmine'] = array(
             'string' => get_string('viewmyentriesaboutmodule', 'blog', $modulename),
-            'link' => new moodle_url('/blog/index.php', array('modid'=>$module->id, 'userid'=>$USER->id))
+            'link' => new moodle_url('/blog/index.php', array('modid' => $module->id, 'userid' => $USER->id))
         );
         if (!empty($user) && ($CFG->bloglevel >= BLOG_SITE_LEVEL)) {
             // View the given users entries about this module.
@@ -575,7 +575,7 @@ function blog_get_options_for_module($module, $user=null) {
             $a->user = fullname($user);
             $options['moduleviewuser'] = array(
                 'string' => get_string('blogentriesbyuseraboutmodule', 'blog', $a),
-                'link' => new moodle_url('/blog/index.php', array('modid'=>$module->id, 'userid'=>$user->id))
+                'link' => new moodle_url('/blog/index.php', array('modid' => $module->id, 'userid' => $user->id))
             );
         }
     }
@@ -584,7 +584,7 @@ function blog_get_options_for_module($module, $user=null) {
         // The user can blog about this module.
         $options['moduleadd'] = array(
             'string' => get_string('blogaboutthismodule', 'blog', $modulename),
-            'link' => new moodle_url('/blog/edit.php', array('action'=>'add', 'modid'=>$module->id))
+            'link' => new moodle_url('/blog/edit.php', array('action' => 'add', 'modid' => $module->id))
         );
     }
     // Cache the options.
@@ -673,7 +673,7 @@ function blog_get_headers($courseid=null, $groupid=null, $userid=null, $tagid=nu
 
         $headers['filters']['module'] = $modid;
         // A groupid param may conflict with this coursemod's courseid. Ignore groupid in that case.
-        $courseid = $DB->get_field('course_modules', 'course', array('id'=>$modid));
+        $courseid = $DB->get_field('course_modules', 'course', array('id' => $modid));
         $course = $DB->get_record('course', array('id' => $courseid));
         $cm = $DB->get_record('course_modules', array('id' => $modid));
         $cm->modname = $DB->get_field('modules', 'name', array('id' => $cm->module));
@@ -861,7 +861,7 @@ function blog_get_headers($courseid=null, $groupid=null, $userid=null, $tagid=nu
         if (!empty($tagid)) {
             $headers['filters']['tag'] = $tagid;
             $blogurl->param('tagid', $tagid);
-            $tagrec = $DB->get_record('tag', array('id'=>$tagid));
+            $tagrec = $DB->get_record('tag', array('id' => $tagid));
             $PAGE->navbar->add($tagrec->name, $blogurl);
         } else if (!empty($tag)) {
             if ($tagrec = $DB->get_record('tag', array('name' => $tag))) {
@@ -921,7 +921,7 @@ function blog_get_associated_count($courseid, $cmid=null) {
  * @package  core_blog
  * @category comment
  *
- * @param stdClass $comment_param {
+ * @param stdClass $commentparam {
  *              context  => context the context object
  *              courseid => int course id
  *              cm       => stdClass course module object
@@ -930,11 +930,11 @@ function blog_get_associated_count($courseid, $cmid=null) {
  * }
  * @return array
  */
-function blog_comment_permissions($comment_param) {
+function blog_comment_permissions($commentparam) {
     global $DB;
 
     // If blog is public and current user is guest, then don't let him post comments.
-    $blogentry = $DB->get_record('post', array('id' => $comment_param->itemid), 'publishstate', MUST_EXIST);
+    $blogentry = $DB->get_record('post', array('id' => $commentparam->itemid), 'publishstate', MUST_EXIST);
 
     if ($blogentry->publishstate != 'public') {
         if (!isloggedin() || isguestuser()) {
@@ -959,7 +959,7 @@ function blog_comment_permissions($comment_param) {
  * }
  * @return boolean
  */
-function blog_comment_validate($comment_param) {
+function blog_comment_validate($commentparam) {
     global $CFG, $DB, $USER;
 
     // Check if blogs are enabled user can comment.
@@ -968,22 +968,22 @@ function blog_comment_validate($comment_param) {
     }
 
     // Validate comment area.
-    if ($comment_param->commentarea != 'format_blog') {
+    if ($commentparam->commentarea != 'format_blog') {
         throw new comment_exception('invalidcommentarea');
     }
 
-    $blogentry = $DB->get_record('post', array('id' => $comment_param->itemid), '*', MUST_EXIST);
+    $blogentry = $DB->get_record('post', array('id' => $commentparam->itemid), '*', MUST_EXIST);
 
     // Validation for comment deletion.
-    if (!empty($comment_param->commentid)) {
-        if ($record = $DB->get_record('comments', array('id'=>$comment_param->commentid))) {
+    if (!empty($commentparam->commentid)) {
+        if ($record = $DB->get_record('comments', array('id' => $commentparam->commentid))) {
             if ($record->commentarea != 'format_blog') {
                 throw new comment_exception('invalidcommentarea');
             }
-            if ($record->contextid != $comment_param->context->id) {
+            if ($record->contextid != $commentparam->context->id) {
                 throw new comment_exception('invalidcontext');
             }
-            if ($record->itemid != $comment_param->itemid) {
+            if ($record->itemid != $commentparam->itemid) {
                 throw new comment_exception('invalidcommentitemid');
             }
         } else {
@@ -1005,10 +1005,10 @@ function blog_comment_validate($comment_param) {
  */
 function blog_page_type_list($pagetype, $parentcontext, $currentcontext) {
     return array(
-        '*'=>get_string('page-x', 'pagetype'),
-        'blog-*'=>get_string('page-blog-x', 'blog'),
-        'blog-index'=>get_string('page-blog-index', 'blog'),
-        'blog-edit'=>get_string('page-blog-edit', 'blog')
+        '*' => get_string('page-x', 'pagetype'),
+        'blog-*' => get_string('page-blog-x', 'blog'),
+        'blog-index' => get_string('page-blog-index', 'blog'),
+        'blog-edit' => get_string('page-blog-edit', 'blog')
     );
 }
 
index 114e38e..7968483 100644 (file)
@@ -112,7 +112,7 @@ class blog_entry implements renderable {
 
         $this->renderable = new StdClass();
 
-        $this->renderable->user = $DB->get_record('user', array('id'=>$this->userid));
+        $this->renderable->user = $DB->get_record('user', array('id' => $this->userid));
 
         // Entry comments.
         if (!empty($CFG->usecomments) and $CFG->blogusecomments) {
@@ -163,7 +163,7 @@ class blog_entry implements renderable {
                     $associations[$key]->contextlevel = $context->contextlevel;
 
                     // Course associations.
-                    if ($context->contextlevel ==  CONTEXT_COURSE) {
+                    if ($context->contextlevel == CONTEXT_COURSE) {
                         // TODO: performance!!!!
                         $instancename = $DB->get_field('course', 'shortname', array('id' => $context->instanceid));
 
@@ -174,7 +174,7 @@ class blog_entry implements renderable {
                     }
 
                     // Mod associations.
-                    if ($context->contextlevel ==  CONTEXT_MODULE) {
+                    if ($context->contextlevel == CONTEXT_MODULE) {
 
                         // Getting the activity type and the activity instance id.
                         $sql = 'SELECT cm.instance, m.name FROM {course_modules} cm
@@ -653,7 +653,7 @@ class blog_listing {
                 $assocexists = $DB->record_exists('blog_association', array());
 
                 // Begin permission sql clause.
-                $permissionsql =  '(p.userid = ? ';
+                $permissionsql = '(p.userid = ? ';
                 $params[] = $userid;
 
                 if ($CFG->bloglevel >= BLOG_SITE_LEVEL) { // Add permission to view site-level entries.
index 832d4b1..1045a89 100644 (file)
@@ -141,10 +141,10 @@ class core_blog_renderer extends plugin_renderer_base {
             if ($officialtags) {
                 $o .= get_string('tags', 'tag') .': '. $this->output->container($officialtags, 'officialblogtags');
                 if ($defaulttags) {
-                    $o .=  ', ';
+                    $o .= ', ';
                 }
             }
-            $o .=  $defaulttags;
+            $o .= $defaulttags;
             $o .= $this->output->container_end();
         }
 
@@ -155,7 +155,7 @@ class core_blog_renderer extends plugin_renderer_base {
             $assocstr = '';
             $coursesarray = array();
             foreach ($entry->renderable->blogassociations as $assocrec) {
-                if ($assocrec->contextlevel ==  CONTEXT_COURSE) {
+                if ($assocrec->contextlevel == CONTEXT_COURSE) {
                     $coursesarray[] = $this->output->action_icon($assocrec->url, $assocrec->icon, null, array(), true);
                 }
             }
@@ -166,7 +166,7 @@ class core_blog_renderer extends plugin_renderer_base {
             // Now show mod association.
             $modulesarray = array();
             foreach ($entry->renderable->blogassociations as $assocrec) {
-                if ($assocrec->contextlevel ==  CONTEXT_MODULE) {
+                if ($assocrec->contextlevel == CONTEXT_MODULE) {
                     $str = get_string('associated', 'blog', $assocrec->type) . ': ';
                     $str .= $this->output->action_icon($assocrec->url, $assocrec->icon, null, array(), true);
                     $modulesarray[] = $str;
index 3f26eb0..cad38d8 100644 (file)
@@ -35,7 +35,7 @@ require_once($CFG->dirroot .'/blog/lib.php');
  * @param int    $tagid        The id of the row in the tag table that identifies the RSS Feed
  * @return string
  */
-function blog_rss_get_url($contextid, $userid, $filtertype, $filterselect=0, $tagid=0) {
+function blog_rss_get_url($contextid, $userid, $filtertype, $filterselect = 0, $tagid = 0) {
     $componentname = 'blog';
 
     $additionalargs = null;
@@ -70,7 +70,7 @@ function blog_rss_get_url($contextid, $userid, $filtertype, $filterselect=0, $ta
  * @param int         $tagid        The id of the row in the tag table that identifies the RSS Feed
  * @param string      $tooltiptext  The tooltip to be displayed with the link
  */
-function blog_rss_print_link($context, $filtertype, $filterselect=0, $tagid=0, $tooltiptext='') {
+function blog_rss_print_link($context, $filtertype, $filterselect = 0, $tagid = 0, $tooltiptext = '') {
     global $CFG, $USER, $OUTPUT;
 
     if (!isloggedin()) {
@@ -93,7 +93,7 @@ function blog_rss_print_link($context, $filtertype, $filterselect=0, $tagid=0, $
  * @param int         $filterselect The id of the item defined by $filtertype
  * @param int         $tagid        The id of the row in the tag table that identifies the RSS Feed
  */
-function blog_rss_add_http_header($context, $title, $filtertype, $filterselect=0, $tagid=0) {
+function blog_rss_add_http_header($context, $title, $filtertype, $filterselect = 0, $tagid = 0) {
     global $PAGE, $USER, $CFG;
 
     if (!isloggedin()) {
@@ -168,7 +168,7 @@ function blog_rss_get_feed($context, $args) {
     $type  = clean_param($args[3], PARAM_ALPHA);
     $id = clean_param($args[4], PARAM_INT);  // Could be groupid / courseid  / userid  depending on $type.
 
-    $tagid=0;
+    $tagid = 0;
     if ($args[5] != 'rss.xml') {
         $tagid = clean_param($args[5], PARAM_INT);
     } else {
@@ -234,10 +234,10 @@ function blog_rss_get_feed($context, $args) {
 
     switch ($type) {
         case 'user':
-            $info = fullname($DB->get_record('user', array('id'=>$id), 'firstname,lastname'));
+            $info = fullname($DB->get_record('user', array('id' => $id), 'firstname,lastname'));
             break;
         case 'course':
-            $info = $DB->get_field('course', 'fullname', array('id'=>$id));
+            $info = $DB->get_field('course', 'fullname', array('id' => $id));
             $info = format_string($info, true, array('context' => context_course::instance($id)));
             break;
         case 'site':
@@ -245,7 +245,7 @@ function blog_rss_get_feed($context, $args) {
             break;
         case 'group':
             $group = groups_get_group($id);
-            $info = $group->name; // TODO: $DB->get_field('groups', 'name', array('id'=>$id)).
+            $info = $group->name; // TODO: $DB->get_field('groups', 'name', array('id' => $id)).
             break;
         default:
             $info = '';
@@ -253,7 +253,7 @@ function blog_rss_get_feed($context, $args) {
     }
 
     if ($tagid) {
-        $info .= ': '.$DB->get_field('tags', 'text', array('id'=>$tagid));
+        $info .= ': '.$DB->get_field('tags', 'text', array('id' => $tagid));
     }
 
     $header = rss_standard_header(get_string($type.'blog', 'blog', $info),
@@ -279,7 +279,7 @@ function blog_rss_get_feed($context, $args) {
  * @param int    $tagid The id of the row in the tag table that identifies the RSS Feed
  * @return string
  */
-function blog_rss_file_name($type, $id, $tagid=0) {
+function blog_rss_file_name($type, $id, $tagid = 0) {
     global $CFG;
 
     if ($tagid) {
@@ -298,7 +298,7 @@ function blog_rss_file_name($type, $id, $tagid=0) {
  * @param string $contents The contents of the RSS Feed file
  * @return bool whether the save was successful or not
  */
-function blog_rss_save_file($type, $id, $tagid=0, $contents='') {
+function blog_rss_save_file($type, $id, $tagid = 0, $contents = '') {
     global $CFG;
 
     $status = true;
similarity index 82%
rename from blog/tests/bloglib_test.php
rename to blog/tests/lib_test.php
index a0589c2..1eb6583 100644 (file)
@@ -30,7 +30,7 @@ require_once($CFG->dirroot . '/blog/lib.php');
 /**
  * Test functions that rely on the DB tables
  */
-class core_bloglib_testcase extends advanced_testcase {
+class core_blog_lib_testcase extends advanced_testcase {
 
     private $courseid;
     private $cmid;
@@ -46,9 +46,9 @@ class core_bloglib_testcase extends advanced_testcase {
         $this->resetAfterTest();
 
         // Create default course.
-        $course = $this->getDataGenerator()->create_course(array('category'=>1, 'shortname'=>'ANON'));
+        $course = $this->getDataGenerator()->create_course(array('category' => 1, 'shortname' => 'ANON'));
         $this->assertNotEmpty($course);
-        $page = $this->getDataGenerator()->create_module('page', array('course'=>$course->id));
+        $page = $this->getDataGenerator()->create_module('page', array('course' => $course->id));
         $this->assertNotEmpty($page);
 
         // Create default group.
@@ -58,7 +58,11 @@ class core_bloglib_testcase extends advanced_testcase {
         $group->id = $DB->insert_record('groups', $group);
 
         // Create default user.
-        $user = $this->getDataGenerator()->create_user(array('username'=>'testuser', 'firstname'=>'Jimmy', 'lastname'=>'Kinnon'));
+        $user = $this->getDataGenerator()->create_user(array(
+                'username' => 'testuser',
+                'firstname' => 'Jimmy',
+                'lastname' => 'Kinnon'
+        ));
 
         // Create default tag.
         $tag = new stdClass();
@@ -91,35 +95,35 @@ class core_bloglib_testcase extends advanced_testcase {
         // Try all the filters at once: Only the entry filter is active.
         $filters = array('site' => $SITE->id, 'course' => $this->courseid, 'module' => $this->cmid,
             'group' => $this->groupid, 'user' => $this->userid, 'tag' => $this->tagid, 'entry' => $this->postid);
-        $blog_listing = new blog_listing($filters);
-        $this->assertFalse(array_key_exists('site', $blog_listing->filters));
-        $this->assertFalse(array_key_exists('course', $blog_listing->filters));
-        $this->assertFalse(array_key_exists('module', $blog_listing->filters));
-        $this->assertFalse(array_key_exists('group', $blog_listing->filters));
-        $this->assertFalse(array_key_exists('user', $blog_listing->filters));
-        $this->assertFalse(array_key_exists('tag', $blog_listing->filters));
-        $this->assertTrue(array_key_exists('entry', $blog_listing->filters));
+        $bloglisting = new blog_listing($filters);
+        $this->assertFalse(array_key_exists('site', $bloglisting->filters));
+        $this->assertFalse(array_key_exists('course', $bloglisting->filters));
+        $this->assertFalse(array_key_exists('module', $bloglisting->filters));
+        $this->assertFalse(array_key_exists('group', $bloglisting->filters));
+        $this->assertFalse(array_key_exists('user', $bloglisting->filters));
+        $this->assertFalse(array_key_exists('tag', $bloglisting->filters));
+        $this->assertTrue(array_key_exists('entry', $bloglisting->filters));
 
         // Again, but without the entry filter: This time, the tag, user and module filters are active.
         $filters = array('site' => $SITE->id, 'course' => $this->courseid, 'module' => $this->cmid,
             'group' => $this->groupid, 'user' => $this->userid, 'tag' => $this->postid);
-        $blog_listing = new blog_listing($filters);
-        $this->assertFalse(array_key_exists('site', $blog_listing->filters));
-        $this->assertFalse(array_key_exists('course', $blog_listing->filters));
-        $this->assertFalse(array_key_exists('group', $blog_listing->filters));
-        $this->assertTrue(array_key_exists('module', $blog_listing->filters));
-        $this->assertTrue(array_key_exists('user', $blog_listing->filters));
-        $this->assertTrue(array_key_exists('tag', $blog_listing->filters));
+        $bloglisting = new blog_listing($filters);
+        $this->assertFalse(array_key_exists('site', $bloglisting->filters));
+        $this->assertFalse(array_key_exists('course', $bloglisting->filters));
+        $this->assertFalse(array_key_exists('group', $bloglisting->filters));
+        $this->assertTrue(array_key_exists('module', $bloglisting->filters));
+        $this->assertTrue(array_key_exists('user', $bloglisting->filters));
+        $this->assertTrue(array_key_exists('tag', $bloglisting->filters));
 
         // We should get the same result by removing the 3 inactive filters: site, course and group.
         $filters = array('module' => $this->cmid, 'user' => $this->userid, 'tag' => $this->tagid);
-        $blog_listing = new blog_listing($filters);
-        $this->assertFalse(array_key_exists('site', $blog_listing->filters));
-        $this->assertFalse(array_key_exists('course', $blog_listing->filters));
-        $this->assertFalse(array_key_exists('group', $blog_listing->filters));
-        $this->assertTrue(array_key_exists('module', $blog_listing->filters));
-        $this->assertTrue(array_key_exists('user', $blog_listing->filters));
-        $this->assertTrue(array_key_exists('tag', $blog_listing->filters));
+        $bloglisting = new blog_listing($filters);
+        $this->assertFalse(array_key_exists('site', $bloglisting->filters));
+        $this->assertFalse(array_key_exists('course', $bloglisting->filters));
+        $this->assertFalse(array_key_exists('group', $bloglisting->filters));
+        $this->assertTrue(array_key_exists('module', $bloglisting->filters));
+        $this->assertTrue(array_key_exists('user', $bloglisting->filters));
+        $this->assertTrue(array_key_exists('tag', $bloglisting->filters));
 
     }
 
@@ -472,5 +476,73 @@ class core_bloglib_testcase extends advanced_testcase {
         $this->assertEquals($url, $event->get_url());
         $this->assertEventContextNotUsed($event);
     }
+
+    /**
+     * Tests the core_blog_myprofile_navigation() function.
+     */
+    public function test_core_blog_myprofile_navigation() {
+        global $USER;
+
+        // Set up the test.
+        $tree = new \core_user\output\myprofile\tree();
+        $this->setAdminUser();
+        $iscurrentuser = true;
+        $course = null;
+
+        // Enable blogs.
+        set_config('enableblogs', true);
+
+        // Check the node tree is correct.
+        core_blog_myprofile_navigation($tree, $USER, $iscurrentuser, $course);
+        $reflector = new ReflectionObject($tree);
+        $nodes = $reflector->getProperty('nodes');
+        $nodes->setAccessible(true);
+        $this->assertArrayHasKey('blogs', $nodes->getValue($tree));
+    }
+
+    /**
+     * Tests the core_blog_myprofile_navigation() function as a guest.
+     */
+    public function test_core_blog_myprofile_navigation_as_guest() {
+        global $USER;
+
+        // Set up the test.
+        $tree = new \core_user\output\myprofile\tree();
+        $iscurrentuser = false;
+        $course = null;
+
+        // Set user as guest.
+        $this->setGuestUser();
+
+        // Check the node tree is correct.
+        core_blog_myprofile_navigation($tree, $USER, $iscurrentuser, $course);
+        $reflector = new ReflectionObject($tree);
+        $nodes = $reflector->getProperty('nodes');
+        $nodes->setAccessible(true);
+        $this->assertArrayNotHasKey('blogs', $nodes->getValue($tree));
+    }
+
+    /**
+     * Tests the core_blog_myprofile_navigation() function when blogs are disabled.
+     */
+    public function test_core_blog_myprofile_navigation_blogs_disabled() {
+        global $USER;
+
+        // Set up the test.
+        $tree = new \core_user\output\myprofile\tree();
+        $this->setAdminUser();
+        $iscurrentuser = false;
+        $course = null;
+
+        // Disable blogs.
+        set_config('enableblogs', false);
+
+        // Check the node tree is correct.
+        core_blog_myprofile_navigation($tree, $USER, $iscurrentuser, $course);
+        $reflector = new ReflectionObject($tree);
+        $nodes = $reflector->getProperty('nodes');
+        $nodes->setAccessible(true);
+        $this->assertArrayNotHasKey('blogs', $nodes->getValue($tree));
+    }
 }
 
index 5a40c69..184997e 100644 (file)
@@ -338,7 +338,18 @@ function calendar_get_mini($courses, $groups, $users, $calmonth = false, $calyea
             $class = 'day';
         }
 
-        if (isset($eventsbyday[$day])) {
+        $eventids = array();
+        if (!empty($eventsbyday[$day])) {
+            $eventids = $eventsbyday[$day];
+        }
+
+        if (!empty($durationbyday[$day])) {
+            $eventids = array_unique(array_merge($eventids, $durationbyday[$day]));
+        }
+
+        $finishclass = false;
+
+        if (!empty($eventids)) {
             // There is at least one event on this day.
 
             $class .= ' hasevent';
@@ -346,7 +357,7 @@ function calendar_get_mini($courses, $groups, $users, $calmonth = false, $calyea
             $dayhref = calendar_get_link_href(new moodle_url(CALENDAR_URL . 'view.php', $hrefparams), 0, 0, 0, $daytime);
 
             $popupcontent = '';
-            foreach($eventsbyday[$day] as $eventid) {
+            foreach ($eventids as $eventid) {
                 if (!isset($events[$eventid])) {
                     continue;
                 }
@@ -367,26 +378,47 @@ function calendar_get_mini($courses, $groups, $users, $calmonth = false, $calyea
                     $popupicon = 'i/userevent';
                 }
 
+                if ($event->timeduration) {
+                    $startdate = $calendartype->timestamp_to_date_array($event->timestart);
+                    $enddate = $calendartype->timestamp_to_date_array($event->timestart + $event->timeduration - 1);
+                    if ($enddate['mon'] == $m && $enddate['year'] == $y && $enddate['mday'] == $day) {
+                        $finishclass = true;
+                    }
+                }
+
                 $dayhref->set_anchor('event_'.$event->id);
 
                 $popupcontent .= html_writer::start_tag('div');
                 $popupcontent .= $OUTPUT->pix_icon($popupicon, $popupalt, $component);
-                $name = format_string($event->name, true);
                 // Show ical source if needed.
                 if (!empty($event->subscription) && $CFG->calendar_showicalsource) {
                     $a = new stdClass();
-                    $a->name = $name;
+                    $a->name = format_string($event->name, true);
                     $a->source = $event->subscription->name;
                     $name = get_string('namewithsource', 'calendar', $a);
+                } else {
+                    if ($finishclass) {
+                        $samedate = $startdate['mon'] == $enddate['mon'] &&
+                                    $startdate['year'] == $enddate['year'] &&
+                                    $startdate['mday'] == $enddate['mday'];
+
+                        if ($samedate) {
+                            $name = format_string($event->name, true);
+                        } else {
+                            $name = format_string($event->name, true) . ' (' . get_string('eventendtime', 'calendar') . ')';
+                        }
+                    } else {
+                        $name = format_string($event->name, true);
+                    }
                 }
                 $popupcontent .= html_writer::link($dayhref, $name);
                 $popupcontent .= html_writer::end_tag('div');
             }
 
             if ($display->thismonth && $day == $d) {
-                $popupdata = calendar_get_popup(true, $events[$eventid]->timestart, $popupcontent);
+                $popupdata = calendar_get_popup(true, $daytime, $popupcontent);
             } else {
-                $popupdata = calendar_get_popup(false, $events[$eventid]->timestart, $popupcontent);
+                $popupdata = calendar_get_popup(false, $daytime, $popupcontent);
             }
             $cellattributes = array_merge($cellattributes, $popupdata);
 
@@ -400,6 +432,9 @@ function calendar_get_mini($courses, $groups, $users, $calmonth = false, $calyea
             } else if(isset($typesbyday[$day]['startuser'])) {
                 $class .= ' calendar_event_user';
             }
+            if ($finishclass) {
+                $class .= ' duration_finish';
+            }
             $cell = html_writer::link($dayhref, $day);
         } else {
             $cell = $day;
@@ -439,7 +474,7 @@ function calendar_get_mini($courses, $groups, $users, $calmonth = false, $calyea
             $class .= ' today';
             $today = get_string('today', 'calendar').' '.userdate(time(), get_string('strftimedayshort'));
 
-            if (!isset($eventsbyday[$day])) {
+            if (!isset($eventsbyday[$day]) && !isset($durationbyday[$day])) {
                 $class .= ' eventnone';
                 $popupdata = calendar_get_popup(true, false);
                 $cellattributes = array_merge($cellattributes, $popupdata);
index c1ce408..0a73901 100644 (file)
@@ -37,12 +37,9 @@ Feature: Allow teachers to manually mark users as complete when configured
     And I follow "View course report"
     And I should see "Student First"
     And I follow "Click to mark user complete"
-    # Running cron just after clicking sometimes fail, so navigate back
-    # and ensure the student completion is updated before running cron.
-    And I am on site homepage
-    And I follow "Completion course"
-    And I follow "View course report"
-    And "//img[contains(@alt, 'Completed')]" "xpath_element" should exist in the "student1" "table_row"
+    # Running cron just after clicking sometimes fail, as record
+    # should be created before the cron runs.
+    And I wait "1" seconds
     And I trigger cron
     And I am on site homepage
     And I log out
index 505413d..fdff4bd 100644 (file)
@@ -2,6 +2,6 @@
     "require-dev": {
         "phpunit/phpunit": "4.8.*",
         "phpunit/dbUnit": "1.4.*",
-        "moodlehq/behat-extension": "1.30.1"
+        "moodlehq/behat-extension": "1.31.0"
     }
 }
index 44a7f2f..c97fa52 100644 (file)
@@ -4,8 +4,8 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "hash": "85888280993254379afb3dd9a13fbf48",
-    "content-hash": "2660fb1bd1498fa3f4f106caede044f4",
+    "hash": "a957f7332dd1d221be96fb356cb9f03d",
+    "content-hash": "463a75022982e6a64bd9fc0513d9b44c",
     "packages": [],
     "packages-dev": [
         {
         },
         {
             "name": "moodlehq/behat-extension",
-            "version": "v1.30.1",
+            "version": "v1.31.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/moodlehq/moodle-behat-extension.git",
-                "reference": "7882d9331de46327c430b1572111e722378ab941"
+                "reference": "b4dd6f7d1ca1c89a44b8b010af8546d7a2808b7b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/moodlehq/moodle-behat-extension/zipball/7882d9331de46327c430b1572111e722378ab941",
-                "reference": "7882d9331de46327c430b1572111e722378ab941",
+                "url": "https://api.github.com/repos/moodlehq/moodle-behat-extension/zipball/b4dd6f7d1ca1c89a44b8b010af8546d7a2808b7b",
+                "reference": "b4dd6f7d1ca1c89a44b8b010af8546d7a2808b7b",
                 "shasum": ""
             },
             "require": {
                 "symfony/browser-kit": "2.7.5",
                 "symfony/css-selector": "2.7.5",
                 "symfony/dom-crawler": "2.7.5",
+                "symfony/filesystem": "2.7.5",
                 "symfony/finder": "2.7.5"
             },
             "type": "library",
                 "Behat",
                 "moodle"
             ],
-            "time": "2015-10-06 02:38:45"
+            "time": "2016-01-05 02:55:24"
         },
         {
             "name": "phpdocumentor/reflection-docblock",
         },
         {
             "name": "phpunit/php-code-coverage",
-            "version": "2.2.3",
+            "version": "2.2.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "ef1ca6835468857944d5c3b48fa503d5554cff2f"
+                "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef1ca6835468857944d5c3b48fa503d5554cff2f",
-                "reference": "ef1ca6835468857944d5c3b48fa503d5554cff2f",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
+                "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
                 "shasum": ""
             },
             "require": {
                 "testing",
                 "xunit"
             ],
-            "time": "2015-09-14 06:51:16"
+            "time": "2015-10-06 15:47:00"
         },
         {
             "name": "phpunit/php-file-iterator",
         },
         {
             "name": "phpunit/phpunit",
-            "version": "4.8.10",
+            "version": "4.8.21",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "463163747474815c5ccd4ae12b5b355ec12158e8"
+                "reference": "ea76b17bced0500a28098626b84eda12dbcf119c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/463163747474815c5ccd4ae12b5b355ec12158e8",
-                "reference": "463163747474815c5ccd4ae12b5b355ec12158e8",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ea76b17bced0500a28098626b84eda12dbcf119c",
+                "reference": "ea76b17bced0500a28098626b84eda12dbcf119c",
                 "shasum": ""
             },
             "require": {
                 "testing",
                 "xunit"
             ],
-            "time": "2015-10-01 09:14:30"
+            "time": "2015-12-12 07:45:58"
         },
         {
             "name": "phpunit/phpunit-mock-objects",
         },
         {
             "name": "sebastian/diff",
-            "version": "1.3.0",
+            "version": "1.4.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/diff.git",
-                "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3"
+                "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3",
-                "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
+                "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.2"
+                "phpunit/phpunit": "~4.8"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.3-dev"
+                    "dev-master": "1.4-dev"
                 }
             },
             "autoload": {
                 }
             ],
             "description": "Diff implementation",
-            "homepage": "http://www.github.com/sebastianbergmann/diff",
+            "homepage": "https://github.com/sebastianbergmann/diff",
             "keywords": [
                 "diff"
             ],
-            "time": "2015-02-22 15:13:53"
+            "time": "2015-12-08 07:14:41"
         },
         {
             "name": "sebastian/environment",
-            "version": "1.3.2",
+            "version": "1.3.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/environment.git",
-                "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44"
+                "reference": "6e7133793a8e5a5714a551a8324337374be209df"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6324c907ce7a52478eeeaede764f48733ef5ae44",
-                "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e7133793a8e5a5714a551a8324337374be209df",
+                "reference": "6e7133793a8e5a5714a551a8324337374be209df",
                 "shasum": ""
             },
             "require": {
                 "environment",
                 "hhvm"
             ],
-            "time": "2015-08-03 06:14:51"
+            "time": "2015-12-02 08:37:27"
         },
         {
             "name": "sebastian/exporter",
         },
         {
             "name": "sebastian/global-state",
-            "version": "1.0.0",
+            "version": "1.1.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/global-state.git",
-                "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01"
+                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
-                "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
                 "shasum": ""
             },
             "require": {
             "keywords": [
                 "global state"
             ],
-            "time": "2014-10-06 09:23:50"
+            "time": "2015-10-12 03:26:01"
         },
         {
             "name": "sebastian/recursion-context",
-            "version": "1.0.1",
+            "version": "1.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/recursion-context.git",
-                "reference": "994d4a811bafe801fb06dccbee797863ba2792ba"
+                "reference": "913401df809e99e4f47b27cdd781f4a258d58791"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba",
-                "reference": "994d4a811bafe801fb06dccbee797863ba2792ba",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791",
+                "reference": "913401df809e99e4f47b27cdd781f4a258d58791",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "Provides functionality to recursively process PHP variables",
             "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
-            "time": "2015-06-21 08:04:50"
+            "time": "2015-11-11 19:50:13"
         },
         {
             "name": "sebastian/version",
         },
         {
             "name": "symfony/config",
-            "version": "v2.7.5",
+            "version": "v2.8.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/config.git",
-                "reference": "9698fdf0a750d6887d5e7729d5cf099765b20e61"
+                "reference": "17d4b2e64ce1c6ba7caa040f14469b3c44d7f7d2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/config/zipball/9698fdf0a750d6887d5e7729d5cf099765b20e61",
-                "reference": "9698fdf0a750d6887d5e7729d5cf099765b20e61",
+                "url": "https://api.github.com/repos/symfony/config/zipball/17d4b2e64ce1c6ba7caa040f14469b3c44d7f7d2",
+                "reference": "17d4b2e64ce1c6ba7caa040f14469b3c44d7f7d2",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.9",
-                "symfony/filesystem": "~2.3"
-            },
-            "require-dev": {
-                "symfony/phpunit-bridge": "~2.7"
+                "symfony/filesystem": "~2.3|~3.0.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.7-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
                     "Symfony\\Component\\Config\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
             ],
             "description": "Symfony Config Component",
             "homepage": "https://symfony.com",
-            "time": "2015-09-21 15:02:29"
+            "time": "2015-12-26 13:37:56"
         },
         {
             "name": "symfony/console",
-            "version": "v2.7.5",
+            "version": "v2.8.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "06cb17c013a82f94a3d840682b49425cd00a2161"
+                "reference": "2e06a5ccb19dcf9b89f1c6a677a39a8df773635a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/06cb17c013a82f94a3d840682b49425cd00a2161",
-                "reference": "06cb17c013a82f94a3d840682b49425cd00a2161",
+                "url": "https://api.github.com/repos/symfony/console/zipball/2e06a5ccb19dcf9b89f1c6a677a39a8df773635a",
+                "reference": "2e06a5ccb19dcf9b89f1c6a677a39a8df773635a",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.9"
+                "php": ">=5.3.9",
+                "symfony/polyfill-mbstring": "~1.0"
             },
             "require-dev": {
                 "psr/log": "~1.0",
-                "symfony/event-dispatcher": "~2.1",
-                "symfony/phpunit-bridge": "~2.7",
-                "symfony/process": "~2.1"
+                "symfony/event-dispatcher": "~2.1|~3.0.0",
+                "symfony/process": "~2.1|~3.0.0"
             },
             "suggest": {
                 "psr/log": "For using the console logger",
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.7-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
                     "Symfony\\Component\\Console\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
             ],
             "description": "Symfony Console Component",
             "homepage": "https://symfony.com",
-            "time": "2015-09-25 08:32:23"
+            "time": "2015-12-22 10:25:57"
         },
         {
             "name": "symfony/css-selector",
         },
         {
             "name": "symfony/dependency-injection",
-            "version": "v2.7.5",
+            "version": "v2.8.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/dependency-injection.git",
-                "reference": "422c3819b110f610d79c6f1dc38af23787dc790e"
+                "reference": "c5086d186f538c2711b9af6f727be7b0446979cd"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/422c3819b110f610d79c6f1dc38af23787dc790e",
-                "reference": "422c3819b110f610d79c6f1dc38af23787dc790e",
+                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/c5086d186f538c2711b9af6f727be7b0446979cd",
+                "reference": "c5086d186f538c2711b9af6f727be7b0446979cd",
                 "shasum": ""
             },
             "require": {
                 "symfony/expression-language": "<2.6"
             },
             "require-dev": {
-                "symfony/config": "~2.2",
-                "symfony/expression-language": "~2.6",
-                "symfony/phpunit-bridge": "~2.7",
-                "symfony/yaml": "~2.1"
+                "symfony/config": "~2.2|~3.0.0",
+                "symfony/expression-language": "~2.6|~3.0.0",
+                "symfony/yaml": "~2.1|~3.0.0"
             },
             "suggest": {
                 "symfony/config": "",
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.7-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
                     "Symfony\\Component\\DependencyInjection\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
             ],
             "description": "Symfony DependencyInjection Component",
             "homepage": "https://symfony.com",
-            "time": "2015-09-15 08:30:42"
+            "time": "2015-12-26 13:37:56"
         },
         {
             "name": "symfony/dom-crawler",
         },
         {
             "name": "symfony/event-dispatcher",
-            "version": "v2.7.5",
+            "version": "v2.8.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher.git",
-                "reference": "ae4dcc2a8d3de98bd794167a3ccda1311597c5d9"
+                "reference": "a5eb815363c0388e83247e7e9853e5dbc14999cc"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae4dcc2a8d3de98bd794167a3ccda1311597c5d9",
-                "reference": "ae4dcc2a8d3de98bd794167a3ccda1311597c5d9",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a5eb815363c0388e83247e7e9853e5dbc14999cc",
+                "reference": "a5eb815363c0388e83247e7e9853e5dbc14999cc",
                 "shasum": ""
             },
             "require": {
             },
             "require-dev": {
                 "psr/log": "~1.0",
-                "symfony/config": "~2.0,>=2.0.5",
-                "symfony/dependency-injection": "~2.6",
-                "symfony/expression-language": "~2.6",
-                "symfony/phpunit-bridge": "~2.7",
-                "symfony/stopwatch": "~2.3"
+                "symfony/config": "~2.0,>=2.0.5|~3.0.0",
+                "symfony/dependency-injection": "~2.6|~3.0.0",
+                "symfony/expression-language": "~2.6|~3.0.0",
+                "symfony/stopwatch": "~2.3|~3.0.0"
             },
             "suggest": {
                 "symfony/dependency-injection": "",
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.7-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
                     "Symfony\\Component\\EventDispatcher\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
             ],
             "description": "Symfony EventDispatcher Component",
             "homepage": "https://symfony.com",
-            "time": "2015-09-22 13:49:29"
+            "time": "2015-10-30 20:15:42"
         },
         {
             "name": "symfony/filesystem",
             "homepage": "https://symfony.com",
             "time": "2015-09-19 19:59:23"
         },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "49ff736bd5d41f45240cec77b44967d76e0c3d25"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/49ff736bd5d41f45240cec77b44967d76e0c3d25",
+                "reference": "49ff736bd5d41f45240cec77b44967d76e0c3d25",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "time": "2015-11-20 09:19:13"
+        },
         {
             "name": "symfony/process",
-            "version": "v2.7.5",
+            "version": "v2.8.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "b27c8e317922cd3cdd3600850273cf6b82b2e8e9"
+                "reference": "62c254438b5040bc2217156e1570cf2206e8540c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/b27c8e317922cd3cdd3600850273cf6b82b2e8e9",
-                "reference": "b27c8e317922cd3cdd3600850273cf6b82b2e8e9",
+                "url": "https://api.github.com/repos/symfony/process/zipball/62c254438b5040bc2217156e1570cf2206e8540c",
+                "reference": "62c254438b5040bc2217156e1570cf2206e8540c",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.9"
             },
-            "require-dev": {
-                "symfony/phpunit-bridge": "~2.7"
-            },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.7-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
                     "Symfony\\Component\\Process\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
             ],
             "description": "Symfony Process Component",
             "homepage": "https://symfony.com",
-            "time": "2015-09-19 19:59:23"
+            "time": "2015-12-23 11:03:46"
         },
         {
             "name": "symfony/translation",
-            "version": "v2.7.5",
+            "version": "v2.8.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation.git",
-                "reference": "485877661835e188cd78345c6d4eef1290d17571"
+                "reference": "c1db87c51251167dd91198b9d1edf897773adb4f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation/zipball/485877661835e188cd78345c6d4eef1290d17571",
-                "reference": "485877661835e188cd78345c6d4eef1290d17571",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/c1db87c51251167dd91198b9d1edf897773adb4f",
+                "reference": "c1db87c51251167dd91198b9d1edf897773adb4f",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.9"
+                "php": ">=5.3.9",
+                "symfony/polyfill-mbstring": "~1.0"
             },
             "conflict": {
                 "symfony/config": "<2.7"
             },
             "require-dev": {
                 "psr/log": "~1.0",
-                "symfony/config": "~2.7",
-                "symfony/intl": "~2.4",
-                "symfony/phpunit-bridge": "~2.7",
-                "symfony/yaml": "~2.2"
+                "symfony/config": "~2.8",
+                "symfony/intl": "~2.4|~3.0.0",
+                "symfony/yaml": "~2.2|~3.0.0"
             },
             "suggest": {
                 "psr/log": "To use logging capability in translator",
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.7-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
                     "Symfony\\Component\\Translation\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
             ],
             "description": "Symfony Translation Component",
             "homepage": "https://symfony.com",
-            "time": "2015-09-06 08:36:38"
+            "time": "2015-12-05 17:37:59"
         },
         {
             "name": "symfony/yaml",
-            "version": "v2.7.5",
+            "version": "v2.8.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/yaml.git",
-                "reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770"
+                "reference": "ac84cbb98b68a6abbc9f5149eb96ccc7b07b8966"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/yaml/zipball/31cb2ad0155c95b88ee55fe12bc7ff92232c1770",
-                "reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/ac84cbb98b68a6abbc9f5149eb96ccc7b07b8966",
+                "reference": "ac84cbb98b68a6abbc9f5149eb96ccc7b07b8966",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.9"
             },
-            "require-dev": {
-                "symfony/phpunit-bridge": "~2.7"
-            },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.7-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
                     "Symfony\\Component\\Yaml\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
             ],
             "description": "Symfony Yaml Component",
             "homepage": "https://symfony.com",
-            "time": "2015-09-14 14:14:09"
+            "time": "2015-12-26 13:37:56"
         }
     ],
     "aliases": [],
index 6f02f93..ed28b03 100644 (file)
@@ -1130,7 +1130,7 @@ class core_course_management_renderer extends plugin_renderer_base {
         $totalpages = ceil($totalcourses / $perpage);
         if ($showtotals) {
             if ($totalpages == 0) {
-                $str = get_string('nocoursesfound', 'moodle', $search);
+                $str = get_string('nocoursesfound', 'moodle', s($search));
             } else if ($totalpages == 1) {
                 $str = get_string('showingacourses', 'moodle', $totalcourses);
             } else {
index 2a589ec..92bc5e9 100644 (file)
@@ -23,6 +23,7 @@ Background:
     And I press "Post to forum"
     And I wait to be redirected
     And I follow "Course 1"
+    And I wait "1" seconds
     And I press "Add a new discussion topic"
     And I set the following fields to these values:
       | Subject | Forum Post 9 |
@@ -30,6 +31,7 @@ Background:
     And I press "Post to forum"
     And I wait to be redirected
     And I follow "Course 1"
+    And I wait "1" seconds
     And I press "Add a new discussion topic"
     And I set the following fields to these values:
       | Subject | Forum Post 8 |
@@ -37,6 +39,7 @@ Background:
     And I press "Post to forum"
     And I wait to be redirected
     And I follow "Course 1"
+    And I wait "1" seconds
     And I press "Add a new discussion topic"
     And I set the following fields to these values:
       | Subject | Forum Post 7 |
@@ -44,6 +47,7 @@ Background:
     And I press "Post to forum"
     And I wait to be redirected
     And I follow "Course 1"
+    And I wait "1" seconds
     And I press "Add a new discussion topic"
     And I set the following fields to these values:
       | Subject | Forum Post 6 |
@@ -51,6 +55,7 @@ Background:
     And I press "Post to forum"
     And I wait to be redirected
     And I follow "Course 1"
+    And I wait "1" seconds
     And I press "Add a new discussion topic"
     And I set the following fields to these values:
       | Subject | Forum Post 5 |
@@ -58,6 +63,7 @@ Background:
     And I press "Post to forum"
     And I wait to be redirected
     And I follow "Course 1"
+    And I wait "1" seconds
     And I press "Add a new discussion topic"
     And I set the following fields to these values:
       | Subject | Forum Post 4 |
@@ -65,6 +71,7 @@ Background:
     And I press "Post to forum"
     And I wait to be redirected
     And I follow "Course 1"
+    And I wait "1" seconds
     And I press "Add a new discussion topic"
     And I set the following fields to these values:
       | Subject | Forum Post 3 |
@@ -72,6 +79,7 @@ Background:
     And I press "Post to forum"
     And I wait to be redirected
     And I follow "Course 1"
+    And I wait "1" seconds
     And I press "Add a new discussion topic"
     And I set the following fields to these values:
       | Subject | Forum Post 2 |
@@ -79,6 +87,7 @@ Background:
     And I press "Post to forum"
     And I wait to be redirected
     And I follow "Course 1"
+    And I wait "1" seconds
     And I press "Add a new discussion topic"
     And I set the following fields to these values:
       | Subject | Forum Post 1 |
index 4b9edaf..65880f9 100644 (file)
@@ -187,15 +187,14 @@ if (!empty($add)) {
 
     if ($items = grade_item::fetch_all(array('itemtype'=>'mod', 'itemmodule'=>$data->modulename,
                                              'iteminstance'=>$data->instance, 'courseid'=>$course->id))) {
-        // add existing outcomes
+        // Add existing outcomes.
         foreach ($items as $item) {
-            if (!empty($item->gradepass)) {
+            if (!empty($item->outcomeid)) {
+                $data->{'outcome_' . $item->outcomeid} = 1;
+            } else if (!empty($item->gradepass)) {
                 $decimalpoints = $item->get_decimals();
                 $data->gradepass = format_float($item->gradepass, $decimalpoints);
             }
-            if (!empty($item->outcomeid)) {
-                $data->{'outcome_'.$item->outcomeid} = 1;
-            }
         }
 
         // set category if present
index c22c65e..d25e14a 100644 (file)
@@ -264,9 +264,9 @@ class enrol_database_plugin extends enrol_plugin {
                   FROM {enrol} e
                   JOIN {course} c ON c.id = e.courseid
                   JOIN {role_assignments} ra ON ra.itemid = e.id
-             LEFT JOIN {user_enrolments} ue ON ue.enrolid = e.id
+             LEFT JOIN {user_enrolments} ue ON ue.enrolid = e.id AND ue.userid = ra.userid
                  WHERE ra.userid = :userid AND e.enrol = 'database'";
-        $rs = $DB->get_recordset_sql($sql, array('userid'=>$user->id));
+        $rs = $DB->get_recordset_sql($sql, array('userid' => $user->id));
         foreach ($rs as $instance) {
             if (!$instance->cvisible and $ignorehidden) {
                 continue;
index 331ee3d..959df21 100644 (file)
@@ -645,14 +645,21 @@ class core_enrol_external extends external_api {
      *
      * @param int $courseid
      * @return array of course enrolment methods
+     * @throws moodle_exception
      */
     public static function get_course_enrolment_methods($courseid) {
+        global $DB;
 
         $params = self::validate_parameters(self::get_course_enrolment_methods_parameters(), array('courseid' => $courseid));
 
-        $coursecontext = context_course::instance($params['courseid']);
-        $categorycontext = $coursecontext->get_parent_context();
-        self::validate_context($categorycontext);
+        // Note that we can't use validate_context because the user is not enrolled in the course.
+        require_login(null, false, null, false, true);
+
+        $course = $DB->get_record('course', array('id' => $params['courseid']), '*', MUST_EXIST);
+        $context = context_course::instance($course->id);
+        if (!$course->visible and !has_capability('moodle/course:viewhiddencourses', $context)) {
+            throw new moodle_exception('coursehidden');
+        }
 
         $result = array();
         $enrolinstances = enrol_get_instances($params['courseid'], true);
index bfcb20d..4eb6ef1 100644 (file)
@@ -58,7 +58,11 @@ class enrol_guest_edit_form extends moodleform {
         $mform->addElement('passwordunmask', 'password', get_string('password', 'enrol_guest'));
         $mform->addHelpButton('password', 'password', 'enrol_guest');
 
-        if ($plugin->get_config('requirepassword')) {
+        // If we have a new instance and the password is required - make sure it is set. For existing
+        // instances we do not force the password to be required as it may have been set to empty before
+        // the password was required. We check in the validation function whether this check is required
+        // for existing instances.
+        if (empty($instance->id) && $plugin->get_config('requirepassword')) {
             $mform->addRule('password', get_string('required'), 'required', null);
         }
 
@@ -84,20 +88,25 @@ class enrol_guest_edit_form extends moodleform {
         $checkpassword = false;
 
         if ($data['id']) {
-            if ($data['status'] == ENROL_INSTANCE_ENABLED) {
-                if ($instance->password !== $data['password']) {
-                    $checkpassword = true;
-                }
+            // Check the password if we are enabling the plugin again.
+            if (($instance->status == ENROL_INSTANCE_DISABLED) && ($data['status'] == ENROL_INSTANCE_ENABLED)) {
+                $checkpassword = true;
             }
-        } else {
-            if ($data['status'] == ENROL_INSTANCE_ENABLED) {
+
+            // Check the password if the instance is enabled and the password has changed.
+            if (($data['status'] == ENROL_INSTANCE_ENABLED) && ($instance->password !== $data['password'])) {
                 $checkpassword = true;
             }
+        } else {
+            $checkpassword = true;
         }
 
         if ($checkpassword) {
+            $require = $plugin->get_config('requirepassword');
             $policy  = $plugin->get_config('usepasswordpolicy');
-            if ($policy) {
+            if ($require && trim($data['password']) === '') {
+                $errors['password'] = get_string('required');
+            } else if (!empty($data['password']) && $policy) {
                 $errmsg = '';
                 if (!check_password_policy($data['password'], $errmsg)) {
                     $errors['password'] = $errmsg;
diff --git a/enrol/guest/classes/external.php b/enrol/guest/classes/external.php
new file mode 100644 (file)
index 0000000..a441ef8
--- /dev/null
@@ -0,0 +1,119 @@
+<?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/>.
+
+/**
+ * Guest enrolment method external API
+ *
+ * @package    enrol_guest
+ * @category   external
+ * @copyright  2015 Juan Leyva <juan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @since      Moodle 3.1
+ */
+
+defined('MOODLE_INTERNAL') || die;
+
+require_once($CFG->libdir . '/externallib.php');
+require_once($CFG->libdir . '/enrollib.php');
+
+/**
+ * Guest enrolment method external API
+ *
+ * @package    enrol_guest
+ * @category   external
+ * @copyright  2015 Juan Leyva <juan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @since      Moodle 3.1
+ */
+class enrol_guest_external extends external_api {
+
+    /**
+     * Returns description of get_instance_info() parameters.
+     *
+     * @return external_function_parameters
+     * @since Moodle 3.1
+     */
+    public static function get_instance_info_parameters() {
+        return new external_function_parameters(
+                array('instanceid' => new external_value(PARAM_INT, 'Instance id of guest enrolment plugin.'))
+            );
+    }
+
+    /**
+     * Return guest enrolment instance information.
+     *
+     * @param int $instanceid instance id of guest enrolment plugin.
+     * @return array warnings and instance information.
+     * @since Moodle 3.1
+     */
+    public static function get_instance_info($instanceid) {
+        global $DB;
+
+        $params = self::validate_parameters(self::get_instance_info_parameters(), array('instanceid' => $instanceid));
+        $warnings = array();
+
+        // Retrieve guest enrolment plugin.
+        $enrolplugin = enrol_get_plugin('guest');
+        if (empty($enrolplugin)) {
+            throw new moodle_exception('invaliddata', 'error');
+        }
+
+        require_login(null, false, null, false, true);
+        $enrolinstance = $DB->get_record('enrol', array('id' => $params['instanceid']), '*', MUST_EXIST);
+
+        $course = $DB->get_record('course', array('id' => $enrolinstance->courseid), '*', MUST_EXIST);
+        $context = context_course::instance($course->id);
+        if (!$course->visible and !has_capability('moodle/course:viewhiddencourses', $context)) {
+            throw new moodle_exception('coursehidden');
+        }
+
+        $instanceinfo = $enrolplugin->get_enrol_info($enrolinstance);
+        // Specific instance information.
+        $instanceinfo->passwordrequired = $instanceinfo->requiredparam->passwordrequired;
+
+        unset($instanceinfo->requiredparam);
+
+        $result = array();
+        $result['instanceinfo'] = $instanceinfo;
+        $result['warnings'] = $warnings;
+        return $result;
+    }
+
+    /**
+     * Returns description of get_instance_info() result value.
+     *
+     * @return external_description
+     * @since Moodle 3.1
+     */
+    public static function get_instance_info_returns() {
+        return new external_single_structure(
+            array(
+                'instanceinfo' => new external_single_structure(
+                    array(
+                        'id' => new external_value(PARAM_INT, 'Id of course enrolment instance'),
+                        'courseid' => new external_value(PARAM_INT, 'Id of course'),
+                        'type' => new external_value(PARAM_PLUGIN, 'Type of enrolment plugin'),
+                        'name' => new external_value(PARAM_RAW, 'Name of enrolment plugin'),
+                        'status' => new external_value(PARAM_BOOL, 'Is the enrolment enabled?'),
+                        'passwordrequired' => new external_value(PARAM_BOOL, 'Is a password required?'),
+                    )
+                ),
+                'warnings' => new external_warnings()
+            )
+        );
+    }
+
+}
diff --git a/enrol/guest/db/services.php b/enrol/guest/db/services.php
new file mode 100644 (file)
index 0000000..9127483
--- /dev/null
@@ -0,0 +1,35 @@
+<?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/>.
+
+/**
+ * Guest enrolment external functions and service definitions.
+ *
+ * @package    enrol_guest
+ * @category   external
+ * @copyright  2015 Juan Leyva <juan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @since      Moodle 3.1
+ */
+
+$functions = array(
+
+    'enrol_guest_get_instance_info' => array(
+        'classname'   => 'enrol_guest_external',
+        'methodname'  => 'get_instance_info',
+        'description' => 'Return guest enrolment instance information.',
+        'type'        => 'read'
+    ),
+);
index 7c0bfd2..0c69877 100644 (file)
@@ -371,7 +371,8 @@ class enrol_guest_plugin extends enrol_plugin {
                 }
             }
 
-            if ($this->get_config('usepasswordpolicy')) {
+            // Only check the password if it is set.
+            if (!empty($instance->password) && $this->get_config('usepasswordpolicy')) {
                 if (!check_password_policy($instance->password, $errmsg)) {
                     return false;
                 }
@@ -391,4 +392,32 @@ class enrol_guest_plugin extends enrol_plugin {
         $fields['status']          = $this->get_config('status');
         return $fields;
     }
+
+    /**
+     * Return information for enrolment instance containing list of parameters required
+     * for enrolment, name of enrolment plugin etc.
+     *
+     * @param stdClass $instance enrolment instance
+     * @return stdClass instance info.
+     * @since Moodle 3.1
+     */
+    public function get_enrol_info(stdClass $instance) {
+
+        $instanceinfo = new stdClass();
+        $instanceinfo->id = $instance->id;
+        $instanceinfo->courseid = $instance->courseid;
+        $instanceinfo->type = $this->get_name();
+        $instanceinfo->name = $this->get_instance_name($instance);
+        $instanceinfo->status = $instance->status == ENROL_INSTANCE_ENABLED;
+
+        // Specifics enrolment method parameters.
+        $instanceinfo->requiredparam = new stdClass();
+        $instanceinfo->requiredparam->passwordrequired = !empty($instance->password);
+
+        // If the plugin is enabled, return the URL for obtaining more information.
+        if ($instanceinfo->status) {
+            $instanceinfo->wsfunction = 'enrol_guest_get_instance_info';
+        }
+        return $instanceinfo;
+    }
 }
diff --git a/enrol/guest/tests/external_test.php b/enrol/guest/tests/external_test.php
new file mode 100644 (file)
index 0000000..91193af
--- /dev/null
@@ -0,0 +1,116 @@
+<?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/>.
+
+/**
+ * Self enrol external PHPunit tests
+ *
+ * @package   enrol_guest
+ * @copyright 2015 Juan Leyva <juan@moodle.com>
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @since     Moodle 3.1
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+global $CFG;
+
+require_once($CFG->dirroot . '/webservice/tests/helpers.php');
+
+/**
+ * Guest enrolment external functions tests
+ *
+ * @package    enrol_guest
+ * @category   external
+ * @copyright  2015 Juan Leyva <juan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @since      Moodle 3.1
+ */
+class enrol_guest_external_testcase extends externallib_advanced_testcase {
+
+    /**
+     * Test get_instance_info
+     */
+    public function test_get_instance_info() {
+        global $DB;
+
+        $this->resetAfterTest(true);
+
+        // Check if guest enrolment plugin is enabled.
+        $guestplugin = enrol_get_plugin('guest');
+        $this->assertNotEmpty($guestplugin);
+
+        $studentrole = $DB->get_record('role', array('shortname' => 'student'));
+
+        $coursedata = new stdClass();
+        $coursedata->visible = 0;
+        $course = self::getDataGenerator()->create_course($coursedata);
+
+        $student = self::getDataGenerator()->create_user();
+        $this->getDataGenerator()->enrol_user($student->id, $course->id, $studentrole->id, 'manual');
+
+        // Add enrolment methods for course.
+        $instance = $guestplugin->add_instance($course, array('status' => ENROL_INSTANCE_ENABLED,
+                                                                'name' => 'Test instance',
+                                                                'customint6' => 1,
+                                                                'roleid' => $studentrole->id));
+
+        $this->setAdminUser();
+        $result = enrol_guest_external::get_instance_info($instance);
+        $result = external_api::clean_returnvalue(enrol_guest_external::get_instance_info_returns(), $result);
+
+        $this->assertEquals($instance, $result['instanceinfo']['id']);
+        $this->assertEquals($course->id, $result['instanceinfo']['courseid']);
+        $this->assertEquals('guest', $result['instanceinfo']['type']);
+        $this->assertEquals('Test instance', $result['instanceinfo']['name']);
+        $this->assertTrue($result['instanceinfo']['status']);
+        $this->assertFalse($result['instanceinfo']['passwordrequired']);
+
+        $DB->set_field('enrol', 'status', ENROL_INSTANCE_DISABLED, array('id' => $instance));
+
+        $result = enrol_guest_external::get_instance_info($instance);
+        $result = external_api::clean_returnvalue(enrol_guest_external::get_instance_info_returns(), $result);
+        $this->assertEquals($instance, $result['instanceinfo']['id']);
+        $this->assertEquals($course->id, $result['instanceinfo']['courseid']);
+        $this->assertEquals('guest', $result['instanceinfo']['type']);
+        $this->assertEquals('Test instance', $result['instanceinfo']['name']);
+        $this->assertFalse($result['instanceinfo']['status']);
+        $this->assertFalse($result['instanceinfo']['passwordrequired']);
+
+        $DB->set_field('enrol', 'status', ENROL_INSTANCE_ENABLED, array('id' => $instance));
+
+        // Try to retrieve information using a normal user for a hidden course.
+        $user = self::getDataGenerator()->create_user();
+        $this->setUser($user);
+        try {
+            enrol_guest_external::get_instance_info($instance);
+        } catch (moodle_exception $e) {
+            $this->assertEquals('coursehidden', $e->errorcode);
+        }
+
+        // Student user.
+        $DB->set_field('course', 'visible', 1, array('id' => $course->id));
+        $this->setUser($student);
+        $result = enrol_guest_external::get_instance_info($instance);
+        $result = external_api::clean_returnvalue(enrol_guest_external::get_instance_info_returns(), $result);
+
+        $this->assertEquals($instance, $result['instanceinfo']['id']);
+        $this->assertEquals($course->id, $result['instanceinfo']['courseid']);
+        $this->assertEquals('guest', $result['instanceinfo']['type']);
+        $this->assertEquals('Test instance', $result['instanceinfo']['name']);
+        $this->assertTrue($result['instanceinfo']['status']);
+        $this->assertFalse($result['instanceinfo']['passwordrequired']);
+    }
+}
index d916ed6..5076e7b 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2015111600;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->version   = 2015111601;        // The current plugin version (Date: YYYYMMDDXX)
 $plugin->requires  = 2015111000;        // Requires this Moodle version
 $plugin->component = 'enrol_guest';     // Full name of the plugin (used for diagnostics)
index 8f972d8..197044f 100644 (file)
@@ -58,7 +58,7 @@ $data = new stdClass();
 
 foreach ($_POST as $key => $value) {
     $req .= "&$key=".urlencode($value);
-    $data->$key = $value;
+    $data->$key = fix_utf8($value);
 }
 
 $custom = explode('-', $data->custom);
@@ -211,6 +211,8 @@ if (strlen($result) > 0) {
             die;
 
         }
+        // Use the queried course's full name for the item_name field.
+        $data->item_name = $course->fullname;
 
         // ALL CLEAR !
 
index b035bd3..af10050 100644 (file)
@@ -163,15 +163,17 @@ class enrol_self_edit_form extends moodleform {
         $checkpassword = false;
 
         if ($instance->id) {
-            if ($data['status'] == ENROL_INSTANCE_ENABLED) {
-                if ($instance->password !== $data['password']) {
-                    $checkpassword = true;
-                }
+            // Check the password if we are enabling the plugin again.
+            if (($instance->status == ENROL_INSTANCE_DISABLED) && ($data['status'] == ENROL_INSTANCE_ENABLED)) {
+                $checkpassword = true;
             }
-        } else {
-            if ($data['status'] == ENROL_INSTANCE_ENABLED) {
+
+            // Check the password if the instance is enabled and the password has changed.
+            if (($data['status'] == ENROL_INSTANCE_ENABLED) && ($instance->password !== $data['password'])) {
                 $checkpassword = true;
             }
+        } else {
+            $checkpassword = true;
         }
 
         if ($checkpassword) {
@@ -179,8 +181,8 @@ class enrol_self_edit_form extends moodleform {
             $policy  = $plugin->get_config('usepasswordpolicy');
             if ($require and trim($data['password']) === '') {
                 $errors['password'] = get_string('required');
-            } else if ($policy) {
-                $errmsg = '';//prevent eclipse warning
+            } else if (!empty($data['password']) && $policy) {
+                $errmsg = '';
                 if (!check_password_policy($data['password'], $errmsg)) {
                     $errors['password'] = $errmsg;
                 }
index ad61b0c..b72fb3b 100644 (file)
@@ -52,6 +52,7 @@ class enrol_self_external extends external_api {
      *
      * @param int $instanceid instance id of self enrolment plugin.
      * @return array instance information.
+     * @throws moodle_exception
      */
     public static function get_instance_info($instanceid) {
         global $DB, $CFG;
@@ -66,10 +67,15 @@ class enrol_self_external extends external_api {
             throw new moodle_exception('invaliddata', 'error');
         }
 
+        // Note that we can't use validate_context because the user is not enrolled in the course.
+        require_login(null, false, null, false, true);
+
         $enrolinstance = $DB->get_record('enrol', array('id' => $params['instanceid']), '*', MUST_EXIST);
-        $coursecontext = context_course::instance($enrolinstance->courseid);
-        $categorycontext = $coursecontext->get_parent_context();
-        self::validate_context($categorycontext);
+        $course = $DB->get_record('course', array('id' => $enrolinstance->courseid), '*', MUST_EXIST);
+        $context = context_course::instance($course->id);
+        if (!$course->visible and !has_capability('moodle/course:viewhiddencourses', $context)) {
+            throw new moodle_exception('coursehidden');
+        }
 
         $instanceinfo = (array) $enrolplugin->get_enrol_info($enrolinstance);
         if (isset($instanceinfo['requiredparam']->enrolpassword)) {
index 7ad82ef..fef3f6f 100644 (file)
@@ -685,6 +685,27 @@ class enrol_self_plugin extends enrol_plugin {
      */
     public function can_hide_show_instance($instance) {
         $context = context_course::instance($instance->courseid);
-        return has_capability('enrol/self:config', $context);
+
+        if (!has_capability('enrol/self:config', $context)) {
+            return false;
+        }
+
+        // If the instance is currently disabled, before it can be enabled,
+        // we must check whether the password meets the password policies.
+        if ($instance->status == ENROL_INSTANCE_DISABLED) {
+            if ($this->get_config('requirepassword')) {
+                if (empty($instance->password)) {
+                    return false;
+                }
+            }
+            // Only check the password if it is set.
+            if (!empty($instance->password) && $this->get_config('usepasswordpolicy')) {
+                if (!check_password_policy($instance->password, $errmsg)) {
+                    return false;
+                }
+            }
+        }
+
+        return true;
     }
 }
index 74b1cbe..6621202 100644 (file)
@@ -47,7 +47,9 @@ class enrol_self_external_testcase extends externallib_advanced_testcase {
         $studentrole = $DB->get_record('role', array('shortname'=>'student'));
         $this->assertNotEmpty($studentrole);
 
-        $course = self::getDataGenerator()->create_course();
+        $coursedata = new stdClass();
+        $coursedata->visible = 0;
+        $course = self::getDataGenerator()->create_course($coursedata);
 
         // Add enrolment methods for course.
         $instanceid1 = $selfplugin->add_instance($course, array('status' => ENROL_INSTANCE_ENABLED,
@@ -68,6 +70,7 @@ class enrol_self_external_testcase extends externallib_advanced_testcase {
         $enrolmentmethods = $DB->get_records('enrol', array('courseid' => $course->id, 'status' => ENROL_INSTANCE_ENABLED));
         $this->assertCount(3, $enrolmentmethods);
 
+        $this->setAdminUser();
         $instanceinfo1 = enrol_self_external::get_instance_info($instanceid1);
         $instanceinfo1 = external_api::clean_returnvalue(enrol_self_external::get_instance_info_returns(), $instanceinfo1);
 
@@ -95,6 +98,15 @@ class enrol_self_external_testcase extends externallib_advanced_testcase {
         $this->assertEquals('Test instance 3', $instanceinfo3['name']);
         $this->assertTrue($instanceinfo3['status']);
         $this->assertEquals(get_string('password', 'enrol_self'), $instanceinfo3['enrolpassword']);
+
+        // Try to retrieve information using a normal user for a hidden course.
+        $user = self::getDataGenerator()->create_user();
+        $this->setUser($user);
+        try {
+            enrol_self_external::get_instance_info($instanceid3);
+        } catch (moodle_exception $e) {
+            $this->assertEquals('coursehidden', $e->errorcode);
+        }
     }
 
     /**
diff --git a/enrol/tests/behat/manage_enrolments_from_participants.feature b/enrol/tests/behat/manage_enrolments_from_participants.feature
new file mode 100644 (file)
index 0000000..82e7f11
--- /dev/null
@@ -0,0 +1,35 @@
+@core_enrol
+Feature: Manage enrollments from participants page
+  In order to manage course participants
+  As a teacher
+  In need to get to the enrolment page from the course participants page
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email |
+      | student1 | Student | 1 | student1@example.com |
+      | student2 | Student | 2 | student2@example.com |
+      | teacher1 | teacher | 1 | teacher1@example.com |
+    And the following "courses" exist:
+      | fullname | shortname | format |
+      | Course 1 | C1 | topics |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | student1 | C1 | student |
+      | student2 | C1 | student |
+      | teacher1 | C1 | editingteacher |
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I navigate to "Participants" node in "Current course > C1"
+
+  Scenario: Check the participants link when "All partipants" selected
+    Given I select "All participants" from the "roleid" singleselect
+    When I follow "Edit"
+    Then I should see "Enrolled users" in the "h2" "css_element"
+    And the field "Role" matches value "All"
+
+  Scenario: Check the participants link when "Student" selected
+    Given I select "Student" from the "roleid" singleselect
+    When I follow "Edit"
+    Then I should see "Enrolled users" in the "h2" "css_element"
+    And the field "Role" matches value "Student"
index db61fe9..21ad04d 100644 (file)
@@ -428,7 +428,9 @@ class core_enrol_externallib_testcase extends externallib_advanced_testcase {
         $this->assertNotEmpty($studentrole);
 
         $course1 = self::getDataGenerator()->create_course();
-        $course2 = self::getDataGenerator()->create_course();
+        $coursedata = new stdClass();
+        $coursedata->visible = 0;
+        $course2 = self::getDataGenerator()->create_course($coursedata);
 
         // Add enrolment methods for course.
         $instanceid1 = $selfplugin->add_instance($course1, array('status' => ENROL_INSTANCE_ENABLED,
@@ -445,6 +447,8 @@ class core_enrol_externallib_testcase extends externallib_advanced_testcase {
         $enrolmentmethods = $DB->get_records('enrol', array('courseid' => $course1->id, 'status' => ENROL_INSTANCE_ENABLED));
         $this->assertCount(2, $enrolmentmethods);
 
+        $this->setAdminUser();
+
         // Check if information is returned.
         $enrolmentmethods = core_enrol_external::get_course_enrolment_methods($course1->id);
         $enrolmentmethods = external_api::clean_returnvalue(core_enrol_external::get_course_enrolment_methods_returns(),
@@ -474,6 +478,15 @@ class core_enrol_externallib_testcase extends externallib_advanced_testcase {
         $this->assertEquals('self', $enrolmentmethod['type']);
         $this->assertTrue($enrolmentmethod['status']);
         $this->assertEquals('enrol_self_get_instance_info', $enrolmentmethod['wsfunction']);
+
+        // Try to retrieve information using a normal user for a hidden course.
+        $user = self::getDataGenerator()->create_user();
+        $this->setUser($user);
+        try {
+            core_enrol_external::get_course_enrolment_methods($course2->id);
+        } catch (moodle_exception $e) {
+            $this->assertEquals('coursehidden', $e->errorcode);
+        }
     }
 
     public function get_enrolled_users_setup($capability) {
index 7eb522e..e09f7e9 100644 (file)
 
             // run dvips (.dvi to .ps)
             $pathdvips = escapeshellarg(trim(get_config('filter_tex', 'pathdvips'), " '\""));
-            $command = "$pathdvips -E $dvi -o $ps";
+            $command = "$pathdvips -q -E $dvi -o $ps";
             if ($this->execute($command, $log )) {
                 return false;
             }
index 47b4578..be9461b 100644 (file)
@@ -35,11 +35,16 @@ $userid   = optional_param('userid', null, PARAM_INT);
 
 $defaulttype = $userid ? 'user' : 'select';
 
-$itemid   = optional_param('itemid', $userid, PARAM_INT);
+$itemid = optional_param('itemid', null, PARAM_INT);
 $itemtype = optional_param('item', $defaulttype, PARAM_TEXT);
 $page = optional_param('page', 0, PARAM_INT);
 $perpage = optional_param('perpage', 100, PARAM_INT);
 
+if (empty($itemid)) {
+    $itemid = $userid;
+    $itemtype = $defaulttype;
+}
+
 $courseparams = array('id' => $courseid);
 $PAGE->set_url(new moodle_url('/grade/report/singleview/index.php', $courseparams));
 $PAGE->set_pagelayout('incourse');
diff --git a/grade/report/user/tests/lib_test.php b/grade/report/user/tests/lib_test.php
new file mode 100644 (file)
index 0000000..7af1a71
--- /dev/null
@@ -0,0 +1,89 @@
+<?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 gradereport_user library functions.
+ *
+ * @package    gradereport_user
+ * @copyright  2015 onwards Ankit agarwal <ankit.agrr@gmail.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+global $CFG;
+require_once($CFG->dirroot . '/grade/report/user/lib.php');
+
+/**
+ * Class gradereport_user_lib_testcase.
+ *
+ * @package    gradereport_user
+ * @copyright  2015 onwards Ankit agarwal <ankit.agrr@gmail.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
+ */
+class gradereport_user_lib_testcase extends advanced_testcase {
+
+    /**
+     * @var stdClass The user.
+     */
+    private $user;
+
+    /**
+     * @var stdClass The course.
+     */
+    private $course;
+
+    /**
+     * @var \core_user\output\myprofile\tree The navigation tree.
+     */
+    private $tree;
+
+    public function setUp() {
+        $this->user = $this->getDataGenerator()->create_user();
+        $this->course = $this->getDataGenerator()->create_course();
+        $this->tree = new \core_user\output\myprofile\tree();
+        $this->resetAfterTest();
+    }
+
+    /**
+     * Tests the gradereport_user_myprofile_navigation() function.
+     */
+    public function test_gradereport_user_myprofile_navigation() {
+        $this->setAdminUser();
+        $iscurrentuser = false;
+
+        gradereport_user_myprofile_navigation($this->tree, $this->user, $iscurrentuser, $this->course);
+        $reflector = new ReflectionObject($this->tree);
+        $nodes = $reflector->getProperty('nodes');
+        $nodes->setAccessible(true);
+        $this->assertArrayHasKey('grade', $nodes->getValue($this->tree));
+    }
+
+    /**
+     * Tests the gradereport_user_myprofile_navigation() function for a user
+     * without permission to view the grade node.
+     */
+    public function test_gradereport_user_myprofile_navigation_without_permission() {
+        $this->setUser($this->user);
+        $iscurrentuser = true;
+
+        gradereport_user_myprofile_navigation($this->tree, $this->user, $iscurrentuser, $this->course);
+        $reflector = new ReflectionObject($this->tree);
+        $nodes = $reflector->getProperty('nodes');
+        $nodes->setAccessible(true);
+        $this->assertArrayNotHasKey('grade', $nodes->getValue($this->tree));
+    }
+}
diff --git a/grade/tests/behat/grade_hidden_items.feature b/grade/tests/behat/grade_hidden_items.feature
new file mode 100644 (file)
index 0000000..724fb0a
--- /dev/null
@@ -0,0 +1,67 @@
+@core @core_grades
+Feature: Student and teacher's view of aggregated grade items is consistent when hidden grade items are present
+  In order to calculate grade totals
+  As an teacher
+  I need to add aggregate columns to the gradebook
+
+  Scenario: Natural aggregation of course categories with hidden items calculates correctly for teacher and student
+    Given the following "courses" exist:
+      | fullname | shortname | category | groupmode |
+      | Course 1 | C1 | 0 | 1 |
+    And the following "users" exist:
+      | username | firstname | lastname | email | idnumber |
+      | teacher1 | Teacher | 1 | teacher1@example.com | t1 |
+      | student1 | Student | 1 | student1@example.com | s1 |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+      | student1 | C1 | student |
+    And the following "grade categories" exist:
+      | fullname | course |
+      | Sub category 1 | C1 |
+      | Sub category 2 | C1 |
+    And the following "activities" exist:
+      | activity | course | idnumber | name | intro | gradecategory| grade |
+      | assign | C1 | a1 | Test assignment one | Submit something! | Sub category 1 | 100 |
+      | assign | C1 | a2 | Test assignment two | Submit something! | Sub category 1 | 100 |
+      | assign | C1 | a3 | Test assignment three | Submit something! | Sub category 2 | 100 |
+      | assign | C1 | a4 | Test assignment four | Submit something! | Sub category 2 | 100 |
+    And I log in as "admin"
+    And I navigate to "Overview report" node in "Site administration > Grades > Report settings"
+    And I set the field "s__grade_report_overview_showtotalsifcontainhidden" to "Show totals excluding hidden items"
+    And I navigate to "User report" node in "Site administration > Grades > Report settings"
+    And I set the field "s__grade_report_user_showtotalsifcontainhidden" to "Show totals excluding hidden items"
+    And I press "Save changes"
+    When I log out
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I navigate to "Grades" node in "Course administration"
+    And I turn editing mode on
+    And I give the grade "50.00" to the user "Student 1" for the grade item "Test assignment one"
+    And I give the grade "50.00" to the user "Student 1" for the grade item "Test assignment three"
+    And I press "Save changes"
+    And I set the following settings for grade item "Test assignment four":
+      | Hidden | 1 |
+    And I press "Save changes"
+    And I follow "Course 1"
+    And I navigate to "Grades" node in "Course administration"
+    And I select "User report" from the "Grade report" singleselect
+    And I select "Student 1" from the "Select all or one user" singleselect
+    Then the following should exist in the "user-grade" table:
+      | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total |
+      | Test assignment one | 100.00 % | 50.00 | 0–100 | 50.00 % | 25.00 % |
+      | Test assignment two | 0.00 %( Empty ) | - | 0–100 | - | 0.00 % |
+      | Test assignment three | 100.00 % | 50.00 | 0–100 | 50.00 % | 25.00 % |
+      | Course total | - | 100.00 | 0–200 | 50.00 % | - |
+    When I log out
+    And I log in as "student1"
+    And I follow "Course 1"
+    And I navigate to "Grades" node in "Course administration"
+    And I navigate to "User report" node in "Grade administration"
+    Then the following should exist in the "user-grade" table:
+      | Grade item | Calculated weight | Grade | Range | Percentage | Contribution to course total |
+      | Test assignment one | 100.00 % | 50.00 | 0–100 | 50.00 % |  25.00 % |
+      | Test assignment two | -( Empty ) | - | 0–100 | - | - |
+      | Test assignment three | 100.00 % | 50.00 | 0–100 | 50.00 % | 25.00 % |
+      | Course total | - | 100.00 | 0–200 | 50.00 % | - |
+    And I should not see "Test assignment four"
index 27ee1c3..3178e7b 100644 (file)
@@ -565,30 +565,30 @@ function groups_delete_grouping($groupingorid) {
  *
  * @param int $courseid
  * @param int $userid 0 means all users
- * @param bool $showfeedback
+ * @param bool $unused - formerly $showfeedback, is no longer used.
  * @return bool success
  */
-function groups_delete_group_members($courseid, $userid=0, $showfeedback=false) {
+function groups_delete_group_members($courseid, $userid=0, $unused=false) {
     global $DB, $OUTPUT;
 
-    if (is_bool($userid)) {
-        debugging('Incorrect userid function parameter');
-        return false;
+    // Get the users in the course which are in a group.
+    $sql = "SELECT gm.id as gmid, gm.userid, g.*
+              FROM {groups_members} gm
+        INNER JOIN {groups} g
+                ON gm.groupid = g.id
+             WHERE g.courseid = :courseid";
+    $params = array();
+    $params['courseid'] = $courseid;
+    // Check if we want to delete a specific user.
+    if ($userid) {
+        $sql .= " AND gm.userid = :userid";
+        $params['userid'] = $userid;
     }
-
-    // Select * so that the function groups_remove_member() gets the whole record.
-    $groups = $DB->get_recordset('groups', array('courseid' => $courseid));
-    foreach ($groups as $group) {
-        if ($userid) {
-            $userids = array($userid);
-        } else {
-            $userids = $DB->get_fieldset_select('groups_members', 'userid', 'groupid = :groupid', array('groupid' => $group->id));
-        }
-
-        foreach ($userids as $id) {
-            groups_remove_member($group, $id);
-        }
+    $rs = $DB->get_recordset_sql($sql, $params);
+    foreach ($rs as $usergroup) {
+        groups_remove_member($usergroup, $usergroup->userid);
     }
+    $rs->close();
 
     // TODO MDL-41312 Remove events_trigger_legacy('groups_members_removed').
     // This event is kept here for backwards compatibility, because it cannot be
@@ -598,10 +598,6 @@ function groups_delete_group_members($courseid, $userid=0, $showfeedback=false)
     $eventdata->userid   = $userid;
     events_trigger_legacy('groups_members_removed', $eventdata);
 
-    if ($showfeedback) {
-        echo $OUTPUT->notification(get_string('deleted').' - '.get_string('groupmembers', 'group'), 'notifysuccess');
-    }
-
     return true;
 }
 
@@ -1080,4 +1076,4 @@ function groups_sync_with_enrolment($enrolname, $courseid = 0, $gidfield = 'cust
     $rs->close();
 
     return $affectedusers;
-}
\ No newline at end of file
+}
index 2b6d46e..815b27e 100644 (file)
@@ -31,6 +31,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['language'] = 'Idioma';
+$string['moodlelogo'] = 'Logo de Moodle';
 $string['next'] = 'Siguiente';
 $string['previous'] = 'Anterior';
 $string['reload'] = 'Recargar';
index 52508ae..6b87350 100644 (file)
@@ -32,8 +32,8 @@ defined('MOODLE_INTERNAL') || die();
 
 $string['admindirname'] = 'ספריית מנהל המערכת';
 $string['availablelangs'] = 'חבילות שפה זמינות';
-$string['chooselanguagehead'] = '×\91×\97ר שפה';
-$string['chooselanguagesub'] = '×\90× ×\90 ×\91×\97ר שפה עבור ההתקנה בלבד. תוכל לבחור בשפה שונה לאתר ולמשתמש באחד מהמסכים הבאים.';
+$string['chooselanguagehead'] = '×\91×\97×\99רת שפה';
+$string['chooselanguagesub'] = '×\99ש ×\9c×\91×\97×\95ר שפה עבור ההתקנה בלבד. תוכל לבחור בשפה שונה לאתר ולמשתמש באחד מהמסכים הבאים.';
 $string['clialreadyconfigured'] = 'קובץ config.php כבר קיים, אנא השתמש ב
 admin/cli/install_database.php
 אם ברצונך להתקין את אתר זה.';
@@ -42,7 +42,7 @@ $string['clialreadyinstalled'] = 'קובץ ה-config.php קיים כבר, אנא
 $string['cliinstallheader'] = 'תוכנית התקנת Moodle {$a} בשורת הפקודה';
 $string['databasehost'] = 'מסד הנתונים המארח (host)';
 $string['databasename'] = 'שם מסד הנתונים';
-$string['databasetypehead'] = '×\91×\97ר התקן מסד הנתונים';
+$string['databasetypehead'] = '×\91×\97×\99רת התקן מסד הנתונים';
 $string['dataroot'] = 'ספריית הנתונים';
 $string['datarootpermission'] = 'הרשאות תיקיות bתונים (data)';
 $string['dbprefix'] = 'Tables prefix';
index 7445a73..0e18336 100644 (file)
@@ -39,4 +39,4 @@ $string['clitypevaluedefault'] = 'unesite vrijednost ili pritisnite Enter za kor
 $string['cliunknowoption'] = 'Nepoznate opcije: {$a} Molimo koristite --help opciju.';
 $string['cliyesnoprompt'] = 'unesite y (znači da) ili n (znači ne)';
 $string['environmentrequireinstall'] = 'je neophodno instalirati/omogućiti';
-$string['environmentrequireversion'] = 'neophodna inačica je {$a->needed}, a vi trenutno koristite inačicu {$a->current}';
+$string['environmentrequireversion'] = 'neophodna inačica je {$a->needed}, a vi trenutno koristite inačicu {$a->current}';
index 6004835..61fa691 100644 (file)
@@ -41,7 +41,7 @@ $string['cannotunzipfile'] = 'Nije moguće otpakirati datoteku';
 $string['componentisuptodate'] = 'Komponenta je dostupna u svojoj najnovijoj inačici.';
 $string['downloadedfilecheckfailed'] = 'Došlo je do pogreške pri provjeri preuzete datoteke';
 $string['invalidmd5'] = 'Neispravna md5 datoteka';
-$string['missingrequiredfield'] = 'Nedostaje neko obvezno polje';
+$string['missingrequiredfield'] = 'Nedostaje neko obvezatno polje';
 $string['remotedownloaderror'] = 'Nije uspjelo preuzimanje komponente na poslužitelj, provjerite postavke proxyja. Preporuča se uporaba PHP cURL dodatka.<br /><br />Ručno preuzmite datoteku s <a href="{$a->url}">{$a->url}</a> iskopirajte ju u "{$a->dest}" na poslužitelju i raspakirajte.';
 $string['wrongdestpath'] = 'Pogrešna odredišna putanja.';
 $string['wrongsourcebase'] = 'Pogrešna baza izvornog URL-a';
index 1e866ac..433a8e2 100644 (file)
@@ -45,12 +45,12 @@ $string['datarootpermission'] = 'Ovlasti nad mapom s podacima';
 $string['dbprefix'] = 'Prefiks tablice';
 $string['dirroot'] = 'Moodle mapa';
 $string['environmenthead'] = 'Provjera okruženja vašeg poslužitelja ...';
-$string['environmentsub2'] = 'Svaka inačica Moodle-a ima minimalne zahtjeve po pitanju odgovarajuće PHP inačice i nekoliko obveznih PHP ekstenzija.
+$string['environmentsub2'] = 'Svaka inačica Moodle-a ima minimalne zahtjeve po pitanju odgovarajuće PHP inačice i nekoliko obvezatnih PHP ekstenzija.
 Puna provjera okruženja se obavlja prije svake instalacije ili nadogradnje postojeće inačice. Ako ne znate kako instalirati novu inačicu ili omogućiti PHP ekstenzije, kontaktirajte administratora vašeg poslužitelja.';
 $string['errorsinenvironment'] = 'Pogreške u okruženju poslužitelja!';
 $string['installation'] = 'Instalacija';
 $string['langdownloaderror'] = 'Nažalost, jezik "{$a}" nije instaliran. Proces instalacije će biti nastavljen na engleskom jeziku.';
-$string['memorylimithelp'] = '<p>PHP ograničenje memorije na poslužitelju je trenutno podešeno na {$a}.</p>
+$string['memorylimithelp'] = '<p>PHP ograničenje memorije na poslužitelju je trenutno podešeno na {$a}.</p>
 
 <p>Ova postavka može kasnije rezultirati memorijskim problemima na vašem Moodle sustavu, posebno ako imate veći broj omogućenih modula i/ili veći broj korisnika.</p>
 
@@ -78,7 +78,7 @@ $string['pathsunsecuredataroot'] = 'Podatkovna (dataroot) mapa nije sigurna';
 $string['pathswrongadmindir'] = 'Admin mapa ne postoji';
 $string['phpextension'] = 'PHP ekstenzija {$a}';
 $string['phpversion'] = 'PHP inačica';
-$string['phpversionhelp'] = '<p>Moodle zahtijeva najmanje PHP inačicu 4.3.0 ili 5.1.0 (5.0.x funkcionira uz brojne uočene probleme).</p> <p>Trenutno imate inačicu {$a}</p> <p>Morate nadograditi PHP ili premestiti Moodle instalaciju na web poslužitelj s novijom inačicom PHP-a!</br> (U slučaju inačice 5.0.x bilo bi najbolje da je vratite na inačicu 4.4.x)</p>';
+$string['phpversionhelp'] = '<p>Moodle zahtijeva najmanje PHP inačicu 4.3.0 ili 5.1.0 (5.0.x funkcionira uz brojne uočene probleme).</p> <p>Trenutno imate inačicu {$a}</p> <p>Morate nadograditi PHP ili premestiti Moodle instalaciju na web poslužitelj s novijom inačicom PHP-a!</br> (U slučaju inačice 5.0.x bilo bi najbolje da je vratite na inačicu 4.4.x)</p>';
 $string['welcomep10'] = '{$a->installername} ({$a->installerversion})';
 $string['welcomep20'] = 'Prikazana vam je ova stranica jer ste uspješno instalirali i pokrenuli <strong>{$a->packname} {$a->packversion}</strong> paket na svom poslužitelju. Čestitamo!';
 $string['welcomep30'] = 'Ova inačica <strong>{$a->installername}</strong> uključuje aplikacije za stvaranje okruženja u kojem će sustav <strong>Moodle</strong> uspješno funkcionirati, konkretno:';
index 53cc6ea..d73597d 100644 (file)
@@ -31,6 +31,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['language'] = 'Taal';
+$string['moodlelogo'] = 'Moodle logo';
 $string['next'] = 'Volgende';
 $string['previous'] = 'Vorige';
 $string['reload'] = 'Opnieuw laden';
index 41b463c..4efb5a7 100644 (file)
@@ -40,3 +40,4 @@ $string['cliunknowoption'] = 'Opções desconhecidas: {$a} Por favor use a opç
 $string['cliyesnoprompt'] = 'digite s (para sim) ou n (para não)';
 $string['environmentrequireinstall'] = 'deve estar instalada e ativa';
 $string['environmentrequireversion'] = 'é requerida a versão {$a->needed} e está a correr a versão {$a->current}';
+$string['upgradekeyset'] = 'Chave de atualização (deixe em branco caso não pretenda definir uma)';
index 1374074..2762ccc 100644 (file)
@@ -31,6 +31,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['language'] = 'Idioma';
+$string['moodlelogo'] = 'Logotipo Moodle';
 $string['next'] = 'Seguinte';
 $string['previous'] = 'Anterior';
 $string['reload'] = 'Recarregar';
index fcffdff..cc92dab 100644 (file)
@@ -31,6 +31,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['language'] = 'Idioma';
+$string['moodlelogo'] = 'Logotipo Moodle';
 $string['next'] = 'Próximo';
 $string['previous'] = 'Anterior';
 $string['reload'] = 'Recarregar';
index 2e53dac..1663ed5 100644 (file)
@@ -39,10 +39,11 @@ $string['cannotsavemd5file'] = '无法保存 md5 文件';
 $string['cannotsavezipfile'] = '无法保存 ZIP 文件';
 $string['cannotunzipfile'] = '无法解压文件';
 $string['componentisuptodate'] = '组件已经是最新的了';
+$string['dmlexceptiononinstall'] = '<p>发生了一个数据库错误[{$a->errorcode}].<br />{$a->debuginfo}</p>';
 $string['downloadedfilecheckfailed'] = '下载文件检查失败';
 $string['invalidmd5'] = '无效的 md5';
 $string['missingrequiredfield'] = '缺少了必需的字段';
-$string['remotedownloaderror'] = '下载组件至服务器失败,请校验代理设置,推荐安装 PHP cURL 扩展。<br /><br />您必须手动下载下载<a href="{$a->url}">{$a->url}</a> ,拷贝至服务器上的“{$a->dest}”并解压至此。';
+$string['remotedownloaderror'] = '<p>下载组件至服务器失败,请校验代理设置,推荐安装 PHP cURL 扩展。</p> <p>您必须手动下载下载<a href="{$a->url}">{$a->url}</a> ,拷贝至服务器上的“{$a->dest}”并解压至此。</p>';
 $string['wrongdestpath'] = '错误的目标路径';
 $string['wrongsourcebase'] = '错误的源 URL 基地址。';
 $string['wrongzipfilename'] = '错误的 ZIP 文件名。';
index c91b80c..6f888e8 100644 (file)
@@ -71,7 +71,13 @@ $string['pathsroparentdataroot'] = '上層目錄({$a->parent})是不可寫入的
 $string['pathssubadmindir'] = '有些網站主機使用/admin這個網址來瀏覽控制面版或其他功能。很不幸,這個設定和Moodle管理頁面的標準路徑產生衝突。這個問題可以解決,只需在您的安裝目錄中把admin更換名稱,然後把新名稱輸入到這裡。例如<em>moodleadmin</em>這麼做會改變Moodle中的管理連接。';
 $string['pathssubdataroot'] = '你需要有一個地方讓Moodle可以儲存上傳的檔案。這一目錄對於網頁伺服器用戶(通常是"nobody"或"apache")而言,應該是可讀的和<b>可寫的</b>。但是它必須不能經由網頁直接存取。若此目錄不存在,這安裝程式將會試著建立它。';
 $string['pathssubdirroot'] = '包含Moodle程式碼的目錄的完整路徑';
-$string['pathssubwwwroot'] = '可以瀏覽到Moodle的完整網址。Moodle不支援透過多個網址瀏覽,如果您的網站有多個公開網址,您必須把這個網址以外的網址都設定為永久重新導向。如果您的網站可以透過內部網址瀏覽,有可以透過這個公開網址瀏覽,那麼請設定DNS使網內用戶也能使用這公開的網址。如果此網址不正確,請在你的瀏覽器中修改URL來重新安裝,並設定另一個網址。';
+$string['pathssubwwwroot'] = '可以進入使用Moodle的完整網址,也就是用戶為了要使用Moodle,而需要輸入到瀏覽器的網址列的地址。
+
+不可能使用多個網址來存取Moodle,如果您的網站有多個公開網址,您必須選擇一個最簡單的網址,並把其他的網址都設定為永久重新導向。
+
+如果您的網站可以透過網際網路,也可以透過內部網路來瀏覽,那麼在此請設定公開的網址。
+
+如果目前的網址不正確,請在你的瀏覽器的網址列中更改網址,並重新安裝。';
 $string['pathsunsecuredataroot'] = '資料根(Dataroot)目錄的位置不安全';
 $string['pathswrongadmindir'] = '管理目錄不存在';
 $string['phpextension'] = '{$a} PHP擴展';
index 4b85386..76921aa 100644 (file)
@@ -118,7 +118,7 @@ XPATH
 XPATH
         , 'question' => <<<XPATH
 .//div[contains(concat(' ', normalize-space(@class), ' '), ' que ')]
-    [contains(div[@class='content']/div[@class='formulation'], %locator%)]
+    [contains(div[@class='content']/div[contains(concat(' ', normalize-space(@class), ' '), ' formulation ')], %locator%)]
 XPATH
         , 'region' => <<<XPATH
 .//*[self::div | self::section | self::aside | self::header | self::footer][./@id = %locator%]
index d80486e..3333801 100644 (file)
@@ -180,15 +180,6 @@ function behat_clean_init_config() {
             unset($CFG->{$key});
         }
     }
-
-    // Here we are forcing the navbar to be absolutely positioned in Chrome, Safari and IE in order to
-    // avoid a driver bug whereby when the browser scrolls something into view it doesn't account
-    // for fixed positioned elements that end up obscuring the item thus leading to errors that
-    // could be avoided by scrolling an additional amount.
-    // This should be removed as soon as the affected drivers have been fixed.
-    $CFG->forced_plugin_settings['theme_clean'] = array(
-        'customcss' => 'body.safari .navbar-fixed-top, body.ie .navbar-fixed-top {position: absolute;}'
-    );
 }
 
 /**
index cf3aeac..28cc82f 100644 (file)
@@ -26,11 +26,17 @@ namespace core\plugininfo;
 defined('MOODLE_INTERNAL') || die();
 
 /**
- * Class for admin tool plugins
+ * Class for cache store plugins
  */
 class cachestore extends base {
 
     public function is_uninstall_allowed() {
-        return false;
+        $instance = \cache_config::instance();
+        foreach ($instance->get_all_stores() as $store) {
+            if ($store['plugin'] == $this->name) {
+                return false;
+            }
+        }
+        return true;
     }
 }
index 54902d9..d9867da 100644 (file)
@@ -1168,11 +1168,13 @@ $services = array(
             'core_enrol_get_users_courses',
             'core_enrol_get_enrolled_users',
             'core_enrol_get_course_enrolment_methods',
+            'enrol_guest_get_instance_info',
             'enrol_self_enrol_user',
             'enrol_self_get_instance_info',
             'core_user_get_users_by_id',
             'core_webservice_get_site_info',
             'core_notes_create_notes',
+            'core_notes_delete_notes',
             'core_user_get_course_user_profiles',
             'core_message_send_instant_messages',
             'mod_assign_get_grades',
@@ -1244,6 +1246,7 @@ $services = array(
             'mod_scorm_get_scorm_sco_tracks',
             'mod_scorm_get_scorm_attempt_count',
             'mod_scorm_get_scorms_by_courses',
+            'mod_scorm_launch_sco',
             'mod_survey_get_surveys_by_courses',
             'mod_survey_view_survey',
             'mod_survey_get_questions',
@@ -1272,6 +1275,21 @@ $services = array(
             'mod_imscp_get_imscps_by_courses',
             'mod_glossary_get_glossaries_by_courses',
             'mod_wiki_get_wikis_by_courses',
+            'mod_wiki_view_wiki',
+            'mod_wiki_view_page',
+            'mod_glossary_view_glossary',
+            'mod_glossary_view_entry',
+            'mod_glossary_get_entries_by_letter',
+            'mod_glossary_get_entries_by_date',
+            'mod_glossary_get_categories',
+            'mod_glossary_get_entries_by_category',
+            'mod_glossary_get_authors',
+            'mod_glossary_get_entries_by_author',
+            'mod_glossary_get_entries_by_author_id',
+            'mod_glossary_get_entries_by_search',
+            'mod_glossary_get_entries_by_term',
+            'mod_glossary_get_entries_to_approve',
+            'mod_glossary_get_entry_by_id',
             ),
         'enabled' => 0,
         'restrictedusers' => 0,
index 4540c7e..89792c6 100644 (file)
@@ -404,6 +404,14 @@ abstract class moodle_database {
             case SQL_QUERY_UPDATE:
             case SQL_QUERY_STRUCTURE:
                 $this->writes++;
+            default:
+                if ((PHPUNIT_TEST) || (defined('BEHAT_TEST') && BEHAT_TEST) ||
+                    defined('BEHAT_SITE_RUNNING')) {
+
+                    // Set list of tables that are updated.
+                    require_once(__DIR__.'/../testing/classes/util.php');
+                    testing_util::set_table_modified_by_sql($sql);
+                }
         }
 
         $this->print_debug($sql, $params);
@@ -577,6 +585,11 @@ abstract class moodle_database {
     protected function where_clause($table, array $conditions=null) {
         // We accept nulls in conditions
         $conditions = is_null($conditions) ? array() : $conditions;
+
+        if (empty($conditions)) {
+            return array('', array());
+        }
+
         // Some checks performed under debugging only
         if (debugging()) {
             $columns = $this->get_columns($table);
@@ -600,9 +613,6 @@ abstract class moodle_database {
         }
 
         $allowed_types = $this->allowed_param_types();
-        if (empty($conditions)) {
-            return array('', array());
-        }
         $where = array();
         $params = array();
 
index 8b16565..7e9dc55 100644 (file)
@@ -1432,9 +1432,9 @@ class core_dml_testcase extends database_driver_testcase {
                 $this->assertSame('ddltablenotexist', $e->errorcode);
             }
         }
-        // And without params.
+
         try {
-            $records = $DB->get_records('xxxx', array());
+            $records = $DB->get_records('xxxx', array('id' => '1'));
             $this->fail('An Exception is missing, expected due to query against non-existing table');
         } catch (moodle_exception $e) {
             $this->assertInstanceOf('dml_exception', $e);
@@ -5347,7 +5347,7 @@ class core_dml_testcase extends database_driver_testcase {
 
         // The get_records() method generates 2 queries the first time is called
         // as it is fetching the table structure.
-        $whatever = $DB->get_records($tablename);
+        $whatever = $DB->get_records($tablename, array('id' => '1'));
         $this->assertEquals($initreads + 3, $DB->perf_get_reads());
         $this->assertEquals($initwrites, $DB->perf_get_writes());
 
index 21c5cda..10f02f5 100644 (file)
Binary files a/lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button-debug.js and b/lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button-debug.js differ
index 21c5088..687aea1 100644 (file)
Binary files a/lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button-min.js and b/lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button-min.js differ
index 21c5cda..10f02f5 100644 (file)
Binary files a/lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button.js and b/lib/editor/atto/plugins/rtl/yui/build/moodle-atto_rtl-button/moodle-atto_rtl-button.js differ