Gitlab CSE Unil

admin_editor.php 16.3 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
<?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
20
21
22
23
 * 
 * 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.
M. Chardon's avatar
M. Chardon committed
24
25
 *
 * @package   assignfeedback_editpdfplus
M. Chardon's avatar
M. Chardon committed
26
 * @copyright  2017 Université de Lausanne
M. Chardon's avatar
M. Chardon committed
27
28
29
30
31
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

namespace assignfeedback_editpdfplus;

M. Chardon's avatar
M. Chardon committed
32
33
use assignfeedback_editpdfplus\bdd\axis;
use assignfeedback_editpdfplus\bdd\type_tool;
M. Chardon's avatar
M. Chardon committed
34
use assignfeedback_editpdfplus\bdd\tool;
M. Chardon's avatar
M. Chardon committed
35
36
37

class admin_editor {

38
39
40
    const BDDTABLETOOL = "assignfeedback_editpp_tool";
    const BDDTABLEAXE = "assignfeedback_editpp_axis";
    const BDDTABLETOOLTYPE = "assignfeedback_editpp_typet";
M. Chardon's avatar
M. Chardon committed
41
42
    const BDDTABLEMODELAXIS = "assignfeedback_editpp_modax";
    const BDDTABLEANNOT = "assignfeedback_editpp_annot";
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    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
60
    /**
M. Chardon's avatar
M. Chardon committed
61
     * Add an axis
M. Chardon's avatar
M. Chardon committed
62
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
63
64
65
     * @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
66
67
68
69
     */
    public static function add_axis($axisLabel, $context) {
        global $DB;

70
71
        $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
72
73
74
75
76
77
78
79
80
81

        $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;
        }

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

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

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

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

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

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

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

M. Chardon's avatar
M. Chardon committed
159
    /**
M. Chardon's avatar
M. Chardon committed
160
161
162
163
164
165
166
167
168
169
     * 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();
170
171
        $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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
        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;
188
189
                        $DB->update_record(self::BDDTABLETOOL, $tool);
                        $DB->update_record(self::BDDTABLETOOL, $lastTool);
M. Chardon's avatar
M. Chardon committed
190
191
                    } else {
                        $tool->order_tool = $compteurPrecedent + $decalage;
192
                        $DB->update_record(self::BDDTABLETOOL, $tool);
M. Chardon's avatar
M. Chardon committed
193
194
195
196
197
198
199
200
201
202
203
204
205
                        $lastTool = $tool;
                    }
                } else {
                    $lastTool = $tool;
                }
                $compteurPrecedent++;
            }
        }
        return $compteurPrecedent;
    }

    /**
     * Edit an axis
M. Chardon's avatar
M. Chardon committed
206
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
207
208
209
     * @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
210
211
212
213
     */
    public static function edit_axis($axeid, $axisLabel) {
        global $DB;

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

219
    /**
M. Chardon's avatar
M. Chardon committed
220
     * Delete an axis
221
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
222
223
     * @param Integer $axeid axis' id
     * @return Boolean true if the update is ok
224
225
226
     */
    public static function del_axis($axeid) {
        global $DB;
M. Chardon's avatar
M. Chardon committed
227
228
229
230
231
232
233
234
235
        $res = true;
        //delete all related tools if possible
        $tools = self::get_tools_by_axis($axeid);
        foreach ($tools as $tool) {
            $res &= self::del_tool($tool);
        }
        if (!$res) {
            return false;
        }
236
        return $DB->delete_records(self::BDDTABLEAXE, array('id' => $axeid));
237
    }
M. Chardon's avatar
M. Chardon committed
238

M. Chardon's avatar
M. Chardon committed
239
240
241
    /**
     * Delete a tool
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
242
     * @param \assignfeedback_editpdfplus\bdd\tool $tool
M. Chardon's avatar
M. Chardon committed
243
244
     * @return Boolean true if the remove is ok
     */
M. Chardon's avatar
M. Chardon committed
245
246
    public static function del_tool($tool) {
        global $DB;
M. Chardon's avatar
M. Chardon committed
247
248
249
250
251
        //check if this tool is used
        $nbAnnotations = self::getNbAnnotationsForTool($tool->toolid);
        if ($nbAnnotations > 0) {
            return false;
        }
252
        return $DB->delete_records(self::BDDTABLETOOL, array('id' => $tool->toolid));
M. Chardon's avatar
M. Chardon committed
253
254
    }

M. Chardon's avatar
M. Chardon committed
255
256
257
258
    /**
     * Get all tools by an axis' id
     * @global type $DB
     * @param Integer $axisid axis' id
M. Chardon's avatar
M. Chardon committed
259
     * @return array<\assignfeedback_editpdfplus\bdd\tool> the toolbar, order by order_tool
M. Chardon's avatar
M. Chardon committed
260
     */
M. Chardon's avatar
M. Chardon committed
261
    public static function get_tools_by_axis($axisid) {
M. Chardon's avatar
M. Chardon committed
262
263
        global $DB;
        $tools = array();
264
        $records = $DB->get_records(self::BDDTABLETOOL, array('axis' => $axisid));
M. Chardon's avatar
M. Chardon committed
265
        foreach ($records as $record) {
266
            array_push($tools, new tool($record));
M. Chardon's avatar
M. Chardon committed
267
268
269
270
271
272
273
274
275
276
277
278
        }
        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;
    }

279
    /**
280
     * Get all different contexts id
281
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
282
     * @return array<\assignfeedback_editpdfplus\bdd\axis> the axis with just their contextid
283
284
285
     */
    public static function get_all_different_contexts() {
        global $DB;
M. Chardon's avatar
M. Chardon committed
286
        return $DB->get_records_sql(self::makeSqlRequestSelect("DISTINCT(" . self::CONTEXTIDLIB . ")", self::BDDTABLEAXE));
287
288
    }

M. Chardon's avatar
M. Chardon committed
289
    /**
M. Chardon's avatar
M. Chardon committed
290
     * Update a tool
M. Chardon's avatar
M. Chardon committed
291
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
292
     * @param object $toolJson object contains tool's values to update
M. Chardon's avatar
M. Chardon committed
293
     * @return \assignfeedback_editpdfplus\bdd\tool
M. Chardon's avatar
M. Chardon committed
294
295
296
297
     */
    public static function edit_tool($toolJson) {
        global $DB;

298
        $record = $DB->get_record(self::BDDTABLETOOL, array('id' => $toolJson->toolid), '*', MUST_EXIST);
M. Chardon's avatar
M. Chardon committed
299
        $tool = new tool($record);
300
        $tool->axis = $toolJson->toolaxis;
M. Chardon's avatar
M. Chardon committed
301
302
303
304
305
306
        $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
307
308
309
        $tool->enabled = $toolJson->enabled;
        if ($toolJson->reply == "on") {
            $tool->reply = 1;
M. Chardon's avatar
M. Chardon committed
310
311
312
        } else {
            $tool->reply = 0;
        }
M. Chardon's avatar
M. Chardon committed
313
314
315
316
317
        $reorder = false;
        if ($tool->order_tool != $toolJson->order) {
            $tool->order_tool = $toolJson->order;
            $reorder = true;
        }
318
        if ($DB->update_record(self::BDDTABLETOOL, $tool)) {
M. Chardon's avatar
M. Chardon committed
319
320
321
            if ($reorder) {
                admin_editor::reorder_tool($tool->axis, $tool->id);
            }
M. Chardon's avatar
M. Chardon committed
322
323
324
325
326
            return $tool;
        }
        return null;
    }

M. Chardon's avatar
M. Chardon committed
327
328
329
330
331
332
333
334
335
336
337
    /**
     * Get number of annotations related to this tool
     * @global $DB
     * @param int $toolid
     * @return int number of annotations 
     */
    public static function getNbAnnotationsForTool($toolid) {
        global $DB;
        return $DB->count_records(self::BDDTABLEANNOT, array('toolid' => $toolid));
    }

338
    /**
M. Chardon's avatar
M. Chardon committed
339
     * Get all the type tools which are configurabled.
M. Chardon's avatar
M. Chardon committed
340
     * @return array<\assignfeedback_editpdfplus\bdd\type_tool> array of type tools
341
342
343
344
     */
    public static function get_typetools() {
        global $DB;
        $typetools = array();
345
        $records = $DB->get_records(self::BDDTABLETOOLTYPE, array('configurable' => 1));
346
        foreach ($records as $record) {
347
348
349
350
            $newTypeTool = page_editor::custom_type_tool(new type_tool($record));
            if ($newTypeTool->configurable > 0) {
                array_push($typetools, $newTypeTool);
            }
351
352
353
354
        }
        return $typetools;
    }

M. Chardon's avatar
M. Chardon committed
355
356
357
358
    /**
     * Get axis by its id
     * @global type $DB
     * @param Integer $axeid axis' id
M. Chardon's avatar
M. Chardon committed
359
     * @return \assignfeedback_editpdfplus\bdd\axis the axis
M. Chardon's avatar
M. Chardon committed
360
     */
M. Chardon's avatar
M. Chardon committed
361
362
    public static function getAxisById($axeid) {
        global $DB;
M. Chardon's avatar
M. Chardon committed
363
        return $DB->get_record(self::BDDTABLEAXE, array('id' => $axeid), '*', MUST_EXIST);
M. Chardon's avatar
M. Chardon committed
364
365
    }

M. Chardon's avatar
M. Chardon committed
366
367
368
    /**
     * Clone an axis to the context given in parameter
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
369
     * @param \assignfeedback_editpdfplus\bdd\axis $axisOrigin
M. Chardon's avatar
M. Chardon committed
370
371
372
     * @param Integer $context context's id
     * @return Integer id of the imported axis
     */
M. Chardon's avatar
M. Chardon committed
373
374
    public static function import_axis($axisOrigin, $context) {
        global $DB;
375
376
        $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
377
378
379
380
381
382
383
384
385
386

        $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;
        }

387
        return $DB->insert_record(self::BDDTABLEAXE, $axis);
M. Chardon's avatar
M. Chardon committed
388
389
    }

M. Chardon's avatar
M. Chardon committed
390
391
392
    /**
     * Clone a tool to a new axis
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
393
394
     * @param \assignfeedback_editpdfplus\bdd\tool $toolToImport tool to duplicate
     * @param \assignfeedback_editpdfplus\bdd\axis $axeNew axis to attached new tool
M. Chardon's avatar
M. Chardon committed
395
396
397
     * @param Integer $context context's id
     * @return Integer id of tool's created
     */
M. Chardon's avatar
M. Chardon committed
398
399
    public static function import_tool($toolToImport, $axeNew, $context) {
        global $DB;
400
401
        $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
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418

        $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;
        }
419
        return $DB->insert_record(self::BDDTABLETOOL, $tool);
M. Chardon's avatar
M. Chardon committed
420
421
    }

M. Chardon's avatar
M. Chardon committed
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
    /**
     * get model axis for a given user
     * @global $DB
     * @param $user moodle user
     * @return array set of model axis
     */
    public static function getCategoryModel($user) {
        global $DB;
        return $DB->get_records(self::BDDTABLEMODELAXIS, array('user' => $user));
    }

    /**
     * Add a new model on database
     * @global $DB
     * @param int $axeid axe's id
     * @param string $label label for the new model
     * @param USER $user moodle user
     * @return int id of the new model
     */
    public static function addModel($axeid, $label, $user) {
        global $DB;
        $model = new \stdClass();
        $model->axis = $axeid;
        $model->label = $label;
        $model->user = $user->id;
        return $DB->insert_record(self::BDDTABLEMODELAXIS, $model);
    }

    /**
     * get a model with from its id
     * @global $DB
     * @param int $modelid model's id
     * @return record model record
     */
    public static function gelModel($modelid) {
        global $DB;
        return $DB->get_record(self::BDDTABLEMODELAXIS, array('id' => $modelid), '*', MUST_EXIST);
    }

    /**
     * delete a given model
     * @global $DB
     * @param int $modelid id of the model to delete
     * @return boolean true if the delete is success
     */
    public static function delModel($modelid) {
        global $DB;
        $model = self::gelModel($modelid);
        if (!$model) {
            return false;
        }
        $axe = self::getAxisById($model->axis);
        if (!$axe) {
            return false;
        }
        if (!self::del_axis($axe->id)) {
            return false;
        }
        return $DB->delete_records(self::BDDTABLEMODELAXIS, array('id' => $modelid));
    }

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