5b814859fc3d9a395ffabd8014b634a13a3850bf
[moodle.git] / admin / tool / assignmentupgrade / locallib.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  * Assignment upgrade tool library functions
19  *
20  * @package    tool_assignmentupgrade
21  * @copyright  2012 NetSpot
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 defined('MOODLE_INTERNAL') || die();
27 /**
28  * Get the URL of a script within this plugin.
29  * @param string $script the script name, without .php. E.g. 'index'
30  * @param array $params URL parameters (optional)
31  * @return moodle_url
32  */
33 function tool_assignmentupgrade_url($script, $params = array()) {
34     return new moodle_url('/admin/tool/assignmentupgrade/' . $script . '.php', $params);
35 }
37 /**
38  * Class to encapsulate the continue / cancel for batch operations
39  *
40  * @package    tool_assignmentupgrade
41  * @copyright  2012 NetSpot
42  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
43  */
44 class tool_assignmentupgrade_batchoperationconfirm implements renderable {
45     /** @var string $continuemessage The message to show above the continue cancel buttons */
46     public $continuemessage = '';
47     /** @var string $continueurl The url to load if the user clicks continue */
48     public $continueurl;
50     /**
51      * Constructor for this class
52      * @param stdClass $data - The data from the previous batch form
53      */
54     function __construct($data) {
55         if (isset($data->upgradeselected)) {
56             $this->continuemessage = get_string('upgradeselectedcount', 'tool_assignmentupgrade', count(explode(',', $data->selectedassignments)));
57             $this->continueurl = new moodle_url('/admin/tool/assignmentupgrade/batchupgrade.php', array('upgradeselected'=>'1', 'confirm'=>'1', 'sesskey'=>sesskey(), 'selected'=>$data->selectedassignments));
58         } else if (isset($data->upgradeall)) {
59             if (!tool_assignmentupgrade_any_upgradable_assignments()) {
60                 $this->continuemessage = get_string('noassignmentstoupgrade', 'tool_assignmentupgrade');
61                 $this->continueurl = '';
62             } else {
63                 $this->continuemessage = get_string('upgradeallconfirm', 'tool_assignmentupgrade');
64                 $this->continueurl = new moodle_url('/admin/tool/assignmentupgrade/batchupgrade.php', array('upgradeall'=>'1', 'confirm'=>'1', 'sesskey'=>sesskey()));
65             }
66         }
67     }
68 }
71 /**
72  * Class to encapsulate one of the functionalities that this plugin offers.
73  *
74  * @package    tool_assignmentupgrade
75  * @copyright  2012 NetSpot
76  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
77  */
78 class tool_assignmentupgrade_action {
79     /** @var string the name of this action. */
80     public $name;
81     /** @var moodle_url the URL to launch this action. */
82     public $url;
83     /** @var string a description of this aciton. */
84     public $description;
86     /**
87      * Constructor to set the fields.
88      *
89      * In order to create a new tool_assignmentupgrade_action instance you must use the tool_assignmentupgrade_action::make
90      * method.
91      *
92      * @param string $name the name of this action.
93      * @param moodle_url $url the URL to launch this action.
94      * @param string $description a description of this aciton.
95      */
96     protected function __construct($name, moodle_url $url, $description) {
97         $this->name = $name;
98         $this->url = $url;
99         $this->description = $description;
100     }
102     /**
103      * Make an action with standard values.
104      * @param string $shortname internal name of the action. Used to get strings and build a URL.
105      * @param array $params any URL params required.
106      * @return tool_assignmentupgrade_action
107      */
108     public static function make($shortname, $params = array()) {
109         return new self(
110                 get_string($shortname, 'tool_assignmentupgrade'),
111                 tool_assignmentupgrade_url($shortname, $params),
112                 get_string($shortname . '_desc', 'tool_assignmentupgrade'));
113     }
116 /**
117  * Determine if there are any assignments that can be upgraded
118  * @return boolean - Are there any assignments that can be upgraded
119  */
120 function tool_assignmentupgrade_any_upgradable_assignments() {
121     global $DB, $CFG;
122     require_once($CFG->dirroot . '/mod/assign/locallib.php');
123     // first find all the unique assignment types
124     $types = $DB->get_records_sql('SELECT plugin AS assignmenttype, value AS version FROM {config_plugins} WHERE name = ? AND plugin LIKE ?', array('version', 'assignment_%'));
126     $upgradabletypes = array();
128     foreach ($types as $assignment) {
129         $shorttype = substr($assignment->assignmenttype, strlen('assignment_'));
130         if (assign::can_upgrade_assignment($shorttype, $assignment->version)) {
131             $upgradabletypes[] = $shorttype;
132         }
133     }
134     list($sql, $params) = $DB->get_in_or_equal($upgradabletypes);
136     $count = $DB->count_records_sql('SELECT COUNT(id) from {assignment} where assignmenttype ' . $sql, $params);
138     return $count > 0;
141 /**
142  * Load a list of all the assignmentids that can be upgraded
143  * @return array of assignment ids
144  */
145 function tool_assignmentupgrade_load_all_upgradable_assignmentids() {
146     global $DB, $CFG;
147     require_once($CFG->dirroot . '/mod/assign/locallib.php');
148     // first find all the unique assignment types
149     $types = $DB->get_records_sql('SELECT plugin AS assignmenttype, value AS version FROM {config_plugins} WHERE name = ? AND plugin LIKE ?', array('version', 'assignment_%'));
151     $upgradabletypes = array();
153     foreach ($types as $assignment) {
154         $shorttype = substr($assignment->assignmenttype, strlen('assignment_'));
155         if (assign::can_upgrade_assignment($shorttype, $assignment->version)) {
156             $upgradabletypes[] = $shorttype;
157         }
158     }
160     list($sql, $params) = $DB->get_in_or_equal($upgradabletypes);
162     $records = $DB->get_records_sql('SELECT id from {assignment} where assignmenttype ' . $sql, $params);
163     $ids = array();
164     foreach ($records as $record) {
165         $ids[] = $record->id;
166     }
168     return $ids;
172 /**
173  * Convert a list of assignments from the old format to the new one.
174  * @param bool $upgradeall - Upgrade all possible assignments
175  * @param array $assignmentids An array of assignment ids to upgrade
176  * @return array of $entry['assignmentsummary' => (result from tool_assignmentupgrade_get_assignment)
177  *                  $entry['success'] => boolean
178  *                  $entry['log'] => string - upgrade log
179  */
180 function tool_assignmentupgrade_upgrade_multiple_assignments($upgradeall, $assignmentids) {
181     global $CFG;
182     require_once($CFG->dirroot . '/mod/assign/locallib.php');
183     require_once($CFG->dirroot . '/mod/assign/upgradelib.php');
184     $upgrades = array();
186     if ($upgradeall) {
187         $assignmentids = tool_assignmentupgrade_load_all_upgradable_assignmentids();
188     }
190     $assignment_upgrader = new assign_upgrade_manager();
191     foreach ($assignmentids as $assignmentid) {
192         $info = tool_assignmentupgrade_get_assignment($assignmentid);
193         if ($info) {
194             $log = '';
195             $success = $assignment_upgrader->upgrade_assignment($assignmentid, $log);
196         } else {
197             $success = false;
198             $log = get_string('assignmentnotfound', 'tool_assignmentupgrade', $assignmentid);
199             $info = new stdClass();
200             $info->name = get_string('unknown', 'tool_assignmentupgrade');
201             $info->shortname = get_string('unknown', 'tool_assignmentupgrade');
202         }
204         $upgrades[] = array('assignmentsummary'=>$info, 'success'=>$success, 'log'=>$log);
205     }
206     return $upgrades;
209 /**
210  * Convert a single assignment from the old format to the new one.
211  * @param stdClass $assignmentinfo An object containing information about this class
212  * @param string $log This gets appended to with the details of the conversion process
213  * @return boolean This is the overall result (true/false)
214  */
215 function tool_assignmentupgrade_upgrade_assignment($assignmentinfo, &$log) {
216     global $CFG;
217     require_once($CFG->dirroot . '/mod/assign/locallib.php');
218     require_once($CFG->dirroot . '/mod/assign/upgradelib.php');
219     $assignment_upgrader = new assign_upgrade_manager();
220     return $assignment_upgrader->upgrade_assignment($assignmentinfo->id, $log);
223 /**
224  * Get the information about a assignment to be upgraded.
225  * @param int $assignmentid the assignment id.
226  * @return stdClass the information about that assignment.
227  */
228 function tool_assignmentupgrade_get_assignment($assignmentid) {
229     global $DB;
230     return $DB->get_record_sql("
231             SELECT a.id, a.name, c.shortname, c.id AS courseid
232             FROM {assignment} a
233             JOIN {course} c ON c.id = a.course
234             WHERE a.id = ?", array($assignmentid));