From f138dc6b47c36ffb1e5f374b9b78dbc43d329feb Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Fri, 31 Jul 2015 18:28:16 -0400 Subject: [PATCH] SAAS-948 - tab layout for right-hand pane --- airtime_mvc/application/Bootstrap.php | 1 + airtime_mvc/application/configs/ACL.php | 4 + .../controllers/NewPlaylistController.php | 643 ++++++++++++++++++ .../controllers/NewWebstreamController.php | 150 ++++ .../application/layouts/scripts/layout.phtml | 10 +- airtime_mvc/application/models/Library.php | 2 +- .../views/scripts/playlist/_playlist.phtml | 76 +++ .../views/scripts/playlist/_smart-block.phtml | 81 +++ .../views/scripts/playlist/playlist.phtml | 20 +- .../views/scripts/playlist/smart-block.phtml | 20 +- .../views/scripts/show-builder/index.phtml | 43 +- .../views/scripts/webstream/_webstream.phtml | 55 ++ .../views/scripts/webstream/webstream.phtml | 20 +- airtime_mvc/public/css/_showbuilder.css | 259 ++++--- airtime_mvc/public/css/styles.css | 16 +- .../public/js/airtime/library/_library.js | 4 +- airtime_mvc/public/js/airtime/library/_spl.js | 217 +++--- .../library/events/_library_showbuilder.js | 10 +- .../public/js/airtime/library/library.js | 2 +- .../public/js/airtime/showbuilder/_builder.js | 24 +- .../js/airtime/showbuilder/_main_builder.js | 4 + 21 files changed, 1402 insertions(+), 259 deletions(-) create mode 100644 airtime_mvc/application/controllers/NewPlaylistController.php create mode 100644 airtime_mvc/application/controllers/NewWebstreamController.php create mode 100644 airtime_mvc/application/views/scripts/playlist/_playlist.phtml create mode 100644 airtime_mvc/application/views/scripts/playlist/_smart-block.phtml create mode 100644 airtime_mvc/application/views/scripts/webstream/_webstream.phtml diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index 7edb8b0ea..b6c3440ed 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -31,6 +31,7 @@ require_once "Auth.php"; require_once "interface/OAuth2.php"; require_once "TaskManager.php"; require_once "UsabilityHints.php"; +require_once __DIR__.'/models/formatters/LengthFormatter.php'; require_once __DIR__.'/services/CeleryService.php'; require_once __DIR__.'/services/SoundcloudService.php'; require_once __DIR__.'/forms/helpers/ValidationTypes.php'; diff --git a/airtime_mvc/application/configs/ACL.php b/airtime_mvc/application/configs/ACL.php index 39bba31ae..bbd10bd7d 100644 --- a/airtime_mvc/application/configs/ACL.php +++ b/airtime_mvc/application/configs/ACL.php @@ -16,6 +16,7 @@ $ccAcl->add(new Zend_Acl_Resource('library')) ->add(new Zend_Acl_Resource('error')) ->add(new Zend_Acl_Resource('login')) ->add(new Zend_Acl_Resource('whmcs-login')) + ->add(new Zend_Acl_Resource('new-playlist')) ->add(new Zend_Acl_Resource('playlist')) ->add(new Zend_Acl_Resource('plupload')) ->add(new Zend_Acl_Resource('schedule')) @@ -30,6 +31,7 @@ $ccAcl->add(new Zend_Acl_Resource('library')) ->add(new Zend_Acl_Resource('listenerstat')) ->add(new Zend_Acl_Resource('usersettings')) ->add(new Zend_Acl_Resource('audiopreview')) + ->add(new Zend_Acl_Resource('new-webstream')) ->add(new Zend_Acl_Resource('webstream')) ->add(new Zend_Acl_Resource('locale')) ->add(new Zend_Acl_Resource('upgrade')) @@ -55,6 +57,7 @@ $ccAcl->allow('G', 'index') ->allow('G', 'schedule') ->allow('G', 'dashboard') ->allow('G', 'audiopreview') + ->allow('G', 'new-webstream') ->allow('G', 'webstream') ->allow('G', 'locale') ->allow('G', 'upgrade') @@ -69,6 +72,7 @@ $ccAcl->allow('G', 'index') ->allow('H', 'usersettings') ->allow('H', 'plupload') ->allow('H', 'library') + ->allow('H', 'new-playlist') ->allow('H', 'playlist') ->allow('H', 'playouthistory') ->allow('A', 'playouthistorytemplate') diff --git a/airtime_mvc/application/controllers/NewPlaylistController.php b/airtime_mvc/application/controllers/NewPlaylistController.php new file mode 100644 index 000000000..f26a5d9c0 --- /dev/null +++ b/airtime_mvc/application/controllers/NewPlaylistController.php @@ -0,0 +1,643 @@ +_helper->getHelper('AjaxContext'); + $ajaxContext->addActionContext('add-items', 'json') + ->addActionContext('move-items', 'json') + ->addActionContext('delete-items', 'json') + ->addActionContext('set-fade', 'json') + ->addActionContext('set-crossfade', 'json') + ->addActionContext('set-cue', 'json') + ->addActionContext('new', 'json') + ->addActionContext('edit', 'json') + ->addActionContext('delete', 'json') + ->addActionContext('close-playlist', 'json') + ->addActionContext('play', 'json') + ->addActionContext('set-playlist-fades', 'json') + ->addActionContext('get-playlist-fades', 'json') + ->addActionContext('set-playlist-name', 'json') + ->addActionContext('set-playlist-description', 'json') + ->addActionContext('playlist-preview', 'json') + ->addActionContext('get-playlist', 'json') + ->addActionContext('save', 'json') + ->addActionContext('smart-block-generate', 'json') + ->addActionContext('smart-block-shuffle', 'json') + ->addActionContext('get-block-info', 'json') + ->addActionContext('shuffle', 'json') + ->addActionContext('empty-content', 'json') + ->initContext(); + + //This controller writes to the session all over the place, so we're going to reopen it for writing here. + session_start(); //Reopen the session for writing + } + + private function getPlaylist($p_type) + { + $obj = null; + $objInfo = Application_Model_Library::getObjInfo($p_type); + + $obj_sess = new Zend_Session_Namespace(UI_PLAYLISTCONTROLLER_OBJ_SESSNAME); + + if (isset($obj_sess->id)) { + $obj = new $objInfo['className']($obj_sess->id); + + $modified = $this->_getParam('modified', null); + if ($obj->getLastModified("U") !== $modified) { + $this->createFullResponse($obj); + throw new PlaylistOutDatedException(sprintf(_("You are viewing an older version of %s"), $obj->getName())); + } + } + + return $obj; + } + + private function createUpdateResponse($obj) + { + $formatter = new LengthFormatter($obj->getLength()); + $this->view->length = $formatter->format(); + + $this->view->obj = $obj; + $this->view->contents = $obj->getContents(); + $this->view->html = $this->view->render('playlist/update.phtml'); + $this->view->name = $obj->getName(); + $this->view->description = $obj->getDescription(); + $this->view->modified = $obj->getLastModified("U"); + + unset($this->view->obj); + } + + private function createFullResponse($obj = null, $isJson = false, + $formIsValid = false) + { + $isBlock = false; + $viewPath = 'playlist/_playlist.phtml'; + if ($obj instanceof Application_Model_Block) { + $isBlock = true; + $viewPath = 'playlist/_smart-block.phtml'; + } + if (isset($obj)) { + $formatter = new LengthFormatter($obj->getLength()); + $this->view->length = $formatter->format(); + + if ($isBlock) { + $form = new Application_Form_SmartBlockCriteria(); + $form->removeDecorator('DtDdWrapper'); + $form->startForm($obj->getId(), $formIsValid); + + $this->view->form = $form; + $this->view->obj = $obj; + $this->view->id = $obj->getId(); + + if ($isJson) { + return $this->view->render($viewPath); + } else { + $this->view->html = $this->view->render($viewPath); + } + } else { + $this->view->obj = $obj; + $this->view->id = $obj->getId(); + if ($isJson) { + return $this->view->html = $this->view->render($viewPath); + } else { + $this->view->html = $this->view->render($viewPath); + } + unset($this->view->obj); + } + } else { + if ($isJson) { + return $this->view->render($viewPath); + } else { + $this->view->html = $this->view->render($viewPath); + } + } + } + + private function playlistOutdated($e) + { + $this->view->error = $e->getMessage(); + } + + private function blockDynamic($obj) + { + $this->view->error = _("You cannot add tracks to dynamic blocks."); + $this->createFullResponse($obj); + } + + private function playlistNotFound($p_type, $p_isJson = false) + { + $p_type = ucfirst($p_type); + $this->view->error = sprintf(_("%s not found"), $p_type); + + Logging::info("{$p_type} not found"); + Application_Model_Library::changePlaylist(null, $p_type); + + if (!$p_isJson) { + $this->createFullResponse(null); + } else { + $this->_helper->json->sendJson(array("error"=>$this->view->error, "result"=>1, "html"=>$this->createFullResponse(null, $p_isJson))); + } + } + + private function playlistNoPermission($p_type) + { + $this->view->error = sprintf(_("You don't have permission to delete selected %s(s)."), $p_type); + $this->changePlaylist(null, $p_type); + $this->createFullResponse(null); + } + + private function playlistUnknownError($e) + { + $this->view->error = _("Something went wrong."); + Logging::info($e->getMessage()); + } + + private function wrongTypeToBlock($obj) + { + $this->view->error = _("You can only add tracks to smart block."); + $this->createFullResponse($obj); + } + + private function wrongTypeToPlaylist($obj) + { + $this->view->error = _("You can only add tracks, smart blocks, and webstreams to playlists."); + $this->createFullResponse($obj); + } + + public function newAction() + { + //$pl_sess = $this->pl_sess; + $userInfo = Zend_Auth::getInstance()->getStorage()->read(); + $type = $this->_getParam('type'); + + $objInfo = Application_Model_Library::getObjInfo($type); + + $name = _('Untitled Playlist'); + if ($type == 'block') { + $name = _('Untitled Smart Block'); + } + + $obj = new $objInfo['className'](); + $obj->setName($name); + $obj->setMetadata('dc:creator', $userInfo->id); + + Application_Model_Library::changePlaylist($obj->getId(), $type); + $this->createFullResponse($obj); + } + + public function editAction() + { + $id = $this->_getParam('id', null); + $type = $this->_getParam('type'); + $objInfo = Application_Model_Library::getObjInfo($type); + Logging::info("editing {$type} {$id}"); + + if (!is_null($id)) { + Application_Model_Library::changePlaylist($id, $type); + } + + try { + $obj = new $objInfo['className']($id); + $this->createFullResponse($obj); + } catch (PlaylistNotFoundException $e) { + $this->playlistNotFound(); + } catch (Exception $e) { + $this->playlistUnknownError($e); + } + } + + public function deleteAction() + { + $ids = $this->_getParam('ids'); + $ids = (!is_array($ids)) ? array($ids) : $ids; + $type = $this->_getParam('type'); + + $obj = null; + + $objInfo = Application_Model_Library::getObjInfo($type); + + $userInfo = Zend_Auth::getInstance()->getStorage()->read(); + + $obj_sess = new Zend_Session_Namespace( + UI_PLAYLISTCONTROLLER_OBJ_SESSNAME); + + try { + Logging::info("Currently active {$type} {$obj_sess->id}"); + if (in_array($obj_sess->id, $ids)) { + Logging::info("Deleting currently active {$type}"); + Application_Model_Library::changePlaylist(null, $type); + } else { + Logging::info("Not deleting currently active {$type}"); + $obj = new $objInfo['className']($obj_sess->id); + } + + if (strcmp($objInfo['className'], 'Application_Model_Playlist')==0) { + Application_Model_Playlist::deletePlaylists($ids, $userInfo->id); + } else { + Application_Model_Block::deleteBlocks($ids, $userInfo->id); + } + $this->createFullResponse($obj); + } catch (PlaylistNoPermissionException $e) { + $this->playlistNoPermission($type); + } catch (BlockNoPermissionException $e) { + $this->playlistNoPermission($type); + } catch (PlaylistNotFoundException $e) { + $this->playlistNotFound($type); + } catch (Exception $e) { + $this->playlistUnknownError($e); + } + } + + public function closePlaylistAction() { + $type = $this->_getParam('type'); + $obj = null; + Application_Model_Library::changePlaylist($obj, $type); + $this->createFullResponse($obj); + } + + public function addItemsAction() + { + $ids = $this->_getParam('aItems', array()); + $ids = (!is_array($ids)) ? array($ids) : $ids; + $afterItem = $this->_getParam('afterItem', null); + $addType = $this->_getParam('type', 'after'); + // this is the obj type of destination + $obj_type = $this->_getParam('obj_type'); + + try { + $obj = $this->getPlaylist($obj_type); + if ($obj_type == 'playlist') { + foreach ($ids as $id) { + if (is_array($id) && isset($id[1])) { + if ($id[1] == 'playlist') { + throw new WrongTypeToPlaylistException; + } + } + } + $obj->addAudioClips($ids, $afterItem, $addType); + } elseif ($obj->isStatic()) { + // if the dest is a block object + //check if any items are playlists + foreach ($ids as $id) { + if (is_array($id) && isset($id[1])) { + if ($id[1] != 'audioclip') { + throw new WrongTypeToBlockException; + } + } + } + $obj->addAudioClips($ids, $afterItem, $addType); + } else { + throw new BlockDynamicException; + } + $this->createUpdateResponse($obj); + } catch (PlaylistOutDatedException $e) { + $this->playlistOutdated($e); + } catch (PlaylistNotFoundException $e) { + $this->playlistNotFound($obj_type); + } catch (WrongTypeToBlockException $e) { + $this->wrongTypeToBlock($obj); + } catch (WrongTypeToPlaylistException $e) { + $this->wrongTypeToPlaylist($obj); + } catch (BlockDynamicException $e) { + $this->blockDynamic($obj); + } catch (BlockNotFoundException $e) { + $this->playlistNotFound($obj_type); + } catch (Exception $e) { + $this->playlistUnknownError($e); + } + } + + public function moveItemsAction() + { + $ids = $this->_getParam('ids'); + $ids = (!is_array($ids)) ? array($ids) : $ids; + $afterItem = $this->_getParam('afterItem', null); + $type = $this->_getParam('obj_type'); + + try { + $obj = $this->getPlaylist($type); + $obj->moveAudioClips($ids, $afterItem); + $this->createUpdateResponse($obj); + } catch (PlaylistOutDatedException $e) { + $this->playlistOutdated($e); + } catch (PlaylistNotFoundException $e) { + $this->playlistNotFound($type); + } catch (Exception $e) { + $this->playlistUnknownError($e); + } + } + + public function deleteItemsAction() + { + $ids = $this->_getParam('ids'); + $ids = (!is_array($ids)) ? array($ids) : $ids; + $modified = $this->_getParam('modified'); + $type = $this->_getParam('obj_type'); + + try { + $obj = $this->getPlaylist($type); + $obj->delAudioClips($ids); + $this->createUpdateResponse($obj); + } catch (PlaylistOutDatedException $e) { + $this->playlistOutdated($e); + } catch (PlaylistNotFoundException $e) { + $this->playlistNotFound($type); + } catch (Exception $e) { + $this->playlistUnknownError($e); + } + } + + public function emptyContentAction() + { + $type = $this->_getParam('obj_type'); + try { + $obj = $this->getPlaylist($type); + if ($type == 'playlist') { + $obj->deleteAllFilesFromPlaylist(); + } else { + $obj->deleteAllFilesFromBlock(); + } + $this->createUpdateResponse($obj); + } catch (PlaylistOutDatedException $e) { + $this->playlistOutdated($e); + } catch (PlaylistNotFoundException $e) { + $this->playlistNotFound($type); + } catch (Exception $e) { + $this->playlistUnknownError($e); + } + } + + public function setCueAction() + { + $id = $this->_getParam('id'); + $cueIn = $this->_getParam('cueIn', null); + $cueOut = $this->_getParam('cueOut', null); + $type = $this->_getParam('type'); + + try { + $obj = $this->getPlaylist($type); + $response = $obj->changeClipLength($id, $cueIn, $cueOut); + + if (!isset($response["error"])) { + $this->view->response = $response; + $this->createUpdateResponse($obj); + } else { + $this->view->cue_error = $response["error"]; + $this->view->code = $response["type"]; + } + } catch (PlaylistOutDatedException $e) { + $this->playlistOutdated($e); + } catch (PlaylistNotFoundException $e) { + $this->playlistNotFound($type); + } catch (Exception $e) { + $this->playlistUnknownError($e); + } + } + + public function setFadeAction() + { + $id = $this->_getParam('id'); + $fadeIn = $this->_getParam('fadeIn', null); + $fadeOut = $this->_getParam('fadeOut', null); + $type = $this->_getParam('type'); + + try { + $obj = $this->getPlaylist($type); + $response = $obj->changeFadeInfo($id, $fadeIn, $fadeOut); + + if (!isset($response["error"])) { + $this->createUpdateResponse($obj); + $this->view->response = $response; + } else { + $this->view->fade_error = $response["error"]; + } + } catch (PlaylistOutDatedException $e) { + $this->playlistOutdated($e); + } catch (PlaylistNotFoundException $e) { + $this->playlistNotFound($type); + } catch (Exception $e) { + $this->playlistUnknownError($e); + } + } + + public function setCrossfadeAction() + { + $id1 = $this->_getParam('id1', null); + $id2 = $this->_getParam('id2', null); + $type = $this->_getParam('type'); + $fadeIn = $this->_getParam('fadeIn', 0); + $fadeOut = $this->_getParam('fadeOut', 0); + $offset = $this->_getParam('offset', 0); + + try { + $obj = $this->getPlaylist($type); + $response = $obj->createCrossfade($id1, $fadeOut, $id2, $fadeIn, $offset); + + if (!isset($response["error"])) { + $this->createUpdateResponse($obj); + } else { + $this->view->error = $response["error"]; + } + } catch (PlaylistOutDatedException $e) { + $this->playlistOutdated($e); + } catch (PlaylistNotFoundException $e) { + $this->playlistNotFound($type); + } catch (Exception $e) { + $this->playlistUnknownError($e); + } + } + + public function getPlaylistFadesAction() + { + $type = $this->_getParam('type'); + try { + $obj = $this->getPlaylist($type); + $fades = $obj->getFadeInfo(0); + $this->view->fadeIn = $fades[0]; + + $fades = $obj->getFadeInfo($obj->getSize()-1); + $this->view->fadeOut = $fades[1]; + } catch (PlaylistOutDatedException $e) { + $this->playlistOutdated($e); + } catch (PlaylistNotFoundException $e) { + $this->playlistNotFound($type); + } catch (Exception $e) { + $this->playlistUnknownError($e); + } + } + + /** + * The playlist fades are stored in the elements themselves. + * The fade in is set to the first elements fade in and + * the fade out is set to the last elements fade out. + **/ + public function setPlaylistFadesAction() + { + $fadeIn = $this->_getParam('fadeIn', null); + $fadeOut = $this->_getParam('fadeOut', null); + $type = $this->_getParam('type'); + + try { + $obj = $this->getPlaylist($type); + $obj->setfades($fadeIn, $fadeOut); + $this->view->modified = $obj->getLastModified("U"); + } catch (PlaylistOutDatedException $e) { + $this->playlistOutdated($e); + } catch (PlaylistNotFoundException $e) { + $this->playlistNotFound($type); + } catch (Exception $e) { + $this->playlistUnknownError($e); + } + } + + public function setPlaylistNameDescAction() + { + $name = $this->_getParam('name', _('Unknown Playlist')); + $description = $this->_getParam('description', ""); + $type = $this->_getParam('type'); + + try { + $obj = $this->getPlaylist($type); + $obj->setName(trim($name)); + $obj->setDescription($description); + $this->view->description = $description; + $this->view->playlistName = $name; + $this->view->modified = $obj->getLastModified("U"); + } catch (PlaylistOutDatedException $e) { + $this->playlistOutdated($e); + } catch (PlaylistNotFoundException $e) { + $this->playlistNotFound($type, true); + } catch (Exception $e) { + $this->playlistUnknownError($e); + } + } + + public function saveAction() + { + $request = $this->getRequest(); + $params = $request->getPost(); + $result = array(); + + if ($params['type'] == 'block') { + try { + $bl = new Application_Model_Block($params['obj_id']); + } catch (BlockNotFoundException $e) { + $this->playlistNotFound('block', true); + } + $form = new Application_Form_SmartBlockCriteria(); + $form->startForm($params['obj_id']); + if ($form->isValid($params)) { + $this->setPlaylistNameDescAction(); + $bl->saveSmartBlockCriteria($params['data']); + $result['html'] = $this->createFullResponse($bl, true, true); + $result['result'] = 0; + } else { + $this->view->obj = $bl; + $this->view->id = $bl->getId(); + $this->view->form = $form; + $this->view->unsavedName = $params['name']; + $this->view->unsavedDesc = $params['description']; + $viewPath = 'playlist/_smart-block.phtml'; + $result['html'] = $this->view->render($viewPath); + $result['result'] = 1; + } + } else if ($params['type'] == 'playlist') { + $this->setPlaylistNameDescAction(); + } + + $result["modified"] = $this->view->modified; + $this->_helper->json->sendJson($result); + } + + public function smartBlockGenerateAction() + { + $request = $this->getRequest(); + $params = $request->getPost(); + + //make sure block exists + try { + $bl = new Application_Model_Block($params['obj_id']); + + $form = new Application_Form_SmartBlockCriteria(); + $form->startForm($params['obj_id']); + if ($form->isValid($params)) { + $result = $bl->generateSmartBlock($params['data']); + $this->_helper->json->sendJson(array("result"=>0, "html"=>$this->createFullResponse($bl, true, true))); + } else { + $this->view->obj = $bl; + $this->view->id = $bl->getId(); + $this->view->form = $form; + $viewPath = 'playlist/_smart-block.phtml'; + $result['html'] = $this->view->render($viewPath); + $result['result'] = 1; + $this->_helper->json->sendJson($result); + } + } catch (BlockNotFoundException $e) { + $this->playlistNotFound('block', true); + } catch (Exception $e) { + Logging::info($e); + $this->playlistUnknownError($e); + } + } + + public function smartBlockShuffleAction() + { + $request = $this->getRequest(); + $params = $request->getPost(); + try { + $bl = new Application_Model_Block($params['obj_id']); + $result = $bl->shuffleSmartBlock(); + + if ($result['result'] == 0) { + $this->_helper->json->sendJson(array("result"=>0, "html"=>$this->createFullResponse($bl, true))); + } else { + $this->_helper->json->sendJson($result); + } + } catch (BlockNotFoundException $e) { + $this->playlistNotFound('block', true); + } catch (Exception $e) { + $this->playlistUnknownError($e); + } + } + + public function shuffleAction() + { + $request = $this->getRequest(); + $params = $request->getPost(); + try { + $pl = new Application_Model_Playlist($params['obj_id']); + $result = $pl->shuffle(); + + if ($result['result'] == 0) { + $this->_helper->json->sendJson(array("result"=>0, "html"=>$this->createFullResponse($pl, true))); + } else { + $this->_helper->json->sendJson($result); + } + } catch (PlaylistNotFoundException $e) { + $this->playlistNotFound('block', true); + } catch (Exception $e) { + $this->playlistUnknownError($e); + } + } + + public function getBlockInfoAction() + { + $request = $this->getRequest(); + $params = $request->getPost(); + $bl = new Application_Model_Block($params['id']); + if ($bl->isStatic()) { + $out = $bl->getContents(); + $out['isStatic'] = true; + } else { + $out = $bl->getCriteria(); + $out['isStatic'] = false; + } + $this->_helper->json->sendJson($out); + } +} +class WrongTypeToBlockException extends Exception {} +class WrongTypeToPlaylistException extends Exception {} +class BlockDynamicException extends Exception {} diff --git a/airtime_mvc/application/controllers/NewWebstreamController.php b/airtime_mvc/application/controllers/NewWebstreamController.php new file mode 100644 index 000000000..22db7bf7f --- /dev/null +++ b/airtime_mvc/application/controllers/NewWebstreamController.php @@ -0,0 +1,150 @@ +_helper->getHelper('AjaxContext'); + $ajaxContext->addActionContext('new', 'json') + ->addActionContext('save', 'json') + ->addActionContext('edit', 'json') + ->addActionContext('delete', 'json') + ->initContext(); + } + + public function newAction() + { + $userInfo = Zend_Auth::getInstance()->getStorage()->read(); + if (!$this->isAuthorized(-1)) { + // TODO: this header call does not actually print any error message + header("Status: 401 Not Authorized"); + return; + } + + $webstream = new CcWebstream(); + + //we're not saving this primary key in the DB so it's OK to be -1 + $webstream->setDbId(-1); + $webstream->setDbName(_("Untitled Webstream")); + $webstream->setDbDescription(""); + $webstream->setDbUrl("http://"); + $webstream->setDbLength("00:30:00"); + $webstream->setDbName(_("Untitled Webstream")); + $webstream->setDbCreatorId($userInfo->id); + $webstream->setDbUtime(new DateTime("now", new DateTimeZone('UTC'))); + $webstream->setDbMtime(new DateTime("now", new DateTimeZone('UTC'))); + + //clear the session in case an old playlist was open: CC-4196 + Application_Model_Library::changePlaylist(null, null); + + $this->view->obj = new Application_Model_Webstream($webstream); + $this->view->action = "new"; + $this->view->html = $this->view->render('webstream/_webstream.phtml'); + } + + public function editAction() + { + $request = $this->getRequest(); + + $id = $request->getParam("id"); + if (is_null($id)) { + throw new Exception("Missing parameter 'id'"); + } + + $webstream = CcWebstreamQuery::create()->findPK($id); + if ($webstream) { + Application_Model_Library::changePlaylist($id, "stream"); + } + $this->view->obj = new Application_Model_Webstream($webstream); + $this->view->action = "edit"; + $this->view->html = $this->view->render('webstream/_webstream.phtml'); + } + + public function deleteAction() + { + $request = $this->getRequest(); + $id = $request->getParam("ids"); + + if (!$this->isAuthorized($id)) { + header("Status: 401 Not Authorized"); + + return; + } + + $type = "stream"; + Application_Model_Library::changePlaylist(null, $type); + + $webstream = CcWebstreamQuery::create()->findPK($id)->delete(); + + $this->view->obj = null; + $this->view->action = "delete"; + $this->view->html = $this->view->render('webstream/_webstream.phtml'); + + } + + /*TODO : make a user object be passed a parameter into this function so + that it does not have to be fetched multiple times.*/ + public function isAuthorized($webstream_id) + { + $user = Application_Model_User::getCurrentUser(); + if ($user->isUserType(array(UTYPE_SUPERADMIN, UTYPE_ADMIN, UTYPE_PROGRAM_MANAGER))) { + return true; + } + + if ($user->isHost()) { + // not creating a webstream + if ($webstream_id != -1) { + $webstream = CcWebstreamQuery::create()->findPK($webstream_id); + /*we are updating a playlist. Ensure that if the user is a + host/dj, that he has the correct permission.*/ + $user = Application_Model_User::getCurrentUser(); + //only allow when webstream belongs to the DJ + return $webstream->getDbCreatorId() == $user->getId(); + } + /*we are creating a new stream. Don't need to check whether the + DJ/Host owns the stream*/ + return true; + } else { + Logging::info( $user ); + } + return false; + } + + public function saveAction() + { + $request = $this->getRequest(); + + $id = $request->getParam("id"); + + $parameters = array(); + foreach (array('id','length','name','description','url') as $p) { + $parameters[$p] = trim($request->getParam($p)); + } + + if (!$this->isAuthorized($id)) { + header("Status: 401 Not Authorized"); + return; + } + + + list($analysis, $mime, $mediaUrl, $di) = Application_Model_Webstream::analyzeFormData($parameters); + try { + if (Application_Model_Webstream::isValid($analysis)) { + $streamId = Application_Model_Webstream::save($parameters, $mime, $mediaUrl, $di); + + Application_Model_Library::changePlaylist($streamId, "stream"); + + $this->view->statusMessage = "
"._("Webstream saved.")."
"; + $this->view->streamId = $streamId; + $this->view->length = $di->format("%Hh %Im"); + } else { + throw new Exception("isValid returned false"); + } + } catch (Exception $e) { + Logging::debug($e->getMessage()); + $this->view->statusMessage = "
"._("Invalid form values.")."
"; + $this->view->streamId = -1; + $this->view->analysis = $analysis; + } + } +} diff --git a/airtime_mvc/application/layouts/scripts/layout.phtml b/airtime_mvc/application/layouts/scripts/layout.phtml index 3bb782dee..8192b474e 100644 --- a/airtime_mvc/application/layouts/scripts/layout.phtml +++ b/airtime_mvc/application/layouts/scripts/layout.phtml @@ -69,14 +69,12 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= + +
>
- - -
>
- - layout()->content ?>
+ layout()->content ?> +