From 68049ac848f0e6cdb7a637a8e5888b5adeceaf5d Mon Sep 17 00:00:00 2001 From: Tom Dickman Date: Tue, 9 Jun 2020 17:02:09 +1000 Subject: [PATCH] MDL-65923 core grades: Add a new event for when a grade item is deleted --- lang/en/grades.php | 1 + lib/classes/event/grade_item_deleted.php | 67 ++++++++++++++++++ lib/grade/grade_item.php | 6 ++ lib/tests/event/grade_item_deleted_test.php | 76 +++++++++++++++++++++ 4 files changed, 150 insertions(+) create mode 100644 lib/classes/event/grade_item_deleted.php create mode 100644 lib/tests/event/grade_item_deleted_test.php diff --git a/lang/en/grades.php b/lang/en/grades.php index 11d5b118fa2..e6a73ae7a06 100644 --- a/lang/en/grades.php +++ b/lang/en/grades.php @@ -198,6 +198,7 @@ $string['errorupdatinggradecategoryaggregation'] = 'Error updating the aggregati $string['errorupdatinggradeitemaggregationcoef'] = 'Error updating the aggregation coefficient (weight or extra credit) of grade item ID {$a->id}'; $string['eventgradedeleted'] = 'Grade deleted'; $string['eventgradeitemcreated'] = 'Grade item created'; +$string['eventgradeitemdeleted'] = 'Grade item deleted'; $string['eventgradeitemupdated'] = 'Grade item updated'; $string['eventgradelettercreated'] = 'Grade letter created'; $string['eventgradeletterdeleted'] = 'Grade letter deleted'; diff --git a/lib/classes/event/grade_item_deleted.php b/lib/classes/event/grade_item_deleted.php new file mode 100644 index 00000000000..484ceb2eeb1 --- /dev/null +++ b/lib/classes/event/grade_item_deleted.php @@ -0,0 +1,67 @@ +. + +/** + * Grade item deleted event. + * + * @package core + * @copyright 2020 Tom Dickman + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; + +/** + * Grade item deleted event class. + * + * @package core + * @copyright 2020 Tom Dickman + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class grade_item_deleted extends grade_item_created { + + /** + * Init method. + * + * @return void + */ + protected function init() { + $this->data['objecttable'] = 'grade_items'; + $this->data['crud'] = 'd'; + $this->data['edulevel'] = self::LEVEL_OTHER; + } + + /** + * Return localised event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventgradeitemdeleted', 'core_grades'); + } + + /** + * Returns description of what happened. + * + * @return string + */ + public function get_description() { + return "The user with id '" . $this->userid . "' deleted a grade item with id '" . $this->objectid . "'" . + " of type '" . $this->other['itemtype'] . "' and name '" . $this->other['itemname'] . "'" . + " from the course with the id '" . $this->courseid . "'."; + } + +} diff --git a/lib/grade/grade_item.php b/lib/grade/grade_item.php index 1f21f76eea2..511eb8be6f1 100644 --- a/lib/grade/grade_item.php +++ b/lib/grade/grade_item.php @@ -413,6 +413,12 @@ class grade_item extends grade_object { $this->delete_all_grades($source); $success = parent::delete($source); $transaction->allow_commit(); + + if ($success) { + $event = \core\event\grade_item_deleted::create_from_grade_item($this); + $event->trigger(); + } + return $success; } diff --git a/lib/tests/event/grade_item_deleted_test.php b/lib/tests/event/grade_item_deleted_test.php new file mode 100644 index 00000000000..baf725031e2 --- /dev/null +++ b/lib/tests/event/grade_item_deleted_test.php @@ -0,0 +1,76 @@ +. + +/** + * Grade item deleted event tests. + * + * @package core + * @category test + * @copyright 2020 Tom Dickman + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; + +/** + * Test for grade item deleted event. + * + * @package core + * @category test + * @copyright 2020 Tom Dickman + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @coversDefaultClass \core\event\grade_item_deleted + */ +class grade_item_deleted_testcase extends \advanced_testcase { + + /** + * Test the grade item deleted event. + * + * @covers ::create_from_grade_item + */ + public function test_grade_item_deleted() { + global $DB; + + $this->resetAfterTest(); + + $course = $this->getDataGenerator()->create_course(); + $gradeitemrecord = $this->getDataGenerator()->create_grade_item(['courseid' => $course->id]); + $gradeitem = \grade_item::fetch(['id' => $gradeitemrecord->id, 'courseid' => $course->id]); + + $countgradeitems = $DB->count_records('grade_items'); + + // Trigger and capture the event for deleting a grade item. + $sink = $this->redirectEvents(); + $gradeitem->delete(); + $events = $sink->get_events(); + $sink->close(); + + // Event should only be triggered once. + $this->assertCount(1, $events); + $event = reset($events); + + // Expect that the grade item was deleted and the event data is valid. + $this->assertEquals($countgradeitems - 1, $DB->count_records('grade_items')); + $this->assertInstanceOf('\core\event\grade_item_deleted', $event); + $eventdata = $event->get_data(); + $this->assertEquals($gradeitem->id, $eventdata['objectid']); + $this->assertEquals($gradeitem->courseid, $eventdata['courseid']); + $this->assertEquals(\context_course::instance($gradeitem->courseid)->id, $eventdata['contextid']); + $this->assertEquals($gradeitem->itemname, $eventdata['other']['itemname']); + $this->assertEquals($gradeitem->itemtype, $eventdata['other']['itemtype']); + $this->assertEquals($gradeitem->itemmodule, $eventdata['other']['itemmodule']); + } +}