MDL-63622 core_grading: Add support for removal of context users.
[moodle.git] / grade / grading / tests / fixtures / marking_guide.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * A test guide class fixture.
19  *
20  * @package    core_grading
21  * @category   test
22  * @copyright  2018 Adrian Greeve <adriangreeve.com>
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 defined('MOODLE_INTERNAL') || die();
28 /**
29  * Convenience class to create marking guides.
30  *
31  * @copyright  2018 Adrian Greeve <adriangreeve.com>
32  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
33  */
34 class test_guide {
36     /** @var array $criteria Criteria for this marking guide. */
37     protected $criteria = [];
38     /** @var context $context The context that this marking guide is used in. */
39     protected $context;
40     /** @var string $name The name of this marking guide. */
41     protected $name;
42     /** @var string $text A description of this marking guide. */
43     protected $text;
44     /** @var integer $criterionid The current id for the criterion. */
45     protected $criterionid = 0;
46     /** @var integer $sortorder The current id for the sort order. */
47     protected $sortorder = 0;
48     /** @var gradingform_controller The grading form controller. */
49     protected $controller;
51     /** @var grading_manager $manager The grading manager to handle creating the real marking guide. */
52     public $manager;
54     /**
55      * The constuctor for this test_guide object.
56      *
57      * @param context $context The context that this marking guide is used in.
58      * @param string $name The name of the marking guide.
59      * @param string $text The description of the marking guide.
60      */
61     public function __construct($context, $name, $text) {
62         $this->context = $context;
63         $this->name = $name;
64         $this->text = $text;
65         $this->manager = get_grading_manager();
66         $this->manager->set_context($context);
67         $this->manager->set_component('mod_assign');
68         $this->manager->set_area('submission');
69     }
71     /**
72      * Uses the appropriate data and APIs to create a marking guide.
73      */
74     public function create_guide() {
76         $data = (object) [
77             'areaid' => $this->context->id,
78             'returnurl' => '',
79             'name' => $this->name,
80             'description_editor' => [
81                 'text' => $this->text,
82                 'format' => 1,
83                 'itemid' => 1
84             ],
85             'guide' => [
86                 'criteria' => $this->criteria,
87                 'options' => [
88                     'alwaysshowdefinition' => 1,
89                     'showmarkspercriterionstudents' => 1
90                 ],
91                 'comments' => []
92             ],
93             'saveguide' => 'Continue',
94             'status' => 20
95         ];
97         $this->controller = $this->manager->get_controller('guide');
98         $this->controller->update_definition($data);
99     }
101     /**
102      * Adds criteria to the marking guide.
103      *
104      * @param string $shortname The shortname for the criterion.
105      * @param string $description The description for the criterion.
106      * @param string $descriptionmarkers The description for the marker for this criterion.
107      * @param int $maxscore The maximum score possible for this criterion.
108      */
109     public function add_criteria($shortname, $description, $descriptionmarkers, $maxscore) {
110         $this->criterionid++;
111         $this->sortorder++;
112         $this->criteria['NEWID' . $this->criterionid] = [
113             'sortorder' => $this->sortorder,
114             'shortname' => $shortname,
115             'description' => $description,
116             'descriptionmarkers' => $descriptionmarkers,
117             'maxscore' => $maxscore
118         ];
119     }
121     /**
122      * Update the grade for the item provided.
123      * Keep the gradeinfo array in the same order as the definition of the criteria.
124      * The array should be [['remark' => remark, 'score' => intvalue],['remark' => remark, 'score' => intvalue]]
125      * for a guide that has two criteria.
126      *
127      * @param  int $userid The user we are updating.
128      * @param  int $itemid The itemid that the grade will be for
129      * @param  array $gradeinfo Comments and grades for the grade.
130      * @return gradingform_guide_instance The created instance associated with the grade created.
131      */
132     public function grade_item(int $userid, int $itemid, array $gradeinfo) : gradingform_guide_instance {
133         global $DB;
135         if (!isset($this->controller)) {
136             throw new Exception("Please call create_guide before calling this method", 1);
137         }
139         $instance = $this->controller->create_instance($userid, $itemid);
141         // I need the ids for the criteria and there doesn't seem to be a nice method to get it.
142         $criteria = $DB->get_records('gradingform_guide_criteria');
143         $data = ['criteria' => []];
144         $i = 0;
145         // The sort order should keep everything here in order.
146         foreach ($criteria as $key => $value) {
147             $data['criteria'][$key]['remark'] = $gradeinfo[$i]['remark'];
148             $data['criteria'][$key]['remarkformat'] = 0;
149             $data['criteria'][$key]['score'] = $gradeinfo[$i]['score'];
150             $i++;
151         }
152         $data['itemid'] = $itemid;
154         // Update this instance with data.
155         $instance->update($data);
156         return $instance;
157     }