[rhmessaging-commits] rhmessaging commits: r3755 - in mgmt/trunk: cumin/python/cumin/grid and 2 other directories.

rhmessaging-commits at lists.jboss.org rhmessaging-commits at lists.jboss.org
Mon Dec 21 17:54:55 EST 2009


Author: justi9
Date: 2009-12-21 17:54:54 -0500 (Mon, 21 Dec 2009)
New Revision: 3755

Modified:
   mgmt/trunk/cumin/python/cumin/grid/submission.py
   mgmt/trunk/cumin/python/cumin/messaging/exchange.py
   mgmt/trunk/cumin/python/cumin/widgets.py
   mgmt/trunk/wooly/python/wooly/forms.py
   mgmt/trunk/wooly/python/wooly/forms.strings
   mgmt/trunk/wooly/python/wooly/parameters.py
Log:
 * Create radio and checkbox input fields that work from a
   data-oriented interface (get_items)

 * Convert ExchangeAdd to use them


Modified: mgmt/trunk/cumin/python/cumin/grid/submission.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/grid/submission.py	2009-12-21 15:12:54 UTC (rev 3754)
+++ mgmt/trunk/cumin/python/cumin/grid/submission.py	2009-12-21 22:54:54 UTC (rev 3755)
@@ -261,23 +261,23 @@
         def render_title(self, session):
             return "Standard error"
 
-    class OptionsField(CheckboxField):
-        def __init__(self, app, name):
-            super(SubmissionAddForm.OptionsField, self).__init__(app, name)
+    # class OptionsField(CheckboxField):
+    #     def __init__(self, app, name):
+    #         super(SubmissionAddForm.OptionsField, self).__init__(app, name)
 
-            self.add_option(self.SaveAsTemplate(app, "template"))
-            self.add_option(self.UseCloud(app, "cloud"))
+    #         self.add_option(self.SaveAsTemplate(app, "template"))
+    #         self.add_option(self.UseCloud(app, "cloud"))
 
-        def render_title(self, session):
-            return "Options"
+    #     def render_title(self, session):
+    #         return "Options"
 
-        class SaveAsTemplate(CheckboxFieldOption):
-            def render_title(self, session):
-                return "Save as template"
+    #     class SaveAsTemplate(CheckboxFieldOption):
+    #         def render_title(self, session):
+    #             return "Save as template"
 
-        class UseCloud(CheckboxFieldOption):
-            def render_title(self, session):
-                return "Use cloud"
+    #     class UseCloud(CheckboxFieldOption):
+    #         def render_title(self, session):
+    #             return "Use cloud"
 
     class AttributesField(MultilineStringField):
         def render_title(self, session):

Modified: mgmt/trunk/cumin/python/cumin/messaging/exchange.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/messaging/exchange.py	2009-12-21 15:12:54 UTC (rev 3754)
+++ mgmt/trunk/cumin/python/cumin/messaging/exchange.py	2009-12-21 22:54:54 UTC (rev 3755)
@@ -246,156 +246,147 @@
         elems.append(self.phase.get_sql_constraint(session, exchange))
         return "where %s" % " and ".join(elems)
 
-class ExchangeAddForm(CuminFieldForm):
-    def __init__(self, app, name, task):
-        super(ExchangeAddForm, self).__init__(app, name)
+class ExchangeTypeField(RadioItemSetField):
+    def __init__(self, app, name):
+        param = SymbolParameter(app, "param")
+        param.default = "direct"
 
-        self.task = task
+        super(ExchangeTypeField, self).__init__(app, name, param)
 
-        self.vhost = VhostParameter(app, "vhost")
-        self.add_parameter(self.vhost)
+        self.add_parameter(param)
 
-        self.exchange_name = ExchangeNameField(app, "exchange_name")
-        self.add_field(self.exchange_name)
+    def render_title(self, session):
+        return "Routing"
 
-        self.exchange_type = self.ExchangeTypeField(app, "exchange_type")
-        self.add_field(self.exchange_type)
+    def do_get_items(self, session):
+        items = list()
 
-        self.more = MoreFieldSet(app, "more")
-        self.add_field(self.more)
+        item = RadioItem("direct")
+        item.title = "Direct"
+        item.description = "Route messages to queues by queue name"
+        items.append(item)
 
-        self.durable = self.ExchangeDurabilityField(app, "durable")
-        self.more.add_field(self.durable)
+        item = RadioItem("topic")
+        item.title = "Topic"
+        item.description = "Route messages to topics by matching routing-key pattern"
+        items.append(item)
 
-        self.sequence = self.SequenceField(app, "sequence")
-        self.more.add_field(self.sequence)
+        item = RadioItem("fanout")
+        item.title = "Fan out"
+        item.description = \
+            "Route messages to all queues bound to this exchange"
+        items.append(item)
 
-        self.ive = self.IVEField(app, "ive")
-        self.more.add_field(self.ive)
+        item = RadioItem("header")
+        item.title = "Header"
+        item.description = \
+            "Route messages to queues by the content of their headers"
+        items.append(item)
 
-    def process_submit(self, session):
-        self.check(session)
+        item = RadioItem("xml")
+        item.title = "XML"
+        item.description = "Route messages to queues by their XML content"
+        items.append(item)
 
-        if not self.errors.get(session):
-            vhost = self.vhost.get(session)
-            name = self.exchange_name.get(session)
-            type = self.exchange_type.get(session)
-            durable = self.durable.get(session) == "yes"
-            sequence = self.sequence.get(session) == "yes"
-            ive = self.ive.get(session) == "yes"
+        return items
 
-            self.task.invoke(session, vhost, name, type,
-                             durable, sequence, ive)
-            self.task.exit_with_redirect(session, vhost)
+class ExchangeDurabilityField(RadioItemSetField):
+    def __init__(self, app, name):
+        param = BooleanParameter(app, "param")
+        param.default = True
 
-    def render_title(self, session):
-        vhost = self.vhost.get(session)
-        return self.task.get_description(session, vhost)
+        super(ExchangeDurabilityField, self).__init__(app, name, param)
 
-    class SequenceField(TwoOptionRadioField):
-        def render_title(self, session):
-            return "Insert Sequence?"
+        # XXX don't like this
+        self.add_parameter(param)
 
-        def render_field_help(self, session):
-            return "(Exchange will insert a 'qpid.msg_sequence' field in the message header)"
+    def render_title(self, session):
+        return "Durability"
 
-        def render_title_1(self, session):
-            return "Insert Sequence"
+    def do_get_items(self, session):
+        items = list()
 
-        def render_title_2(self, session):
-            return "No Sequence"
+        item = RadioItem(True)
+        item.title = "Durable"
+        item.description = \
+            "Save this exchange definition and restore it when the broker " + \
+            "restarts"
+        items.append(item)
 
-    class IVEField(TwoOptionRadioField):
-        def render_title(self, session):
-            return "Initial Value Exchange?"
+        item = RadioItem(False)
+        item.title = "Transient"
+        item.description = \
+            "Discard this exchange definition when the broker restarts"
+        items.append(item)
 
-        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)"
+        return items
 
-        def render_title_1(self, session):
-            return "Initial-Value-Exchange"
+class ExchangeArgumentsField(CheckboxItemSetField):
+    def __init__(self, app, name):
+        item_parameter = SymbolParameter(app, "item")
 
-        def render_title_2(self, session):
-            return "No IVE"
+        super(ExchangeArgumentsField, self).__init__(app, name, item_parameter)
 
-    class ExchangeDurabilityField(TwoOptionRadioField):
-        def render_title(self, session):
-            return "Durable?"
+    def do_get_items(self, session):
+        items = list()
 
-        def render_field_help(self, session):
-            return "(Queue is durable)"
+        item = CheckboxItem("initial_value")
+        item.title = "Initial value"
+        item.description = "Save the last message encountered and send it to newly bound queues"
+        items.append(item)
 
-        def render_title_1(self, session):
-            return "Durable"
+        item = CheckboxItem("message_sequence")
+        item.title = "Sequence numbers"
+        item.description = "Insert a sequence number into the header of each message"
+        items.append(item)
 
-        def render_title_2(self, session):
-            return "Transient"
+        return items
 
-    class ExchangeTypeField(RadioField):
-        def __init__(self, app, name):
-            super(ExchangeAddForm.ExchangeTypeField, self).__init__ \
-                (app, name, None)
+    def render_title(self, session):
+        return "Advanced options"
 
-            self.param = Parameter(app, "param")
-            self.param.default = "direct"
-            self.add_parameter(self.param)
+class ExchangeAddForm(FoldingFieldSubmitForm):
+    def __init__(self, app, name, task):
+        super(ExchangeAddForm, self).__init__(app, name)
 
-            option = self.Direct(app, "direct", self.param)
-            self.add_option(option)
+        self.task = task
 
-            option = self.Topic(app, "topic", self.param)
-            self.add_option(option)
+        self.vhost = VhostParameter(app, "vhost")
+        self.add_parameter(self.vhost)
 
-            option = self.Fanout(app, "fanout", self.param)
-            self.add_option(option)
+        self.exchange_name = ExchangeNameField(app, "exchange_name")
+        self.main_fields.add_field(self.exchange_name)
 
-            option = self.Headers(app, "headers", self.param)
-            self.add_option(option)
+        self.exchange_type = ExchangeTypeField(app, "exchange_type")
+        self.main_fields.add_field(self.exchange_type)
 
-            option = self.XML(app, "xml", self.param)
-            self.add_option(option)
+        self.durability = ExchangeDurabilityField(app, "durability")
+        self.main_fields.add_field(self.durability)
 
-        def render_title(self, session):
-            return "Exchange Type"
+        self.args = ExchangeArgumentsField(app, "args")
+        self.extra_fields.add_field(self.args)
 
-        def render_field_help(self, session):
-            return "(Type of exchange to add)"
+    def process_submit(self, session):
+        self.check(session)
 
-        class Direct(RadioFieldOption):
-            def render_value(self, session):
-                return "direct"
+        if not self.errors.get(session):
+            vhost = self.vhost.get(session)
+            name = self.exchange_name.get(session)
+            type = self.exchange_type.get(session)
+            durable = self.durability.get(session)
+            args = self.args.get(session)
 
-            def render_title(self, session):
-                return "<em>Direct:</em> Route messages to queues by queue name"
+            sequence_numbers = "sequence_numbers" in args
+            initial_value = "initial_value" in args
 
-        class Topic(RadioFieldOption):
-            def render_value(self, session):
-                return "topic"
+            self.task.invoke(session, vhost, name, type,
+                             durable, sequence_numbers, initial_value)
+            self.task.exit_with_redirect(session, vhost)
 
-            def render_title(self, session):
-                return "<em>Topic:</em> Route messages to queues by topic keyword match"
+    def render_title(self, session):
+        vhost = self.vhost.get(session)
+        return self.task.get_description(session, vhost)
 
-        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 ExchangeStats(Widget):
     def __init__(self, app, name, exchange):
         super(ExchangeStats, self).__init__(app, name)

Modified: mgmt/trunk/cumin/python/cumin/widgets.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/widgets.py	2009-12-21 15:12:54 UTC (rev 3754)
+++ mgmt/trunk/cumin/python/cumin/widgets.py	2009-12-21 22:54:54 UTC (rev 3755)
@@ -301,6 +301,7 @@
         def render_help_href(self, session, *args):
             return "resource?name=help.html#%s" % self.path
 
+# XXX get rid of this!
 class CuminFieldForm(FieldSubmitForm, Frame):
     def validate(self, session):
         self.check(session)

Modified: mgmt/trunk/wooly/python/wooly/forms.py
===================================================================
--- mgmt/trunk/wooly/python/wooly/forms.py	2009-12-21 15:12:54 UTC (rev 3754)
+++ mgmt/trunk/wooly/python/wooly/forms.py	2009-12-21 22:54:54 UTC (rev 3755)
@@ -151,7 +151,7 @@
     def __init__(self, app, name):
         super(StringInput, self).__init__(app, name, None)
 
-        self.param = Parameter(app, "param")
+        self.param = StringParameter(app, "param")
         self.add_parameter(self.param)
 
         self.size = 30
@@ -247,12 +247,61 @@
         return "click_button"
 
 class CheckboxInputSet(FormInput, ItemSet):
-    def render_item_value(self, session, *args):
+    def render_item_value(self, session, item):
         return None
 
-    def render_item_checked_attr(self, session, *args):
+    def render_item_checked_attr(self, session, item):
         return None
 
+class FormInputItemSet(FormInput, ItemSet):
+    def render_item_value(self, session, item):
+        return item.value
+
+    def render_item_title(self, session, item):
+        return item.title
+
+    def render_item_description(self, session, item):
+        return item.description
+
+    def render_item_disabled_attr(self, session, item):
+        if item.disabled:
+            return "disabled=\"disabled\""
+
+class FormInputItem(object):
+    def __init__(self, value):
+        self.value = value
+        self.title = None
+        self.description = None
+        self.disabled = False
+
+class RadioItemSet(FormInputItemSet):
+    def render_item_type(self, session, item):
+        return "radio"
+
+    def render_item_checked_attr(self, session, item):
+        if item.value == self.get(session):
+            return "checked=\"checked\""
+
+class RadioItem(FormInputItem):
+    pass
+
+class CheckboxItemSet(FormInputItemSet):
+    def __init__(self, app, name, item_parameter):
+        super(CheckboxItemSet, self).__init__(app, name, None)
+
+        self.param = ListParameter(app, "param", item_parameter)
+        self.add_parameter(self.param)
+
+    def render_item_type(self, session, item):
+        return "checkbox"
+
+    def render_item_checked_attr(self, session, item):
+        if item.value in self.get(session):
+            return "checked=\"checked\""
+
+class CheckboxItem(FormInputItem):
+    pass
+
 class RadioInputSet(ScalarInput, ItemSet):
     def render_item_value(self, session, *args):
         return None
@@ -297,6 +346,7 @@
     def render_help(self, session, *args):
         return self.help
 
+    # XXX hmmm
     def render_form_field_class(self, session, *args):
         return self.css_class
 
@@ -440,29 +490,40 @@
 class RadioFieldOption(RadioInput):
     pass
 
-class CheckboxField(FormField):
-    def __init__(self, app, name):
-        super(CheckboxField, self).__init__(app, name)
+class RadioItemSetField(FormField):
+    def __init__(self, app, name, param):
+        super(RadioItemSetField, self).__init__(app, name)
 
-        self.options = list()
+        self.inputs = self.Inputs(app, "inputs", param)
+        self.add_child(self.inputs)
 
-    def add_option(self, option):
-        assert isinstance(option, CheckboxFieldOption)
+    def get(self, session):
+        return self.inputs.get(session)
 
-        self.options.append(option)
-        self.add_child(option)
+    def do_get_items(self, session):
+        raise Exception("Not implemented")
 
-    def render_inputs(self, session, *args):
-        writer = Writer()
+    class Inputs(RadioItemSet):
+        def do_get_items(self, session):
+            return self.parent.do_get_items(session)
 
-        for option in self.options:
-            writer.write(option.render(session))
+class CheckboxItemSetField(FormField):
+    def __init__(self, app, name, item_parameter):
+        super(CheckboxItemSetField, self).__init__(app, name)
 
-        return writer.to_string()
+        self.inputs = self.Inputs(app, "inputs", item_parameter)
+        self.add_child(self.inputs)
 
-class CheckboxFieldOption(CheckboxInput):
-    pass
+    def get(self, session):
+        return self.inputs.get(session)
 
+    def do_get_items(self, session):
+        raise Exception("Not implemented")
+        
+    class Inputs(CheckboxItemSet):
+        def do_get_items(self, session):
+            return self.parent.do_get_items(session)
+
 class ButtonForm(Form):
     def __init__(self, app, name):
         super(ButtonForm, self).__init__(app, name)
@@ -594,8 +655,8 @@
     def check(self, session):
         super(FoldingFieldSubmitForm, self).check(session)
 
-        self.main.check(session)
-        self.extra.check(session)
+        self.main_fields.check(session)
+        self.extra_fields.check(session)
 
     def render_content(self, session, *args):
         return self.content.render(session, *args)

Modified: mgmt/trunk/wooly/python/wooly/forms.strings
===================================================================
--- mgmt/trunk/wooly/python/wooly/forms.strings	2009-12-21 15:12:54 UTC (rev 3754)
+++ mgmt/trunk/wooly/python/wooly/forms.strings	2009-12-21 22:54:54 UTC (rev 3755)
@@ -86,24 +86,62 @@
 [RadioInput.html]
 <input type="radio" id="{id}" name="{name}" value="{value}" tabindex="{tab_index}" {checked_attr} {disabled_attr}/>
 
-[CheckboxInputSet.html]
+[RadioInputSet.html]
 <ul>{items}</ul>
 
-[CheckboxInputSet.item_html]
+[RadioInputSet.item_html]
 <li>
-  <input type="checkbox" name="{name}" value="{item_value}" tabindex="{tab_index}" {item_checked_attr} {disabled_attr}/>
+  <input type="radio" name="{name}" value="{item_value}" tabindex="{tab_index}" {item_checked_attr} {disabled_attr}/>
   {item_content}
 </li>
 
-[RadioInputSet.html]
+[CheckboxInputSet.html]
 <ul>{items}</ul>
 
-[RadioInputSet.item_html]
+[CheckboxInputSet.item_html]
 <li>
-  <input type="radio" name="{name}" value="{item_value}" tabindex="{tab_index}" {item_checked_attr} {disabled_attr}/>
+  <input type="checkbox" name="{name}" value="{item_value}" tabindex="{tab_index}" {item_checked_attr} {disabled_attr}/>
   {item_content}
 </li>
 
+[FormInputItemSet.css]
+table.FormInputItemSet {
+    border-collapse: collapse;
+}
+
+table.FormInputItemSet > tbody > tr {
+    vertical-align: top;
+}
+
+table.FormInputItemSet > tbody > tr > td {
+    padding: 0 0.5em 0.5em 0;
+    font-size: 0.9em;
+}
+
+table.FormInputItemSet > tbody > tr > td > input {
+    margin: 0.25em 0 0 0;
+}
+
+table.FormInputItemSet > tbody > tr > td > label {
+    font-weight: bold;
+    display: block;
+}
+
+[FormInputItemSet.html]
+<table class="FormInputItemSet"><tbody>{items}</tbody></table>
+
+[FormInputItemSet.item_html]
+<tr>
+  <td>
+    <input id="{id}.{item_value}" type="{item_type}" name="{name}" value="{item_value}"
+    tabindex="{tab_index}" {item_checked_attr} {item_disabled_attr}/>
+  </td>
+  <td>
+    <label for="{id}.{item_value}">{item_title}</label>
+    {item_description}
+  </td>
+</tr>
+
 [OptionInputSet.html]
 <select name="{name}" tabindex="{tab_index}" {disabled_attr}>{items}</select>
 
@@ -223,13 +261,6 @@
   <label for="{id}">{title}</label>
 </div>
 
-[CheckboxFieldOption.html]
-<div>
-  <input type="checkbox" name="{name}" id="{id}" value="{value}"
-         tabindex="{tab_index}" {checked_attr} {disabled_attr}/>
-  <label for="{id}">{title}</label>
-</div>
-
 [ButtonForm.css]
 form.ButtonForm {
     background-color: #fafafa;

Modified: mgmt/trunk/wooly/python/wooly/parameters.py
===================================================================
--- mgmt/trunk/wooly/python/wooly/parameters.py	2009-12-21 15:12:54 UTC (rev 3754)
+++ mgmt/trunk/wooly/python/wooly/parameters.py	2009-12-21 22:54:54 UTC (rev 3755)
@@ -73,6 +73,13 @@
     def do_marshal(self, object):
         return self.item_parameter.do_marshal(object)
 
+class StringParameter(Parameter):
+    pass
+
+# XXX this will be a strict sort of string parameter
+class SymbolParameter(StringParameter):
+    pass
+
 class IntegerParameter(Parameter):
     def do_unmarshal(self, string):
         try:



More information about the rhmessaging-commits mailing list