source: trunk/server/www/app/models/gallery.php @ 297

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

Generate and display jobs and results for test suites

File size: 6.2 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 Gallery model
23 *
24 * Galleries can be used to publicly display requests
25 */
26class Gallery extends AppModel
27{
28        /** @var array Galleries have an owner and optionally a group who can edit the gallery */
29        public $belongsTo = array('Group', 'User');
30
31        /** @var string Every application supports a certain ODF doctype */
32        public $hasAndBelongsToMany = array('Request' => array('unique' => false));
33
34        /** Some galleries have a Testsuite */
35        public $hasOne = 'Testsuite';
36
37        /** @var array The model behaviors */
38        public $actsAs = array(
39                'Containable',
40                'Sluggable' => array('label' => 'name', 'overwrite' => true),
41                'Tree',
42        );
43
44        /**
45         * Check access control for this gallery
46         * @param string $user_id The user ID
47         * @param string $id The gallery ID
48         * @return boolean True or False
49         */
50        public function checkAccess($user_id, $id = false)
51        {
52                if ($id) {
53                        $id = $this->id;
54                }
55
56                if (!$id) {
57                        return false;
58                }
59
60                $gallery = $this->find('first', array(
61                        'conditions' => array('Gallery.id' => $id),
62                        'recursive' => -1,
63                ));
64
65                if (!$gallery) {
66                        return false;
67                }
68
69                if ($gallery['Gallery']['user_id'] == $user_id) {
70                        return true;
71                }
72
73                if ($this->User->Group->has_member($user_id, $gallery['Gallery']['group_id'])) {
74                        return true;
75                }
76
77                return false;
78        }
79
80        /**
81         * Add a request to a gallery
82         * @param string $request_id The request to add
83         * @param string $id The gallery ID, or $this->id
84         */
85        public function addRequest($request_id, $id = null)
86        {
87                if (!$id) {
88                        $id = $this->id;
89                }
90
91                $relation = $this->GalleriesRequest->find('first', array('conditions' => array(
92                        'gallery_id' => $id,
93                        'request_id' => $request_id,
94                )));
95
96                if (!empty($relation)) {
97                        return true;
98                }
99
100                $this->GalleriesRequest->create();
101                return $this->GalleriesRequest->save(array('GalleriesRequest' => array(
102                        'gallery_id' => $id,
103                        'request_id' => $request_id,
104                )));
105        }
106
107        /**
108         * Remove a request from a gallery
109         * @param string $request_id The request to add
110         * @param string $id The gallery ID, or $this->id
111         */
112        public function removeRequest($request_id, $id = null)
113        {
114                if (!$id) {
115                        $id = $this->id;
116                }
117
118                $relation = $this->GalleriesRequest->find('first', array('conditions' => array(
119                        'gallery_id' => $id,
120                        'request_id' => $request_id,
121                )));
122
123                if (!empty($relation)) {
124                        return $this->GalleriesRequest->del($relation['GalleriesRequest']['id']);
125                }
126
127                return true; // The relation didn't exist to begin with
128        }
129
130        /**
131         * Count the number of requests in this gallery
132         * @param int $id The Gallery ID
133         * @param bool $recursive True to count requests in subgalleries as well
134         */
135        public function requestCount($id = null, $recursive = false)
136        {
137                if (!$id) {
138                        $id = $this->id;
139                }
140
141                if (!$id) {
142                        return 0;
143                }
144
145                $num_requests = $this->GalleriesRequest->find('count', array(
146                        'conditions' => array('gallery_id' => $id),
147                ));
148
149                if ($recursive) {
150                        $gallery = $this->read(null, $id);
151
152                        if (!$gallery['Gallery']['lft'] && !$gallery['Gallery']['rght']) {
153                                return $num_requests;
154                        }
155
156                        $num_documents = $this->Request->query('SELECT COUNT(*) as `count`
157                                FROM `requests` AS `Request`
158                                LEFT JOIN `galleries_requests` AS `GalleriesRequest`
159                                        ON `Request`.`id` = `GalleriesRequest`.`request_id`
160                                LEFT JOIN `galleries` AS `Gallery`
161                                        ON `GalleriesRequest`.`gallery_id` = `Gallery`.`id`
162                                WHERE
163                                        `Gallery`.`lft` > ' . $gallery['Gallery']['lft'] . '
164                                        AND `Gallery`.`rght` < ' . $gallery['Gallery']['rght']);
165                        $num_requests = $num_requests + $num_documents[0][0]['count'];
166                }
167
168                return $num_requests;
169        }
170
171        /**
172         * Return all requests and jobs associated with a gallery and all subgalleries
173         * @param int $id The Gallery ID
174         * @return array
175         */
176        public function getRequests($id = null)
177        {
178                if (!$id) {
179                        $id = $this->id;
180                }
181
182                if (!$id) {
183                        return array();
184                }
185
186                $gallery = $this->find('first', array(
187                        'conditions' => array('Gallery.id' => $id),
188                        'recursive' => -1,
189                ));
190
191                $result = $this->GalleriesRequest->find('all', array(
192                        'conditions' => array('GalleriesRequest.gallery_id' => $id),
193                        'recursive' => -1,
194                ));
195                $request_ids = Set::extract('/GalleriesRequest/request_id', $result);
196
197                $result = $this->query('SELECT DISTINCT `GalleriesRequest`.`request_id`
198                        FROM `galleries_requests` AS `GalleriesRequest`
199                        LEFT JOIN `galleries` AS `Gallery`
200                                ON `GalleriesRequest`.`gallery_id` = `Gallery`.`id`
201                        WHERE
202                                `Gallery`.`lft` > ' . $gallery['Gallery']['lft'] . '
203                                AND `Gallery`.`rght` < ' . $gallery['Gallery']['rght']);
204                $subgallery_request_ids = Set::extract('/GalleriesRequest/request_id', $result);
205
206                $request_ids = Set::merge($request_ids, $subgallery_request_ids);
207
208                $requests = $this->Request->find('all', array(
209                        'contain' => array('Job', 'Mimetype'),
210                        'conditions' => array('Request.id' => $request_ids),
211                ));
212
213                return $requests;
214        }
215
216        /**
217         * Convert the Markdown description to HTML before saving
218         * @return boolean True to continue saving
219         */
220        public function beforeSave()
221        {
222                if (isset($this->data['Gallery']['description'])) {
223                        App::import('Vendor', 'markdown');
224                        App::import('Vendor', 'HTMLPurifier', array('file' => 'htmlpurifier/HTMLPurifier.standalone.php'));
225
226                        $config = HTMLPurifier_Config::createDefault();
227                        $config->set('Cache.SerializerPath', CACHE . DS . 'htmlpurifier');
228                        $purifier = new HTMLPurifier($config);
229
230                        $desc_html = Markdown($this->data['Gallery']['description']);
231                        $this->data['Gallery']['description_html'] = $purifier->purify($desc_html);
232                }
233
234                return true;
235        }
236}
237
238?>
Note: See TracBrowser for help on using the repository browser.