Gitlab CSE Unil

admin_editor.php 13.9 KB
Newer Older
M. Chardon's avatar
M. Chardon committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

/**
 * This file contains the editor class for the assignfeedback_editpdfplus plugin
 *
 * @package   assignfeedback_editpdfplus
M. Chardon's avatar
M. Chardon committed
22
 * @copyright  2017 Université de Lausanne
M. Chardon's avatar
M. Chardon committed
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

namespace assignfeedback_editpdfplus;

use assignfeedback_editpdfplus\axis;

/**
 * This class performs crud operations on comments and annotations from a page of a response.
 *
 * No capability checks are done - they should be done by the calling class.
 *
 * @package   assignfeedback_editpdfplus
 * @copyright 2017 Université de Lausanne
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
class admin_editor {

41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
    const BDDTABLETOOL = "assignfeedback_editpp_tool";
    const BDDTABLEAXE = "assignfeedback_editpp_axis";
    const BDDTABLETOOLTYPE = "assignfeedback_editpp_typet";
    const CONTEXTIDLIB = "contextid";

    /**
     * Make an SQL moodle select request from the 3 arguments
     * @param string $select the select part
     * @param string $table the moodle table
     * @param string $where the where part
     * @return string the string request
     */
    public static function makeSqlRequestSelect($select, $table, $where = null) {
        $request = 'SELECT ' . $select . ' FROM {' . $table . '} ';
        if ($where) {
            $request .= " WHERE " . $where;
        }
        return $request;
    }

M. Chardon's avatar
M. Chardon committed
61
    /**
M. Chardon's avatar
M. Chardon committed
62
     * Add an axis
M. Chardon's avatar
M. Chardon committed
63
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
64
65
66
     * @param String $axisLabel axis' name
     * @param Integer $context context's id
     * @return Integer id of the created axis
M. Chardon's avatar
M. Chardon committed
67
68
69
70
     */
    public static function add_axis($axisLabel, $context) {
        global $DB;

71
72
        $record = $DB->get_record_sql(self::makeSqlRequestSelect("max(order_axis) as order_max", self::BDDTABLEAXE, self::CONTEXTIDLIB . ' = :' . self::CONTEXTIDLIB)
                , array(self::CONTEXTIDLIB => $context));
M. Chardon's avatar
M. Chardon committed
73
74
75
76
77
78
79
80
81
82

        $axis = new axis();
        $axis->contextid = $context;
        $axis->label = $axisLabel;
        if ($record->order_max == null) {
            $axis->order_axis = 1;
        } else {
            $axis->order_axis = $record->order_max + 1;
        }

83
        return $DB->insert_record(self::BDDTABLEAXE, $axis);
M. Chardon's avatar
M. Chardon committed
84
85
    }

M. Chardon's avatar
M. Chardon committed
86
    /**
M. Chardon's avatar
M. Chardon committed
87
     * Add a tool
M. Chardon's avatar
M. Chardon committed
88
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
89
90
91
     * @param object $data object with contains tool' info
     * @param Integer $contextid context's id
     * @return \assignfeedback_editpdfplus\tool created tool
M. Chardon's avatar
M. Chardon committed
92
93
94
95
     */
    public static function add_tool($data, $contextid) {
        global $DB;

96
        $maxindice = admin_editor::reorder_tool($data->toolaxis);
M. Chardon's avatar
M. Chardon committed
97
98

        $tool = new tool();
99
        $tool->axis = $data->toolaxis;
M. Chardon's avatar
M. Chardon committed
100
        $tool->cartridge = $data->libelle;
M. Chardon's avatar
M. Chardon committed
101
        $tool->cartridge_color = $data->catridgecolor;
M. Chardon's avatar
M. Chardon committed
102
103
        $tool->contextid = $contextid;
        $tool->label = $data->button;
M. Chardon's avatar
M. Chardon committed
104
        $tool->reply = 0;
M. Chardon's avatar
M. Chardon committed
105
106
107
108
109
        if ($data->reply == "on") {
            $tool->reply = 1;
        }
        $tool->texts = $data->texts;
        $tool->type = $data->typetool;
M. Chardon's avatar
M. Chardon committed
110
        $tool->colors = $data->color;
M. Chardon's avatar
M. Chardon committed
111
        $reorder = false;
M. Chardon's avatar
M. Chardon committed
112
113
114
115
        if ($maxindice == null) {
            $tool->order_tool = 1;
        } elseif ($data->order && intval($data->order) < 1000) {
            $tool->order_tool = $data->order;
M. Chardon's avatar
M. Chardon committed
116
            $reorder = true;
M. Chardon's avatar
M. Chardon committed
117
        } else {
M. Chardon's avatar
M. Chardon committed
118
            $tool->order_tool = $maxindice + 1;
M. Chardon's avatar
M. Chardon committed
119
120
        }

121
        $toolid = $DB->insert_record(self::BDDTABLETOOL, $tool);
M. Chardon's avatar
M. Chardon committed
122

M. Chardon's avatar
M. Chardon committed
123
        if ($toolid > 0) {
M. Chardon's avatar
M. Chardon committed
124
125
126
            if ($reorder) {
                admin_editor::reorder_tool($data->axisid, $toolid);
            }
M. Chardon's avatar
M. Chardon committed
127
128
129
130
131
            return $tool;
        }
        return null;
    }

132
133
    public static function edit_tool_order($data) {
        global $DB;
134
        $record = $DB->get_record(self::BDDTABLETOOL, array('id' => $data->toolid), '*', MUST_EXIST);
135
136
137
138
139
        $toolCurrent = new tool($record);
        $previousorder = -1;
        $toolPrevious = null;
        $toolNext = null;
        if ($data->previoustoolid) {
140
            $record = $DB->get_record(self::BDDTABLETOOL, array('id' => $data->previoustoolid), '*', MUST_EXIST);
141
142
143
            $toolPrevious = new tool($record);
            $previousorder = $toolPrevious->order_tool + 1;
        } elseif ($data->nexttoolid) {
144
            $record = $DB->get_record(self::BDDTABLETOOL, array('id' => $data->nexttoolid), '*', MUST_EXIST);
145
146
147
148
149
150
151
152
153
            $toolNext = new tool($record);
            $previousorder = $toolNext->order_tool - 1;
        }
        if ($previousorder > -1 && ($toolPrevious || $toolNext )) {
            if ($previousorder == 0) {
                $previousorder = 1;
            }
            $toolCurrent->order_tool = $previousorder;
            debugging($previousorder);
154
            if ($DB->update_record(self::BDDTABLETOOL, $toolCurrent)) {
155
156
157
158
159
                admin_editor::reorder_tool($toolCurrent->axis, $data->toolid);
            }
        }
    }

M. Chardon's avatar
M. Chardon committed
160
    /**
M. Chardon's avatar
M. Chardon committed
161
162
163
164
165
166
167
168
169
170
     * Order tools of a toolbar
     * @global type $DB
     * @param Integer $axisid axis to reorder
     * @param Integer $toolid optional, can indicate a tool to place into a toolbar
     * @return last order rank
     */
    protected static function reorder_tool($axisid, $toolid = null) {
        global $DB;

        $tools = array();
171
172
        $records = $DB->get_records_sql(self::makeSqlRequestSelect("*", self::BDDTABLETOOL, "axis = :axisid ORDER BY order_tool ASC")
                , array('axisid' => $axisid));
M. Chardon's avatar
M. Chardon committed
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
        foreach ($records as $record) {
            array_push($tools, new tool($record));
        }
        $compteurPrecedent = null;
        $decalage = 1;
        $lastTool = null;
        foreach ($tools as $tool) {
            if ($compteurPrecedent == null) {
                $compteurPrecedent = $tool->order_tool;
                $lastTool = $tool;
            } else {
                $compteurCourant = $tool->order_tool;
                if ($compteurCourant != $compteurPrecedent + $decalage) {
                    if ($toolid && $tool->id == $toolid) {
                        $tool->order_tool = $lastTool->order_tool;
                        $lastTool->order_tool = $compteurPrecedent + 1;
189
190
                        $DB->update_record(self::BDDTABLETOOL, $tool);
                        $DB->update_record(self::BDDTABLETOOL, $lastTool);
M. Chardon's avatar
M. Chardon committed
191
192
                    } else {
                        $tool->order_tool = $compteurPrecedent + $decalage;
193
                        $DB->update_record(self::BDDTABLETOOL, $tool);
M. Chardon's avatar
M. Chardon committed
194
195
196
197
198
199
200
201
202
203
204
205
206
207
                        $lastTool = $tool;
                    }
                    //$decalage++;
                } else {
                    $lastTool = $tool;
                }
                $compteurPrecedent++;
            }
        }
        return $compteurPrecedent;
    }

    /**
     * Edit an axis
M. Chardon's avatar
M. Chardon committed
208
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
209
210
211
     * @param Integer $axeid axis' id
     * @param String $axisLabel new axis' label
     * @return Boolean true if the update is ok
M. Chardon's avatar
M. Chardon committed
212
213
214
215
     */
    public static function edit_axis($axeid, $axisLabel) {
        global $DB;

216
        $axis = $DB->get_record(self::BDDTABLEAXE, array('id' => $axeid), '*', MUST_EXIST);
M. Chardon's avatar
M. Chardon committed
217
        $axis->label = $axisLabel;
218
        return $DB->update_record(self::BDDTABLEAXE, $axis);
M. Chardon's avatar
M. Chardon committed
219
220
    }

221
    /**
M. Chardon's avatar
M. Chardon committed
222
     * Delete an axis
223
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
224
225
     * @param Integer $axeid axis' id
     * @return Boolean true if the update is ok
226
227
228
     */
    public static function del_axis($axeid) {
        global $DB;
229
        return $DB->delete_records(self::BDDTABLEAXE, array('id' => $axeid));
230
    }
M. Chardon's avatar
M. Chardon committed
231

M. Chardon's avatar
M. Chardon committed
232
233
234
235
236
237
    /**
     * Delete a tool
     * @global type $DB
     * @param \assignfeedback_editpdfplus\tool $tool
     * @return Boolean true if the remove is ok
     */
M. Chardon's avatar
M. Chardon committed
238
239
    public static function del_tool($tool) {
        global $DB;
240
        return $DB->delete_records(self::BDDTABLETOOL, array('id' => $tool->toolid));
M. Chardon's avatar
M. Chardon committed
241
242
    }

M. Chardon's avatar
M. Chardon committed
243
244
245
246
247
248
    /**
     * Get all tools by an axis' id
     * @global type $DB
     * @param Integer $axisid axis' id
     * @return array<\assignfeedback_editpdfplus\tool> the toolbar, order by order_tool
     */
M. Chardon's avatar
M. Chardon committed
249
    public static function get_tools_by_axis($axisid) {
M. Chardon's avatar
M. Chardon committed
250
251
        global $DB;
        $tools = array();
252
        $records = $DB->get_records(self::BDDTABLETOOL, array('axis' => $axisid));
M. Chardon's avatar
M. Chardon committed
253
        foreach ($records as $record) {
254
            array_push($tools, new tool($record));
M. Chardon's avatar
M. Chardon committed
255
256
257
258
259
260
261
262
263
264
265
266
        }
        usort($tools, function($a, $b) {
            $al = $a->order_tool;
            $bl = $b->order_tool;
            if ($al == $bl) {
                return 0;
            }
            return ($al > $bl) ? +1 : -1;
        });
        return $tools;
    }

267
    /**
268
     * Get all different contexts id
269
     * @global type $DB
270
     * @return array<\assignfeedback_editpdfplus\axis> the axis with just their contextid
271
272
273
     */
    public static function get_all_different_contexts() {
        global $DB;
274
        $records = $DB->get_records_sql(self::makeSqlRequestSelect("DISTINCT(" . self::CONTEXTIDLIB . ")", self::BDDTABLEAXE));
275
276
277
        return $records;
    }

M. Chardon's avatar
M. Chardon committed
278
    /**
M. Chardon's avatar
M. Chardon committed
279
     * Update a tool
M. Chardon's avatar
M. Chardon committed
280
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
281
282
     * @param object $toolJson object contains tool's values to update
     * @return \assignfeedback_editpdfplus\tool
M. Chardon's avatar
M. Chardon committed
283
284
285
286
     */
    public static function edit_tool($toolJson) {
        global $DB;

287
        $record = $DB->get_record(self::BDDTABLETOOL, array('id' => $toolJson->toolid), '*', MUST_EXIST);
M. Chardon's avatar
M. Chardon committed
288
        $tool = new tool($record);
289
        $tool->axis = $toolJson->toolaxis;
M. Chardon's avatar
M. Chardon committed
290
291
292
293
294
295
        $tool->type = $toolJson->typetool;
        $tool->colors = $toolJson->color;
        $tool->cartridge = $toolJson->libelle;
        $tool->cartridge_color = $toolJson->catridgecolor;
        $tool->texts = $toolJson->texts;
        $tool->label = $toolJson->button;
M. Chardon's avatar
M. Chardon committed
296
297
298
        $tool->enabled = $toolJson->enabled;
        if ($toolJson->reply == "on") {
            $tool->reply = 1;
M. Chardon's avatar
M. Chardon committed
299
300
301
        } else {
            $tool->reply = 0;
        }
M. Chardon's avatar
M. Chardon committed
302
303
304
305
306
        $reorder = false;
        if ($tool->order_tool != $toolJson->order) {
            $tool->order_tool = $toolJson->order;
            $reorder = true;
        }
307
        if ($DB->update_record(self::BDDTABLETOOL, $tool)) {
M. Chardon's avatar
M. Chardon committed
308
309
310
            if ($reorder) {
                admin_editor::reorder_tool($tool->axis, $tool->id);
            }
M. Chardon's avatar
M. Chardon committed
311
312
313
314
315
            return $tool;
        }
        return null;
    }

316
    /**
M. Chardon's avatar
M. Chardon committed
317
318
     * Get all the type tools which are configurabled.
     * @return array<\assignfeedback_editpdfplus\type_tool> array of type tools
319
320
321
322
     */
    public static function get_typetools() {
        global $DB;
        $typetools = array();
323
        $records = $DB->get_records(self::BDDTABLETOOLTYPE, array('configurable' => 1));
324
        foreach ($records as $record) {
325
326
327
328
            $newTypeTool = page_editor::custom_type_tool(new type_tool($record));
            if ($newTypeTool->configurable > 0) {
                array_push($typetools, $newTypeTool);
            }
329
330
331
332
        }
        return $typetools;
    }

M. Chardon's avatar
M. Chardon committed
333
334
335
336
337
338
    /**
     * Get axis by its id
     * @global type $DB
     * @param Integer $axeid axis' id
     * @return \assignfeedback_editpdfplus\axis the axis
     */
M. Chardon's avatar
M. Chardon committed
339
340
    public static function getAxisById($axeid) {
        global $DB;
341
        $axis = $DB->get_record(self::BDDTABLEAXE, array('id' => $axeid), '*', MUST_EXIST);
M. Chardon's avatar
M. Chardon committed
342
343
344
        return $axis;
    }

M. Chardon's avatar
M. Chardon committed
345
346
347
348
349
350
351
    /**
     * Clone an axis to the context given in parameter
     * @global type $DB
     * @param \assignfeedback_editpdfplus\axis $axisOrigin
     * @param Integer $context context's id
     * @return Integer id of the imported axis
     */
M. Chardon's avatar
M. Chardon committed
352
353
    public static function import_axis($axisOrigin, $context) {
        global $DB;
354
355
        $record = $DB->get_record_sql(self::makeSqlRequestSelect("max(order_axis) as order_max", self::BDDTABLEAXE, self::CONTEXTIDLIB . ' = :' . self::CONTEXTIDLIB)
                , array(self::CONTEXTIDLIB => $context));
M. Chardon's avatar
M. Chardon committed
356
357
358
359
360
361
362
363
364
365

        $axis = new axis();
        $axis->contextid = $context;
        $axis->label = $axisOrigin->label;
        if ($record->order_max == null) {
            $axis->order_axis = 1;
        } else {
            $axis->order_axis = $record->order_max + 1;
        }

366
        return $DB->insert_record(self::BDDTABLEAXE, $axis);
M. Chardon's avatar
M. Chardon committed
367
368
    }

M. Chardon's avatar
M. Chardon committed
369
370
371
372
373
374
375
376
    /**
     * Clone a tool to a new axis
     * @global type $DB
     * @param \assignfeedback_editpdfplus\tool $toolToImport tool to duplicate
     * @param \assignfeedback_editpdfplus\axis $axeNew axis to attached new tool
     * @param Integer $context context's id
     * @return Integer id of tool's created
     */
M. Chardon's avatar
M. Chardon committed
377
378
    public static function import_tool($toolToImport, $axeNew, $context) {
        global $DB;
379
380
        $record = $DB->get_record_sql(self::makeSqlRequestSelect("max(order_tool) as order_max", self::BDDTABLETOOL, self::CONTEXTIDLIB . ' = :' . self::CONTEXTIDLIB)
                , array('axis' => $axeNew->id, self::CONTEXTIDLIB => $context));
M. Chardon's avatar
M. Chardon committed
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397

        $tool = new tool();
        $tool->axis = $axeNew;
        $tool->cartridge = $toolToImport->cartridge;
        $tool->cartridge_color = $toolToImport->cartridge_color;
        $tool->colors = $toolToImport->colors;
        $tool->contextid = $context;
        $tool->enabled = $toolToImport->enabled;
        $tool->label = $toolToImport->label;
        $tool->reply = $toolToImport->reply;
        $tool->texts = $toolToImport->texts;
        $tool->type = $toolToImport->type;
        if ($record->order_max == null) {
            $tool->order_tool = 1;
        } else {
            $tool->order_tool = $record->order_max + 1;
        }
398
        return $DB->insert_record(self::BDDTABLETOOL, $tool);
M. Chardon's avatar
M. Chardon committed
399
400
    }

M. Chardon's avatar
M. Chardon committed
401
}