From 2ee4b227fccdafa83fc7bb3e792acbe069c9c0e6 Mon Sep 17 00:00:00 2001
From: James <james@sourcefabric-DX4840.(none)>
Date: Wed, 14 Mar 2012 10:34:44 -0400
Subject: [PATCH] CC-3439: Live Stream: Only admin should be able to turn on/of
 switch and able to see kick out button

- done
---
 .../application/layouts/scripts/builder.phtml |  12 +-
 .../application/layouts/scripts/layout.phtml  |   3 +-
 .../application/layouts/scripts/library.phtml |  10 +-
 .../layouts/scripts/playouthistory.phtml      |  10 +-
 .../application/views/helpers/IsAdmin.php     |  11 ++
 .../views/scripts/partialviews/header.phtml   |  29 ++++-
 .../public/js/airtime/dashboard/playlist.js   | 104 +++++++++---------
 .../pypo/liquidsoap_scripts/ls_script.liq     |   2 +-
 8 files changed, 113 insertions(+), 68 deletions(-)
 create mode 100644 airtime_mvc/application/views/helpers/IsAdmin.php

diff --git a/airtime_mvc/application/layouts/scripts/builder.phtml b/airtime_mvc/application/layouts/scripts/builder.phtml
index 782681d50..5f13b0f67 100644
--- a/airtime_mvc/application/layouts/scripts/builder.phtml
+++ b/airtime_mvc/application/layouts/scripts/builder.phtml
@@ -12,11 +12,13 @@
     <div class="logo"></div>
     <?php echo $this->versionNotify();
             $sss = $this->SourceSwitchStatus();
-            $scs = $this->SourceConnectionStatus();?>
-    <?php echo $this->partial('partialviews/header.phtml', array("user" => $this->loggedInAs(), "is_trial"=>$this->isTrial(), "trial_remain"=> $this->trialRemaining(),
-                        "live_dj_switch"=>$sss['live_dj'], "live_dj_connection"=>$scs['live_dj'], "master_dj_switch"=>$sss['master_dj'], "master_dj_connection"=>$scs['master_dj'],
-                        "scheduled_play_switch"=>$sss['scheduled_play'])) ?>
-
+            $scs = $this->SourceConnectionStatus();
+            $isAdmin = $this->isAdmin();
+    ?>
+    <?php echo $this->partial('partialviews/header.phtml', array("user" => $this->loggedInAs(), "is_trial"=>$this->isTrial(), "trial_remain"=> $this->trialRemaining(), 
+                "live_dj_switch"=>$sss['live_dj'], "live_dj_connection"=>$scs['live_dj'], "master_dj_switch"=>$sss['master_dj'], "master_dj_connection"=>$scs['master_dj'],
+                "scheduled_play_switch"=>$sss['scheduled_play'], "isAdmin"=>$isAdmin)) ?>
+                
 <?php 	$partial = array('menu.phtml', 'default');
 		$this->navigation()->menu()->setPartial($partial); ?>
 
diff --git a/airtime_mvc/application/layouts/scripts/layout.phtml b/airtime_mvc/application/layouts/scripts/layout.phtml
index 39afbc8a9..d074b921d 100644
--- a/airtime_mvc/application/layouts/scripts/layout.phtml
+++ b/airtime_mvc/application/layouts/scripts/layout.phtml
@@ -14,10 +14,11 @@
     <?php echo $this->versionNotify();
             $sss = $this->SourceSwitchStatus();
             $scs = $this->SourceConnectionStatus();
+            $isAdmin = $this->isAdmin();
     ?>
     <?php echo $this->partial('partialviews/header.phtml', array("user" => $this->loggedInAs(), "is_trial"=>$this->isTrial(), "trial_remain"=> $this->trialRemaining(), 
                 "live_dj_switch"=>$sss['live_dj'], "live_dj_connection"=>$scs['live_dj'], "master_dj_switch"=>$sss['master_dj'], "master_dj_connection"=>$scs['master_dj'],
-                "scheduled_play_switch"=>$sss['scheduled_play'])) ?>
+                "scheduled_play_switch"=>$sss['scheduled_play'], "isAdmin"=>$isAdmin)) ?>
 
 <?php 	$partial = array('menu.phtml', 'default');
 		$this->navigation()->menu()->setPartial($partial); ?>
diff --git a/airtime_mvc/application/layouts/scripts/library.phtml b/airtime_mvc/application/layouts/scripts/library.phtml
index 2fa4a1d42..e3a2748e1 100644
--- a/airtime_mvc/application/layouts/scripts/library.phtml
+++ b/airtime_mvc/application/layouts/scripts/library.phtml
@@ -13,10 +13,12 @@
     <div class="logo"></div>
     <?php echo $this->versionNotify();
             $sss = $this->SourceSwitchStatus();
-            $scs = $this->SourceConnectionStatus(); ?>
-    <?php echo $this->partial('partialviews/header.phtml', array("user" => $this->loggedInAs(), "is_trial"=>$this->isTrial(), "trial_remain"=> $this->trialRemaining(),
-                    "live_dj_switch"=>$sss['live_dj'], "live_dj_connection"=>$scs['live_dj'], "master_dj_switch"=>$sss['master_dj'], "master_dj_connection"=>$scs['master_dj'],
-                    "scheduled_play_switch"=>$sss['scheduled_play'])) ?>
+            $scs = $this->SourceConnectionStatus();
+            $isAdmin = $this->isAdmin();
+    ?>
+    <?php echo $this->partial('partialviews/header.phtml', array("user" => $this->loggedInAs(), "is_trial"=>$this->isTrial(), "trial_remain"=> $this->trialRemaining(), 
+                "live_dj_switch"=>$sss['live_dj'], "live_dj_connection"=>$scs['live_dj'], "master_dj_switch"=>$sss['master_dj'], "master_dj_connection"=>$scs['master_dj'],
+                "scheduled_play_switch"=>$sss['scheduled_play'], "isAdmin"=>$isAdmin)) ?>
 
 <?php 	$partial = array('menu.phtml', 'default');
 		$this->navigation()->menu()->setPartial($partial); ?>
diff --git a/airtime_mvc/application/layouts/scripts/playouthistory.phtml b/airtime_mvc/application/layouts/scripts/playouthistory.phtml
index 210bbeaa8..0c9fee73f 100644
--- a/airtime_mvc/application/layouts/scripts/playouthistory.phtml
+++ b/airtime_mvc/application/layouts/scripts/playouthistory.phtml
@@ -11,8 +11,14 @@
 
 <div id="Panel">
     <div class="logo"></div>
-    <?php echo $this->versionNotify() ?>
-    <?php echo $this->partial('partialviews/header.phtml', array("user" => $this->loggedInAs(), "is_trial"=>$this->isTrial(), "trial_remain"=> $this->trialRemaining())) ?>
+    <?php echo $this->versionNotify();
+            $sss = $this->SourceSwitchStatus();
+            $scs = $this->SourceConnectionStatus();
+            $isAdmin = $this->isAdmin();
+    ?>
+    <?php echo $this->partial('partialviews/header.phtml', array("user" => $this->loggedInAs(), "is_trial"=>$this->isTrial(), "trial_remain"=> $this->trialRemaining(), 
+                "live_dj_switch"=>$sss['live_dj'], "live_dj_connection"=>$scs['live_dj'], "master_dj_switch"=>$sss['master_dj'], "master_dj_connection"=>$scs['master_dj'],
+                "scheduled_play_switch"=>$sss['scheduled_play'], "isAdmin"=>$isAdmin)) ?>
 
 <?php 	$partial = array('menu.phtml', 'default');
 		$this->navigation()->menu()->setPartial($partial); ?>
diff --git a/airtime_mvc/application/views/helpers/IsAdmin.php b/airtime_mvc/application/views/helpers/IsAdmin.php
new file mode 100644
index 000000000..94c07235a
--- /dev/null
+++ b/airtime_mvc/application/views/helpers/IsAdmin.php
@@ -0,0 +1,11 @@
+<?php
+
+class Airtime_View_Helper_IsAdmin extends Zend_View_Helper_Abstract
+{
+    public function isAdmin()
+    {
+        $userInfo = Zend_Auth::getInstance()->getStorage()->read();
+        $user = new Application_Model_User($userInfo->id);
+        return $user->isAdmin();
+    }
+}
\ No newline at end of file
diff --git a/airtime_mvc/application/views/scripts/partialviews/header.phtml b/airtime_mvc/application/views/scripts/partialviews/header.phtml
index 1099c3871..564b7a436 100644
--- a/airtime_mvc/application/views/scripts/partialviews/header.phtml
+++ b/airtime_mvc/application/views/scripts/partialviews/header.phtml
@@ -23,9 +23,32 @@
   <div class="source-info-block">
     <ul>
       <li>Source Streams</li>
-      <li><div id="scheduled_play_connection" style="width:19px;"></div>Scheduled Play<div class="line-to-on-air off"></div><a href="#" id="scheduled_play" class="source-switch-button"><span><?php echo $this->scheduled_play_switch?></span></a><div class="line-to-switch off"></div></li>
-      <li><div id="live_dj_connection" class="source-connection off"></div>Live DJ<div class="line-to-on-air off"></div><a href="#" id="live_dj" class="source-switch-button"><span><?php echo $this->live_dj_switch?></span></a><div class="line-to-switch off"></div></li>
-      <li><div id="master_dj_connection" class="source-connection off"></div>Master DJ<div class="line-to-on-air off"></div><a href="#" id="master_dj" class="source-switch-button"><span><?php echo $this->master_dj_switch?></span></a><div class="line-to-switch off"></div></li>
+      <li>
+        <div id="scheduled_play_div">
+            Scheduled Play
+            <div class="line-to-on-air off"></div>
+            <a href="#" id="scheduled_play" class="source-switch-button" onclick="<?php echo ($this->isAdmin)?"setSwitchListener(this);":"return false"?>"><span><?php echo $this->scheduled_play_switch?></span></a>
+            <div class="line-to-switch off"></div>
+        </div>
+      </li>
+      <li>
+        <div id="live_dj_div">
+          <?php if($this->isAdmin){?><a id="live_dj_connection" class="source-kick-button" onclick="kickSource(this)"></a><?php }?>
+          Live DJ
+          <div class="line-to-on-air off"></div>
+          <a href="#" id="live_dj" class="source-switch-button" onclick="<?php echo ($this->isAdmin)?"setSwitchListener(this);":"return false"?>"><span><?php echo $this->live_dj_switch?></span></a>
+          <div class="line-to-switch off"></div>
+        </div>
+      </li>
+      <li>
+        <div id="master_dj_div">
+          <?php if($this->isAdmin){?><a id="master_dj_connection" class="source-kick-button" onclick="kickSource(this)"></a><?php }?>
+          Master DJ
+          <div class="line-to-on-air off"></div>
+          <a href="#" id="master_dj" class="source-switch-button" onclick="<?php echo ($this->isAdmin)?"setSwitchListener(this);":"return false"?>"><span><?php echo $this->master_dj_switch?></span></a>
+          <div class="line-to-switch off"></div>
+          </div>
+      </li>
     </ul>
   </div>
   <div class="on-air-block">
diff --git a/airtime_mvc/public/js/airtime/dashboard/playlist.js b/airtime_mvc/public/js/airtime/dashboard/playlist.js
index 11fd12517..1cff57d46 100644
--- a/airtime_mvc/public/js/airtime/dashboard/playlist.js
+++ b/airtime_mvc/public/js/airtime/dashboard/playlist.js
@@ -16,6 +16,7 @@ var uiUpdateInterval = 200;
 var master_dj_on_air = false;
 var live_dj_on_air = false;
 var scheduled_play_on_air = false;
+var scheduled_play_source = false;
 
 //var timezoneOffset = 0;
 
@@ -80,20 +81,20 @@ function updateProgressBarValue(){
             songPercentDone = 0;        
             currentSong = null;
         } else {
-            var scheduled_play_connection = $("#scheduled_play_connection").parent().find(".line-to-switch") 
+            var scheduled_play_line_to_switch = $("#scheduled_play_div").find(".line-to-switch") 
             if (currentSong.media_item_played == "t" && currentShow.length > 0){
-                scheduled_play_connection.attr("class", "line-to-switch on");
-                //scheduled_play_on_air = true;
+                scheduled_play_line_to_switch.attr("class", "line-to-switch on");
+                scheduled_play_source = true;
             }
             else{
-                //scheduled_play_on_air = false;
-                scheduled_play_connection.attr("class", "line-to-switch off");
+                scheduled_play_source = false;
+                scheduled_play_line_to_switch.attr("class", "line-to-switch off");
             }
             $('#progress-show').attr("class", "progress-show");
         }
     } else {
-        $('#on-air-info').attr("class", "on-air-info off");
-        $("#scheduled_play_connection").parent().find(".line-to-switch").attr("class", "line-to-switch off");
+        scheduled_play_source = false;
+        $("#scheduled_play_div").find(".line-to-switch").attr("class", "line-to-switch off");
         $('#progress-show').attr("class", "progress-show-error");
     }
     $('#progress-bar').attr("style", "width:"+songPercentDone+"%");
@@ -231,8 +232,8 @@ function parseItems(obj){
 }
 
 function parseSourceStatus(obj){
-    var live_div = $("#live_dj_connection").parent().find(".line-to-switch")
-    var master_div = $("#master_dj_connection").parent().find(".line-to-switch")
+    var live_div = $("#live_dj_div").find(".line-to-switch")
+    var master_div = $("#master_dj_div").find(".line-to-switch")
     
     if(obj.live_dj_source == false){
         live_div.attr("class", "line-to-switch off")
@@ -248,8 +249,6 @@ function parseSourceStatus(obj){
 }
 
 function parseSwitchStatus(obj){
-    var live_div = $("#live_dj_connection")
-    var master_div = $("#master_dj_connection")
     
     if(obj.live_dj_source == "on" && obj.master_dj_source == "off"){
         live_dj_on_air = true;
@@ -275,7 +274,7 @@ function parseSwitchStatus(obj){
 }
 
 function controlOnAirLight(){
-    if(scheduled_play_on_air || live_dj_on_air || master_dj_on_air){
+    if((scheduled_play_on_air && scheduled_play_source)|| live_dj_on_air || master_dj_on_air){
         $('#on-air-info').attr("class", "on-air-info on");
     }else{
         $('#on-air-info').attr("class", "on-air-info off");
@@ -283,26 +282,26 @@ function controlOnAirLight(){
 }
 
 function controlSwitchLight(){
-    var live_div = $("#live_dj_connection")
-    var master_div = $("#master_dj_connection")
-    var scheduled_play_div = $("#scheduled_play_connection")
+    var live_div = $("#live_dj_div")
+    var master_div = $("#master_dj_div")
+    var scheduled_play_div = $("#scheduled_play_div")
     
-    if(scheduled_play_on_air && !live_dj_on_air && !master_dj_on_air){
-        scheduled_play_div.parent().find(".line-to-on-air").attr("class", "line-to-on-air on")
-        live_div.parent().find(".line-to-on-air").attr("class", "line-to-on-air off")
-        master_div.parent().find(".line-to-on-air").attr("class", "line-to-on-air off")
+    if((scheduled_play_on_air && scheduled_play_source) && !live_dj_on_air && !master_dj_on_air){
+        scheduled_play_div.find(".line-to-on-air").attr("class", "line-to-on-air on")
+        live_div.find(".line-to-on-air").attr("class", "line-to-on-air off")
+        master_div.find(".line-to-on-air").attr("class", "line-to-on-air off")
     }else if(live_dj_on_air && !master_dj_on_air){
-        scheduled_play_div.parent().find(".line-to-on-air").attr("class", "line-to-on-air off")
-        live_div.parent().find(".line-to-on-air").attr("class", "line-to-on-air on")
-        master_div.parent().find(".line-to-on-air").attr("class", "line-to-on-air off")
+        scheduled_play_div.find(".line-to-on-air").attr("class", "line-to-on-air off")
+        live_div.find(".line-to-on-air").attr("class", "line-to-on-air on")
+        master_div.find(".line-to-on-air").attr("class", "line-to-on-air off")
     }else if(master_dj_on_air){
-        scheduled_play_div.parent().find(".line-to-on-air").attr("class", "line-to-on-air off")
-        live_div.parent().find(".line-to-on-air").attr("class", "line-to-on-air off")
-        master_div.parent().find(".line-to-on-air").attr("class", "line-to-on-air on")
+        scheduled_play_div.find(".line-to-on-air").attr("class", "line-to-on-air off")
+        live_div.find(".line-to-on-air").attr("class", "line-to-on-air off")
+        master_div.find(".line-to-on-air").attr("class", "line-to-on-air on")
     }else{
-        scheduled_play_div.parent().find(".line-to-on-air").attr("class", "line-to-on-air off")
-        live_div.parent().find(".line-to-on-air").attr("class", "line-to-on-air off")
-        master_div.parent().find(".line-to-on-air").attr("class", "line-to-on-air off")
+        scheduled_play_div.find(".line-to-on-air").attr("class", "line-to-on-air off")
+        live_div.find(".line-to-on-air").attr("class", "line-to-on-air off")
+        master_div.find(".line-to-on-air").attr("class", "line-to-on-air off")
     }
 }
 
@@ -340,28 +339,31 @@ function setupQtip(){
     }
 }
 
-function setSwitchListener(){
-    $(".source-switch-button").click(function(){
-        var sourcename = $(this).attr('id')
-        var status_span = $(this).find("span")
-        var status = status_span.html()
-        var _class = $(this).parent().find("div.line-to-switch").attr("class")
-        var source_connection_status = false
-        
-        if(_class.indexOf("off") > 0){
-            source_connection_status = false
-        }else{
-            source_connection_status = true
-        }
-        
-        if(source_connection_status){
-            $.get("/Dashboard/switch-source/format/json/sourcename/"+sourcename+"/status/"+status, function(data){
-                status_span.html(data.status)
-            });
-        }else{
-            alert("The source is not connected to Airtime!")
-        }
-    })
+function setSwitchListener(ele){
+    var sourcename = $(ele).attr('id')
+    var status_span = $(ele).find("span")
+    var status = status_span.html()
+    var _class = $(ele).parent().find("div.line-to-switch").attr("class")
+    var source_connection_status = false
+    
+    // user should be able to turn on/off scheduled_play switch anytime.
+    if(sourcename.indexOf("scheduled_play") > 0 && _class.indexOf("off") > 0){
+        source_connection_status = false
+    }else{
+        source_connection_status = true
+    }
+    
+    if(source_connection_status){
+        $.get("/Dashboard/switch-source/format/json/sourcename/"+sourcename+"/status/"+status, function(data){
+            status_span.html(data.status)
+        });
+    }else{
+        alert("The source is not connected to Airtime!")
+    }
+}
+
+function kickSource(ele){
+    
 }
 
 var stream_window = null;
@@ -375,8 +377,6 @@ function init() {
 
     setupQtip();
     
-    setSwitchListener();
-    
     $('.listen-control-button').click(function() {
         if (stream_window == null || stream_window.closed)
             stream_window=window.open(baseUrl+"Dashboard/stream-player", 'name', 'width=400,height=178');
diff --git a/python_apps/pypo/liquidsoap_scripts/ls_script.liq b/python_apps/pypo/liquidsoap_scripts/ls_script.liq
index d1fd9dd06..4a7a40d26 100644
--- a/python_apps/pypo/liquidsoap_scripts/ls_script.liq
+++ b/python_apps/pypo/liquidsoap_scripts/ls_script.liq
@@ -45,7 +45,7 @@ ignore(output.dummy(default, fallible=true))
 
 master_dj_enabled = ref false;
 live_dj_enabled = ref false;
-scheduled_play_enabled = ref true;
+scheduled_play_enabled = ref false;
 
 def make_master_dj_available()
         master_dj_enabled := true