Passed
Push — master ( eed2f4...e44814 )
by Andreas
32:42
created

_handler_trash()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 24
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 15
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 14
nc 3
nop 1
dl 0
loc 24
ccs 15
cts 15
cp 1
crap 3
rs 9.7998
c 0
b 0
f 0
1
<?php
2
/**
3
 * @package midgard.admin.asgard
4
 * @author The Midgard Project, http://www.midgard-project.org
5
 * @copyright The Midgard Project, http://www.midgard-project.org
6
 * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
7
 */
8
9
use Symfony\Component\HttpFoundation\Request;
10
11
/**
12
 * Undelete/purge interface
13
 *
14
 * @package midgard.admin.asgard
15
 */
16
class midgard_admin_asgard_handler_undelete extends midcom_baseclasses_components_handler
17
{
18
    use midgard_admin_asgard_handler;
19
20
    private $type = '';
21
22 3
    public function _on_initialize()
23
    {
24 3
        midcom::get()->head->add_jsfile(MIDCOM_STATIC_URL . '/jQuery/jquery.tablesorter.pack.js');
25 3
        midcom::get()->head->add_jsfile(MIDCOM_STATIC_URL . '/midgard.admin.asgard/jquery.batch_process.js');
26 3
        $this->add_stylesheet(MIDCOM_STATIC_URL . '/midgard.admin.asgard/tablewidget.css');
27 3
    }
28
29
    /**
30
     * Trash view
31
     */
32 1
    public function _handler_trash(array &$data)
33
    {
34 1
        midcom::get()->auth->require_admin_user();
35
36 1
        $data['view_title'] = $this->_l10n->get('trash');
37
38 1
        $data['types'] = [];
39 1
        foreach (midcom_connection::get_schema_types() as $type) {
40
            // Objects that don't have metadata should not be shown in trash.
41 1
            if (!midgard_reflector_object::has_metadata_class($type)) {
42 1
                debug_add("{$type} has no metadata, skipping");
43 1
                continue;
44
            }
45
46 1
            $qb = new midgard_query_builder($type);
47 1
            $qb->include_deleted();
48 1
            $qb->add_constraint('metadata.deleted', '=', true);
49 1
            $data['types'][$type] = $qb->count();
50
        }
51
52
        // Set the breadcrumb data
53 1
        $this->add_breadcrumb($this->router->generate('welcome'), $this->_l10n->get('midgard.admin.asgard'));
54 1
        $this->add_breadcrumb($this->router->generate('trash'), $this->_l10n->get('trash'));
55 1
        return $this->get_response('midgard_admin_asgard_trash');
56
    }
57
58
    /**
59
     * Trash view
60
     */
61 2
    public function _handler_trash_type(Request $request, string $type, array &$data)
62
    {
63 2
        midcom::get()->auth->require_admin_user();
64
65 2
        $this->type = $type;
66
67 2
        $data['view_title'] = sprintf($this->_l10n->get('%s trash'), midgard_admin_asgard_plugin::get_type_label($type));
68
69 2
        $dummy = new $type;
70 2
        $data['midcom_dba_classname'] = midcom::get()->dbclassloader->get_midcom_class_name_for_mgdschema_object($dummy);
71 2
        $data['type'] = $type;
72 2
        $data['reflector'] = midcom_helper_reflector::get($data['type']);
73 2
        $data['label_property'] = $data['reflector']->get_label_property();
74
75 2
        if ($request->request->has('undelete')) {
76 1
            $guids = $request->request->get('undelete');
77 1
            if ($request->request->has('purge')) {
78 1
                $this->_purge($guids);
79
            } else {
80
                $this->_undelete($guids);
81
            }
82 1
            return new midcom_response_relocate($this->router->generate('trash_type', ['type' => $type]));
83
        }
84
85 1
        $qb = new org_openpsa_qbpager_direct($data['type'], "{$data['type']}_trash");
86 1
        $qb->include_deleted();
87 1
        $qb->add_constraint('metadata.deleted', '=', true);
88 1
        $qb->add_order('metadata.revised', 'DESC');
89 1
        $data['qb'] = $qb;
90 1
        $data['trash'] = $qb->execute_unchecked();
91
92
        // Set the breadcrumb data
93 1
        $this->add_breadcrumb($this->router->generate('welcome'), $this->_l10n->get($this->_component));
94 1
        $this->add_breadcrumb($this->router->generate('trash'), $this->_l10n->get('trash'));
95 1
        $this->add_breadcrumb($this->router->generate('trash_type', ['type' => $type]), midgard_admin_asgard_plugin::get_type_label($type));
96
97 1
        $data['current_type'] = $this->type;
98 1
        $data['handler'] = $this;
99
100 1
        return $this->get_response('midgard_admin_asgard_trash_type');
101
    }
102
103 1
    private function _purge(array $guids)
104
    {
105 1
        $purged_size = 0;
106
107 1
        if (!$this->_request_data['midcom_dba_classname']) {
108
            // No DBA class for the type, use plain Midgard undelete API
109
            if ($guids) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $guids of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
110
                $qb = new midgard_query_builder($this->type);
111
                $qb->add_constraint('guid', 'IN', $guids);
112
                $qb->include_deleted();
113
                foreach ($qb->execute() as $object) {
114
                    if ($object->purge()) {
115
                        $purged_size += $object->metadata->size;
116
                    }
117
                }
118
            }
119
        } else {
120
            // Delegate purging to DBA
121 1
            $purged_size = midcom_baseclasses_core_dbobject::purge($guids, $this->type);
122
        }
123
124 1
        if ($purged_size) {
125
            midcom::get()->uimessages->add($this->_l10n->get('midgard.admin.asgard'), sprintf($this->_l10n->get('in total %s purged'), midcom_helper_misc::filesize_to_string($purged_size)), 'info');
126
        }
127 1
    }
128
129
    private function _undelete(array $guids)
130
    {
131
        // Delegate undeletion to DBA
132
        $undeleted_size = midcom_baseclasses_core_dbobject::undelete($guids);
133
        if ($undeleted_size > 0) {
134
            midcom::get()->uimessages->add($this->_l10n->get('midgard.admin.asgard'), sprintf($this->_l10n->get('in total %s undeleted'), midcom_helper_misc::filesize_to_string($undeleted_size)), 'info');
135
        }
136
    }
137
138
    public function show_type($object, int $indent = 0, string $prefix = '', bool $enable_undelete = true)
139
    {
140
        static $shown = [];
141
        static $url_prefix = '';
142
        if (!$url_prefix) {
143
            $url_prefix = midcom_core_context::get()->get_key(MIDCOM_CONTEXT_ANCHORPREFIX);
144
        }
145
146
        if (isset($shown[$object->guid])) {
147
            return;
148
        }
149
150
        $revisor = midcom::get()->auth->get_user($object->metadata->revisor);
151
152
        $reflector = midcom_helper_reflector_tree::get($object);
153
        $icon = $reflector->get_object_icon($object);
154
155
        echo "{$prefix}<tr>\n";
156
157
        $disabled = '';
158
        if (!$enable_undelete) {
159
            $disabled = ' disabled="disabled"';
160
        }
161
162
        $object_label = $reflector->get_object_label($object);
163
        if (empty($object_label)) {
164
            $object_label = $object->guid;
165
        }
166
        echo "{$prefix}    <td class=\"checkbox\"><input type=\"checkbox\" name=\"undelete[]\"{$disabled} value=\"{$object->guid}\" id=\"guid_{$object->guid}\" /></td>\n";
167
        echo "{$prefix}    <td class=\"label\" style=\"padding-left: {$indent}px\"><a href=\"". $this->router->generate('object_deleted', ['guid' =>$object->guid]) . "\">{$icon} " . $object_label . "</a></td>\n";
168
        echo "{$prefix}    <td class=\"nowrap\">" . strftime('%x %X', strtotime($object->metadata->revised)) . "</td>\n";
169
170
        if (!empty($revisor->guid)) {
171
            echo "{$prefix}    <td><a href=\"{$url_prefix}__mfa/asgard/object/view/{$revisor->guid}/\">{$revisor->name}</a></td>\n";
172
        } else {
173
            echo "{$prefix}    <td>&nbsp;</td>\n";
174
        }
175
        echo "{$prefix}    <td>" . midcom_helper_misc::filesize_to_string($object->metadata->size) . "</td>\n";
176
        echo "{$prefix}</tr>\n";
177
178
        if ($child_types = midcom_helper_reflector_tree::get_child_objects($object, true)) {
179
            $child_indent = $indent + 20;
180
            echo "{$prefix}<tbody class=\"children\">\n";
181
            foreach ($child_types as $type => $children) {
182
                if (   count($children) < 10
183
                    || isset($_GET['show_children'][$object->guid][$type])) {
184
                        foreach ($children as $child) {
185
                            $this->show_type($child, $child_indent, "{$prefix}    ", false);
186
                        }
187
                    } else {
188
                        echo "{$prefix}    <tr>\n";
189
                        echo "{$prefix}        <td class=\"label\" style=\"padding-left: {$child_indent}px\" colspan=\"5\"><a href=\"?show_children[{$object->guid}][{$type}]=1\">" . sprintf(midcom::get()->i18n->get_string('show %s %s children', 'midgard.admin.asgard'), count($children), midgard_admin_asgard_plugin::get_type_label($type)) . "</a></td>\n";
190
                        echo "{$prefix}    </tr>\n";
191
                    }
192
            }
193
194
            echo "{$prefix}</tbody>\n";
195
        }
196
        $shown[$object->guid] = true;
197
    }
198
}
199