MDL-82057 backup: Badges independent of user data and activities

The dependency of badges on user data and activities has been
removed when copying, importing, or creating backups in courses.
Now, badges can be imported or copied even if user data and activities
are not selected:

- If user data is not selected (during backup or course copying), the badge
information (name, description, image, etc.) and criteria will be included,
but the users who have been awarded the badge will be excluded.

- If activities are not selected (during backup), the badge information
(name, description, image, etc.) will be copied, but the criteria and users
who have been awarded the badge will be excluded.
This commit is contained in:
Sara Arjona
2024-07-09 07:49:57 +02:00
parent 7d7a871edd
commit 092e2d1ec7
4 changed files with 88 additions and 24 deletions
@@ -139,8 +139,6 @@ class backup_root_task extends backup_task {
$badges = new backup_badges_setting('badges', base_setting::IS_BOOLEAN, true);
$badges->set_ui(new backup_setting_ui_checkbox($badges, get_string('rootsettingbadges', 'backup')));
$this->add_setting($badges);
$activities->add_dependency($badges);
$users->add_dependency($badges);
// Define calendar events.
$events = new backup_calendarevents_setting('calendarevents', base_setting::IS_BOOLEAN, true);
+23 -22
View File
@@ -914,14 +914,6 @@ class backup_comments_structure_step extends backup_structure_step {
*/
class backup_badges_structure_step extends backup_structure_step {
protected function execute_condition() {
// Check that all activities have been included.
if ($this->task->is_excluding_activities()) {
return false;
}
return true;
}
protected function define_structure() {
global $CFG;
@@ -965,10 +957,16 @@ class backup_badges_structure_step extends backup_structure_step {
// Build the tree.
$badges->add_child($badge);
$badge->add_child($criteria);
$criteria->add_child($criterion);
$criterion->add_child($parameters);
$parameters->add_child($parameter);
// Have the activities been included? Only if that's the case, the criteria will be included too.
$activitiesincluded = !$this->task->is_excluding_activities();
if ($activitiesincluded) {
$badge->add_child($criteria);
$criteria->add_child($criterion);
$criterion->add_child($parameters);
$parameters->add_child($parameter);
}
$badge->add_child($endorsement);
$badge->add_child($alignments);
$alignments->add_child($alignment);
@@ -990,19 +988,20 @@ class backup_badges_structure_step extends backup_structure_step {
'courseid' => backup::VAR_COURSEID
];
$badge->set_source_sql($parametersql, $parameterparams);
$criterion->set_source_table('badge_criteria', array('badgeid' => backup::VAR_PARENTID));
if ($activitiesincluded) {
$criterion->set_source_table('badge_criteria', ['badgeid' => backup::VAR_PARENTID]);
$parametersql = 'SELECT cp.*, c.criteriatype
FROM {badge_criteria_param} cp JOIN {badge_criteria} c
ON cp.critid = c.id
WHERE critid = :critid';
$parameterparams = ['critid' => backup::VAR_PARENTID];
$parameter->set_source_sql($parametersql, $parameterparams);
}
$endorsement->set_source_table('badge_endorsement', array('badgeid' => backup::VAR_PARENTID));
$alignment->set_source_table('badge_alignment', array('badgeid' => backup::VAR_PARENTID));
$relatedbadge->set_source_table('badge_related', array('badgeid' => backup::VAR_PARENTID));
$parametersql = 'SELECT cp.*, c.criteriatype
FROM {badge_criteria_param} cp JOIN {badge_criteria} c
ON cp.critid = c.id
WHERE critid = :critid';
$parameterparams = array('critid' => backup::VAR_PARENTID);
$parameter->set_source_sql($parametersql, $parameterparams);
$manual_award->set_source_table('badge_manual_award', array('badgeid' => backup::VAR_PARENTID));
$tag->set_source_sql('SELECT t.id, t.name, t.rawname
@@ -1015,8 +1014,10 @@ class backup_badges_structure_step extends backup_structure_step {
$badge->annotate_ids('user', 'usercreated');
$badge->annotate_ids('user', 'usermodified');
$criterion->annotate_ids('badge', 'badgeid');
$parameter->annotate_ids('criterion', 'critid');
if ($activitiesincluded) {
$criterion->annotate_ids('badge', 'badgeid');
$parameter->annotate_ids('criterion', 'critid');
}
$endorsement->annotate_ids('badge', 'badgeid');
$alignment->annotate_ids('badge', 'badgeid');
$relatedbadge->annotate_ids('badge', 'badgeid');
@@ -55,3 +55,25 @@ Feature: Import course's contents into another course
| Initial | Include permission overrides | 0 |
And I am on the "Course 2" "permissions" page
Then I should see "Non-editing teacher (0)"
Scenario: Import course badges to another course
Given I log in as "teacher1"
And the following "core_badges > Badges" exist:
| name | course | description | image | status | type |
| Published course badge | C1 | Badge description | badges/tests/behat/badge.png | active | 2 |
| Unpublished course badge | C1 | Badge description | badges/tests/behat/badge.png | 0 | 2 |
| Unpublished without criteria course badge | C1 | Badge description | badges/tests/behat/badge.png | 0 | 2 |
And the following "core_badges > Criterias" exist:
| badge | role |
| Published course badge | editingteacher |
| Unpublished course badge | editingteacher |
When I import "Course 1" course into "Course 2" course using this options:
| Settings | Include badges | 1 |
And I navigate to "Badges > Manage badges" in current page administration
Then I should see "Published course badge"
And I should see "Unpublished course badge"
And I should see "Unpublished without criteria course badge"
# Badges exist and the criteria have been restored too.
And I should not see "Criteria for this badge have not been set up yet" in the "Published course badge" "table_row"
And I should not see "Criteria for this badge have not been set up yet" in the "Unpublished course badge" "table_row"
And I should see "Criteria for this badge have not been set up yet" in the "Unpublished without criteria course badge" "table_row"
@@ -255,3 +255,46 @@ Feature: Restore Moodle 2 course backups
| Settings | Include permission overrides | 0 |
Then I am on the "Course 1 copy 1" "permissions" page
And I should see "Non-editing teacher (0)"
@javascript @core_badges
Scenario Outline: Restore course badges
Given the following "core_badges > Badges" exist:
| name | course | description | image | status | type |
| Published course badge | C1 | Badge description | badges/tests/behat/badge.png | active | 2 |
| Unpublished course badge | C1 | Badge description | badges/tests/behat/badge.png | 0 | 2 |
| Unpublished without criteria course badge | C1 | Badge description | badges/tests/behat/badge.png | 0 | 2 |
And the following "core_badges > Criterias" exist:
| badge | role |
| Published course badge | editingteacher |
| Unpublished course badge | editingteacher |
And I backup "Course 1" course using this options:
| Initial | Include badges | 1 |
| Initial | Include activities and resources | <includeactivities> |
| Initial | Include enrolled users | 0 |
| Initial | Include blocks | 0 |
| Initial | Include files | 0 |
| Initial | Include filters | 0 |
| Initial | Include calendar events | 0 |
| Initial | Include question bank | 0 |
| Initial | Include groups and groupings | 0 |
| Initial | Include competencies | 0 |
| Initial | Include custom fields | 0 |
| Initial | Include calendar events | 0 |
| Initial | Include content bank content | 0 |
| Initial | Include legacy course files | 0 |
| Confirmation | Filename | test_backup.mbz |
When I restore "test_backup.mbz" backup into a new course using this options:
| Settings | Include badges | 1 |
And I navigate to "Badges > Manage badges" in current page administration
Then I should see "Published course badge"
And I should see "Unpublished course badge"
And I should see "Unpublished without criteria course badge"
# If activities were included, the criteria have been restored too; otherwise no criteria have been set up for badges.
And I <shouldornotsee> "Criteria for this badge have not been set up yet" in the "Published course badge" "table_row"
And I <shouldornotsee> "Criteria for this badge have not been set up yet" in the "Unpublished course badge" "table_row"
And I should see "Criteria for this badge have not been set up yet" in the "Unpublished without criteria course badge" "table_row"
Examples:
| includeactivities | shouldornotsee |
| 0 | should see |
| 1 | should not see |