CC-84: Smart Playlists
- added 'Smart Block' filter in datatable - added block files to library datatable
This commit is contained in:
parent
1f3cbd8aba
commit
bef9ba1eea
|
@ -50,10 +50,14 @@ class LibraryController extends Zend_Controller_Action
|
|||
$file = Application_Model_StoredFile::Recall($id);
|
||||
|
||||
if (isset($this->obj_sess->id) && $screen == "playlist") {
|
||||
// if the user is not admin or pm, check the creator and see if this person owns the playlist
|
||||
$playlist = new Application_Model_Playlist($this->obj_sess->id);
|
||||
if ($isAdminOrPM || $playlist->getCreatorId() == $user->getId()) {
|
||||
$menu["pl_add"] = array("name"=> "Add to Playlist", "icon" => "add-playlist", "icon" => "copy");
|
||||
// if the user is not admin or pm, check the creator and see if this person owns the playlist or Block
|
||||
if ($this->obj_sess->type == 'playlist') {
|
||||
$obj = new Application_Model_Playlist($this->obj_sess->id);
|
||||
} else {
|
||||
$obj = new Application_Model_Block($this->obj_sess->id);
|
||||
}
|
||||
if ($isAdminOrPM || $obj->getCreatorId() == $user->getId()) {
|
||||
$menu["pl_add"] = array("name"=> "Add to ".ucfirst($this->obj_sess->type), "icon" => "add-playlist", "icon" => "copy");
|
||||
}
|
||||
}
|
||||
if ($isAdminOrPM) {
|
||||
|
@ -63,14 +67,19 @@ class LibraryController extends Zend_Controller_Action
|
|||
|
||||
$url = $file->getRelativeFileUrl($baseUrl).'/download/true';
|
||||
$menu["download"] = array("name" => "Download", "icon" => "download", "url" => $url);
|
||||
} elseif ($type === "playlist") {
|
||||
$playlist = new Application_Model_Playlist($id);
|
||||
} elseif ($type === "playlist" || $type === "block") {
|
||||
if ($type === 'playlist') {
|
||||
$obj = new Application_Model_Playlist($id);
|
||||
} else {
|
||||
$obj = new Application_Model_Block($id);
|
||||
}
|
||||
|
||||
if ($this->obj_sess->id !== $id && $screen == "playlist") {
|
||||
if ($isAdminOrPM || $playlist->getCreatorId() == $user->getId()) {
|
||||
if ($isAdminOrPM || $obj->getCreatorId() == $user->getId()) {
|
||||
$menu["edit"] = array("name"=> "Edit", "icon" => "edit");
|
||||
}
|
||||
}
|
||||
if ($isAdminOrPM || $playlist->getCreatorId() == $user->getId()) {
|
||||
if ($isAdminOrPM || $obj->getCreatorId() == $user->getId()) {
|
||||
$menu["del"] = array("name"=> "Delete", "icon" => "delete", "url" => "/library/delete");
|
||||
}
|
||||
}
|
||||
|
@ -113,6 +122,7 @@ class LibraryController extends Zend_Controller_Action
|
|||
|
||||
$files = array();
|
||||
$playlists = array();
|
||||
$blocks = array();
|
||||
|
||||
$message = null;
|
||||
|
||||
|
@ -122,13 +132,19 @@ class LibraryController extends Zend_Controller_Action
|
|||
$files[] = intval($media["id"]);
|
||||
} elseif ($media["type"] === "playlist") {
|
||||
$playlists[] = intval($media["id"]);
|
||||
} elseif ($media["type"] === "block") {
|
||||
$blocks[] = intval($media["id"]);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Application_Model_Playlist::deletePlaylists($playlists, $user->getId());
|
||||
if ($media["type"] === "playlist") {
|
||||
Application_Model_Playlist::deletePlaylists($playlists, $user->getId());
|
||||
} elseif ($media["type"] === "block") {
|
||||
Application_Model_Block::deleteBlocks($blocks, $user->getId());
|
||||
}
|
||||
} catch (PlaylistNoPermissionException $e) {
|
||||
$this->view->message = "You don't have permission to delete selected playlists/files.";
|
||||
$this->view->message = "You don't have permission to delete selected items.";
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -155,6 +171,7 @@ class LibraryController extends Zend_Controller_Action
|
|||
public function contentsFeedAction()
|
||||
{
|
||||
$params = $this->getRequest()->getParams();
|
||||
|
||||
$r = Application_Model_StoredFile::searchLibraryFiles($params);
|
||||
|
||||
//TODO move this to the datatables row callback.
|
||||
|
|
|
@ -203,7 +203,7 @@ class PlaylistController extends Zend_Controller_Action
|
|||
$this->view->type = $this->obj_sess->type;
|
||||
}
|
||||
} catch (PlaylistNotFoundException $e) {
|
||||
$this->playlistNotFound();
|
||||
$this->playlistNotFound($this->obj_sess->type);
|
||||
} catch (Exception $e) {
|
||||
$this->playlistUnknownError($e);
|
||||
}
|
||||
|
@ -230,31 +230,20 @@ class PlaylistController extends Zend_Controller_Action
|
|||
$this->createFullResponse($obj);
|
||||
}
|
||||
|
||||
/*public function newBlockAction()
|
||||
{
|
||||
$bl_sess = $this->bl_sess;
|
||||
$userInfo = Zend_Auth::getInstance()->getStorage()->read();
|
||||
|
||||
$bl = new Application_Model_Block();
|
||||
$bl->setName("Untitled Smart Block");
|
||||
$bl->setBLMetaData('dc:creator', $userInfo->id);
|
||||
|
||||
$this->changePlaylist($bl->getId(), 'block');
|
||||
$this->createFullResponse($bl);
|
||||
}*/
|
||||
|
||||
public function editAction()
|
||||
{
|
||||
$id = $this->_getParam('id', null);
|
||||
Logging::log("editing playlist {$id}");
|
||||
$type = $this->_getParam('type');
|
||||
$objInfo = $this->getObjInfo($type);
|
||||
Logging::log("editing {$type} {$id}");
|
||||
|
||||
if (!is_null($id)) {
|
||||
$this->changePlaylist($id, 'playlist');
|
||||
$this->changePlaylist($id, $type);
|
||||
}
|
||||
|
||||
try {
|
||||
$pl = new Application_Model_Playlist($id);
|
||||
$this->createFullResponse($pl);
|
||||
$obj = new $objInfo['className']($id);
|
||||
$this->createFullResponse($obj);
|
||||
} catch (PlaylistNotFoundException $e) {
|
||||
$this->playlistNotFound();
|
||||
} catch (Exception $e) {
|
||||
|
|
|
@ -94,7 +94,7 @@ class Application_Model_Block
|
|||
}
|
||||
} else {
|
||||
$this->block = new CcBlock();
|
||||
$this->block->setDbUTime("now", new DateTimeZone("UTC"));
|
||||
$this->block->setDbUTime(new DateTime("now", new DateTimeZone("UTC")));
|
||||
$this->block->save();
|
||||
}
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ class Application_Model_Playlist
|
|||
}
|
||||
} else {
|
||||
$this->pl = new CcPlaylist();
|
||||
$this->pl->setDbUTime("now", new DateTimeZone("UTC"));
|
||||
$this->pl->setDbUTime(new DateTime("now", new DateTimeZone("UTC")));
|
||||
$this->pl->save();
|
||||
}
|
||||
|
||||
|
@ -135,6 +135,9 @@ class Application_Model_Playlist
|
|||
|
||||
public function getLastModified($format = null)
|
||||
{
|
||||
//Logging::log($this->pl->getDbMtime($format));
|
||||
//Logging::log($this->pl);
|
||||
Logging::log("5555");
|
||||
return $this->pl->getDbMtime($format);
|
||||
}
|
||||
|
||||
|
|
|
@ -648,49 +648,60 @@ Logging::log("getting media! - 2");
|
|||
);
|
||||
|
||||
$plSelect = array();
|
||||
$blSelect = array();
|
||||
$fileSelect = array();
|
||||
foreach ($displayColumns as $key) {
|
||||
|
||||
if ($key === "id") {
|
||||
$plSelect[] = "PL.id AS ".$key;
|
||||
$blSelect[] = "BL.id AS ".$key;
|
||||
$fileSelect[] = $key;
|
||||
} elseif ($key === "track_title") {
|
||||
$plSelect[] = "name AS ".$key;
|
||||
$blSelect[] = "name AS ".$key;
|
||||
$fileSelect[] = $key;
|
||||
} elseif ($key === "ftype") {
|
||||
$plSelect[] = "'playlist'::varchar AS ".$key;
|
||||
$blSelect[] = "'block'::varchar AS ".$key;
|
||||
$fileSelect[] = $key;
|
||||
} elseif ($key === "artist_name") {
|
||||
$plSelect[] = "login AS ".$key;
|
||||
$blSelect[] = "login AS ".$key;
|
||||
$fileSelect[] = $key;
|
||||
}
|
||||
//same columns in each table.
|
||||
else if (in_array($key, array("length", "utime", "mtime"))) {
|
||||
$plSelect[] = $key;
|
||||
$blSelect[] = $key;
|
||||
$fileSelect[] = $key;
|
||||
} elseif ($key === "year") {
|
||||
|
||||
$plSelect[] = "EXTRACT(YEAR FROM utime)::varchar AS ".$key;
|
||||
$blSelect[] = "EXTRACT(YEAR FROM utime)::varchar AS ".$key;
|
||||
$fileSelect[] = "year AS ".$key;
|
||||
}
|
||||
//need to cast certain data as ints for the union to search on.
|
||||
else if (in_array($key, array("track_number", "bit_rate", "sample_rate"))) {
|
||||
$plSelect[] = "NULL::int AS ".$key;
|
||||
$blSelect[] = "NULL::int AS ".$key;
|
||||
$fileSelect[] = $key;
|
||||
} else {
|
||||
$plSelect[] = "NULL::text AS ".$key;
|
||||
$blSelect[] = "NULL::text AS ".$key;
|
||||
$fileSelect[] = $key;
|
||||
}
|
||||
}
|
||||
|
||||
$plSelect = "SELECT ". join(",", $plSelect);
|
||||
$blSelect = "SELECT ". join(",", $blSelect);
|
||||
$fileSelect = "SELECT ". join(",", $fileSelect);
|
||||
|
||||
$type = intval($datatables["type"]);
|
||||
|
||||
$plTable = "({$plSelect} FROM cc_playlist AS PL LEFT JOIN cc_subjs AS sub ON (sub.id = PL.creator_id))";
|
||||
$blTable = "({$blSelect} FROM cc_block AS BL LEFT JOIN cc_subjs AS sub ON (sub.id = BL.creator_id))";
|
||||
$fileTable = "({$fileSelect} FROM cc_files AS FILES WHERE file_exists = 'TRUE')";
|
||||
$unionTable = "({$plTable} UNION {$fileTable} ) AS RESULTS";
|
||||
$unionTable = "({$plTable} UNION {$blTable} UNION {$fileTable} ) AS RESULTS";
|
||||
|
||||
//choose which table we need to select data from.
|
||||
switch ($type) {
|
||||
|
@ -703,6 +714,9 @@ Logging::log("getting media! - 2");
|
|||
case 2:
|
||||
$fromTable = $plTable." AS Playlist"; //need an alias for the table if it's standalone.
|
||||
break;
|
||||
case 3:
|
||||
$fromTable = $blTable." AS Block"; //need an alias for the table if it's standalone.
|
||||
break;
|
||||
default:
|
||||
$fromTable = $unionTable;
|
||||
}
|
||||
|
@ -723,16 +737,15 @@ Logging::log("getting media! - 2");
|
|||
$formatter = new BitrateFormatter($row['bit_rate']);
|
||||
$row['bit_rate'] = $formatter->format();
|
||||
}
|
||||
|
||||
|
||||
//convert mtime and utime to localtime
|
||||
$row['mtime'] = new DateTime($row['mtime'], new DateTimeZone('UTC'));
|
||||
$row['mtime']->setTimeZone(new DateTimeZone(date_default_timezone_get()));
|
||||
$row['mtime'] = $row['mtime']->format('Y-m-d H:i:s');
|
||||
|
||||
$row['utime'] = new DateTime($row['utime'], new DateTimeZone('UTC'));
|
||||
$row['utime']->setTimeZone(new DateTimeZone(date_default_timezone_get()));
|
||||
$row['utime'] = $row['utime']->format('Y-m-d H:i:s');
|
||||
|
||||
|
||||
// add checkbox row
|
||||
$row['checkbox'] = "<input type='checkbox' name='cb_".$row['id']."'>";
|
||||
|
||||
|
|
|
@ -14,5 +14,87 @@
|
|||
* @package propel.generator.airtime
|
||||
*/
|
||||
class CcBlock extends BaseCcBlock {
|
||||
/**
|
||||
* Get the [optionally formatted] temporal [utime] column value.
|
||||
*
|
||||
*
|
||||
* @param string $format The date/time format string (either date()-style or strftime()-style).
|
||||
* If format is NULL, then the raw DateTime object will be returned.
|
||||
* @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL
|
||||
* @throws PropelException - if unable to parse/validate the date/time value.
|
||||
*/
|
||||
public function getDbUtime($format = 'Y-m-d H:i:s')
|
||||
{
|
||||
if ($this->utime === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
$dt = new DateTime($this->utime, new DateTimeZone("UTC"));
|
||||
} catch (Exception $x) {
|
||||
throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->utime, true), $x);
|
||||
}
|
||||
|
||||
if ($format === null) {
|
||||
// Because propel.useDateTimeClass is TRUE, we return a DateTime object.
|
||||
return $dt;
|
||||
} elseif (strpos($format, '%') !== false) {
|
||||
return strftime($format, $dt->format('U'));
|
||||
} else {
|
||||
return $dt->format($format);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the [optionally formatted] temporal [mtime] column value.
|
||||
*
|
||||
*
|
||||
* @param string $format The date/time format string (either date()-style or strftime()-style).
|
||||
* If format is NULL, then the raw DateTime object will be returned.
|
||||
* @return mixed Formatted date/time value as string or DateTime object (if format is NULL), NULL if column is NULL
|
||||
* @throws PropelException - if unable to parse/validate the date/time value.
|
||||
*/
|
||||
public function getDbMtime($format = 'Y-m-d H:i:s')
|
||||
{
|
||||
if ($this->mtime === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
$dt = new DateTime($this->mtime, new DateTimeZone("UTC"));
|
||||
} catch (Exception $x) {
|
||||
throw new PropelException("Internally stored date/time/timestamp value could not be converted to DateTime: " . var_export($this->mtime, true), $x);
|
||||
}
|
||||
|
||||
if ($format === null) {
|
||||
// Because propel.useDateTimeClass is TRUE, we return a DateTime object.
|
||||
return $dt;
|
||||
} elseif (strpos($format, '%') !== false) {
|
||||
return strftime($format, $dt->format('U'));
|
||||
} else {
|
||||
return $dt->format($format);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes the value of the aggregate column length
|
||||
* Overridden to provide a default of 00:00:00 if the playlist is empty.
|
||||
*
|
||||
* @param PropelPDO $con A connection object
|
||||
*
|
||||
* @return mixed The scalar result from the aggregate query
|
||||
*/
|
||||
public function computeDbLength(PropelPDO $con)
|
||||
{
|
||||
$stmt = $con->prepare('SELECT SUM(cliplength) FROM "cc_playlistcontents" WHERE cc_playlistcontents.PLAYLIST_ID = :p1');
|
||||
$stmt->bindValue(':p1', $this->getDbId());
|
||||
$stmt->execute();
|
||||
$length = $stmt->fetchColumn();
|
||||
|
||||
if (is_null($length)) {
|
||||
$length = "00:00:00";
|
||||
}
|
||||
|
||||
return $length;
|
||||
}
|
||||
} // CcBlock
|
||||
|
|
|
@ -542,6 +542,7 @@ var AIRTIME = (function(AIRTIME) {
|
|||
.append('<option value="0">All</option>')
|
||||
.append('<option value="1">Files</option>')
|
||||
.append('<option value="2">Playlists</option>')
|
||||
.append('<option value="3">Smart Blocks</option>')
|
||||
.end()
|
||||
.change(function(ev){
|
||||
oTable.fnDraw();
|
||||
|
@ -613,7 +614,11 @@ var AIRTIME = (function(AIRTIME) {
|
|||
}
|
||||
else {
|
||||
callback = function() {
|
||||
AIRTIME.playlist.fnEdit(data.id);
|
||||
if (data.ftype === "playlist") {
|
||||
AIRTIME.playlist.fnEdit(data.id, 'playlist');
|
||||
} else {
|
||||
AIRTIME.playlist.fnEdit(data.id, 'block');
|
||||
}
|
||||
};
|
||||
}
|
||||
oItems.edit.callback = callback;
|
||||
|
|
|
@ -641,13 +641,13 @@ var AIRTIME = (function(AIRTIME){
|
|||
});
|
||||
};
|
||||
|
||||
mod.fnEdit = function(id) {
|
||||
var url = '/Playlist/edit';;
|
||||
mod.fnEdit = function(id, type) {
|
||||
var url = '/Playlist/edit';
|
||||
|
||||
stopAudioPreview();
|
||||
|
||||
$.post(url,
|
||||
{format: "json", id: id},
|
||||
{format: "json", id: id, type: type},
|
||||
function(json){
|
||||
openPlaylist(json);
|
||||
});
|
||||
|
|
|
@ -5,18 +5,6 @@ $(document).ready(function() {
|
|||
function setSmartPlaylistEvents() {
|
||||
var form = $('#smart-playlist-form');
|
||||
|
||||
/*
|
||||
sets.each(function(index, set){
|
||||
$(set).live('click', function(){
|
||||
if ($(this).next().hasClass('closed')) {
|
||||
$(this).next().removeClass('closed sp-closed');
|
||||
} else {
|
||||
$(this).next().addClass('closed sp-closed');
|
||||
}
|
||||
});
|
||||
});
|
||||
*/
|
||||
|
||||
form.find('.criteria_add').live('click', function(){
|
||||
|
||||
var div = $('dd[id="sp_criteria-element"]').children('div:visible:last').next();
|
||||
|
|
Loading…
Reference in New Issue