From bb53f6136e2950f3d656728be469d318a0d9f606 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 25 Jul 2017 19:02:01 +0200 Subject: [locationinfo] Make panel accessible via slxadmin, add URL type panel --- modules-available/locationinfo/api.inc.php | 249 +++++------------------------ 1 file changed, 39 insertions(+), 210 deletions(-) (limited to 'modules-available/locationinfo/api.inc.php') diff --git a/modules-available/locationinfo/api.inc.php b/modules-available/locationinfo/api.inc.php index 05af4111..e14fe9d7 100644 --- a/modules-available/locationinfo/api.inc.php +++ b/modules-available/locationinfo/api.inc.php @@ -1,5 +1,37 @@ ########## -/** - * Gets the location info of the given locations. - * Append to passed array which is expected to - * map location ids to properties of that location. - * A new key 'machines' will be created in each - * entry of $array that will take all the machine data. - * - * @param array $array location list to populate with machine data - * @param bool $withPosition Defines if coords should be included or not. - */ -function appendMachineData(&$array, $idList = false, $withPosition = false) -{ - if (empty($array) && $idList === false) - return; - if ($idList === false) { - $idList = array_keys($array); - } - - $positionCol = $withPosition ? 'm.position,' : ''; - $query = "SELECT m.locationid, m.machineuuid, $positionCol m.logintime, m.lastseen, m.lastboot FROM machine m - WHERE m.locationid IN (:idlist)"; - $dbquery = Database::simpleQuery($query, array('idlist' => $idList)); - - // Iterate over matching machines - while ($row = $dbquery->fetch(PDO::FETCH_ASSOC)) { - settype($row['locationid'], 'int'); - if (!isset($array[$row['locationid']])) { - $array[$row['locationid']] = array('id' => $row['locationid'], 'machines' => array()); - } - if (!isset($array[$row['locationid']]['machines'])) { - $array[$row['locationid']]['machines'] = array(); - } - // Compact the pc data in one array. - $pc = array('id' => $row['machineuuid']); - if ($withPosition && !empty($row['position'])) { - $position = json_decode($row['position'], true); - if (isset($position['gridCol']) && isset($position['gridRow'])) { - $pc['x'] = $position['gridCol']; - $pc['y'] = $position['gridRow']; - if (!empty($position['overlays']) && is_array($position['overlays'])) { - $pc['overlays'] = $position['overlays']; - } - } - } - $pc['pcState'] = LocationInfo::getPcState($row); - //$pc['pcState'] = ['BROKEN', 'OFF', 'IDLE', 'OCCUPIED'][mt_rand(0,3)]; // XXX - - // Add the array to the machines list. - $array[$row['locationid']]['machines'][] = $pc; - } -} - -// ########## ########### - -/** - * Returns all the passed location ids and appends - * all their direct and indirect parent location ids. - * - * @param int[] $idList location ids - * @return int[] more location ids - */ -function getLocationsWithParents($idList) -{ - $locations = Location::getLocationsAssoc(); - $allIds = $idList; - foreach ($idList as $id) { - if (isset($locations[$id]) && isset($locations[$id]['parents'])) { - $allIds = array_merge($allIds, $locations[$id]['parents']); - } - } - return array_map('intval', $allIds); -} - -// ########## ########## -/** - * Gets the Opening time of the given locations. - * - * @param array $array list of locations, indexed by locationId - * @param int[] $idList list of locations - */ -function appendOpeningTimes(&$array, $idList) -{ - // First, lets get all the parent ids for the given locations - // in case we need to get inherited opening times - $allIds = getLocationsWithParents($idList); - if (empty($allIds)) - return; - $res = Database::simpleQuery("SELECT locationid, openingtime FROM locationinfo_locationconfig - WHERE locationid IN (:lids)", array('lids' => $allIds)); - $openingTimes = array(); - while ($row = $res->fetch(PDO::FETCH_ASSOC)) { - $openingTimes[(int)$row['locationid']] = $row; - } - // Now we got all the calendars for locations and parents - // Iterate over the locations we're actually interested in - $locations = Location::getLocationsAssoc(); - foreach ($idList as $locationId) { - // Start checking at actual location... - $currentId = $locationId; - while ($currentId !== 0) { - if (!empty($openingTimes[$currentId]['openingtime'])) { - $cal = json_decode($openingTimes[$currentId]['openingtime'], true); - if (is_array($cal)) { - $cal = formatOpeningtime($cal); - } - if (!empty($cal)) { - // Got a valid calendar - if (!isset($array[$locationId])) { - $array[$locationId] = array('id' => $locationId); - } - $array[$locationId]['openingtime'] = $cal; - break; - } - } - // Keep trying with parent - $currentId = $locations[$currentId]['parentlocationid']; - } - } - return; -} - -/** - * Format the openingtime in the frontend needed format. - * One key per week day, wich contains an array of { - * 'HourOpen' => hh, 'MinutesOpen' => mm, - * 'HourClose' => hh, 'MinutesClose' => mm } - * - * @param array $openingtime The opening time in the db saved format. - * @return mixed The opening time in the frontend needed format. - */ -function formatOpeningtime($openingtime) -{ - $result = array(); - foreach ($openingtime as $entry) { - $openTime = explode(':', $entry['openingtime']); - $closeTime = explode(':', $entry['closingtime']); - if (count($openTime) !== 2 || count($closeTime) !== 2) - continue; - $convertedTime = array( - 'HourOpen' => $openTime[0], - 'MinutesOpen' => $openTime[1], - 'HourClose' => $closeTime[0], - 'MinutesClose' => $closeTime[1], - ); - foreach ($entry['days'] as $day) { - if (!isset($result[$day])) { - $result[$day] = array(); - } - $result[$day][] = $convertedTime; - } - } - return $result; -} - -// ########## ########## -/** - * Gets the config of the location. - * - * @param int $locationID ID of the location - * @return array configuration struct - */ -function getConfig($paneluuid) -{ - $panel = Database::queryFirst('SELECT panelconfig, paneltype, locationids, lastchange FROM locationinfo_panel WHERE paneluuid = :paneluuid', - compact('paneluuid')); - - if ($panel === false || empty($panel['locationids'])) { - http_response_code(404); - die('Panel not found'); - } - - $config = LocationInfo::defaultPanelConfig($panel['paneltype']); - $locations = Location::getLocationsAssoc(); - $overrides = false; - - if (!empty($panel['panelconfig'])) { - $json = json_decode($panel['panelconfig'], true); - if (is_array($json)) { - if (isset($json['overrides']) && is_array($json['overrides'])) { - $overrides = $json['overrides']; - } - unset($json['overrides']); - $config = $json + $config; - } - } - $config['locations'] = array(); - $lids = array_map('intval', explode(',', $panel['locationids'])); - foreach ($lids as $lid) { - $config['locations'][$lid] = array( - 'id' => $lid, - 'name' => isset($locations[$lid]) ? $locations[$lid]['locationname'] : 'noname00.pas', - ); - if (isset($overrides[$lid]) && is_array($overrides[$lid])) { - $config['locations'][$lid]['config'] = $overrides[$lid]; - } - } - appendMachineData($config['locations'], $lids, true); - appendOpeningTimes($config['locations'], $lids); - - $config['ts'] = (int)$panel['lastchange']; - $config['locations'] = array_values($config['locations']); - $config['time'] = date('Y-n-j-G-') . (int)date('i') . '-' . (int)(date('s')); - - return $config; -} - /** * Get last config modification timestamp for given panel. * This was planned to be smart and check the involved locations, @@ -309,7 +138,7 @@ function getPcStates($idList) } $locationInfoList = array(); - appendMachineData($locationInfoList, $idList); + InfoPanel::appendMachineData($locationInfoList, $idList); foreach ($locationInfoList as $locationInfo) { $id = $locationInfo['id']; foreach ($locationInfo['machines'] as $pc) { -- cgit v1.2.3-55-g7522