Gitlab CSE Unil

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

M. Chardon's avatar
M. Chardon committed
340
341
342
    /**
     * Clone an axis to the context given in parameter
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
343
     * @param \assignfeedback_editpdfplus\bdd\axis $axisOrigin
M. Chardon's avatar
M. Chardon committed
344
345
346
     * @param Integer $context context's id
     * @return Integer id of the imported axis
     */
M. Chardon's avatar
M. Chardon committed
347
348
    public static function import_axis($axisOrigin, $context) {
        global $DB;
349
350
        $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
351
352
353
354
355
356
357
358
359
360

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

361
        return $DB->insert_record(self::BDDTABLEAXE, $axis);
M. Chardon's avatar
M. Chardon committed
362
363
    }

M. Chardon's avatar
M. Chardon committed
364
365
366
    /**
     * Clone a tool to a new axis
     * @global type $DB
M. Chardon's avatar
M. Chardon committed
367
368
     * @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
369
370
371
     * @param Integer $context context's id
     * @return Integer id of tool's created
     */
M. Chardon's avatar
M. Chardon committed
372
373
    public static function import_tool($toolToImport, $axeNew, $context) {
        global $DB;
374
375
        $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
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392

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

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