MDL-64506 templates: replace spans where and col-x appears
[moodle.git] / admin / tool / analytics / model.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  * Model-related actions.
19  *
20  * @package    tool_analytics
21  * @copyright  2017 David Monllao {@link http://www.davidmonllao.com}
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 require_once(__DIR__ . '/../../../config.php');
26 require_once($CFG->libdir . '/filelib.php');
28 $id = required_param('id', PARAM_INT);
29 $action = required_param('action', PARAM_ALPHANUMEXT);
31 require_login();
33 $model = new \core_analytics\model($id);
34 \core_analytics\manager::check_can_manage_models();
36 $returnurl = new \moodle_url('/admin/tool/analytics/index.php');
37 $params = array('id' => $id, 'action' => $action);
38 $url = new \moodle_url('/admin/tool/analytics/model.php', $params);
40 switch ($action) {
42     case 'edit':
43         $title = get_string('editmodel', 'tool_analytics', $model->get_target()->get_name());
44         break;
45     case 'evaluate':
46         $title = get_string('evaluatemodel', 'tool_analytics');
47         break;
48     case 'getpredictions':
49         $title = get_string('getpredictions', 'tool_analytics');
50         break;
51     case 'log':
52         $title = get_string('viewlog', 'tool_analytics');
53         break;
54     case 'enable':
55         $title = get_string('enable');
56         break;
57     case 'disable':
58         $title = get_string('disable');
59         break;
60     case 'delete':
61         $title = get_string('delete');
62         break;
63     case 'exportdata':
64         $title = get_string('exporttrainingdata', 'tool_analytics');
65         break;
66     case 'exportmodel':
67         $title = get_string('exportmodel', 'tool_analytics');
68         break;
69     case 'clear':
70         $title = get_string('clearpredictions', 'tool_analytics');
71         break;
72     case 'invalidanalysables':
73         $title = get_string('invalidanalysables', 'tool_analytics');
74         break;
75     default:
76         throw new moodle_exception('errorunknownaction', 'analytics');
77 }
79 \tool_analytics\output\helper::set_navbar($title, $url);
81 $onlycli = get_config('analytics', 'onlycli');
82 if ($onlycli === false) {
83     // Default applied if no config found.
84     $onlycli = 1;
85 }
87 switch ($action) {
89     case 'enable':
90         confirm_sesskey();
92         $model->enable();
93         redirect($returnurl);
94         break;
96     case 'disable':
97         confirm_sesskey();
99         $model->update(0, false, false);
100         redirect($returnurl);
101         break;
103     case 'delete':
104         confirm_sesskey();
106         $model->delete();
107         redirect($returnurl);
108         break;
110     case 'edit':
111         confirm_sesskey();
113         if ($model->is_static()) {
114             echo $OUTPUT->header();
115             throw new moodle_exception('errornostaticedit', 'tool_analytics');
116         }
118         $customdata = array(
119             'id' => $model->get_id(),
120             'trainedmodel' => $model->is_trained(),
121             'indicators' => $model->get_potential_indicators(),
122             'timesplittings' => \core_analytics\manager::get_all_time_splittings(),
123             'predictionprocessors' => \core_analytics\manager::get_all_prediction_processors()
124         );
125         $mform = new \tool_analytics\output\form\edit_model(null, $customdata);
127         if ($mform->is_cancelled()) {
128             redirect($returnurl);
130         } else if ($data = $mform->get_data()) {
132             // Converting option names to class names.
133             $indicators = array();
134             foreach ($data->indicators as $indicator) {
135                 $indicatorclass = \tool_analytics\output\helper::option_to_class($indicator);
136                 $indicators[] = \core_analytics\manager::get_indicator($indicatorclass);
137             }
138             $timesplitting = \tool_analytics\output\helper::option_to_class($data->timesplitting);
139             $predictionsprocessor = \tool_analytics\output\helper::option_to_class($data->predictionsprocessor);
140             $model->update($data->enabled, $indicators, $timesplitting, $predictionsprocessor);
141             redirect($returnurl);
142         }
144         echo $OUTPUT->header();
146         $modelobj = $model->get_model_obj();
148         $callable = array('\tool_analytics\output\helper', 'class_to_option');
149         $modelobj->indicators = array_map($callable, json_decode($modelobj->indicators));
150         $modelobj->timesplitting = \tool_analytics\output\helper::class_to_option($modelobj->timesplitting);
151         $modelobj->predictionsprocessor = \tool_analytics\output\helper::class_to_option($modelobj->predictionsprocessor);
152         $mform->set_data($modelobj);
153         $mform->display();
154         break;
156     case 'evaluate':
157         confirm_sesskey();
159         echo $OUTPUT->header();
161         if ($model->is_static()) {
162             throw new moodle_exception('errornostaticevaluate', 'tool_analytics');
163         }
165         if ($onlycli) {
166             throw new moodle_exception('erroronlycli', 'tool_analytics');
167         }
169         // Web interface is used by people who can not use CLI nor code stuff, always use
170         // cached stuff as they will change the model through the web interface as well
171         // which invalidates the previously analysed stuff.
172         $options = ['reuseprevanalysed' => true];
174         $mode = optional_param('mode', false, PARAM_ALPHANUM);
175         if ($mode == 'trainedmodel') {
176             $options['mode'] = 'trainedmodel';
177         }
178         $results = $model->evaluate($options);
179         $renderer = $PAGE->get_renderer('tool_analytics');
180         echo $renderer->render_evaluate_results($results, $model->get_analyser()->get_logs());
181         break;
183     case 'getpredictions':
184         confirm_sesskey();
186         echo $OUTPUT->header();
188         if ($onlycli) {
189             throw new moodle_exception('erroronlycli', 'tool_analytics');
190         }
192         $trainresults = $model->train();
193         $trainlogs = $model->get_analyser()->get_logs();
195         // Looks dumb to get a new instance but better be conservative.
196         $model = new \core_analytics\model($model->get_model_obj());
197         if ($model->is_trained()) {
198             $predictresults = $model->predict();
199             $predictlogs = $model->get_analyser()->get_logs();
200         } else {
201             $predictresults = false;
202             $predictlogs = array();
203         }
205         $renderer = $PAGE->get_renderer('tool_analytics');
206         echo $renderer->render_get_predictions_results($trainresults, $trainlogs, $predictresults, $predictlogs);
207         break;
209     case 'log':
210         echo $OUTPUT->header();
212         if ($model->is_static()) {
213             throw new moodle_exception('errornostaticlog', 'tool_analytics');
214         }
216         $renderer = $PAGE->get_renderer('tool_analytics');
217         $modellogstable = new \tool_analytics\output\model_logs('model-' . $model->get_id(), $model);
218         echo $renderer->render_table($modellogstable);
219         break;
221     case 'exportdata':
223         if ($model->is_static() || !$model->is_trained()) {
224             throw new moodle_exception('errornoexport', 'tool_analytics');
225         }
227         $file = $model->get_training_data();
228         if (!$file) {
229             redirect($returnurl, get_string('errortrainingdataexport', 'tool_analytics'),
230                 null, \core\output\notification::NOTIFY_ERROR);
231         }
233         $filename = 'training-data.' . $model->get_id() . '.' . time() . '.csv';
234         send_file($file, $filename, null, 0, false, true);
235         break;
237     case 'exportmodel':
238         $zipfilename = 'model-' . $model->get_unique_id() . '-' . microtime(false) . '.zip';
239         $zipfilepath = $model->export_model($zipfilename);
240         send_temp_file($zipfilepath, $zipfilename);
241         break;
243     case 'clear':
244         confirm_sesskey();
246         $model->clear();
247         redirect($returnurl);
248         break;
250     case 'invalidanalysables':
252         echo $OUTPUT->header();
254         $page = optional_param('page', 0, PARAM_INT);
255         // No option in the UI to change this, only for url hackers ;).
256         $perpage = optional_param('perpage', 10, PARAM_INT);
258         $renderable = new \tool_analytics\output\invalid_analysables($model, $page, $perpage);
259         $renderer = $PAGE->get_renderer('tool_analytics');
260         echo $renderer->render($renderable);
262         break;
265 echo $OUTPUT->footer();