From 22c25e7f18c2a39a9c93ae2eaf8f0b58e7b8b33d Mon Sep 17 00:00:00 2001 From: martin Date: Fri, 12 Aug 2011 14:14:07 -0400 Subject: [PATCH 1/2] CC-1942: Add ability to set timezone in preferences -Can change the timezone for PHP. Need to change for python as well. --- airtime_mvc/application/Bootstrap.php | 43 ++++++++------- .../controllers/PreferenceController.php | 1 + .../application/forms/GeneralPreferences.php | 31 +++++++++++ airtime_mvc/application/models/Preference.php | 8 +++ .../scripts/form/preferences_general.phtml | 15 ++++++ airtime_mvc/public/.htaccess | 1 - install_minimal/include/AirtimeInstall.php | 12 +++++ .../include/airtime-db-install.php | 1 + .../airtime-2.0.0/airtime-upgrade.php | 53 +++++++++++++++++++ 9 files changed, 144 insertions(+), 21 deletions(-) create mode 100644 install_minimal/upgrades/airtime-2.0.0/airtime-upgrade.php diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index c60840fb4..0a7824bd8 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -6,10 +6,6 @@ require_once __DIR__."/configs/ACL.php"; require_once 'propel/runtime/lib/Propel.php'; Propel::init(__DIR__."/configs/airtime-conf.php"); -//DateTime in PHP 5.3.0+ need a default timezone set. -$tz = ini_get('date.timezone') ? ini_get('date.timezone') : 'UTC'; -date_default_timezone_set($tz); - require_once __DIR__."/logging/Logging.php"; require_once __DIR__."/configs/constants.php"; require_once __DIR__."/configs/conf.php"; @@ -26,22 +22,6 @@ require_once 'RabbitMq.php'; require_once 'DateHelper.php'; require_once __DIR__.'/controllers/plugins/RabbitMqPlugin.php'; -global $CC_CONFIG, $CC_DBC; -$dsn = $CC_CONFIG['dsn']; - -$CC_DBC = DB::connect($dsn, FALSE); -if (PEAR::isError($CC_DBC)) { - echo "ERROR: ".$CC_DBC->getMessage()." ".$CC_DBC->getUserInfo()."\n"; - exit(1); -} -$CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC); -Logging::setLogPath('/var/log/airtime/zendphp.log'); - -Zend_Validate::setDefaultNamespaces("Zend"); - -$front = Zend_Controller_Front::getInstance(); -$front->registerPlugin(new RabbitMqPlugin()); - class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initDoctype() @@ -89,6 +69,29 @@ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap $view = $this->getResource('view'); $view->headTitle(Application_Model_Preference::GetHeadTitle()); } + + protected function _initDbConnection(){ + global $CC_CONFIG, $CC_DBC; + $dsn = $CC_CONFIG['dsn']; + $CC_DBC = DB::connect($dsn, FALSE); + if (PEAR::isError($CC_DBC)) { + echo "ERROR: ".$CC_DBC->getMessage()." ".$CC_DBC->getUserInfo()."\n"; + exit(1); + } + $CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC); + + //DateTime in PHP 5.3.0+ need a default timezone set. + date_default_timezone_set(Application_Model_Preference::GetTimezone()); + } + + protected function _initMisc(){ + Logging::setLogPath('/var/log/airtime/zendphp.log'); + + Zend_Validate::setDefaultNamespaces("Zend"); + + $front = Zend_Controller_Front::getInstance(); + $front->registerPlugin(new RabbitMqPlugin()); + } } diff --git a/airtime_mvc/application/controllers/PreferenceController.php b/airtime_mvc/application/controllers/PreferenceController.php index cf5d29b1b..3d043cd59 100644 --- a/airtime_mvc/application/controllers/PreferenceController.php +++ b/airtime_mvc/application/controllers/PreferenceController.php @@ -35,6 +35,7 @@ class PreferenceController extends Zend_Controller_Action Application_Model_Preference::SetDefaultFade($values["preferences_general"]["stationDefaultFade"]); Application_Model_Preference::SetStreamLabelFormat($values["preferences_general"]["streamFormat"]); Application_Model_Preference::SetAllow3rdPartyApi($values["preferences_general"]["thirdPartyApi"]); + Application_Model_Preference::SetTimezone($values["preferences_general"]["timezone"]); Application_Model_Preference::SetDoSoundCloudUpload($values["preferences_soundcloud"]["UseSoundCloud"]); Application_Model_Preference::SetSoundCloudUser($values["preferences_soundcloud"]["SoundCloudUser"]); diff --git a/airtime_mvc/application/forms/GeneralPreferences.php b/airtime_mvc/application/forms/GeneralPreferences.php index 3e5ba710e..a2807c716 100644 --- a/airtime_mvc/application/forms/GeneralPreferences.php +++ b/airtime_mvc/application/forms/GeneralPreferences.php @@ -58,7 +58,38 @@ class Application_Form_GeneralPreferences extends Zend_Form_SubForm $third_party_api->setValue(Application_Model_Preference::GetAllow3rdPartyApi()); $third_party_api->setDecorators(array('ViewHelper')); $this->addElement($third_party_api); + + /* Form Element for setting the Timezone */ + $timezone = new Zend_Form_Element_Select("timezone"); + $timezone->setLabel("Timezone"); + $timezone->setMultiOptions($this->getTimezones()); + $timezone->setValue(Application_Model_Preference::GetTimezone()); + $timezone->setDecorators(array('ViewHelper')); + $this->addElement($timezone); + } + + private function getTimezones(){ + $regions = array( + 'Africa' => DateTimeZone::AFRICA, + 'America' => DateTimeZone::AMERICA, + 'Antarctica' => DateTimeZone::ANTARCTICA, + 'Aisa' => DateTimeZone::ASIA, + 'Atlantic' => DateTimeZone::ATLANTIC, + 'Europe' => DateTimeZone::EUROPE, + 'Indian' => DateTimeZone::INDIAN, + 'Pacific' => DateTimeZone::PACIFIC + ); + + $tzlist = array(); + + foreach ($regions as $name => $mask){ + $ids = DateTimeZone::listIdentifiers($mask); + foreach ($ids as $id){ + $tzlist[$id] = str_replace("_", " ", $id); + } + } + return $tzlist; } diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php index 4d8b10cbe..dc4f6792c 100644 --- a/airtime_mvc/application/models/Preference.php +++ b/airtime_mvc/application/models/Preference.php @@ -260,6 +260,14 @@ class Application_Model_Preference public static function GetStationDescription(){ return Application_Model_Preference::GetValue("description"); } + + public static function SetTimezone($timezone){ + Application_Model_Preference::SetValue("timezone", $timezone); + } + + public static function GetTimezone(){ + return Application_Model_Preference::GetValue("timezone"); + } public static function SetStationLogo($imagePath){ if(!empty($imagePath)){ diff --git a/airtime_mvc/application/views/scripts/form/preferences_general.phtml b/airtime_mvc/application/views/scripts/form/preferences_general.phtml index 21df5c566..7e694f47e 100644 --- a/airtime_mvc/application/views/scripts/form/preferences_general.phtml +++ b/airtime_mvc/application/views/scripts/form/preferences_general.phtml @@ -75,5 +75,20 @@ +
+ +
+
+ element->getElement('timezone') ?> + element->getElement('timezone')->hasErrors()) : ?> + + +
diff --git a/airtime_mvc/public/.htaccess b/airtime_mvc/public/.htaccess index 8a50c17ef..3dfbebfef 100644 --- a/airtime_mvc/public/.htaccess +++ b/airtime_mvc/public/.htaccess @@ -2,7 +2,6 @@ php_value post_max_size 500M php_value upload_max_filesize 500M php_value request_order "GPC" php_value session.gc_probability 0 -php_value date.timezone "America/Toronto" php_value phar.readonly Off RewriteEngine On diff --git a/install_minimal/include/AirtimeInstall.php b/install_minimal/include/AirtimeInstall.php index 78371447f..f0326ef85 100644 --- a/install_minimal/include/AirtimeInstall.php +++ b/install_minimal/include/AirtimeInstall.php @@ -294,6 +294,18 @@ class AirtimeInstall return true; } + public static function SetDefaultTimezone() + { + global $CC_DBC; + + $sql = "INSERT INTO cc_pref (keystr, valstr) VALUES ('timezone', 'America/Toronto')"; + $result = $CC_DBC->query($sql); + if (PEAR::isError($result)) { + return false; + } + return true; + } + public static function SetImportTimestamp() { global $CC_DBC; diff --git a/install_minimal/include/airtime-db-install.php b/install_minimal/include/airtime-db-install.php index c2fd837b0..87f07161d 100644 --- a/install_minimal/include/airtime-db-install.php +++ b/install_minimal/include/airtime-db-install.php @@ -50,6 +50,7 @@ AirtimeInstall::SetAirtimeVersion(AIRTIME_VERSION); // set up some keys in DB AirtimeInstall::SetUniqueId(); AirtimeInstall::SetImportTimestamp(); +AirtimeInstall::SetDefaultTimezone(); if (AirtimeInstall::$databaseTablesCreated) { diff --git a/install_minimal/upgrades/airtime-2.0.0/airtime-upgrade.php b/install_minimal/upgrades/airtime-2.0.0/airtime-upgrade.php new file mode 100644 index 000000000..6c9bdce85 --- /dev/null +++ b/install_minimal/upgrades/airtime-2.0.0/airtime-upgrade.php @@ -0,0 +1,53 @@ +query($sql); + if (PEAR::isError($result)) { + return false; + } + return true; + } +} + +class Airtime200Upgrade{ + + public static function connectToDatabase(){ + global $CC_DBC, $CC_CONFIG; + + $values = parse_ini_file('/etc/airtime/airtime.conf', true); + + // Database config + $CC_CONFIG['dsn']['username'] = $values['database']['dbuser']; + $CC_CONFIG['dsn']['password'] = $values['database']['dbpass']; + $CC_CONFIG['dsn']['hostspec'] = $values['database']['host']; + $CC_CONFIG['dsn']['phptype'] = 'pgsql'; + $CC_CONFIG['dsn']['database'] = $values['database']['dbname']; + + $CC_DBC = DB::connect($CC_CONFIG['dsn'], FALSE); + } + +} + +Airtime200Upgrade::connectToDatabase(); +AirtimeInstall::SetDefaultTimezone(); From 094f39709f56248abcc28caddf7256856ae793a4 Mon Sep 17 00:00:00 2001 From: martin Date: Fri, 12 Aug 2011 15:36:00 -0400 Subject: [PATCH 2/2] CC-1942: Add ability to set timezone in preferences -change timezone in python --- airtime_mvc/application/Bootstrap.php | 48 +++++++++---------- .../controllers/plugins/RabbitMqPlugin.php | 5 +- airtime_mvc/application/models/Preference.php | 4 +- airtime_mvc/application/models/RabbitMq.php | 30 +++++++++++- .../application/models/tests/populator.php | 6 ++- python_apps/pypo/pypofetch.py | 5 ++ 6 files changed, 69 insertions(+), 29 deletions(-) diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index 0a7824bd8..f8d0886aa 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -16,12 +16,36 @@ require_once 'MusicDir.php'; require_once 'Playlist.php'; require_once 'StoredFile.php'; require_once 'Schedule.php'; +require_once 'Preference.php'; require_once 'Shows.php'; require_once 'Users.php'; require_once 'RabbitMq.php'; require_once 'DateHelper.php'; require_once __DIR__.'/controllers/plugins/RabbitMqPlugin.php'; +global $CC_CONFIG, $CC_DBC; +$dsn = $CC_CONFIG['dsn']; + +$CC_DBC = DB::connect($dsn, FALSE); +if (PEAR::isError($CC_DBC)) { + echo "ERROR: ".$CC_DBC->getMessage()." ".$CC_DBC->getUserInfo()."\n"; + exit(1); +} +$CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC); + +//DateTime in PHP 5.3.0+ need a default timezone set. +date_default_timezone_set(Application_Model_Preference::GetTimezone()); + +Logging::setLogPath('/var/log/airtime/zendphp.log'); + +Zend_Validate::setDefaultNamespaces("Zend"); + +$front = Zend_Controller_Front::getInstance(); +$front->registerPlugin(new RabbitMqPlugin()); + + +/* The bootstrap class should only be used to initialize actions that return a view. + Actions that return JSON will not use the bootstrap class! */ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initDoctype() @@ -69,29 +93,5 @@ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap $view = $this->getResource('view'); $view->headTitle(Application_Model_Preference::GetHeadTitle()); } - - protected function _initDbConnection(){ - global $CC_CONFIG, $CC_DBC; - $dsn = $CC_CONFIG['dsn']; - - $CC_DBC = DB::connect($dsn, FALSE); - if (PEAR::isError($CC_DBC)) { - echo "ERROR: ".$CC_DBC->getMessage()." ".$CC_DBC->getUserInfo()."\n"; - exit(1); - } - $CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC); - - //DateTime in PHP 5.3.0+ need a default timezone set. - date_default_timezone_set(Application_Model_Preference::GetTimezone()); - } - - protected function _initMisc(){ - Logging::setLogPath('/var/log/airtime/zendphp.log'); - - Zend_Validate::setDefaultNamespaces("Zend"); - - $front = Zend_Controller_Front::getInstance(); - $front->registerPlugin(new RabbitMqPlugin()); - } } diff --git a/airtime_mvc/application/controllers/plugins/RabbitMqPlugin.php b/airtime_mvc/application/controllers/plugins/RabbitMqPlugin.php index 3316f01b2..1a55522ae 100644 --- a/airtime_mvc/application/controllers/plugins/RabbitMqPlugin.php +++ b/airtime_mvc/application/controllers/plugins/RabbitMqPlugin.php @@ -4,6 +4,9 @@ class RabbitMqPlugin extends Zend_Controller_Plugin_Abstract { public function dispatchLoopShutdown() { - RabbitMq::PushScheduleFinal(); + if (RabbitMq::$doPush) { + $md = array('schedule' => Schedule::GetScheduledPlaylists()); + RabbitMq::SendMessageToPypo("update_schedule", $md); + } } } \ No newline at end of file diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php index dc4f6792c..ef222abfb 100644 --- a/airtime_mvc/application/models/Preference.php +++ b/airtime_mvc/application/models/Preference.php @@ -59,7 +59,6 @@ class Application_Model_Preference $result = $CC_DBC->GetOne($sql); return $result; } - } public static function GetHeadTitle(){ @@ -263,6 +262,9 @@ class Application_Model_Preference public static function SetTimezone($timezone){ Application_Model_Preference::SetValue("timezone", $timezone); + date_default_timezone_set($timezone); + $md = array("timezone" => $timezone); + RabbitMq::SendMessageToPypo("update_timezone", $md); } public static function GetTimezone(){ diff --git a/airtime_mvc/application/models/RabbitMq.php b/airtime_mvc/application/models/RabbitMq.php index 514f8aecf..d93a9d1bc 100644 --- a/airtime_mvc/application/models/RabbitMq.php +++ b/airtime_mvc/application/models/RabbitMq.php @@ -3,7 +3,7 @@ require_once 'php-amqplib/amqp.inc'; class RabbitMq { - static private $doPush = FALSE; + static public $doPush = FALSE; /** * Sets a flag to push the schedule at the end of the request. @@ -17,7 +17,7 @@ class RabbitMq * Will push the schedule in the range from 24 hours ago to 24 hours * in the future. */ - public static function PushScheduleFinal() +/* public static function PushScheduleFinal() { global $CC_CONFIG; if (RabbitMq::$doPush) { @@ -42,6 +42,32 @@ class RabbitMq self::SendMessageToShowRecorder("update_schedule"); } + } */ + + public static function SendMessageToPypo($event_type, $md) + { + global $CC_CONFIG; + + $md["event_type"] = $event_type; + + $conn = new AMQPConnection($CC_CONFIG["rabbitmq"]["host"], + $CC_CONFIG["rabbitmq"]["port"], + $CC_CONFIG["rabbitmq"]["user"], + $CC_CONFIG["rabbitmq"]["password"]); + $channel = $conn->channel(); + $channel->access_request($CC_CONFIG["rabbitmq"]["vhost"], false, false, true, true); + + $EXCHANGE = 'airtime-schedule'; + $channel->exchange_declare($EXCHANGE, 'direct', false, true); + + $data = json_encode($md); + $msg = new AMQPMessage($data, array('content_type' => 'text/plain')); + + $channel->basic_publish($msg, $EXCHANGE); + $channel->close(); + $conn->close(); + + self::SendMessageToShowRecorder("update_schedule"); } public static function SendMessageToMediaMonitor($event_type, $md) diff --git a/airtime_mvc/application/models/tests/populator.php b/airtime_mvc/application/models/tests/populator.php index 4a83e6ff0..38f79bb24 100644 --- a/airtime_mvc/application/models/tests/populator.php +++ b/airtime_mvc/application/models/tests/populator.php @@ -96,7 +96,11 @@ while ($showTime < $endDate) { } $showNumber = $showNumber + 1; } -RabbitMq::PushScheduleFinal(); + +if (RabbitMq::$doPush) { + $md = array('schedule' => Schedule::GetScheduledPlaylists()); + RabbitMq::SendMessageToPypo("update_schedule", $md); +} diff --git a/python_apps/pypo/pypofetch.py b/python_apps/pypo/pypofetch.py index 8ce94420e..dcf0fc81c 100755 --- a/python_apps/pypo/pypofetch.py +++ b/python_apps/pypo/pypofetch.py @@ -55,6 +55,11 @@ def handle_message(body, message): if(command == 'update_schedule'): SCHEDULE_PUSH_MSG = m['schedule'] + elif (command == 'update_timezone'): + logger.info("Setting timezone to %s", m['timezone']) + os.environ['TZ'] = m['timezone'] + time.tzset() + # ACK the message to take it off the queue message.ack()