source: trunk/server/www/app/controllers/galleries_controller.php @ 298

Last change on this file since 298 was 298, checked in by sander, 11 years ago

Show abbreviated tree on large galleries

File size: 10.8 KB
Line 
1<?php
2/**
3 * Officeshots.org - Test your office documents in different applications
4 * Copyright (C) 2009 Stichting Lone Wolves
5 * Written by Sander Marechal <s.marechal@jejik.com>
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as
9 * published by the Free Software Foundation, either version 3 of the
10 * License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU Affero General Public License for more details.
16 *
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21/**
22 * The galleries controller
23 */
24class GalleriesController extends AppController
25{
26        /** @var array The components this controller uses */
27        public $components = array('AuthCert');
28       
29        /** The controller helpers */
30        public $helpers = array('Html', 'Form', 'Javascript', 'RequestModel', 'JobModel', 'ValidatorModel');
31
32        /** The models this controller uses */
33        public $uses = array('Gallery', 'Request', 'User');
34
35        /**
36         * Set the auth permissions for this controller
37         * @return void
38         */
39        public function beforeFilter()
40        {
41                parent::beforeFilter();
42                $this->AuthCert->allow('index', 'view');
43        }
44
45        /**
46         * Check if the current user has write access to the gallery
47         * @param string $slug The unique gallery slug
48         */
49        private function _checkAccess($slug)
50        {
51                $gallery = $this->Gallery->find('first', array(
52                        'conditions' => array('Gallery.slug' => $slug),
53                        'recursive' => -1,
54                ));
55
56                // Gallery does not exist
57                if (empty($gallery)) {
58                        return false;
59                }
60
61                // User owns the gallery
62                if ($gallery['Gallery']['user_id'] == $this->AuthCert->user('id')) {
63                        return true;
64                }
65
66                // Gallery is assigned to a group the user is a member of
67                if (!empty($gallery['Gallery']['group_id'])) {
68                        return $this->User->Group->has_member($this->AuthCert->user('id'), $gallery['Gallery']['group_id']);
69                }
70
71                return false;
72        }
73
74        /**
75         * Sort an array of Galleries threaded, like find('threaded') would do
76         */
77        private function _sortThreaded($results)
78        {
79                $return = $idMap = array();
80                $ids = Set::extract($results, '{n}.Gallery.id');
81
82                foreach ($results as $result) {
83                        $result['children'] = array();
84                        $id = $result['Gallery']['id'];
85                        $parentId = $result['Gallery']['parent_id'];
86                        if (isset($idMap[$id]['children'])) {
87                                $idMap[$id] = array_merge($result, (array)$idMap[$id]);
88                        } else {
89                                $idMap[$id] = array_merge($result, array('children' => array()));
90                        }
91                        if (!$parentId || !in_array($parentId, $ids)) {
92                                $return[] =& $idMap[$id];
93                        } else {
94                                $idMap[$parentId]['children'][] =& $idMap[$id];
95                        }
96                }
97                if (count($return) > 1) {
98                        $ids = array_unique(Set::extract('/Gallery/parent_id', $return));
99                        if (count($ids) > 1) {
100                                $root = $return[0]['Gallery']['parent_id'];
101                                foreach ($return as $key => $value) {
102                                        if ($value['Gallery']['parent_id'] != $root) {
103                                                unset($return[$key]);
104                                        }
105                                }
106                        }
107                }
108                return $return;
109        }
110
111        /**
112         * Show a list of all galleries
113         */
114        public function index()
115        {
116                $this->Gallery->contain(array('User', 'Request'));
117                $galleries = $this->paginate('Gallery', array('Gallery.parent_id' => null));
118
119                foreach ($galleries as &$gallery) {
120                        $gallery['Gallery']['num_documents'] = $this->Gallery->requestCount($gallery['Gallery']['id'], true);
121                }
122
123                $this->set('galleries', $galleries);
124        }
125
126        /**
127         * View a gallery
128         * @param string $slug The gallery slug
129         */
130        public function view($slug = null)
131        {
132                if (!$slug) {
133                        $this->Session->setFlash(__('Invalid Gallery.', true));
134                        $this->redirect(array('action'=>'index'));
135                }
136
137                // Get the gallery
138                $gallery = $this->Gallery->find('first', array(
139                        'conditions' => array('Gallery.slug' => $slug),
140                        'contain' => array(
141                                'Request',
142                                'Request.Validator' => array('order' => 'Validator.name ASC'),
143                                'Request.Job' => array('order' => array(
144                                        'Application.name ASC',
145                                        'Job.version ASC',
146                                        'Platform.name ASC',
147                                        'Format.name ASC',
148                                )),
149                                'Request.Job.Application',
150                                'Request.Job.Format',
151                                'Request.Job.Platform',
152                                'Request.Job.Result',
153                                'Request.Job.Result.Validator',
154                        ),
155                ));
156
157                // Find out how many requests this gallery has. This determins the type of view
158                $requestCount = $this->Gallery->requestCount($gallery['Gallery']['id'], true);
159                $abbreviate = ($requestCount >= Configure::read('Gallery.abbreviate'));
160
161                // Get the children of this gallery
162                $children = $this->Gallery->find('all', array(
163                        'conditions' => array(
164                                'Gallery.lft >' => $gallery['Gallery']['lft'],
165                                'Gallery.rght <' => $gallery['Gallery']['rght'],
166                        ),
167                        'contain' => array('Request'),
168                ));
169
170                foreach ($children as &$child) {
171                        foreach ($child['Request'] as &$request) {
172                                $request['Validator'] = $this->Request->Validator->find('all', array(
173                                        'conditions' => array('Validator.parent_id' => $request['id']),
174                                        'order'      => 'Validator.name ASC',
175                                        'recursive'  => -1,
176                                ));
177
178                                if (!$abbreviate) {
179                                        $request['Job'] = $this->Request->Job->find('all', array(
180                                                'conditions' => array('Job.request_id' => $request['id']),
181                                                'contain' => array(
182                                                        'Application',
183                                                        'Format',
184                                                        'Platform',
185                                                        'Result',
186                                                        'Result.Validator'
187                                                ),
188                                                'order' => array(
189                                                        'Application.name ASC',
190                                                        'Job.version ASC',
191                                                        'Platform.name ASC',
192                                                        'Format.name ASC',
193                                                ),
194                                        ));
195
196                                        // Fix array layout to match a regular query layout
197                                        foreach ($request['Job'] as &$job) {
198                                                foreach ($job['Job'] as $attr => $value) {
199                                                        $job[$attr] = $value;
200                                                }
201                                                unset($job['Job']);
202                                        }
203                                }
204                        }
205                }
206
207                $gallery['children'] = $this->_sortThreaded($children);
208
209                // Get the path to this gallery
210                $path = $this->Gallery->getpath($gallery['Gallery']['id']);
211                array_pop($path);
212
213                // Check access
214                $access = $this->_checkAccess($slug);
215                $this->set(compact('gallery', 'path', 'access', 'abbreviate'));
216        }
217
218        /**
219         * Add a new gallery
220         */
221        public function add()
222        {
223                if (!empty($this->data)) {
224                        $this->data['Gallery']['user_id'] = $this->AuthCert->user('id');
225
226                        $this->Gallery->create();
227                        if ($this->Gallery->save($this->data)) {
228                                $this->Session->setFlash(__('The Gallery has been saved', true));
229                                $gallery = $this->Gallery->read('slug', $this->Gallery->id);
230                                $this->redirect(array('action' => 'view', $gallery['Gallery']['slug']));
231                        } else {
232                                $this->Session->setFlash(__('The Gallery could not be saved. Please, try again.', true));
233                        }
234                }
235
236                $groups = $this->User->find('first', array(
237                        'contain' => array('Group'),
238                        'conditions' => array('User.id' => $this->AuthCert->user('id')),
239                ));
240
241                $groups = array_combine(
242                        Set::extract('/Group/id', $groups),
243                        Set::extract('/Group/name', $groups)
244                );
245
246                $this->set(compact('groups'));
247                $this->render('edit');
248        }
249
250        /**
251         * Edit a gallery
252         * @param string $slug the unique gallery slug
253         */
254        public function edit($slug = null)
255        {
256                if (!empty($this->data)) {
257                        $slug = $this->Gallery->read('slug', $this->data['Gallery']['id']);
258                }
259
260                if (!$slug && empty($this->data)) {
261                        $this->Session->setFlash(__('Invalid Gallery', true));
262                        $this->redirect(array('action' => 'index'));
263                }
264
265                if (!$this->_checkAccess($slug)) {
266                        $this->Session->setFlash(__('You are not allowed to edit this gallery', true));
267                        $this->redirect(array('action' => 'view', $slug));
268                }
269
270                if (!empty($this->data)) {
271                        if ($this->Gallery->save($this->data)) {
272                                $this->Session->setFlash(__('The Gallery has been saved', true));
273                                $this->redirect(array('action' => 'view', $this->data['Gallery']['slug']));
274                        } else {
275                                $this->Session->setFlash(__('The Gallery could not be saved. Please, try again.', true));
276                        }
277                } else {
278                        $this->data = $this->Gallery->find('first', array(
279                                'conditions' => array('Gallery.slug' => $slug),
280                                'recursive' => -1,
281                        ));
282                }
283
284                $groups = $this->User->find('first', array(
285                        'contain' => array('Group'),
286                        'conditions' => array('User.id' => $this->AuthCert->user('id')),
287                ));
288
289                $groups = array_combine(
290                        Set::extract('/Group/id', $groups),
291                        Set::extract('/Group/name', $groups)
292                );
293
294                $this->set(compact('groups'));
295        }
296
297        /**
298         * Delete a gallery
299         * @param string $slug the unique gallery slug
300         */
301        public function delete($slug = null)
302        {
303                if (!$slug) {
304                        $this->Session->setFlash(__('Invalid Gallery', true));
305                        $this->redirect(array('action'=>'index'));
306                }
307
308                if (!$this->_checkAccess($slug)) {
309                        $this->Session->setFlash(__('You are not allowed to delete this gallery', true));
310                        $this->redirect(array('action' => 'view', $slug));
311                }
312
313                $gallery = $this->Gallery->find('first', array(
314                        'recursive' => -1,
315                        'conditions' => array('Gallery.slug' => $slug),
316                ));
317
318                if ($this->Gallery->del($gallery['Gallery']['id'])) {
319                        $this->Session->setFlash(__('Gallery deleted', true));
320                        $this->redirect(array('action'=>'index'));
321                }
322        }
323
324        /**
325         * Add a document to the gallery
326         * @param string $slug the unique gallery slug
327         */
328        public function add_document($slug)
329        {
330                if (!$this->_checkAccess($slug)) {
331                        $this->Session->setFlash(__('You are not allowed to edit this gallery', true));
332                        $this->redirect(array('action' => 'view', $slug));
333                }
334
335                if (!empty($this->data)) {
336                        $gallery = $this->Gallery->find('first', array(
337                                'conditions' => array('Gallery.slug' => $slug),
338                                'recursive' => -1,
339                        ));
340
341                        if (!$this->Gallery->addRequest(array_shift($this->data['Gallery']['requests']), $gallery['Gallery']['id'])) {
342                                $this->Session->setFlash(__('The document could not be added.', true));
343                        }
344               
345                        $this->redirect(array('action' => 'view', $slug));
346                }
347
348                $tmp_requests = $this->Request->find('all', array(
349                        'conditions' => array('Request.user_id' => $this->AuthCert->user('id')),
350                        'order' => 'Request.created DESC',
351                        'recursive' => -1,
352                ));
353
354                $requests = array();
355                foreach ($tmp_requests as $request) {
356                        $requests[$request['Request']['id']] = $request['Request']['created'] . ': '
357                                . $request['Request']['filename']
358                                . ' (' . $request['Request']['result_count']
359                                . '/'  . $request['Request']['job_count'] . ')';
360                }
361
362                $this->set(compact('slug', 'requests'));
363        }
364
365        /**
366         * Remove a document from a gallery
367         * @param string $slug the unique gallery slug
368         * @param string $request_id The request ID
369         */
370        public function remove_document($slug, $request_id)
371        {
372                if (!$this->_checkAccess($slug)) {
373                        $this->Session->setFlash(__('You are not allowed to edit this gallery', true));
374                        $this->redirect(array('action' => 'view', $slug));
375                }
376
377                $gallery = $this->Gallery->find('first', array(
378                        'conditions' => array('Gallery.slug' => $slug),
379                        'recursive' => -1,
380                ));
381
382                if (!$this->Gallery->removeRequest($request_id, $gallery['Gallery']['id'])) {
383                        $this->Session->setFlash(__('The document could not be removed.', true));
384                }
385               
386                $this->redirect(array('action' => 'view', $slug));
387        }
388}
389
390?>
Note: See TracBrowser for help on using the repository browser.