Merge branch 'MDL-58835_master' of git://github.com/dmonllao/moodle
[moodle.git] / lib / classes / analytics / target / no_teaching.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  * No teaching target.
19  *
20  * @package   core
21  * @copyright 2016 David Monllao {@link http://www.davidmonllao.com}
22  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace core\analytics\target;
27 defined('MOODLE_INTERNAL') || die();
29 /**
30  * No teaching target.
31  *
32  * @package   core
33  * @copyright 2017 David Monllao {@link http://www.davidmonllao.com}
34  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
35  */
36 class no_teaching extends \core_analytics\local\target\binary {
38     /**
39      * Machine learning backends are not required to predict.
40      *
41      * @return bool
42      */
43     public static function based_on_assumptions() {
44         return true;
45     }
47     /**
48      * Returns the name.
49      *
50      * If there is a corresponding '_help' string this will be shown as well.
51      *
52      * @return \lang_string
53      */
54     public static function get_name() : \lang_string {
55         return new \lang_string('target:noteachingactivity');
56     }
58     /**
59      * prediction_actions
60      *
61      * @param \core_analytics\prediction $prediction
62      * @param mixed $includedetailsaction
63      * @return \core_analytics\prediction_action[]
64      */
65     public function prediction_actions(\core_analytics\prediction $prediction, $includedetailsaction = false) {
66         global $CFG;
68         require_once($CFG->dirroot . '/course/lib.php');
70         $sampledata = $prediction->get_sample_data();
71         $course = $sampledata['course'];
73         $actions = array();
75         $url = new \moodle_url('/course/view.php', array('id' => $course->id));
76         $pix = new \pix_icon('i/course', get_string('course'));
77         $actions[] = new \core_analytics\prediction_action('viewcourse', $prediction,
78             $url, $pix, get_string('view'));
80         if (course_can_view_participants($sampledata['context'])) {
81             $url = new \moodle_url('/user/index.php', array('id' => $course->id));
82             $pix = new \pix_icon('i/cohort', get_string('participants'));
83             $actions[] = new \core_analytics\prediction_action('viewparticipants', $prediction,
84                 $url, $pix, get_string('participants'));
85         }
87         $parentactions = parent::prediction_actions($prediction, $includedetailsaction);
88         // No need to show details as there is only 1 indicator.
89         unset($parentactions[\core_analytics\prediction::ACTION_PREDICTION_DETAILS]);
91         return array_merge($actions, $parentactions);
92     }
94     /**
95      * classes_description
96      *
97      * @return string[]
98      */
99     protected static function classes_description() {
100         return array(
101             get_string('targetlabelteachingyes'),
102             get_string('targetlabelteachingno'),
103         );
104     }
106     /**
107      * Returns the predicted classes that will be ignored.
108      *
109      * @return array
110      */
111     protected function ignored_predicted_classes() {
112         // No need to list the course if there is teaching activity.
113         return array(0);
114     }
116     /**
117      * get_analyser_class
118      *
119      * @return string
120      */
121     public function get_analyser_class() {
122         return '\core\analytics\analyser\site_courses';
123     }
125     /**
126      * is_valid_analysable
127      *
128      * @param \core_analytics\analysable $analysable
129      * @param mixed $fortraining
130      * @return true|string
131      */
132     public function is_valid_analysable(\core_analytics\analysable $analysable, $fortraining = true) {
133         // The analysable is the site, so yes, it is always valid.
134         return true;
135     }
137     /**
138      * Only process samples which start date is getting close.
139      *
140      * @param int $sampleid
141      * @param \core_analytics\analysable $analysable
142      * @param bool $fortraining
143      * @return bool
144      */
145     public function is_valid_sample($sampleid, \core_analytics\analysable $analysable, $fortraining = true) {
147         $course = $this->retrieve('course', $sampleid);
149         $now = time();
151         // No courses without start date, no finished courses nor predictions before start - 1 week.
152         if (!$course->startdate || (!empty($course->enddate) && $course->enddate < $now) ||
153                 $course->startdate - WEEKSECS > $now) {
154             return false;
155         }
156         return true;
157     }
159     /**
160      * calculate_sample
161      *
162      * @param int $sampleid
163      * @param \core_analytics\analysable $analysable
164      * @param int $starttime
165      * @param int $endtime
166      * @return float
167      */
168     protected function calculate_sample($sampleid, \core_analytics\analysable $analysable, $starttime = false, $endtime = false) {
170         $noteachersindicator = $this->retrieve('\core_course\analytics\indicator\no_teacher', $sampleid);
171         if ($noteachersindicator == \core_course\analytics\indicator\no_teacher::get_min_value()) {
172             // No teachers :( we flag this as 1.
173             return 1;
174         }
175         return 0;
176     }