[rhmessaging-commits] rhmessaging commits: r3210 - mgmt/trunk/cumin/python/cumin.

rhmessaging-commits at lists.jboss.org rhmessaging-commits at lists.jboss.org
Wed Mar 25 14:55:23 EDT 2009


Author: justi9
Date: 2009-03-25 14:55:22 -0400 (Wed, 25 Mar 2009)
New Revision: 3210

Modified:
   mgmt/trunk/cumin/python/cumin/__init__.py
   mgmt/trunk/cumin/python/cumin/binding.strings
   mgmt/trunk/cumin/python/cumin/broker.py
   mgmt/trunk/cumin/python/cumin/brokercluster.py
   mgmt/trunk/cumin/python/cumin/brokerlink.py
   mgmt/trunk/cumin/python/cumin/brokerlink.strings
   mgmt/trunk/cumin/python/cumin/charts.py
   mgmt/trunk/cumin/python/cumin/client.py
   mgmt/trunk/cumin/python/cumin/collector.py
   mgmt/trunk/cumin/python/cumin/collector.strings
   mgmt/trunk/cumin/python/cumin/demo.py
   mgmt/trunk/cumin/python/cumin/exchange.py
   mgmt/trunk/cumin/python/cumin/exchange.strings
   mgmt/trunk/cumin/python/cumin/job.py
   mgmt/trunk/cumin/python/cumin/job.strings
   mgmt/trunk/cumin/python/cumin/limits.py
   mgmt/trunk/cumin/python/cumin/limits.strings
   mgmt/trunk/cumin/python/cumin/model.py
   mgmt/trunk/cumin/python/cumin/negotiator.py
   mgmt/trunk/cumin/python/cumin/negotiator.strings
   mgmt/trunk/cumin/python/cumin/page.strings
   mgmt/trunk/cumin/python/cumin/parameters.py
   mgmt/trunk/cumin/python/cumin/pool.py
   mgmt/trunk/cumin/python/cumin/pool.strings
   mgmt/trunk/cumin/python/cumin/queue.py
   mgmt/trunk/cumin/python/cumin/queue.strings
   mgmt/trunk/cumin/python/cumin/quirk.py
   mgmt/trunk/cumin/python/cumin/realm.py
   mgmt/trunk/cumin/python/cumin/scheduler.py
   mgmt/trunk/cumin/python/cumin/scheduler.strings
   mgmt/trunk/cumin/python/cumin/slot.py
   mgmt/trunk/cumin/python/cumin/slot.strings
   mgmt/trunk/cumin/python/cumin/stat.py
   mgmt/trunk/cumin/python/cumin/stat.strings
   mgmt/trunk/cumin/python/cumin/submitter.py
   mgmt/trunk/cumin/python/cumin/submitter.strings
   mgmt/trunk/cumin/python/cumin/system.py
   mgmt/trunk/cumin/python/cumin/test.py
   mgmt/trunk/cumin/python/cumin/tools.py
   mgmt/trunk/cumin/python/cumin/user.strings
   mgmt/trunk/cumin/python/cumin/util.py
   mgmt/trunk/cumin/python/cumin/visualizations.py
   mgmt/trunk/cumin/python/cumin/visualizations.strings
   mgmt/trunk/cumin/python/cumin/widgets.py
   mgmt/trunk/cumin/python/cumin/widgets.strings
Log:
Whitespace!  And also some style fixups.



Modified: mgmt/trunk/cumin/python/cumin/__init__.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/__init__.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/__init__.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -174,7 +174,7 @@
         log.removeHandler(handler)
 
         self.init_logging()
-        
+
     def init_logging(self):
         enable_logging("mint", self.log_level, self.log_file)
         enable_logging("cumin", self.log_level, self.log_file)

Modified: mgmt/trunk/cumin/python/cumin/binding.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/binding.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/binding.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -1,136 +1,139 @@
-
 [ExchangeInput.name_html]
-		<td><input type="checkbox" 
-				id="{id}.{exchange_id}"
-      			name="{name_path}" value="{exchange_name}" size="15" 
-      			tabindex="100" {exchange_checked}
-      			{onclick} />
-      		<input type="hidden" 
-      			name="{exchange_type_path}" value="{exchange_type}" /></td>
-      	<td><label class="exchange_name" for="{id}.{exchange_id}">{exchange_fmt_name}</label></td>
-    	<td class="exchange_type">{exchange_type}</td>
+<td>
+  <input type="checkbox" id="{id}.{exchange_id}" name="{name_path}"
+         value="{exchange_name}" size="15" tabindex="100" {exchange_checked}
+         {onclick} />
+  <input type="hidden" name="{exchange_type_path}" value="{exchange_type}" />
+</td>
+<td><label class="exchange_name" for="{id}.{exchange_id}">{exchange_fmt_name}</label></td>
+<td class="exchange_type">{exchange_type}</td>
 
 [ExchangeInput.key_html]
-    	<td><input type="text" 
-      			name="{key_path}" id="{exchange_name}" 
-      			value="{key_value}" size="32" maxlength="256" tabindex="100" />
-      		{key_error}</td>
+<td>
+  <input type="text" name="{key_path}" id="{exchange_name}"
+         value="{key_value}" size="32" maxlength="256" tabindex="100" />
+  {key_error}
+</td>
 
 [DirectExchangeInput.html]
-	<tr>
-		{exchange_name_input}
-		{exchange_key_input}
-     </tr>
+<tr>
+  {exchange_name_input}
+  {exchange_key_input}
+</tr>
 
 [TopicExchangeInput.html]
-	<tr>
-		{exchange_name_input}
-		{exchange_key_input}
-     </tr>
+<tr>
+  {exchange_name_input}
+  {exchange_key_input}
+</tr>
 
 [FanoutExchangeInput.html]
-	<tr>
-		{exchange_name_input}
-		<td>&nbsp;</td>
-     </tr>
+<tr>
+  {exchange_name_input}
+  <td>&nbsp;</td>
+</tr>
 
 [XMLExchangeInput.html]
-	<tr>
-		{exchange_name_input}
-		{exchange_key_input}
-    </tr>
-    <tr id="{xml_extra}" class="{headers_class}"><td colspan="4"><table>
+<tr>
+  {exchange_name_input}
+  {exchange_key_input}
+</tr>
+<tr id="{xml_extra}" class="{headers_class}">
+  <td colspan="4"><table>
     <tr>
-      	<td>XQuery:</td>
-      	<td colspan="3"><textarea name="{xquery_path}" id="{exchange_name}"
-      		tabindex="100" rows="4" cols="40">{xquery_value}</textarea>{xquery_error}</td>
-     </tr></table></td></tr>
+      <td>XQuery:</td>
+      <td colspan="3"><textarea name="{xquery_path}" id="{exchange_name}" tabindex="100" rows="4" cols="40">{xquery_value}</textarea>{xquery_error}</td>
+     </tr>
+  </table></td>
+</tr>
 
 [HeadersExchangeInput.html]
-	<tr>
-		{exchange_name_input}
-		{exchange_key_input}
+<tr>
+  {exchange_name_input}
+  {exchange_key_input}
+</tr>
+<tr id="{headers_extra}" class="{headers_class}">
+  <td colspan="4"><table>
+    <tr>
+      <td>&nbsp;</td>
+      <td>x-match Type:</td>
+      <td colspan="2">
+        <input type="radio" id="headers.x-match.all" name="{x_match_path}" value="all" {all_checked}/>
+        <label for="headers.x-match.all">All</label>
+        <input type="radio" id="headers.x-match.any" name="{x_match_path}" value="any" {any_checked}/>
+        <label for="headers.x-match.any">Any</label>
+      </td>
     </tr>
-    <tr id="{headers_extra}" class="{headers_class}"><td colspan="4"><table>
- 	<tr>
- 		<td>&nbsp;</td>
-      	<td>x-match Type:</td>
-      	<td colspan="2"><input type="radio" id="headers.x-match.all" 
-      						name="{x_match_path}" value="all" {all_checked} /> 
-      						<label for="headers.x-match.all">All</label>
-						<input type="radio" id="headers.x-match.any" 
-      						name="{x_match_path}" value="any" {any_checked}/> 
-      						<label for="headers.x-match.any">Any</label>
-      	</td>
+    <tr>
+      <td>&nbsp;</td>
+      <td>Match Keys:</td>
+      <td colspan="2">
+        <table class="xmlExchange">
+          <thead>
+            <tr>
+              <th>Key</th><th>type, value</th>
+            </tr>
+          </thead>
+          <tbody>
+            <tr>
+              <td><input type="text" name="{mkey_path}.1" value="{mkey1_value}" tabindex="100" />{mkey1_error}</td>
+              <td><input type="text" name="{mkey_path}.1.nv" value="{mnv1_value}" tabindex="100" /></td>
+            </tr>
+            <tr>
+              <td><input type="text" name="{mkey_path}.2" value="{mkey2_value}" tabindex="100" />{mkey2_error}</td>
+              <td><input type="text" name="{mkey_path}.2.nv" value="{mnv2_value}" tabindex="100" /></td>
+            </tr>
+            <tr>
+              <td><input type="text" name="{mkey_path}.3" value="{mkey3_value}" tabindex="100" />{mkey3_error}</td>
+              <td><input type="text" name="{mkey_path}.3.nv" value="{mnv3_value}" tabindex="100" /></td>
+            </tr>
+          </tbody>
+        </table>
+      </td>
     </tr>
-    <tr>
- 		<td>&nbsp;</td>
-     	<td>Match Keys:</td>
-     	<td colspan="2">
-     		<table class="xmlExchange">
-			  <thead>
-     			<tr>
-     			<th>Key</th><th>type, value</th>
-     			</tr>
-     		  </thead>
-     		  <tbody>
-     		    <tr>
-     		    	<td><input type="text" name="{mkey_path}.1" value="{mkey1_value}" tabindex="100" />{mkey1_error}</td>
-     		    	<td><input type="text" name="{mkey_path}.1.nv" value="{mnv1_value}" tabindex="100" /></td>
-     		    </tr>
-     		    <tr>
-     		    	<td><input type="text" name="{mkey_path}.2" value="{mkey2_value}" tabindex="100" />{mkey2_error}</td>
-     		    	<td><input type="text" name="{mkey_path}.2.nv" value="{mnv2_value}" tabindex="100" /></td>
-     		    </tr>
-     		    <tr>
-     		    	<td><input type="text" name="{mkey_path}.3" value="{mkey3_value}" tabindex="100" />{mkey3_error}</td>
-     		    	<td><input type="text" name="{mkey_path}.3.nv" value="{mnv3_value}" tabindex="100" /></td>
-     		    </tr>
-     		  </tbody>
-     		  </table>
-     	</td>
-    </tr></table></td></tr>
-	  
+</table></td></tr>
+
 [ExchangeKeysField.css]
 td.exchange_type {
-	font-style: italic;
+    font-style: italic;
 }
 
 table.mobjects tr#headers_extra {
-  border-top: 0px;
+    border-top: 0px;
 }
 
 table.mobjects tr.initial_header_state {
-	display:none;
+    display:none;
 }
 
 table.xmlExchange {
-  border-collapse: collapse;
-  border: 1px dotted #ccc;
-  margin: 0;
+    border-collapse: collapse;
+    border: 1px dotted #ccc;
+    margin: 0;
 }
 
 table.xmlExchange tr {
-  border-top: 0px solid #fff;
+    border-top: 0px solid #fff;
 }
 
 table.mobjects label.exchange_name {
-	font-weight: bold;
+    font-weight: bold;
 }
 
 table.mobjects td.exchange_type, table.mobjects th.exchange_type {
-	font-style: italic;
+    font-style: italic;
 }
 
 [ExchangeKeysField.javascript]
 function toggle_row(chk, row_id) {
-	
-	var display = "none";
-	var headers_extra = document.getElementById(row_id);
-	if (chk.checked)
-		display = "table-row";
-		
-	headers_extra.style.display = display;
+    var display = "none";
+    var headers_extra = document.getElementById(row_id);
+
+    if (chk.checked) {
+        display = "table-row";
+    }
+
+    headers_extra.style.display = display;
 }
 
 [ExchangeKeysField.html]
@@ -138,21 +141,19 @@
   <div class="rfloat">{phase}</div>
   <div class="title">{title}</div>
   <div class="rclear">&nbsp;</div>
-  
-<div class="inputs">
-<table class="mobjects" id="exchange_types">
-  <thead>
-	<tr>
-		<th colspan="2"><label class="exchange_name">Exchange Name</label></th>
-		<th class="exchange_type">Exchange Type</th>
-		<th>Binding Key</th>
-	</tr>
-  </thead>
-  <tbody>
-  {exchanges}
-  </tbody>
-  
-</table>
+
+  <div class="inputs">
+    <table class="mobjects" id="exchange_types">
+      <thead>
+        <tr>
+          <th colspan="2"><label class="exchange_name">Exchange Name</label></th>
+          <th class="exchange_type">Exchange Type</th>
+          <th>Binding Key</th>
+        </tr>
+      </thead>
+      <tbody>
+        {exchanges}
+      </tbody>
+    </table>
+  </div>
 </div>
-</div>
-

Modified: mgmt/trunk/cumin/python/cumin/broker.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/broker.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/broker.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -306,7 +306,7 @@
                 acts = [(x.get_href(session, broker),
                          x.get_title(session),
                          x.get_enabled(session, broker))
-                        for x in cls.actions 
+                        for x in cls.actions
                         if x.navigable and not x.aggregate]
 
                 return acts

Modified: mgmt/trunk/cumin/python/cumin/brokercluster.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/brokercluster.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/brokercluster.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -17,7 +17,7 @@
         branch = session.branch()
         self.page.show_broker_cluster_add(branch)
         return branch.marshal()
-    
+
     def render_title(self, session, *args):
         return "Broker Clusters %s" % fmt_count(BrokerCluster.select().count())
 
@@ -34,7 +34,7 @@
 
     def render_item_status(self, session, cluster):
         writer = Writer()
-        
+
         for broker in sorted_by(cluster.brokers):
             writer.write(fmt_ostatus(broker))
 
@@ -121,11 +121,11 @@
         branch = session.branch()
         self.page.main.show(branch)
         self.page.set_redirect_url(session, branch.marshal())
-    
+
     def process_submit(self, session):
         cluster = BrokerCluster()
         self.process_cluster(session, cluster)
-    
+
 class BrokerClusterEdit(BrokerClusterForm, Frame):
     def get_args(self, session):
         return self.frame.get_args(session)

Modified: mgmt/trunk/cumin/python/cumin/brokerlink.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/brokerlink.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/brokerlink.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -41,7 +41,7 @@
 
         #col = self.ToPeerColumn(app, "to_peer")
         #self.add_column(col)
-        
+
         self.__close = self.Close(app, "close")
         self.add_child(self.__close)
 
@@ -65,7 +65,7 @@
 
     def disable_closed(self, session, data):
         return data["state"] == "Closed"
-        
+
     class AddressColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Address"
@@ -87,7 +87,7 @@
     class LastErrorColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Last Error"
-        
+
     class DurableColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Durable"
@@ -136,10 +136,10 @@
 
         col = self.KeyColumn(app, "key")
         self.add_column(col)
-        
+
         col = self.TagColumn(app, "tag")
         self.add_column(col)
-        
+
         col = self.ExcludesColumn(app, "excludes")
         self.add_column(col)
 
@@ -155,7 +155,7 @@
 
     def render_sql_where(self, session, link):
         return "where l.id = %(link_id)r and b.qmf_delete_time is null"
-    
+
     def get_sql_values(self, session, link):
         return {"link_id": link.id}
 
@@ -163,7 +163,7 @@
         branch = session.branch()
         self.frame.show_bridge_add(branch)
         return branch.marshal()
-        
+
     class SourceColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Source"
@@ -222,13 +222,13 @@
         remove = LinkRemove(app, "remove")
         self.add_mode(remove)
         self.set_remove_mode(remove)
-        
+
         self.__bridge_add = BridgeAdd(app, "bridgeadd")
         self.add_mode(self.__bridge_add)
-        
+
         self.__routes_close = PeerRouteSetClose(app, "routesclose")
         self.add_mode(self.__routes_close)
-        
+
     def render_title(self, session, peer):
         return super(PeerFrame, self).render_title(session, peer)
 
@@ -240,7 +240,7 @@
 
     def show_bridge_add(self, session):
         self.page.set_frame(session, self.__bridge_add)
-        return self.show_mode(session, self.__bridge_add) 
+        return self.show_mode(session, self.__bridge_add)
 
     def show_routes_close(self, session):
         self.page.set_frame(session, self.__routes_close)
@@ -273,11 +273,11 @@
         return "No, Cancel"
 
 class PeerStatus(CuminStatus):
-    
+
     def render_color(self, session, link):
         if link.statsCurr:
             return link.statsCurr.lastError and "red" or "green"
-    
+
     def render_peer_state(self, session, peer):
         if peer.statsCurr:
             return peer.statsCurr.state
@@ -346,14 +346,14 @@
         self.add_parameter(self.param)
 
         self.state = state
-        
+
     def do_get_items(self, session, *args):
         exchanges = list()
-        
+
         link = self.frame.frame.get_object(session)
         vhost = link.vhost
         sortedExchanges = sorted_by(vhost.exchanges)
-        
+
         for exchange in sortedExchanges:
             if ExchangeInfo.is_builtin(exchange) or \
                (not exchange._get_qmfDeleteTime() and \
@@ -362,7 +362,7 @@
                     if not self.param.get(session):
                         self.param.set(session, exchange.id)
                     exchanges.append(exchange)
-        
+
         return exchanges
 
     def render_item_value(self, session, exchange):
@@ -381,13 +381,13 @@
 
         self.state = ExchangeState(app, "phase")
         self.add_child(self.state)
-        
+
         self.__exchanges = ExchangeInputSet(app, "inputs", self.state)
         self.add_child(self.__exchanges)
-        
+
     def get(self, session):
         return self.__exchanges.get(session)
-    
+
     def render_title(self, session):
         return "Choose an Exchange"
 
@@ -405,10 +405,10 @@
 
         self.more = MoreFieldSet(app, "more")
         self.add_field(self.more)
-        
+
         self.help = self.BridgeAddHelpField(app, "help")
         self.more.add_field(self.help)
-        
+
         self.tag = TextField(app, "tag")
         self.tag.set_required(False)
         self.tag.set_title("Tag")
@@ -424,47 +424,47 @@
 
         self.sync = self.SyncField(app, "sync")
         self.more.add_field(self.sync)
-        
+
     def get_args(self, session):
         return self.frame.get_args(session)
-    
+
     def render_title(self, session, link):
         return "Add Route to '%s:%d'" % (link.host, link.port)
-    
+
     def process_display(self, session, *args):
         if not self.tag.get(session):
             self.tag.set(session, args[0].qmfBrokerId)
-        
+
         if not self.excludes.get(session):
             self.excludes.set(session, "%s:%s" % (args[0].host, args[0].port))
-            
+
         if not self.sync.get(session):
             self.sync.set(session, self.sync.get_default(session))
-            
+
     class SyncField(IntegerField):
         def render_title(self, session):
             return "Ack"
-        
+
         def render_field_help(self, session):
              return "Acknowledge transfers over the bridge in batches of N"
 
         def get_default(self, session):
             return 0
-        
+
     class DynamicField(TwoOptionRadioField):
         def render_title(self, session):
             return "Dynamic Route?"
-        
+
         def render_field_help(self, session):
             return "(Should the added route be dynamic)"
 
         def render_title_1(self, session):
             return "Dynamic"
-        
+
         def render_title_2(self, session):
             return "Not dynamic"
-        
-        
+
+
     class BridgeAddHelpField(FormField):
         pass
 
@@ -487,7 +487,7 @@
             durable = link.durable
             dynamic = self.dynamic.get(session) == "yes"
             sync = self.sync.get(session)
-            
+
             args = {"durable": durable,
                     "exchange": exchange.name,
                     "key": key,
@@ -496,12 +496,12 @@
                     "dynamic": dynamic,
                     "sync": sync
                     }
-            
+
             action = self.app.model.link.bridge
             action.invoke(link, args)
 
             self.process_cancel(session, link)
-            
+
 class BrokerLinkAdd(CuminFieldForm):
     def __init__(self, app, name, vhost):
         super(BrokerLinkAdd, self).__init__(app, name)
@@ -513,7 +513,7 @@
 
         self.more = self.ShowButton(app, "more")
         self.add_field(self.more)
-        
+
         self.port = self.PortField(app, "port")
         self.more.add_field(self.port)
 
@@ -525,10 +525,10 @@
 
         self.durable = self.DurableField(app, "durable")
         self.more.add_field(self.durable)
-        
+
         self.transport = self.TransportField(app, "transport")
         self.more.add_field(self.transport)
-                
+
     def render_title(self, session):
         vhost = self.vhost.get(session)
         name = self.app.model.broker.get_object_name(vhost.broker)
@@ -537,10 +537,10 @@
     class ShowButton(MoreFieldSet):
         def render_more_text(self, session):
             return "Show Optional Inputs..."
-        
+
         def render_less_text(self, session):
             return "Hide Optional Inputs..."
-    
+
     class Host(NameField):
         def render_title(self, session):
             return "Address"
@@ -548,13 +548,13 @@
     class PortField(StringField):
         def __init__(self, app, name):
             super(BrokerLinkAdd.PortField, self).__init__(app, name)
-            
+
             self.input.size = 5
             self.css_class = "compact first"
-            
+
         def render_title(self, session):
             return "Port"
-        
+
         def do_validate(self, session, errors):
             try:
                 port = self.get(session)
@@ -562,60 +562,60 @@
                     int(port)
             except:
                 errors.append(FormError("Port must be a number"))
-    
+
     class UsernameField(StringField):
         def render_title(self, session):
             return "Username"
 
         def render_form_field_class(self, session):
             return "compact"
-        
+
     class PassField(PasswordField):
         def render_title(self, session):
             return "Password"
-        
+
         def render_form_field_class(self, session):
             return "compact last"
-        
+
     class TransportField(RadioField):
         def __init__(self, app, name):
             super(BrokerLinkAdd.TransportField, self).__init__(app, name, None)
-    
+
             self.param = Parameter(app, "param")
             self.param.default = "tcp"
             self.add_parameter(self.param)
-    
+
             option = self.TCP(app, "tcp", self.param)
             self.add_option(option)
-            
+
             option = self.SSL(app, "ssl", self.param)
             self.add_option(option)
-            
+
             option = self.RDMA(app, "rdma", self.param)
             self.add_option(option)
-    
+
         def render_title(self, session):
             return "Transport-type"
-    
+
         def render_field_help(self, session):
             return "(Transport to use)"
-            
+
         class TCP(RadioFieldOption):
             def render_title(self, session):
                 return "tcp"
-    
+
         class SSL(RadioFieldOption):
             def render_title(self, session):
                 return "ssl"
-    
+
         class RDMA(RadioFieldOption):
             def render_title(self, session):
                 return "rdma"
-        
+
     class DurableField(TwoOptionRadioField):
         def render_title(self, session):
             return "Restore if broker restarts?"
-        
+
         def render_field_help(self, session):
             return "(Should the added configuration be durable)"
 
@@ -672,7 +672,7 @@
 
     def render_title(self, session):
         return "Close Broker Link"
-    
+
     def render_form_heading(self, session, *args):
         return "Close Link to"
 
@@ -695,12 +695,10 @@
     def render_title(self, session):
         link = self.parent.get_object(session)
         return "Remove Route from %s:%i" % (link.host, link.port)
-    
+
     def render_form_heading(self, session, *args):
         return "Remove Route"
 
     def render_item_content(self, session, id):
         bridge = Bridge.get(id)
         return "<td>%s</td><td>%s</td>" % (bridge.dest, bridge.key)
-
-       

Modified: mgmt/trunk/cumin/python/cumin/brokerlink.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/brokerlink.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/brokerlink.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -22,9 +22,8 @@
 
 [PeerSet.html]
 <form id="{id}" method="post" action="?">
-
   <ul class="actions">
-  	<li><a class="nav" href="{add_broker_link_url}">Add Broker Link</a></li>
+    <li><a class="nav" href="{add_broker_link_url}">Add Broker Link</a></li>
   </ul>
 
   <div class="sactions">
@@ -102,9 +101,8 @@
 
 [PeerRouteSet.html]
 <form id="{id}" method="post" action="?">
-
   <ul class="actions">
-  	<li><a class="nav" href="{add_bridge_url}">Add Route</a></li>
+    <li><a class="nav" href="{add_bridge_url}">Add Route</a></li>
   </ul>
 
   <div class="sactions">
@@ -142,15 +140,15 @@
   </div>
   <div class="body">
     <span class="legend">{form_heading}</span>
-	  <table class="mobjects">
-	    <thead>
-	      <tr>
-	      	<th>Exchange</th>
-	      	<th>Key</th>
-	      </tr>
-	    </thead>
-	    <tbody>{items}</tbody>
-	  </table>
+          <table class="mobjects">
+            <thead>
+              <tr>
+                <th>Exchange</th>
+                <th>Key</th>
+              </tr>
+            </thead>
+            <tbody>{items}</tbody>
+          </table>
     {hidden_inputs}
   </div>
   <div class="foot">
@@ -168,27 +166,27 @@
 
 [BridgeAddHelpField.css]
 div#bridge_add_help span.tag1 {
-	color:red;
+        color:red;
 }
 div#bridge_add_help span.tag2 {
-	color:green;
+        color:green;
 }
 div#bridge_add_help p.example {
-	font-size: 0.9em;
-	color: #444444;
+        font-size: 0.9em;
+        color: #444444;
 }
 
 
 [BridgeAddHelpField.html]
 <div id="bridge_add_help">
-	<p>The <strong>Tag</strong> and <strong>Excludes</strong> are used to prevent a message from routing back 
-	to the source broker and causing an infinite loop.</p>
-	<p>Enter a short <strong>tag</strong> that will be associated with the source exchange. 
-	Then <strong>exclude</strong> any tags that were used for the destination exchanges.</p>
-	<p class="example">
-		<em>broker1</em> &lt;==&gt; <em>broker2</em> tag: <span class="tag2">tag2</span> excludes: <span class="tag1">tag1</span><br/>
-		<em>broker2</em> &lt;==&gt; <em>broker1</em> tag: <span class="tag1">tag1</span> excludes: <span class="tag2">tag2</span>
-	</p>
+  <p>The <strong>Tag</strong> and <strong>Excludes</strong> are used to prevent a message from routing back
+    to the source broker and causing an infinite loop.</p>
+  <p>Enter a short <strong>tag</strong> that will be associated with the source exchange.
+    Then <strong>exclude</strong> any tags that were used for the destination exchanges.</p>
+  <p class="example">
+    <em>broker1</em> &lt;==&gt; <em>broker2</em> tag: <span class="tag2">tag2</span> excludes: <span class="tag1">tag1</span><br/>
+    <em>broker2</em> &lt;==&gt; <em>broker1</em> tag: <span class="tag1">tag1</span> excludes: <span class="tag2">tag2</span>
+  </p>
 </div>
 
 [PeerStatus.html]

Modified: mgmt/trunk/cumin/python/cumin/charts.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/charts.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/charts.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -32,7 +32,7 @@
         shadox = (102 / 128.0) * width
         shadoy = (102 / 128.0) * width
         arc = 0.5 * width
-        
+
         surface = ImageSurface(FORMAT_ARGB32, width, height)
         cr = Context(surface)
         cr.set_line_width(1)
@@ -41,10 +41,10 @@
         radial.add_color_stop_rgba(0,  1, 1, 1, 1)
         radial.add_color_stop_rgb(1, *interior)
         cr.set_source(radial)
-        cr.arc(arc, arc, arc, 0, 2.0 * pi)        
+        cr.arc(arc, arc, arc, 0, 2.0 * pi)
         cr.fill()
         return surface
-    
+
     def plot_slots(self, slots, zl, zx, zy):
         count = len(slots)
         slot_size = self.slot_size(count, zl)
@@ -76,14 +76,14 @@
 
             # draw dots if they are big enough
             if slot_size >= self.min_sphere_size:
-                radial = RadialGradient(x + pnumbx, 
-                            y + pnumby, 
-                            pnumbr, x + shadox, 
+                radial = RadialGradient(x + pnumbx,
+                            y + pnumby,
+                            pnumbr, x + shadox,
                             y + shadoy, slot_size)
                 radial.add_color_stop_rgba(0,  1, 1, 1, 1)
                 radial.add_color_stop_rgb(1, *interior)
                 cr.set_source(radial)
-                cr.arc(x + arc, y + arc, arc, 0, 2.0 * pi)        
+                cr.arc(x + arc, y + arc, arc, 0, 2.0 * pi)
                 cr.fill()
             else:
                 # just draw squares
@@ -122,7 +122,7 @@
             size = 2
         if size > self.max_size * zoom:
             size = self.max_size * zoom
-        
+
         #if size * cols < self.width:
         #    if size < self.max_size:
         #        size = size + 1
@@ -135,7 +135,7 @@
         #    self.height = self.max_height
         self.cols = cols
         return size
-        
+
     def write(self, writer):
         self.surface.write_to_png(writer)
 
@@ -254,7 +254,7 @@
                     svalue = "%ik" % int(round(value / 1000.0, -1))
                 else:
                     svalue = str(value)
-                
+
                 cr.show_text(svalue)
 
         cr.stroke()

Modified: mgmt/trunk/cumin/python/cumin/client.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/client.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/client.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -27,13 +27,13 @@
 
         col = self.SystemConnectionColumn(app, "sysconn")
         self.add_column(col)
-        
+
         col = self.AuthIdentityColumn(app, "authid")
         self.add_column(col)
-        
+
         col = self.FedLinkColumn(app, "fedlink")
         self.add_column(col)
-        
+
         col = self.SentColumn(app, "sent")
         col.alignment = "right"
         self.add_column(col)
@@ -93,24 +93,24 @@
             href = self.frame.connection.get_href(session, conn)
             return fmt_link(href, fmt_shorten(data["addr"]))
 
-    class SystemConnectionColumn(SqlTableColumn): 
+    class SystemConnectionColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Connect Type"
-    
+
         def render_content(self, session, data):
             if data['sysconn']:
                 return "System"
             else:
                 return "Client"
-    
+
     class AuthIdentityColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Auth Id"
-    
+
     class FedLinkColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Fed Link"
-    
+
         def render_content(self, session, data):
             if data['fedlink']:
                 return "Yes"
@@ -229,13 +229,13 @@
 class ConnectionStatus(CuminStatus):
     def render_frames_from(self, session, conn):
         return self.app.model.connection.framesFromClient.rate_html(conn)
-        
+
     def render_frames_to(self, session, conn):
         return self.app.model.connection.framesToClient.rate_html(conn)
 
     def render_bytes_from(self, session, conn):
         return self.app.model.connection.bytesFromClient.rate_html(conn)
-        
+
     def render_bytes_to(self, session, conn):
         return self.app.model.connection.bytesToClient.rate_html(conn)
 
@@ -245,7 +245,7 @@
 
         status = ConnectionStatus(app, "status")
         self.add_child(status)
-        
+
         self.__tabs = TabbedModeSet(app, "tabs")
         self.add_child(self.__tabs)
 
@@ -300,7 +300,7 @@
 
     def render_title(self, session):
         return "Detach Sessions"
-    
+
     def render_item_content(self, session, id):
         return "Detach Session '%s'" % Session.get(id).name
 
@@ -318,7 +318,7 @@
 
     def render_title(self, session):
         return "Close Sessions"
-    
+
     def render_item_content(self, session, id):
         return "Close Session '%s'" % Session.get(id).name
 
@@ -351,7 +351,7 @@
 
     def get_args(self, session):
         return self.frame.get_args(session)
-        
+
     def render_title(self, session, conn):
         return "Sessions %s" % fmt_count(conn.sessions.count())
 

Modified: mgmt/trunk/cumin/python/cumin/collector.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/collector.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/collector.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -75,28 +75,28 @@
         def process_submit(self, session):
             ids = self.parent.ids.get(session)
             self.parent.ids.clear(session)
-    
+
             branch = session.branch()
             frame = self.frame.show_colls_start(branch)
             frame.ids.set(branch, ids)
             self.page.set_redirect_url(session, branch.marshal())
-            
+
         def render_content(self, session):
             return "Start"
-        
+
     class StopButton(FormButton):
         def process_submit(self, session):
             ids = self.parent.ids.get(session)
             self.parent.ids.clear(session)
-    
+
             branch = session.branch()
             frame = self.frame.show_colls_stop(branch)
             frame.ids.set(branch, ids)
             self.page.set_redirect_url(session, branch.marshal())
-            
+
         def render_content(self, session):
             return "Stop"
-        
+
 class CollectorFrame(CuminFrame):
     def __init__(self, app, name):
         super(CollectorFrame, self).__init__(app, name)
@@ -128,11 +128,11 @@
     class CollectorStatus(CuminStatus):
         def render_title(self, session, object):
             return "Collector Status"
-            
+
 class CollectorStart(CuminBulkActionForm):
     def render_title(self, session, *args):
         return "Start Collector"
-    
+
     def render_form_heading(self, session, *args):
         return ""
 
@@ -148,7 +148,7 @@
 class CollectorStop(CuminBulkActionForm):
     def render_title(self, session, *args):
         return "Stop Collector"
-    
+
     def render_form_heading(self, session, *args):
         return ""
 

Modified: mgmt/trunk/cumin/python/cumin/collector.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/collector.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/collector.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -35,24 +35,23 @@
 
 [CollectorSet.html]
 <form id="{id}" method="post" action="?">
-	
-	  <div class="sactions">
-	    <h2>Act on Selected Collectors:</h2>
-	    {start} {stop}
-	  </div>
-	
-	<table class="mobjects">
-	  <thead>
-	    <tr>
-	      <th class="setnav" colspan="{column_count}">
-	        <div class="rfloat">{page}</div>
-	        {count}
-	      </th>
-	    </tr>
-	    <tr>{headers}</tr>
-	  </thead>
-	  <tbody>{items}</tbody>
-	</table>
-	<div>{hidden_inputs}</div>
-</form>
+  <div class="sactions">
+    <h2>Act on Selected Collectors:</h2>
+    {start} {stop}
+  </div>
 
+  <table class="mobjects">
+    <thead>
+      <tr>
+	<th class="setnav" colspan="{column_count}">
+	  <div class="rfloat">{page}</div>
+	  {count}
+	</th>
+      </tr>
+      <tr>{headers}</tr>
+    </thead>
+    <tbody>{items}</tbody>
+  </table>
+
+  <div>{hidden_inputs}</div>
+</form>

Modified: mgmt/trunk/cumin/python/cumin/demo.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/demo.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/demo.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -96,7 +96,7 @@
                     measure.add_value(value > 0 and value or 0)
             else:
                 measure.add_value(measure.get_value())
-                
+
     def frob_errors(self, errors):
         if random() < 0.005:
             errors.append(object())
@@ -114,10 +114,10 @@
 
                 for vhost in broker.virtual_host_items():
                     self.frob(vhost)
-                    
+
                     for exchange in vhost.exchange_items():
                         self.frob(exchange)
-                        
+
                         for binding in exchange.binding_items():
                             self.frob(binding)
 
@@ -135,7 +135,7 @@
 
                         for session in conn.session_items():
                             self.frob(session)
-                        
+
 if __name__ == "__main__":
     import sys
 

Modified: mgmt/trunk/cumin/python/cumin/exchange.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/exchange.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/exchange.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -15,7 +15,7 @@
 class ExchangeInputSet(RadioInputSet):
     def __init__(self, app, name):
         super(ExchangeInputSet, self).__init__(app, name)
-        
+
         param = ExchangeParameter(app, "param")
         self.add_parameter(param)
         self.set_parameter(param)
@@ -76,7 +76,7 @@
 
     def disable_exchange(self, session, data):
         return data["name"] in ExchangeInfo.get_builtins()
-        
+
     def render_add_exchange_url(self, session):
         branch = session.branch()
         self.frame.exchange_add.show(branch)
@@ -85,7 +85,7 @@
     def render_title(self, session):
         vhost = self.vhost.get(session)
         return "Exchanges %s" % fmt_count(vhost.exchanges.count())
-    
+
     def render_sql_where(self, session):
         vhost = self.vhost.get(session)
 
@@ -107,7 +107,7 @@
             branch = session.branch()
             self.frame.exchanges_remove.show(branch).ids.set(branch, ids)
             self.page.set_redirect_url(session, branch.marshal())
-            
+
         def render_content(self, session):
             return "Remove"
 
@@ -179,7 +179,7 @@
         reg = self.frame.get_object(session)
         action = self.app.model.exchange.remove
         action.invoke(exchange)
- 
+
     def render_title(self, session):
         return "Remove Exchanges"
 
@@ -196,7 +196,7 @@
         self.view = ExchangeView(app, "view")
         self.add_mode(self.view)
         self.set_view_mode(self.view)
-        
+
         self.remove = ExchangeRemove(app, "remove")
         self.add_mode(self.remove)
         self.set_remove_mode(self.remove)
@@ -294,9 +294,9 @@
 
         self.__remove = self.Remove(app, "remove")
         self.add_child(self.__remove)
-        
+
         self.set_default_column_name("q_id")
-    
+
     def get_visible_columns(self, session):
         return self.get_request_visible_columns(session, ["q_id"])
 
@@ -317,7 +317,7 @@
 
             href = self.page.main.broker.bindings_remove.get_href(session, ids)
             self.page.set_redirect_url(session, href)
-            
+
         def render_content(self, session):
             return "Remove"
 
@@ -329,7 +329,7 @@
 
     def render_title(self, session):
         return "Remove Binding"
-    
+
     def render_form_heading(self, session, *args):
         return "Remove Binding between:"
 
@@ -349,26 +349,26 @@
 
         self.exchange_name = ExchangeNameField(app, "exchange_name")
         self.add_field(self.exchange_name)
- 
+
         self.exchange_type = self.ExchangeTypeField(app, "exchange_type")
         self.add_field(self.exchange_type)
-        
+
         self.more = MoreFieldSet(app, "more")
         self.add_field(self.more)
-        
+
         self.durable = self.ExchangeDurabilityField(app, "durable")
         self.more.add_field(self.durable)
-        
+
         self.sequence = self.SequenceField(app, "sequence")
         self.more.add_field(self.sequence)
-        
+
         self.ive = self.IVEField(app, "ive")
         self.more.add_field(self.ive)
-        
+
     class SequenceField(TwoOptionRadioField):
         def render_title(self, session):
             return "Insert Sequence?"
-        
+
         def render_field_help(self, session):
             return "(Exchange will insert a 'qpid.msg_sequence' field in the message header)"
 
@@ -381,7 +381,7 @@
     class IVEField(TwoOptionRadioField):
         def render_title(self, session):
             return "Initial Value Exchange?"
-        
+
         def render_field_help(self, session):
             return "(Exchange will behave as an 'initial-value-exchange', keeping a reference to the last message forwarded and enqueuing that message to newly bound queues)"
 
@@ -394,7 +394,7 @@
     class ExchangeDurabilityField(TwoOptionRadioField):
         def render_title(self, session):
             return "Durable?"
-        
+
         def render_field_help(self, session):
             return "(Queue is durable)"
 
@@ -407,67 +407,67 @@
     class ExchangeTypeField(RadioField):
         def __init__(self, app, name):
             super(ExchangeForm.ExchangeTypeField, self).__init__(app, name, None)
-    
+
             self.param = Parameter(app, "param")
             self.param.default = "direct"
             self.add_parameter(self.param)
-    
+
             option = self.Direct(app, "direct", self.param)
             self.add_option(option)
 
             option = self.Topic(app, "topic", self.param)
             self.add_option(option)
-    
+
             option = self.Fanout(app, "fanout", self.param)
             self.add_option(option)
-            
+
             option = self.Headers(app, "headers", self.param)
             self.add_option(option)
-            
+
             option = self.XML(app, "xml", self.param)
             self.add_option(option)
-        
+
         def render_title(self, session):
             return "Exchange Type"
-    
+
         def render_field_help(self, session):
             return "(Type of exchange to add)"
-            
+
         class Direct(RadioFieldOption):
             def render_value(self, session):
                 return "direct"
-    
+
             def render_title(self, session):
                 return "<em>Direct:</em> Route messages to queues by queue name"
-    
+
         class Topic(RadioFieldOption):
             def render_value(self, session):
                 return "topic"
-    
+
             def render_title(self, session):
                 return "<em>Topic:</em> Route messages to queues by topic keyword match"
-    
+
         class Fanout(RadioFieldOption):
             def render_value(self, session):
                 return "fanout"
-    
+
             def render_title(self, session):
                 return "<em>Fan Out:</em> Route message to all queues attached to this exchange"
-    
+
         class Headers(RadioFieldOption):
             def render_value(self, session):
                 return "headers"
-    
+
             def render_title(self, session):
                 return "<em>Headers:</em> Route message to queues based on content of the message header"
-    
+
         class XML(RadioFieldOption):
             def render_value(self, session):
                 return "xml"
-    
+
             def render_title(self, session):
                 return "<em>XML:</em> Route message to queues based on XML content of the message"
-    
+
 class ExchangeAdd(ExchangeForm):
     def process_cancel(self, session):
         branch = session.branch()

Modified: mgmt/trunk/cumin/python/cumin/exchange.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/exchange.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/exchange.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -48,32 +48,32 @@
 
 [ExchangeSet.html]
 <form id="{id}" method="post" action="?">
+  <ul class="actions">
+    <li><a class="nav" href="{add_exchange_url}">Add New Exchange</a></li>
+  </ul>
 
-	<ul class="actions">
-		<li><a class="nav" href="{add_exchange_url}">Add New Exchange</a></li>
-	 </ul>
-	 
-	<div class="rfloat">{phase}</div>
-	{unit}
-	
-	  <div class="sactions">
-	    <h2>Act on Selected Exchanges:</h2>
-	    {remove}
-	  </div>
-	
-	<table class="mobjects">
-	  <thead>
-	    <tr>
-	      <th class="setnav" colspan="{column_count}">
-	        <div class="rfloat">{page}</div>
-	        {count}
-	      </th>
-	    </tr>
-	    <tr>{headers}</tr>
-	  </thead>
-	  <tbody>{items}</tbody>
-	</table>
-	<div>{hidden_inputs}</div>
+  <div class="rfloat">{phase}</div>
+  {unit}
+
+    <div class="sactions">
+      <h2>Act on Selected Exchanges:</h2>
+      {remove}
+    </div>
+
+    <table class="mobjects">
+      <thead>
+        <tr>
+          <th class="setnav" colspan="{column_count}">
+            <div class="rfloat">{page}</div>
+            {count}
+          </th>
+        </tr>
+        <tr>{headers}</tr>
+      </thead>
+      <tbody>{items}</tbody>
+    </table>
+
+  <div>{hidden_inputs}</div>
 </form>
 
 [ExchangeSet.item_html]
@@ -143,27 +143,27 @@
 [ExchangeBindingSet.html]
 <form id="{id}" method="post" action="?">
 
-	<div class="rfloat">{phase}</div>
+        <div class="rfloat">{phase}</div>
     <ul class="radiotabs"><li>&nbsp;</li></ul>
-	
-	  <div class="sactions">
-	    <h2>Act on Selected Bindings:</h2>
-	    {remove}
-	  </div>
-	
-	<table class="mobjects">
-	  <thead>
-	    <tr>
-	      <th class="setnav" colspan="{column_count}">
-	        <div class="rfloat">{page}</div>
-	        {count}
-	      </th>
-	    </tr>
-	    <tr>{headers}</tr>
-	  </thead>
-	  <tbody>{items}</tbody>
-	</table>
-	<div>{hidden_inputs}</div>
+
+          <div class="sactions">
+            <h2>Act on Selected Bindings:</h2>
+            {remove}
+          </div>
+
+        <table class="mobjects">
+          <thead>
+            <tr>
+              <th class="setnav" colspan="{column_count}">
+                <div class="rfloat">{page}</div>
+                {count}
+              </th>
+            </tr>
+            <tr>{headers}</tr>
+          </thead>
+          <tbody>{items}</tbody>
+        </table>
+        <div>{hidden_inputs}</div>
 </form>
 
 [ExchangeBindingSet.item_html]

Modified: mgmt/trunk/cumin/python/cumin/job.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/job.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/job.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -26,11 +26,11 @@
         col = self.CustomIdColumn(app, "custom_id")
         self.add_column(col)
         self.set_default_column(col)
-        
+
         col = self.GlobalJobIdColumn(app, "global_job_id")
         col.visible = False
         self.add_column(col)
-        
+
         col = self.CommandColumn(app, "cmd")
         self.add_column(col)
 
@@ -50,31 +50,31 @@
         col.alignment = "right"
         col.visible = False
         self.add_column(col)
-        
+
         col = self.ConcurrencyLimitsColumn(app, "concurrency_limits")
         #col.visible = False
         self.add_column(col)
-        
+
         col = self.CustomGroupColumn(app, "custom_group")
         col.visible = False
         self.add_column(col)
-        
+
         col = self.CustomPriorityColumn(app, "custom_priority")
         col.visible = False
         self.add_column(col)
-        
+
         col = self.StatusColumn(app, "job_status")
         self.add_column(col)
 
         col = self.TitleColumn(app, "title")
         col.visible = False
         self.add_column(col)
-        
+
         col = self.ArgsColumn(app, "args")
         col.alignment = "right"
         col.visible = False
         self.add_column(col)
-        
+
         self.phase = JobStatusSwitch(app, "phase")
         self.add_child(self.phase)
 
@@ -83,7 +83,7 @@
 
     def get_phase_sql(self, session, phase=None):
         return self.phase.get_sql_constraint(session, phase)
-    
+
     def get_phase_title(self, session):
         state = self.phase.get(session)
         return self.phase.get_title(state)
@@ -102,19 +102,19 @@
     class ArgsColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Arguments"
-        
+
     class ClusterIdColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Cluster Id"
-        
+
     class ConcurrencyLimitsColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Limits"
-        
+
     class CustomGroupColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Job Group"
-        
+
         def render_content(self, session, data):
             name = data[self.name]
 
@@ -122,11 +122,11 @@
                 group = Identifiable(name)
                 href = self.page.main.pool.job_group.get_href(session, group)
                 return fmt_link(href, fmt_shorten(name, 12, 3))
-            
+
     class CustomIdColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "ID"
-        
+
         def render_content(self, session, data):
             id = data[self.name]
 
@@ -138,11 +138,11 @@
     class CustomPriorityColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Custom Priority"
-        
+
     class GlobalJobIdColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Global Job Id"
-        
+
         def render_content(self, session, data):
             id = data["id"]
 
@@ -151,23 +151,23 @@
                 href = self.frame.job.get_href(session, job)
                 content = fmt_shorten(data[self.name], 12, 3)
                 return fmt_link(href, content)
-            
+
     class StatusColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Status"
-        
+
         def render_content(self, session, data):
             stat = data["job_status"]
-            return JobStatusInfo.get_status_string(stat)            
-            
+            return JobStatusInfo.get_status_string(stat)
+
     class AccountingGroupColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Accounting Group"
-        
+
     class SubmitterColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Submitter"
-        
+
         def render_content(self, session, data):
             name = data["submitter"]
 
@@ -175,11 +175,11 @@
                 sub = Identifiable(data["submitter_id"])
                 href = self.page.main.pool.submitter.get_href(session, sub)
                 return fmt_link(href, fmt_shorten(name))
-            
+
     class SchedulerColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Scheduler"
-        
+
         def render_content(self, session, data):
             name = data["scheduler"]
 
@@ -191,7 +191,7 @@
     class CommandColumn(ItemTableColumn):
         def render_title(self, session, data):
             return "Command"
-        
+
         def render_content(self, session, data):
             return fmt_shorten(data[self.name], 0, 16)
 
@@ -237,7 +237,7 @@
 class JobTab(JobSet):
     def __init__(self, app, name):
         super(JobTab, self).__init__(app, name)
-        
+
         self.__remove = JobRemoveButton(app, "remove")
         self.add_child(self.__remove)
 
@@ -261,22 +261,22 @@
                 try:
                     first = rows[0]
                     job = Identifiable(first["id"])
-                    href = self.app.main_page.main.pool.job.get_href(session, job)                    
+                    href = self.app.main_page.main.pool.job.get_href(session, job)
                     self.page.set_redirect_url(session, href)
                 except:
                     self.job_search.set_not_found(session, search_term)
             else:
                 self.job_search.set_not_found(session, search_term)
-    
+
             self.job_search.set(session, None)
 
     def render_find_sql_where(self, session, *args):
         return "j.custom_id = %(custom_id)s"
-    
+
     def get_find_sql_values(self, session, pool):
         return {"custom_id": self.job_search.get(session)}
         #return {"custom_id": self.job_search.get(session), "pool": pool.id}
-    
+
     def get_full_item_count(self, session, *args):
         # request item count will phase=="a"
         new_args = (args[0], "a")
@@ -294,39 +294,39 @@
 
     class JobSearch(StringInput):
         """ displays the input box and button used to search for job id """
-        
+
         def __init__(self, app, name):
             super(JobTab.JobSearch, self).__init__(app, name)
 
             self.__go = self.JobSearchButton(app, "go")
             self.add_child(self.__go)
-            
+
             self.not_found = Attribute(app, "error")
             self.add_attribute(self.not_found)
 
         def set_not_found(self, session, value):
             self.not_found.set(session, value)
-        
+
         def render_search_prompt(self, session):
             not_found = self.not_found.get(session)
             return not_found and "%s Not Found" % escape_entity(not_found) or self.render_search_default_prompt(session)
-        
+
         def render_search_default_prompt(self, session):
             return "Enter Job ID"
-        
+
         def render_search_class(self, session):
             return self.not_found.get(session) and "search_error" or " "
 
         def find_job(self, session):
             self.parent.find_job(session)
-    
+
         class JobSearchButton(FormButton):
             def process_submit(self, session):
                 self.parent.find_job(session)
-    
+
             def render_content(self, session):
                 return "Go"
-        
+
 from system import SystemFrame, SystemSet
 
 class JobGroupFrame(CuminFrame):
@@ -379,14 +379,14 @@
 
     def render_title(self, session):
         return "Statistics"
-    
+
 class JobGroupStatSet(StatSet):
     def __init__(self, app, name, category):
         super(JobGroupStatSet, self).__init__(app, name, category)
-        
+
         self.jobs = Attribute(app, "jobs")
         self.add_attribute(self.jobs)
-        
+
     def process(self, session):
         group = self.frame.get_args(session)[0]
         if group:
@@ -394,7 +394,7 @@
             value = Job.select(where_group).count()
             self.jobs.set(session, value)
         super(JobGroupStatSet, self).process(session)
-        
+
     def render_rate_text(self, session, args):
         return "Percentage"
 
@@ -413,7 +413,7 @@
 
     def get_value(self, group, state):
         where_group = "custom_group = '%s' \
-            and job_status = %i" % (group.get_id(), 
+            and job_status = %i" % (group.get_id(),
                                     JobStatusInfo.get_status_int(state))
         return Job.select(where_group).count()
 
@@ -427,7 +427,7 @@
             value = self.get_value(group, state)
         percent = (value*1.0) / (jobs*1.0) * 100.0
         return jobs and "%2.1f" % percent or "-"
-    
+
 class JobRemoveButton(FormButton):
     def process_submit(self, session):
         ids = self.parent.ids.get(session)
@@ -435,10 +435,10 @@
 
         href = self.frame.jobs_remove.get_href(session, ids)
         self.page.set_redirect_url(session, href)
-        
+
     def render_content(self, session):
         return "Remove"
-    
+
     def render_disabled_attr(self, session, *args):
         phase = self.parent.phase.get(session)
         return phase == "d" and "disabled=\"disabled\"" or None
@@ -454,10 +454,10 @@
 
         href = self.frame.jobs_hold.get_href(session, ids)
         self.page.set_redirect_url(session, href)
-        
+
     def render_content(self, session):
         return "Hold"
-    
+
     def render_disabled_attr(self, session, *args):
         phase = self.parent.phase.get(session)
         return (phase == "h" or phase == "d") and "disabled=\"disabled\"" or None
@@ -473,10 +473,10 @@
 
         href = self.frame.jobs_release.get_href(session, ids)
         self.page.set_redirect_url(session, href)
-        
+
     def render_content(self, session):
         return "Release"
-    
+
     def render_disabled_attr(self, session, *args):
         phase = self.parent.phase.get(session)
         return (phase == "r" or phase == "d") and "disabled=\"disabled\"" or None
@@ -488,7 +488,7 @@
 class JobGroupJobSet(JobTab):
     def __init__(self, app, name):
         super(JobGroupJobSet, self).__init__(app, name)
-        
+
         self.__remove = JobRemoveButton(app, "remove")
         self.add_child(self.__remove)
 
@@ -500,7 +500,7 @@
 
     def get_visible_columns(self, session):
         return self.get_request_visible_columns(session, ["scheduler", "submitter"])
-        
+
     def render_title(self, session, group):
         where_group = "custom_group = '%s'" % group.get_id()
         return "Jobs %s" % fmt_count(Job.select(where_group).count())
@@ -553,20 +553,20 @@
 
         self.__edit_ads = JobAdsEditor(app, "editads")
         self.add_mode(self.__edit_ads)
-        
+
         self.__system = SystemFrame(app, "system")
         self.add_mode(self.__system)
 
     def show_ads_edit(self, session):
         self.page.set_frame(session, self.__edit_ads)
-        return self.show_mode(session, self.__edit_ads) 
-    
+        return self.show_mode(session, self.__edit_ads)
+
     def show_job_group(self, session, jobgroup):
         self.__job.set_object(session, jobgroup)
         self.page.set_frame(session, self.__job)
         self.__job.set_switch(session, "group")
         return self.show_mode(session, self.__job)
-    
+
     def show_system(self, session, system):
         frame = self.show_mode(session, self.__system)
         frame.set_object(session, system)
@@ -616,7 +616,7 @@
                       3: "string"}
     def get_args(self, session):
         return self.frame.get_args(session)
-           
+
     def do_get_items(self, session, job):
         items = self.items.get(session)
         if not items:
@@ -629,27 +629,27 @@
     def get_raw_ads(self, session, job):
         action = self.app.model.job.getad
         return action.do_invoke(job)
-    
+
     def gen_items(self, session, job):
         job_ads = self.get_raw_ads(session, job)
-        
+
         cls = self.app.model.get_class_by_object(job)
         return [self.gen_item(x, job_ads[x]["VALUE"], cls, dtype=self.types[job_ads[x]["TYPE"]]) for x in job_ads]
         # list of dictionaries
         # each disctionary has:
         # name:, value:, type: [, error:] [, property:] [,path:]
         #return [self.gen_item(x, job_ads[x], cls) for x in job_ads]
-#       
+#
 
     def gen_item(self, name, value, cls, path=None, dtype=None, error=None, orig=None):
         """ Generate a dict with name, value, type, error, path, property, orig
-        
+
             This is called with raw GetAd data and with processed data from
             a form submit. With raw data, only the name and value will be present.
-            With form data, we might have a path, dtype, or error. dtype is the 
+            With form data, we might have a path, dtype, or error. dtype is the
             data type that was remembered from the raw data.
         """
-            
+
         idict = dict()
         idict["name"] = name
         idict["value"] = value
@@ -661,28 +661,28 @@
             idict["orig"] = orig
         if error:
             if "error" in error:
-                idict["error"] = error["error"] 
+                idict["error"] = error["error"]
 
         if name in cls.ad_properties_by_name:
             idict["property"] = cls.ad_properties_by_name[name]
         if path:
             idict["path"] = path
         return idict
-    
+
     def strip_string_quotes(self, value):
         dvalue = value
         if value:
             if value[:1] == "\"" and value[-1:] ==  "\"":
                 dvalue = value[1:-1]
         return dvalue
-        
+
 class JobPropertyRenderer(TemplateRenderer):
     def render_title(self, session, item):
         title = item["name"]
         if "property" in item:
             property = item["property"]
             if property.title:
-                title = property.get_title(session) 
+                title = property.get_title(session)
         return escape_amp(title)
 
     def render_value(self, session, item):
@@ -693,7 +693,7 @@
                 value = property.renderer(session, value)
         ret = escape_entity(str(value))
         return self.insert_breaks(ret)
-                
+
     def insert_breaks(self, value):
         subwords = list()
         snippets = parse(value, begin_delim="&", end_delim=";")
@@ -702,7 +702,7 @@
                 subwords.append(snippet[:40])
                 snippet = snippet[40:]
             subwords.append(snippet)
-        
+
         return "&#8203;".join(subwords)
 
     def render_inline_help(self, session, item):
@@ -719,7 +719,7 @@
 
     def get_args(self, session):
         return self.frame.get_args(session)
-        
+
     def render_title(self, session, job):
         return "Attributes"
 
@@ -737,9 +737,9 @@
                     item_group = "Other"
                 if item_group == group:
                     group_items.append(item)
-                    
+
         return group_items
-    
+
     def render_properties(self, session, *args):
         items = self.do_get_items(session, *args)
         writer = Writer()
@@ -763,7 +763,7 @@
 
     def render_group_name(self, session, args):
         return args[1]
-        
+
 class JobAdsEditor(CuminForm, JobAdsViewer):
     def __init__(self, app, name):
         super(JobAdsEditor, self).__init__(app, name)
@@ -780,15 +780,15 @@
         cls = self.app.model.get_class_by_object(job)
         ads = self.ads.get(session)
         if len(ads):
-            return [self.gen_item(x, ads[x]["value"], cls, path=self.ads.path, 
-                                  dtype=ads[x]["type"], error=ads[x], orig=ads[x]["orig"]) for x in ads 
+            return [self.gen_item(x, ads[x]["value"], cls, path=self.ads.path,
+                                  dtype=ads[x]["type"], error=ads[x], orig=ads[x]["orig"]) for x in ads
                                   if self.is_group(x, cls, group)]
         else:
             items = super(JobAdsEditor, self).do_get_items(session, args)
             for item in items:
                 item["path"] = self.ads.path
             return items
-                
+
     def is_group(self, name, cls, group):
         if name in cls.ad_properties_by_name:
             property = cls.ad_properties_by_name[name]
@@ -803,11 +803,11 @@
         self.page.pop_frame(branch)
         self.page.get_frame(branch).show_view(branch)
         self.page.set_redirect_url(session, branch.marshal())
-        
+
     def process_submit(self, session, job):
         ads = self.ads.get(session)
         errors = False
-        
+
         just_ads = dict()
         for field in ads:
             try:
@@ -840,7 +840,7 @@
                     orig = float(orig)
                 if fval != orig:
                     just_ads[unicode(field)] = fval
-        
+
         if not errors:
             for field in just_ads:
                 action = self.app.model.job.setattribute
@@ -853,34 +853,34 @@
 
         self.which_file = self.FileSwitch(app, "file")
         self.add_child(self.which_file)
-        
+
         self.first_last = self.FLSwitch(app, "first_last")
         self.add_child(self.first_last)
-        
+
         self.__fetch = self.FetchButton(app, "refresh")
         self.add_child(self.__fetch)
 
         self.ads = JobAdsSet(app, "ads")
         self.add_child(self.ads)
-    
+
         self.out_file = Parameter(app, "out")
         self.add_parameter(self.out_file)
-        
+
         self.err_file = Parameter(app, "err")
         self.add_parameter(self.err_file)
-        
+
         self.user_file = Parameter(app, "user")
         self.add_parameter(self.user_file)
-        
+
         self.output = self.OutputFile(app, "job_output")
         self.add_child(self.output)
 
     def get_args(self, session):
         return self.frame.get_args(session)
-    
+
     def render_title(self, session, *args):
         return "Output"
-    
+
     def render(self, session, *args):
         out_file = self.out_file.get(session)
         err_file = self.err_file.get(session)
@@ -900,7 +900,7 @@
             out_file = self.ads.strip_string_quotes(out_file)
             err_file = self.ads.strip_string_quotes(err_file)
             user_file = self.ads.strip_string_quotes(user_file)
-            
+
             # remember the file names so we don't need to reget them
             self.out_file.set(session, out_file)
             self.err_file.set(session, err_file)
@@ -917,13 +917,13 @@
             self.which_file.disable(session, "e")
         if self.which_file.is_bad(user_file):
             self.which_file.disable(session, "u")
-            
+
         return super(JobOutput, self).render(session, *args)
-        
+
     def render_loading(self, session, *args):
         file = self.which_file.get_current_file_name(session)
         return file and "loading..." or "Output, Error, and UserLog file names are invalid."
-         
+
     def get_file_args(self, session):
         first_last = self.first_last.get(session)
         if first_last == "t":
@@ -934,7 +934,7 @@
             end = 2048
         file = self.which_file.get_current_file_name(session)
         return (file, start, end)
-    
+
     class OutputFile(AjaxField):
         def get_url(self, session):
             job = self.parent.frame.get_args(session)[0]
@@ -945,59 +945,59 @@
                     args = "%s&%i&%i&%s" % (file, start, end, fl)
                     args = escape_amp(args)
                     return "call.xml?class=job;id=%i;method=fetch;xargs=%s" % (job.id, args)
-        
+
         def do_render(self, session):
             return self.render_script(session)
 
     class FetchButton(FormButton):
         def render_content(self, session):
             return "Refresh"
-        
+
     class FileSwitch(StateSwitch):
         def __init__(self, app, name):
             super(JobOutput.FileSwitch, self).__init__(app, name)
-    
+
             self.add_state("o", "Output")
             self.add_state("e", "Error")
             self.add_state("u", "UserLog")
 
             self.disabled = self.DisabledList(app, "disabled")
             self.add_attribute(self.disabled)
-            
+
             self.link_titles = self.Titles(app, "link_titles")
             self.add_attribute(self.link_titles)
-            
+
         class DisabledList(Attribute):
             def get_default(self, session):
                 return list()
-                        
+
         class Titles(Attribute):
             def get_default(self, session):
                 return dict()
-                        
+
         def disable(self, session, state):
             disabled = self.disabled.get(session)
             disabled.append(state)
             self.disabled.set(session, disabled)
             if state == self.get(session):
                 self.select_first_enabled(session)
-            
+
         def set_file_name(self, session, state, link_title):
             link_titles = self.link_titles.get(session)
             link_titles[state] = link_title
             self.link_titles.set(session, link_titles)
-            
+
         def get_file_name(self, session, state):
             link_titles = self.link_titles.get(session)
             return state in link_titles and link_titles[state] or ""
-            
+
         def get_current_file_name(self, session):
             state = self.get(session)
             return self.get_file_name(session, state)
-        
+
         def select_first_enabled(self, session):
             states = self.get_items(session)
-            disabled = self.disabled.get(session)                
+            disabled = self.disabled.get(session)
             for state in states:
                 if not state in disabled:
                     self.set(session, state)
@@ -1006,7 +1006,7 @@
         def render_item_link(self, session, state):
             branch = session.branch()
             self.set(branch, state)
-    
+
             title = self.get_title(state)
             link_titles = self.link_titles.get(session)
             link_title = state in link_titles and link_titles[state] or ""
@@ -1026,12 +1026,12 @@
             elif "/dev/null" in file.lower():
                 bad = True
             return bad
-            
-            
+
+
     class FLSwitch(StateSwitch):
         def __init__(self, app, name):
             super(JobOutput.FLSwitch, self).__init__(app, name)
-    
+
             self.add_state("t", "Tail", "Display end of file")
             self.add_state("h", "Head", "Display beginning of file")
 
@@ -1043,7 +1043,7 @@
     def render_job_status(self, session, job):
         if job:
             return JobStatusInfo.get_status_string(job.JobStatus)
-        
+
 class JobGroupSet(CuminTable):
     def __init__(self, app, name):
         super(JobGroupSet, self).__init__(app, name)
@@ -1057,7 +1057,7 @@
         col = self.JobsCountColumn(app, "jobs")
         col.alignment = "right"
         self.add_column(col)
-        
+
     class GroupColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Job Group"
@@ -1069,11 +1069,11 @@
                 group = Identifiable(name)
                 href = self.page.main.pool.job_group.get_href(session, group)
                 return fmt_link(href, fmt_shorten(name))
-        
+
     class JobsCountColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Jobs"
-        
+
 class JobsAndGroupsTab(Widget):
     def __init__(self, app, name):
         super(JobsAndGroupsTab, self).__init__(app, name)
@@ -1083,10 +1083,10 @@
 
         self.job_tab = JobTab(app, "jobtab")
         self.add_child(self.job_tab)
-        
+
         self.job_group_tab = JobGroupTab(app, "jobgrouptab")
         self.add_child(self.job_group_tab)
-    
+
     def get_args(self, session):
         return self.frame.get_args(session)
 
@@ -1096,13 +1096,13 @@
     def show_status_switch(self, session):
         is_group = self.is_group.get(session)
         return is_group == "j"
-    
+
     def set_switch(self, session, switch):
         if switch == "group":
             self.is_group.set(session, "g")
         else:
             self.is_group.set(session, "j")
-    
+
     def render_phase(self, session, *args):
         is_group = self.is_group.get(session)
         if is_group == "j":
@@ -1112,7 +1112,7 @@
         is_group = self.is_group.get(session)
         if is_group == "j":
             return self.job_tab.render(session)
-    
+
     def render_job_groups(self, session, *args):
         is_group = self.is_group.get(session)
         if is_group == "g":
@@ -1121,7 +1121,7 @@
 class JobGroupTab(JobGroupSet, Form):
     def __init__(self, app, name):
         super(JobGroupTab, self).__init__(app, name)
-        
+
         self.__remove = self.Remove(app, "remove")
         self.add_child(self.__remove)
 
@@ -1140,10 +1140,10 @@
 
             href = self.frame.job_group_remove.get_href(session, ids)
             self.page.set_redirect_url(session, href)
-            
+
         def render_content(self, session):
             return "Remove"
-        
+
     class Hold(FormButton):
         def process_submit(self, session):
             ids = self.parent.ids.get(session)
@@ -1151,10 +1151,10 @@
 
             href = self.frame.job_group_hold.get_href(session, ids)
             self.page.set_redirect_url(session, href)
-            
+
         def render_content(self, session):
             return "Hold"
-        
+
     class Release(FormButton):
         def process_submit(self, session):
             ids = self.parent.ids.get(session)
@@ -1162,43 +1162,43 @@
 
             href = self.frame.job_group_release.get_href(session, ids)
             self.page.set_redirect_url(session, href)
-            
+
         def render_content(self, session):
             return "Release"
 
 class JobReasonBulkActionForm(CuminBulk):
     def __init__(self, app, name):
         super(JobReasonBulkActionForm, self).__init__(app, name)
-        
+
         self.reason = Parameter(app, "reason")
         self.add_parameter(self.reason)
-        
+
         self.error = Attribute(app, "error")
         self.add_attribute(self.error)
 
         self.error_tmpl = Template(self, "reason_html")
-        
+
     def render_reason_text(self, session, *args):
         return "Reason"
-    
+
     def render_reason_path(self, session, *args):
         return self.reason.path
-    
+
     def render_reason_value(self, session, *args):
         return escape_entity(self.reason.get(session))
-    
+
     def render_reason_error(self, session, *args):
         if self.error.get(session):
             writer = Writer()
             self.error_tmpl.render(writer, session, *args)
             return writer.to_string()
-    
+
     def render_reason_error_text(self, session, *args):
         return self.error.get(session)
-    
+
     def render_form_heading(self, session, *args):
         pass
-    
+
     def process_submit(self, session, *args):
         reason = self.reason.get(session)
         if not reason:
@@ -1218,9 +1218,9 @@
         reason = [self.reason.get(session)]
         verb_by = "%s by %s" % (verb, session.user_session.subject.name)
         reason.insert(0, verb_by)
-        return ": ".join(reason) 
+        return ": ".join(reason)
 
-class JobReasonIntBulkActionForm(JobReasonBulkActionForm, CuminIntIdList):        
+class JobReasonIntBulkActionForm(JobReasonBulkActionForm, CuminIntIdList):
     def get_items(self, session, *args):
         return self.ids.get(session)
 
@@ -1230,7 +1230,7 @@
         action = self.app.model.job.hold
         reason = self.get_reason(session, "held")
         action.invoke(job, reason)
- 
+
     def render_title(self, session):
         ids = self.ids.get(session)
         return len(ids) > 1 and "Hold Jobs" or "Hold Job"
@@ -1240,14 +1240,14 @@
 
     def render_reason_text(self, session, *args):
         return "Hold Reason"
-    
+
 class JobSetRelease(JobReasonIntBulkActionForm):
     def process_item(self, session, id):
         job = Job.get(id)
         action = self.app.model.job.release
         reason = self.get_reason(session, "released")
         action.invoke(job, reason)
- 
+
     def render_title(self, session):
         ids = self.ids.get(session)
         return len(ids) > 1 and "Release Jobs" or "Release Job"
@@ -1257,14 +1257,14 @@
 
     def render_reason_text(self, session, *args):
         return "Release Reason"
-    
+
 class JobSetRemove(JobReasonIntBulkActionForm):
     def process_item(self, session, id):
         job = Job.get(id)
         action = self.app.model.job.remove
         reason = self.get_reason(session, "removed")
         action.invoke(job, reason)
- 
+
     def render_title(self, session):
         ids = self.ids.get(session)
         return len(ids) > 1 and "Remove Jobs" or "Remove Job"
@@ -1274,8 +1274,8 @@
 
     def render_reason_text(self, session, *args):
         return "Remove Reason"
-    
-class JobReasonStringBulkActionForm(JobReasonBulkActionForm, CuminStringIdList):        
+
+class JobReasonStringBulkActionForm(JobReasonBulkActionForm, CuminStringIdList):
     def get_items(self, session, *args):
         return self.ids.get(session)
 
@@ -1286,7 +1286,7 @@
         reason = self.get_reason(session, "held")
         for job in Job.select(sel):
             action.invoke(job, reason)
- 
+
     def render_title(self, session):
         ids = self.ids.get(session)
         return len(ids) > 1 and "Hold Job Groups" or "Hold Job Group"
@@ -1296,7 +1296,7 @@
 
     def render_reason_text(self, session, *args):
         return "Hold Reason"
-    
+
 class JobGroupRelease(JobReasonStringBulkActionForm):
     def process_item(self, session, id):
         sel = "custom_group='%s'" % id
@@ -1304,7 +1304,7 @@
         reason = self.get_reason(session, "released")
         for job in Job.select(sel):
             action.invoke(job, reason)
- 
+
     def render_title(self, session):
         ids = self.ids.get(session)
         return len(ids) > 1 and "Release Job Groups" or "Release Job Group"
@@ -1314,7 +1314,7 @@
 
     def render_reason_text(self, session, *args):
         return "Release Reason"
-    
+
 class JobGroupRemove(JobReasonStringBulkActionForm):
     def process_item(self, session, id):
         sel = "custom_group='%s'" % id
@@ -1322,7 +1322,7 @@
         reason = self.get_reason(session, "removed")
         for job in Job.select(sel):
             action.invoke(job, reason)
- 
+
     def render_title(self, session):
         ids = self.ids.get(session)
         return len(ids) > 1 and "Remove Job Groups" or "Remove Job Group"
@@ -1332,7 +1332,7 @@
 
     def render_reason_text(self, session, *args):
         return "Remove Reason"
-    
+
 class JobStatusSwitch(StateSwitch):
     def __init__(self, app, name):
         super(JobStatusSwitch, self).__init__(app, name)
@@ -1343,7 +1343,7 @@
         self.add_state("h", "Held")
         self.add_state("c", "Completed")
         self.add_state("d", "Removed")
-        
+
     def get_sql_constraint(self, session, phase=None):
         if not phase:
             phase = self.get(session)
@@ -1371,7 +1371,7 @@
         else:
             not_completed = "(j.qmf_delete_time is not null and j.job_status <> %i )" % JobStatusInfo.get_status_int("Completed")
             is_removed = "j.job_status = %i" % JobStatusInfo.get_status_int("Removed")
-            sql = " or ".join((not_completed, is_removed)) 
+            sql = " or ".join((not_completed, is_removed))
 
         return sql
 

Modified: mgmt/trunk/cumin/python/cumin/job.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/job.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/job.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -27,8 +27,8 @@
 
 [JobSet.find_sql]
 select
-	j.id,
-	j.custom_id
+        j.id,
+        j.custom_id
 from job as j
 left outer join job_stats as c on c.id = j.stats_curr_id
 left outer join job_stats as p on p.id = j.stats_prev_id
@@ -62,81 +62,87 @@
 
 [JobTab.css]
 input.search_input {
-	color: #555;
-	border: 1px solid #333;
-	font-size: 0.9em;
-	font-weight: normal;
-	padding-left: 0.25em;
+    color: #555;
+    border: 1px solid #333;
+    font-size: 0.9em;
+    font-weight: normal;
+    padding-left: 0.25em;
 }
+
 input.search_error {
-	color: #CC0000 !important;
+    color: #CC0000 !important;
 }
+
 div.searchbox {
-	padding-top: 2px;
+    padding-top: 2px;
 }
 
 
 [JobTab.javascript]
 function JobSearchFocus() {
-	var val = this.value;
-	if (val == job_search_prompt) {
-		this.value = "";
-		this.style.color = "#000";
-		this.className = "search_input"; // remove search_error class
-	}
+    var val = this.value;
+
+    if (val == job_search_prompt) {
+        this.value = "";
+        this.style.color = "#000";
+        this.className = "search_input"; // remove search_error class
+    }
 }
+
 function JobSearchBlur() {
-	var val = this.value;
-	if (val == "") {
-		this.style.color = "#555";
-		job_search_prompt = job_search_default_prompt;
-		this.value = job_search_prompt;
-	}
+    var val = this.value;
+
+    if (val == "") {
+        this.style.color = "#555";
+        job_search_prompt = job_search_default_prompt;
+        this.value = job_search_prompt;
+    }
 }
 
 function attachJobSearch() {
-	var oInput = document.getElementById("job_search");
-	if (oInput) {
-		oInput.onfocus = JobSearchFocus;
-		oInput.onblur = JobSearchBlur;
-	}
+    var oInput = document.getElementById("job_search");
+
+    if (oInput) {
+        oInput.onfocus = JobSearchFocus;
+        oInput.onblur = JobSearchBlur;
+    }
 }
+
 addEvent(window, "load", attachJobSearch);
 
 [JobTab.html]
 <form id="{id}" method="post" action="?">
-	
-	  <div class="sactions">
-	  	  {job_search}
-	    <h2>Act on Selected Jobs:</h2>
-	    {hold} {release} {remove}
-	  </div>
-	
-	<table class="mobjects">
-	  <thead>
-	    <tr>
-	      <th class="setnav" colspan="{column_count}">
-	        <div class="rfloat">{page}</div>
-	        {count}
-	      </th>
-	    </tr>
-	    <tr>{headers}</tr>
-	  </thead>
-	  <tbody>{items}</tbody>
-	</table>
-	<div>{hidden_inputs}</div>
+  <div class="sactions">
+    {job_search}
+    <h2>Act on Selected Jobs:</h2>
+    {hold} {release} {remove}
+  </div>
+
+  <table class="mobjects">
+    <thead>
+      <tr>
+        <th class="setnav" colspan="{column_count}">
+          <div class="rfloat">{page}</div>
+          {count}
+        </th>
+      </tr>
+      <tr>{headers}</tr>
+    </thead>
+    <tbody>{items}</tbody>
+  </table>
+  <div>{hidden_inputs}</div>
 </form>
 
 [JobSearch.html]
-	  <div class="rfloat searchbox">
-	  	<h2><label for="job_search">Go To Job:</label></h2> 
-	  	<input class="search_input {search_class}" type="text" name="{name}" id="job_search" value="{search_prompt}" />
-	  	{go}
-	  </div>
-	<script type="text/javascript">
-		var job_search_default_prompt = "{search_default_prompt}"
-		var job_search_prompt = "{search_prompt}"
-	</script>
+<div class="rfloat searchbox">
+  <h2><label for="job_search">Go To Job:</label></h2>
+  <input class="search_input {search_class}" type="text" name="{name}" id="job_search" value="{search_prompt}" />
+  {go}
+</div>
+<script type="text/javascript">
+  var job_search_default_prompt = "{search_default_prompt}"
+  var job_search_prompt = "{search_prompt}"
+</script>
 
 [JobGroupSet.sql]
 select
@@ -151,7 +157,7 @@
 {sql_limit}
 
 [JobGroupSet.count_sql]
-select count(distinct j.custom_group) 
+select count(distinct j.custom_group)
 from job as j
 {sql_where}
 
@@ -171,50 +177,49 @@
 
 [JobGroupTab.html]
 <form id="{id}" method="post" action="?">
+  <div class="sactions">
+    <h2>Act on Selected Groups:</h2>
+    {hold} {release} {remove}
+  </div>
 
-	  <div class="sactions">
-	    <h2>Act on Selected Groups:</h2>
-	    {hold} {release} {remove}
-	  </div>
-	
-	<table class="mobjects">
-	  <thead>
-	    <tr>
-	      <th class="setnav" colspan="{column_count}">
-	        <div class="rfloat">{page}</div>
-	        {count}
-	      </th>
-	    </tr>
-	    <tr>{headers}</tr>
-	  </thead>
-	  <tbody>{items}</tbody>
-	</table>
-	<div>{hidden_inputs}</div>
+  <table class="mobjects">
+    <thead>
+      <tr>
+        <th class="setnav" colspan="{column_count}">
+          <div class="rfloat">{page}</div>
+          {count}
+        </th>
+      </tr>
+      <tr>{headers}</tr>
+    </thead>
+    <tbody>{items}</tbody>
+  </table>
+  <div>{hidden_inputs}</div>
 </form>
 
 [JobGroupJobSet.html]
-  <div class="rfloat">{phase}</div>
+<div class="rfloat">{phase}</div>
 <form id="{id}" style="clear:right;" method="post" action="?">
 
-	  <div class="sactions">
-	    {job_search}
-	    <h2>Act on Selected Jobs:</h2>
-	    {hold} {release} {remove}
-	  </div>
-	
-	<table class="mobjects">
-	  <thead>
-	    <tr>
-	      <th class="setnav" colspan="{column_count}">
-	        <div class="rfloat">{page}</div>
-	        {count}
-	      </th>
-	    </tr>
-	    <tr>{headers}</tr>
-	  </thead>
-	  <tbody>{items}</tbody>
-	</table>
-	<div>{hidden_inputs}</div>
+  <div class="sactions">
+    {job_search}
+    <h2>Act on Selected Jobs:</h2>
+    {hold} {release} {remove}
+  </div>
+
+  <table class="mobjects">
+    <thead>
+      <tr>
+        <th class="setnav" colspan="{column_count}">
+          <div class="rfloat">{page}</div>
+          {count}
+        </th>
+      </tr>
+      <tr>{headers}</tr>
+    </thead>
+    <tbody>{items}</tbody>
+  </table>
+  <div>{hidden_inputs}</div>
 </form>
 
 [JobStatus.html]
@@ -226,19 +231,19 @@
 
 [JobAdsViewer.html]
 <ul class="actions">
-    <li><a class="nav" href="{edit_ads_url}">Edit Attributes</a></li>
+  <li><a class="nav" href="{edit_ads_url}">Edit Attributes</a></li>
 </ul>
 <table class="CuminDetails">
-	<tbody>
-		<tr>
-		<td>
-			{groups}
-		</td>
-		</tr>
-	</tbody>
+  <tbody>
+    <tr>
+      <td>
+        {groups}
+      </td>
+    </tr>
+  </tbody>
 </table>
 <ul class="actions">
-    <li><a class="nav" href="{edit_ads_url}">Edit Attributes</a></li>
+  <li><a class="nav" href="{edit_ads_url}">Edit Attributes</a></li>
 </ul>
 
 [JobAdsViewer.group_html]
@@ -261,59 +266,62 @@
 
 [JobAdsViewer.property_html]
 <tr>
-	<th>{title}</th><td>{value}</td><td>{inline_help}</td>
+  <th>{title}</th><td>{value}</td><td>{inline_help}</td>
 </tr>
 
 [JobAdsEditor.css]
 div.inline_help {
-	float: right;
+        float: right;
 }
 
 div.inline_help h2 {
-	display: inline;
+        display: inline;
 }
 
 [JobAdsEditor.html]
 <form id="{id}" class="mform editform" method="post" action="?">
-<div class="inline_help">
-<h2>Legend</h2>
-		<span class="edit_number">Numeric input expected</span>
-		<span class="edit_string">String input expected</span>
-</div>
-{help} {submit} {cancel}
-<table class="CuminDetails Editable">
-  <tbody>
-  <tr>
-    <td>
-      {groups}
-    </td>
-  </tr>
-  </tbody>
-</table>
-{help} {submit} {cancel}
-<div>{hidden_inputs}</div>
+  <div class="inline_help">
+    <h2>Legend</h2>
+    <span class="edit_number">Numeric input expected</span>
+    <span class="edit_string">String input expected</span>
+  </div>
+  {help} {submit} {cancel}
+  <table class="CuminDetails Editable">
+    <tbody>
+      <tr>
+        <td>
+          {groups}
+        </td>
+      </tr>
+    </tbody>
+  </table>
+  {help} {submit} {cancel}
+  <div>{hidden_inputs}</div>
 </form>
 
 [JobReasonBulkActionForm.css]
 div.action_reason {
-	margin: 1em;
+    margin: 1em;
 }
+
 div.action_reason label {
-	font-weight: bold;
-	margin-right: 0.5em;
+    font-weight: bold;
+    margin-right: 0.5em;
 }
+
 div.action_reason input {
-	width: 20em;
+    width: 20em;
 }
+
 div.action_reason div.reason_error {
-	float: right;
-	border: 1px solid red;
-	color: red;
-	padding: 0.5em;
+    float: right;
+    border: 1px solid red;
+    color: red;
+    padding: 0.5em;
 }
 
 [JobReasonBulkActionForm.reason_html]
-	<div class="reason_error">{reason_error_text}</div>
+        <div class="reason_error">{reason_error_text}</div>
 
 [JobReasonBulkActionForm.html]
 <form id="{id}" class="mform" method="post" action="?">
@@ -323,9 +331,9 @@
   <div class="body">
     <span class="legend">{form_heading}</span>
     <div class="action_reason">
-	    {reason_error}
-    	<label for="reason">{reason_text}</label> <input type="text" name="{reason_path}" id="reason" value="{reason_value}" maxlength="4000" />
-	</div>
+      {reason_error}
+      <label for="reason">{reason_text}</label> <input type="text" name="{reason_path}" id="reason" value="{reason_value}" maxlength="4000" />
+    </div>
     <fieldset>
       <ul>{items}</ul>
     </fieldset>
@@ -344,74 +352,89 @@
 //]]>
 </script>
 
-
 [JobOutput.css]
 textarea#job_output {
-	height: 25em;
-	width: 100%;
-	border: 1px solid #EAEAEA;
-	font-family: Fixed, monospace;
-	line-height: 1.15em;
-	background-color: #FFF;
-	color: #333;
+    height: 25em;
+    width: 100%;
+    border: 1px solid #EAEAEA;
+    font-family: Fixed, monospace;
+    line-height: 1.15em;
+    background-color: #FFF;
+    color: #333;
 }
+
 div.out_actions {
-	padding:1em 1em 0 1em;
+    padding:1em 1em 0 1em;
 }
+
 div.refresh_info h2 {
-	position: relative;
-	top: -0.5em;
+    position: relative;
+    top: -0.5em;
 }
 
 [JobOutput.javascript]
 function scrollToEnd (element) {
-	if (typeof element.scrollTop != 'undefined' &&
-			typeof element.scrollHeight != 'undefined') {
-		element.scrollTop = element.scrollHeight;
-	}
+    if (typeof element.scrollTop != 'undefined'
+        && typeof element.scrollHeight != 'undefined') {
+        element.scrollTop = element.scrollHeight;
+    }
 }
+
 function outputEnd() {
     var tarea = document.getElementById("job_output");
-	if (tarea) {
-    	scrollToEnd(tarea);
-    	setTimeout("get_job_output()", 5000);
+
+    if (tarea) {
+        scrollToEnd(tarea);
+        setTimeout("get_job_output()", 5000);
     }
 }
 
 [JobOutput.html]
 <form id="{id}" style="width:100%; border:0px;" class="mform" method="post" action="?">
-	<div class="out_actions">
-		<div class="rfloat">{first_last}</div>
-		{file}
-	</div>
-<div  class="sactions refresh_info">{refresh} <h2>Last refresh was at <span id="out_time"></span></h2></div>
-<div><textarea name="job_output" id="job_output" rows="20" cols="80">
-{loading}{job_output}
-</textarea>
-{hidden_inputs}</div>
+  <div class="out_actions">
+    <div class="rfloat">{first_last}</div>
+
+    {file}
+  </div>
+
+  <div class="sactions refresh_info">{refresh} <h2>Last refresh was at <span id="out_time"></span></h2></div>
+
+  <div>
+    <textarea name="job_output" id="job_output" rows="20" cols="80">
+      {loading}{job_output}
+    </textarea>
+
+    {hidden_inputs}
+  </div>
 </form>
 
 [OutTime.javascript]
 function got_out_time(obj, id) {
     var elem = document.getElementById(id);
+
     if (elem) {
         var str = obj.time.value;
         elem.innerHTML = str;
     }
 }
+
 [OutputFile.javascript]
 function got_job_output(obj, id) {
     var elem = document.getElementById(id);
+
     if (elem) {
         var str = obj.fetch.output;
         elem.value = str;
+
         if (obj.fetch.tail == "t") {
-        	outputEnd();
+            outputEnd();
         }
+
         var d = new Date();
-		var out_time = document.getElementById("out_time");
-		if (out_time) {
-			out_time.innerHTML = d.toLocaleString();
-		}
+        var out_time = document.getElementById("out_time");
+
+        if (out_time) {
+            out_time.innerHTML = d.toLocaleString();
+        }
     }
 }

Modified: mgmt/trunk/cumin/python/cumin/limits.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/limits.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/limits.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -53,7 +53,7 @@
         def completion():
             pass
         negotiator.Reconfig(self.app.model.data, completion)
-    
+
     def get_raw_limits(self, session, negotiator):
         action = self.app.model.negotiator.GetLimits
         return action.do_invoke(negotiator)
@@ -69,11 +69,11 @@
         col = self.CurrentColumn(app, "curr")
         col.alignment = "right"
         self.add_column(col)
-        
+
         col = self.MaxColumn(app, "max")
         col.alignment = "right"
         self.add_column(col)
-        
+
         self.limits = self.Limits(self, "limits")
         self.add_attribute(self.limits)
 
@@ -97,7 +97,7 @@
             negotiator = self.parent.get_negotiator(session)
             return negotiator and \
                 "call.xml?class=negotiator;id=%i;method=GetLimitCount" % negotiator.id
-        
+
         def get_title(self, session, title):
             script = self.render_script(session)
             count = script and "?" or "0"
@@ -107,7 +107,7 @@
     class NameColumn(ItemTableColumn):
         def render_title(self, session, data):
             return "Name"
-            
+
         def render_content(self, session, data):
             limit = Identifiable(data["name"])
             href = self.frame.limit.get_href(session, limit)
@@ -116,11 +116,11 @@
     class CurrentColumn(ItemTableColumn):
         def render_title(self, session, data):
             return "Current Usage"
-            
+
     class MaxColumn(ItemTableColumn):
         def render_title(self, session, data):
             return "Max Allowance"
-            
+
     class Limits(Attribute):
         def get_default(self, session):
             return dict()
@@ -139,7 +139,7 @@
         edit = LimitEdit(app, "edit")
         self.add_mode(edit)
         self.set_edit_mode(edit)
-        
+
     def get_object(self, session):
         obj = self.object.get(session)
         if not getattr(obj, "name", None):
@@ -150,8 +150,8 @@
             self.object.set(session, obj)
 
         return obj
-    
 
+
 class LimitEdit(CuminForm):
     def __init__(self, app, name):
         super(LimitEdit, self).__init__(app, name)
@@ -163,32 +163,32 @@
         self.add_attribute(self.error)
 
         self.error_tmpl = Template(self, "error_html")
-        
+
     class Errors(Attribute):
         def get_default(self, session):
             return dict()
-    
+
     def get_args(self, session):
         return self.frame.get_args(session)
-    
+
     def render_title(self, session, *args):
         return "Edit Concurrency Limit '%s'" % args[0].id
-    
+
     def render_input_id(self, session, *args):
         return self.max.path
-    
+
     def render_label(self, session, *args):
         return "Maximum Allowance"
-    
+
     def render_input_name(self, session, *args):
         return self.max.path
-    
+
     def render_input_value(self, session, *args):
         max = self.max.get(session)
         if not max:
             max = args[0].max
         return str(max)
-    
+
     def render_inline_help(self, session, *args):
         return "Set the maximum number of jobs that can run concurrently using this limiter."
 
@@ -198,17 +198,17 @@
             writer = Writer()
             self.error_tmpl.render(writer, session, *args)
             return writer.to_string()
-        
+
     def render_error(self, session, *args):
         error = self.error.get(session)
         if "max" in error:
             return error["max"]
-        
+
     def render_original_value(self, session, *args):
         error = self.error.get(session)
         if "max" in error:
             return "Original value was %s" % str(args[0].max)
-    
+
     def process_submit(self, session, *args):
         max = self.max.get(session)
         fmax = 0
@@ -222,13 +222,13 @@
             error = self.error.get(session)
             error["max"] = "Numeric value between 1 and 99999 expected"
             self.error.set(session, error)
-            
+
         if not errors:
             limit = args[0]
             limit.max = fmax
             self.frame.set_limit(session, limit)
             self.process_cancel(session, *args)
-    
+
 class LimitsView(CuminView):
     def __init__(self, app, name):
         super(LimitsView, self).__init__(app, name)
@@ -241,7 +241,7 @@
 
         jobs = LimitsJobSet(app, "jobs")
         self.__tabs.add_tab(jobs)
-        
+
         details = CuminDetails(app, "details")
         self.__tabs.add_tab(details)
 
@@ -251,9 +251,9 @@
 
 class LimitsJobSet(JobTab):
     def get_visible_columns(self, session):
-        return self.get_request_visible_columns(session, 
-                                                ["custom_group", 
-                                                 "scheduler", 
+        return self.get_request_visible_columns(session,
+                                                ["custom_group",
+                                                 "scheduler",
                                                  "submitter"])
 
     def get_sql_values(self, session, *args):
@@ -267,7 +267,7 @@
     def render_title(self, session, limit):
         limits_sql = self.get_limits_sql(session, limit)
         return "Jobs %s" % fmt_count(Job.select(limits_sql).count())
-    
+
     def render_count(self, session, *args):
         str = super(LimitsJobSet, self).render_count(session, *args)
         return "%s with Concurrency Limit '%s'" % (str, args[0].id)

Modified: mgmt/trunk/cumin/python/cumin/limits.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/limits.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/limits.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -15,6 +15,7 @@
 [LimitCount.javascript]
 function got_limit_count(obj, id) {
     var elem = document.getElementById(id);
+
     if (elem) {
         var str = "<span class='count'>(" + obj.count.value + ")</span>";
         elem.innerHTML = str;
@@ -23,79 +24,82 @@
 
 [LimitEdit.css]
 form.limitform {
-/* 	padding: 1em; */
+    /* padding: 1em; */
 }
+
 form.limitform div.label, form.limitform div.input {
-	float: left;
-	height: 3em;
-	margin-left: 1em;
+    float: left;
+    height: 3em;
+    margin-left: 1em;
 }
+
 form.limitform div.input input {
-	position: relative;
-	top: -0.2em;
-	width: 4em;
+    position: relative;
+    top: -0.2em;
+    width: 4em;
 }
+
 form.limitform div.foot {
-	clear: left;
+    clear: left;
 }
+
 form.limitform div.help {
-	margin: 0.5em 1em 1em 0;
+    margin: 0.5em 1em 1em 0;
 }
 
 form.limitform div.original_value {
-	color: #333;
-	font-size: 0.9em;
-	font-style: italic;
+    color: #333;
+    font-size: 0.9em;
+    font-style: italic;
 }
 
 [LimitEdit.html]
 <form id="{id}" class="mform limitform" method="post" action="?">
-	<div class="head">
-		<h1>{title}</h1>
-	</div>
-	<div class="body">
-		<div class="help">
-			{inline_help}
-		</div>
-		<div class="label">
-			<label for="{input_id}">{label}</label>
-		</div>
-		<div class="input">
-			<input id="{input_id}" type="text" name="{input_name}" value="{input_value}" /> 
-			<div class="original_value">{original_value}</div>
-		</div>{limit_error}
-		<div style="clear:both;"><!-- --></div>
-	</div>
-	<div class="foot">
-		{help} {submit} {cancel}
-	</div>
-	<div>{hidden_inputs}</div>
+  <div class="head">
+    <h1>{title}</h1>
+  </div>
+  <div class="body">
+    <div class="help">
+      {inline_help}
+    </div>
+    <div class="label">
+      <label for="{input_id}">{label}</label>
+    </div>
+    <div class="input">
+      <input id="{input_id}" type="text" name="{input_name}" value="{input_value}" />
+      <div class="original_value">{original_value}</div>
+    </div>{limit_error}
+    <div style="clear:both;"><!-- --></div>
+  </div>
+  <div class="foot">
+    {help} {submit} {cancel}
+  </div>
+  <div>{hidden_inputs}</div>
 </form>
 
 [LimitEdit.error_html]
-	<ul class="errors"><li>{error}</li></ul>
+<ul class="errors"><li>{error}</li></ul>
 
 [LimitsJobSet.html]
-  <div class="rfloat">{phase}</div>
+<div class="rfloat">{phase}</div>
 <form id="{id}" style="clear:right;" method="post" action="?">
 
-	  <div class="sactions">
-	    <h2>Act on Selected Jobs:</h2>
-	    {hold} {release} {remove}
-	  </div>
-	
-	<table class="mobjects">
-	  <thead>
-	    <tr>
-	      <th class="setnav" colspan="{column_count}">
-	        <div class="rfloat">{page}</div>
-	        {count}
-	      </th>
-	    </tr>
-	    <tr>{headers}</tr>
-	  </thead>
-	  <tbody>{items}</tbody>
-	</table>
-	<div>{hidden_inputs}</div>
+  <div class="sactions">
+    <h2>Act on Selected Jobs:</h2>
+    {hold} {release} {remove}
+  </div>
+
+  <table class="mobjects">
+    <thead>
+      <tr>
+	<th class="setnav" colspan="{column_count}">
+	  <div class="rfloat">{page}</div>
+	  {count}
+	</th>
+      </tr>
+      <tr>{headers}</tr>
+    </thead>
+    <tbody>{items}</tbody>
+  </table>
+  <div>{hidden_inputs}</div>
 </form>
-	
\ No newline at end of file

Modified: mgmt/trunk/cumin/python/cumin/model.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/model.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/model.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -35,7 +35,7 @@
         self.frame = None
 
         # Messaging
-        
+
         CuminBroker(self)
         CuminQueue(self)
         CuminExchange(self)
@@ -86,7 +86,7 @@
 
     def stop(self):
         self.data.stop()
-        
+
     def add_class(self, cls):
         self.classes.append(cls)
         setattr(self, cls.cumin_name, cls)
@@ -163,7 +163,7 @@
 
         if isinstance(value, dict):
             value = fmt_dict(value, self.prefix)
-            
+
         return value
 
 class AdProperty(CuminProperty):
@@ -188,7 +188,7 @@
         self.writable = True
 
         self.cumin_class.add_ad_property(self)
-    
+
     @classmethod
     def get_ad_groups(cls):
         return cls.groups
@@ -244,7 +244,7 @@
 
     def get_enabled(self, session, object):
         return True
-    
+
     def get_verb(self, session):
         return None
 
@@ -490,7 +490,7 @@
     def add_ad_property(self, prop):
         self.ad_properties.append(prop)
         self.ad_properties_by_name[prop.name] = prop
- 
+
     def add_stat(self, stat):
         self.stats.append(stat)
         setattr(self, stat.name, stat)
@@ -544,7 +544,7 @@
         for action in self.actions:
             if action.visualization:
                 return action
-        
+
     def write_event_xml(self, writer, object):
         writer.write("<events errors=\"%i\" warnings=\"%i\"/>" % (0, 0))
 
@@ -561,7 +561,7 @@
 
         self.write_event_xml(writer, object)
         self.write_stat_xml(session, writer, object)
-            
+
         writer.write("</%s>" % self.cumin_name)
 
 class RemoteClass(CuminClass):
@@ -586,16 +586,16 @@
 class CuminSlot(RemoteClass):
     def __init__(self, model):
         super(CuminSlot, self).__init__(model, "slot", Slot, SlotStats)
-        
+
         prop = CuminProperty(self, "Name")
         prop.title = "Name"
-        
+
         prop = CuminProperty(self, "Machine")
         prop.title = "Machine"
-        
+
         prop = CuminProperty(self, "JobId")
         prop.title = "Current Job Id"
-        
+
         stat = CuminStat(self, "Activity")
         stat.title = "Activity"
         stat.category = "general"
@@ -613,7 +613,7 @@
         super(Visualization, self).__init__(cls, name)
 
         self.itemset = None
-        
+
     def get_boxes(self, session, object):
         if self.itemset:
             box_list = self.itemset.get_items(session, object)
@@ -627,7 +627,7 @@
 
         prop = CuminProperty(self, "uuid")
         prop.title = "System ID"
-        
+
         prop = CuminProperty(self, "nodeName")
         prop.title = "Address"
         prop.summary = True
@@ -699,21 +699,21 @@
     class SystemSlotVisualization(Visualization):
         def __init__(self, cls, name):
             super(CuminSystem.SystemSlotVisualization, self).__init__(cls, name)
-            
+
             self.itemset = self.ModelSystemSlotSet(cls.model.app, "slot")
             self.itemset.items.path = "CuminSystem.SystemSlotVisualization.slot"
-                        
+
         def get_slot_count(self, session, system):
             items = self.itemset.get_items(session, system)
             return len(items)
-            
+
         class ModelSystemSlotSet(SystemSlotSet):
             def render_sql_limit(self, session, *args):
                 pass
-            
+
             def render_sql_orderby(self, session, *args):
                 return "order by machine, name asc"
-        
+
 class CuminMaster(RemoteClass):
     def __init__(self, model):
         super(CuminMaster, self).__init__(model, "master", Master, MasterStats)
@@ -741,7 +741,7 @@
             except IndexError:
                 raise Exception("Master daemon not running")
             master.Start(self.model.data, completion, args["subsystem"])
-        
+
     class Stop(CuminAction):
         def do_invoke(self, object, args, completion):
             system_name = object.System
@@ -750,7 +750,7 @@
             except IndexError:
                 raise Exception("Master daemon not running")
             #master.Stop(self.model.data, completion, args["subsystem"])
-        
+
 class CuminBroker(RemoteClass):
     def __init__(self, model):
         super(CuminBroker, self).__init__(model, "broker", Broker, BrokerStats)
@@ -782,7 +782,7 @@
 
         prop = CuminProperty(self, "dataDir")
         prop.title = "Data Directory"
-        
+
         stat = self.StatusStat(self, "connection")
         stat.category = "status"
 
@@ -823,7 +823,7 @@
                     connected = mbroker.connected
                 except KeyError:
                     pass
-                    
+
             if connected:
                 return "Connected"
             else:
@@ -850,12 +850,12 @@
 
         def get_verb(self, session):
             return "Add"
-        
+
         def show(self, session, reg):
             frame = self.cumin_class.show_object(session, reg)
             frame.set_object(session, reg)
             return frame.exchange_add.show(session)
-        
+
         def do_invoke(self, exchange, args, completion):
             declArgs = {}
 
@@ -881,7 +881,7 @@
 
         def get_verb(self, session):
             return "Add"
-        
+
         def show(self, session, reg):
             frame = self.cumin_class.show_object(session, reg)
             frame.set_object(session, reg)
@@ -924,7 +924,7 @@
 def do_bind(session, queue_name, binding_info):
         for exchange in binding_info:
             if "key" in binding_info[exchange]:
-                binding_key = binding_info[exchange]["key"] 
+                binding_key = binding_info[exchange]["key"]
             else:
                 binding_key = None
 
@@ -1105,10 +1105,10 @@
 
         action = self.Purge(self, "purge")
         action.summary = True
-        
+
         action = self.Remove(self, "remove")
         action.summary = True
-        
+
         action = self.Bind(self, "bind")
         action.summary = True
 
@@ -1183,7 +1183,7 @@
     def __init__(self, model):
         super(CuminExchange, self).__init__(model, "exchange",
                                             Exchange, ExchangeStats)
-        
+
         prop = CuminProperty(self, "name")
         prop.title = "Name"
 
@@ -1248,7 +1248,7 @@
 
     def get_title(self, session):
         return "Exchange"
-    
+
     def get_icon_href(self, session):
         return "resource?name=exchange-36.png"
 
@@ -1263,15 +1263,15 @@
     class Remove(CuminAction):
         def get_title(self, session):
             return "Remove"
-        
+
         def show(self, session, exchange):
             frame = self.cumin_class.show_object(session, exchange)
             return frame.remove.show(session)
-        
+
         def do_invoke(self, exchange, args, completion):
             session = self.get_session_by_object(exchange)
             session.exchange_delete(exchange=exchange.name)
-            
+
             completion("OK")
 
 class CuminBinding(RemoteClass):
@@ -1291,21 +1291,21 @@
 
     def get_title(self, session):
         return "Binding"
-    
+
     def get_object_name(self, binding):
         return "between %s and %s" % (binding.exchange.name, binding.queue.name)
 
     class Remove(CuminAction):
         def get_title(self, session):
             return "Remove"
-        
+
         def show(self, session, binding):
             raise Exception("XXX")
 
             frame = self.cumin_class.show_object(session, binding)
             frame = frame.exchange.show_object(session, binding)
             return frame.remove.show(session)
-        
+
         def do_invoke(self, binding, args, completion):
             session = self.get_session_by_object(binding)
             session.exchange_unbind(queue=binding.queue.name,
@@ -1322,40 +1322,40 @@
 
         prop = CuminProperty(self, "key")
         prop.title = "Route Key"
-        
+
         prop = CuminProperty(self, "tag")
         prop.title = "Tag"
-        
+
         prop = CuminProperty(self, "excludes")
         prop.title = "Excludes"
-         
+
         prop = CuminProperty(self, "durable")
         prop.title = "Durable"
-        
+
         prop = CuminProperty(self, "dest")
         prop.title = "Exchange"
-         
+
         action = self.Remove(self, "remove")
         #action.summary = True
 
     def get_title(self, session):
         return "Route"
-    
+
     def get_object_name(self, route):
         return route.src
-    
+
     class Remove(CuminAction):
         def get_title(self, session):
             return "Remove"
-        
+
         def show(self, session, peer):
             frame = self.cumin_class.show_object(session, peer)
             frame = frame.show_peer(session, peer)
             return frame.show_remove(session)
-        
+
         def do_invoke(self, bridge, args, completion):
             bridge.close(self.model.data, completion)
-    
+
 class CuminConnection(RemoteClass):
     def __init__(self, model):
         super(CuminConnection, self).__init__(model, "connection",
@@ -1365,15 +1365,15 @@
         prop = CuminProperty(self, "address")
         prop.title = "Address"
 
-        prop = CuminProperty(self, "SystemConnection")        
-        prop.title = "System Connection?"                     
+        prop = CuminProperty(self, "SystemConnection")
+        prop.title = "System Connection?"
 
         prop = CuminProperty(self, "authIdentity")
         prop.title = "Auth Identity?"
 
         prop = CuminProperty(self, "federationLink")
         prop.title = "Federation Link"
-                  
+
         stat = CuminStat(self, "closing")
         stat.title = "Closing Down"
         stat.category = "general"
@@ -1406,7 +1406,7 @@
 
     def get_title(self, session):
         return "Connection"
-    
+
     def get_icon_href(self, session):
         return "resource?name=client-36.png"
 
@@ -1469,7 +1469,7 @@
 
     def get_title(self, session):
         return "Session"
-    
+
     class Close(CuminAction):
         def get_title(self, session):
             return "Close"
@@ -1545,13 +1545,13 @@
 
         action = self.Close(self, "close")
         action.summary = True
-        
+
         action = self.Bridge(self, "bridge")
         action.summary = True
 
     def init(self):
         self.frame = self.model.frame.broker.link
-        
+
     def get_title(self, session):
         return "Broker Link"
 
@@ -1563,13 +1563,13 @@
             frame = self.cumin_class.show_object(session, link)
             frame.set_object(session, link)
             return frame.show_bridge_add(session)
-        
+
         def get_title(self, session):
             return "Add Route"
-        
+
         def get_verb(self, session):
             return "Add Route"
-        
+
         def do_invoke(self, link, args, completion):
             durable = args["durable"]
             src = args["exchange"]
@@ -1579,16 +1579,16 @@
             dynamic = args["dynamic"]
             excludes = args["excludes"]
             sync = args["sync"]
-            
-            link.bridge(self.model.data, completion, 
-                        durable, src, dest, key, 
+
+            link.bridge(self.model.data, completion,
+                        durable, src, dest, key,
                         tag, excludes, False, False, dynamic, sync)
 
     class Close(CuminAction):
         def show(self, session, link):
             frame = self.cumin_class.show_object(session, link)
             return frame.show_remove(session)
-        
+
         def get_title(self, session):
             return "Close"
 
@@ -1629,57 +1629,57 @@
         stat.title = "Record Depth"
         stat.unit = "record"
         stat.category = "io.journal"
-        
+
         stat = CuminStat(self, "recordEnqueues")
         stat.title = "Record Enqueues"
         stat.unit = "record"
         stat.category = "io.journal"
-        
+
         stat = CuminStat(self, "outstandingAIOs")
         stat.title = "Outstanding AIOs"
         stat.unit = "aio"
         stat.category = "io.journal"
-        
+
         stat = CuminStat(self, "freeFileCount")
         stat.title = "Free Files"
         stat.unit = "file"
         stat.category = "io.journal"
-        
+
         stat = CuminStat(self, "availableFileCount")
         stat.title = "Avail. Files"
         stat.unit = "file"
         stat.category = "io.journal"
-        
+
         stat = CuminStat(self, "writeWaitFailures")
         stat.title = "Write Wait Failures"
         stat.unit = "failure"
         stat.category = "io.journal"
-        
+
         stat = CuminStat(self, "writeBusyFailures")
         stat.title = "Write Busy Failures"
         stat.unit = "failure"
         stat.category = "io.journal"
-        
+
         stat = CuminStat(self, "readRecordCount")
         stat.title = "Read Records"
         stat.unit = "record"
         stat.category = "io.journal"
-        
+
         stat = CuminStat(self, "readBusyFailures")
         stat.title = "Read Busy Failures"
         stat.unit = "failure"
         stat.category = "io.journal"
-        
+
         stat = CuminStat(self, "writePageCacheDepth")
         stat.title = "Write Page Cache Depth"
         stat.unit = "page"
         stat.category = "io.journal"
-        
+
         stat = CuminStat(self, "readPageCacheDepth")
         stat.title = "Read Page Cache Depth"
         stat.unit = "page"
         stat.category = "io.journal"
-        
+
 class CuminBrokerAclModule(RemoteClass):
     def __init__(self, model):
         super(CuminBrokerAclModule, self).__init__ \
@@ -1876,7 +1876,7 @@
         self.collector = collector
         self.id = self.collector.Pool
         self.name = self.collector.Name
-        
+
     def get(cls, id):
         for coll in Collector.select("pool='%s'" % id):
             return Pool(coll)
@@ -1892,7 +1892,7 @@
         prop = CuminProperty(self, "id")
         prop.title = "Collector ID"
         prop.summary = True
-        
+
         stat = self.PercentStat(self, "running")
         stat.title = "Running Jobs"
 
@@ -1999,7 +1999,7 @@
     class PoolSlotVisualization(Visualization):
         def __init__(self, cls, name):
             super(CuminPool.PoolSlotVisualization, self).__init__(cls, name)
-            
+
             self.itemset = self.ModelPoolSlotSet(cls.model.app, "slot")
             self.itemset.items.path = "CuminPool.PoolSlotVisualization.slot"
 
@@ -2010,7 +2010,7 @@
                 recent = self.get_recent_sql_where(session)
                 if recent:
                     elems.append(recent)
-                  
+
                 return "where %s" % " and ".join(elems)
 
             def get_sql_values(self, session, pool):
@@ -2019,7 +2019,7 @@
 
             def render_sql_limit(self, session, *args):
                 pass
-            
+
             def render_sql_orderby(self, session, *args):
                 return "order by machine, name asc"
 
@@ -2029,7 +2029,7 @@
 
             self.itemset = PoolJobStats(cls.model.app, "stats")
             self.itemset.items.path = "CuminPool.FakeJobStats.stats"
-            
+
         def get_stat_record(self, session, pool):
             cursor = self.itemset.get_items(session, pool)
             rows = self.itemset.cursor_to_rows(cursor)
@@ -2066,7 +2066,7 @@
     def __init__(self, model):
         super(CuminLimit, self).__init__ \
             (model, "limit", Limit)
-            
+
         prop = CuminProperty(self, "name")
         prop.title = "Name"
 
@@ -2077,7 +2077,7 @@
         prop = CuminProperty(self, "max")
         prop.summary = True
         prop.title = "Maximum"
-        
+
         action = self.Edit(self, "edit")
         action.title = "Edit"
         action.summary = True
@@ -2091,7 +2091,7 @@
 
     def get_title(self, session):
         return "Concurrency Limit"
-    
+
     def get_object_title(self, session, limit):
         title = self.get_title(session)
         name = limit.id
@@ -2102,20 +2102,20 @@
             frame = self.cumin_class.show_object(session, limit)
             frame = frame.show_edit(session)
             return frame
-    
+
     class SetLimit(CuminAction):
         def show(self, session, job):
             pass
-        
+
         def get_title(self, session):
             return "Set Limit for"
-        
+
         def do_invoke(self, limit, negotiator, completion):
             Name = limit.id
             Max = limit.max
             negotiator.SetLimit(self.model.data, completion, Name, Max)
             #negotiator.SetLimit(self.model.data, completion, Name, str(Max))
-    
+
 class CuminJobGroup(CuminClass):
     def __init__(self, model):
         super(CuminJobGroup, self).__init__ \
@@ -2161,7 +2161,7 @@
 
     def get_icon_href(self, session):
         return "resource?name=group-36.png"
-    
+
     class Hold(CuminAction):
         def show(self, session, group):
             frame = self.model.frame.pool.job_group_hold.show(session)
@@ -2234,13 +2234,13 @@
         prop.group = "Job Status Info"
         prop.title = "Hold Reason Code"
         prop.writable = False
-        
+
         prop = AdProperty(self, "ExitStatus")
         prop.description = "Status when job completes"
         prop.group = "Job Status Info"
         prop.title = "Exit Status"
         prop.writable = False
-        
+
         prop = AdProperty(self, "ProcId")
         prop.description = "The id of the job within its cluster. Proc Ids are unique within a cluster."
         prop.group = "Job Status Info"
@@ -2257,7 +2257,7 @@
         prop.group = "Other"
         prop.title = "Cluster ID"
         prop.writable = False
-        
+
         prop = DateAdProperty(self, "QDate")
         prop.description = "When the job was submitted"
         prop.writable = False
@@ -2265,28 +2265,28 @@
         prop = DateAdProperty(self, "JobStartDate")
         prop.group = "Main"
         prop.writable = False
-        
+
         prop = DateAdProperty(self, "JobCurrentStartDate")
         prop.writable = False
-        
+
         prop = DateAdProperty(self, "LastSuspensionTime")
         prop.writable = False
-        
+
         prop = DateAdProperty(self, "ShadowBday")
         prop.writable = False
-        
+
         prop = DateAdProperty(self, "LastJobLeaseRenewal")
         prop.writable = False
-        
+
         prop = DateAdProperty(self, "EnteredCurrentStatus")
         prop.writable = False
-        
+
         prop = DateAdProperty(self, "CommittedTime")
         prop.writable = False
-        
+
         prop = DateAdProperty(self, "LastMatchTime")
         prop.writable = False
-        
+
         ######## Properties
         prop = self.GroupProperty(self, "CustomGroup")
         prop.title = "Job Group"
@@ -2354,19 +2354,19 @@
         ######## Actions
         action = self.Hold(self, "hold")
         action.summary = True
-        
+
         action = self.Release(self, "release")
         action.summary = True
-        
+
         action = self.Remove(self, "remove")
         action.summary = True
 
         action = self.SetAttribute(self, "setattribute")
         action.navigable = False
-        
+
         action = self.GetAd(self, "getad")
         action.navigable = False
-        
+
         action = self.Fetch(self, "fetch")
         action.navigable = False
 
@@ -2375,7 +2375,7 @@
 
     def get_title(self, session):
         return "Job"
-    
+
     def get_object_name(self, job):
         return job.CustomId
 
@@ -2384,21 +2384,21 @@
 
     class JobStatusProperty(AdProperty):
         def render_status(self, session, status):
-            return JobStatusInfo.get_status_string(status)            
-            
+            return JobStatusInfo.get_status_string(status)
+
     class GroupProperty(CuminProperty):
         def value(self, session, job):
             group = JobGroup(job.CustomGroup)
             href = self.model.frame.pool.job_group.get_href(session, group)
             content = fmt_shorten(group.id, 12, 3)
             return fmt_link(href, group.get_id())
-                
+
     class SubmitterProperty(CuminProperty):
         def value(self, session, job):
             sub = job.submitter
             href = self.model.frame.pool.submitter.get_href(session, sub)
             return fmt_link(href, sub.Name)
-        
+
     class SchedulerProperty(CuminProperty):
         def value(self, session, job):
             sched = job.scheduler
@@ -2409,37 +2409,37 @@
         def do_invoke(self, job):
             self.job_ads = {"":{"VALUE": "", "TYPE": 0}}
             self.got_data = False
-            
+
             def completion(status, job_ads):
                 try:
                     self.job_ads = job_ads["JobAd"]
                     self.got_data = True
                 except:
                     pass
-                
+
             def predicate():
                 return self.got_data
-            
+
             try:
                 job.GetAd(self.model.data, completion, None)
             except Exception, e:
                 return self.job_ads
-            
+
             # wait for up to 20 seconds for completion to be called
             wait(predicate, timeout=20)
             return self.job_ads
-        
+
     class Fetch(CuminAction):
         def get_xml_response(self, session, job, *args):
             file, start, end, tail = args
             self.job_output = None
             self.got_data = False
             self.reason = None
-            
+
             def completion(status, job_output):
                 if "Data" in job_output:
                     raw = job_output["Data"]
-                    #remove the last partial line from the buffer 
+                    #remove the last partial line from the buffer
                     lindex = -1
                     ord_nl = ord('\n')
                     while ord(raw[-lindex:][0]) != ord_nl:
@@ -2449,10 +2449,10 @@
                     self.reason = status
 
                 self.got_data = True
-                
+
             def predicate():
                 return self.got_data
-            
+
             try:
                 data = None
                 job.Fetch(self.model.data, completion, file, start, end, data)
@@ -2461,11 +2461,11 @@
                 if not self.got_data:
                     self.reason = "time out"
             except Exception, e:
-                self.reason = e 
+                self.reason = e
 
             if self.reason:
                 self.job_output = "Unable to get file at %s. Reason: %s" % (file, self.reason)
-                    
+
             return self.job_output and "<fetch><output>%s</output><tail>%s</tail></fetch>" % (escape_entity(self.job_output), tail)
 
     class Hold(CuminAction):
@@ -2473,24 +2473,24 @@
             frame = self.model.frame.pool.jobs_hold.show(session)
             frame.ids.set(session, [job.id])
             return frame
-        
+
         def get_title(self, session):
             return "Hold"
 
         def do_invoke(self, job, reason, completion):
             job.Hold(self.model.data, completion, reason)
-        
+
         def get_enabled(self, session, job):
             is_held = JobStatusInfo.get_status_int("Held") == job.JobStatus
             is_deleted = job.qmfDeleteTime is not None
             return not (is_held or is_deleted)
-    
+
     class Release(CuminAction):
         def show(self, session, job):
             frame = self.model.frame.pool.jobs_release.show(session)
             frame.ids.set(session, [job.id])
             return frame
-        
+
         def get_title(self, session):
             return "Release"
 
@@ -2507,7 +2507,7 @@
             frame = self.model.frame.pool.jobs_remove.show(session)
             frame.ids.set(session, [job.id])
             return frame
-        
+
         def get_title(self, session):
             return "Remove"
 
@@ -2521,10 +2521,10 @@
     class SetAttribute(CuminAction):
         def show(self, session, job):
             pass
-        
+
         def get_title(self, session):
             return "Save Ad for"
-        
+
         def do_invoke(self, job, args, completion):
             Name = args[0]
             Value = args[1]
@@ -2534,12 +2534,12 @@
     def get_xml_response(self, session, object, *args):
         updateTime = object.statsCurr and object.statsCurr.qmfUpdateTime \
             or object.qmfUpdateTime
-        delta = secs(updateTime) - secs(datetime.now()) 
+        delta = secs(updateTime) - secs(datetime.now())
         conf = "<age>%i</age>" % -delta
         rect = "<updatetime>%s</updatetime>" % fmt_duration(delta)
 
         return "%s%s" % (conf, rect)
-    
+
 class CuminScheduler(RemoteClass):
     def __init__(self, model):
         super(CuminScheduler, self).__init__(model, "scheduler",
@@ -2587,7 +2587,7 @@
 
         action = self.Start(self, "start")
         action.summary = True
-        
+
         action = self.Stop(self, "stop")
         action.summary = True
 
@@ -2596,7 +2596,7 @@
 
     def init(self):
         self.frame = self.model.frame.pool.scheduler
-        
+
     def get_title(self, session):
         return "Scheduler"
 
@@ -2608,7 +2608,7 @@
             frame = self.model.frame.pool.show_scheds_start(session)
             frame.ids.set(session, [sched.id])
             return frame
-        
+
         def get_title(self, session):
             return "Start"
 
@@ -2617,7 +2617,7 @@
             frame = self.model.frame.pool.show_scheds_stop(session)
             frame.ids.set(session, [sched.id])
             return frame
-        
+
         def get_title(self, session):
             return "Stop"
 
@@ -2640,7 +2640,7 @@
 
     def init(self):
         self.frame = self.model.frame.pool.submitter
-        
+
     def get_title(self, session):
         return "Submitter"
 
@@ -2678,7 +2678,7 @@
 
     def init(self):
         self.frame = self.model.frame.pool.collector
-        
+
     def get_title(self, session):
         return "Collector"
 
@@ -2691,7 +2691,7 @@
             ids = [collector.id]
             frame.ids.set(session, ids)
             return frame
-        
+
         def get_title(self, session):
             return "Start"
 
@@ -2701,7 +2701,7 @@
             ids = [collector.id]
             frame.ids.set(session, ids)
             return frame
-        
+
         def get_title(self, session):
             return "Stop"
 
@@ -2718,7 +2718,7 @@
 
         prop = CuminProperty(self, "MyAddress")
         prop.title = "Address"
-        
+
         prop = CuminProperty(self, "DaemonStartTime")
         prop.title = "Start Time"
 
@@ -2744,7 +2744,7 @@
 
         action = self.Start(self, "start")
         action.summary = True
-        
+
         action = self.Stop(self, "stop")
         action.summary = True
 
@@ -2759,7 +2759,7 @@
 
     def init(self):
         self.frame = self.model.frame.pool.negotiator
-        
+
     def get_title(self, session):
         return "Negotiator"
 
@@ -2771,7 +2771,7 @@
             frame = self.model.frame.pool.show_negs_start(session)
             frame.ids.set(session, [neg.id])
             return frame
-        
+
         def get_title(self, session):
             return "Start"
 
@@ -2780,7 +2780,7 @@
             frame = self.model.frame.pool.show_negs_stop(session)
             frame.ids.set(session, [neg.id])
             return frame
-        
+
         def get_title(self, session):
             return "Stop"
 
@@ -2802,19 +2802,19 @@
         def do_invoke(self, negotiator):
             self.lim = dict()
             self.got_data = False
-            
+
             def completion(status, data):
                 self.lim = data["Limits"]
                 self.got_data = True
-                
+
             def predicate():
                 return self.got_data
-            
+
             try:
                 negotiator.GetLimits(self.model.data, completion, None)
             except Exception, e:
                 return self.lim
-            
+
             # wait for up to 5 seconds for completion to be called
             wait(predicate, timeout=5)
             if not self.got_data:
@@ -2847,9 +2847,9 @@
         if cls:
             for id in self.__ids.get(session):
                 objects.append(cls.mint_class.get(id))
-        
+
         self.app.model.write_xml(session, writer, objects)
-        
+
         return writer.to_string()
 
 class CallPage(Page):
@@ -2861,7 +2861,7 @@
 
         self.__id = IntegerParameter(app, "id")
         self.add_parameter(self.__id)
-        
+
         self.__method = Parameter(app, "method")
         self.add_parameter(self.__method)
 
@@ -2887,7 +2887,7 @@
                     args = xargs and xargs.split("&") or list()
                     data = action.get_xml_response(session, object, *args)
                     self.write_xml(writer, data)
-        
+
         return writer.to_string()
 
     def write_xml(self, writer, data):

Modified: mgmt/trunk/cumin/python/cumin/negotiator.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/negotiator.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/negotiator.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -26,7 +26,7 @@
         col = self.NameColumn(app, "name")
         self.add_column(col)
         self.set_default_column(col)
-        
+
         col = self.SystemColumn(app, "system")
         self.add_column(col)
 
@@ -77,28 +77,28 @@
         def process_submit(self, session):
             ids = self.parent.ids.get(session)
             self.parent.ids.clear(session)
-    
+
             branch = session.branch()
             frame = self.frame.show_negs_start(branch)
             frame.ids.set(branch, ids)
             self.page.set_redirect_url(session, branch.marshal())
-            
+
         def render_content(self, session):
             return "Start"
-        
+
     class StopButton(FormButton):
         def process_submit(self, session):
             ids = self.parent.ids.get(session)
             self.parent.ids.clear(session)
-    
+
             branch = session.branch()
             frame = self.frame.show_negs_stop(branch)
             frame.ids.set(branch, ids)
             self.page.set_redirect_url(session, branch.marshal())
-            
+
         def render_content(self, session):
             return "Stop"
-        
+
 class NegotiatorFrame(CuminFrame):
     def __init__(self, app, name):
         super(NegotiatorFrame, self).__init__(app, name)
@@ -128,14 +128,14 @@
             negotiator = self.get_args(session)[0]
             if negotiator:
                 return "call.xml?class=negotiator;id=%i;method=GetStarted" % negotiator.id
-    
+
         def render_title(self, session, *args):
             return "Negotiator Status"
-    
+
 class NegStart(CuminBulkActionForm):
     def render_title(self, session, *args):
         return "Start Negotiator"
-    
+
     def render_form_heading(self, session, *args):
         return ""
 
@@ -151,7 +151,7 @@
 class NegStop(CuminBulkActionForm):
     def render_title(self, session, *args):
         return "Stop Negotiator"
-    
+
     def render_form_heading(self, session, *args):
         return ""
 
@@ -163,4 +163,3 @@
         action = self.app.model.master.stop
         action.invoke(negotiator, {"subsystem": "NEGOTIATOR"})
         self.process_cancel(session)
-

Modified: mgmt/trunk/cumin/python/cumin/negotiator.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/negotiator.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/negotiator.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -35,23 +35,23 @@
 
 [NegotiatorSet.html]
 <form id="{id}" method="post" action="?">
-	
-	  <div class="sactions">
-	    <h2>Act on Selected Negotiators:</h2>
-	    {start} {stop}
-	  </div>
-	
-	<table class="mobjects">
-	  <thead>
-	    <tr>
-	      <th class="setnav" colspan="{column_count}">
-	        <div class="rfloat">{page}</div>
-	        {count}
-	      </th>
-	    </tr>
-	    <tr>{headers}</tr>
-	  </thead>
-	  <tbody>{items}</tbody>
-	</table>
-	<div>{hidden_inputs}</div>
+
+  <div class="sactions">
+    <h2>Act on Selected Negotiators:</h2>
+    {start} {stop}
+  </div>
+
+  <table class="mobjects">
+    <thead>
+      <tr>
+	<th class="setnav" colspan="{column_count}">
+	  <div class="rfloat">{page}</div>
+	  {count}
+	</th>
+      </tr>
+      <tr>{headers}</tr>
+    </thead>
+    <tbody>{items}</tbody>
+  </table>
+  <div>{hidden_inputs}</div>
 </form>

Modified: mgmt/trunk/cumin/python/cumin/page.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/page.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/page.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -1,110 +1,110 @@
 [MainFrame.css]
 #head {
-  padding: 0;
-  border-bottom: 1px solid #999;
-  color: #ddd;
-  background: #666 url("resource?name=mrg-banner.png") no-repeat scroll center;
+    padding: 0;
+    border-bottom: 1px solid #999;
+    color: #ddd;
+    background: #666 url("resource?name=mrg-banner.png") no-repeat scroll center;
 }
 
 #trans0 {
-  background-color: black;
-  height: 0.15em;
-  width: 100%;
+    background-color: black;
+    height: 0.15em;
+    width: 100%;
 }
 
 #head a {
-  color: #c0d0e0;
+    color: #c0d0e0;
 }
 
 body.modal #head {
-  opacity: 0.2;
+    opacity: 0.2;
 }
 
 #head .tabs {
-  padding: 0 0 0.25em 0.5em;
+    padding: 0 0 0.25em 0.5em;
 }
 
 #head .tabs li {
-  display: inline;
+    display: inline;
 }
 
 #head .tabs li a {
-  padding: 0.225em 0.5em 0.275em 0.5em;
-  border-right: 2px solid #444;
-  background-color: #333;
-  color: #ccc;
-  line-height: 1.5em;
-  vertical-align: -15%;
+    padding: 0.225em 0.5em 0.275em 0.5em;
+    border-right: 2px solid #444;
+    background-color: #333;
+    color: #ccc;
+    line-height: 1.5em;
+    vertical-align: -15%;
 }
 
 #head .tabs li:last-child a {
-  border-right: 0;
+    border-right: 0;
 }
 
 #head .tabs li a.selected {
-  background-color: #000;
-  color: #fff;
+    background-color: #000;
+    color: #fff;
 }
 
 #body {
-  padding: 1em;
+    padding: 1em;
 }
 
 #logo {
-  vertical-align: -20%;
+    vertical-align: -20%;
 }
 
 #user {
-  padding: 0.25em 0.5em;
-  float: right;
-  color: #fff;
-  font-size: 0.9em;
+    padding: 0.25em 0.5em;
+    float: right;
+    color: #fff;
+    font-size: 0.9em;
 }
 
 #logout {
-  color: #06c;
+    color: #06c;
 }
 
 #actions {
-  padding: 0.25em 0.5em;
-  float: right;
-  font-size: 0.9em;
+    padding: 0.25em 0.5em;
+    float: right;
+    font-size: 0.9em;
 }
 
 #context {
-  display: inline;
-  list-style: none;
-  padding: 0 1em;
-  margin: 0;
-  line-height: 1.75em;
-  font-size: 0.9em;
-  color: #fff;
+    display: inline;
+    list-style: none;
+    padding: 0 1em;
+    margin: 0;
+    line-height: 1.75em;
+    font-size: 0.9em;
+    color: #fff;
 }
 
 #context li {
-  display: inline;
+    display: inline;
 }
 
 #context li:before {
-  content: " > ";
-  font-weight: bold;
-  font-size: 0.8em;
-  color: #ccc;
+    content: " > ";
+    font-weight: bold;
+    font-size: 0.8em;
+    color: #ccc;
 }
 
 #context li:last-child a {
-  color: #ddd;
+    color: #ddd;
 }
 
 #context li:first-child:before {
-  content: "";
+    content: "";
 }
 
 #trans1 {
-  padding: 0;
-  margin: 0;
-  border-top: 1px solid #bbb;
-  border-bottom: 1px solid #ddd;
+    padding: 0;
+    margin: 0;
+    border-top: 1px solid #bbb;
+    border-bottom: 1px solid #ddd;
 }
 
 [MainFrame.javascript]
@@ -189,17 +189,17 @@
 
 [OverviewTab.css]
 table.OverviewTab {
-  width: 100%;
+    width: 100%;
 }
 
 table.OverviewTab > tbody > tr > td {
-  width: 50%;
-  vertical-align: top;
+    width: 50%;
+    vertical-align: top;
 }
 
 table.OverviewTab h2 img {
-  vertical-align: -15%;
-  margin: 0 0.2em 0 0;
+    vertical-align: -15%;
+    margin: 0 0.2em 0 0;
 }
 
 [OverviewTab.html]
@@ -232,16 +232,16 @@
 
 [ManagementServerNotice.css]
 div.ManagementServerNotice {
-  margin: 0 0 1em 0;
-  border: 1px dotted #cec;
-  padding: 1em;
-  background-color: #dfd;
+    margin: 0 0 1em 0;
+    border: 1px dotted #cec;
+    padding: 1em;
+    background-color: #dfd;
 }
 
 div.ManagementServerNotice img {
-  vertical-align: top;
-  float: left;
-  margin: 0 0.5em 0.5em 0;
+    vertical-align: top;
+    float: left;
+    margin: 0 0.5em 0.5em 0;
 }
 
 [ManagementServerNotice.html]
@@ -295,28 +295,27 @@
   <div class="TabbedModeSet mode">{mode}</div>
 </div>
 
-
 [MyGridJobs.html]
-  <div class="rfloat">{phase}</div>
-  Jobs submitted by {user}
+<div class="rfloat">{phase}</div>
+Jobs submitted by {user}
 <form id="{id}" style="clear:right;" method="post" action="?">
 
-	  <div class="sactions">
-	    <h2>Act on Selected Jobs:</h2>
-	    {hold} {release} {remove}
-	  </div>
-	
-	<table class="mobjects">
-	  <thead>
-	    <tr>
-	      <th class="setnav" colspan="{column_count}">
-	        <div class="rfloat">{page}</div>
-	        {count}
-	      </th>
-	    </tr>
-	    <tr>{headers}</tr>
-	  </thead>
-	  <tbody>{items}</tbody>
-	</table>
-	<div>{hidden_inputs}</div>
+  <div class="sactions">
+    <h2>Act on Selected Jobs:</h2>
+    {hold} {release} {remove}
+  </div>
+
+  <table class="mobjects">
+    <thead>
+      <tr>
+	<th class="setnav" colspan="{column_count}">
+	  <div class="rfloat">{page}</div>
+	  {count}
+	</th>
+      </tr>
+      <tr>{headers}</tr>
+    </thead>
+    <tbody>{items}</tbody>
+  </table>
+  <div>{hidden_inputs}</div>
 </form>

Modified: mgmt/trunk/cumin/python/cumin/parameters.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/parameters.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/parameters.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -107,14 +107,14 @@
 class Limit(object):
     def __init__(self, id):
         self.id = id
-        
+
     def get_id(self):
         return self.id
-    
+
 class LimitParameter(Parameter):
     def do_unmarshal(self, string):
         return Limit(string)
-    
+
     def do_marshal(self, limit):
         return limit.id
 

Modified: mgmt/trunk/cumin/python/cumin/pool.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/pool.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/pool.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -50,7 +50,7 @@
             pool = Identifiable(data["id"])
             self.page.main.set_last_pool(session, data["id"])
             href = self.frame.pool.get_href(session, pool)
-            
+
             return fmt_link(href, data["name"])
 
     class JobsColumn(SqlTableColumn):
@@ -80,10 +80,10 @@
 
         self.job = JobFrame(app, "job")
         self.add_mode(self.job)
-        
+
         self.job_group = JobGroupFrame(app, "jobgroup")
         self.add_mode(self.job_group)
-        
+
         self.scheduler = SchedulerFrame(app, "sched")
         self.add_mode(self.scheduler)
 
@@ -107,16 +107,16 @@
 
         self.__startcoll = CollectorStart(app, "startcoll")
         self.add_mode(self.__startcoll)
-        
+
         self.__stopcoll = CollectorStop(app, "stopcoll")
         self.add_mode(self.__stopcoll)
-        
+
         self.__startsched = SchedulerStart(app, "startsched")
         self.add_mode(self.__startsched)
-        
+
         self.__stopsched = SchedulerStop(app, "stopsched")
         self.add_mode(self.__stopsched)
-        
+
         self.jobs_hold = JobSetHold(app, "jobshold")
         self.add_mode(self.jobs_hold)
 
@@ -128,41 +128,41 @@
 
         self.job_group_hold = JobGroupHold(app, "jobgrouphold")
         self.add_mode(self.job_group_hold)
-        
+
         self.job_group_release = JobGroupRelease(app, "jobgrouprelease")
         self.add_mode(self.job_group_release)
-        
+
         self.job_group_remove = JobGroupRemove(app, "jobgroupremove")
         self.add_mode(self.job_group_remove)
-        
+
     def show_job_frame(self, session):
         self.page.set_frame(session, self.job)
         return self.show_mode(session, self.job)
-    
+
     def show_negs_start(self, session):
         self.page.set_frame(session, self.__startneg)
         return self.show_mode(session, self.__startneg)
-    
+
     def show_negs_stop(self, session):
         self.page.set_frame(session, self.__stopneg)
         return self.show_mode(session, self.__stopneg)
-    
+
     def show_scheds_start(self, session):
         self.page.set_frame(session, self.__startsched)
         return self.show_mode(session, self.__startsched)
-    
+
     def show_scheds_stop(self, session):
         self.page.set_frame(session, self.__stopsched)
         return self.show_mode(session, self.__stopsched)
-    
+
     def show_colls_start(self, session):
         self.page.set_frame(session, self.__startcoll)
         return self.show_mode(session, self.__startcoll)
-    
+
     def show_colls_stop(self, session):
         self.page.set_frame(session, self.__stopcoll)
         return self.show_mode(session, self.__stopcoll)
-    
+
 class PoolView(CuminView):
     def __init__(self, app, name):
         super(PoolView, self).__init__(app, name)
@@ -203,13 +203,13 @@
 
     def set_collector_tab(self, session):
         self.__tabs.set_selected_mode(session, self.colls)
-        
+
     def set_negotiator_tab(self, session):
         self.__tabs.set_selected_mode(session, self.negs)
-        
+
     def set_scheduler_tab(self, session):
         self.__tabs.set_selected_mode(session, self.scheds)
-        
+
 class PoolSchedulerSet(SchedulerSet):
     def get_args(self, session):
         return self.frame.get_args(session)
@@ -237,7 +237,7 @@
 
     def render_sql_where(self, session, pool):
         return "where d.pool = %(pool)s"
-    
+
 class PoolCollectorSet(CollectorSet):
     def get_args(self, session):
         return self.frame.get_args(session)
@@ -251,7 +251,7 @@
 
     def render_sql_where(self, session, pool):
         return "where c.pool = %(pool)s"
-    
+
 class PoolNegotiatorSet(NegotiatorSet):
     def get_args(self, session):
         return self.frame.get_args(session)
@@ -276,7 +276,7 @@
         recent = self.get_recent_sql_where(session)
         if recent:
             elems.append(recent)
-          
+
         return "where %s" % " and ".join(elems)
 
     def get_sql_values(self, session, pool):
@@ -285,7 +285,7 @@
     def render_title(self, session, pool):
         count = self.get_item_count(session, pool)
         return "Slots %s" % fmt_count(count)
-    
+
     def filter(self, session, system, slots):
         return slots
 
@@ -298,21 +298,21 @@
 
         self.slot_map = self.PoolSlotMap(app, "pool_slot_map")
         self.add_child(self.slot_map)
-        
+
     def render_title(self, session):
         return "Statistics"
-    
+
     class PoolSlotMap(SlotMap):
         def get_title_name(self, session, pool):
             return pool.name
-        
+
         def render_slot_clip_size(self, session, *args):
             return 400
-    
+
 class PoolStatSet(StatSet):
     def render_rate_text(self, session, args):
         return "Percentage"
-    
+
     def do_get_items(self, session, pool):
         stats = super(PoolStatSet, self).do_get_items(session, pool)
 
@@ -322,7 +322,7 @@
         fake_stats = list()
         for stat in stats:
             fake_stats.append((stat[0], record))
-        
+
         return fake_stats
 
 class PoolJobStats(CuminTable):
@@ -338,9 +338,9 @@
 class PoolStatus(CuminStatus):
     def __init__(self, app, name):
         super(PoolStatus, self).__init__(app, name)
-        
+
         self.item_tmpl = Template(self, "status_html")
-        
+
     def render_title(self, session, pool):
         return "Pool Status"
 
@@ -355,6 +355,6 @@
 
     def render_idle(self, session, record):
         return record["idl"]
-            
+
     def render_total(self, session, record):
         return record["all"]

Modified: mgmt/trunk/cumin/python/cumin/pool.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/pool.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/pool.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -33,7 +33,6 @@
 [PoolJobStats.count_sql]
 1
 
-
 [PoolView.javascript]
 function updatePool(data) {
     var model = data.objectify();
@@ -54,17 +53,19 @@
 
 [PoolStatus.javascript]
 var pool_stats_last_all = "";
-function updatePoolStatus(id, pool) {
 
+function updatePoolStatus(id, pool) {
     var s = pool.stat;
     var sdata = {"div": {"span": [s.idl.value, s.all.value]}};
 
     wooly.doc().elembyid(id).update(sdata);
+
     if (pool_stats_last_all != "") {
         if (s.all.value != pool_stats_last_all) {
-        	window.location.reload(true);
+            window.location.reload(true);
         }
-    } 
+    }
+
     pool_stats_last_all = s.all.value;
 }
 
@@ -72,20 +73,19 @@
 <div id="{id}" class="CuminStatus {color}">
   <h2>{title}</h2>
 
-	{status}
+  {status}
 </div>
 <script type="text/javascript">
-//<![CDATA[
+  //<![CDATA[
   cumin.objectListeners["{id}"] = updatePoolStatus;
 //]]>
 </script>
 
 [PoolStatus.status_html]
-    <div>
-        <span>{idle}</span> of <span>{total}</span> slots idle
-    </div>
+<div>
+  <span>{idle}</span> of <span>{total}</span> slots idle
+</div>
 
-
 [PoolStats.html]
 <div style="width: 40%; float: left;">
   <h2>General</h2>
@@ -97,4 +97,3 @@
     {pool_slot_map}
 </div>
 <div style="clear:left;"><!-- --></div>
-

Modified: mgmt/trunk/cumin/python/cumin/queue.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/queue.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/queue.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -98,7 +98,7 @@
 
         def render_content(self, session):
             return "Purge"
-        
+
     class Remove(FormButton):
         def process_submit(self, session):
             ids = self.parent.ids.get(session)
@@ -107,10 +107,10 @@
             branch = session.branch()
             self.frame.queues_remove.show(branch).ids.set(branch, ids)
             self.page.set_redirect_url(session, branch.marshal())
-            
+
         def render_content(self, session):
             return "Remove"
-        
+
     class NameColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Name"
@@ -308,9 +308,9 @@
 
         self.__remove = self.Remove(app, "remove")
         self.add_child(self.__remove)
-        
+
         self.set_default_column_name("e_id")
-        
+
     def get_visible_columns(self, session):
         return self.get_request_visible_columns(session, ["e_id"])
 
@@ -318,7 +318,7 @@
         branch = session.branch()
         self.frame.binding_add.show(branch)
         return branch.marshal()
-    
+
     def render_sql_where(self, session, queue):
         elems = list()
         elems.append("b.queue_id = %(id)r")
@@ -337,7 +337,7 @@
             href = self.frame.frame.bindings_remove.get_href \
                 (session, ids)
             self.page.set_redirect_url(session, href)
-            
+
         def render_content(self, session):
             return "Remove"
 
@@ -346,7 +346,7 @@
         super(QueueForm, self).__init__(app, name)
 
         assert vhost
-        
+
         self.vhost = vhost
 
         self.namef = NameField(app, "name")
@@ -354,39 +354,39 @@
 
         self.more = MoreFieldSet(app, "more")
         self.add_field(self.more)
-        
+
         self.durable = self.QueueDurabilityField(app, "durable")
         self.more.add_field(self.durable)
-        
+
         self.cluster_durable = self.ClusterDurabilityField(app, "cluster_durable")
         self.more.add_field(self.cluster_durable)
-        
+
         self.lvq = self.LVQField(app, "lvq")
         self.more.add_field(self.lvq)
-        
+
         self.optimistic = self.OptimisticField(app, "optimistic")
         self.more.add_field(self.optimistic)
 
         self.file_count = self.FileCountField(app, "file_count")
         self.file_count.input.param.default = 8
         self.more.add_field(self.file_count)
-        
+
         self.file_size = self.FileSizeField(app, "file_size")
         self.file_size.input.param.default = 24
         self.more.add_field(self.file_size)
-        
+
         self.policy = self.PolicyField(app, "policy")
         self.more.add_field(self.policy)
-        
+
         self.q_size = self.QSizeField(app, "q_size")
         self.more.add_field(self.q_size)
-        
+
         self.q_count = self.QCountField(app, "q_count")
         self.more.add_field(self.q_count)
-        
+
         self.bindings = ExchangeKeysField(app, "bindings", self.vhost)
         self.add_field(self.bindings)
-        
+
     def validate(self, session, queue_name):
         super_error = super(QueueForm, self).validate(session)
         (errors, form_binding_info) = self.bindings.get_binding_errors(session, queue_name)
@@ -395,35 +395,35 @@
     class QCountField(IntegerField):
         def render_title(self, session):
             return "<div style=\"padding-left: 1em;\">Max Queue Count</div>"
-        
+
         def render_field_help(self, session):
             return "(Maximum in-memory queue size as a number of messages. Applies if Policy is set.)"
-        
+
     class QSizeField(IntegerField):
         def render_title(self, session):
             return "<div style=\"padding-left: 1em;\">Max Queue Size</div>"
-        
+
         def render_field_help(self, session):
             return "(Maximum in-memory queue size as bytes. Applies if Policy is set.)"
-        
+
     class FileCountField(IntegerField):
         def render_title(self, session):
             return "File Count"
-        
+
         def render_field_help(self, session):
             return "(Number of files in queue's persistence journal)"
-        
+
     class FileSizeField(IntegerField):
         def render_title(self, session):
             return "File Size"
-        
+
         def render_field_help(self, session):
             return "(File size in pages - 64Kb/page)"
-    
+
     class QueueDurabilityField(TwoOptionRadioField):
         def render_title(self, session):
             return "Durable?"
-        
+
         def render_field_help(self, session):
             return "(Queue is durable)"
 
@@ -436,10 +436,10 @@
     class ClusterDurabilityField(TwoOptionRadioField):
         def render_title(self, session):
             return "Cluster Durable?"
-        
+
         def render_field_help(self, session):
             return "(Queue becomes durable if there is only one functioning cluster node)"
-            
+
         def render_title_1(self, session):
             return "Cluster Durable"
 
@@ -449,10 +449,10 @@
     class LVQField(TwoOptionRadioField):
         def render_title(self, session):
             return "Enable Last Value Queue?"
-        
+
         def render_field_help(self, session):
             return "(Enable LVQ behavior on the queue)"
-            
+
         def render_title_1(self, session):
             return "Enabled"
 
@@ -462,10 +462,10 @@
     class OptimisticField(TwoOptionRadioField):
         def render_title(self, session):
             return "Enable Optimistic Consume?"
-        
+
         def render_field_help(self, session):
             return "(Enable optimistic consume on the queue)"
-            
+
         def render_title_1(self, session):
             return "Enabled"
 
@@ -475,64 +475,64 @@
     class PolicyField(RadioField):
         def __init__(self, app, name):
             super(QueueForm.PolicyField, self).__init__(app, name, None)
-    
+
             self.param = Parameter(app, "param")
             self.param.default = "none"
             self.add_parameter(self.param)
-    
+
             option = self.NoneField(app, "none", self.param)
             self.add_option(option)
-            
+
             option = self.Reject(app, "reject", self.param)
             self.add_option(option)
-            
+
             option = self.Flow(app, "flow", self.param)
             self.add_option(option)
-    
+
             option = self.Ring(app, "ring", self.param)
             self.add_option(option)
-    
+
             option = self.RingStrict(app, "ring_strict", self.param)
             self.add_option(option)
-    
+
         def render_title(self, session):
             return "Policy-type"
-    
+
         def render_field_help(self, session):
             return "(Action taken when queue limit is reached)"
-            
+
         class NoneField(RadioFieldOption):
             def render_value(self, session):
                 return "none"
-    
+
             def render_title(self, session):
                 return "None"
-    
+
         class Reject(RadioFieldOption):
             def render_value(self, session):
                 return "reject"
-    
+
             def render_title(self, session):
                 return "Reject"
-    
+
         class Flow(RadioFieldOption):
             def render_value(self, session):
                 return "flow"
-    
+
             def render_title(self, session):
                 return "Flow to disc"
-    
+
         class Ring(RadioFieldOption):
             def render_value(self, session):
                 return "ring"
-    
+
             def render_title(self, session):
                 return "Ring"
-    
+
         class RingStrict(RadioFieldOption):
             def render_value(self, session):
                 return "ring_strict"
-    
+
             def render_title(self, session):
                 return "Ring Strict"
 
@@ -703,7 +703,7 @@
         queue = Queue.get(id)
         action = self.app.model.queue.remove
         action.invoke(queue)
- 
+
     def render_title(self, session):
         return "Remove Queues"
 
@@ -718,7 +718,7 @@
         self.add_child(self.sum_props)
 
         self.prop_tmpl = Template(self, "properties_html")
-        
+
     class SummaryProperties(CuminProperties):
         def do_get_items(self, session, queue):
             return [("Name", queue.name),
@@ -752,7 +752,7 @@
         self.bindings = ExchangeKeysField(app, "bindings", self.vhost,
                                           title="Bind to Exchange:")
         self.add_field(self.bindings)
-        
+
         self.errors = self.Errors(self, "errors")
         self.add_attribute(self.errors)
 
@@ -765,7 +765,7 @@
         if "no_exchanges" in errors:
             return "<ul class=\"errors\" style=\"margin:0; float:left;\"><li>%s</li></ul>" % \
                 "</li><li>".join(errors["no_exchanges"])
-        
+
     def process_cancel(self, session):
         branch = session.branch()
         self.frame.show_view(branch)
@@ -782,7 +782,7 @@
             errs = errors.setdefault("no_exchanges", list())
             errs.append("At least one exchange must be selected")
             errors = True
-            
+
         if errors:
             pass
         else:
@@ -790,10 +790,10 @@
             args = {
                     "exchange_keys": form_binding_info,
                     "reg": reg}
-            
+
             action = self.app.model.queue.bind
             action.invoke(queue, args)
-            
+
             # navigate back to main queue frame
             self.process_cancel(session)
 
@@ -805,14 +805,14 @@
     class Errors(Attribute):
         def get_default(self, session):
             return dict()
-        
+
 class QueueBindingRemove(CuminConfirmForm):
     def get_args(self, session):
         return self.frame.get_args(session)
 
     def process_submit(self, session, binding):
         log.info("Removing binding %s" % binding)
-        
+
         self.process_cancel(session, binding)
 
     def render_title(self, session, binding):
@@ -928,13 +928,13 @@
 
         chart = self.EnqueueTransactionRateChart(app, "enqtxn")
         self.add_child(chart)
-        
+
         chart = self.DequeueTransactionRateChart(app, "deqtxn")
         self.add_child(chart)
-        
+
         chart = self.EnqueueDequeueRateChart(app, "enqdeq")
         self.add_child(chart)
-        
+
     def render_title(self, session):
         return "Transactions"
 
@@ -1014,10 +1014,10 @@
         param = QueueParameter(app, "param")
         self.param = param
         self.add_parameter(param)
-        
+
         self.queue_set = self.QueueInputSet(app, "queue_set", param)
         self.add_child(self.queue_set)
-        
+
     def get(self, session):
         return self.param.get(session)
 
@@ -1042,13 +1042,13 @@
                 if (_queue.qmfUpdateTime > (datetime.now() - delta)) and (_queue.name != queue.name):
                     queue_list.append(_queue)
             return queue_list
-        
+
         def render_item_value(self, session, queue):
             return queue.id
-        
+
         def render_item_content(self, session, queue):
             return queue.name or "<em>Default</em>"
-        
+
         def render_item_checked_attr(self, session, queue):
             return queue is self.param.get(session) and "checked=\"checked\"" or None
 
@@ -1092,4 +1092,3 @@
 
     def render_cancel_content(self, session, queue):
         return "No, Cancel"
-

Modified: mgmt/trunk/cumin/python/cumin/queue.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/queue.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/queue.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -36,9 +36,8 @@
 
 [QueueSet.html]
 <form id="{id}" method="post" action="?">
-
   <ul class="actions">
-  	<li><a class="nav" href="{add_queue_url}">Add New Queue</a></li>
+    <li><a class="nav" href="{add_queue_url}">Add New Queue</a></li>
   </ul>
   <div class="rfloat">{phase}</div>
   {unit}
@@ -147,30 +146,30 @@
 
 [QueueBindingSet.html]
 <form id="{id}" method="post" action="?">
+  <div class="rfloat">{phase}</div>
 
-	<div class="rfloat">{phase}</div>
-	<ul class="actions">
-		<li><a class="nav" href="{add_queue_binding_url}">Add Binding</a></li>
-	</ul>
-	
-	  <div class="sactions">
-	    <h2>Act on Selected Bindings:</h2>
-	    {remove}
-	  </div>
-	
-	<table class="mobjects">
-	  <thead>
-	    <tr>
-	      <th class="setnav" colspan="{column_count}">
-	        <div class="rfloat">{page}</div>
-	        {count}
-	      </th>
-	    </tr>
-	    <tr>{headers}</tr>
-	  </thead>
-	  <tbody>{items}</tbody>
-	</table>
-	<div>{hidden_inputs}</div>
+  <ul class="actions">
+    <li><a class="nav" href="{add_queue_binding_url}">Add Binding</a></li>
+  </ul>
+
+  <div class="sactions">
+    <h2>Act on Selected Bindings:</h2>
+    {remove}
+  </div>
+
+  <table class="mobjects">
+    <thead>
+      <tr>
+	<th class="setnav" colspan="{column_count}">
+	  <div class="rfloat">{page}</div>
+	  {count}
+	</th>
+      </tr>
+      <tr>{headers}</tr>
+    </thead>
+    <tbody>{items}</tbody>
+  </table>
+  <div>{hidden_inputs}</div>
 </form>
 
 [ExchangeBindingSet.item_html]
@@ -286,9 +285,9 @@
 
 [BindSummaryPropertiesField.properties_html]
 <div class="properties" style="width:80%">
-	<table class="PropertySet">
-	<tbody>
-		{prop_items}
-	</tbody>
-	</table>
+  <table class="PropertySet">
+    <tbody>
+      {prop_items}
+    </tbody>
+  </table>
 </div>

Modified: mgmt/trunk/cumin/python/cumin/quirk.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/quirk.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/quirk.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -65,7 +65,7 @@
 
     def set_payload(self, payload):
         self.content.body = payload
-        
+
     def send(self, session, dest, key=None):
         if dest.__class__ is Queue:
             self.content["routing_key"] = dest.name

Modified: mgmt/trunk/cumin/python/cumin/realm.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/realm.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/realm.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -22,7 +22,7 @@
 class RealmInputSet(CheckboxInputSet):
     def __init__(self, app, name):
         super(RealmInputSet, self).__init__(app, name)
-        
+
         param = ListParameter(app, "param", RealmParameter(app, "item"))
         self.add_parameter(param)
         self.set_parameter(param)

Modified: mgmt/trunk/cumin/python/cumin/scheduler.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/scheduler.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/scheduler.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -88,28 +88,28 @@
         def process_submit(self, session):
             ids = self.parent.ids.get(session)
             self.parent.ids.clear(session)
-    
+
             branch = session.branch()
             frame = self.frame.show_scheds_start(branch)
             frame.ids.set(branch, ids)
             self.page.set_redirect_url(session, branch.marshal())
-            
+
         def render_content(self, session):
             return "Start"
-        
+
     class StopButton(FormButton):
         def process_submit(self, session):
             ids = self.parent.ids.get(session)
             self.parent.ids.clear(session)
-    
+
             branch = session.branch()
             frame = self.frame.show_scheds_stop(branch)
             frame.ids.set(branch, ids)
             self.page.set_redirect_url(session, branch.marshal())
-            
+
         def render_content(self, session):
             return "Stop"
-        
+
 class SchedulerFrame(CuminFrame):
     def __init__(self, app, name):
         super(SchedulerFrame, self).__init__(app, name)
@@ -136,7 +136,7 @@
 
         jobs = SchedulerJobSet(app, "jobs")
         self.__tabs.add_tab(jobs)
-        
+
         details = CuminDetails(app, "details")
         self.__tabs.add_tab(details)
 
@@ -149,10 +149,10 @@
             scheduler = self.get_args(session)[0]
             if scheduler:
                 return "call.xml?class=scheduler;id=%i;method=GetStarted" % scheduler.id
-    
+
         def render_title(self, session, *args):
             return "Scheduler Status"
-        
+
 class SchedulerStats(Widget):
     def __init__(self, app, name):
         super(SchedulerStats, self).__init__(app, name)
@@ -193,7 +193,7 @@
 class SchedulerJobSet(JobTab):
     def __init__(self, app, name):
         super(SchedulerJobSet, self).__init__(app, name)
-        
+
     def get_visible_columns(self, session):
         return self.get_request_visible_columns(session, ["custom_group", "submitter"])
 
@@ -209,7 +209,7 @@
 class SchedulerStart(CuminBulkActionForm):
     def render_title(self, session, *args):
         return "Start Scheduler"
-    
+
     def render_form_heading(self, session, *args):
         return ""
 
@@ -225,7 +225,7 @@
 class SchedulerStop(CuminBulkActionForm):
     def render_title(self, session, *args):
         return "Stop Scheduler"
-    
+
     def render_form_heading(self, session, *args):
         return ""
 
@@ -237,4 +237,3 @@
         action = self.app.model.master.stop
         action.invoke(scheduler, {"subsystem": "SCHEDD"})
         self.process_cancel(session)
-

Modified: mgmt/trunk/cumin/python/cumin/scheduler.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/scheduler.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/scheduler.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -37,25 +37,24 @@
 
 [SchedulerSet.html]
 <form id="{id}" method="post" action="?">
-	
-	  <div class="sactions">
-	    <h2>Act on Selected Schedulers:</h2>
-	    {start} {stop}
-	  </div>
-	
-	<table class="mobjects">
-	  <thead>
-	    <tr>
-	      <th class="setnav" colspan="{column_count}">
-	        <div class="rfloat">{page}</div>
-	        {count}
-	      </th>
-	    </tr>
-	    <tr>{headers}</tr>
-	  </thead>
-	  <tbody>{items}</tbody>
-	</table>
-	<div>{hidden_inputs}</div>
+  <div class="sactions">
+    <h2>Act on Selected Schedulers:</h2>
+    {start} {stop}
+  </div>
+
+  <table class="mobjects">
+    <thead>
+      <tr>
+	<th class="setnav" colspan="{column_count}">
+	  <div class="rfloat">{page}</div>
+	  {count}
+	</th>
+      </tr>
+      <tr>{headers}</tr>
+    </thead>
+    <tbody>{items}</tbody>
+  </table>
+  <div>{hidden_inputs}</div>
 </form>
 
 [SchedulerStats.html]
@@ -75,27 +74,26 @@
 </table>
 
 [SchedulerJobSet.html]
-  <div class="rfloat">{phase}</div>
+<div class="rfloat">{phase}</div>
+
 <form id="{id}" style="clear:right;" method="post" action="?">
+  <div class="sactions">
+    {job_search}
+    <h2>Act on Selected Jobs:</h2>
+    {hold} {release} {remove}
+  </div>
 
-	  <div class="sactions">
-	    {job_search}
-	    <h2>Act on Selected Jobs:</h2>
-	    {hold} {release} {remove}
-	  </div>
-	
-	<table class="mobjects">
-	  <thead>
-	    <tr>
-	      <th class="setnav" colspan="{column_count}">
-	        <div class="rfloat">{page}</div>
-	        {count}
-	      </th>
-	    </tr>
-	    <tr>{headers}</tr>
-	  </thead>
-	  <tbody>{items}</tbody>
-	</table>
-	<div>{hidden_inputs}</div>
+  <table class="mobjects">
+    <thead>
+      <tr>
+	<th class="setnav" colspan="{column_count}">
+	  <div class="rfloat">{page}</div>
+	  {count}
+	</th>
+      </tr>
+      <tr>{headers}</tr>
+    </thead>
+    <tbody>{items}</tbody>
+  </table>
+  <div>{hidden_inputs}</div>
 </form>
-

Modified: mgmt/trunk/cumin/python/cumin/slot.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/slot.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/slot.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -30,7 +30,7 @@
 
         col = self.Name(app, "name")
         self.add_column(col)
-        
+
     class Name(SqlTableColumn):
         def render_title(self, session, data):
             return "Name"
@@ -38,13 +38,13 @@
     def render_items(self, session, *args):
         """ overridden because a slotset query is expensive.
             the rows are cached """
-            
+
         rows = self.get_items(session, *args)
         writer = Writer()
 
         for row in rows:
             self.item_tmpl.render(writer, session, row)
-        
+
         return writer.to_string()
 
 class MachineSet(UniqueSlot):

Modified: mgmt/trunk/cumin/python/cumin/slot.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/slot.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/slot.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -1,5 +1,5 @@
 [SlotSet.sql]
-select 
+select
   s.id,
   s.name,
   s.machine,
@@ -20,10 +20,10 @@
 from (select distinct name from slot as s {sql_where}) as s
 
 [SlotStatSet.sql]
-select 
+select
   sum(case activity when 'Idle' then 1 else 0 end) as idl,
   sum(1) as all
-from (select 
+from (select
   s.name,
   s.pool,
   s.qmf_update_time,
@@ -42,8 +42,8 @@
   sum(case activity when 'Busy' then 1 else 0 end) as busy,
   sum(case activity when 'Idle' then 1 else 0 end) as idle,
   sum(1) as total
-from  
-(select 
+from
+(select
   s.name,
   s.machine,
   s.pool,
@@ -53,7 +53,7 @@
  left outer join slot_stats as c on c.id = s.stats_curr_id) as s
 {sql_where}
 group by machine
-{sql_orderby}  
+{sql_orderby}
 
 [MachineSet.count_sql]
 select count(1)

Modified: mgmt/trunk/cumin/python/cumin/stat.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/stat.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/stat.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -17,7 +17,7 @@
     unit_abbrevs = dict()
     unit_abbrevs["message"] = "msg"
     unit_abbrevs["transaction"] = "trans"
-    
+
     def __init__(self, app, name, category):
         super(StatSet, self).__init__(app, name)
 
@@ -36,7 +36,7 @@
         for stat in cls.stats:
             if self.category == stat.category:
                 stats.append((stat, object))
-        
+
         return stats
 
     def render_item_title(self, session, args):
@@ -45,14 +45,14 @@
 
     def render_rate_text(self, session, args):
         return "Per Second"
-    
+
     def render_item_name(self, session, args):
         stat, object = args
         return stat.name
 
     def render_item_value(self, session, args):
         stat, object = args
-        
+
         #if stat.link_cb:
         #    branch = session.branch()
         #    stat.link_cb(self.page, branch, object)
@@ -63,7 +63,7 @@
 
     def render_item_rate(self, session, args):
         stat, object = args
-        
+
         #if False and stat.highlow: #XXX
         #    return "<small>high</small>&nbsp;<span>%i</span> " + \
         #           "<small>low</small>&nbsp;<span>%i</span>" \
@@ -146,7 +146,7 @@
 class ImageCache(object):
     def __init__(self):
         self.__files = dict() # {name: {"time": time_created, "file": file object, "cookie": (cookie values)}}
-        
+
     def find_recent(self, name, max_age):
         for cname in self.__files:
             if cname == name:
@@ -161,7 +161,7 @@
                     break
 
         return (None, None)
-    
+
     def create_cache_file(self, name, args):
         if name not in self.__files:
             file = tempfile.TemporaryFile()
@@ -174,14 +174,14 @@
         return file
 
 class SlotMapPage(Page):
-    interiors = {"Idle": (.7,.7,.7), 
+    interiors = {"Idle": (.7,.7,.7),
                "Busy": (0.0, 0.4, 0.0),
                "Suspended": (1,0,0),
                "Vacating": (1,.73,.367),
                "Killing": (0,0,1),
                "Benchmarking": (1,.8,.8),
                None: (.8,.8,.8)}
-    
+
     max_width = 400
     max_png_age = 30
     def __init__(self, app, name):
@@ -195,7 +195,7 @@
 
         self.zoom_level = IntegerParameter(app, "zl")
         self.add_parameter(self.zoom_level)
-        
+
         self.zoom_x = IntegerParameter(app, "zx")
         self.add_parameter(self.zoom_x)
 
@@ -206,7 +206,7 @@
         self.add_parameter(self.dot)
 
         self.cache = ImageCache()
-        
+
     def get_content_type(self, session):
         return "image/png"
 
@@ -229,7 +229,7 @@
         writer = Writer()
         surface.write_to_png(writer)
         return writer.to_string()
-        
+
     def do_render(self, session, object):
         dot = self.dot.get(session)
         if dot:
@@ -245,24 +245,24 @@
             #print "returning cached copy of png at zoom %i, x %i, y %i" % (zl, zx, zy)
             self.set_cookie(session, args)
             return cached_png
-        
+
         #print "starting rendering png at zoom %i, x %i, y %i" % (zl, zx, zy)
         map = HeatMapChart(self.max_width, self.max_width)
-        
+
         cls = self.class_.get(session)
         action = cls.get_visualization_action()
         slot_info = action.get_boxes(session, object)
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
+
         if len(slot_info) == 0:
             return ""
-        
+
         slots = [ [self.interiors[x["activity"]], x["state"]] for x in slot_info ]
         size = map.plot_slots(slots, zl, zx, zy)
 
         args = (size, map.width, map.height, len(slots), map.rows, map.cols)
         self.set_cookie(session, args)
         self.cache_it(session, zl, map, args)
-        
+
         writer = Writer()
         map.write(writer)
         #print "done rendering png at zoom %i, x %i, y %i" % (zl, zx, zy)
@@ -271,12 +271,12 @@
     def get_cached(self, session, zl):
         filename = self.__gen_filename(session, zl)
         return self.cache.find_recent(filename, self.max_png_age)
-        
+
     def cache_it(self, session, zl, map, args):
         filename = self.__gen_filename(session, zl)
         writer = self.cache.create_cache_file(filename, args)
         map.write(writer)
-    
+
     def __gen_filename(self, session, zl):
         cls = self.class_.get(session)
         id = self.id.get(session)
@@ -285,7 +285,7 @@
     def set_cookie(self, session, args):
         cookie = "|".join((str(x) for x in args))
         session.set_cookie("slot_info", cookie)
-        
+
 class StatChartPage(Page):
     def __init__(self, app, name):
         super(StatChartPage, self).__init__(app, name)
@@ -393,7 +393,7 @@
 
         for stat, color in zip(stats, colors):
             chart.plot_values(samples[stat], color=color)
-        
+
         chart.plot_frame()
 
         if self.mode.get(session) == "rate":

Modified: mgmt/trunk/cumin/python/cumin/stat.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/stat.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/stat.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -43,36 +43,36 @@
 
 [StatSet.css]
 table.StatSet {
-  width: 100%;
-  border-collapse: collapse;
-  margin: 1em 0;
+    width: 100%;
+    border-collapse: collapse;
+    margin: 1em 0;
 }
 
 table.StatSet tr {
-  border-top: 1px dotted #ccc;
+    border-top: 1px dotted #ccc;
 }
 
 table.StatSet td, table.StatSet th {
-  padding: 0.35em 0.5em;
-  font-weight: normal;
+    padding: 0.35em 0.5em;
+    font-weight: normal;
 }
 
 table.StatSet th {
-  color: #444;
+    color: #444;
 }
 
 table.StatSet thead th {
-  font-style: italic;
-  font-size: 0.9em;
-  text-align: right;
+    font-style: italic;
+    font-size: 0.9em;
+    text-align: right;
 }
 
 table.StatSet tbody th {
-  text-align: left;
+    text-align: left;
 }
 
 table.StatSet td {
-  text-align: right;
+    text-align: right;
 }
 
 [StatSet.html]
@@ -129,26 +129,27 @@
     } else {
         src = src.substring(0, sep) + ";" + time;
     }
+
     return src;
 }
 
 [StatValueChart.css]
 div.StatValueChart {
-  font-size: 0.9em;
-  margin: 0 0 1.5em 0;
-  width: 30em;
+    font-size: 0.9em;
+    margin: 0 0 1.5em 0;
+    width: 30em;
 }
 
 div.StatValueChart div.duration {
-  margin: 1em 0 0.5em 1em; 
+    margin: 1em 0 0.5em 1em;
 }
 
 div.StatValueChart ul.radiotabs {
-  margin: 0;
+    margin: 0;
 }
 
 div.StatValueChart img {
-  margin: 0 0 0 1em;
+    margin: 0 0 0 1em;
 }
 
 [StatValueChart.html]
@@ -168,4 +169,3 @@
   <span class="swatch" style="background-color: {stat_color}">&nbsp;</span>
   &nbsp; <span class="ph" statname="{stat_name}" statmode="{mode}">{stat_value}</span>
 </li>
-

Modified: mgmt/trunk/cumin/python/cumin/submitter.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/submitter.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/submitter.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -63,7 +63,7 @@
 
         jobs = SubmitterJobSet(app, "jobs")
         self.__tabs.add_tab(jobs)
-        
+
         details = CuminDetails(app, "details")
         self.__tabs.add_tab(details)
 
@@ -101,7 +101,7 @@
 class SubmitterJobSet(JobTab):
     def __init__(self, app, name):
         super(SubmitterJobSet, self).__init__(app, name)
-        
+
     def get_visible_columns(self, session):
         return self.get_request_visible_columns(session, ["custom_group", "scheduler"])
 
@@ -113,4 +113,3 @@
     def render_title(self, session, submitter):
         submitter_sql = "submitter_id = %i" % submitter.id
         return "Jobs %s" % fmt_count(Job.select(submitter_sql).count())
-

Modified: mgmt/trunk/cumin/python/cumin/submitter.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/submitter.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/submitter.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -46,27 +46,26 @@
 </table>
 
 [SubmitterJobSet.html]
-  <div class="rfloat">{phase}</div>
+<div class="rfloat">{phase}</div>
 <form id="{id}" style="clear:right;" method="post" action="?">
 
-	  <div class="sactions">
-	    {job_search}
-	    <h2>Act on Selected Jobs:</h2>
-	    {hold} {release} {remove}
-	  </div>
-	
-	<table class="mobjects">
-	  <thead>
-	    <tr>
-	      <th class="setnav" colspan="{column_count}">
-	        <div class="rfloat">{page}</div>
-	        {count}
-	      </th>
-	    </tr>
-	    <tr>{headers}</tr>
-	  </thead>
-	  <tbody>{items}</tbody>
-	</table>
-	<div>{hidden_inputs}</div>
-</form>
+  <div class="sactions">
+    {job_search}
+    <h2>Act on Selected Jobs:</h2>
+    {hold} {release} {remove}
+  </div>
 
+  <table class="mobjects">
+    <thead>
+      <tr>
+	<th class="setnav" colspan="{column_count}">
+	  <div class="rfloat">{page}</div>
+	  {count}
+	</th>
+      </tr>
+      <tr>{headers}</tr>
+    </thead>
+    <tbody>{items}</tbody>
+  </table>
+  <div>{hidden_inputs}</div>
+</form>

Modified: mgmt/trunk/cumin/python/cumin/system.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/system.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/system.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -35,10 +35,10 @@
         col = self.LoadColumn(app, "load")
         col.alignment = "right"
         self.add_column(col)
-        
+
     def render_title(self, session, *args):
         return "Systems %s" % fmt_count(self.get_item_count(session, *args))
-        
+
     class NameColumn(SqlTableColumn):
         def render_title(self, session, data):
             return "Name"
@@ -143,7 +143,7 @@
 
         vis = self.SystemSlotMap(app, "system_slot_map")
         self.add_child(vis)
-        
+
     def render_title(self, session):
         return "Statistics"
 
@@ -195,7 +195,7 @@
 
     def get_sql_values(self, session, system):
         return {"nodeName": system.nodeName}
-        
+
 from slot import SlotSet
 
 class SystemSlotSet(SlotSet):
@@ -214,16 +214,16 @@
         recent = self.get_recent_sql_where(session)
         if recent:
             elems.append(recent)
-          
+
         return "where %s" % " and ".join(elems)
-        
+
     def get_sql_values(self, session, system):
         return {"nodeName": system.nodeName}
 
 class SystemServices(ItemSet):
     def render_title(self, session, *args):
         return "Services"
-    
+
     def get_args(self, session):
         return (self.frame.get_object(session),)
 
@@ -231,10 +231,10 @@
         daemons = list()
         daemon_types = [Scheduler, Collector, Negotiator]
         sql = "system = '%s'" % system.nodeName
-        
+
         for daemon in daemon_types:
             system_daemons = daemon.select(sql)
-            for devil in system_daemons: 
+            for devil in system_daemons:
                 try:
                     daemons.append(devil)
                 except Exception, e:
@@ -247,7 +247,7 @@
                 daemons.append(BrokerRegistration.get(broker.registrationID))
 
         return daemons
-    
+
     def render_item_content(self, session, item):
         if isinstance(item, BrokerRegistration):
             reg = Identifiable(item.id)

Modified: mgmt/trunk/cumin/python/cumin/test.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/test.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/test.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -92,7 +92,7 @@
                 ready = True
                 break
 
-            print ".", 
+            print ".",
 
         self.broker_conn.open()
 
@@ -184,7 +184,7 @@
         self.name = self.__class__.__name__
         self.parent = parent
         self.children = list()
-        
+
         if parent:
             self.parent.children.append(self)
 
@@ -278,7 +278,7 @@
 class BrokerLinkTest(Test):
     def __init__(self, env, parent):
         super(BrokerLinkTest, self).__init__(env, parent)
-        
+
         RouteTest(env, self)
         self.LinkRemove(env, self)
 
@@ -323,7 +323,7 @@
             p.process(s)
 
             self.env.check_redirect(p, s)
-            
+
             def predicate():
                 return self.env.link.qmfDeleteTime
 
@@ -332,7 +332,7 @@
 class RouteTest(Test):
     def __init__(self, env, parent):
         super(RouteTest, self).__init__(env, parent)
-        
+
         self.Add(env, self)
         self.Remove(env, self)
 
@@ -342,7 +342,7 @@
     class Add(Test):
         def do_run(self, session):
             p, s = self.env.page_and_session()
-    
+
             p.main.broker.set_object(s, self.env.broker)
             p.main.broker.link.set_object(s, self.env.link)
 
@@ -356,20 +356,20 @@
             form.key.set(s, "cumin.key")
             form.tag.set(s, "cumin.tag")
             form.excludes.set(s, "cumin.tag")
-    
+
             form.submit(s)
 
             p.process(s)
-    
+
             self.env.check_redirect(p, s)
-    
+
             def predicate():
                 for item in Bridge.selectBy(link=self.env.link, dest=self.env.broker_exchange.name, key="cumin.key"):
                     self.env.bridge = item
                     return True
-    
+
             wait(predicate)
-    
+
     class Remove(Test):
         def do_run(self, session):
             p, s = self.env.page_and_session()
@@ -385,7 +385,7 @@
             p.process(s)
 
             self.env.check_redirect(p, s)
-            
+
             def predicate():
                 return self.env.bridge.qmfDeleteTime
 
@@ -496,7 +496,7 @@
 
     def do_run(self, session):
         self.run_children(session)
-        
+
     class BindDirect(Test):
         def __init__(self, env, parent):
             super(BindQueueTest.BindDirect, self).__init__(env, parent)
@@ -520,7 +520,7 @@
             direct["key"] = "amq.direct.key"
 
             form.bindings.dict_param.set(s, binding)
-            
+
             form.submit(s)
 
             p.process(s)
@@ -575,7 +575,7 @@
             direct["type"] = "topic"
             direct["key"] = "topic.key"
             form.bindings.dict_param.set(s, binding)
-            
+
             form.submit(s)
             p.process(s)
 
@@ -628,7 +628,7 @@
             direct["name"] = "amq.fanout"
             direct["type"] = "fanout"
             form.bindings.dict_param.set(s, binding)
-            
+
             form.submit(s)
             p.process(s)
 
@@ -681,7 +681,7 @@
             direct["mkey.1"] = "key1"
             direct["mkey.1.nv"] = "name.value.1"
             form.bindings.dict_param.set(s, binding)
-            
+
             form.submit(s)
             p.process(s)
 
@@ -744,7 +744,7 @@
 
         AddQueueTest(env, self)
         self.Remove(env, self)
-        
+
     def do_run(self, session):
         vhost = self.env.vhost
         name = self.env.broker_queue.name
@@ -805,7 +805,7 @@
                 return True
 
         wait(predicate)
-            
+
 class ExchangeTest(Test):
     def __init__(self, env, parent):
         super(ExchangeTest, self).__init__(env, parent)
@@ -845,9 +845,9 @@
             # wait for newly created exchange to get marked as deleted
             def predicate():
                 return self.env.added_exchange.qmfDeleteTime
-        
+
             wait(predicate)
-        
+
 class ConnectionTest(Test):
     def do_run(self, session):
         raise Exception("Not implemented")

Modified: mgmt/trunk/cumin/python/cumin/tools.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/tools.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/tools.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -19,7 +19,7 @@
     while password is None:
         once = getpass("Enter new password: ")
         twice = getpass("Confirm new password: ")
-        
+
         if once == twice:
             password = once
         else:
@@ -294,7 +294,7 @@
                 password = args[2]
             except IndexError:
                 password = prompt_password()
-            
+
             crypted = crypt_password(password)
 
             try:
@@ -322,7 +322,7 @@
 
                 name = args[1]
                 subjects = Subject.selectBy(name=name)
-                
+
                 if subjects.count():
                     for subject in subjects:
                         subject.destroySelf()
@@ -422,7 +422,7 @@
                 raise CommandException(self, "USER is required")
 
             subject = Subject.getByName(ssubject)
-            
+
             if not subject:
                 raise CommandException\
                     (self, "User '%s' is unknown" % subject.name)
@@ -499,7 +499,7 @@
 
             log.warn("Mint subprocess %i wouldn't go gracefully, killed",
                      self.proc.pid)
-                    
+
     def do_run(self, opts, args):
         self.config.load_dict(opts)
 

Modified: mgmt/trunk/cumin/python/cumin/user.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/user.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/user.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -1,31 +1,31 @@
 [LoginPage.css]
 body.LoginPage {
-  background: #f7f7f7;
-  padding: 4em;
+    background: #f7f7f7;
+    padding: 4em;
 }
 
 [LoginForm.css]
 form.LoginForm {
-  background: #fff;
-  width: 16em;
-  margin: 0 auto;
-  border: 1px solid #ddd;
-  -moz-border-radius: 0.5em;
-  -webkit-border-radius: 0.5em;
-  padding: 2em;
+    background: #fff;
+    width: 16em;
+    margin: 0 auto;
+    border: 1px solid #ddd;
+    -moz-border-radius: 0.5em;
+    -webkit-border-radius: 0.5em;
+    padding: 2em;
 }
 
 form.LoginForm > h1 {
-  margin: 0 0 1em 0;
+    margin: 0 0 1em 0;
 }
 
 form.LoginForm h1 img {
-  vertical-align: -60%;
-  margin: 0 0.25em 0 0;
+    vertical-align: -60%;
+    margin: 0 0.25em 0 0;
 }
 
 form.LoginForm input {
-  width: 12em;
+    width: 12em;
 }
 
 form.LoginForm input.submit {
@@ -33,11 +33,11 @@
 }
 
 form.LoginForm > div.buttons {
-  margin: 1.5em 0 0 0;
+    margin: 1.5em 0 0 0;
 }
 
 form.LoginForm p.login_invalid {
-  color: red;
+    color: red;
 }
 
 [LoginForm.html]
@@ -51,16 +51,17 @@
 
   {login_invalid}
 
-  {fields}  
+  {fields}
 
   <div class="buttons">{submit}</div>
 
   <div>{hidden_inputs}</div>
 </form>
+
 <script type="text/javascript">
   wooly.doc().elembyid("{id}").node.elements[0].focus();
 </script>
 
 [LoginForm.login_invalid]
-<p class="login_invalid">The user name and password you
-entered do not match any account.</p>
+<p class="login_invalid">The user name and password you entered do not
+match any account.</p>

Modified: mgmt/trunk/cumin/python/cumin/util.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/util.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/util.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -115,7 +115,7 @@
                 end = ocurly
             else:
                 strings.append(begin_delim + text[end + 1:ccurly] + end_delim)
-                    
+
                 start = ccurly + 1
                 end = ocurly
 

Modified: mgmt/trunk/cumin/python/cumin/visualizations.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/visualizations.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/visualizations.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -18,16 +18,16 @@
 class SlotMap(Widget):
     def __init__(self, app, name):
         super(SlotMap, self).__init__(app, name)
-        
+
         self.slot_info = self.SlotInfo(app, "slot_info")
         self.add_child(self.slot_info)
-    
+
         self.slot_legend = self.SlotLegend(app, "slot_legend")
         self.add_child(self.slot_legend)
-        
+
         self.wait = self.PleaseWait(app, "please_wait")
         self.add_child(self.wait)
-    
+
     def get_args(self, session):
         return self.frame.get_args(session)
 
@@ -41,10 +41,10 @@
         params.append("zy=0") # zoom top
 
         return "slots.png?" + ";".join(params)
-    
+
     def get_title_name(self, session, object):
         return str(object.id)
-    
+
     def render_title(self, session, object):
         return "Slots on '%s'" % self.get_title_name(session, object)
 
@@ -61,87 +61,87 @@
     class PleaseWait(CuminForm):
         def __init__(self, app, name):
             super(SlotMap.PleaseWait, self).__init__(app, name)
-    
+
             self.__cancel = self.Cancel(app, "cancel")
             self.__cancel.set_tab_index(201)
             self.add_child(self.__cancel)
 
         def get_modal(self, session):
             return False
-        
+
         class Cancel(FormButton):
             def render_class(self, session, *args):
                 return "cancel"
-    
+
             def render_content(self, session, *args):
                 return "Cancel"
-    
+
             def render_onclick(self, session, *args):
                 return "cancel_wait"
-            
+
     class SlotLegend(Widget):
         def __init__(self, app, name):
             super(SlotMap.SlotLegend, self).__init__(app, name)
-            
+
             self.states = self.SlotStates(app, "slot_states")
             self.add_child(self.states)
-            
+
             self.activities = self.SlotActivities(app, "slot_activities")
             self.add_child(self.activities)
-            
+
         class SlotStates(ItemSet):
             states = ("Unclaimed", "Claimed", "Owner", "Matched", "Preempting")
-            
+
             def do_get_items(self, session):
                 return self.states
 
             def render_initial(self, session, state):
                 return state[0]
-            
+
             def render_title(self, session, state):
                 return state
-                
+
         class SlotActivities(ItemSet):
-            activities = [("Idle", "clear"), 
+            activities = [("Idle", "clear"),
                            ("Busy", "green"),
                            ("Suspended", "red"),
                            ("Vacating", "orange"),
                            ("Killing", "blue"),
                            ("Benchmarking", "yellow"),
                            ("Unknown", "grey")]
-            
+
             def do_get_items(self, session):
                 return self.activities
 
             def render_title(self, session, activity):
                 return activity[0]
-            
+
             def render_href(self, session, activity):
                 params = list()
-                params.append("dot=%s" % activity[0]) 
-        
+                params.append("dot=%s" % activity[0])
+
                 return "slots.png?" + ";".join(params)
 
             def render_dot_size(self, session, activity):
                 return 12
-            
+
     class SlotInfo(ItemSet):
-        display_names = {"jid": "jid", "job_id": "Job ID", 
-                         "system": "System", "machine": "Machine", 
-                         "state": "State", "activity": "Activity", 
+        display_names = {"jid": "jid", "job_id": "Job ID",
+                         "system": "System", "machine": "Machine",
+                         "state": "State", "activity": "Activity",
                          "name": "Name"}
 
         def __init__(self, app, name):
             super(SlotMap.SlotInfo, self).__init__(app, name)
-            
+
             self.info_index = IntegerParameter(app, "i")
             self.add_parameter(self.info_index)
-            
+
             self.info_div_tmpl = Template(self, "bg_html")
-            
+
         def get_args(self, session):
             return self.frame.get_args(session)
-        
+
         def do_render(self, session, *args):
             object = args[0]
             info_index = self.info_index.get(session)
@@ -155,26 +155,25 @@
                 return writer.to_string()
             else:
                 return super(SlotMap.SlotInfo, self).do_render(session, *args)
-            
+
         def do_get_items(self, session, slot):
-            return ((self.display_names[x], slot[x]) 
+            return ((self.display_names[x], slot[x])
                     for x in slot if x in self.display_names)
-        
+
         def render_slot_info_url(self, session, *args):
             return self.page.get_update_url(session, [self])
-            
+
         def render_slot_info_index(self, session, *args):
             return self.info_index.path
-        
+
         def render_title(self, session, item):
             return item[0]
-    
+
         def render_value(self, session, item):
             return item[1]
-        
+
         def render_job_id(self, session, item):
             return item[0] == "jid" and "id='job_id'" or ""
-        
+
         def render_row_class(self, session, item):
             return item[0] == "jid" and "class='hidden_row'" or ""
-            

Modified: mgmt/trunk/cumin/python/cumin/visualizations.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/visualizations.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/visualizations.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -1,7 +1,9 @@
 [SlotMap.javascript]
 var vis;
+
 (function() {
     vis = new Visualization();
+
     var slot_clip_left;
     var slot_clip_top;
     var slot_zoom;
@@ -28,6 +30,7 @@
             var now = new Date();
             animate_pan(slot_clip_left, Math.min(Math.floor(slot_clip_size / 1.1), -slot_clip_left), (now-0), "slot_clip_left");
         }
+
         this.pan_right = function () {
             var to_pan = Math.floor(slot_clip_size / 1.1);
             if (slot_clip_left - slot_clip_size - to_pan < -slot_map_info.width) {
@@ -36,11 +39,13 @@
             var now = new Date();
             animate_pan(slot_clip_left, -to_pan, (now-0), "slot_clip_left");
         }
+
         this.pan_up = function () {
             if (slot_clip_top == 0) return;
             var now = new Date();
             animate_pan(slot_clip_top, Math.min(Math.floor(slot_clip_size / 1.1), -slot_clip_top), (now-0), "slot_clip_top");
         }
+
         this.pan_down = function () {
             if (slot_map_info.height < slot_clip_size) return;
 
@@ -69,6 +74,7 @@
             slot_map_info.count = 0;
             slot_png_timer = setInterval(update_png, 10000);
         }
+
         this.img_loaded = function (oImg) {
             stop_auto_updates();
             var oZooming = document.getElementById("slot_zooming");
@@ -85,7 +91,7 @@
                 set_pan("slot_pandown", "width", slot_map_info.size * slot_map_info.cols, this.pan_down);
                 set_pan("slot_panleft", "height", slot_map_info.size * slot_map_info.rows, this.pan_left);
                 set_pan("slot_panright", "height", slot_map_info.size * slot_map_info.rows, this.pan_right);
-                
+
                 var oMap = document.getElementById(slot_current_id);
                 if (oMap) {
                     oMap.style.width = Math.min(oImg.width, slot_clip_size) + "px";
@@ -95,7 +101,7 @@
                             oMap.style.borderColor = "transparent";
                     else
                             oMap.style.borderColor = "#CCCCCC";
-                    
+
                 }
                 var oGlass = document.getElementById("slot_glass");
                 if (oGlass) {
@@ -128,7 +134,7 @@
                 }
             }
         }
-            
+
         this.moveGlass = function (e) {
             if (slot_map_info.size == 0) return;
             if (!e) var e = window.event;
@@ -138,11 +144,11 @@
                     var posxy = get_event_pos(e);
                     if ((posxy.x - oGlass.down_pos.x > 0) || (posxy.y - oGlass.down_pos.y > 0))
                         oGlass.down_pos = {x: posxy.x - slot_clip_left, y: posxy.y - slot_clip_top};
-                    
+
                     slot_clip_left = Math.min(posxy.x - oGlass.down_pos.x, 0);
                     slot_clip_top = Math.min(posxy.y - oGlass.down_pos.y, 0);
                     oGlass.drug = true;
-                    
+
                     draw_clipped();
                     if (e.preventDefault)
                         e.preventDefault();
@@ -167,7 +173,7 @@
                 clear_hover();
                 hide_info();
             }
-            return false;        
+            return false;
         }
 
         this.outGlass = function outGlass(e) {
@@ -179,7 +185,7 @@
         this.zoom_in_slots = function (posxy) {
             if (slot_zoom >= get_max_zoom()) return;
             var click_info = get_index(posxy.x, posxy.y);
-            slot_center_index = click_info.index;    
+            slot_center_index = click_info.index;
             do_zoom(slot_zoom + 1);
         }
 
@@ -198,7 +204,7 @@
 
         get_center_index();
         do_zoom(level);
-        
+
         if (e.stopPropagation)
             e.stopPropagation()
         else if (e.cancelBubble)
@@ -208,7 +214,7 @@
     function do_zoom(level) {
         var old_zoom = slot_zoom;
         slot_zoom = level;
-        
+
         stop_auto_updates();
         var oZooming = document.getElementById("slot_zooming");
         if (oZooming) {
@@ -239,9 +245,10 @@
             var original_x = oPos.offsetLeft;
             var now = new Date();
             var x_amount = ((level - 1) * 13) - original_x;
-            animate_zoom_pos(original_x, (now-0), x_amount)        
+            animate_zoom_pos(original_x, (now-0), x_amount)
         }
     }
+
     function animate_zoom_pos(original_x, original_time, x_amount) {
         var oPos = document.getElementById("zoom_pos");
         if (oPos) {
@@ -251,7 +258,7 @@
             if (delta < 1)
                 partial = Math.sin(Math.PI/2 * delta);
             oPos.style.left = Math.floor(original_x + x_amount * partial) + "px";
-                
+
             if (delta < 1)
                 setTimeout(function(){ animate_zoom_pos(original_x, original_time, x_amount) }, 10);
         }
@@ -261,7 +268,7 @@
         if (slot_png_timer) {
             clearInterval(slot_png_timer);
             slot_png_timer = null;
-        }    
+        }
     }
 
     function update_png() {
@@ -284,7 +291,6 @@
         }
     }
 
-
     function slot_cookie_info() {
         var slot_info = get_cookie("slot_info");
         if (slot_info) {
@@ -302,20 +308,20 @@
 
     function center_on_index() {
         if (slot_center_index == -1) return;
-        
+
         var row = slot_center_index % slot_map_info.cols;
         var col = Math.floor(slot_center_index / slot_map_info.cols);
         var x = col * slot_map_info.size + slot_map_info.size / 2;
         var y = row * slot_map_info.size + slot_map_info.size / 2;
-        
+
         var cl = (Math.min(slot_clip_size, slot_map_info.width) / 2) - x;
         var ct = (Math.min(slot_clip_size, slot_map_info.height) / 2) - y;
 
         if (slot_map_info.width + cl < slot_clip_size)
             cl = slot_clip_size - slot_map_info.width;
-            
+
         if (slot_map_info.height + ct < slot_clip_size)
-            ct = slot_clip_size - slot_map_info.height;  
+            ct = slot_clip_size - slot_map_info.height;
 
         if (cl > 0) cl = 0;
         if (ct > 0) ct = 0;
@@ -328,16 +334,17 @@
     function get_center_index() {
         var rx = Math.min(slot_clip_size, slot_map_info.width) / 2;
         var ry = Math.min(slot_clip_size, slot_map_info.height) / 2;
-        
+
         var click_info = get_index(rx, ry);
         if (click_info)
-            slot_center_index = click_info.index;    
+            slot_center_index = click_info.index;
     }
 
     function get_max_zoom() {
         // allow to zoom until each slot is at least 28px wide
         return Math.ceil(28 / (slot_map_info.size / slot_zoom));
     }
+
     function initialize_zoom() {
         var max_zoom = get_max_zoom();
         var oZoom = document.getElementById("zoom_levels");
@@ -359,7 +366,7 @@
                     oDiv.className = "zoom_middle_left";
                     oDiv.onclick = slot_zoom_to;
                     oDiv.level = i+1;
-                    oZoom.appendChild(oDiv);        
+                    oZoom.appendChild(oDiv);
                     oDiv = document.createElement("div");
                     oDiv.className = "zoom_middle_right";
                     oDiv.onclick = slot_zoom_to;
@@ -399,14 +406,14 @@
             clip_bottom = slot_map_info.height;
             clip_right = slot_map_info.width;
             slot_clip_left = 0;
-            slot_clip_top = 0;            
+            slot_clip_top = 0;
         } else {
             var iZoom = slot_zoom;
             var clip_width = slot_clip_size;
             var clip_height = slot_clip_size;
             clip_bottom = clip_height - slot_clip_top;
             clip_right = clip_width - slot_clip_left;
-        
+
             if (clip_right > slot_map_info.width) {
                 slot_clip_left += (clip_right - slot_map_info.width);
                 clip_right = slot_map_info.width;
@@ -416,7 +423,7 @@
                 clip_bottom = slot_map_info.height;
             }
         }
-        
+
         var oPng = document.getElementById("slot_png");
         if (oPng) {
             oPng.style.left = slot_clip_left + "px";
@@ -438,7 +445,7 @@
         draw_clipped();
         if (delta < 1)
             setTimeout( function () {animate_pan(original_edge, move, timer, which) }, 10);
-        
+
     }
 
     function clear_hover() {
@@ -452,6 +459,7 @@
             oHover.style.visibility = "hidden";
         }
     }
+
     function hide_info() {
         oInfo = get_slot_info_elem();
         if (oInfo) {
@@ -459,7 +467,7 @@
         }
         slot_last_index = -1;
     }
-             
+
     function get_index(x, y) {
         var width = slot_map_info.size;
         var pngrow = Math.floor((y - slot_clip_top) / width);
@@ -485,7 +493,7 @@
                     clearTimeout(slot_hover_timer);
                     slot_hover_timer = null;
                 }
-                slot_info_timer = setTimeout( function() { vis.fire_slot_info(click_info.index) }, 500); 
+                slot_info_timer = setTimeout( function() { vis.fire_slot_info(click_info.index) }, 500);
                 animate_hover(0, click_info.row, click_info.col);
                 oInfo = get_slot_info_elem();
                 if (oInfo) {
@@ -494,6 +502,7 @@
             }
         }
     }
+
     function animate_hover(leg, row, col) {
         var oHover = document.getElementById("slot_hover");
         if (oHover) {
@@ -507,9 +516,9 @@
             var ry = row * width + slot_clip_top;
             oHover.style.width = (width-1) + "px";
             oHover.style.height = (width-1) + "px";
-            
+
             switch (leg) {
-            case 0: 
+            case 0:
                     oHover.style.left = rx + "px";
                     oHover.style.top = ry + "px";
                     oHover.style.width = width + "px";
@@ -524,7 +533,7 @@
                         oHover.style.clip = "rect(" + (-cy) + "px " + (cw) + "px " + (ch) + "px " + (-cx) + "px)";
                     } else {
                         oHover.style.clip = "rect(0px " + (width+1) + "px " + (width+1) + "px 0px)";
-                    }                
+                    }
                     slot_hover_timer = setTimeout( function() {animate_hover(1)}, 500/3);
                     break;
             case 1: oHover.style.borderColor = "red red pink pink";
@@ -538,10 +547,11 @@
             }
         }
     }
+
     function get_slot_info_elem() {
         return document.getElementById(slot_info_id);
     }
-        
+
     function refire_info() {
         if (slot_last_index > -1) {
             do_info_request(slot_last_index)
@@ -555,7 +565,7 @@
         sess = sess + ";" + slot_info_index + "=" + index;
         sess = escape(sess);
         var newreq = replace_value(slot_info_url, "session", sess, ";");
-          
+
         wooly.directUpdate(newreq, got_slot_info, 0, {index: index});
     }
 
@@ -578,14 +588,14 @@
             if (for_jid) {
                 clicks.doClick(for_jid.x, for_jid.y);
                 return;
-            }            
+            }
 
             promote_to_body(oInfo); // so position is absolute to entire page
 
             oInfo.style.left = "-1000px";
             oInfo.style.visibility = "hidden";
             oInfo.style.display = "block";
-            
+
             var oMap = document.getElementById(slot_current_id);
             if (oMap) {
                 var abs_pos = findPos(oMap);
@@ -599,7 +609,7 @@
                 // if off the bottom of the map
                 if (top + oInfo.offsetHeight > abs_pos.y + oMap.offsetHeight) {
                     // position popup above clicked slot
-                    top = (abs_pos.y + y) - oInfo.offsetHeight - Math.floor(slot_map_info.size * .5); 
+                    top = (abs_pos.y + y) - oInfo.offsetHeight - Math.floor(slot_map_info.size * .5);
                 }
                 oInfo.style.top = top + "px";
                 oInfo.style.left = abs_pos.x + "px";
@@ -607,12 +617,12 @@
             oInfo.style.visibility = "visible";
         }
     }
-            
 
+
 }())
 
+var clicks;
 
-var clicks;
 (function() {
     clicks = new Clicks();
 
@@ -623,9 +633,9 @@
 
         this.doMouseDown = function(e) {
             if (!e) var e = window.event;
-            var which = e.type;    
+            var which = e.type;
             switch (which) {
-             case "click": 
+             case "click":
                // If we've just had a doubleclick then ignore it
                if (hadDoubleClick()) return false;
                // Otherwise set timer to act.  It may be preempted by a doubleclick.
@@ -658,7 +668,7 @@
             var click_info = get_index(x, y);
             var oInfo = get_slot_info_elem();
             if (oInfo && click_info) {
-                if ((typeof oInfo.click_index != "undefined") && 
+                if ((typeof oInfo.click_index != "undefined") &&
                     (oInfo.click_index == click_info.index)) {
                     // we already fetched the info for this slot
                     var oInfoCell = document.getElementById("job_id");
@@ -673,10 +683,10 @@
                     // fetch the slot info so we can get the job id
                     oInfo.for_jid = {fetching: true, x: x, y: y};
                     vis.fire_slot_info(click_info.index);
-                }            
+                }
             }
             function go_to_job(jid) {
-                var url = show_slot_job_url.replace("XXX", jid+""); 
+                var url = show_slot_job_url.replace("XXX", jid+"");
                 window.location.href = url;
                 show_wait();
             }
@@ -691,12 +701,12 @@
        }
        return false;
     }
-     
+
      function doDoubleClick(e) {
        var now = new Date();
        this.doubleclick_when = now.getTime();
        if (this.click_handle != null) {
-         clearTimeout(this.click_handle);          // Clear pending Click  
+         clearTimeout(this.click_handle);          // Clear pending Click
          this.click_handle = null;
        }
        if (!e) var e = window.event;
@@ -721,7 +731,7 @@
         while (c.charAt(0) == ' ') {
             c = c.substring(1, c.length);
         }
-            
+
         if (c.indexOf(name_plus) == 0) {
             return c.substring(name_plus.length,c.length);
         }
@@ -775,9 +785,9 @@
 /* find out what element the event was the event target */
 function get_event_target(e) {
     var targ = null;
-    if (e.target) 
+    if (e.target)
         targ = e.target;
-    else if (e.srcElement) 
+    else if (e.srcElement)
         targ = e.srcElement;
     if (targ.nodeType == 3) // avoid Safari textNode bug
         targ = targ.parentNode;
@@ -806,7 +816,6 @@
         }
     }
 }
-        
 
 [SlotMap.css]
 div#slot_hover {
@@ -820,6 +829,7 @@
     height: 28px;
     -moz-border-radius: 50%;
 }
+
 div#slot_zooming {
     width: 400px;
     height: 400px;
@@ -834,10 +844,12 @@
     -moz-opacity: 0.5;
     display: none;
 }
+
 div#slot_zooming p {
     margin: 0;
     padding: 140px 0 0 0;
 }
+
 div#slot_controls {
     font-size: 0.8em;
     float: left;
@@ -853,12 +865,14 @@
     width: 18px;
     height: 0px;
 }
+
 div#slot_panright {
     float: left;
     background: url(resource?name=pan-right.png) scroll no-repeat center;
     width: 18px;
     height: 0px;
 }
+
 div#slot_panup {
     clear: both;
     background: url(resource?name=pan-up.png) scroll no-repeat center;
@@ -868,6 +882,7 @@
     left: 18px;
     z-index:0;
 }
+
 div#slot_pandown {
     clear: left;
     background: url(resource?name=pan-down.png) scroll no-repeat center;
@@ -886,11 +901,13 @@
     position:relative;
     width: 0px;
 }
+
 div#slot_png {
     clip: rect(0 400px 400px 0);
     position:absolute;
     z-index: 0;
 }
+
 div#slot_glass {
     height: 0px;
     left: 0px;
@@ -899,10 +916,12 @@
     width: 0px;
     z-index: 100;
 }
+
 div#slot_visualization {
     position: relative;
     visibility: hidden;
 }
+
 div.zoom_node {
     background-color: white;
     position: absolute;
@@ -910,6 +929,7 @@
     top: -8px;
     color: #0066CC;
 }
+
 div.zoom_node_last {
     background-color: white;
     position: absolute;
@@ -917,6 +937,7 @@
     top: -8px;
     color: #0066CC;
 }
+
 div.zoom_first {
     width: 6px;
     height: 15px;
@@ -927,6 +948,7 @@
     margin-left: 0.5em;
     cursor: pointer;
 }
+
 div.zoom_last {
     width: 6px;
     height: 15px;
@@ -937,6 +959,7 @@
     margin-right: 0.5em;
     cursor: pointer;
 }
+
 div.zoom_middle_right {
     width: 6px;
     height: 15px;
@@ -946,6 +969,7 @@
     position: relative;
     cursor: pointer;
 }
+
 div.zoom_middle_left {
     width: 6px;
     height: 15px;
@@ -953,14 +977,17 @@
     float: left;
     cursor: pointer;
 }
+
 div#zoom_text {
     margin-right: 1em;
     float:left;
 }
+
 div#zoom_levels {
     position:relative;
     float: left;
 }
+
 div#zoom_pos {
     background: url(slots.png?dot=Busy) scroll no-repeat center;
     width: 12px;
@@ -972,24 +999,24 @@
 
 [SlotMap.html]
 <div id="slot_visualization">
-    <h2>{title}</h2>
-    <div id="slot_controls">
-        <div id="zoom_text">Zoom</div><div id="zoom_levels"><div id="zoom_pos"></div></div><div style="clear:left;"><!-- --></div>
+  <h2>{title}</h2>
+  <div id="slot_controls">
+    <div id="zoom_text">Zoom</div><div id="zoom_levels"><div id="zoom_pos"></div></div><div style="clear:left;"><!-- --></div>
+  </div>
+
+  <div id="slot_panup" onclick="vis.pan_up()"></div>
+  <div id="slot_panleft" onclick="vis.pan_left()"></div>
+  <div class="slot_map" id="{id}">
+    <div id="slot_glass"><!-- mouse target to prevent selecting/dragging image --></div>
+    <div id="slot_png">
+      <img name="{id}" src="{href}" border="0" onload="vis.img_loaded(this)" onerror="vis.img_error(this)" alt="slots" />
     </div>
-    
-    <div id="slot_panup" onclick="vis.pan_up()"></div>
-    <div id="slot_panleft" onclick="vis.pan_left()"></div>
-    <div class="slot_map" id="{id}">
-        <div id="slot_glass"><!-- mouse target to prevent selecting/dragging image --></div>
-        <div id="slot_png">
-            <img name="{id}" src="{href}" border="0" onload="vis.img_loaded(this)" onerror="vis.img_error(this)" alt="slots" />
-        </div>
-        <div id="slot_hover"><!-- red border around current slot --></div>
-        <div id="slot_zooming"><p>Zooming...</p></div>
-    </div>
-    <div id="slot_panright" onclick="vis.pan_right()"><!-- --></div>
-    <div id="slot_pandown" onclick="vis.pan_down()"></div>
-    {slot_legend}
+    <div id="slot_hover"><!-- red border around current slot --></div>
+    <div id="slot_zooming"><p>Zooming...</p></div>
+  </div>
+  <div id="slot_panright" onclick="vis.pan_right()"><!-- --></div>
+  <div id="slot_pandown" onclick="vis.pan_down()"></div>
+  {slot_legend}
 </div>
 {slot_info}
 {please_wait}
@@ -1023,9 +1050,11 @@
     window.location.href = window.location.href;
     return false;
 }
+
 function show_wait() {
     var oGlass = document.getElementById("modal_glass");
     var oWait = document.getElementById("please_wait");
+
     if (oWait && oGlass) {
         oGlass.style.width = document.body.offsetWidth + "px";
         oGlass.style.height = document.body.offsetHeight + "px";
@@ -1035,15 +1064,15 @@
 
         promote_to_body(oGlass); // so it covers the entire page
         promote_to_body(oWait);  // so it can be centered on the page
-        
+
         var cp = get_center_point();
         oWait.style.left = (cp.x - (oWait.offsetWidth / 2)) + "px";
         oWait.style.top = (cp.y - (oWait.offsetHeight / 2)) + "px";
         oWait.style.visibility = "visible";
     }
 }
-function get_center_point()
-{
+
+function get_center_point() {
     var x = 0;
     var y = 0;
 
@@ -1052,11 +1081,11 @@
 
     var width = document.body.offsetWidth;
     var height = document.body.offsetHeight;
-    
-    return { x: (width + scrollx) / 2, y: (height + scrolly) / 2 };    
+
+    return { x: (width + scrollx) / 2, y: (height + scrolly) / 2 };
 }
 
-    
+
 [PleaseWait.css]
 div#modal_glass {
     background-color: black;
@@ -1070,6 +1099,7 @@
     display: none;
     z-index: 200;
 }
+
 div#please_wait {
     position: absolute;
     display: none;
@@ -1077,9 +1107,11 @@
     left: 100px;
     top: 100px;
 }
+
 div#please_wait form.mform {
     width: 20em;
 }
+
 div#please_wait form.mform div.body, div#please_wait form.mform div.foot {
     text-align: center;
 }
@@ -1087,17 +1119,17 @@
 [PleaseWait.html]
 <div id="modal_glass" onclick="cancel_wait()"><!-- --></div>
 <div id="please_wait">
-    <form class="mform">
-      <div class="head">
-        <h1>Loading Job</h1>
-      </div>
-      <div class="body">
-        Loading Job. Please wait...        
-      </div>
-      <div class="foot">
-        {cancel}
-      </div>
-    </form>
+  <form class="mform">
+    <div class="head">
+      <h1>Loading Job</h1>
+    </div>
+    <div class="body">
+      Loading Job. Please wait...
+    </div>
+    <div class="foot">
+      {cancel}
+    </div>
+  </form>
 </div>
 
 
@@ -1113,7 +1145,7 @@
 div.slot_container {
     position: absolute;
     background-color: #ffffaa;
-    background-image: url(resource?name=shade.png); 
+    background-image: url(resource?name=shade.png);
     background-position: bottom left;
     background-repeat: repeat-x;
     border: 1px solid #cccc99;
@@ -1133,26 +1165,26 @@
 }
 
 html>body .outerpair1 {
-background: url(resource?name=upperrightfade.png) right top no-repeat;
+    background: url(resource?name=upperrightfade.png) right top no-repeat;
 }
 
 html>body .outerpair2 {
-background: url(resource?name=lowerleftfade.png) left bottom no-repeat;
-padding-top: 8px;
-padding-left: 8px;
+    background: url(resource?name=lowerleftfade.png) left bottom no-repeat;
+    padding-top: 8px;
+    padding-left: 8px;
 }
 
 html>body .shadowbox {
-background: url(resource?name=shadow.png) bottom right;
+    background: url(resource?name=shadow.png) bottom right;
 }
 
 html>body .innerbox {
-position: relative;
-left: -8px;
-top: -8px;
+    position: relative;
+    left: -8px;
+    top: -8px;
 }
 tr.hidden_row {
-    display: none; 
+    display: none;
 }
 
 [SlotInfo.html]
@@ -1174,52 +1206,56 @@
 </div></div></div></div>
 
 [SlotInfo.item_html]
-    <tr {row_class}><td class="slot_info_title">{title}</td>
-        <td {job_id} class="slot_info_value">{value}</td></tr>
+<tr {row_class}>
+  <td class="slot_info_title">{title}</td>
+  <td {job_id} class="slot_info_value">{value}</td>
+</tr>
 
 [SlotLegend.css]
 div.slot_legend {
     margin-top: 1em;
 }
+
 div.slot_states, div.slot_activities {
     float: left;
     margin-left: 2em;
 }
+
 div.slot_states ul, div.slot_activities ul {
     margin-top: 0.5em;
     margin-left: 0.5em;
     font-size: 0.8em;
 }
+
 div.slot_states ul li span {
     font-weight: bold;
 }
 
 [SlotLegend.html]
 <div class="slot_legend">
-    {slot_states}
-    {slot_activities}
-    <div style="clear:both"><!-- --></div>
+  {slot_states}
+  {slot_activities}
+  <div style="clear:both"><!-- --></div>
 </div>
 
 [SlotStates.html]
-    <div class="slot_states">
-        <h3>States</h3>
-        <ul>
-        {items}
-        </ul>
-    </div>
+<div class="slot_states">
+  <h3>States</h3>
+  <ul>
+    {items}
+  </ul>
+</div>
 
 [SlotActivities.html]
-    <div class="slot_activities">
-        <h3>Activities</h3>
-        <ul>
-        {items}
-        </ul>
-    </div>
+<div class="slot_activities">
+  <h3>Activities</h3>
+  <ul>
+    {items}
+  </ul>
+</div>
 
 [SlotStates.item_html]
-    <li><span>{initial}</span> {title}</li>
-    
+<li><span>{initial}</span> {title}</li>
+
 [SlotActivities.item_html]
-    <li><img src="{href}" width="{dot_size}" height="{dot_size}" alt="{title}"/> {title}</li>    
-    
\ No newline at end of file
+<li><img src="{href}" width="{dot_size}" height="{dot_size}" alt="{title}"/> {title}</li>

Modified: mgmt/trunk/cumin/python/cumin/widgets.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/widgets.py	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/widgets.py	2009-03-25 18:55:22 UTC (rev 3210)
@@ -168,7 +168,7 @@
 
     def do_process(self, session, *args):
         self.page.set_modal(session, self.get_modal(session))
-            
+
         if self.__cancel.get(session):
             self.__cancel.set(session, False)
 
@@ -179,7 +179,7 @@
             self.process_submit(session, *args)
         else:
             self.process_display(session, *args)
-        
+
     def process_cancel(self, session, *args):
         self.page.set_redirect_url(session, self.get_origin(session))
 
@@ -221,7 +221,7 @@
 class CuminFieldForm(CuminForm, FieldForm, Frame):
     def render_body(self, session, *args):
         return self.render_fields(session, *args)
-    
+
 class CuminConfirmForm(CuminForm):
     def __init__(self, app, name):
         super(CuminConfirmForm, self).__init__(app, name)
@@ -233,7 +233,7 @@
 class CuminIntIdList(Widget):
     def __init__(self, app, name):
         super(CuminIntIdList, self).__init__(app, name)
-    
+
         param = IntegerParameter(app, "param")
         self.add_parameter(param)
 
@@ -242,11 +242,11 @@
 
     def render_item_content(self, session, id):
         return "Act on object %i" % id
-    
+
 class CuminStringIdList(Widget):
     def __init__(self, app, name):
         super(CuminStringIdList, self).__init__(app, name)
-    
+
         param = Parameter(app, "param")
         self.add_parameter(param)
 
@@ -255,7 +255,7 @@
 
     def render_item_content(self, session, id):
         return "Act on object %s" % id
-    
+
 class CuminBulk(ItemSet, CuminForm, Frame):
     def get_href(self, session, ids):
         branch = session.branch()
@@ -297,7 +297,7 @@
 
     def render_title(self, session, object):
         return "Status"
-    
+
     def render_color(self, session, object):
         if hasattr(object, "errors"):
             if object.errors:
@@ -317,8 +317,8 @@
 class EditablePropertyRenderer(TemplateRenderer, Widget):
     """Display input fields for editing properties
 
-    Parent class needs to override do_get_items() and return a list of items. 
-    Each item should be a dictionary. 
+    Parent class needs to override do_get_items() and return a list of items.
+    Each item should be a dictionary.
             ["name"] is required and should be the display label
             ["value"] is required and should be the value to edit
             ["type"] is required and should be an input type <"number" | "string">
@@ -342,7 +342,7 @@
         if "property" in item:
             property = item["property"]
             if property.title:
-                title = property.get_title(session) 
+                title = property.get_title(session)
         return escape_amp(title)
 
     def render_value(self, session, item):
@@ -352,7 +352,7 @@
         property = "property" in item and item["property"] or None
         if property:
             writable = property.writable
-            
+
         writer = Writer()
         if not writable:
             self.__readonly_template.render(writer, session, item)
@@ -369,36 +369,36 @@
                     self.__string_template.render(writer, session, item)
 
         return writer.to_string()
-            
+
     def render_pname(self, session, item):
         return DictParameter.sep().join(
                 (item["path"], escape_entity(item["name"]), "value"))
-    
+
     def render_ptype_name(self, session, item):
         return DictParameter.sep().join(
                 (item["path"], escape_entity(item["name"]), "type"))
 
     def render_ptype_value(self, session, item):
         return item["type"]
-        
+
     def render_orig_value(self, session, item):
         if "orig" in item:
             writer = Writer()
             self.__orig_template.render(writer, session, item)
             return writer.to_string()
-        
+
     def render_porig_name(self, session, item):
         return DictParameter.sep().join(
             (item["path"], escape_entity(item["name"]), "orig"))
-        
+
     def render_porig_value(self, session, item):
         value = item["orig"]
         return escape_entity(str(value))
-        
+
     def render_val(self, session, item):
         value = self.get_val(session, item)
         return escape_entity(str(value))
-    
+
     def render_display_val(self, session, item):
         value = self.get_val(session, item)
         property = "property" in item and item["property"] or None
@@ -408,14 +408,14 @@
                 value = renderer(session, value)
 
         return escape_amp(str(value))
-        
+
     def get_val(self, session, item):
         try:
             value = item["value"]
         except KeyError:
             value = ""
         return value
-        
+
     def render_error(self, session, item):
         if "error" in item:
             return "<div class=\"error\">%s</div>" % item["error"]
@@ -429,13 +429,13 @@
                 example = ""
             description = property.description or ""
             return " ".join((description, example))
-        
+
     def render_false_selected(self, session, item):
         return item["value"].upper() == "FALSE" and "checked=\"checked\"" or ""
-    
+
     def render_true_selected(self, session, item):
         return item["value"].upper() == "TRUE" and "checked=\"checked\"" or ""
-    
+
     def render_edit_number_class(self, session, item):
         return "error" in item and "numeric_error" or "edit_number"
 
@@ -546,7 +546,7 @@
 
     def get_items(self, session):
         return self.__states
-    
+
     def get_title(self, state):
         return state in self.__titles and self.__titles[state]
 
@@ -561,7 +561,7 @@
             a hidden input to set the param value instead
             of a link name/value pair """
         return self.param.path
-        
+
     def render_item_link(self, session, state):
         branch = session.branch()
         self.set(branch, state)
@@ -619,10 +619,10 @@
             sql = "qmf_delete_time is not null"
 
         return sql
-        
+
 class SubmitSwitch(StateSwitch):
-    """ Clicking on the link will submit the form. 
-    
+    """ Clicking on the link will submit the form.
+
         This uses javascript and a hidden input to
         submit the form when the link is clicked. This
         allows other fields on the form to "remember"
@@ -633,7 +633,7 @@
     def render_name(self, session, *args):
         """ this needs to be the path of the param """
         return self.get_param_id()
-    
+
     def render_item_link(self, session, state):
         title = self.get_title(state)
         hover = self.get_hover(state)
@@ -647,7 +647,7 @@
 class TopTableColumn(SqlTableColumn):
     def __init__(self, app, name):
         super(TopTableColumn, self).__init__(app, name)
-        
+
         self.header_class = TopTableColumnHeader
 
 class TopTableColumnHeader(ItemTableColumnHeader):
@@ -798,7 +798,7 @@
 
         self.ids = CheckboxIdColumn(app, "id")
         self.add_column(self.ids)
-        
+
         col = self.QNameColumn(app, "q_id")
         col.visible = False
         self.add_column(col)
@@ -817,13 +817,13 @@
         col = self.MatchedColumn(app, "matched")
         col.alignment = "right"
         self.add_column(col)
-        
+
         self.phase = PhaseSwitch(app, "phase")
         self.add_child(self.phase)
 
     def get_args(self, session):
         return self.frame.get_args(session)
-    
+
     def get_sql_values(self, session, obj):
         return {"id": obj.id}
 
@@ -869,7 +869,7 @@
     class MatchedColumn(ItemTableColumn):
         def render_title(self, session, data):
             return "Messages Matched"
-            
+
         def render_content(self, session, data):
             binding = Binding.get(data["id"])
             return self.app.model.binding.msgMatched.value(binding)
@@ -950,13 +950,13 @@
 class FilteredCheckboxIdColumn(CheckboxIdColumn):
     def __init__(self, app, name, form, callback=None):
         super(FilteredCheckboxIdColumn, self).__init__(app, name)
-        
+
         # call back that returns True if the checkbox is to be disabled
         self.__callback = callback
 
     def do_render(self, session, data):
         disabled = self.__callback and self.__callback(session, data) or False
-        return super(FilteredCheckboxIdColumn, self).do_render(session, data, 
+        return super(FilteredCheckboxIdColumn, self).do_render(session, data,
             disabled=disabled)
 
 class NameField(StringField):
@@ -972,7 +972,7 @@
 
     def set_required(self, required):
         self.required = required
-        
+
     def do_validate(self, session, errors):
         name = self.get(session)
 
@@ -992,25 +992,25 @@
 class TextField(NameField):
     def __init__(self, app, name):
         super(TextField, self).__init__(app, name)
-        
+
         self.__title = "Title"
-        
+
     def set_title(self, title):
         self.__title = title
-        
+
     def render_title(self, session):
         return self.__title
 
 class ExchangeNameField(NameField):
     def __init__(self, app, name):
         super(ExchangeNameField, self).__init__(app, name)
-        
+
         self.illegal_chars = " (){}[]-<>&%"
         self.legal_chars_desc = """
             The exchange name is invalid; allowed characters are
             letters, digits, ".", and "_"
             """
-        
+
 class UniqueNameField(NameField):
     def __init__(self, app, name, cls, fld="name"):
         super(UniqueNameField, self).__init__(app, name)
@@ -1058,7 +1058,7 @@
 
         option = self.Option1(app, option1, self.param)
         self.add_option(option)
-        
+
         option = self.Option2(app, option2, self.param)
         self.add_option(option)
 
@@ -1067,10 +1067,10 @@
 
     def render_title_1(self, session):
         pass
-    
+
     def render_title_2(self, session):
         pass
-    
+
     class Option1(RadioFieldOption):
         def render_title(self, session):
             return self.parent.render_title_1(session)
@@ -1112,7 +1112,7 @@
     class TopN(RadioFieldOption):
         def __init__(self, app, name, param):
             super(MultiplicityField.TopN, self).__init__(app, name, param)
-        
+
             self.__n_value = IntegerParameter(app, "arg")
             self.add_parameter(self.__n_value)
 
@@ -1121,7 +1121,7 @@
 
         def render_arg_name(self, session):
             return self.__n_value.path
-            
+
         def render_arg_value(self, session):
             return 0
 
@@ -1129,17 +1129,17 @@
             return self.__n_value.get(session)
 
         def render_title(self, session):
-            return 
+            return
 
 class AjaxField(Widget):
     """ Update a single span or div after the page loads """
-    
+
     def render_script(self, session):
         script = """
         <script type="text/javascript">
-        function get_%s() { 
+        function get_%s() {
             var now = new Date();
-            wooly.deferredUpdate('%s'+';ts='+now.getTime(), got_%s, "%s"); 
+            wooly.deferredUpdate('%s'+';ts='+now.getTime(), got_%s, "%s");
         }
         addEvent(window, "load", get_%s);
         </script>
@@ -1148,18 +1148,18 @@
         url = self.get_url(session)
         got_fn = self.got_fn(session)
         elem_id = self.elem_id(session)
-        
+
         return url and script % (get_fn, url, got_fn, elem_id, get_fn) or ""
-    
+
     def get_url(self, session):
         pass
 
     def get_fn(self, session):
         return self.name
-    
+
     def got_fn(self, session):
         return self.name
-    
+
     def elem_id(self, session):
         return self.name
 
@@ -1169,22 +1169,22 @@
 
     def render_color(self, session, scheduler):
         return "clear"
-        
+
     def got_fn(self, session):
         return "startstop_status"
-    
+
     def elem_id(self, session):
         return self.render_id(session)
-    
+
 class MoreFieldSet(FieldForm, FormField):
     """ Displays a button that opens and closes a set of fields
-    
+
         Used in a FieldForm as a FormField. Instead of calling
         add_field on the FieldForm, call add_field on this.
-        For example: 
+        For example:
             self.more = MoreFieldSet(app, "more")
             self.add_field(self.more)
-            
+
             self.name = NameField(app, "name")
             self.more.add_field(self.name)
 
@@ -1193,7 +1193,7 @@
         """
     def __init__(self, app, name):
         super(MoreFieldSet, self).__init__(app, name)
-        
+
         self.input = HiddenInput(app, "open")
         self.add_child(self.input)
 
@@ -1202,7 +1202,7 @@
 
     def render_more_text(self, session, *args):
         return "Show Advanced Options..."
-    
+
     def render_less_text(self, session, *args):
         return "Hide Advanced Options..."
 
@@ -1210,12 +1210,12 @@
         return self.input.get(session) \
             and self.render_less_text(session, *args) \
             or self.render_more_text(session, *args)
-             
+
     def render_open_state(self, session, *args):
         return self.input.do_marshal(self.input.get(session))
-    
+
     def render_open_path(self, session, *args):
         return self.input.render_name(session, *args)
-    
+
     def render_open_display(self, session, *args):
         return self.input.get(session) and "block" or "none"

Modified: mgmt/trunk/cumin/python/cumin/widgets.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/widgets.strings	2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/widgets.strings	2009-03-25 18:55:22 UTC (rev 3210)
@@ -152,48 +152,48 @@
 
 [CuminStatus.css]
 div.CuminStatus {
-  float: right;
-  margin: 0.5em 0;
-  padding: 0.5em 0.75em;
-  width: 15em;
+    float: right;
+    margin: 0.5em 0;
+    padding: 0.5em 0.75em;
+    width: 15em;
 }
 
 div.CuminStatus h2 {
-  font-weight: bold;
+    font-weight: bold;
 }
 
 div.CuminStatus div, div.CuminStatus h2 {
-  margin: 0 0 0.5em 0;
+    margin: 0 0 0.5em 0;
 }
 
 div.CuminStatus.red {
-  border: 1px dotted #c99;
-  background-color: #fcc;
+    border: 1px dotted #c99;
+    background-color: #fcc;
 }
 
 div.CuminStatus.yellow {
-  border: 1px dotted #cc9;
-  background-color: #ffc;
+    border: 1px dotted #cc9;
+    background-color: #ffc;
 }
 
 div.CuminStatus.green {
-  border: 1px dotted #9c9;
-  background-color: #cfc;
+    border: 1px dotted #9c9;
+    background-color: #cfc;
 }
 
 div.CuminStatus.clear {
-  border: 1px dotted #9c9;
-  background-color: transparent;
+    border: 1px dotted #9c9;
+    background-color: transparent;
 }
 
 div.CuminStatus table {
-  width: 100%;
-  font-size: 0.9em;
+    width: 100%;
+    font-size: 0.9em;
 }
 
 div.CuminStatus table th, div.CuminStatus table td {
-  font-weight: normal;
-  text-align: left;
+    font-weight: normal;
+    text-align: left;
 }
 
 [CuminStatus.html]
@@ -203,19 +203,19 @@
 
 [CuminDetails.css]
 table.CuminDetails {
-  width: 100%;
-  border-collapse: collapse;
+    width: 100%;
+    border-collapse: collapse;
 }
 
 table.CuminDetails > tbody > tr > td {
-  width: 50%;
-  padding: 0.5em;
-  vertical-align: top;
+    width: 50%;
+    padding: 0.5em;
+    vertical-align: top;
 }
 
 table.CuminDetails ul.ActionSet {
-  font-size: 0.9em;
-  margin: 1em 0.5em;
+    font-size: 0.9em;
+    margin: 1em 0.5em;
 }
 
 [CuminDetails.html]
@@ -236,12 +236,12 @@
 
 [CuminHeading.css]
 h1.CuminHeading {
-  margin: 0 0 1em 0;
+    margin: 0 0 1em 0;
 }
 
 h1.CuminHeading img {
-  vertical-align: -60%;
-  margin: 0 0.25em 0 0;
+    vertical-align: -60%;
+    margin: 0 0.25em 0 0;
 }
 
 [CuminHeading.html]
@@ -252,36 +252,36 @@
 
 [CuminSummary.css]
 div.CuminSummary {
-  width: 36em;
-  margin: 0 0 2em 0;
-  min-height: 6em;
+    width: 36em;
+    margin: 0 0 2em 0;
+    min-height: 6em;
 }
 
 div.CuminSummary h1 {
-  font-size: 1.1em;
-  margin: 0 0 1em 0;
+    font-size: 1.1em;
+    margin: 0 0 1em 0;
 }
 
 div.CuminSummary h1 img {
-  vertical-align: -60%;
-  margin: 0 0.25em 0 0;
+    vertical-align: -60%;
+    margin: 0 0.25em 0 0;
 }
 
 div.CuminSummary hr {
-  margin: 0.75em 0;
-  border: 0;
-  border-top: 1px dotted #ccc;
-  padding: 0;
+    margin: 0.75em 0;
+    border: 0;
+    border-top: 1px dotted #ccc;
+    padding: 0;
 }
 
 div.CuminSummary div.actions {
-  font-size: 0.9em;
-  width: 16em;
-  float: right;
+    font-size: 0.9em;
+    width: 16em;
+    float: right;
 }
 
 div.CuminSummary div.properties {
-  font-size: 0.9em;
+    font-size: 0.9em;
 }
 
 [CuminSummary.html]
@@ -304,10 +304,10 @@
 
 [SummaryProperties.css]
 table.SummaryProperties th {
-  color: #444;
-  font-weight: normal;
-  padding: 0 0.5em 0 0;
-  text-align: left;
+    color: #444;
+    font-weight: normal;
+    padding: 0 0.5em 0 0;
+    text-align: left;
 }
 
 [SummaryProperties.html]
@@ -328,18 +328,20 @@
 
 [SubmitSwitch.javascript]
 function submit_state(id, state) {
-	var oHidden = document.forms[0].elements[id];
-	if (oHidden) {
-		if (oHidden.length) {
-			for (var i=0; i<oHidden.length; i++) {
-				oHidden[i].value = state;
-			}
-		} else {
-			oHidden.value = state;
-		}
-		document.forms[0].action += "#phase";
-		document.forms[0].submit();
-	}
+    var oHidden = document.forms[0].elements[id];
+
+    if (oHidden) {
+        if (oHidden.length) {
+            for (var i=0; i<oHidden.length; i++) {
+                oHidden[i].value = state;
+            }
+        } else {
+            oHidden.value = state;
+        }
+
+        document.forms[0].action += "#phase";
+        document.forms[0].submit();
+    }
 }
 
 [SubmitSwitch.html]
@@ -360,7 +362,7 @@
 
 [CuminEditableProperties.property_html]
 <tr>
-	<th>{title}</th><td>{value}</td><td>{inline_help}</td>
+  <th>{title}</th><td>{value}</td><td>{inline_help}</td>
 </tr>
 
 [EditablePropertyRenderer.bool_html]
@@ -393,31 +395,31 @@
 
 [TopTable.css]
 table.TopTable {
-  width: 100%;
-  border-collapse: collapse;
-  margin: 0;
+    width: 100%;
+    border-collapse: collapse;
+    margin: 0;
 }
 
 table.TopTable tr {
-  border-top: 1px dotted #ccc;
-  vertical-align: top;
+    border-top: 1px dotted #ccc;
+    vertical-align: top;
 }
 
 table.TopTable td {
-  padding: 0.35em 0.5em;
+    padding: 0.35em 0.5em;
 }
 
 table.TopTable th {
-  padding: 0.35em 0.5em;
-  text-align: left;
-  font-weight: normal;
-  font-style: italic;
-  color: #444;
-  font-size: 0.9em;
+    padding: 0.35em 0.5em;
+    text-align: left;
+    font-weight: normal;
+    font-style: italic;
+    color: #444;
+    font-size: 0.9em;
 }
 
 table.TopTable th.ralign {
-  text-align: right;
+    text-align: right;
 }
 
 [TopTable.html]
@@ -473,7 +475,7 @@
 
 [TableHeader.css]
 th.selected a {
-  color: black;
+    color: black;
 }
 
 [TableHeader.html]
@@ -511,101 +513,123 @@
 
 [FormHelp.javascript]
 function help_window(href) {
-	var left = screen.availWidth / 2;
-	var height = screen.availHeight - 40;
-	var args = "width="+left+",height="+height+",top=0,left="+left+",scrollbars=1,status=1,toolbar=1";
-	hwin = window.open(href, "help", args);
-	if (hwin.focus) 
-		hwin.focus();
-	return false;
+   var left = screen.availWidth / 2;
+   var height = screen.availHeight - 40;
+   var args = "width="+left+",height="+height+",top=0,left="+left+",scrollbars=1,status=1,toolbar=1";
+
+   hwin = window.open(href, "help", args);
+
+   if (hwin.focus) {
+       hwin.focus();
+   }
+
+   return false;
 }
+
 function attachHelp() {
-	if (document.getElementById("help_link"))
-		document.getElementById("help_link").onclick = function() { return help_window(this.href) }
+    if (document.getElementById("help_link")) {
+        document.getElementById("help_link").onclick = function() { return help_window(this.href) }
+    }
 }
+
 addEvent(window, "load", attachHelp);
 
 [FormHelp.html]
-	<a class="help action" id="help_link" href="{help_href}">Help</a>
+<a class="help action" id="help_link" href="{help_href}">Help</a>
 
 [MoreFieldSet.css]
 div.more_inputs {
-	margin-left: 0.5em;
-	margin-right: 0.5em;
-	padding: 0.5em;
-	border: 1px dashed #333;
-	background-color: #FCFCFC;
+    margin-left: 0.5em;
+    margin-right: 0.5em;
+    padding: 0.5em;
+    border: 1px dashed #333;
+    background-color: #FCFCFC;
 }
-	
+
 div.more_field_set {
-	margin-bottom: 1em;
+    margin-bottom: 1em;
 }
+
 div.more_field_set ul.actions {
-	margin-bottom: 0.5em;
+    margin-bottom: 0.5em;
 }
 
 
 [MoreFieldSet.html]
 <div class="more_field_set">
-	<ul class="actions">
-		<li>
-			<a class="nav" href="#" onclick="toggle_more_fieldset(); return false;"><span id="button_{id}">{state_text}</span></a>
-		</li>
-	</ul>{open}
-	<div id="{id}" class="more_inputs" style="display:{open_display};">
-		{inputs}
-	</div>
+  <ul class="actions">
+    <li>
+      <a class="nav" href="#" onclick="toggle_more_fieldset(); return false;"><span id="button_{id}">{state_text}</span></a>
+    </li>
+  </ul>{open}
+  <div id="{id}" class="more_inputs" style="display:{open_display};">
+    {inputs}
+  </div>
 </div><!-- end of "more_field_set" -->
 <script type="text/javascript">
-function toggle_more_fieldset() {
-	var oDiv = document.getElementById("{id}");
-	var oButton = document.getElementById("button_{id}");
-	var oState = document.forms[0].elements["{open_path}"];
-	if (oDiv) {
-		if (oDiv.style.display == "none") {
-			oDiv.style.display = "block";
-			if (oButton)
-				oButton.innerHTML = "{less_text}";
-			if (oState)
-				oState.value = "t";
-		} else {
-			oDiv.style.display = "none"
-			if (oButton)
-				oButton.innerHTML = "{more_text}";
-			if (oState)
-				oState.value = "f";
-		}
-		document.forms[0].submit();
-		
-	}
-}
+    function toggle_more_fieldset() {
+        var oDiv = document.getElementById("{id}");
+        var oButton = document.getElementById("button_{id}");
+        var oState = document.forms[0].elements["{open_path}"];
+
+        if (oDiv) {
+            if (oDiv.style.display == "none") {
+                oDiv.style.display = "block";
+
+                if (oButton) {
+                    oButton.innerHTML = "{less_text}";
+                }
+
+                if (oState) {
+                    oState.value = "t";
+                }
+            } else {
+                oDiv.style.display = "none";
+
+                if (oButton) {
+                    oButton.innerHTML = "{more_text}";
+                }
+
+                if (oState) {
+                    oState.value = "f";
+                }
+
+                document.forms[0].submit();
+            }
+        }
+    }
 </script>
- 
+
 [StartStopStatus.css]
 div.status_time {
-	font-size: 0.80em;
-	color: #444444;
+    font-size: 0.80em;
+    color: #444444;
 }
 
 [StartStopStatus.javascript]
 function got_startstop_status(obj, id) {
     var elem = document.getElementById(id);
+
     if (elem) {
         var updateTime = obj.updatetime;
         var age = obj.age;
         var color = "clear";
 
         var oUpdateTime = document.getElementById("updateTime");
+
         if (oUpdateTime) {
             oUpdateTime.innerHTML = updateTime;
+
             if (age > 150) { /* hasn't changed in 2.5 minutes */
                 color = "yellow";
             } else {
                 color = "green";
             }
+
             elem.className = "CuminStatus " + color;
         }
-        setTimeout("get_status()", 5000); 
+
+        setTimeout("get_status()", 5000);
     }
 }
 
@@ -616,4 +640,3 @@
   Last update was <span id="updateTime"></span>
   </div>
 </div>{start_stop_script}
-




More information about the rhmessaging-commits mailing list