#119 added basic shift json export support using same pattern like ical export

This commit is contained in:
Philip Häusler 2013-09-10 14:27:31 +02:00
parent 4b22847976
commit a47b1935cb
10 changed files with 290 additions and 227 deletions

View File

@ -127,61 +127,6 @@ INSERT INTO `FAQ` (`FID`, `Frage_de`, `Antwort_de`, `Frage_en`, `Antwort_en`, `S
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `GroupPrivileges`
--
DROP TABLE IF EXISTS `GroupPrivileges`;
CREATE TABLE IF NOT EXISTS `GroupPrivileges` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`group_id` int(11) NOT NULL,
`privilege_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `group_id` (`group_id`,`privilege_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=191 ;
--
-- Daten für Tabelle `GroupPrivileges`
--
INSERT INTO `GroupPrivileges` (`id`, `group_id`, `privilege_id`) VALUES
(187, -3, 28),
(24, -1, 5),
(177, -2, 24),
(176, -2, 8),
(23, -1, 2),
(142, -5, 16),
(141, -5, 28),
(175, -2, 11),
(174, -2, 26),
(86, -6, 21),
(140, -5, 6),
(139, -5, 12),
(173, -2, 9),
(138, -5, 14),
(137, -5, 13),
(136, -5, 7),
(172, -2, 17),
(87, -6, 18),
(171, -2, 15),
(85, -6, 10),
(170, -2, 3),
(88, -1, 1),
(186, -3, 19),
(169, -2, 4),
(109, -4, 27),
(135, -5, 31),
(184, -3, 27),
(143, -5, 5),
(144, -5, 33),
(188, -3, 16),
(185, -3, 32),
(189, -3, 33),
(168, -2, 34),
(190, -3, 25);
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `Groups`
--
@ -322,6 +267,62 @@ CREATE TABLE IF NOT EXISTS `news_comments` (
--
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `GroupPrivileges`
--
DROP TABLE IF EXISTS `GroupPrivileges`;
CREATE TABLE IF NOT EXISTS `GroupPrivileges` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`group_id` int(11) NOT NULL,
`privilege_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `group_id` (`group_id`,`privilege_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=203 ;
--
-- Daten für Tabelle `GroupPrivileges`
--
INSERT INTO `GroupPrivileges` (`id`, `group_id`, `privilege_id`) VALUES
(187, -3, 28),
(24, -1, 5),
(200, -2, 11),
(199, -2, 26),
(23, -1, 2),
(142, -5, 16),
(141, -5, 28),
(198, -2, 9),
(197, -2, 17),
(86, -6, 21),
(140, -5, 6),
(139, -5, 12),
(196, -2, 35),
(138, -5, 14),
(137, -5, 13),
(136, -5, 7),
(195, -2, 15),
(87, -6, 18),
(194, -2, 3),
(85, -6, 10),
(193, -2, 4),
(88, -1, 1),
(186, -3, 19),
(192, -2, 30),
(109, -4, 27),
(135, -5, 31),
(184, -3, 27),
(143, -5, 5),
(144, -5, 33),
(188, -3, 16),
(185, -3, 32),
(189, -3, 33),
(191, -2, 34),
(190, -3, 25),
(201, -2, 8),
(202, -2, 24);
-- --------------------------------------------------------
--
@ -335,19 +336,19 @@ CREATE TABLE IF NOT EXISTS `Privileges` (
`desc` varchar(1024) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=35 ;
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=36 ;
--
-- Daten für Tabelle `Privileges`
--
INSERT INTO `Privileges` (`id`, `name`, `desc`) VALUES
(1, 'start', 'Startseite für Gäste/Nicht eingeloggte User'),
(1, 'start', 'Startseite für Gäste/Nicht eingeloggte User'),
(2, 'login', 'Logindialog'),
(3, 'news', 'Anzeigen der News-Seite'),
(4, 'logout', 'User darf sich ausloggen'),
(5, 'register', 'Einen neuen Engel registerieren'),
(6, 'admin_rooms', 'Räume administrieren'),
(6, 'admin_rooms', 'Räume administrieren'),
(7, 'admin_angel_types', 'Engel Typen administrieren'),
(8, 'user_settings', 'User profile settings'),
(9, 'user_messages', 'Writing and reading messages from user to user'),
@ -374,7 +375,9 @@ INSERT INTO `Privileges` (`id`, `name`, `desc`) VALUES
(31, 'admin_active', 'Mark angels as active and if they got a t-shirt.'),
(32, 'admin_free', 'Show a list of free/unemployed angels.'),
(33, 'admin_user_angeltypes', 'Confirm restricted angel types'),
(34, 'atom', ' Atom news export');
(34, 'atom', ' Atom news export'),
(35, 'shifts_json_export', 'Export shifts in JSON format');
-- --------------------------------------------------------
@ -1216,18 +1219,18 @@ CREATE TABLE IF NOT EXISTS `User` (
`Art` varchar(30) DEFAULT NULL,
`kommentar` text,
`Hometown` varchar(255) NOT NULL DEFAULT '',
`ical_key` varchar(32) NOT NULL,
`api_key` varchar(32) NOT NULL,
PRIMARY KEY (`UID`,`Nick`),
UNIQUE KEY `Nick` (`Nick`),
KEY `ical_key` (`ical_key`)
KEY `api_key` (`api_key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
--
-- Daten für Tabelle `User`
--
INSERT INTO `User` (`UID`, `Nick`, `Name`, `Vorname`, `Alter`, `Telefon`, `DECT`, `Handy`, `email`, `ICQ`, `jabber`, `Size`, `Passwort`, `Gekommen`, `Aktiv`, `Tshirt`, `color`, `Sprache`, `Avatar`, `Menu`, `lastLogIn`, `CreateDate`, `Art`, `kommentar`, `Hometown`, `ical_key`) VALUES
(1, 'admin', 'Gates', 'Bill', 42, '', '', '', '', '', '', '', '$23PstrXfk7Nw', 1, 1, 0, 10, 'DE', 115, 'L', 1371899094, '0000-00-00 00:00:00', '', '', '', '1b02f4586319e75000b3919380624ab5');
INSERT INTO `User` (`UID`, `Nick`, `Name`, `Vorname`, `Alter`, `Telefon`, `DECT`, `Handy`, `email`, `ICQ`, `jabber`, `Size`, `Passwort`, `Gekommen`, `Aktiv`, `Tshirt`, `color`, `Sprache`, `Avatar`, `Menu`, `lastLogIn`, `CreateDate`, `Art`, `kommentar`, `Hometown`, `api_key`) VALUES
(1, 'admin', 'Gates', 'Bill', 42, '', '', '', '', '', '', '', '$23PstrXfk7Nw', 1, 1, 0, 10, 'DE', 115, 'L', 1371899094, '0000-00-00 00:00:00', '', '', '', '');
-- --------------------------------------------------------

View File

@ -0,0 +1,34 @@
<?php
/**
* Export filtered shifts via JSON. (Like iCal Export or shifts view)
*/
function shifts_json_export_controller() {
global $ical_shifts, $user;
if (isset ($_REQUEST['key']) && preg_match("/^[0-9a-f]{32}$/", $_REQUEST['key']))
$key = $_REQUEST['key'];
else
die("Missing key.");
$user = User_by_api_key($key);
if($user === false)
die("Unable to find user.");
if($user == null)
die("Key invalid.");
if(!in_array('shifts_json_export', privileges_for_user($user['UID'])))
die("No privilege for shifts_json_export.");
if (isset ($_REQUEST['export']) && $_REQUEST['export'] == 'user_shifts') {
require_once ('includes/pages/user_shifts.php');
view_user_shifts();
} else {
$ical_shifts = sql_select("SELECT `Shifts`.*, `Room`.`Name` as `room_name` FROM `ShiftEntry` INNER JOIN `Shifts` ON (`ShiftEntry`.`SID` = `Shifts`.`SID`) INNER JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) WHERE `UID`=" . sql_escape($user['UID']) . " ORDER BY `start`");
}
header("Content-Type: application/json; charset=utf-8");
echo json_encode($ical_shifts);
die();
}
?>

View File

@ -11,4 +11,28 @@ function User($id) {
return null;
}
/**
* Returns User by api_key.
* @param string $api_key User api key
* @return Matching user, null or false on error
*/
function User_by_api_key($api_key) {
$user = sql_select("SELECT * FROM `User` WHERE `api_key`='" . sql_escape($api_key) . "' LIMIT 1");
if($user === false)
return false;
if (count($user) == 0)
return null;
return $user[0];
}
/**
* Generates a new api key for given user.
* @param User $user
*/
function User_reset_api_key($user) {
$user['api_key'] = md5($user['Nick'] . time() . rand());
sql_query("UPDATE `User` SET `api_key`='" . sql_escape($user['api_key']) . "' WHERE `UID`='" . sql_escape($user['UID']) . "' LIMIT 1");
engelsystem_log("API key resetted.");
}
?>

View File

@ -12,7 +12,7 @@ function admin_shifts() {
$mode = '';
$angelmode = '';
$length = '';
$change_hours = '';
$change_hours = array();
// Locations laden (auch unsichtbare - fuer Erzengel ist das ok)
$rooms = sql_select("SELECT * FROM `Room` ORDER BY `Name`");
@ -209,7 +209,6 @@ function admin_shifts() {
$hidden_types = "";
foreach ($needed_angel_types as $type_id => $count)
$hidden_types .= '<input type="hidden" name="type_' . $type_id . '" value="' . $count . '" />';
sort($change_hours);
return template_render('../templates/admin_shift_preview.html', array (
'shifts_table' => $shifts_table,
'name' => $name,

View File

@ -9,16 +9,19 @@ function user_atom() {
else
die("Missing key.");
$user = sql_select("SELECT * FROM `User` WHERE `ical_key`='" . sql_escape($key) . "' LIMIT 1");
if (count($user) == 0)
$user = User_by_api_key($key);
if($user === false)
die("Unable to find user.");
if($user == null)
die("Key invalid.");
if(!in_array('atom', privileges_for_user($user['UID'])))
die("No privilege for atom.");
$user = $user[0];
$news = sql_select("SELECT * FROM `News` " . (empty($_REQUEST['meetings'])? '' : 'WHERE `Treffen` = 1 ') . "ORDER BY `ID` DESC LIMIT " . sql_escape($DISPLAY_NEWS));
header('Content-Type: application/atom+xml; charset=utf-8');
$html = '<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Engelsystem</title>
<id>' . $_SERVER['HTTP_HOST'] . htmlspecialchars(preg_replace('#[&?]key=[a-f0-9]{32}#', '', $_SERVER['REQUEST_URI'])) . '</id>
<updated>' . date('Y-m-d\TH:i:sP', $news[0]['Datum']) . "</updated>\n";
@ -30,10 +33,10 @@ function user_atom() {
<updated>" . date('Y-m-d\TH:i:sP', $news_entry['Datum']) . "</updated>
<summary type=\"html\">" . htmlspecialchars($news_entry['Text']) . "</summary>
</entry>\n";
}
$html .= "</feed>";
header("Content-Length: " . strlen($html));
echo $html;
die();
}
$html .= "</feed>";
header("Content-Length: " . strlen($html));
echo $html;
die();
}
?>

View File

@ -10,11 +10,13 @@ function user_ical() {
else
die("Missing key.");
$user = sql_select("SELECT * FROM `User` WHERE `ical_key`='" . sql_escape($key) . "' LIMIT 1");
if (count($user) == 0)
$user = User_by_api_key($key);
if($user === false)
die("Unable to find user.");
if($user == null)
die("Key invalid.");
$user = $user[0];
if(!in_array('ical', privileges_for_user($user['UID'])))
die("No privilege for ical.");
if (isset ($_REQUEST['export']) && $_REQUEST['export'] == 'user_shifts') {
require_once ('includes/pages/user_shifts.php');

View File

@ -17,7 +17,7 @@ function user_myshifts() {
if (isset ($_REQUEST['reset'])) {
if ($_REQUEST['reset'] == "ack") {
user_reset_ical_key($user);
User_reset_api_key($user);
success("Key geändert.");
redirect(page_link_to('user_myshifts'));
}
@ -118,7 +118,7 @@ function user_myshifts() {
'actions' => "Aktion"
), $myshifts_table),
$id == $user['UID'] && count($shifts) == 0 ? error(sprintf(Get_Text('pub_myshifts_goto_shifts'), page_link_to('user_shifts')), true) : '',
"<h2>iCal Export</h2>" . sprintf(Get_Text('inc_schicht_ical_text'), page_link_to_absolute('ical') . '&key=' . $shifts_user['ical_key'], page_link_to('user_myshifts') . '&reset')
"<h2>iCal Export</h2>" . sprintf(Get_Text('inc_schicht_ical_text'), page_link_to_absolute('ical') . '&key=' . $shifts_user['api_key'], page_link_to('user_myshifts') . '&reset')
));
}
?>

View File

@ -690,8 +690,8 @@ function view_user_shifts() {
), $shifts_table);
}
if ($user['ical_key'] == "")
user_reset_ical_key($user);
if ($user['api_key'] == "")
User_reset_api_key($user);
return msg() . template_render('../templates/user_shifts.html', array (
'room_select' => make_select($rooms, $_SESSION['user_shifts']['rooms'], "rooms", ucfirst(Get_Text("rooms"))),
@ -704,7 +704,7 @@ return msg() . template_render('../templates/user_shifts.html', array (
'task_notice' => '<sup>1</sup>' . Get_Text("pub_schichtplan_tasks_notice"),
'new_style_checkbox' => '<label><input type="checkbox" name="new_style" value="1" ' . ($_SESSION['user_shifts']['new_style']? ' checked' : '') . '> Use new style if possible</label>',
'shifts_table' => $shifts_table,
'ical_text' => sprintf(Get_Text('inc_schicht_ical_text'), htmlspecialchars(make_user_shifts_ical_link($user['ical_key'])), page_link_to('user_myshifts') . '&amp;reset'),
'ical_text' => sprintf(Get_Text('inc_schicht_ical_text'), htmlspecialchars(make_user_shifts_ical_link($user['api_key'])), page_link_to('user_myshifts') . '&amp;reset'),
'filter' => ucfirst(Get_Text("to_filter")),
));
}

View File

@ -28,12 +28,6 @@ $tshirt_sizes = array (
'XL-G' => "XL Girl"
);
function user_reset_ical_key($user) {
$user['ical_key'] = md5($user['Nick'] . time() . rand());
sql_query("UPDATE `User` SET `ical_key`='" . sql_escape($user['ical_key']) . "' WHERE `UID`='" . sql_escape($user['UID']) . "' LIMIT 1");
engelsystem_log("iCal key resetted.");
}
function UID2Nick($UID) {
if ($UID > 0)
$SQL = "SELECT Nick FROM `User` WHERE UID='" . sql_escape($UID) . "'";

View File

@ -47,6 +47,10 @@ elseif ($p == "atom") {
require_once ('includes/pages/user_atom.php');
user_atom();
}
elseif ($p == "shifts_json_export") {
require_once ('includes/controller/shifts_controller.php');
shifts_json_export_controller();
}
elseif ($p == "stats") {
require_once ('includes/pages/guest_stats.php');
guest_stats();
@ -200,7 +204,7 @@ if (isset ($user) && $p != "admin_user_angeltypes")
echo template_render('../templates/layout.html', array (
'theme' => isset ($user) ? $user['color'] : $default_theme,
'title' => $title,
'atom_link' => ($p == 'news' || $p == 'user_meetings')? '<link href="' . page_link_to('atom') . (($p == 'user_meetings')? '&amp;meetings=1' : '') . '&amp;key=' . $user['ical_key'] . '" type="application/atom+xml" rel="alternate" title="Atom Feed">' : '',
'atom_link' => ($p == 'news' || $p == 'user_meetings')? '<link href="' . page_link_to('atom') . (($p == 'user_meetings')? '&amp;meetings=1' : '') . '&amp;key=' . $user['api_key'] . '" type="application/atom+xml" rel="alternate" title="Atom Feed">' : '',
'menu' => make_menu(),
'content' => $content
));