diff --git a/badges/classes/observer.php b/badges/classes/observer.php
index 511d2f454ea..9817a65131f 100644
--- a/badges/classes/observer.php
+++ b/badges/classes/observer.php
@@ -14,20 +14,17 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see .
+defined('MOODLE_INTERNAL') || die();
+
+use \core_badges\badge;
+
/**
- * Local stuff for category enrolment plugin.
+ * Event observer for badges.
*
* @package core_badges
* @copyright 2013 Rajesh Taneja
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-
-defined('MOODLE_INTERNAL') || die();
-
-use \core_badges\badge;
-/**
- * Event observer for badges.
- */
class core_badges_observer {
/**
* Triggered when 'course_module_completion_updated' event is triggered.
diff --git a/badges/criteria/award_criteria_activity.php b/badges/criteria/award_criteria_activity.php
index f303abf7ed6..1fea3769e35 100644
--- a/badges/criteria/award_criteria_activity.php
+++ b/badges/criteria/award_criteria_activity.php
@@ -188,8 +188,6 @@ class award_criteria_activity extends award_criteria {
* @return bool Whether criteria is complete
*/
public function review($userid, $filtered = false) {
- $completionstates = array(COMPLETION_COMPLETE, COMPLETION_COMPLETE_PASS, COMPLETION_COMPLETE_FAIL);
-
if ($this->course->startdate > time()) {
return false;
}
@@ -209,6 +207,15 @@ class award_criteria_activity extends award_criteria {
$check_date = ($date <= $param['bydate']);
}
+ // Successfull completion states depend on the completion settings.
+ if (isset($data->passgrade)) {
+ // Passing grade is required. Don't issue a badge when state is COMPLETION_COMPLETE_FAIL.
+ $completionstates = [COMPLETION_COMPLETE, COMPLETION_COMPLETE_PASS];
+ } else {
+ // Any grade is required. Issue a badge even when state is COMPLETION_COMPLETE_FAIL.
+ $completionstates = [COMPLETION_COMPLETE, COMPLETION_COMPLETE_PASS, COMPLETION_COMPLETE_FAIL];
+ }
+
if ($this->method == BADGE_CRITERIA_AGGREGATION_ALL) {
if (in_array($data->completionstate, $completionstates) && $check_date) {
$overall = true;
diff --git a/badges/tests/behat/criteria_activity.feature b/badges/tests/behat/criteria_activity.feature
index 015ee0950b0..e5f5b5f58f9 100644
--- a/badges/tests/behat/criteria_activity.feature
+++ b/badges/tests/behat/criteria_activity.feature
@@ -1,14 +1,14 @@
-@mod @mod_quiz @core @core_badges @javascript
+@mod @mod_quiz @core @core_badges @core_completion @javascript
Feature: Award badges based on activity completion
In order to ensure a student has learned the material before being marked complete
As a teacher
- I need to set a quiz to award a badge when upon completion when the student receives a passing grade, or completed_fail if they use all attempts without passing
+ I need to configure an activity to grant a badge only when the student achieves a passing grade upon completion.
Background:
Given the following "users" exist:
| username | firstname | lastname | email |
| student1 | Student | 1 | student1@example.com |
- | student2 | Student | 1 | student2@example.com |
+ | student2 | Student | 2 | student2@example.com |
| teacher1 | Teacher | 1 | teacher1@example.com |
And the following "courses" exist:
| fullname | shortname | category | enablecompletion |
@@ -27,96 +27,103 @@ Feature: Award badges based on activity completion
| questioncategory | qtype | name | questiontext |
| Test questions | truefalse | First question | Answer the first question |
And the following "activities" exist:
- | activity | name | course | idnumber | attempts | gradepass | completion | completionattemptsexhausted | completionpassgrade | completionusegrade |
- | quiz | Test quiz name | C1 | quiz1 | 2 | 5.00 | 2 | 1 | 1 | 1 |
- And quiz "Test quiz name" contains the following questions:
+ | activity | name | course | idnumber | attempts | gradepass | completion | completionpassgrade | completionusegrade |
+ | quiz | Test quiz name 1 | C1 | quiz1 | 2 | 5.00 | 2 | 1 | 1 |
+ | quiz | Test quiz name 2 | C1 | quiz2 | 2 | 5.00 | 2 | 0 | 1 |
+ And quiz "Test quiz name 1" contains the following questions:
+ | question | page |
+ | First question | 1 |
+ And quiz "Test quiz name 2" contains the following questions:
| question | page |
| First question | 1 |
- And user "student1" has attempted "Test quiz name" with responses:
- | slot | response |
- | 1 | False |
- And user "student2" has attempted "Test quiz name" with responses:
- | slot | response |
- | 1 | False |
And the following "core_badges > Badge" exists:
- | name | Course Badge |
+ | name | Course Badge 1 |
| status | 0 |
| type | 2 |
| course | C1 |
- | description | Course badge description |
+ | description | Course badge 1 description |
| image | badges/tests/behat/badge.png |
+ And the following "core_badges > Badge" exists:
+ | name | Course Badge 2 |
+ | status | 0 |
+ | type | 2 |
+ | course | C1 |
+ | description | Course badge 2 description |
+ | image | badges/tests/behat/badge.png |
+ And I am on the "Course 1" course page logged in as teacher1
- Scenario: Student earns a badge using activity completion, but does not get passing grade
- Given I am on the "Course 1" course page logged in as teacher1
- And I navigate to "Badges" in current page administration
+ Scenario: Student does not earn a badge using activity completion when does not get passing grade
+ Given I navigate to "Badges" in current page administration
And I press "Manage badges"
- And I follow "Course Badge"
+ And I follow "Course Badge 1"
And I select "Criteria" from the "jump" singleselect
And I set the field "type" to "Activity completion"
- And I set the field "Quiz - Test quiz name" to "1"
+ And I set the field "Quiz - Test quiz name 1" to "1"
And I press "Save"
And I press "Enable access"
And I press "Continue"
And I should see "Recipients (0)"
- And I log out
- And I am on the "Course 1" course page logged in as student1
- And the "Receive a grade" completion condition of "Test quiz name" is displayed as "done"
- And the "Receive a passing grade" completion condition of "Test quiz name" is displayed as "failed"
- And the "Receive a pass grade or complete all available attempts" completion condition of "Test quiz name" is displayed as "todo"
- When I am on the "Test quiz name" "quiz activity" page
- And I press "Re-attempt quiz"
- And I set the field "False" to "1"
- And I press "Finish attempt ..."
- And I press "Submit all and finish"
- And I click on "Submit" "button" in the "Submit all your answers and finish?" "dialogue"
- And I log out
-
- And I am on the "Course 1" course page logged in as teacher1
+ # Pass grade for student1. Activity is considered complete because student1 got a passing grade.
+ And user "student1" has attempted "Test quiz name 1" with responses:
+ | slot | response |
+ | 1 | True |
+ # Fail grade for student2. Activity is considered incomplete because student2 got a failing grade.
+ And user "student2" has attempted "Test quiz name 1" with responses:
+ | slot | response |
+ | 1 | False |
And I navigate to "Badges > Manage badges" in current page administration
- And I follow "Course Badge"
+ And I follow "Course Badge 1"
Then I should see "Recipients (1)"
+ And I select "Recipients (1)" from the "jump" singleselect
+ And I should see "Student 1"
+ And I should not see "Student 2"
- Scenario Outline: Previously graded pass/fail students should earn a badge after enabling a badge
- Given I am on the "Course 1" course page logged in as teacher1
- And I navigate to "Badges" in current page administration
+ Scenario: Students with any grades in an activity will receive a badge if the completion condition is set to receive any grade
+ Given I navigate to "Badges" in current page administration
And I press "Manage badges"
- And I follow "Course Badge"
+ And I follow "Course Badge 2"
And I select "Criteria" from the "jump" singleselect
And I set the field "type" to "Activity completion"
- And I click on "Expand all" "link" in the "region-main" "region"
- And I set the field "Quiz - Test quiz name" to "1"
- And I set the field "" to "1"
+ And I set the field "Quiz - Test quiz name 2" to "1"
And I press "Save"
-
- # Fail grade with student2
- And I am on the "Course 1" course page logged in as student2
- And I am on the "Test quiz name" "quiz activity" page
- And I press "Re-attempt quiz"
- And I set the field "False" to "1"
- And I press "Finish attempt ..."
- And I press "Submit all and finish"
- And I click on "Submit" "button" in the "Submit all your answers and finish?" "dialogue"
- And I log out
-
- # Pass grade with student1
- And I am on the "Course 1" course page logged in as student1
- And I am on the "Test quiz name" "quiz activity" page
- And I press "Re-attempt quiz"
- And I set the field "False" to "0"
- And I press "Finish attempt ..."
- And I press "Submit all and finish"
- And I click on "Submit" "button" in the "Submit all your answers and finish?" "dialogue"
- And I log out
-
- # Enable badge access once all students have completed an activity.
- And I am on the "Course 1" course page logged in as teacher1
+ And I press "Enable access"
+ And I press "Continue"
+ # Pass grade for student1.
+ And user "student1" has attempted "Test quiz name 2" with responses:
+ | slot | response |
+ | 1 | True |
+ # Fail grade for student2. Activity is considered complete even if student2 got a failing grade.
+ And user "student2" has attempted "Test quiz name 2" with responses:
+ | slot | response |
+ | 1 | False |
And I navigate to "Badges > Manage badges" in current page administration
- And I follow "Course Badge"
+ And I follow "Course Badge 2"
+ Then I should see "Recipients (2)"
+ And I select "Recipients (2)" from the "jump" singleselect
+ And I should see "Student 1"
+ And I should see "Student 2"
+
+ Scenario: Previously graded pass/fail students should earn a badge after enabling a badge
+ # Pass grade for student1.
+ Given user "student1" has attempted "Test quiz name 1" with responses:
+ | slot | response |
+ | 1 | True |
+ # Fail grade for student2.
+ And user "student2" has attempted "Test quiz name 1" with responses:
+ | slot | response |
+ | 1 | False |
+ And I navigate to "Badges" in current page administration
+ And I press "Manage badges"
+ And I follow "Course Badge 1"
+ And I select "Criteria" from the "jump" singleselect
+ And I set the field "type" to "Activity completion"
+ And I set the field "Quiz - Test quiz name 1" to "1"
+ And I press "Save"
+ # Enable badge access once students have completed the activity.
When I press "Enable access"
And I press "Continue"
- Then I should see "Recipients (2)"
-
- Examples:
- | aggregationcriteria |
- | Any of the selected activities is complete |
- | All of the selected activities are complete |
+ # Only student1 should earn the badge because student2 did not pass the quiz.
+ Then I should see "Recipients (1)"
+ And I select "Recipients (1)" from the "jump" singleselect
+ And I should see "Student 1"
+ And I should not see "Student 2"