MDL-46978 core_grades: preserve category total visibility
authorNathan Nguyen <nathannguyen@catalyst-au.net>
Thu, 12 Sep 2019 02:10:13 +0000 (12:10 +1000)
committerNathan Nguyen <nathannguyen@catalyst-au.net>
Thu, 19 Sep 2019 04:05:01 +0000 (14:05 +1000)
lib/grade/grade_category.php
lib/grade/grade_item.php
lib/grade/tests/grade_category_test.php

index a668f23..f9130cd 100644 (file)
@@ -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);
             }
         }
     }
index 715ace9..9cb8385 100644 (file)
@@ -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);
             }
         }
     }
index 86201f1..03a6fe1 100644 (file)
@@ -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());
+    }
 }