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
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

namespace assignfeedback_editpdfplus;

M. Chardon's avatar
M. Chardon committed
28
29
use assignfeedback_editpdfplus\bdd\axis;
use assignfeedback_editpdfplus\bdd\type_tool;
M. Chardon's avatar
M. Chardon committed
30
use assignfeedback_editpdfplus\bdd\tool;
M. Chardon's avatar
M. Chardon committed
31
32
33
34
35
36
37
38
39
40
41
42

/**
 * 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 {

43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
    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
63
    /**
M. Chardon's avatar
M. Chardon committed
64
     * Add an axis
M. Chardon's avatar
M. Chardon committed
65
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
66
67
68
     * @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
69
70
71
72
     */
    public static function add_axis($axisLabel, $context) {
        global $DB;

73
74
        $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
75
76
77
78
79
80
81
82
83
84

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

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

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

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

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

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

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

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

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

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

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

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

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

M. Chardon's avatar
M. Chardon committed
245
246
247
248
    /**
     * Get all tools by an axis' id
     * @global type $DB
     * @param Integer $axisid axis' id
M. Chardon's avatar
M. Chardon committed
249
     * @return array<\assignfeedback_editpdfplus\bdd\tool> the toolbar, order by order_tool
M. Chardon's avatar
M. Chardon committed
250
     */
M. Chardon's avatar
M. Chardon committed
251
    public static function get_tools_by_axis($axisid) {
M. Chardon's avatar
M. Chardon committed
252
253
        global $DB;
        $tools = array();
254
        $records = $DB->get_records(self::BDDTABLETOOL, array('axis' => $axisid));
M. Chardon's avatar
M. Chardon committed
255
        foreach ($records as $record) {
256
            array_push($tools, new tool($record));
M. Chardon's avatar
M. Chardon committed
257
258
259
260
261
262
263
264
265
266
267
268
        }
        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;
    }

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

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

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

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

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

M. Chardon's avatar
M. Chardon committed
345
346
347
    /**
     * Clone an axis to the context given in parameter
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
348
     * @param \assignfeedback_editpdfplus\bdd\axis $axisOrigin
M. Chardon's avatar
M. Chardon committed
349
350
351
     * @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
    /**
     * Clone a tool to a new axis
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
372
373
     * @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
374
375
376
     * @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
}