CC-733 : export broadcast logs
exporting stats based on czech law
This commit is contained in:
parent
7a5054655e
commit
53b8eb2724
9 changed files with 331 additions and 3 deletions
|
@ -26,6 +26,7 @@ $ccAcl->add(new Zend_Acl_Resource('library'))
|
||||||
->add(new Zend_Acl_Resource('recorder'))
|
->add(new Zend_Acl_Resource('recorder'))
|
||||||
->add(new Zend_Acl_Resource('showbuilder'))
|
->add(new Zend_Acl_Resource('showbuilder'))
|
||||||
->add(new Zend_Acl_Resource('auth'))
|
->add(new Zend_Acl_Resource('auth'))
|
||||||
|
->add(new Zend_Acl_Resource('playouthistory'))
|
||||||
->add(new Zend_Acl_Resource('usersettings'));
|
->add(new Zend_Acl_Resource('usersettings'));
|
||||||
|
|
||||||
/** Creating permissions */
|
/** Creating permissions */
|
||||||
|
@ -44,6 +45,7 @@ $ccAcl->allow('G', 'index')
|
||||||
->allow('H', 'search')
|
->allow('H', 'search')
|
||||||
->allow('H', 'playlist')
|
->allow('H', 'playlist')
|
||||||
->allow('H', 'showbuilder')
|
->allow('H', 'showbuilder')
|
||||||
|
->allow('A', 'playouthistory')
|
||||||
->allow('A', 'user')
|
->allow('A', 'user')
|
||||||
->allow('A', 'systemstatus')
|
->allow('A', 'systemstatus')
|
||||||
->allow('A', 'preference');
|
->allow('A', 'preference');
|
||||||
|
|
|
@ -85,7 +85,14 @@ $pages = array(
|
||||||
'controller' => 'systemstatus',
|
'controller' => 'systemstatus',
|
||||||
'action' => 'index',
|
'action' => 'index',
|
||||||
'resource' => 'systemstatus'
|
'resource' => 'systemstatus'
|
||||||
)
|
),
|
||||||
|
array(
|
||||||
|
'label' => 'Playout History',
|
||||||
|
'module' => 'default',
|
||||||
|
'controller' => 'playouthistory',
|
||||||
|
'action' => 'index',
|
||||||
|
'resource' => 'playouthistory'
|
||||||
|
)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class PlayoutHistoryController extends Zend_Controller_Action
|
||||||
|
{
|
||||||
|
public function init()
|
||||||
|
{
|
||||||
|
$ajaxContext = $this->_helper->getHelper('AjaxContext');
|
||||||
|
$ajaxContext
|
||||||
|
->addActionContext('playout-history-feed', 'json')
|
||||||
|
->initContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function indexAction()
|
||||||
|
{
|
||||||
|
global $CC_CONFIG;
|
||||||
|
|
||||||
|
$this->_helper->layout->setLayout('playouthistory');
|
||||||
|
|
||||||
|
$request = $this->getRequest();
|
||||||
|
$baseUrl = $request->getBaseUrl();
|
||||||
|
|
||||||
|
$this->view->headScript()->appendFile($baseUrl.'/js/contextmenu/jquery.contextMenu.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
|
||||||
|
$this->view->headScript()->appendFile($baseUrl.'/js/datatables/js/jquery.dataTables.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
|
||||||
|
$this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.pluginAPI.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
|
||||||
|
$this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.fnSetFilteringDelay.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
|
||||||
|
$this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.TableTools.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
|
||||||
|
|
||||||
|
$this->view->headScript()->appendFile($baseUrl.'/js/airtime/buttons/buttons.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
|
||||||
|
$this->view->headScript()->appendFile($baseUrl.'/js/airtime/utilities/utilities.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
|
||||||
|
$this->view->headScript()->appendFile($baseUrl.'/js/airtime/playouthistory/historytable.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
|
||||||
|
|
||||||
|
$this->view->headLink()->appendStylesheet($baseUrl.'/css/TableTools.css?'.$CC_CONFIG['airtime_version']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function playoutHistoryFeedAction()
|
||||||
|
{
|
||||||
|
$request = $this->getRequest();
|
||||||
|
$current_time = time();
|
||||||
|
|
||||||
|
$params = $request->getParams();
|
||||||
|
|
||||||
|
$starts_epoch = $request->getParam("start", $current_time - (60*60*24));
|
||||||
|
$ends_epoch = $request->getParam("end", $current_time);
|
||||||
|
|
||||||
|
$startsDT = DateTime::createFromFormat("U", $starts_epoch, new DateTimeZone("UTC"));
|
||||||
|
$endsDT = DateTime::createFromFormat("U", $ends_epoch, new DateTimeZone("UTC"));
|
||||||
|
|
||||||
|
Logging::log("history starts {$startsDT->format("Y-m-d H:i:s")}");
|
||||||
|
Logging::log("history ends {$endsDT->format("Y-m-d H:i:s")}");
|
||||||
|
|
||||||
|
$history = new Application_Model_PlayoutHistory($startsDT, $endsDT, $params);
|
||||||
|
|
||||||
|
$r = $history->getItems();
|
||||||
|
|
||||||
|
$this->view->sEcho = $r["sEcho"];
|
||||||
|
$this->view->iTotalDisplayRecords = $r["iTotalDisplayRecords"];
|
||||||
|
$this->view->iTotalRecords = $r["iTotalRecords"];
|
||||||
|
$this->view->history = $r["history"];
|
||||||
|
}
|
||||||
|
}
|
27
airtime_mvc/application/layouts/scripts/playouthistory.phtml
Normal file
27
airtime_mvc/application/layouts/scripts/playouthistory.phtml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<?php echo $this->doctype() ?>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<?php echo $this->headTitle() ?>
|
||||||
|
<?php echo $this->headScript() ?>
|
||||||
|
<?php echo $this->headLink() ?>
|
||||||
|
<?php echo isset($this->google_analytics)?$this->google_analytics:"" ?>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div id="Panel">
|
||||||
|
<div class="logo"></div>
|
||||||
|
<?php echo $this->versionNotify() ?>
|
||||||
|
<?php echo $this->partial('partialviews/header.phtml', array("user" => $this->loggedInAs(), "is_trial"=>$this->isTrial(), "trial_remain"=> $this->trialRemaining())) ?>
|
||||||
|
|
||||||
|
<?php $partial = array('menu.phtml', 'default');
|
||||||
|
$this->navigation()->menu()->setPartial($partial); ?>
|
||||||
|
|
||||||
|
<?php echo $this->navigation()->menu() ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="wrapper">
|
||||||
|
<div id="history_content" class="ui-widget ui-widget-content block-shadow alpha-block padded"><?php echo $this->layout()->content ?></div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
98
airtime_mvc/application/models/Datatables.php
Normal file
98
airtime_mvc/application/models/Datatables.php
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class Application_Model_Datatables {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* query used to return data for a paginated/searchable datatable.
|
||||||
|
*/
|
||||||
|
public static function findEntries($con, $displayColumns, $fromTable, $data, $dataProp = "aaData")
|
||||||
|
{
|
||||||
|
$where = array();
|
||||||
|
|
||||||
|
if ($data["sSearch"] !== "") {
|
||||||
|
$searchTerms = explode(" ", $data["sSearch"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$selectorCount = "SELECT COUNT(*) ";
|
||||||
|
$selectorRows = "SELECT ".join(",", $displayColumns)." ";
|
||||||
|
|
||||||
|
$sql = $selectorCount." FROM ".$fromTable;
|
||||||
|
$sqlTotalRows = $sql;
|
||||||
|
|
||||||
|
if (isset($searchTerms)) {
|
||||||
|
$searchCols = array();
|
||||||
|
for ($i = 0; $i < $data["iColumns"]; $i++) {
|
||||||
|
if ($data["bSearchable_".$i] == "true") {
|
||||||
|
$searchCols[] = $data["mDataProp_{$i}"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$outerCond = array();
|
||||||
|
|
||||||
|
foreach ($searchTerms as $term) {
|
||||||
|
$innerCond = array();
|
||||||
|
|
||||||
|
foreach ($searchCols as $col) {
|
||||||
|
$escapedTerm = pg_escape_string($term);
|
||||||
|
$innerCond[] = "{$col}::text ILIKE '%{$escapedTerm}%'";
|
||||||
|
}
|
||||||
|
$outerCond[] = "(".join(" OR ", $innerCond).")";
|
||||||
|
}
|
||||||
|
$where[] = "(".join(" AND ", $outerCond).")";
|
||||||
|
}
|
||||||
|
// End Where clause
|
||||||
|
|
||||||
|
// Order By clause
|
||||||
|
$orderby = array();
|
||||||
|
for ($i = 0; $i < $data["iSortingCols"]; $i++){
|
||||||
|
$num = $data["iSortCol_".$i];
|
||||||
|
$orderby[] = $data["mDataProp_{$num}"]." ".$data["sSortDir_".$i];
|
||||||
|
}
|
||||||
|
$orderby[] = "id";
|
||||||
|
$orderby = join("," , $orderby);
|
||||||
|
// End Order By clause
|
||||||
|
|
||||||
|
if (count($where) > 0) {
|
||||||
|
$where = join(" AND ", $where);
|
||||||
|
$sql = $selectorCount." FROM ".$fromTable." WHERE ".$where;
|
||||||
|
$sqlTotalDisplayRows = $sql;
|
||||||
|
|
||||||
|
$sql = $selectorRows." FROM ".$fromTable." WHERE ".$where." ORDER BY ".$orderby." OFFSET ".$data["iDisplayStart"]." LIMIT ".$data["iDisplayLength"];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$sql = $selectorRows." FROM ".$fromTable." ORDER BY ".$orderby." OFFSET ".$data["iDisplayStart"]." LIMIT ".$data["iDisplayLength"];
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$r = $con->query($sqlTotalRows);
|
||||||
|
Logging::log($sqlTotalRows);
|
||||||
|
$totalRows = $r->fetchColumn(0);
|
||||||
|
|
||||||
|
if (isset($sqlTotalDisplayRows)) {
|
||||||
|
$r = $con->query($sqlTotalDisplayRows);
|
||||||
|
Logging::log($sqlTotalDisplayRows);
|
||||||
|
$totalDisplayRows = $r->fetchColumn(0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$totalDisplayRows = $totalRows;
|
||||||
|
}
|
||||||
|
|
||||||
|
$r = $con->query($sql);
|
||||||
|
$r->setFetchMode(PDO::FETCH_ASSOC);
|
||||||
|
$results = $r->fetchAll();
|
||||||
|
}
|
||||||
|
catch (Exception $e) {
|
||||||
|
Logging::log($e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
//display sql executed in airtime log for testing
|
||||||
|
Logging::log($sql);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
"sEcho" => intval($data["sEcho"]),
|
||||||
|
"iTotalDisplayRecords" => intval($totalDisplayRows),
|
||||||
|
"iTotalRecords" => intval($totalRows),
|
||||||
|
$dataProp => $results
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
60
airtime_mvc/application/models/PlayoutHistory.php
Normal file
60
airtime_mvc/application/models/PlayoutHistory.php
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once 'formatters/LengthFormatter.php';
|
||||||
|
|
||||||
|
class Application_Model_PlayoutHistory {
|
||||||
|
|
||||||
|
private $con;
|
||||||
|
private $timezone;
|
||||||
|
|
||||||
|
//in UTC timezone
|
||||||
|
private $startDT;
|
||||||
|
//in UTC timezone
|
||||||
|
private $endDT;
|
||||||
|
|
||||||
|
private $epoch_now;
|
||||||
|
private $opts;
|
||||||
|
|
||||||
|
public function __construct($p_startDT, $p_endDT, $p_opts) {
|
||||||
|
|
||||||
|
$this->con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME);
|
||||||
|
$this->startDT = $p_startDT;
|
||||||
|
$this->endDT = $p_endDT;
|
||||||
|
$this->timezone = date_default_timezone_get();
|
||||||
|
$this->epoch_now = time();
|
||||||
|
$this->opts = $p_opts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getItems() {
|
||||||
|
|
||||||
|
$select = array(
|
||||||
|
"file.track_title as title",
|
||||||
|
"file.artist_name as artist",
|
||||||
|
"playout.played",
|
||||||
|
"playout.file_id",
|
||||||
|
"file.composer",
|
||||||
|
"file.copyright",
|
||||||
|
"file.length"
|
||||||
|
);
|
||||||
|
|
||||||
|
$start = $this->startDT->format("Y-m-d H:i:s");
|
||||||
|
$end = $this->endDT->format("Y-m-d H:i:s");
|
||||||
|
|
||||||
|
$historyTable = "(
|
||||||
|
select count(schedule.file_id) as played, schedule.file_id as file_id
|
||||||
|
from cc_schedule as schedule
|
||||||
|
where schedule.starts >= '{$start}' and schedule.starts < '{$end}'
|
||||||
|
group by schedule.file_id
|
||||||
|
)
|
||||||
|
AS playout left join cc_files as file on (file.id = playout.file_id)";
|
||||||
|
|
||||||
|
$results = Application_Model_Datatables::findEntries($this->con, $select, $historyTable, $this->opts, "history");
|
||||||
|
|
||||||
|
foreach ($results["history"] as &$row) {
|
||||||
|
$formatter = new LengthFormatter($row['length']);
|
||||||
|
$row['length'] = $formatter->format();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1480,8 +1480,8 @@ class Application_Model_Show {
|
||||||
$sql = $sql." AND ({$exclude})";
|
$sql = $sql." AND ({$exclude})";
|
||||||
}
|
}
|
||||||
|
|
||||||
Logging::log("getShows");
|
//Logging::log("getShows");
|
||||||
Logging::log($sql);
|
//Logging::log($sql);
|
||||||
|
|
||||||
return $CC_DBC->GetAll($sql);
|
return $CC_DBC->GetAll($sql);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
<table id="history_table" cellpadding="0" cellspacing="0" class="datatable"></table>
|
73
airtime_mvc/public/js/airtime/playouthistory/historytable.js
Normal file
73
airtime_mvc/public/js/airtime/playouthistory/historytable.js
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
var AIRTIME = (function(AIRTIME) {
|
||||||
|
var mod;
|
||||||
|
|
||||||
|
if (AIRTIME.history === undefined) {
|
||||||
|
AIRTIME.history = {};
|
||||||
|
}
|
||||||
|
mod = AIRTIME.history;
|
||||||
|
|
||||||
|
mod.historyTable = function() {
|
||||||
|
var oTable,
|
||||||
|
historyContentDiv = $("#history_content"),
|
||||||
|
historyTableDiv = historyContentDiv.find("#history_table");
|
||||||
|
tableHeight = historyContentDiv.height() - 140;
|
||||||
|
|
||||||
|
oTable = historyTableDiv.dataTable( {
|
||||||
|
|
||||||
|
"aoColumns": [
|
||||||
|
{"sTitle": "Title", "mDataProp": "title", "sClass": "his_title"}, /* Title */
|
||||||
|
{"sTitle": "Artist", "mDataProp": "artist", "sClass": "his_artist"}, /* Creator */
|
||||||
|
{"sTitle": "Played", "mDataProp": "played", "sClass": "his_artist"}, /* times played */
|
||||||
|
{"sTitle": "Length", "mDataProp": "length", "sClass": "his_length"}, /* Length */
|
||||||
|
{"sTitle": "Composer", "mDataProp": "composer", "sClass": "his_composer"}, /* Composer */
|
||||||
|
{"sTitle": "Copyright", "mDataProp": "copyright", "sClass": "his_copyright"} /* Copyright */
|
||||||
|
],
|
||||||
|
|
||||||
|
"bProcessing": true,
|
||||||
|
"bServerSide": true,
|
||||||
|
"sAjaxSource": "/Playouthistory/playout-history-feed",
|
||||||
|
"sAjaxDataProp": "history",
|
||||||
|
|
||||||
|
"fnServerData": function ( sSource, aoData, fnCallback ) {
|
||||||
|
|
||||||
|
aoData.push( { name: "format", value: "json"} );
|
||||||
|
|
||||||
|
$.ajax( {
|
||||||
|
"dataType": 'json',
|
||||||
|
"type": "GET",
|
||||||
|
"url": sSource,
|
||||||
|
"data": aoData,
|
||||||
|
"success": fnCallback
|
||||||
|
} );
|
||||||
|
},
|
||||||
|
|
||||||
|
"oLanguage": {
|
||||||
|
"sSearch": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"sPaginationType": "full_numbers",
|
||||||
|
"bJQueryUI": true,
|
||||||
|
"bAutoWidth": false,
|
||||||
|
|
||||||
|
"sDom": 'lfr<"H"><"dataTables_scrolling"t><"F"ip>',
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return AIRTIME;
|
||||||
|
|
||||||
|
}(AIRTIME || {}));
|
||||||
|
|
||||||
|
$(document).ready(function(){
|
||||||
|
|
||||||
|
var viewport = AIRTIME.utilities.findViewportDimensions(),
|
||||||
|
history_content = $("#history_content"),
|
||||||
|
widgetHeight = viewport.height - 185,
|
||||||
|
screenWidth = Math.floor(viewport.width - 110);
|
||||||
|
|
||||||
|
history_content
|
||||||
|
.height(widgetHeight)
|
||||||
|
.width(screenWidth);
|
||||||
|
|
||||||
|
AIRTIME.history.historyTable();
|
||||||
|
|
||||||
|
});
|
Loading…
Add table
Add a link
Reference in a new issue