the times in the first row were not in GMT but in local time
[iserv-mod-room-reservation.git] / includes / mod_roomReservationConfig.inc
1 <?php
2 /**
3 * @file mod_roomReservationConfig.inc
4 * Handling of the configuration file
5 * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
6 * @date 10.01.2008
7 *
8 * Copyright © 2007 Roland Hieber
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining
11 * copy of this software and associated documentation files (the "Software"),
12 * to deal in the Software without restriction, including without limitation
13 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 * and/or sell copies of the Software, and to permit persons to whom the
15 * Software is furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26 * THE SOFTWARE.
27 */
28
29 require_once("sec/secure.inc");
30 require_once("mod_room-reservation/functions.inc");
31 require_once("mod_room-reservation/mod_roomReservationTimeslice.inc");
32
33 /**
34 * Determines if a privilege has been assigned
35 * @param $sPriv (string) Privilege to test
36 * @return bool
37 */
38 function rrPrivilegeAssigned($sPriv) {
39 $h = db_query("SELECT act FROM privileges_assign WHERE privilege = $1;",
40 $sPriv);
41 return pg_num_rows($h) > 0;
42 }
43
44 /**
45 * Retrieve all groups that have a privilege assigned
46 * @param $strPriv (string) Privilege to test
47 * @return array
48 */
49 function rrPrivilegedGroups($strPriv) {
50 $aReturn = array();
51 $h = db_query("SELECT act FROM privileges_assign WHERE privilege = $1 ".
52 "ORDER BY act;", $strPriv);
53 if(pg_num_rows($h) > 0) {
54 while($a = pg_fetch_array($h)) {
55 $aReturn[] = $a["act"];
56 }
57 }
58 return $aReturn;
59 }
60
61 /**
62 * User-defined compare function to compare timeslices
63 * @param $oTs1 (mod_roomReservationTimeslice)
64 * @param $oTs2 (mod_roomReservationTimeslice)
65 * @return (int) <tt>-1</tt> if $oTs1 begins before $oTs2,
66 * <tt>0</tt> if the $oTs1 and $oTs2 have the same beginning,
67 * <tt>1</tt> if $oTs1 begins after $oTs2.
68 */
69 function rrConfigSortTimeslices(mod_roomReservationTimeslice $oTs1,
70 mod_roomReservationTimeslice $oTs2) {
71 if($oTs1->getBegin() == $oTs2->getBegin()) {
72 return 0;
73 } else {
74 return ($oTs1->getBegin() > $oTs2->getBegin()) ? 1 : -1;
75 }
76 }
77
78 define("MOD_ROOM_RESERVATION_CONFIGFILE_HEADER", "<?php
79 /**
80 * configuration file for package iserv-room-reservation
81 * This file is written by the configuration script. Do not change it manually.
82 */\n");
83
84 /*****************************************************************************/
85 /**
86 * Handling of the configuration file
87 * @todo document
88 */
89 class mod_roomReservationConfig {
90
91 /** (array of rmTimeslice's) Timeslices */
92 protected $aoTimeslices;
93 /** (bool) Determine if the weekend is shown */
94 protected $bShowWeekend;
95 /** (bool) Determine if the strings "1. lesson", "2. lesson" etc are shown */
96 protected $bShowLessons;
97 /** (array of strings) error messages */
98 protected $asMessages;
99
100 /***************************************************************************/
101 /**
102 * @name Constructor
103 * @{
104 * Constructor.
105 * @return mod_roomReservationConfig
106 */
107 public function __construct() {
108 $this->flushTimeslices();
109 $this->setShowWeekend(false);
110 $this->setShowLessons(true);
111 $this->asMessages = array();
112
113 $this->readConfig();
114 }
115
116 /**
117 * **************************************************************************
118 * @}
119 * @name Access to attributes
120 * @{
121 */
122
123 /**
124 * Add a timeslice. A check is done that the timeslices do not overlap, and
125 * in this case, an Exception is thrown.
126 * @param $oTs (mod_roomReservationTimeslice)
127 * @throws Exception
128 * @return void
129 */
130 public function addTimeslice(mod_roomReservationTimeslice $oTs) {
131 // Check for overlapping timeslices
132 foreach($this->aoTimeslices as $oOldTs) {
133 if(($oOldTs->getBegin() < $oTs->getEnd() and
134 $oOldTs->getEnd() > $oTs->getBegin())) {
135 throw new Exception(
136 MOD_ROOM_RESERVATION_ERROR_CONFIG_OVERLAPPING_TIMESLICE);
137 }
138 }
139 $this->aoTimeslices[] = $oTs;
140 usort($this->aoTimeslices, "rrConfigSortTimeslices");
141 return;
142 }
143
144 /**
145 * Delete a timeslice
146 * @param $oTs (mod_roomReservationTimeslice) the timeslice to delete. If
147 * the timeslice is not found, an Exception is thrown.
148 * @throws Exception
149 * @return void
150 */
151 public function deleteTimeslice(mod_roomReservationTimeslice $oTs) {
152 for($i = 0; $i < count($this->aoTimeslices); $i++) {
153 if($this->aoTimeslices[$i]->getBegin() == $oTs->getBegin() and
154 $this->aoTimeslices[$i]->getEnd() == $oTs->getEnd()) {
155 // use array_splice because it renumbers the keys
156 array_splice($this->aoTimeslices, $i, 1);
157 return;
158 }
159 }
160 throw new Exception(MOD_ROOM_RESERVATION_ERROR_CONFIG_NO_SUCH_TIMESLICE);
161 }
162
163 /**
164 * Delete all timeslices.
165 * @return void
166 */
167 public function flushTimeslices() { $this->aoTimeslices = array(); }
168
169 /**
170 * Show or hide the weekend
171 * @param $b (bool)
172 */
173 public function setShowWeekend($b) { $this->bShowWeekend = ($b == true); }
174
175 /**
176 * Show or hide the lesson strings in the booking table
177 * @param $b (bool)
178 */
179 public function setShowLessons($b) { $this->bShowLessons = ($b == true); }
180
181 /**
182 * Add a message to the internal array of (error) messages
183 * @param $sMessage (string)
184 */
185 public function addMessage($sMessage) {
186 array_merge($this->asMessages, array($sMessage));
187 }
188
189 /**
190 * Get all timeslices in chronological order
191 * @return array of rmTimeslice
192 */
193 public function getTimeslices() { return $this->aoTimeslices; }
194
195 /**
196 * Return the starting times of every timeslice
197 * @param $bFormat (bool) <tt>true</tt>: Format the times according to the
198 * current locale
199 * <tt>false</tt>: return just the timestamps
200 * @return array
201 */
202 public function getTimesliceBeginnings($bFormat = false) {
203 $aot = $this->getTimeslices();
204 $aRet = array();
205 foreach($aot as $ao) {
206 $aRet[] = $bFormat ? _date("%#I:%M %p", $ao->getBegin()) :
207 $ao->getBegin();
208 }
209 return $aRet;
210 }
211
212 /**
213 * Return the ending times of every timeslice
214 * @param $bFormat (bool) <tt>true</tt>: Format the times according to the
215 * current locale
216 * <tt>false</tt>: return just the timestamps
217 * @return array
218 */
219 public function getTimesliceEndings($bFormat = false) {
220 $aot = $this->getTimeslices();
221 $aRet = array();
222 foreach($aot as $ao) {
223 $aRet[] = $bFormat ? _date("%#I:%M %p", $ao->getEnd()) : $ao->getEnd();
224 }
225 return $aRet;
226 }
227
228 /**
229 * Get a timeslice
230 * @param $n (int) index of the timeslice in the array
231 * @return rmTimeslice
232 */
233 public function getTimeslice($n) { return $this->aoTimeslices[$n]; }
234
235 /**
236 * Determine if the weekend is shown
237 * @return bool
238 */
239 public function isShowWeekend() { return ($this->bShowWeekend == true); }
240
241 /**
242 * Determine if the lesson strings in the booking table are shown
243 * @return bool
244 */
245 public function isShowLessons() { return ($this->bShowLessons == true); }
246
247 /**
248 * Determine if the current user has admin rights. This function tests
249 * if the user is in a group which has the privilege of admin rights.
250 * @todo test
251 * @return bool
252 */
253 public function userIsAdmin() {
254 return secure_privilege("mod_roomreservation_admin");
255 }
256
257 /**
258 * Determine if the current user can book rooms. This function tests
259 * if the user is in a group which has the privilege to book rooms.
260 * If no group has this privilege, all users can book.
261 * @todo test
262 * @return bool
263 */
264 public function userCanBook() {
265 if(!rrPrivilegeAssigned("mod_roomreservation_book")) {
266 // If the privilege is not assigned to any group, all users can book
267 return true;
268 } else {
269 // If user is admin, it makes sense that he can book rooms ;-)
270 return secure_privilege("mod_roomreservation_book") ||
271 secure_privilege("mod_roomreservation_admin");
272 }
273 }
274
275 /**
276 * Determine if the current user can view bookings. This function tests
277 * if the user is in a group which has been configured as a group who
278 * can view bookings. If no groups are configured, any user can view the
279 * bookings table.
280 * @todo test
281 * @return bool
282 */
283 public function userCanView() {
284 if(!rrPrivilegeAssigned("mod_roomreservation_view")) {
285 // If the privilege is not assigned to any group, all users can view
286 return true;
287 } else {
288 // If user is admin or can book, it makes sense that he can view bookings
289 return secure_privilege("mod_roomreservation_admin") ||
290 secure_privilege("mod_roomreservation_book") ||
291 secure_privilege("mod_roomreservation_view");
292 }
293 }
294
295 /**
296 * Get the messages that have been produced
297 * @return string
298 */
299 public function getMessages() {
300 return join("\n", $this->asMessages);
301 }
302
303 /***************************************************************************/
304 /**
305 * @}
306 * @name Operations
307 * @{
308 */
309
310 /**
311 * Write the current state of this instance to the config file.
312 * @throws IOException
313 * @return bool
314 */
315 public function writeConfig() {
316 // Open config file
317 $hFile = fopen("mod_room-reservation/config.inc", "w", true);
318 if(!is_resource($hFile)) {
319 throw new IOException(MOD_ROOM_RESERVATION_ERROR_OPEN_FILE);
320 return false;
321 }
322 // Try to lock file repeatedly
323 for($n = 0; !flock($hFile, LOCK_EX); $n++) {
324 if($n > 10) {
325 throw new IOException(MOD_ROOM_RESERVATION_ERROR_OPEN_FILE);
326 return false; // Give up
327 } else {
328 sleep(0.2); // Retry after 100 ms
329 }
330 }
331
332 // Create text for config file
333 $strFile = MOD_ROOM_RESERVATION_CONFIGFILE_HEADER;
334
335 // Timeslices
336 $strFile .= "\$this->flushTimeslices();\n";
337 foreach($this->getTimeslices() as $oTs) {
338 $strFile .= sprintf("\$this->addTimeslice(new ".
339 "mod_roomReservationTimeslice(%d, %d));\n", $oTs->getBegin(),
340 $oTs->getEnd());
341 }
342
343 // Show weekend
344 $strFile .= sprintf("\$this->setShowWeekend(%s);\n",
345 $this->isShowWeekend() ? "true" : "false");
346
347 // Show lessons
348 $strFile .= sprintf("\$this->setShowLessons(%s);\n",
349 $this->isShowLessons() ? "true" : "false");
350
351 $strFile .= "?>";
352
353 // Write to config file and unlock it
354 if(fwrite($hFile, $strFile) == false) {
355 throw new IOException(MOD_ROOM_RESERVATION_ERROR_WRITE_FILE);
356 return false;
357 }
358 if(!flock($hFile, LOCK_UN)) {
359 throw new IOException(MOD_ROOM_RESERVATION_ERROR_UNLOCK_FILE);
360 return false;
361 }
362
363 rrInsertLog("Konfiguration verändert");
364 return true;
365 }
366
367 /**
368 * Read configuration from file. Returns <tt>false</tt> if an error occured,
369 * in this case getMessages() contains error messages.
370 * @return bool
371 */
372 public function readConfig() {
373 global $g_rmCfg;
374 try {
375 require("mod_room-reservation/config.inc");
376 } catch(Exception $e) {
377 $this->addMessage($e->getMessage());
378 }
379 }
380
381 /** @} */
382 }
383 ?>
This page took 0.064859 seconds and 5 git commands to generate.