sintonia/airtime_mvc/application/services/HistoryService.php

1428 lines
35 KiB
PHP
Raw Normal View History

<?php
require_once 'formatters/LengthFormatter.php';
class Application_Service_HistoryService
{
private $con;
private $timezone;
const TEMPLATE_TYPE_ITEM = "item";
const TEMPLATE_TYPE_FILE = "file";
2013-07-18 07:31:20 +02:00
public function __construct()
{
$this->con = isset($con) ? $con : Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME);
$this->timezone = Application_Model_Preference::GetTimezone();
}
public function getSupportedTemplateTypes()
{
return array(self::TEMPLATE_TYPE_ITEM, self::TEMPLATE_TYPE_FILE);
}
//opts is from datatables.
public function getPlayedItemData($startDT, $endDT, $opts, $instanceId=null)
2013-07-18 07:31:20 +02:00
{
2013-07-31 23:39:45 +02:00
$mainSqlQuery = "";
$paramMap = array();
$sqlTypes = $this->getSqlTypes();
2013-07-31 23:39:45 +02:00
$start = $startDT->format("Y-m-d H:i:s");
$end = $endDT->format("Y-m-d H:i:s");
$template = $this->getConfiguredItemTemplate();
$fields = $template["fields"];
$required = $this->mandatoryItemFields();
$fields_filemd = array();
2013-08-01 23:09:42 +02:00
$filemd_keys = array();
$fields_general = array();
2013-08-01 23:09:42 +02:00
$general_keys = array();
foreach ($fields as $index=>$field) {
if (in_array($field["name"], $required)) {
continue;
}
if ($field["isFileMd"]) {
$fields_filemd[] = $field;
2013-08-01 23:09:42 +02:00
$filemd_keys[] = $field["name"];
}
else {
$fields_general[] = $field;
2013-08-01 23:09:42 +02:00
$general_keys[] = $field["name"];
}
}
//-----------------------------------------------------------------------
//Using the instance_id to filter the data.
2013-07-31 23:39:45 +02:00
$historyRange = "(".
"SELECT history.starts, history.ends, history.id AS history_id, history.instance_id".
" FROM cc_playout_history as history";
if (isset($instanceId)) {
$historyRange.= " WHERE history.instance_id = :instance";
$paramMap["instance"] = $instanceId;
}
else {
$historyRange.= " WHERE history.starts >= :starts and history.starts < :ends";
$paramMap["starts"] = $start;
$paramMap["ends"] = $end;
}
$historyRange.= ") AS history_range";
2013-07-31 23:39:45 +02:00
$manualMeta = "(".
"SELECT %KEY%.value AS %KEY%, %KEY%.history_id".
" FROM (".
" SELECT * from cc_playout_history_metadata AS phm WHERE phm.key = :meta_%KEY%".
" ) AS %KEY%".
" ) AS %KEY%_filter";
$mainSelect = array(
"history_range.starts",
"history_range.ends",
"history_range.history_id",
"history_range.instance_id"
);
$mdFilters = array();
$numFileMdFields = count($fields_filemd);
if ($numFileMdFields > 0) {
//these 3 selects are only needed if $fields_filemd has some fields.
$fileSelect = array("history_file.history_id");
$nonNullFileSelect = array("file.id as file_id");
$nullFileSelect = array("null_file.history_id");
$fileMdFilters = array();
//populate the different dynamic selects with file info.
for ($i = 0; $i < $numFileMdFields; $i++) {
$field = $fields_filemd[$i];
$key = $field["name"];
$type = $sqlTypes[$field["type"]];
$fileSelect[] = "file_md.{$key}::{$type}";
$nonNullFileSelect[] = "file.{$key}::{$type}";
$nullFileSelect[] = "{$key}_filter.{$key}::{$type}";
$mainSelect[] = "file_info.{$key}::{$type}";
$fileMdFilters[] = str_replace("%KEY%", $key, $manualMeta);
$paramMap["meta_{$key}"] = $key;
}
2013-07-31 23:39:45 +02:00
//the files associated with scheduled playback in Airtime.
$historyFile = "(".
"SELECT history.id AS history_id, history.file_id".
" FROM cc_playout_history AS history".
" WHERE history.file_id IS NOT NULL".
") AS history_file";
2013-07-31 23:39:45 +02:00
$fileMd = "(".
"SELECT %NON_NULL_FILE_SELECT%".
" FROM cc_files AS file".
") AS file_md";
2013-07-31 23:39:45 +02:00
$fileMd = str_replace("%NON_NULL_FILE_SELECT%", join(", ", $nonNullFileSelect), $fileMd);
2013-07-31 23:39:45 +02:00
//null files are from manually added data (filling in webstream info etc)
$nullFile = "(".
"SELECT history.id AS history_id".
" FROM cc_playout_history AS history".
" WHERE history.file_id IS NULL".
") AS null_file";
//----------------------------------
//building the file inner query
$fileSqlQuery =
"SELECT ".join(", ", $fileSelect).
" FROM {$historyFile}".
" LEFT JOIN {$fileMd} USING (file_id)".
" UNION".
" SELECT ".join(", ", $nullFileSelect).
" FROM {$nullFile}";
foreach ($fileMdFilters as $filter) {
$fileSqlQuery.=
" LEFT JOIN {$filter} USING(history_id)";
}
}
for ($i = 0, $len = count($fields_general); $i < $len; $i++) {
2013-07-31 23:39:45 +02:00
$field = $fields_general[$i];
$key = $field["name"];
$type = $sqlTypes[$field["type"]];
2013-07-31 23:39:45 +02:00
$mdFilters[] = str_replace("%KEY%", $key, $manualMeta);
$paramMap["meta_{$key}"] = $key;
$mainSelect[] = "{$key}_filter.{$key}::{$type}";
}
$mainSqlQuery.=
"SELECT ".join(", ", $mainSelect).
" FROM {$historyRange}";
if (isset($fileSqlQuery)) {
$mainSqlQuery.=
" LEFT JOIN ( {$fileSqlQuery} ) as file_info USING(history_id)";
}
2013-07-31 23:39:45 +02:00
foreach ($mdFilters as $filter) {
2013-07-31 23:39:45 +02:00
$mainSqlQuery.=
" LEFT JOIN {$filter} USING(history_id)";
}
//----------------------------------------------------------------------
//need to count the total rows to tell Datatables.
2013-08-02 17:19:46 +02:00
$stmt = $this->con->prepare($mainSqlQuery);
foreach ($paramMap as $param => $v) {
$stmt->bindValue($param, $v);
}
2013-08-02 17:19:46 +02:00
if ($stmt->execute()) {
$totalRows = $stmt->rowCount();
2013-08-02 17:19:46 +02:00
}
else {
$msg = implode(',', $stmt->errorInfo());
throw new Exception("Error: $msg");
}
2013-08-01 23:09:42 +02:00
//------------------------------------------------------------------------
//Using Datatables parameters to sort the data.
2013-08-01 23:09:42 +02:00
$numOrderColumns = $opts["iSortingCols"];
$orderBys = array();
2013-08-01 23:09:42 +02:00
for ($i = 0; $i < $numOrderColumns; $i++) {
2013-08-01 23:09:42 +02:00
$colNum = $opts["iSortCol_".$i];
$key = $opts["mDataProp_".$colNum];
$sortDir = $opts["sSortDir_".$i];
2013-08-01 23:09:42 +02:00
if (in_array($key, $required)) {
2013-08-01 23:10:04 +02:00
2013-08-01 23:09:42 +02:00
$orderBys[] = "history_range.{$key} {$sortDir}";
}
else if (in_array($key, $filemd_keys)) {
2013-08-01 23:09:42 +02:00
$orderBys[] = "file_info.{$key} {$sortDir}";
}
else if (in_array($key, $general_keys)) {
2013-08-01 23:10:04 +02:00
2013-08-01 23:09:42 +02:00
$orderBys[] = "{$key}_filter.{$key} {$sortDir}";
}
else {
//throw new Exception("Error: $key is not part of the template.");
2013-08-01 23:09:42 +02:00
}
}
if (count($orderBys) > 0) {
2013-08-01 23:09:42 +02:00
$orders = join(", ", $orderBys);
2013-08-01 23:10:04 +02:00
$mainSqlQuery.=
2013-08-01 23:09:42 +02:00
" ORDER BY {$orders}";
}
//---------------------------------------------------------------
//using Datatables parameters to add limits/offsets
$displayLength = intval($opts["iDisplayLength"]);
2013-08-02 17:19:46 +02:00
//limit the results returned.
if ($displayLength !== -1) {
$mainSqlQuery.=
" OFFSET :offset LIMIT :limit";
$paramMap["offset"] = intval($opts["iDisplayStart"]);
2013-08-02 17:19:46 +02:00
$paramMap["limit"] = $displayLength;
}
2013-07-31 23:39:45 +02:00
$stmt = $this->con->prepare($mainSqlQuery);
foreach ($paramMap as $param => $v) {
$stmt->bindValue($param, $v);
}
$rows = array();
if ($stmt->execute()) {
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
else {
$msg = implode(',', $stmt->errorInfo());
throw new Exception("Error: $msg");
}
//-----------------------------------------------------------------------
//processing results.
2013-07-31 23:39:45 +02:00
$timezoneUTC = new DateTimeZone("UTC");
$timezoneLocal = new DateTimeZone($this->timezone);
$boolCast = array();
2013-08-14 22:39:50 +02:00
foreach ($fields as $index=>$field) {
if ($field["type"] == TEMPLATE_BOOLEAN) {
2013-08-14 22:39:50 +02:00
$boolCast[] = $field["name"];
}
}
2013-07-31 23:39:45 +02:00
foreach ($rows as $index => &$result) {
2013-08-14 22:39:50 +02:00
foreach ($boolCast as $name) {
$result[$name] = (bool) $result[$name];
}
//need to display the results in the station's timezone.
2013-07-31 23:39:45 +02:00
$dateTime = new DateTime($result["starts"], $timezoneUTC);
$dateTime->setTimezone($timezoneLocal);
$result["starts"] = $dateTime->format("Y-m-d H:i:s");
2013-07-31 23:39:45 +02:00
$dateTime = new DateTime($result["ends"], $timezoneUTC);
$dateTime->setTimezone($timezoneLocal);
$result["ends"] = $dateTime->format("Y-m-d H:i:s");
2013-08-13 00:18:33 +02:00
if (isset($result[MDATA_KEY_DURATION])) {
$formatter = new LengthFormatter($result[MDATA_KEY_DURATION]);
$result[MDATA_KEY_DURATION] = $formatter->format();
}
//need to add a checkbox..
$result["checkbox"] = "";
2013-08-13 00:18:58 +02:00
//$unicodeChar = '\u2612';
2013-08-13 00:18:33 +02:00
//$result["new"] = json_decode('"'.$unicodeChar.'"');
//$result["new"] = "U+2612";
}
2013-07-31 23:39:45 +02:00
return array(
"sEcho" => intval($opts["sEcho"]),
//"iTotalDisplayRecords" => intval($totalDisplayRows),
2013-07-31 23:39:45 +02:00
"iTotalDisplayRecords" => intval($totalRows),
"iTotalRecords" => intval($totalRows),
"history" => $rows
);
}
2013-07-18 07:31:20 +02:00
public function getFileSummaryData($startDT, $endDT, $opts)
{
$select = array (
"summary.played",
"summary.file_id",
"summary.".MDATA_KEY_TITLE,
"summary.".MDATA_KEY_CREATOR
);
$mainSqlQuery = "";
$paramMap = array();
$start = $startDT->format("Y-m-d H:i:s");
2013-07-18 07:31:20 +02:00
$end = $endDT->format("Y-m-d H:i:s");
2013-08-02 22:16:04 +02:00
$paramMap["starts"] = $start;
$paramMap["ends"] = $end;
2013-08-02 22:16:04 +02:00
$template = $this->getConfiguredFileTemplate();
$fields = $template["fields"];
$required = $this->mandatoryFileFields();
2013-07-18 07:31:20 +02:00
2013-08-02 22:16:04 +02:00
foreach ($fields as $index=>$field) {
$key = $field["name"];
2013-08-02 22:16:04 +02:00
if (in_array($field["name"], $required)) {
continue;
}
2013-07-18 07:31:20 +02:00
2013-08-02 22:16:04 +02:00
$select[] = "summary.{$key}";
}
$fileSummaryTable = "((
SELECT COUNT(history.file_id) as played, history.file_id as file_id
FROM cc_playout_history AS history
WHERE history.starts >= :starts AND history.starts < :ends
AND history.file_id IS NOT NULL
GROUP BY history.file_id
) AS playout
LEFT JOIN cc_files AS file ON (file.id = playout.file_id)) AS summary";
2013-07-18 07:31:20 +02:00
$mainSqlQuery.=
"SELECT ".join(", ", $select).
" FROM {$fileSummaryTable}";
//-------------------------------------------------------------------------
2013-08-02 22:16:04 +02:00
//need to count the total rows to tell Datatables.
$stmt = $this->con->prepare($mainSqlQuery);
foreach ($paramMap as $param => $v) {
$stmt->bindValue($param, $v);
}
2013-08-02 22:16:04 +02:00
if ($stmt->execute()) {
$totalRows = $stmt->rowCount();
}
else {
$msg = implode(',', $stmt->errorInfo());
throw new Exception("Error: $msg");
}
2013-08-02 22:16:04 +02:00
//------------------------------------------------------------------------
//Using Datatables parameters to sort the data.
2013-08-02 22:16:04 +02:00
$numOrderColumns = $opts["iSortingCols"];
$orderBys = array();
2013-08-02 22:16:04 +02:00
for ($i = 0; $i < $numOrderColumns; $i++) {
2013-08-02 22:16:04 +02:00
$colNum = $opts["iSortCol_".$i];
$key = $opts["mDataProp_".$colNum];
$sortDir = $opts["sSortDir_".$i];
2013-08-02 22:16:04 +02:00
$orderBys[] = "summary.{$key} {$sortDir}";
}
2013-08-02 22:16:04 +02:00
if ($numOrderColumns > 0) {
2013-08-02 22:16:04 +02:00
$orders = join(", ", $orderBys);
2013-08-02 22:16:04 +02:00
$mainSqlQuery.=
" ORDER BY {$orders}";
}
//------------------------------------------------------------
//using datatables params to add limits/offsets
2013-08-02 22:16:04 +02:00
$displayLength = intval($opts["iDisplayLength"]);
if ($displayLength !== -1) {
$mainSqlQuery.=
" OFFSET :offset LIMIT :limit";
2013-08-02 22:16:04 +02:00
$paramMap["offset"] = $opts["iDisplayStart"];
$paramMap["limit"] = $displayLength;
}
2013-08-02 22:16:04 +02:00
$stmt = $this->con->prepare($mainSqlQuery);
foreach ($paramMap as $param => $v) {
$stmt->bindValue($param, $v);
}
2013-08-02 22:16:04 +02:00
$rows = array();
if ($stmt->execute()) {
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
else {
$msg = implode(',', $stmt->errorInfo());
throw new Exception("Error: $msg");
}
//-----------------------------------------------------------------
//processing the results
foreach ($rows as &$row) {
$formatter = new LengthFormatter($row['length']);
$row['length'] = $formatter->format();
}
2013-07-18 07:31:20 +02:00
return array(
"sEcho" => intval($opts["sEcho"]),
//"iTotalDisplayRecords" => intval($totalDisplayRows),
"iTotalDisplayRecords" => intval($totalRows),
"iTotalRecords" => intval($totalRows),
"history" => $rows
);
}
public function getShowList($startDT, $endDT)
{
$user = Application_Model_User::getCurrentUser();
$shows = Application_Model_Show::getShows($startDT, $endDT);
Logging::info($startDT->format("Y-m-d H:i:s"));
Logging::info($endDT->format("Y-m-d H:i:s"));
Logging::info($shows);
//need to filter the list to only their shows
if ($user->isHost()) {
$showIds = array();
foreach ($shows as $show) {
$showIds[] = $show["show_id"];
}
$showIds = array_unique($showIds);
Logging::info($showIds);
$hostRecords = CcShowHostsQuery::create()
->filterByDbHost($user->getId())
->filterByDbShow($showIds)
->find($this->con);
$filteredShowIds = array();
foreach($hostRecords as $record) {
$filteredShowIds[] = $record->getDbShow();
}
Logging::info($filteredShowIds);
$filteredShows = array();
foreach($shows as $show) {
if (in_array($show["show_id"], $filteredShowIds)) {
$filteredShows[] = $show;
}
}
}
else {
$filteredShows = $shows;
}
$timezoneUTC = new DateTimeZone("UTC");
$timezoneLocal = new DateTimeZone($this->timezone);
foreach ($filteredShows as &$result) {
//need to display the results in the station's timezone.
$dateTime = new DateTime($result["starts"], $timezoneUTC);
$dateTime->setTimezone($timezoneLocal);
$result["starts"] = $dateTime->format("Y-m-d H:i:s");
$dateTime = new DateTime($result["ends"], $timezoneUTC);
$dateTime->setTimezone($timezoneLocal);
$result["ends"] = $dateTime->format("Y-m-d H:i:s");
}
return $filteredShows;
}
2013-07-18 07:31:20 +02:00
public function insertPlayedItem($schedId) {
2013-07-18 07:31:20 +02:00
$this->con->beginTransaction();
2013-07-18 07:31:20 +02:00
try {
2013-07-18 07:31:20 +02:00
$item = CcScheduleQuery::create()->findPK($schedId, $this->con);
2013-07-18 07:31:20 +02:00
//TODO figure out how to combine these all into 1 query.
$showInstance = $item->getCcShowInstances($this->con);
$show = $showInstance->getCcShow($this->con);
2013-07-18 07:31:20 +02:00
$fileId = $item->getDbFileId();
2013-07-18 07:31:20 +02:00
//don't add webstreams
if (isset($fileId)) {
2013-07-18 07:31:20 +02:00
$metadata = array();
$metadata["showname"] = $show->getDbName();
2013-07-18 07:31:20 +02:00
$history = new CcPlayoutHistory();
$history->setDbFileId($fileId);
$history->setDbStarts($item->getDbStarts(null));
$history->setDbEnds($item->getDbEnds(null));
$history->setDbInstanceId($item->getDbInstanceId());
2013-07-18 07:31:20 +02:00
foreach ($metadata as $key => $val) {
$meta = new CcPlayoutHistoryMetaData();
$meta->setDbKey($key);
$meta->setDbValue($val);
2013-07-18 07:31:20 +02:00
$history->addCcPlayoutHistoryMetaData($meta);
}
2013-07-18 07:31:20 +02:00
$history->save($this->con);
}
2013-07-18 07:31:20 +02:00
$this->con->commit();
2013-07-18 07:31:20 +02:00
}
catch (Exception $e) {
$this->con->rollback();
throw $e;
}
}
2013-07-18 07:31:20 +02:00
/* id is an id in cc_playout_history */
public function makeHistoryItemForm($id, $populate=false) {
2013-07-23 00:11:44 +02:00
try {
$form = new Application_Form_EditHistoryItem();
$template = $this->getConfiguredItemTemplate();
$required = $this->mandatoryItemFields();
$form->createFromTemplate($template["fields"], $required);
if ($populate) {
$formValues = array();
$historyRecord = CcPlayoutHistoryQuery::create()->findPk($id, $this->con);
$file = $historyRecord->getCcFiles();
if (isset($file)) {
$f = Application_Model_StoredFile::createWithFile($file, $this->con);
$filemd = $f->getDbColMetadata();
}
$metadata = array();
$mds = $historyRecord->getCcPlayoutHistoryMetaDatas();
foreach ($mds as $md) {
$metadata[$md->getDbKey()] = $md->getDbValue();
}
$prefix = Application_Form_EditHistoryItem::ID_PREFIX;
$formValues["{$prefix}id"] = $id;
foreach($template["fields"] as $index => $field) {
$key = $field["name"];
$value = "";
if (in_array($key, $required)) {
$method = "getDb".ucfirst($key);
$value = $historyRecord->$method();
}
else if (isset($filemd) && $field["isFileMd"]) {
$value = $filemd[$key];
}
else if (isset($metadata[$key])) {
$value = $metadata[$key];
}
//need to convert to the station's local time first.
if ($field["type"] == TEMPLATE_DATETIME) {
$timezoneUTC = new DateTimeZone("UTC");
$timezoneLocal = new DateTimeZone($this->timezone);
$dateTime = new DateTime($value, $timezoneUTC);
$dateTime->setTimezone($timezoneLocal);
$value = $dateTime->format("Y-m-d H:i:s");
}
$formValues["$prefix{$key}"] = $value;
}
$form->populate($formValues);
}
2013-07-23 00:11:44 +02:00
return $form;
}
catch (Exception $e) {
Logging::info($e);
throw $e;
}
}
2013-07-18 07:31:20 +02:00
/* id is an id in cc_files */
public function makeHistoryFileForm($id) {
2013-07-18 07:37:39 +02:00
2013-07-18 07:31:20 +02:00
try {
$form = new Application_Form_EditHistoryFile();
$template = $this->getConfiguredFileTemplate();
$required = $this->mandatoryFileFields();
$form->createFromTemplate($template["fields"], $required);
2013-07-18 07:31:20 +02:00
$file = Application_Model_StoredFile::RecallById($id, $this->con);
$md = $file->getDbColMetadata();
$prefix = Application_Form_EditHistoryFile::ID_PREFIX;
2013-08-12 21:08:09 +02:00
$formValues = array();
$formValues["{$prefix}id"] = $id;
2013-08-12 21:08:09 +02:00
foreach($template["fields"] as $index => $field) {
$key = $field["name"];
if (in_array($key, $required)) {
continue;
}
$value = $md[$key];
$formValues["$prefix{$key}"] = $value;
2013-08-12 21:08:09 +02:00
}
2013-08-12 21:08:09 +02:00
$form->populate($formValues);
2013-07-18 07:31:20 +02:00
2013-07-18 07:37:39 +02:00
return $form;
}
catch (Exception $e) {
2013-07-22 16:45:39 +02:00
Logging::info($e);
2013-07-23 00:11:44 +02:00
throw $e;
2013-07-18 07:31:20 +02:00
}
}
public function populateTemplateFile($values, $id) {
$this->con->beginTransaction();
try {
$file = Application_Model_StoredFile::RecallById($id, $this->con);
$prefix = Application_Form_EditHistoryFile::ID_PREFIX;
$prefix_len = strlen($prefix);
$templateValues = $values[$prefix."template"];
$md = array();
foreach ($templateValues as $index => $value) {
$key = substr($index, $prefix_len);
$md[$key] = $value;
}
$file->setDbColMetadata($md);
$this->con->commit();
}
catch (Exception $e) {
$this->con->rollback();
throw $e;
}
}
public function populateTemplateItem($values, $id=null, $instance_id=null) {
$this->con->beginTransaction();
try {
$template = $this->getConfiguredItemTemplate();
$prefix = Application_Form_EditHistoryItem::ID_PREFIX;
if (isset($id)) {
$historyRecord = CcPlayoutHistoryQuery::create()->findPk($id, $this->con);
}
else {
$historyRecord = new CcPlayoutHistory();
}
if (isset($instance_id)) {
$historyRecord->setDbInstanceId($instance_id);
}
$timezoneUTC = new DateTimeZone("UTC");
$timezoneLocal = new DateTimeZone($this->timezone);
$dateTime = new DateTime($values[$prefix."starts"], $timezoneLocal);
$dateTime->setTimezone($timezoneUTC);
$historyRecord->setDbStarts($dateTime->format("Y-m-d H:i:s"));
$dateTime = new DateTime($values[$prefix."ends"], $timezoneLocal);
$dateTime->setTimezone($timezoneUTC);
$historyRecord->setDbEnds($dateTime->format("Y-m-d H:i:s"));
$templateValues = $values[$prefix."template"];
$file = $historyRecord->getCcFiles();
$md = array();
2013-07-29 14:59:04 +02:00
$metadata = array();
$fields = $template["fields"];
$required = $this->mandatoryItemFields();
$phpCasts = $this->getPhpCasts();
for ($i = 0, $len = count($fields); $i < $len; $i++) {
$field = $fields[$i];
$key = $field["name"];
//required is delt with before this loop.
if (in_array($key, $required)) {
continue;
}
$isFileMd = $field["isFileMd"];
$entry = $phpCasts[$field["type"]]($templateValues[$prefix.$key]);
if ($isFileMd && isset($file)) {
Logging::info("adding metadata associated to a file for {$key} = {$entry}");
$md[$key] = $entry;
}
else {
Logging::info("adding metadata for {$key} = {$entry}");
$metadata[$key] = $entry;
}
}
2013-07-31 01:25:06 +02:00
if (count($md) > 0) {
$f = Application_Model_StoredFile::createWithFile($file, $this->con);
2013-07-31 01:25:06 +02:00
$f->setDbColMetadata($md);
}
2013-07-29 14:59:04 +02:00
//Use this array to update existing values.
$mds = $historyRecord->getCcPlayoutHistoryMetaDatas();
foreach ($mds as $md) {
$prevmd[$md->getDbKey()] = $md;
}
2013-07-29 14:59:04 +02:00
foreach ($metadata as $key => $val) {
if (isset($prevmd[$key])) {
$meta = $prevmd[$key];
$meta->setDbValue($val);
}
else {
$meta = new CcPlayoutHistoryMetaData();
$meta->setDbKey($key);
$meta->setDbValue($val);
$historyRecord->addCcPlayoutHistoryMetaData($meta);
}
2013-07-29 14:59:04 +02:00
}
$historyRecord->save($this->con);
$this->con->commit();
}
catch (Exception $e) {
$this->con->rollback();
throw $e;
}
}
//start,end timestamp strings in local timezone.
public function populateShowInstances($start, $end) {
$timezoneLocal = new DateTimeZone($this->timezone);
$startDT = new DateTime($start, $timezoneLocal);
$endDT = new DateTime($end, $timezoneLocal);
$shows = $this->getShowList($startDT, $endDT);
$select = array();
foreach ($shows as &$show) {
$select[$show["instance_id"]] = $show["name"];
}
return $select;
}
2013-07-18 07:31:20 +02:00
2013-07-23 00:11:44 +02:00
public function createPlayedItem($data) {
2013-07-22 16:45:39 +02:00
2013-07-23 00:11:44 +02:00
try {
$form = $this->makeHistoryItemForm(null);
$history_id = $form->getElement("his_item_id");
$instance_id = $data["instance_id"];
$json = array();
2013-07-23 00:11:44 +02:00
if ($form->isValid($data)) {
$history_id->setIgnore(true);
$values = $form->getValues();
2013-07-23 00:11:44 +02:00
Logging::info("created list item");
Logging::info($values);
$this->populateTemplateItem($values, null, $instance_id);
2013-07-23 00:11:44 +02:00
}
else {
Logging::info("created list item NOT VALID");
$msgs = $form->getMessages();
Logging::info($msgs);
$json["form"] = $form;
$json["error"] = $msgs;
}
return $json;
2013-07-23 00:11:44 +02:00
}
catch (Exception $e) {
throw $e;
2013-07-23 00:11:44 +02:00
}
2013-07-22 16:45:39 +02:00
}
/* id is an id in cc_playout_history */
public function editPlayedItem($data) {
2013-07-18 07:31:20 +02:00
2013-07-23 00:11:44 +02:00
try {
$id = $data["his_item_id"];
$instance_id = $data["instance_id"];
$form = $this->makeHistoryItemForm($id);
$history_id = $form->getElement("his_item_id");
$history_id->setRequired(true);
Logging::info($data);
$json = array();
2013-07-23 00:11:44 +02:00
if ($form->isValid($data)) {
$history_id->setIgnore(true);
$values = $form->getValues();
Logging::info("edited list item");
Logging::info($values);
$this->populateTemplateItem($values, $id, $instance_id);
}
else {
Logging::info("edited list item NOT VALID");
$msgs = $form->getMessages();
Logging::info($msgs);
$json["form"] = $form;
$json["error"] = $msgs;
}
return $json;
2013-07-23 00:11:44 +02:00
}
catch (Exception $e) {
throw $e;
2013-07-23 00:11:44 +02:00
}
}
2013-07-18 07:31:20 +02:00
/* id is an id in cc_files */
2013-07-18 07:31:20 +02:00
public function editPlayedFile($data) {
try {
$id = $data["his_file_id"];
$form = $form = $this->makeHistoryFileForm($id);
2013-08-12 21:08:09 +02:00
$history_id = $form->getElement("his_file_id");
$history_id->setRequired(true);
Logging::info($data);
$json = array();
if ($form->isValid($data)) {
2013-08-12 21:08:09 +02:00
$history_id->setIgnore(true);
$values = $form->getValues();
2013-08-12 21:08:09 +02:00
Logging::info("edited list item");
Logging::info($values);
$this->populateTemplateFile($values, $id);
}
else {
2013-08-12 21:08:09 +02:00
$msgs = $form->getMessages();
Logging::info($msgs);
$json["error"] = $msgs;
}
return $json;
$this->con->commit();
}
catch (Exception $e) {
$this->con->rollback();
Logging::info($e);
throw $e;
}
2013-07-18 07:31:20 +02:00
return $json;
}
/* id is an id in cc_playout_history */
public function deletePlayedItem($id) {
$this->con->beginTransaction();
try {
$record = CcPlayoutHistoryQuery::create()->findPk($id, $this->con);
$record->delete($this->con);
$this->con->commit();
}
catch (Exception $e) {
$this->con->rollback();
Logging::info($e);
throw $e;
}
}
2013-08-20 23:23:48 +02:00
/* id is an id in cc_playout_history */
public function deletePlayedItems($ids) {
2013-08-20 23:23:48 +02:00
$this->con->beginTransaction();
2013-08-20 23:23:48 +02:00
try {
2013-08-20 23:23:48 +02:00
$records = CcPlayoutHistoryQuery::create()->findPks($ids, $this->con);
$records->delete($this->con);
2013-08-20 23:23:48 +02:00
$this->con->commit();
}
catch (Exception $e) {
$this->con->rollback();
Logging::info($e);
throw $e;
}
}
2013-07-23 00:11:44 +02:00
//---------------- Following code is for History Templates --------------------------//
public function getFieldTypes() {
$fields = array(
//TEMPLATE_DATE,
//TEMPLATE_TIME,
//TEMPLATE_DATETIME,
2013-07-29 14:59:04 +02:00
TEMPLATE_STRING,
TEMPLATE_BOOLEAN,
TEMPLATE_INT,
TEMPLATE_FLOAT,
);
return $fields;
}
2013-08-20 23:23:48 +02:00
private function getPhpCasts() {
2013-08-20 23:23:48 +02:00
$fields = array(
TEMPLATE_DATE => "strval",
TEMPLATE_TIME => "strval",
TEMPLATE_DATETIME => "strval",
TEMPLATE_STRING => "strval",
TEMPLATE_BOOLEAN => "intval", //boolval only exists in php 5.5+ wtf?
TEMPLATE_INT => "intval",
TEMPLATE_FLOAT => "floatval",
);
2013-08-20 23:23:48 +02:00
return $fields;
}
2013-08-01 22:37:10 +02:00
private function getSqlTypes() {
2013-08-01 22:37:10 +02:00
$fields = array(
TEMPLATE_DATE => "date",
TEMPLATE_TIME => "time",
TEMPLATE_DATETIME => "datetime",
TEMPLATE_STRING => "text",
TEMPLATE_BOOLEAN => "boolean",
TEMPLATE_INT => "integer",
TEMPLATE_FLOAT => "float",
);
2013-08-01 22:37:10 +02:00
return $fields;
}
public function getFileMetadataTypes() {
2013-07-29 22:32:05 +02:00
$fileMD = array(
array("name"=> MDATA_KEY_TITLE, "label"=> _("Title"), "type"=> TEMPLATE_STRING),
array("name"=> MDATA_KEY_CREATOR, "label"=> _("Creator"), "type"=> TEMPLATE_STRING),
array("name"=> MDATA_KEY_SOURCE, "label"=> _("Album"), "type"=> TEMPLATE_STRING),
array("name"=> MDATA_KEY_DURATION, "label"=> _("Length"), "type"=> TEMPLATE_STRING),
array("name"=> MDATA_KEY_GENRE, "label"=> _("Genre"), "type"=> TEMPLATE_STRING),
array("name"=> MDATA_KEY_MOOD, "label"=> _("Mood"), "type"=> TEMPLATE_STRING),
array("name"=> MDATA_KEY_LABEL, "label"=> _("Label"), "type"=> TEMPLATE_STRING),
array("name"=> MDATA_KEY_COMPOSER, "label"=> _("Composer"), "type"=> TEMPLATE_STRING),
array("name"=> MDATA_KEY_ISRC, "label"=> _("ISRC"), "type"=> TEMPLATE_STRING),
array("name"=> MDATA_KEY_COPYRIGHT, "label"=> _("Copyright"), "type"=> TEMPLATE_STRING),
array("name"=> MDATA_KEY_YEAR, "label"=> _("Year"), "type"=> TEMPLATE_INT),
array("name"=> MDATA_KEY_TRACKNUMBER, "label"=> _("Track"), "type"=> TEMPLATE_INT),
array("name"=> MDATA_KEY_CONDUCTOR, "label"=> _("Conductor"), "type"=> TEMPLATE_STRING),
array("name"=> MDATA_KEY_LANGUAGE, "label"=> _("Language"), "type"=> TEMPLATE_STRING),
);
return $fileMD;
}
public function mandatoryItemFields() {
$fields = array("starts", "ends");
return $fields;
}
2013-08-02 21:30:35 +02:00
public function mandatoryFileFields() {
$fields = array("played");
2013-08-02 21:30:35 +02:00
return $fields;
}
2013-07-23 00:11:44 +02:00
private function defaultItemTemplate() {
$template = array();
2013-07-23 00:11:44 +02:00
$fields = array();
$fields[] = array("name" => "starts", "label"=> _("Start Time"),"type" => TEMPLATE_DATETIME, "isFileMd" => false);
$fields[] = array("name" => "ends", "label"=> _("End Time"), "type" => TEMPLATE_DATETIME, "isFileMd" => false);
$fields[] = array("name" => MDATA_KEY_TITLE, "label"=> _("Title"), "type" => TEMPLATE_STRING, "isFileMd" => true); //these fields can be populated from an associated file.
$fields[] = array("name" => MDATA_KEY_CREATOR, "label"=> _("Creator"), "type" => TEMPLATE_STRING, "isFileMd" => true);
$template["name"] = "Log Sheet ".date("Y-m-d H:i:s")." Template";
$template["fields"] = $fields;
return $template;
2013-07-23 00:11:44 +02:00
}
/*
* Default File Summary Template. Taken from The Czech radio requirements (customer requested this in the past).
*/
2013-08-02 21:30:35 +02:00
private function defaultFileTemplate() {
2013-08-02 21:30:35 +02:00
$template = array();
$fields = array();
$fields[] = array("name" => MDATA_KEY_TITLE, "label"=> _("Title"), "type" => TEMPLATE_STRING, "isFileMd" => true);
$fields[] = array("name" => MDATA_KEY_CREATOR, "label"=> _("Creator"), "type" => TEMPLATE_STRING, "isFileMd" => true);
$fields[] = array("name" => "played", "label"=> _("Played"), "type" => TEMPLATE_INT, "isFileMd" => false);
$fields[] = array("name" => MDATA_KEY_DURATION, "label"=> _("Length"), "type" => TEMPLATE_STRING, "isFileMd" => true);
$fields[] = array("name" => MDATA_KEY_COMPOSER, "label"=> _("Composer"), "type" => TEMPLATE_STRING, "isFileMd" => true);
$fields[] = array("name" => MDATA_KEY_COPYRIGHT, "label"=> _("Copyright"), "type" => TEMPLATE_STRING, "isFileMd" => true);
2013-08-02 21:30:35 +02:00
$template["name"] = "File Summary ".date("Y-m-d H:i:s")." Template";
$template["fields"] = $fields;
2013-08-02 21:30:35 +02:00
return $template;
}
public function loadTemplate($id) {
2013-07-31 01:25:06 +02:00
try {
2013-08-02 21:30:35 +02:00
if (!is_numeric($id)) {
throw new Exception("Error: $id is not numeric.");
}
$template = CcPlayoutHistoryTemplateQuery::create()->findPk($id, $this->con);
if (empty($template)) {
throw new Exception("Error: Template $id does not exist.");
}
$c = new Criteria();
$c->addAscendingOrderByColumn(CcPlayoutHistoryTemplateFieldPeer::POSITION);
$config = $template->getCcPlayoutHistoryTemplateFields($c, $this->con);
$fields = array();
foreach ($config as $item) {
$fields[] = array(
"name" => $item->getDbName(),
"label" => $item->getDbLabel(),
"type" => $item->getDbType(),
"isFileMd" => $item->getDbIsFileMD(),
"id" => $item->getDbId()
);
}
$data = array();
$data["id"] = $template->getDbId();
$data["name"] = $template->getDbName();
$data["fields"] = $fields;
$data["type"] = $template->getDbType();
2013-07-31 01:25:06 +02:00
return $data;
}
catch (Exception $e) {
throw $e;
}
}
public function getItemTemplate($id) {
if (is_numeric($id)) {
Logging::info("template id is: $id");
$template = $this->loadTemplate($id);
2013-07-23 00:11:44 +02:00
}
else {
Logging::info("Using default template");
$template = $this->defaultItemTemplate();
}
2013-07-23 00:11:44 +02:00
return $template;
}
public function getTemplates($type) {
$list = array();
try {
$query = CcPlayoutHistoryTemplateQuery::create()
->setFormatter(ModelCriteria::FORMAT_ON_DEMAND);
if (isset($type)) {
$templates = $query->findByDbType($type);
}
else {
$templates = $query->find();
}
foreach ($templates as $template) {
$list[$template->getDbId()] = $template->getDbName();
}
return $list;
2013-07-31 01:25:06 +02:00
}
catch (Exception $e) {
throw $e;
}
}
public function getListItemTemplates() {
return $this->getTemplates(self::TEMPLATE_TYPE_ITEM);
}
2013-08-02 21:30:35 +02:00
public function getFileTemplates() {
return $this->getTemplates(self::TEMPLATE_TYPE_FILE);
}
private function datatablesColumns($fields) {
2013-08-02 21:30:35 +02:00
$columns = array();
foreach ($fields as $field) {
$label = $field["label"];
2013-08-02 21:30:35 +02:00
$key = $field["name"];
2013-08-02 21:30:35 +02:00
$columns[] = array(
"sTitle"=> $label,
2013-08-02 21:30:35 +02:00
"mDataProp"=> $key,
"sClass"=> "his_{$key}",
"sDataType"=> $field["type"]
2013-08-02 21:30:35 +02:00
);
}
return $columns;
}
public function getDatatablesLogSheetColumns() {
//need to prepend a checkbox column.
$checkbox = array(
"sTitle"=> "",
"mDataProp"=> "checkbox",
"sClass"=> "his_checkbox",
"bSortable"=> false
);
try {
$template = $this->getConfiguredItemTemplate();
2013-08-20 05:20:26 +02:00
$fields = $template["fields"];
$columns = $this->datatablesColumns($fields);
array_unshift($columns, $checkbox);
return $columns;
2013-07-31 23:39:45 +02:00
}
catch (Exception $e) {
throw $e;
}
}
2013-08-02 21:30:35 +02:00
public function getDatatablesFileSummaryColumns() {
2013-08-02 21:30:35 +02:00
try {
$template = $this->getConfiguredFileTemplate();
return $this->datatablesColumns($template["fields"]);
2013-08-02 21:30:35 +02:00
}
catch (Exception $e) {
throw $e;
}
}
2013-07-31 01:25:06 +02:00
public function getConfiguredItemTemplate() {
2013-07-31 01:25:06 +02:00
try {
$id = Application_Model_Preference::GetHistoryItemTemplate();
if (is_numeric($id)) {
$template = $this->loadTemplate($id);
}
else {
$template = $this->defaultItemTemplate();
}
return $template;
2013-07-31 01:25:06 +02:00
}
catch (Exception $e) {
throw $e;
}
}
public function setConfiguredItemTemplate($id) {
try {
Application_Model_Preference::SetHistoryItemTemplate($id);
}
2013-07-31 01:25:06 +02:00
catch (Exception $e) {
throw $e;
}
}
2013-08-02 21:30:35 +02:00
public function getConfiguredFileTemplate() {
2013-08-02 21:30:35 +02:00
try {
$id = Application_Model_Preference::GetHistoryFileTemplate();
2013-08-02 21:30:35 +02:00
if (is_numeric($id)) {
$template = $this->loadTemplate($id);
}
else {
$template = $this->defaultFileTemplate();
}
return $template;
}
catch (Exception $e) {
throw $e;
}
}
2013-08-02 21:30:35 +02:00
public function setConfiguredFileTemplate($id) {
try {
Application_Model_Preference::SetHistoryFileTemplate($id);
}
catch (Exception $e) {
throw $e;
}
}
2013-08-02 21:30:35 +02:00
public function setConfiguredTemplate($id) {
try {
$template = $this->loadTemplate($id);
$type = $template["type"];
$setTemplate = "setConfigured".ucfirst($type)."Template";
2013-08-02 21:30:35 +02:00
$this->$setTemplate($id);
}
catch (Exception $e) {
throw $e;
}
}
public function getConfiguredTemplateIds() {
2013-08-01 22:37:10 +02:00
try {
$id = Application_Model_Preference::GetHistoryItemTemplate();
$id2 = Application_Model_Preference::GetHistoryFileTemplate();
$configured = array();
if (is_numeric($id)) {
$configured[] = $id;
}
2013-08-02 21:30:35 +02:00
if (is_numeric($id2)) {
$configured[] = $id2;
}
return $configured;
2013-08-01 22:37:10 +02:00
}
catch (Exception $e) {
throw $e;
}
}
public function createTemplate($config) {
2013-07-29 23:22:44 +02:00
$this->con->beginTransaction();
2013-07-29 23:22:44 +02:00
try {
$type = $config["type"];
$method = "default".ucfirst($type)."Template";
$default = $this->$method();
$name = isset($config["name"]) ? $config["name"] : $default["name"];
$fields = isset($config["fields"]) ? $config["fields"] : $default["fields"];
$doSetDefault = isset($config['setDefault']) ? $config['setDefault'] : false;
2013-07-29 23:22:44 +02:00
$template = new CcPlayoutHistoryTemplate();
$template->setDbName($name);
$template->setDbType($type);
2013-07-29 23:35:07 +02:00
foreach ($fields as $index=>$field) {
$isMd = ($field["isFileMd"] == 'true') ? true : false;
2013-07-29 23:35:07 +02:00
$templateField = new CcPlayoutHistoryTemplateField();
$templateField->setDbName($field["name"]);
$templateField->setDbLabel($field["label"]);
2013-07-29 23:35:07 +02:00
$templateField->setDbType($field["type"]);
$templateField->setDbIsFileMD($isMd);
2013-07-29 23:35:07 +02:00
$templateField->setDbPosition($index);
2013-07-29 23:35:07 +02:00
$template->addCcPlayoutHistoryTemplateField($templateField);
}
2013-07-29 23:35:07 +02:00
$template->save($this->con);
if ($doSetDefault) {
$this->setConfiguredItemTemplate($template->getDbid());
}
2013-07-29 23:22:44 +02:00
$this->con->commit();
return $template->getDbid();
2013-07-29 23:22:44 +02:00
}
2013-07-31 01:25:06 +02:00
catch (Exception $e) {
$this->con->rollback();
throw $e;
}
}
2013-08-01 22:37:10 +02:00
public function updateItemTemplate($id, $name, $fields, $doSetDefault=false) {
2013-08-01 22:37:10 +02:00
$this->con->beginTransaction();
2013-08-01 22:37:10 +02:00
try {
2013-08-01 22:37:10 +02:00
$template = CcPlayoutHistoryTemplateQuery::create()->findPk($id, $this->con);
$template->setDbName($name);
if (count($fields) === 0) {
$t = $this->defaultItemTemplate();
$fields = $t["fields"];
}
2013-08-01 22:37:10 +02:00
$template->getCcPlayoutHistoryTemplateFields()->delete($this->con);
2013-08-01 22:37:10 +02:00
foreach ($fields as $index=>$field) {
2013-08-01 22:37:10 +02:00
$isMd = ($field["isFileMd"] == 'true') ? true : false;
2013-08-01 22:37:10 +02:00
$templateField = new CcPlayoutHistoryTemplateField();
$templateField->setDbName($field["name"]);
$templateField->setDbType($field["type"]);
$templateField->setDbLabel($field["label"]);
2013-08-01 22:37:10 +02:00
$templateField->setDbIsFileMD($isMd);
$templateField->setDbPosition($index);
2013-08-01 22:37:10 +02:00
$template->addCcPlayoutHistoryTemplateField($templateField);
}
2013-08-01 22:37:10 +02:00
$template->save($this->con);
2013-08-01 22:37:10 +02:00
if ($doSetDefault) {
$this->setConfiguredItemTemplate($template->getDbid());
}
2013-08-01 22:37:10 +02:00
$this->con->commit();
}
catch (Exception $e) {
$this->con->rollback();
throw $e;
}
}
public function deleteTemplate($id) {
$this->con->beginTransaction();
try {
$template = CcPlayoutHistoryTemplateQuery::create()->findPk($id, $this->con);
$template->delete($this->con);
2013-08-01 22:37:10 +02:00
$this->con->commit();
}
catch (Exception $e) {
$this->con->rollback();
throw $e;
}
}
}