Merge branch 'MDL-59761-master' of git://github.com/danpoltawski/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         // No need to call the parent as the parent's action is view details and this target only have 1 feature.
71         $actions = array();
73         $sampledata = $prediction->get_sample_data();
74         $course = $sampledata['course'];
76         $url = new \moodle_url('/course/view.php', array('id' => $course->id));
77         $pix = new \pix_icon('i/course', get_string('course'));
78         $actions['viewcourse'] = new \core_analytics\prediction_action('viewcourse', $prediction,
79             $url, $pix, get_string('view'));
81         if (course_can_view_participants($sampledata['context'])) {
82             $url = new \moodle_url('/user/index.php', array('id' => $course->id));
83             $pix = new \pix_icon('i/cohort', get_string('participants'));
84             $actions['viewparticipants'] = new \core_analytics\prediction_action('viewparticipants', $prediction,
85                 $url, $pix, get_string('participants'));
86         }
88         return $actions;
89     }
91     /**
92      * classes_description
93      *
94      * @return string[]
95      */
96     protected static function classes_description() {
97         return array(
98             get_string('targetlabelteachingyes'),
99             get_string('targetlabelteachingno'),
100         );
101     }
103     /**
104      * Returns the predicted classes that will be ignored.
105      *
106      * @return array
107      */
108     protected function ignored_predicted_classes() {
109         // No need to list the course if there is teaching activity.
110         return array(0);
111     }
113     /**
114      * get_analyser_class
115      *
116      * @return string
117      */
118     public function get_analyser_class() {
119         return '\core\analytics\analyser\site_courses';
120     }
122     /**
123      * is_valid_analysable
124      *
125      * @param \core_analytics\analysable $analysable
126      * @param mixed $fortraining
127      * @return true|string
128      */
129     public function is_valid_analysable(\core_analytics\analysable $analysable, $fortraining = true) {
130         // The analysable is the site, so yes, it is always valid.
131         return true;
132     }
134     /**
135      * Only process samples which start date is getting close.
136      *
137      * @param int $sampleid
138      * @param \core_analytics\analysable $analysable
139      * @param bool $fortraining
140      * @return bool
141      */
142     public function is_valid_sample($sampleid, \core_analytics\analysable $analysable, $fortraining = true) {
144         $course = $this->retrieve('course', $sampleid);
146         $now = time();
148         // No courses without start date, no finished courses nor predictions before start - 1 week.
149         if (!$course->startdate || (!empty($course->enddate) && $course->enddate < $now) ||
150                 $course->startdate - WEEKSECS > $now) {
151             return false;
152         }
153         return true;
154     }
156     /**
157      * calculate_sample
158      *
159      * @param int $sampleid
160      * @param \core_analytics\analysable $analysable
161      * @param int $starttime
162      * @param int $endtime
163      * @return float
164      */
165     protected function calculate_sample($sampleid, \core_analytics\analysable $analysable, $starttime = false, $endtime = false) {
167         $noteachersindicator = $this->retrieve('\core_course\analytics\indicator\no_teacher', $sampleid);
168         if ($noteachersindicator == \core_course\analytics\indicator\no_teacher::get_min_value()) {
169             // No teachers :( we flag this as 1.
170             return 1;
171         }
172         return 0;
173     }