From 9639cb487eaea8320bacf1fd10206c5dbfde934b Mon Sep 17 00:00:00 2001 From: Jun Pataleta Date: Tue, 6 Nov 2018 11:44:58 +0800 Subject: [PATCH] MDL-58454 badges: Fix related badge deletion * When deleting a badge, delete badge_related records where this badge is also set as the related badge. --- badges/tests/badgeslib_test.php | 39 +++++++++++++++++++++++++++++++++++++++ lib/badgeslib.php | 7 ++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/badges/tests/badgeslib_test.php b/badges/tests/badgeslib_test.php index 86d6ecb6cd7..d577c787155 100644 --- a/badges/tests/badgeslib_test.php +++ b/badges/tests/badgeslib_test.php @@ -203,6 +203,45 @@ class core_badges_badgeslib_testcase extends advanced_testcase { $this->assertAttributeEquals(BADGE_STATUS_ARCHIVED, 'status', $badge); } + /** + * Really delete the badge. + */ + public function test_delete_badge_for_real() { + global $DB; + + $badge = new badge($this->badgeid); + + $newid1 = $badge->make_clone(); + $newid2 = $badge->make_clone(); + $newid3 = $badge->make_clone(); + + // Insert related badges to badge 1. + $badge->add_related_badges([$newid1, $newid2, $newid3]); + + // Another badge. + $badge2 = new badge($newid2); + // Make badge 1 related for badge 2. + $badge2->add_related_badges([$this->badgeid]); + + // Confirm that the records about this badge about its relations have been removed as well. + $relatedsql = 'badgeid = :badgeid OR relatedbadgeid = :relatedbadgeid'; + $relatedparams = array( + 'badgeid' => $this->badgeid, + 'relatedbadgeid' => $this->badgeid + ); + // Badge 1 has 4 related records. 3 where it's the badgeid, 1 where it's the relatedbadgeid. + $this->assertEquals(4, $DB->count_records_select('badge_related', $relatedsql, $relatedparams)); + + // Delete the badge for real. + $badge->delete(false); + + // Confirm that the badge itself has been removed. + $this->assertFalse($DB->record_exists('badge', ['id' => $this->badgeid])); + + // Confirm that the records about this badge about its relations have been removed as well. + $this->assertFalse($DB->record_exists_select('badge_related', $relatedsql, $relatedparams)); + } + public function test_create_badge_criteria() { $badge = new badge($this->badgeid); $criteria_overall = award_criteria::build(array('criteriatype' => BADGE_CRITERIA_TYPE_OVERALL, 'badgeid' => $badge->id)); diff --git a/lib/badgeslib.php b/lib/badgeslib.php index 84241df85ec..544b37f2991 100644 --- a/lib/badgeslib.php +++ b/lib/badgeslib.php @@ -716,7 +716,12 @@ class badge { // Delete endorsements, competencies and related badges. $DB->delete_records('badge_endorsement', array('badgeid' => $this->id)); - $DB->delete_records('badge_related', array('badgeid' => $this->id)); + $relatedsql = 'badgeid = :badgeid OR relatedbadgeid = :relatedbadgeid'; + $relatedparams = array( + 'badgeid' => $this->id, + 'relatedbadgeid' => $this->id + ); + $DB->delete_records_select('badge_related', $relatedsql, $relatedparams); $DB->delete_records('badge_competencies', array('badgeid' => $this->id)); // Finally, remove badge itself. -- 2.11.4.GIT