From e4027c1e1fd00f3e2e0acee15a26a74d12f3a730 Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Wed, 18 Nov 2015 16:20:29 -0500 Subject: [PATCH 1/9] Sweep pending podcast episodes after an hour; css tweaks to My Podcast page --- .../application/services/MediaService.php | 10 ++++-- .../services/PodcastEpisodeService.php | 35 ++++++++++++++++++- .../services/ThirdPartyCeleryService.php | 12 +++++-- .../services/ThirdPartyService.php | 10 +++--- .../views/scripts/podcast/podcast.phtml | 2 -- .../views/scripts/podcast/station.phtml | 2 +- airtime_mvc/public/css/dashboard.css | 6 +++- airtime_mvc/public/css/station_podcast.css | 2 +- 8 files changed, 63 insertions(+), 16 deletions(-) diff --git a/airtime_mvc/application/services/MediaService.php b/airtime_mvc/application/services/MediaService.php index e1712c92d..d5d43c9c7 100644 --- a/airtime_mvc/application/services/MediaService.php +++ b/airtime_mvc/application/services/MediaService.php @@ -133,17 +133,23 @@ class Application_Service_MediaService ->filterByDbImportStatus(CcFiles::IMPORT_STATUS_PENDING) ->filterByDbUtime($oneHourAgo, Criteria::LESS_EQUAL) ->find(); - return !empty(self::$_pendingFiles); + $pendingEpisodes = Application_Service_PodcastEpisodeService::getStuckPendingImports(); + return !empty(self::$_pendingFiles) && !empty($pendingEpisodes); } /** * Clean up stuck imports by changing their import status to Failed */ public static function clearStuckPendingImports() { - foreach(self::$_pendingFiles as $file) { + $pendingEpisodes = Application_Service_PodcastEpisodeService::getStuckPendingImports(); + foreach (self::$_pendingFiles as $file) { /** @var $file CcFiles */ $file->setDbImportStatus(CcFiles::IMPORT_STATUS_FAILED)->save(); } + foreach ($pendingEpisodes as $episode) { + /** @var $episode PodcastEpisodes */ + $episode->delete(); + } } } diff --git a/airtime_mvc/application/services/PodcastEpisodeService.php b/airtime_mvc/application/services/PodcastEpisodeService.php index 56298e467..313518744 100644 --- a/airtime_mvc/application/services/PodcastEpisodeService.php +++ b/airtime_mvc/application/services/PodcastEpisodeService.php @@ -12,6 +12,8 @@ class Application_Service_PodcastEpisodeService extends Application_Service_Thir const DOWNLOAD = 'download'; + const PENDING_EPISODE_TIMEOUT_SECONDS = 3600; + /** * @var string service name to store in ThirdPartyTrackReferences database */ @@ -143,7 +145,11 @@ class Application_Service_PodcastEpisodeService extends Application_Service_Thir 'callback_url' => Application_Common_HTTPHelper::getStationUrl() . '/rest/media', 'api_key' => $apiKey = $CC_CONFIG["apiKey"][0], ); - $this->_executeTask(static::$_CELERY_TASKS[self::DOWNLOAD], $data); + $task = $this->_executeTask(static::$_CELERY_TASKS[self::DOWNLOAD], $data); + // Get the created ThirdPartyTaskReference and set the episode ID so + // we can remove the placeholder if the import ends up stuck in a pending state + $ref = ThirdPartyTrackReferencesQuery::create()->findPk($task->getDbTrackReference()); + $ref->setDbForeignId($id)->save(); } /** @@ -161,6 +167,7 @@ class Application_Service_PodcastEpisodeService extends Application_Service_Thir */ public function updateTrackReference($task, $episodeId, $episode, $status) { $ref = parent::updateTrackReference($task, $episodeId, $episode, $status); + $ref->setDbForeignId($episode->episodeid)->save(); $dbEpisode = PodcastEpisodesQuery::create()->findOneByDbId($episode->episodeid); try { @@ -231,6 +238,32 @@ class Application_Service_PodcastEpisodeService extends Application_Service_Thir return (int) $stationPodcast->hasEpisodeForFile($fileId); } + /** + * Find any episode placeholders that have been stuck pending (empty file ID) for over an hour + * + * @return array the episode imports stuck in pending + */ + public static function getStuckPendingImports() { + $oneHourAgo = gmdate(DEFAULT_TIMESTAMP_FORMAT, (microtime(true) - self::PENDING_EPISODE_TIMEOUT_SECONDS)); + $episodes = PodcastEpisodesQuery::create() + ->filterByDbFileId() + ->find(); + $stuckImports = array(); + foreach ($episodes as $episode) { + $ref = ThirdPartyTrackReferencesQuery::create() + ->findOneByDbForeignId(strval($episode->getDbId())); + if (!empty($ref)) { + $task = CeleryTasksQuery::create() + ->filterByDbDispatchTime($oneHourAgo, Criteria::LESS_EQUAL) + ->findOneByDbTrackReference($ref->getDbId()); + if (!empty($task)) { + array_push($stuckImports, $episode); + } + } + } + return $stuckImports; + } + /** * @param $episodeId * @return array diff --git a/airtime_mvc/application/services/ThirdPartyCeleryService.php b/airtime_mvc/application/services/ThirdPartyCeleryService.php index f1f3f709a..e84645086 100644 --- a/airtime_mvc/application/services/ThirdPartyCeleryService.php +++ b/airtime_mvc/application/services/ThirdPartyCeleryService.php @@ -20,15 +20,20 @@ abstract class Application_Service_ThirdPartyCeleryService extends Application_S * @param string $taskName the name of the celery task to execute * @param array $data the data array to send as task parameters * @param int $fileId the unique identifier for the file involved in the task + * + * @return CeleryTasks the created task + * + * @throws Exception */ protected function _executeTask($taskName, $data, $fileId = null) { try { $brokerTaskId = CeleryManager::sendCeleryMessage($taskName, static::$_CELERY_EXCHANGE_NAME, $data); - $this->_createTaskReference($fileId, $brokerTaskId, $taskName); + return $this->_createTaskReference($fileId, $brokerTaskId, $taskName); } catch (Exception $e) { - Logging::info("Invalid request: " . $e->getMessage()); + Logging::error("Invalid request: " . $e->getMessage()); + throw $e; } } @@ -41,6 +46,8 @@ abstract class Application_Service_ThirdPartyCeleryService extends Application_S * receive completed task messages * @param $taskName string broker task name * + * @return CeleryTasks the created task + * * @throws Exception * @throws PropelException */ @@ -54,6 +61,7 @@ abstract class Application_Service_ThirdPartyCeleryService extends Application_S $task->setDbStatus(CELERY_PENDING_STATUS); $task->setDbTrackReference($trackReferenceId); $task->save(); + return $task; } /** diff --git a/airtime_mvc/application/services/ThirdPartyService.php b/airtime_mvc/application/services/ThirdPartyService.php index 1fca386f5..61a979ea6 100644 --- a/airtime_mvc/application/services/ThirdPartyService.php +++ b/airtime_mvc/application/services/ThirdPartyService.php @@ -30,12 +30,10 @@ abstract class Application_Service_ThirdPartyService { public function createTrackReference($fileId) { // First, check if the track already has an entry in the database // If the file ID given is null, create a new reference - $ref = is_null($fileId) ? null : ThirdPartyTrackReferencesQuery::create() - ->filterByDbService(static::$_SERVICE_NAME) - ->findOneByDbFileId($fileId); - if (is_null($ref)) { - $ref = new ThirdPartyTrackReferences(); - } + $ref = is_null($fileId) ? new ThirdPartyTrackReferences() + : ThirdPartyTrackReferencesQuery::create() + ->filterByDbService(static::$_SERVICE_NAME) + ->findOneByDbFileId($fileId); $ref->setDbService(static::$_SERVICE_NAME); $ref->setDbFileId($fileId); $ref->save(); diff --git a/airtime_mvc/application/views/scripts/podcast/podcast.phtml b/airtime_mvc/application/views/scripts/podcast/podcast.phtml index d9ff7ebe8..313419914 100644 --- a/airtime_mvc/application/views/scripts/podcast/podcast.phtml +++ b/airtime_mvc/application/views/scripts/podcast/podcast.phtml @@ -1,5 +1,3 @@ - -

diff --git a/airtime_mvc/application/views/scripts/podcast/station.phtml b/airtime_mvc/application/views/scripts/podcast/station.phtml index 42a7b46cb..7a074de40 100644 --- a/airtime_mvc/application/views/scripts/podcast/station.phtml +++ b/airtime_mvc/application/views/scripts/podcast/station.phtml @@ -1,6 +1,6 @@
-
+

diff --git a/airtime_mvc/public/css/dashboard.css b/airtime_mvc/public/css/dashboard.css index 350f94764..8045c3979 100644 --- a/airtime_mvc/public/css/dashboard.css +++ b/airtime_mvc/public/css/dashboard.css @@ -739,7 +739,11 @@ div.ColVis_collectionBackground { .fg-toolbar .btn-toolbar { margin: 0; - padding: 6px 6px 5px; + padding: 5px; +} + +.fg-toolbar .btn-toolbar .ColVis_MasterButton { + margin: 0; } /* ~~~~~~~~~~~~~~~~ */ diff --git a/airtime_mvc/public/css/station_podcast.css b/airtime_mvc/public/css/station_podcast.css index 54b828d5d..9f6c1db88 100644 --- a/airtime_mvc/public/css/station_podcast.css +++ b/airtime_mvc/public/css/station_podcast.css @@ -31,7 +31,7 @@ } .station_podcast_wrapper { - padding-right: 4px; + padding: 8px; overflow-x: hidden; } From c328515f4b664924bb0e12d36b273ae97d653291 Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Thu, 19 Nov 2015 11:08:35 -0500 Subject: [PATCH 2/9] SAAS-1135 - fix help button url for logged out users --- .../application/controllers/ErrorController.php | 9 +++++++++ .../application/controllers/plugins/Acl_plugin.php | 6 ++++-- .../application/views/scripts/error/error-400.phtml | 5 ++--- .../application/views/scripts/error/error-403.phtml | 5 ++--- .../application/views/scripts/error/error-404.phtml | 5 ++--- .../application/views/scripts/error/error-500.phtml | 5 ++--- airtime_mvc/public/css/styles.css | 12 ++++++------ 7 files changed, 27 insertions(+), 20 deletions(-) diff --git a/airtime_mvc/application/controllers/ErrorController.php b/airtime_mvc/application/controllers/ErrorController.php index 774db9926..a840da163 100644 --- a/airtime_mvc/application/controllers/ErrorController.php +++ b/airtime_mvc/application/controllers/ErrorController.php @@ -7,6 +7,15 @@ class ErrorController extends Zend_Controller_Action { //We cannot show that. $this->view->layout()->disableLayout(); $this->setupCSS(); + + // TODO: set Help button URL based on whether or not user is logged in + try { + $service_user = new Application_Service_UserService(); + $service_user->getCurrentUser(); + $this->view->helpUrl = Application_Common_OsPath::getBaseDir() . 'dashboard/help'; + } catch (Exception $e) { + $this->view->helpUrl = HELP_URL; + } } public function errorAction() { diff --git a/airtime_mvc/application/controllers/plugins/Acl_plugin.php b/airtime_mvc/application/controllers/plugins/Acl_plugin.php index 01b977079..9f9293434 100644 --- a/airtime_mvc/application/controllers/plugins/Acl_plugin.php +++ b/airtime_mvc/application/controllers/plugins/Acl_plugin.php @@ -211,8 +211,10 @@ class Zend_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract $resourceName .= $controller; /** Check if the controller/action can be accessed by the current user */ - if (!$this->getAcl()->has($resourceName) - || !$this->getAcl()->isAllowed($this->_roleName, + if (!$this->getAcl()->has($resourceName)) { + $this->setErrorPage('error404'); + $this->denyAccess(); + } else if (!$this->getAcl()->isAllowed($this->_roleName, $resourceName, $request->getActionName())) { /** Redirect to access denied page */ diff --git a/airtime_mvc/application/views/scripts/error/error-400.phtml b/airtime_mvc/application/views/scripts/error/error-400.phtml index 329b55228..036f8e71a 100644 --- a/airtime_mvc/application/views/scripts/error/error-400.phtml +++ b/airtime_mvc/application/views/scripts/error/error-400.phtml @@ -1,5 +1,4 @@ - + @@ -11,7 +10,7 @@

- +

diff --git a/airtime_mvc/application/views/scripts/error/error-403.phtml b/airtime_mvc/application/views/scripts/error/error-403.phtml index 0e8d781fd..072bb475b 100644 --- a/airtime_mvc/application/views/scripts/error/error-403.phtml +++ b/airtime_mvc/application/views/scripts/error/error-403.phtml @@ -1,5 +1,4 @@ - + @@ -11,7 +10,7 @@

- +
diff --git a/airtime_mvc/application/views/scripts/error/error-404.phtml b/airtime_mvc/application/views/scripts/error/error-404.phtml index a63d44af8..7cb90f771 100644 --- a/airtime_mvc/application/views/scripts/error/error-404.phtml +++ b/airtime_mvc/application/views/scripts/error/error-404.phtml @@ -1,5 +1,4 @@ - + @@ -11,7 +10,7 @@

- +
diff --git a/airtime_mvc/application/views/scripts/error/error-500.phtml b/airtime_mvc/application/views/scripts/error/error-500.phtml index fe5bd9f39..4c8cb2516 100644 --- a/airtime_mvc/application/views/scripts/error/error-500.phtml +++ b/airtime_mvc/application/views/scripts/error/error-500.phtml @@ -1,5 +1,4 @@ - + @@ -11,7 +10,7 @@

- +
diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index 800f00629..10a09a31e 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -2858,12 +2858,12 @@ dt.block-display.info-block { /*---//////////////////// ERROR PAGE ////////////////////---*/ .error-content { - background:url(images/maintenance.png) no-repeat 0 0; - width:360px; - height:350px; - margin:auto; - margin-top:25px; - padding:auto; + position: relative; + background: url(images/maintenance.png) no-repeat 0 0; + width: 360px; + height: 350px; + margin: auto; + top: 25px; } .error-content h2 { margin:0; From 641cfb9432974d0cc31668bde478518b77153f5d Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Thu, 19 Nov 2015 17:09:49 -0500 Subject: [PATCH 3/9] SAAS-1234 - bind station feed url to angular data model --- airtime_mvc/application/forms/PodcastPreferences.php | 10 ---------- .../views/scripts/form/preferences_podcast.phtml | 4 ---- .../application/views/scripts/podcast/station.phtml | 12 ++++++------ airtime_mvc/public/css/station_podcast.css | 4 ++++ airtime_mvc/public/js/airtime/library/podcast.js | 9 +-------- 5 files changed, 11 insertions(+), 28 deletions(-) delete mode 100644 airtime_mvc/application/views/scripts/form/preferences_podcast.phtml diff --git a/airtime_mvc/application/forms/PodcastPreferences.php b/airtime_mvc/application/forms/PodcastPreferences.php index adf86c84e..9c007439e 100644 --- a/airtime_mvc/application/forms/PodcastPreferences.php +++ b/airtime_mvc/application/forms/PodcastPreferences.php @@ -17,16 +17,6 @@ class Application_Form_PodcastPreferences extends Zend_Form_SubForm { )); $stationPodcastPrivacy->setValue($isPrivate); $this->addElement($stationPodcastPrivacy); - - $stationPodcast = PodcastQuery::create()->findOneByDbId(Application_Model_Preference::getStationPodcastId()); - $url = $stationPodcast->getDbUrl(); - $feedUrl = new Zend_Form_Element_Text("stationPodcastFeedUrl"); - $feedUrl->setAttrib('class', 'input_text') - ->setAttrib('disabled', 'disabled') - ->setRequired(false) - ->setLabel(_("Feed URL")) - ->setValue($url); - $this->addElement($feedUrl); } } \ No newline at end of file diff --git a/airtime_mvc/application/views/scripts/form/preferences_podcast.phtml b/airtime_mvc/application/views/scripts/form/preferences_podcast.phtml deleted file mode 100644 index bfea8ae3f..000000000 --- a/airtime_mvc/application/views/scripts/form/preferences_podcast.phtml +++ /dev/null @@ -1,4 +0,0 @@ -
- element->getElement('stationPodcastPrivacy')->render() ?> - element->getElement('stationPodcastFeedUrl')->render() ?> -
diff --git a/airtime_mvc/application/views/scripts/podcast/station.phtml b/airtime_mvc/application/views/scripts/podcast/station.phtml index 7a074de40..ded12e3e9 100644 --- a/airtime_mvc/application/views/scripts/podcast/station.phtml +++ b/airtime_mvc/application/views/scripts/podcast/station.phtml @@ -26,9 +26,6 @@ - - - @@ -81,8 +78,12 @@ form->getSubform('preferences_podcast')->getElement("stationPodcastPrivacy")->renderViewHelper() ?>
- form->getSubform('preferences_podcast')->getElement("stationPodcastFeedUrl") ?> - +
+ +
+
+ +

@@ -122,5 +123,4 @@ $(this).toggleClass("closed"); return false; }); - diff --git a/airtime_mvc/public/css/station_podcast.css b/airtime_mvc/public/css/station_podcast.css index 9f6c1db88..65c2f0e58 100644 --- a/airtime_mvc/public/css/station_podcast.css +++ b/airtime_mvc/public/css/station_podcast.css @@ -9,6 +9,10 @@ overflow: hidden; } +#station_podcast .inner_editor_title h2 { + width: 40%; +} + #station_podcast .inner_editor_title * { margin: 0; } diff --git a/airtime_mvc/public/js/airtime/library/podcast.js b/airtime_mvc/public/js/airtime/library/podcast.js index 1a01e777c..1f23c9cf8 100644 --- a/airtime_mvc/public/js/airtime/library/podcast.js +++ b/airtime_mvc/public/js/airtime/library/podcast.js @@ -107,7 +107,7 @@ var AIRTIME = (function (AIRTIME) { headers: {'Content-Type': 'application/x-www-form-urlencoded'}, data: { stationPodcastPrivacy: $("#podcast-settings").find("input:checked").val() } }).success(function (data) { - $("#preferences_podcast-stationPodcastFeedUrl").val(data.url); + jQuery.extend($scope.podcast, data); $(".success").text($.i18n._("Podcast settings saved")).slideDown("fast"); setTimeout(function () { $(".success").slideUp("fast"); @@ -138,13 +138,6 @@ var AIRTIME = (function (AIRTIME) { }); }; - /** - * Open metadata editor tabs for each of the selected episodes. - */ - StationPodcastController.prototype.openSelectedTabEditors = function () { - mod.editSelectedEpisodes(this.episodeTable.getSelectedRows()); - }; - /** * Initialize the Station podcast episode table. * From fff7ef371d2b46af9b812515226946a6b3ead75e Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Fri, 20 Nov 2015 11:27:11 -0500 Subject: [PATCH 4/9] Add fnDrawCallback to podcasts table to fix placeholder --- airtime_mvc/public/js/airtime/library/library.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index e30b45295..22e71d297 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -1420,6 +1420,9 @@ var AIRTIME = (function(AIRTIME) { sAjaxSource : ajaxSourceURL, oColReorder: { iFixedColumns: 1 // Checkbox + }, + fnDrawCallback: function () { + AIRTIME.library.drawEmptyPlaceholder(this); } }); From fb3d83cc40fc29ff79c60dd79200a4a8d01f7a2c Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Fri, 20 Nov 2015 11:49:03 -0500 Subject: [PATCH 5/9] Change 'Learn about podcasts' link --- airtime_mvc/public/js/airtime/library/library.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index 22e71d297..3bf80d800 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -132,7 +132,7 @@ var AIRTIME = (function(AIRTIME) { "media": "podcasts", "icon": "icon-headphones", "subtext": "Click 'Add' to create one now.", - "href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/" + "href": "http://www.apple.com/ca/itunes/podcasts/fanfaq.html" }; default: break; From 7f5e41c885cb892a53b48efe46f52565078a4140 Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Fri, 20 Nov 2015 13:41:23 -0500 Subject: [PATCH 6/9] Add basic 403 handling to table.js --- .../public/js/airtime/library/library.js | 25 ++++++++++--------- .../public/js/airtime/widgets/table.js | 12 +++------ 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index 3bf80d800..1b9f82a2c 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -542,6 +542,18 @@ var AIRTIME = (function(AIRTIME) { } }; + mod.handleAjaxError = function (r) { + // If the request was denied due to permissioning + if (r.status === 403) { + // Hide the processing div + var wrapper = $("#library_display_wrapper"); + wrapper.find(".dt-process-rel").hide(); + wrapper.find('.empty_placeholder_text').text($.i18n._("You don't have permission to view the library.")); + wrapper.find('.empty_placeholder').show(); + } + }; + + libraryInit = function() { $libContent = $("#library_content"); @@ -706,7 +718,7 @@ var AIRTIME = (function(AIRTIME) { "url": sSource, "data": aoData, "success": fnCallback, - "error": handleAjaxError + "error": mod.handleAjaxError }).done(function (data) { var filterMessage = $libContent.find('.filter-message'); if (data.iTotalRecords > data.iTotalDisplayRecords) { @@ -904,17 +916,6 @@ var AIRTIME = (function(AIRTIME) { } - function handleAjaxError(r) { - // If the request was denied due to permissioning - if (r.status === 403) { - // Hide the processing div - $("#library_display_wrapper").find(".dt-process-rel").hide(); - $('.empty_placeholder_text').text($.i18n._("You don't have permission to view the library.")); - - $('.empty_placeholder').show(); - } - } - var selected = $("a[href$='"+location.hash+"']"), table; if (selected.parent().data("selection-id") == AIRTIME.library.MediaTypeIntegerEnum.PODCAST) { table = mod.DataTableTypeEnum.PODCAST; diff --git a/airtime_mvc/public/js/airtime/widgets/table.js b/airtime_mvc/public/js/airtime/widgets/table.js index aaf3b75b9..dc23f8df8 100644 --- a/airtime_mvc/public/js/airtime/widgets/table.js +++ b/airtime_mvc/public/js/airtime/widgets/table.js @@ -399,15 +399,9 @@ var AIRTIME = (function(AIRTIME) { Table.prototype._handleAjaxError = function(r) { // If the request was denied due to permissioning if (r.status === 403) { - // Hide the processing div - /* - $("#library_display_wrapper").find(".dt-process-rel").hide(); - $.getJSON( "ajax/library_placeholders.json", function( data ) { - $('.empty_placeholder_text').text($.i18n._(data.unauthorized)); - }) ; - - $('.empty_placeholder').show(); - */ + $(".dt-process-rel").hide(); + $('.empty_placeholder_text').text($.i18n._("You don't have permission to view this resource.")); + $('.empty_placeholder').show(); } }; From e91eece092baf0765431ba902075b21db0baf8b2 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 20 Nov 2015 16:27:23 -0500 Subject: [PATCH 7/9] Added podcast episode downloads to plans grid --- .../application/views/scripts/billing/upgrade.phtml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/views/scripts/billing/upgrade.phtml b/airtime_mvc/application/views/scripts/billing/upgrade.phtml index 83077cb9e..5e3c61605 100644 --- a/airtime_mvc/application/views/scripts/billing/upgrade.phtml +++ b/airtime_mvc/application/views/scripts/billing/upgrade.phtml @@ -222,7 +222,18 @@ $(document).ready(function() { 150GB Storage - + + + No Built-in Podcast + + 2,000 Podcast Episode Downloads + + 5,000 Podcast Episode Downloads + + + 10,000 Podcast Episode Downloads + + Ticket, Email, Forum Support From aabd1f31862adfc160dcd8bb65d7214523e8fd37 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 20 Nov 2015 17:07:58 -0500 Subject: [PATCH 8/9] Updated stream qualities in pricing grid --- .../application/views/scripts/billing/upgrade.phtml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/views/scripts/billing/upgrade.phtml b/airtime_mvc/application/views/scripts/billing/upgrade.phtml index 5e3c61605..b3b6b09f0 100644 --- a/airtime_mvc/application/views/scripts/billing/upgrade.phtml +++ b/airtime_mvc/application/views/scripts/billing/upgrade.phtml @@ -193,13 +193,13 @@ $(document).ready(function() { - 64kbps Stream Quality + Up to 64kbps Stream Quality - 64kbps and 128kbps Stream Quality + Up to 128kbps Stream Quality - 64kbps and 196kbps Stream Quality + Up to 196kbps Stream Quality - 64kbps, 128kbps, and 196kbps Stream Quality + Up to 196kbps Stream Quality From 553299e9f543fa7e01a7960b872ecc7e882e801e Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Mon, 23 Nov 2015 14:55:37 -0500 Subject: [PATCH 9/9] Try to fix some schedule bugs --- airtime_mvc/application/models/Preference.php | 3 +++ airtime_mvc/application/models/Scheduler.php | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php index 82731f524..5757171b0 100644 --- a/airtime_mvc/application/models/Preference.php +++ b/airtime_mvc/application/models/Preference.php @@ -1572,6 +1572,9 @@ class Application_Model_Preference self::setValue("station_podcast_download_counter", empty($c) ? 0 : --$c); } + /** + * @return int either 0 (public) or 1 (private) + */ public static function getStationPodcastPrivacy() { if (!Billing::isStationPodcastAllowed()) { // return private setting diff --git a/airtime_mvc/application/models/Scheduler.php b/airtime_mvc/application/models/Scheduler.php index de3b73ca1..f3f0c508c 100644 --- a/airtime_mvc/application/models/Scheduler.php +++ b/airtime_mvc/application/models/Scheduler.php @@ -482,10 +482,15 @@ class Application_Model_Scheduler ->orderByDbStarts() ->find($this->con); + $now = new DateTime("now", new DateTimeZone("UTC")); $itemStartDT = $instance->getDbStarts(null); foreach ($schedule as $item) { $itemEndDT = $this->findEndTime($itemStartDT, $item->getDbClipLength()); - Logging::info($itemEndDT); + // If the track has already ended, don't change it. + if ($itemEndDT < $now) { + $itemStartDT = $itemEndDT; + continue; + } $item->setDbStarts($itemStartDT) ->setDbEnds($itemEndDT) ->save($this->con); @@ -515,10 +520,15 @@ class Application_Model_Scheduler ->orderByDbStarts() ->find($this->con); + $now = new DateTime("now", new DateTimeZone("UTC")); $itemStartDT = $instance->getDbStarts(null); foreach ($schedule as $item) { - $itemEndDT = $this->findEndTime($itemStartDT, $item->getDbClipLength()); + // If the track has already ended, don't change it. + if ($itemEndDT < $now) { + $itemStartDT = $itemEndDT; + continue; + } $item->setDbStarts($itemStartDT) ->setDbEnds($itemEndDT); @@ -1191,7 +1201,7 @@ class Application_Model_Scheduler foreach ($removedItems as $removedItem) { $instance = $removedItem->getCcShowInstances($this->con); - $effectedInstanceIds[] = $instance->getDbId(); + $effectedInstanceIds[$instance->getDbId()] = $instance->getDbId(); //check if instance is linked and if so get the schedule items //for all linked instances so we can delete them too