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

rhmessaging-commits at lists.jboss.org rhmessaging-commits at lists.jboss.org
Tue Aug 5 16:51:01 EDT 2008


Author: eallen
Date: 2008-08-05 16:51:01 -0400 (Tue, 05 Aug 2008)
New Revision: 2250

Modified:
   mgmt/trunk/cumin/python/cumin/queue.py
   mgmt/trunk/cumin/python/cumin/queue.strings
Log:
Added QueueBindingAdd
Modified QueueBindingSet to be a phased set

Modified: mgmt/trunk/cumin/python/cumin/queue.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/queue.py	2008-08-05 20:48:37 UTC (rev 2249)
+++ mgmt/trunk/cumin/python/cumin/queue.py	2008-08-05 20:51:01 UTC (rev 2250)
@@ -1,6 +1,6 @@
 import pdb, logging
 
-from mint import *
+from mint.schema import Queue, Journal, Exchange
 from wooly import *
 from wooly.widgets import *
 from wooly.forms import *
@@ -9,6 +9,7 @@
 from datetime import datetime
 from sqlobject.sqlbuilder import LEFTJOINOn
 
+from binding import *
 from exchange import ExchangeInputSet
 from stat import *
 from widgets import *
@@ -201,6 +202,9 @@
 
         self.purge = QueuePurge(app, "purge")
         self.add_mode(self.purge)
+        
+        self.queue_binding_add = QueueBindingAdd(app, "queuebindingadd")
+        self.add_mode(self.queue_binding_add)
 
         remove = QueueRemove(app, "remove")
         self.add_mode(remove)
@@ -209,6 +213,9 @@
     def show_purge(self, session):
         return self.show_mode(session, self.purge)
 
+    def show_queue_binding_add(self, session):
+        return self.show_mode(session, self.queue_binding_add) 
+
     def render_href(self, session, queue):
         if queue:
             return super(QueueFrame, self).render_href(session, queue)
@@ -272,33 +279,56 @@
         data = "model.xml?class=queue;id=%i" % queue.id
         return "wooly.setIntervalUpdate('%s', updateQueue, 3000)" % data
 
-class QueueBindingSet(BindingSet):
-    def get_args(self, session):
-        return self.frame.get_args(session)
+class QueueBindingSet(BindingSet, Form):
+    def __init__(self, app, name):
+        super(QueueBindingSet, self).__init__(app, name)
 
-    def render_title(self, session, queue):
-        count = fmt_count(self.get_item_count(session, queue))
-        return "Exchange Bindings %s" % count
+        self.__remove = self.Remove(app, "remove", self)
+        self.add_child(self.__remove)
+        
+    def get_name_col(self, app):
+        return self.NameColumn(app, "e_id")
 
-    def get_item_count(self, session, queue):
-        return queue.bindings.count()
+    def render_add_queue_binding_url(self, session, vhost):
+        branch = session.branch()
+        self.frame.show_queue_binding_add(branch)
+        return branch.marshal()
+    
+    def render_sql_where(self, session, queue):
+        elems = list()
+        elems.append("b.queue_id = %(id)r")
+        elems.append(self.phase.get_sql_constraint(session, queue))
+        return "where %s" % " and ".join(elems)
 
-    def do_get_items(self, session, queue):
-        bindings = queue.bindings
+    def render_title(self, session, queue):
+        return "Exchange Bindings %s" % \
+            fmt_count(queue.bindings.count())
 
-        start, end = self.get_bounds(session)
-        bindings = bindings[start:end]
+    class NameColumn(SqlTableColumn):
+        def render_title(self, session, data):
+            return "Exchange"
 
-        return bindings
+        def render_content(self, session, data):
+            exchange = Identifiable(data["e_id"])
+            branch = session.branch()
+            self.frame.frame.show_exchange(branch, exchange).show_view(branch)
+            name = Exchange.get(data["e_id"]).name or "<em>Default</em>"
+            return fmt_olink(branch, exchange, name=name)
 
-    def render_item_href(self, session, binding):
-        branch = session.branch()
-        self.frame.frame.show_exchange(branch, binding.exchange)
-        return branch.marshal()
-    
-    def render_item_name(self, session, binding):
-        return binding.exchange.name or "<em>Default</em>"
+    class Remove(FormButton):
+        def process_submit(self, session):
+            ids = self.parent.ids.get(session)
+            self.parent.ids.clear(session)
 
+            queue = self.frame.get_args(session)[0]
+            branch = session.branch()
+            frame = self.frame.frame.show_queue_bindings_remove(branch, queue)
+            frame.ids.set(branch, ids)
+            self.page.set_redirect_url(session, branch.marshal())
+            
+        def render_content(self, session):
+            return "Remove"
+
 class QueueForm(CuminFieldForm):
     def __init__(self, app, name):
         super(QueueForm, self).__init__(app, name)
@@ -318,108 +348,11 @@
         self.bindings = ExchangeKeysField(app, "bindings", self)
         self.add_field(self.bindings)
         
-      
-class ExchangeKeysInput(FormInput):
-    def __init__(self, app, name, form):
-         super(ExchangeKeysInput, self).__init__(app, name, form)
-
-         self.name_param = Parameter(app, "name_param");
-         self.add_parameter(self.name_param)
-         form.add_form_parameter(self.name_param)
+    def validate(self, session, queue_name):
+        super_error = super(QueueForm, self).validate(session)
+        (errors, form_binding_info) = self.bindings.get_binding_info(session, queue_name)
+        return (errors or super_error, form_binding_info)
         
-         self.names = ListParameter(app, "name", self.name_param)
-         self.add_parameter(self.names)
-         form.add_form_parameter(self.names)
-         
-         self.binding_param = Parameter(app, "binding_param")
-         self.add_parameter(self.binding_param)
-         form.add_form_parameter(self.binding_param)
-         
-         self.bindings = ListParameter(app, "binding", self.binding_param)
-         self.add_parameter(self.bindings)
-         form.add_form_parameter(self.bindings)
-         
-         self.extra_param = Parameter(app, "extra_param")
-         self.add_parameter(self.extra_param)
-         form.add_form_parameter(self.extra_param)
-         
-         self.extras = ListParameter(app, "extra", self.extra_param)
-         self.add_parameter(self.extras)
-         form.add_form_parameter(self.extras)
-         
-         self.exchangekey_tmpl = Template(self, "exchangekey_html")
-         
-         # info to help create the <input> elements for various exchange types
-         self.binding_typemap = {"direct":{"type":"text",
-                                           "enable":"disabled='disabled'"},
-                                 "topic":{"type":"text", "enable":None},
-                                 "fanout":{"type":"hidden", "enable":None},
-#                                 "headers":{"type":"text", "enable":None},
-#                                 "xml":{"type":"hidden", "enable":None},
-                                 }
-         # exchange names to suppress
-         self.binding_omit_by_name = ("", "qpid.management", "amq.match")
-         self.binding_omit_by_type = ("xml", "headers")
-
-    def do_render(self, session, *args):
-        writer = Writer()
-        # get the registration from the broker frame
-        reg = self.frame.frame.get_object(session)
-        vhost = reg.getDefaultVhost()
-
-        sortedExchanges = sorted_by(vhost.exchanges)
-        # render a row for each exchange we support
-        for exchange in sortedExchanges:
-            if  not exchange.name in self.binding_omit_by_name:
-                if not exchange.type in self.binding_omit_by_type:  
-                    self.exchangekey_tmpl.render(writer, session, exchange)
-
-        return writer.to_string()
-    
-    def render_exchange_name(self, session, exchange):
-        return exchange.name
-
-    def render_exchange_fmt_name(self, session, exchange):
-        return fmt_shorten(exchange.name)
-
-    def render_exchange_path(self, session, *args):
-        return self.names.path
-    
-    def render_exchange_id(self, session, exchange):
-        return exchange.id
-        
-    def render_binding_path(self, session, exchange):
-        return self.bindings.path
-    
-    def render_exchange_type(self, session, exchange):
-        return exchange.type
-    
-    def render_binding_input_type(self, session, exchange):
-        return self.binding_typemap[exchange.type]["type"]
-
-    def render_binding_disabled(self, session, exchange):
-        return self.binding_typemap[exchange.type]["enable"]
-
-class ExchangeKeysField(FormField):
-    def __init__(self, app, name, form):
-        super(ExchangeKeysField, self).__init__(app, name, form)
-
-        self.__input = ExchangeKeysInput(app, "inputs", form)
-        self.add_child(self.__input)
-        self.inputs = self.__input
-        
-    def render_title(self, session):
-        return "Exchange Bindings:"
-    
-    def render_exchange_keys(self, session, *args):
-        return self.__input.render(session)
-
-    def render_exchange_path(self, session, *args):
-        return self.inputs.names.path
-    
-    def render_queue_name_path(self, session, *args):
-        return self.inputs.form.namef.get_parameter().path
-    
 class QueueAdd(QueueForm):
     def process_cancel(self, session):
         branch = session.branch()
@@ -427,45 +360,31 @@
         self.page.set_redirect_url(session, branch.marshal())
 
     def process_submit(self, session):
-        errors = self.validate(session)
+        queue_name = self.namef.get(session)
+        durable = self.durable.get(session)
+        exclusive = self.exclusive.get(session)
+        autodelete = self.autodelete.get(session)
 
+        (errors, form_binding_info) = self.validate(session, queue_name)
         if errors:
             pass
         else:
+            # since we are adding a queue, we don't have
+            # an existing queue to pass, so create a
+            # blank one
+            queue = Queue()
+            queue.name = queue_name
+            queue.durable = (durable == "durable")
+            queue.exclusive = (exclusive == "exclusive")
+            queue.autoDelete = (autodelete == "autodel")
             reg = self.frame.get_object(session)
-            vhost = reg.getDefaultVhost()
 
-            queue_name = self.namef.get(session)
-            durable = self.durable.get(session)
-            exclusive = self.exclusive.get(session)
-            autodelete = self.autodelete.get(session)
-            binding_names = self.bindings.inputs.names.get(session)
-            binding_keys = self.bindings.inputs.bindings.get(session)
-            #assumes a 1:1 correlation between names and keys
-            exchange_keys = dict(zip(binding_names, binding_keys))
-
-            # sanity check: this should have been handled by the javascript
-            # on the form submit
-            for binding_name in binding_names:
-                exchange = self.__get_exchange_named(binding_name, vhost.exchanges)
-                if exchange.type == 'direct':
-                    exchange_keys[exchange.name] = queue_name
-                    
             args = {
-                    "queue": queue_name,
-                    "durable": durable,
-                    "exclusive": exclusive,
-                    "auto_delete": autodelete,
-                    "exchange_keys": exchange_keys
-                    }
-            log.info("Adding queue:\n\tname: \
-                '%s'\n\tdurablility: \
-                %s\n\texclusivity: \
-                %s\n\tlongevity: %s" % \
-                (queue_name, durable, exclusive, autodelete) )
+                    "exchange_keys": form_binding_info,
+                    "reg": reg}
             
             action = self.app.model.queue.add
-            action.invoke(reg, args)
+            action.invoke(queue, args)
             
             # navigate back to main queue frame
             self.process_cancel(session)
@@ -474,11 +393,6 @@
         reg = self.frame.get_object(session)
         return "Add Queue to the Broker '%s'" % reg.name
 
-    def __get_exchange_named(self, name, exchanges):
-        for exchange in exchanges:
-            if exchange.name == name:
-                return exchange
-
 class QueueRemove(CuminConfirmForm):
     def get_args(self, session):
         return self.frame.get_args(session)
@@ -545,6 +459,7 @@
     def render_item_content(self, session, id):
         return "Purge Queue '%s'" % Queue.get(id).name
 
+
 class QueueSetRemove(CuminBulkActionForm):
     def process_return(self, session):
         branch = session.branch()
@@ -563,54 +478,97 @@
     def render_item_content(self, session, id):
         return "Remove Queue '%s'" % Queue.get(id).name
 
-class QueueBindingAdd(CuminForm):
-    def __init__(self, app, name):
-        super(QueueBindingAdd, self).__init__(app, name)
+class BindSummaryPropertiesField(FormField):
+    def __init__(self, app, name, form):
+        super(BindSummaryPropertiesField, self).__init__(app, name, form)
 
-        self.exchanges = self.Exchanges(app, "exchanges", self)
-        self.add_child(self.exchanges)
+        self.sum_props = self.SummaryProperties(app, "properties")
+        self.add_child(self.sum_props)
 
-        self.binding_key = TextInput(app, "binding_key", self)
-        self.add_child(self.binding_key)
+        self.prop_tmpl = Template(self, "properties_html")
+        
+    class SummaryProperties(CuminProperties):
+        def do_get_items(self, session, queue):
+            return [("Name:", queue.name),
+                    ("Durable:", queue.durable),
+                    ("Exclusive:", queue.exclusive),
+                    ("Auto-Delete:", queue.autoDelete)]
 
+    def render_inputs(self, session, *args):
+        writer = Writer()
+        self.prop_tmpl.render(writer, session, args)
+        return writer.to_string()
+
+    def render_prop_items(self, session, args):
+        return self.sum_props.render_items(session, *args)
+
     def get_args(self, session):
-        return self.frame.get_args(session)
-    
-    def process_cancel(self, session, queue):
-        branch = session.branch()
-        self.page.show_queue(branch, queue).show_view(branch)
-        self.page.set_redirect_url(session, branch.marshal())
+        return (self.frame.frame.get_object(session),)
 
-    def validate(self, session):
-        valid = True
+class QueueBindingAdd(CuminFieldForm):
+    def __init__(self, app, name):
+        super(QueueBindingAdd, self).__init__(app, name)
 
-        if not self.binding_key.get(session):
-            valid = False
-            self.binding_key.add_error(session, """
-            The binding key is empty; it is required
-            """)
+        self.props = BindSummaryPropertiesField(app, "props", self)
+        self.add_field(self.props)
 
-        if not self.exchanges.get(session):
-            valid = False
-            self.exchanges.add_error(session, """
-            No exchange selected; it is required
-            """)
+        self.bindings = ExchangeKeysField(app, "bindings", self, title="Bind to Exchange:")
+        self.add_field(self.bindings)
+        
+        self.errors = self.Errors(self, "errors")
+        self.add_attribute(self.errors)
 
-        return valid
+    def render_form_error(self, session, *args):
+        errors = self.errors.get(session)
+        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)
+        self.page.set_redirect_url(session, branch.marshal())
 
-    def process_submit(self, session, queue):
-        if self.validate(session):
-            raise Exception("Not implemented")
+    def process_submit(self, session):
+        queue = self.frame.get_object(session)
+        (errors, form_binding_info) = self.bindings.get_binding_info(session, queue.name)
 
-            self.process_cancel(session, queue)
+        if not len(form_binding_info):
+            # no exhchanges were selected is not an
+            # error that ExchangeKeysField looks for
+            errors = self.errors.get(session)
+            errs = errors.setdefault("no_exchanges", list())
+            errs.append("At least one exchange must be selected")
+            errors = True
+            
+        if errors:
+            pass
+        else:
+            reg = self.frame.frame.get_object(session)
+            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)
 
-    def render_title(self, session, queue):
-        return "Add Binding to Queue '%s'" % queue.name
+    def render_title(self, session, *args):
+        queue = self.frame.get_object(session)
+        return "Add Binding to the Queue '%s'" % queue.name
 
-    class Exchanges(ExchangeInputSet):
-        def do_get_items(self, session, queue):
-            return sorted_by(queue.virtual_host.exchange_items())
+    def find_match_value(self, binding_info, this_exchange, match_info):
+        for m_info in binding_info[this_exchange]:
+            if m_info.startswith(match_info):
+                if m_info.endswith("nv"):
+                    return binding_info[this_exchange][m_info] 
 
+    class Errors(Attribute):
+        def get_default(self, session):
+            return dict()
+        
 class QueueBindingRemove(CuminConfirmForm):
     def get_args(self, session):
         return self.frame.get_args(session)
@@ -815,3 +773,4 @@
 
     def render_item_unacked_messages(self, session, consumer):
         return self.app.model.consumer.unackedMessages.value(consumer)
+

Modified: mgmt/trunk/cumin/python/cumin/queue.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/queue.strings	2008-08-05 20:48:37 UTC (rev 2249)
+++ mgmt/trunk/cumin/python/cumin/queue.strings	2008-08-05 20:51:01 UTC (rev 2250)
@@ -126,58 +126,54 @@
     //throw new Error();
 }
 
-[QueueBindingSet.html]
-<div class="rfloat">{page}</div>
-<ul class="radiotabs">&nbsp;</ul>
+[QueueBindingSet.sql]
+select
+  b.id,
+  b.exchange_id as e_id,
+  b.binding_key as key
+from binding as b
+left outer join binding_stats as c on c.id = b.stats_curr_id
+{sql_where}
+{sql_orderby}
+{sql_limit}
 
-<table class="QueueBindingSet mobjects">
-  <tr>
-    <th>Exchange</th>
-    <th>Key</th>
-    <th class="ralign" colspan="2">Messages Matched</th>
-  </tr>
+[QueueBindingSet.count_sql]
+select count(*)
+from binding as b
+left outer join binding_stats as c on c.id = b.stats_curr_id
+{sql_where}
 
-  {items}
-</table>
+[QueueBindingSet.html]
+<form id="{id}" method="post" action="?">
 
-[QueueBindingSet.item_html]
-<tr>
-  <td><a href="{item_href}">{item_name}</a></td>
-  <td>{item_binding_key}</td>
-  <td class="ralign">{item_messages_matched_rate}</td>
-  <td class="ralign">{item_messages_matched}</td>
-</tr>
-
-[QueueBindingAdd.html]
-<form id="{id}" class="mform" method="post" action="?">
-  <div class="head">
-    <h1>{title}</h1>
-  </div>
-  <div class="body">
-    <span class="legend">Exchange</span>
-    <fieldset>{exchanges}</fieldset>
-
-    <span class="legend">Binding Key</span>
-    <fieldset>
-      <div class="field">{binding_key}</div>
-    </fieldset>
-
-    {hidden_inputs}
-  </div>
-  <div class="foot">
-    <a class="help action" href="{help_href}" target="help">Help</a>
-    {submit}
-    {cancel}
-  </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>
 </form>
-<script type="text/javascript" defer="defer">
-(function() {
-    var elem = wooly.doc().elembyid("{id}").node.elements[1];
-    elem.focus();
-    elem.select();
-}())
-</script>
 
+[ExchangeBindingSet.item_html]
+<tr>{cells}</tr>
+
 [QueueStats.html]
 <ul class="radiotabs tabs">{tabs}</ul>
 <div class="radiotabs mode">{mode}</div>
@@ -280,105 +276,11 @@
   <td class="ralign">{item_unacked_messages}</td>
 </tr>
 
-[QueueAdd.css]
-td.exchange_type {
-	font-style: italic;
-}
-
-[QueueAdd.javascript]
-var direct_keys = [];
-var queue_name_field = null;
-
-function attach_submit() {
-	var theForm = document.forms[0];
-	addEvent(theForm, "submit", associate_keys);
-	
-	// get list of binding key fields that are 'direct'
-	// and add a listener to echo the queue_name
-	var inputs = document.getElementsByTagName("input");
-	if (inputs) {
-		for (var i=0; i<inputs.length; i++) {
-			if (inputs[i].className.indexOf("binding_class_direct") != -1) {
-				direct_keys[direct_keys.length] = inputs[i];
-			}
-		}
-		var oQueueName = document.forms[0].elements[queue_name];
-		if (oQueueName) {
-			addEvent(oQueueName, "blur", echo_queue_name);
-			addEvent(oQueueName, "keyup", echo_queue_name);
-			queue_name_field = oQueueName;
-		}
-	}
-	
-}
-// When the form is submitted, make sure we can correctly associate 
-// the input boxes with the checkboxes 
-function associate_keys() {
-
-	// get the list of exchange chechboxes
-	var exchanges = document.forms[0].elements[exchange_path];
-	if (exchanges) {
-		for (var i=0; i<exchanges.length; i++) {
-			var chk_value = exchanges[i].value;
-			// get the associated input box
-			var oInput = document.getElementById(chk_value);
-			if (oInput) {
-				oInput.disabled = false; // disabled inputs don't get submitted
-										// so there should be a 1:1 relationship
-										// between checked boxes and input values
-				if (!exchanges[i].checked) {
-					oInput.disabled = true;
-					oInput.value = '';
-				}
-			}
-		}
-	}
-}
-
-// echos the queue_name field into the binding key fields of type 'direct'
-function echo_queue_name() {
-	if (queue_name_field) {
-		for (var i=0; i<direct_keys.length; i++) {
-			direct_keys[i].value = queue_name_field.value;
-		}
-	}
-}
-
-[ExchangeKeysInput.exchangekey_html]
-	<tr>
-		<td><input type="checkbox" 
-      		id="{id}.{exchange_id}" 
-      		name="{exchange_path}" value="{exchange_name}" size="15" 
-      		tabindex="100"/></td>
-      	<td><label for="{id}.{exchange_id}">{exchange_fmt_name}</label></td>
-    	<td class="exchange_type">{exchange_type}</td>
-    	<td><input class="binding_class_{exchange_type}" 
-    		type="{binding_input_type}" 
-      		name="{binding_path}" id="{exchange_name}" 
-      		value="" size="32" maxlength="256" tabindex="100" {binding_disabled}/></td>
-     </tr>
-
-[ExchangeKeysField.html]
-<div class="field">
-  <div class="title">{title}</div>
-  
-<div class="inputs">
-<table class="mobjects">
-  <thead>
-	<tr>
-		<th colspan="2">Exchange Name</th>
-		<th>Exchange Type</th>
-		<th>Binding Key</th>
-	</tr>
-  </thead>
-  <tbody>
-  {exchange_keys}
-  </tbody>
-</table>
+[BindSummaryPropertiesField.properties_html]
+<div class="properties" style="width:80%">
+	<table class="PropertySet">
+	<tbody>
+		{prop_items}
+	</tbody>
+	</table>
 </div>
-</div>
-<script type="text/javascript">
-	var exchange_path="{exchange_path}";
-	var queue_name="{queue_name_path}";
-	addEvent(window, 'load', attach_submit);
-</script>




More information about the rhmessaging-commits mailing list