CC-5036: Add back edit show instance functionality

This commit is contained in:
denise 2013-04-01 14:42:35 -04:00
parent 1eba09fc4c
commit ab10ae68a2
3 changed files with 105 additions and 29 deletions

View File

@ -467,9 +467,7 @@ class ScheduleController extends Zend_Controller_Action
if ($service_showForm->validateShowForms($forms, $data, $validateStartDate,
$originalShowStartDateTime, true, $data["add_show_instance_id"])) {
//treat repeating instance has a new and separate show
$service_show->deleteRepeatingInstance($data["add_show_instance_id"]);
$service_show->addUpdateShow($data);
$service_show->createShowFromRepeatingInstance($data);
$this->view->addNewShow = true;
$this->view->newForm = $this->view->render('schedule/add-show-form.phtml');

View File

@ -1666,7 +1666,7 @@ SQL;
if (is_null($showsPopUntil) || $showsPopUntil->getTimestamp() < $end_timestamp->getTimestamp()) {
//Application_Model_Show::populateAllShowsInRange($showsPopUntil, $end_timestamp);
$service_show = new Application_Service_ShowService();
$service_show->delegateInstanceCreation(null, false, $end_timestamp);
$service_show->delegateInstanceCreation(null, false, null, $end_timestamp);
Application_Model_Preference::SetShowsPopulatedUntil($end_timestamp);
}

View File

@ -17,17 +17,71 @@ class Application_Service_ShowService
}
}
/**
*
* When the user is editing a single instance of a repeating show
* we want to treat it as a completely new show so we need to delete
* the instance first
*
* @param $instanceId
*/
public function deleteRepeatingInstance($instanceId)
{
CcShowInstancesQuery::create()->findPk($instanceId)->delete();
public function createShowFromRepeatingInstance($showData) {
$service_user = new Application_Service_UserService();
$currentUser = $service_user->getCurrentUser();
$showData["add_show_duration"] = $this->formatShowDuration(
$showData["add_show_duration"]);
$con = Propel::getConnection();
$con->beginTransaction();
try {
if (!$currentUser->isAdminOrPM()) {
throw new Exception("Permission denied");
}
/****** UPDATE SCHEDULE START TIME ******/
//get the ccShow object to which this instance belongs
//so we can get the original start date and time
$oldCcShow = CcShowQuery::create()
->findPk($showData["add_show_id"]);
$currentShowDay = $oldCcShow->getFirstCcShowDay();
//DateTime in user's local time
$newStartDateTime = new DateTime($showData["add_show_start_date"]." ".
$showData["add_show_start_time"],
new DateTimeZone(Application_Model_Preference::GetTimezone()));
$diff = $this->calculateShowStartDiff($newStartDateTime,
$currentShowDay->getLocalStartDateAndTime());
Application_Service_SchedulerService::updateScheduleStartTime(
array($showData["add_show_instance_id"]), $diff);
/****** UPDATE SCHEDULE START TIME ENDS******/
$this->setCcShow($showData);
$this->setCcShowDays($showData);
$this->setCcShowHosts($showData);
$this->delegateInstanceCreation();
//get the new instance id
$ccShowInstance = CcShowInstancesQuery::create()
->filterByDbShowId($this->ccShow->getDbId())
->findOne();
$newInstanceId = $ccShowInstance->getDbId();
//update cc_schedule with the new instance id
$ccSchedules = CcScheduleQuery::create()
->filterByDbInstanceId($showData["add_show_instance_id"])
->find();
foreach ($ccSchedules as $ccSchedule) {
$ccSchedule->setDbInstanceId($newInstanceId);
$ccSchedule->save();
}
//delete the edited instance from the repeating sequence
CcShowInstancesQuery::create()->findPk($showData["add_show_instance_id"])->delete();
$con->commit();
Application_Model_RabbitMq::PushSchedule();
} catch (Exception $e) {
$con->rollback();
Logging::info("EXCEPTION: Show update failed.");
Logging::info($e->getMessage());
}
}
public function addUpdateShow($showData, $isUpdate=false)
@ -58,8 +112,9 @@ class Application_Service_ShowService
//update ccShow
$this->setCcShow($showData, $isUpdate);
$daysAdded = array();
if ($isUpdate) {
$this->delegateInstanceCleanup($showData, $isRecorded, $repeatType);
$daysAdded = $this->delegateInstanceCleanup($showData, $isRecorded, $repeatType);
// updates cc_show_instances start/end times, and updates
// schedule start/end times
$this->applyShowStartEndDifference($showData);
@ -82,7 +137,7 @@ class Application_Service_ShowService
$this->setCcShowHosts($showData);
//create new ccShowInstances
$this->delegateInstanceCreation($isRebroadcast, $isUpdate);
$this->delegateInstanceCreation($isRebroadcast, $isUpdate, $daysAdded);
if ($isUpdate) {
$service_scheduler = new Application_Service_SchedulerService();
@ -104,7 +159,7 @@ class Application_Service_ShowService
* Receives a cc_show id and determines whether to create a
* single show instance or repeating show instances
*/
public function delegateInstanceCreation($isRebroadcast=null, $isUpdate=false, $end=null)
public function delegateInstanceCreation($isRebroadcast=null, $isUpdate=false, $daysAdded=null, $end=null)
{
$populateUntil = $this->getPopulateShowUntilDateTIme();
@ -125,11 +180,11 @@ class Application_Service_ShowService
break;
case REPEAT_WEEKLY:
$this->createRepeatingInstances($day, $populateUntil, REPEAT_WEEKLY,
new DateInterval("P7D"), $isRebroadcast, $isUpdate);
new DateInterval("P7D"), $isRebroadcast, $isUpdate, $daysAdded);
break;
case REPEAT_BI_WEEKLY:
$this->createRepeatingInstances($day, $populateUntil, REPEAT_BI_WEEKLY,
new DateInterval("P14D"), $isRebroadcast, $isUpdate);
new DateInterval("P14D"), $isRebroadcast, $isUpdate, $daysAdded);
break;
case REPEAT_MONTHLY_MONTHLY:
$this->createMonthlyMonthlyRepeatInstances($day, $populateUntil, $isRebroadcast, $isUpdate);
@ -219,6 +274,8 @@ SQL;
{
$showId = $this->ccShow->getDbId();
$daysAdded = array();
//CcShowDay object
$currentShowDay = $this->ccShow->getFirstCcShowDay();
@ -233,6 +290,12 @@ SQL;
//repeat option was toggled
if ($showData['add_show_repeats'] != $currentShowDay->isRepeating()) {
$this->deleteAllRepeatInstances($currentShowDay, $showId);
//if repeat option was checked we need to treat the current show day
//as a new show day so the repeat instances get created properly
//in createRepeatingInstances()
if ($showData['add_show_repeats']) {
array_push($daysAdded, $currentShowDay->getDbDay());
}
}
if ($showData['add_show_repeats']) {
@ -280,6 +343,10 @@ SQL;
if ($repeatingDaysChanged) {
$daysRemoved = array_diff($showDays, $showData['add_show_day_check']);
$newDays = array_diff($showData["add_show_day_check"], $showDays);
foreach ($newDays as $newDay) {
array_push($daysAdded, $newDay);
}
if (count($daysRemoved) > 0) {
//delete repeating show instances for the repeating
@ -324,6 +391,8 @@ SQL;
}
}
}//if repeats
return $daysAdded;
}
public function getRepeatingEndDate()
@ -608,7 +677,7 @@ SQL;
* @param unknown_type $isRebroadcast
*/
private function createRepeatingInstances($showDay, $populateUntil,
$repeatType, $repeatInterval, $isRebroadcast, $isUpdate)
$repeatType, $repeatInterval, $isRebroadcast, $isUpdate, $daysAdded=null)
{
$show_id = $showDay->getDbShowId();
$first_show = $showDay->getDbFirstShow(); //non-UTC
@ -648,11 +717,21 @@ SQL;
* This will be the case when we are adding a new show day to
* a repeating show
*/
if ($isUpdate && $this->hasInstance($utcStartDateTime)) {
$ccShowInstance = $this->getInstance($utcStartDateTime);
$newInstance = false;
$updateScheduleStatus = true;
} else {
if ($isUpdate) {
if ($this->hasInstance($utcStartDateTime)) {
$ccShowInstance = $this->getInstance($utcStartDateTime);
$newInstance = false;
$updateScheduleStatus = true;
} elseif (in_array($day, $daysAdded)) {
$newInstance = true;
$ccShowInstance = new CcShowInstances();
$updateScheduleStatus = false;
} else {
//if we get here, an instance was edited on it's own and
//thus became it's own show so there is nothing to update
break 1;
}
} else {
$newInstance = true;
$ccShowInstance = new CcShowInstances();
$updateScheduleStatus = false;
@ -822,7 +901,6 @@ SQL;
private function getNextRepeatingPopulateStartDateTime($showDay)
{
$nextPopDate = $showDay->getDbNextPopDate();
Logging::info($nextPopDate);
$startTime = $showDay->getDbStartTime();
if (isset($nextPopDate)) {
@ -906,7 +984,7 @@ SQL;
* @param $ccShow
* @param $showData
*/
private function setCcShow($showData, $isUpdate)
private function setCcShow($showData, $isUpdate=false)
{
if (!$isUpdate) {
$ccShow = new CcShow();
@ -939,7 +1017,7 @@ SQL;
* @param $isRecorded
* @param $showDay ccShowDay object we are setting values on
*/
private function setCcShowDays($showData, $repeatType, $isRecorded)
private function setCcShowDays($showData, $repeatType=-1, $isRecorded=0)
{
$showId = $this->ccShow->getDbId();