MDL-25594 completion: Remove unused column from query
[moodle.git] / lib / completion / completion_criteria_activity.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * Course completion critieria - completion on activity completion
20  *
21  * @package   moodlecore
22  * @copyright 2009 Catalyst IT Ltd
23  * @author    Aaron Barnes <aaronb@catalyst.net.nz>
24  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25  */
26 class completion_criteria_activity extends completion_criteria {
28     /**
29      * Criteria type constant
30      * @var int
31      */
32     public $criteriatype = COMPLETION_CRITERIA_TYPE_ACTIVITY;
34     /**
35      * Finds and returns a data_object instance based on params.
36      * @static abstract
37      *
38      * @param array $params associative arrays varname=>value
39      * @return object data_object instance or false if none found.
40      */
41     public static function fetch($params) {
42         $params['criteriatype'] = COMPLETION_CRITERIA_TYPE_ACTIVITY;
43         return self::fetch_helper('course_completion_criteria', __CLASS__, $params);
44     }
46     /**
47      * Add appropriate form elements to the critieria form
48      * @access  public
49      * @param   object  $mform  Moodle forms object
50      * @param   mixed   $data   optional
51      * @return  void
52      */
53     public function config_form_display(&$mform, $data = null) {
54         $mform->addElement('checkbox', 'criteria_activity['.$data->id.']', ucfirst(self::get_mod_name($data->module)).' - '.$data->name);
56         if ($this->id) {
57             $mform->setDefault('criteria_activity['.$data->id.']', 1);
58         }
59     }
61     /**
62      * Update the criteria information stored in the database
63      * @access  public
64      * @param   array   $data   Form data
65      * @return  void
66      */
67     public function update_config(&$data) {
68         global $DB;
70         if (!empty($data->criteria_activity) && is_array($data->criteria_activity)) {
72             $this->course = $data->id;
74             foreach (array_keys($data->criteria_activity) as $activity) {
76                 $module = $DB->get_record('course_modules', array('id' => $activity));
77                 $this->module = self::get_mod_name($module->module);
78                 $this->moduleinstance = $activity;
79                 $this->id = NULL;
80                 $this->insert();
81             }
82         }
83     }
85     /**
86      * Get module instance module type
87      * @static
88      * @access  public
89      * @param   int     $type   Module type id
90      * @return  string
91      */
92     public static function get_mod_name($type) {
93         static $types;
95         if (!is_array($types)) {
96             global $DB;
97             $types = $DB->get_records('modules');
98         }
100         return $types[$type]->name;
101     }
103     /**
104      * Get module instance
105      * @access  public
106      * @return  object|false
107      */
108     public function get_mod_instance() {
109         global $DB;
111         return $DB->get_record_sql(
112             "
113                 SELECT
114                     m.*
115                 FROM
116                     {{$this->module}} m
117                 INNER JOIN
118                     {course_modules} cm
119                  ON cm.id = {$this->moduleinstance}
120                 AND m.id = cm.instance
121             "
122         );
123     }
125     /**
126      * Review this criteria and decide if the user has completed
127      * @access  public
128      * @param   object  $completion     The user's completion record
129      * @param   boolean $mark           Optionally set false to not save changes to database
130      * @return  boolean
131      */
132     public function review($completion, $mark = true) {
133         global $DB;
135         $course = $DB->get_record('course', array('id' => $completion->course));
136         $cm = $DB->get_record('course_modules', array('id' => $this->moduleinstance));
137         $info = new completion_info($course);
139         $data = $info->get_data($cm, false, $completion->userid);
141         // If the activity is complete
142         if (in_array($data->completionstate, array(COMPLETION_COMPLETE, COMPLETION_COMPLETE_PASS))) {
143             if ($mark) {
144                 $completion->mark_complete();
145             }
147             return true;
148         }
150         return false;
151     }
153     /**
154      * Return criteria title for display in reports
155      * @access  public
156      * @return  string
157      */
158     public function get_title() {
159         return get_string('activitiescompleted', 'completion');
160     }
162     /**
163      * Return a more detailed criteria title for display in reports
164      * @access  public
165      * @return  string
166      */
167     public function get_title_detailed() {
168         global $DB;
169         $module = $DB->get_record('course_modules', array('id' => $this->moduleinstance));
170         $activity = $DB->get_record($this->module, array('id' => $module->instance));
172         return shorten_text(urldecode($activity->name));
173     }
175     /**
176      * Return criteria type title for display in reports
177      * @access  public
178      * @return  string
179      */
180     public function get_type_title() {
181         return get_string('activities', 'completion');
182     }
184     /**
185      * Find user's who have completed this criteria
186      * @access  public
187      * @return  void
188      */
189     public function cron() {
190         global $DB;
192         // Get all users who meet this criteria
193         $sql = '
194             SELECT DISTINCT
195                 c.id AS course,
196                 cr.id AS criteriaid,
197                 ra.userid AS userid,
198                 mc.timemodified AS timecompleted
199             FROM
200                 {course_completion_criteria} cr
201             INNER JOIN
202                 {course} c
203              ON cr.course = c.id
204             INNER JOIN
205                 {context} con
206              ON con.instanceid = c.id
207             INNER JOIN
208                 {role_assignments} ra
209               ON ra.contextid = con.id
210             INNER JOIN
211                 {course_modules_completion} mc
212              ON mc.coursemoduleid = cr.moduleinstance
213             AND mc.userid = ra.userid
214             LEFT JOIN
215                 {course_completion_crit_compl} cc
216              ON cc.criteriaid = cr.id
217             AND cc.userid = ra.userid
218             WHERE
219                 cr.criteriatype = '.COMPLETION_CRITERIA_TYPE_ACTIVITY.'
220             AND con.contextlevel = '.CONTEXT_COURSE.'
221             AND c.enablecompletion = 1
222             AND cc.id IS NULL
223             AND (
224                 mc.completionstate = '.COMPLETION_COMPLETE.'
225              OR mc.completionstate = '.COMPLETION_COMPLETE_PASS.'
226                 )
227         ';
229         // Loop through completions, and mark as complete
230         $rs = $DB->get_recordset_sql($sql);
231         foreach ($rs as $record) {
233             $completion = new completion_criteria_completion((array)$record);
234             $completion->mark_complete($record->timecompleted);
235         }
236         $rs->close();
237     }
239     /**
240      * Return criteria progress details for display in reports
241      * @access  public
242      * @param   object  $completion     The user's completion record
243      * @return  array
244      */
245     public function get_details($completion) {
246         global $DB, $CFG;
248         // Get completion info
249         $course = new stdClass();
250         $course->id = $completion->course;
251         $info = new completion_info($course);
253         $module = $DB->get_record('course_modules', array('id' => $this->moduleinstance));
254         $data = $info->get_data($module, false, $completion->userid);
256         $activity = $DB->get_record($this->module, array('id' => $module->instance));
258         $details = array();
259         $details['type'] = $this->get_title();
260         $details['criteria'] = '<a href="'.$CFG->wwwroot.'/mod/'.$this->module.'/view.php?id='.$this->moduleinstance.'">'.$activity->name.'</a>';
262         // Build requirements
263         $details['requirement'] = array();
265         if ($module->completion == 1) {
266             $details['requirement'][] = get_string('markingyourselfcomplete', 'completion');
267         } elseif ($module->completion == 2) {
268             if ($module->completionview) {
269                 $details['requirement'][] = get_string('viewingactivity', 'completion', $this->module);
270             }
272             if ($module->completiongradeitemnumber) {
273                 $details['requirement'][] = get_string('achievinggrade', 'completion');
274             }
275         }
277         $details['requirement'] = implode($details['requirement'], ', ');
279         $details['status'] = '';
281         return $details;
282     }