From 2aaac3f67093e81912ba9971dc7e40a56d5c22a4 Mon Sep 17 00:00:00 2001 From: Nathan Nguyen Date: Thu, 12 Sep 2019 12:10:13 +1000 Subject: [PATCH] MDL-46978 core_grades: preserve category total visibility --- lib/grade/grade_category.php | 9 +++--- lib/grade/grade_item.php | 4 +-- lib/grade/tests/grade_category_test.php | 42 ++++++++++++++++++++++++- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index a668f23be59..f9130cdec06 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -2589,13 +2589,14 @@ class grade_category extends grade_object { */ public function set_hidden($hidden, $cascade=false) { $this->load_grade_item(); - //this hides the associated grade item (the course total) - $this->grade_item->set_hidden($hidden, $cascade); //this hides the category itself and everything it contains parent::set_hidden($hidden, $cascade); if ($cascade) { + // This hides the associated grade item (the course/category total). + $this->grade_item->set_hidden($hidden, $cascade); + if ($children = grade_item::fetch_all(array('categoryid'=>$this->id))) { foreach ($children as $child) { @@ -2619,9 +2620,7 @@ class grade_category extends grade_object { if ($category_array && array_key_exists($this->parent, $category_array)) { $category = $category_array[$this->parent]; //call set_hidden on the category regardless of whether it is hidden as its parent might be hidden - //if($category->is_hidden()) { - $category->set_hidden($hidden, false); - //} + $category->set_hidden($hidden, false); } } } diff --git a/lib/grade/grade_item.php b/lib/grade/grade_item.php index 715ace93952..9cb8385adeb 100644 --- a/lib/grade/grade_item.php +++ b/lib/grade/grade_item.php @@ -681,9 +681,7 @@ class grade_item extends grade_object { if ($category_array && array_key_exists($this->categoryid, $category_array)) { $category = $category_array[$this->categoryid]; //call set_hidden on the category regardless of whether it is hidden as its parent might be hidden - //if($category->is_hidden()) { - $category->set_hidden($hidden, false); - //} + $category->set_hidden($hidden, false); } } } diff --git a/lib/grade/tests/grade_category_test.php b/lib/grade/tests/grade_category_test.php index 86201f1f6c0..03a6fe1e527 100644 --- a/lib/grade/tests/grade_category_test.php +++ b/lib/grade/tests/grade_category_test.php @@ -63,6 +63,7 @@ class core_grade_category_testcase extends grade_base_testcase { $this->sub_test_grade_category_is_hidden(); $this->sub_test_grade_category_set_hidden(); $this->sub_test_grade_category_can_control_visibility(); + $this->sub_test_grade_category_total_visibility(); // This won't work until MDL-11837 is complete. // $this->sub_test_grade_category_generate_grades(); @@ -784,7 +785,7 @@ class core_grade_category_testcase extends grade_base_testcase { protected function sub_test_grade_category_set_hidden() { $category = new grade_category($this->grade_categories[0]); $this->assertTrue(method_exists($category, 'set_hidden')); - $category->set_hidden(1); + $category->set_hidden(1, true); $category->load_grade_item(); $this->assertEquals(true, $category->grade_item->is_hidden()); } @@ -858,4 +859,43 @@ class core_grade_category_testcase extends grade_base_testcase { $this->assertFalse(grade_category::aggregation_uses_extracredit(GRADE_AGGREGATE_MIN)); $this->assertFalse(grade_category::aggregation_uses_extracredit(GRADE_AGGREGATE_MODE)); } + + /** + * Test for category total visibility. + */ + protected function sub_test_grade_category_total_visibility() { + // 15 is a manual grade item in grade_categories[5]. + $category = new grade_category($this->grade_categories[5], true); + $gradeitem = new grade_item($this->grade_items[15], true); + + // Hide grade category. + $category->set_hidden(true, true); + $this->assertTrue($category->is_hidden()); + // Category total is hidden. + $categorytotal = $category->get_grade_item(); + $this->assertTrue($categorytotal->is_hidden()); + // Manual grade is hidden. + $gradeitem->update_from_db(); + $this->assertTrue($gradeitem->is_hidden()); + + // Unhide manual grade item. + $gradeitem->set_hidden(false); + $this->assertFalse($gradeitem->is_hidden()); + // Category is unhidden. + $category->update_from_db(); + $this->assertFalse($category->is_hidden()); + // Category total remain hidden. + $categorytotal = $category->get_grade_item(); + $this->assertTrue($categorytotal->is_hidden()); + + // Edit manual grade item. + $this->assertFalse($gradeitem->is_locked()); + $gradeitem->set_locked(true); + $gradeitem->update_from_db(); + $this->assertTrue($gradeitem->is_locked()); + // Category total should still be hidden. + $category->update_from_db(); + $categorytotal = $category->get_grade_item(); + $this->assertTrue($categorytotal->is_hidden()); + } }