CC-84: Smart Playlists

- added 'Smart Block' filter in datatable
- added block files to library datatable
This commit is contained in:
denise 2012-07-25 17:08:22 -04:00
parent 1f3cbd8aba
commit bef9ba1eea
9 changed files with 147 additions and 50 deletions

View File

@ -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.

View File

@ -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) {

View File

@ -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();
}

View File

@ -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);
}

View File

@ -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']."'>";

View File

@ -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

View File

@ -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;

View File

@ -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);
});

View File

@ -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();