[rhmessaging-commits] rhmessaging commits: r3666 - in mgmt/trunk: cumin/python/cumin/account and 3 other directories.

rhmessaging-commits at lists.jboss.org rhmessaging-commits at lists.jboss.org
Mon Oct 5 11:58:24 EDT 2009


Author: justi9
Date: 2009-10-05 11:58:23 -0400 (Mon, 05 Oct 2009)
New Revision: 3666

Modified:
   mgmt/trunk/cumin/python/cumin/account/widgets.py
   mgmt/trunk/cumin/python/cumin/grid/model.py
   mgmt/trunk/cumin/python/cumin/grid/scheduler.py
   mgmt/trunk/cumin/python/cumin/grid/submission.py
   mgmt/trunk/cumin/python/cumin/grid/test.py
   mgmt/trunk/cumin/python/cumin/messaging/brokerlink.py
   mgmt/trunk/cumin/python/cumin/server.py
   mgmt/trunk/cumin/python/cumin/widgets.py
   mgmt/trunk/wooly/python/wooly/__init__.py
   mgmt/trunk/wooly/python/wooly/forms.py
   mgmt/trunk/wooly/python/wooly/forms.strings
   mgmt/trunk/wooly/python/wooly/server.py
Log:
 * Remove old origin machinery; it's no longer used since we serve
   forms under a different page

 * Remove old validate machinery from forms; now that we have an
   'errors' attribute on form, we instead update it in the form
   'check' traversal

 * Fix some places where we should have been using ScalarInput and
   ScalarField

 * Introduce a ShowableFieldSet for showing and hiding a set of fields

 * Remove some method setters (a deprecated pattern)

 * Add new fields to the submission form, and extend the submission
   add task

 * Choose a default scheduler at random

 * Reenable cumin table updates; I had mistakenly disabled it
   previously


Modified: mgmt/trunk/cumin/python/cumin/account/widgets.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/account/widgets.py	2009-10-03 21:11:21 UTC (rev 3665)
+++ mgmt/trunk/cumin/python/cumin/account/widgets.py	2009-10-05 15:58:23 UTC (rev 3666)
@@ -171,7 +171,7 @@
         crypted = subject.password
 
         if crypt_password(curr, crypted) != crypted:
-            error = FormError("The password is incorrect", self.__current)
+            error = FormError("The password is incorrect")
             self.errors.add(session, error)
 
         if new0 != new1:

Modified: mgmt/trunk/cumin/python/cumin/grid/model.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/grid/model.py	2009-10-03 21:11:21 UTC (rev 3665)
+++ mgmt/trunk/cumin/python/cumin/grid/model.py	2009-10-05 15:58:23 UTC (rev 3666)
@@ -46,25 +46,44 @@
 
             self.form.pool.set(session, pool)
 
-    def do_invoke(self, completion, session, scheduler,
-                  description, command, args):
+    def do_invoke(self, completion, session,
+                  scheduler, description, executable,
+                  args=None,
+                  iwd="/tmp",
+                  stdin=None,
+                  stdout=None,
+                  stderr=None,
+                  requirements="TRUE",
+                  universe="VANILLA"):
         if hasattr(session, "user_session"):
-            user = session.user_session.subject.name
+            user_name = session.user_session.subject.name
         else:
-            user = "nobody"
+            user_name = "nobody"
 
-        ad = {"Submission":   {"TYPE": self.STRING_TYPE, "VALUE": description},
-              "Cmd":          {"TYPE": self.STRING_TYPE, "VALUE": command},
-              "Args":         {"TYPE": self.STRING_TYPE, "VALUE": args},
-              "Requirements": {"TYPE": self.EXPR_TYPE, "VALUE": "TRUE"},
-              "JobUniverse":  {"TYPE": self.INTEGER_TYPE,
-                               "VALUE": "%s" % (self.UNIVERSE["VANILLA"],)},
-              "Iwd":          {"TYPE": self.STRING_TYPE, "VALUE": "/tmp"},
-              "User":         {"TYPE": self.STRING_TYPE,
-                               "VALUE": "%s@%s" % (user, scheduler.Machine)}}
+        ad = {
+            "Submission":   {"TYPE": self.STRING_TYPE,
+                             "VALUE": condor_string(description)},
+            "Cmd":          {"TYPE": self.STRING_TYPE,
+                             "VALUE": condor_string(executable)},
+            "Args":         {"TYPE": self.STRING_TYPE,
+                             "VALUE": condor_string(args)},
+            "Requirements": {"TYPE": self.EXPR_TYPE, "VALUE": requirements},
+            "JobUniverse":  {"TYPE": self.INTEGER_TYPE,
+                             "VALUE": str(self.UNIVERSE[universe])},
+            "Iwd":          {"TYPE": self.STRING_TYPE,
+                             "VALUE": condor_string(iwd)},
+            "Owner":        {"TYPE": self.STRING_TYPE,
+                             "VALUE": "guest3"}
+            }
 
+#            "User":         {"TYPE": self.STRING_TYPE,
+#                             "VALUE": condor_string("example at example.com")}
+
         scheduler.Submit(self.app.model.mint.model, completion, ad, None)
 
+def condor_string(string):
+    return "\"%s\"" % string
+
 class NegotiatorStartTask(QmfTask):
     def __init__(self, app, cls):
         super(NegotiatorStartTask, self).__init__(app, cls)

Modified: mgmt/trunk/cumin/python/cumin/grid/scheduler.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/grid/scheduler.py	2009-10-03 21:11:21 UTC (rev 3665)
+++ mgmt/trunk/cumin/python/cumin/grid/scheduler.py	2009-10-05 15:58:23 UTC (rev 3666)
@@ -1,5 +1,7 @@
 import logging
 
+from random import choice
+
 from wooly import *
 from wooly.widgets import *
 from wooly.forms import *
@@ -89,34 +91,32 @@
                 href = self.page.main.inventory.system.get_href(session, sys)
                 return fmt_link(href, data["system_name"])
 
-class SchedulerSelectField(FormField):
+class SchedulerSelectField(ScalarField):
     def __init__(self, app, name, pool):
-        super(SchedulerSelectField, self).__init__(app, name)
+        super(SchedulerSelectField, self).__init__(app, name, None)
 
         self.pool = pool
 
         self.param = SchedulerParameter(app, "param")
         self.add_parameter(self.param)
 
-        self.schedulers = self.SchedulerOptions(app, "schedulers", self.param)
-        self.add_child(self.schedulers)
+        self.input = self.SchedulerOptions(app, "input", self.param)
+        self.add_child(self.input)
 
     def get(self, session):
         scheduler = self.param.get(session)
 
         if not scheduler:
-            for item in self.schedulers.get_items(session):
-                scheduler = item
-                break
+            items = self.input.get_items(session)
 
+            if items:
+                scheduler = choice(items)
+
         return scheduler
 
     def render_title(self, session):
         return "Scheduler"
 
-    def render_inputs(self, session):
-        return self.schedulers.render(session)
-
     class SchedulerOptions(OptionInputSet):
         def do_get_items(self, session):
             pool = self.parent.pool.get(session)

Modified: mgmt/trunk/cumin/python/cumin/grid/submission.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/grid/submission.py	2009-10-03 21:11:21 UTC (rev 3665)
+++ mgmt/trunk/cumin/python/cumin/grid/submission.py	2009-10-05 15:58:23 UTC (rev 3666)
@@ -1,4 +1,5 @@
 import logging
+import shlex
 
 from cumin.widgets import *
 from cumin.util import *
@@ -123,45 +124,93 @@
 
         self.task = task
 
+        self.content = Widget(app, "fields")
+        self.add_child(self.content)
+
+        self.main = FormFieldSet(app, "main")
+        self.content.add_child(self.main)
+
+        self.extra = ShowableFieldSet(app, "extra")
+        self.content.add_child(self.extra)
+
         from scheduler import SchedulerSelectField # XXX
 
         self.scheduler = SchedulerSelectField(app, "scheduler", self.pool)
-        self.add_field(self.scheduler)
+        self.scheduler.required = True
+        self.main.add_field(self.scheduler)
 
         self.description = self.DescriptionField(app, "description")
         self.description.input.size = 50
-        self.add_field(self.description)
+        self.description.required = True
+        self.main.add_field(self.description)
 
         self.command = self.CommandField(app, "command")
-        self.command.input.size = 50
-        self.add_field(self.command)
+        self.command.input.columns = 50
+        self.command.required = True
+        self.main.add_field(self.command)
 
-        self.args = self.ArgumentsField(app, "args")
-        self.args.input.size = 50
-        self.add_field(self.args)
+        self.requirements = self.RequirementsField(app, "requirements")
+        self.requirements.input.columns = 50
+        self.main.add_field(self.requirements)
 
-        self.inputs = self.InputsField(app, "inputs")
-        self.add_field(self.inputs)
+        self.directory = self.WorkingDirectoryField(app, "directory")
+        self.directory.input.size = 50
+        self.extra.add_field(self.directory)
 
-        self.outputs = self.OutputsField(app, "outputs")
-        self.add_field(self.outputs)
+        self.stdin = self.StdinField(app, "stdin")
+        self.stdin.input.size = 50
+        self.extra.add_field(self.stdin)
 
+        self.stdout = self.StdoutField(app, "stdout")
+        self.stdout.input.size = 50
+        self.extra.add_field(self.stdout)
+
+        self.stderr = self.StderrField(app, "stderr")
+        self.stderr.input.size = 50
+        self.extra.add_field(self.stderr)
+
         #self.options = self.OptionsField(app, "options")
-        #self.add_field(self.options)
+        #self.main.add_field(self.options)
 
+        self.attributes_ = self.AttributesField(app, "attributes")
+        self.attributes_.input.columns = 50
+        self.extra.add_field(self.attributes_)
+
+    def check(self, session):
+        self.main.check(session)
+        self.extra.check(session)
+
     def process_submit(self, session):
         self.check(session)
 
         if not self.errors.get(session):
             scheduler = self.scheduler.get(session)
-
-            assert scheduler
-
             description = self.description.get(session)
             command = self.command.get(session)
-            args = self.args.get(session)
+            requirements = self.requirements.get(session)
+            directory = self.directory.get(session)
+            stdin = self.stdin.get(session)
+            stdout = self.stdout.get(session)
+            stderr = self.stderr.get(session)
 
-            self.task.invoke(session, scheduler, description, command, args)
+            tokens = shlex.split(command)
+
+            executable = tokens[0]
+            args = tokens[1:]
+
+            if not requirements:
+                requirements = "TRUE"
+
+            self.task.invoke(session, scheduler, description,
+                             executable,
+                             args=args,
+                             iwd=directory,
+                             stdin=stdin,
+                             stdout=stdout,
+                             stderr=stderr,
+                             requirements=requirements)
+#                             universe=universe) # XXX
+
             self.task.exit_with_redirect(session, scheduler)
 
     def render_title(self, session):
@@ -195,22 +244,30 @@
         def render_title(self, session):
             return "Description"
 
-    class CommandField(StringField):
+    class CommandField(MultilineStringField):
         def render_title(self, session):
             return "Command"
 
-    class ArgumentsField(StringField):
+    class RequirementsField(MultilineStringField):
         def render_title(self, session):
-            return "Arguments"
+            return "Requirements"
 
-    class InputsField(MultilineStringField):
+    class WorkingDirectoryField(StringField):
         def render_title(self, session):
-            return "Inputs"
+            return "Working directory"
 
-    class OutputsField(MultilineStringField):
+    class StdinField(StringField):
         def render_title(self, session):
-            return "Outputs"
+            return "Standard input"
 
+    class StdoutField(StringField):
+        def render_title(self, session):
+            return "Standard output"
+
+    class StderrField(StringField):
+        def render_title(self, session):
+            return "Standard error"
+
     class OptionsField(CheckboxField):
         def __init__(self, app, name):
             super(SubmissionAddForm.OptionsField, self).__init__(app, name)
@@ -228,3 +285,7 @@
         class UseCloud(CheckboxFieldOption):
             def render_title(self, session):
                 return "Use cloud"
+
+    class AttributesField(MultilineStringField):
+        def render_title(self, session):
+            return "Extra attributes"

Modified: mgmt/trunk/cumin/python/cumin/grid/test.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/grid/test.py	2009-10-03 21:11:21 UTC (rev 3665)
+++ mgmt/trunk/cumin/python/cumin/grid/test.py	2009-10-05 15:58:23 UTC (rev 3666)
@@ -42,8 +42,7 @@
         check_render(ns)
 
         task.form.description.set(ns, session.id)
-        task.form.command.set(ns, "/bin/sleep")
-        task.form.args.set(ns, "5m")
+        task.form.command.set(ns, "/bin/sleep 5m")
 
         check_submit_form(ns, task.form)
 

Modified: mgmt/trunk/cumin/python/cumin/messaging/brokerlink.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/messaging/brokerlink.py	2009-10-03 21:11:21 UTC (rev 3665)
+++ mgmt/trunk/cumin/python/cumin/messaging/brokerlink.py	2009-10-05 15:58:23 UTC (rev 3666)
@@ -324,12 +324,12 @@
         self.more.add_field(self.help)
 
         self.tag = TextField(app, "tag")
-        self.tag.set_required(False)
+        self.tag.required = False
         self.tag.set_title("Tag")
         self.more.add_field(self.tag)
 
         self.excludes = TextField(app, "excludes")
-        self.excludes.set_required(False)
+        self.excludes.required = False
         self.excludes.set_title("Excludes")
         self.more.add_field(self.excludes)
 
@@ -445,7 +445,7 @@
         def render_title(self, session):
             return "Address"
 
-    class PortField(StringField):
+    class PortField(IntegerField):
         def __init__(self, app, name):
             super(LinkForm.PortField, self).__init__(app, name)
 
@@ -455,14 +455,6 @@
         def render_title(self, session):
             return "Port"
 
-        def do_validate(self, session, errors):
-            try:
-                port = self.get(session)
-                if port:
-                    int(port)
-            except:
-                errors.append(FormError("Port must be a number"))
-
     class UsernameField(StringField):
         def render_title(self, session):
             return "Username"

Modified: mgmt/trunk/cumin/python/cumin/server.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/server.py	2009-10-03 21:11:21 UTC (rev 3665)
+++ mgmt/trunk/cumin/python/cumin/server.py	2009-10-05 15:58:23 UTC (rev 3666)
@@ -39,14 +39,15 @@
             usess = UserSession(self.app, user)
             session.set_cookie("session", usess.id)
 
-            page.set_redirect_url(session, session.marshal())
+            page.redirect.set(session, session.marshal())
 
             return False
 
         lpage = self.app.login_page
+
         lsess = Session(lpage)
         lpage.origin.set(lsess, session.marshal())
 
-        page.set_redirect_url(session, lsess.marshal())
+        page.redirect.set(session, lsess.marshal())
 
         return False

Modified: mgmt/trunk/cumin/python/cumin/widgets.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/widgets.py	2009-10-03 21:11:21 UTC (rev 3665)
+++ mgmt/trunk/cumin/python/cumin/widgets.py	2009-10-05 15:58:23 UTC (rev 3666)
@@ -740,7 +740,7 @@
 
         self.html_class = CuminTable.__name__
 
-        # XXX self.update_enabled = True
+        self.update_enabled = True
 
         self.paginator = Paginator(app, "page")
         self.add_child(self.paginator)
@@ -1054,14 +1054,11 @@
     def render_title(self, session):
         return "Name"
 
-    def set_required(self, required):
-        self.required = required
-
     def check(self, session):
         name = self.get(session)
 
         if name == "" and self.required:
-            self.form.errors.add(session, MissingValueError())
+            self.form.errors.add(session, MissingValueError(self))
         else:
             for char in self.illegal_chars:
                 if char in name:
@@ -1074,22 +1071,7 @@
 
                     break
 
-    def do_validate(self, session, errors):
-        name = self.get(session)
-
-        if name == "" and self.required:
-            errors.append(MissingValueError())
-        else:
-            for char in self.illegal_chars:
-                if char in name:
-                    msg = "The name contains illegal characters"
-                    if self.legal_chars_desc:
-                        msg = msg + "; " + self.legal_chars_desc
-
-                    errors.append(FormError(msg))
-
-                    break
-
+# XXX what?
 class TextField(NameField):
     def __init__(self, app, name):
         super(TextField, self).__init__(app, name)
@@ -1141,24 +1123,6 @@
                 if results.count() > 0:
                     self.form.errors.add(session, DuplicateValueError())
 
-    # XXX get rid of this
-    def do_validate(self, session, errors):
-        super(UniqueNameField, self).do_validate(session, errors)
-
-        if not errors:
-            name = self.get(session)
-
-            args = {self.__field: name, }
-            results = self.__class.selectBy(**args)
-
-            if self.__object:
-                object = self.__object.get(session)
-                if object:
-                    results = results.filter(self.__class.q.id != object.id)
-
-            if results.count() > 0:
-                errors.append(DuplicateValueError())
-
 class DuplicateValueError(FormError):
     def __init__(self, fld="name"):
         super(DuplicateValueError, self).__init__()

Modified: mgmt/trunk/wooly/python/wooly/__init__.py
===================================================================
--- mgmt/trunk/wooly/python/wooly/__init__.py	2009-10-03 21:11:21 UTC (rev 3665)
+++ mgmt/trunk/wooly/python/wooly/__init__.py	2009-10-05 15:58:23 UTC (rev 3666)
@@ -528,8 +528,6 @@
         self.page = page
         self.trunk = None
 
-        self.origin = None
-
         self.values_by_path = dict()
         self.cookies_by_name = dict() # name => (newly set?, value, expires)
         self.headers_by_name = dict()
@@ -762,32 +760,6 @@
             name, value = crumb.split("=", 1)
             self.cookies_by_name[name.strip()] = (False, value.strip(), None)
 
-    def set_origin(self, origin):
-        self.origin = self.fix_origin(origin)
-
-    def fix_origin(self, origin):
-        if origin:
-            try:
-                # clean up refering url
-                url = urlsplit(origin)
-                query = url.query
-                if query:
-                    namevals = query.split(";")
-                    newquery = dict()
-                    for nameval in namevals:
-                        name, value = nameval.split("=", 1)
-                        # remove the parent's origin
-                        if not name.endswith(".origin"):
-                            newquery[name] = value
-
-                    origin = ";".join(["%s=%s" % item for item in newquery.iteritems()])
-                    return "?".join([url.path, origin])
-            except:
-                pass
-
-    def get_origin(self):
-        return self.origin
-
     def __repr__(self):
         return "%s(trunk=%s,app=%s)" % \
             (self.__class__.__name__, self.trunk, self.app)

Modified: mgmt/trunk/wooly/python/wooly/forms.py
===================================================================
--- mgmt/trunk/wooly/python/wooly/forms.py	2009-10-03 21:11:21 UTC (rev 3665)
+++ mgmt/trunk/wooly/python/wooly/forms.py	2009-10-05 15:58:23 UTC (rev 3666)
@@ -14,37 +14,11 @@
 
         self.form_params = set()
 
-        self.origin = Parameter(app, "origin")
-        self.add_parameter(self.origin)
-
-    # XXX need a better name
-    def has_errors(self, session):
-        return len(self.errors.get(session))
-
     def check(self, session):
         pass
 
-    def get_origin(self, session):
-        origin = self.origin.get(session)
-
-        # this will happen if we load the page
-        # directly from a saved url and not through
-        # a link on another page
-        if not origin:
-            try:
-                branch = session.branch()
-                self.frame.view.show(branch) # XXX big dep problem
-                origin = branch.marshal()
-            except: # we don't have a show_view # XXX ah, weird
-                pass
-
-        return origin
-
     def render_hidden_inputs(self, session, *args):
         writer = Writer()
-        # remember our roots
-        if not self.origin.get(session):
-            self.origin.set(session, session.get_origin())
 
         params = set(session.page.get_page_parameters(session))
         params.difference_update(self.form_params)
@@ -76,9 +50,8 @@
                      % (name, value))
 
 class FormError(object):
-    def __init__(self, message=None, widget=None):
+    def __init__(self, message):
         self.message = message
-        self.widget = widget
 
     def get_message(self, session):
         return self.message
@@ -139,12 +112,6 @@
     def get_default(self, session):
         return self.param.get_default(session)
 
-    def set_tab_index(self, tab_index):
-        self.tab_index = tab_index
-
-    def set_disabled(self, disabled):
-        self.disabled = disabled
-
     def render_name(self, session, *args):
         return self.param.path
 
@@ -158,8 +125,14 @@
         return self.disabled and "disabled=\"disabled\"" or None
 
 class MissingValueError(FormError):
+    def __init__(self, widget):
+        super(MissingValueError, self).__init__(None)
+
+        self.widget = widget
+
     def get_message(self, session):
-        return "This value is required"
+        title = self.widget.render_title(session)
+        return "The '%s' field must have a value" % title
 
 class EmptyInputError(FormError):
     def __init__(self):
@@ -280,14 +253,14 @@
     def render_item_checked_attr(self, session, *args):
         return None
 
-class RadioInputSet(FormInput, ItemSet):
+class RadioInputSet(ScalarInput, ItemSet):
     def render_item_value(self, session, *args):
         return None
 
     def render_item_checked_attr(self, session, *args):
         return None
 
-class OptionInputSet(FormInput, ItemSet):
+class OptionInputSet(ScalarInput, ItemSet):
     def render_item_value(self, session, item):
         return None
 
@@ -299,8 +272,11 @@
         super(FormField, self).__init__(app, name)
 
         self.css_class = "field"
+
         self.form = None
 
+        self.required = False
+
     def init(self):
         super(FormField, self).init()
 
@@ -313,16 +289,6 @@
     def check(self, session):
         pass
 
-    def validate(self, session):
-        errors = self.form.errors.get(session)
-
-        self.do_validate(session, errors)
-
-        return errors
-
-    def do_validate(self, session, errors):
-        pass
-
     def render_help(self, session, *args):
         pass
 
@@ -345,15 +311,6 @@
         for field in self.fields:
             field.check(session)
 
-    # XXX get rid of this
-    def validate(self, session):
-        errors = list()
-
-        for field in self.fields:
-            errors.extend(field.validate(session))
-
-        return errors
-
     def render_message(self, session, *args):
         pass
 
@@ -365,6 +322,10 @@
 
         return writer.to_string()
 
+class ShowableFieldSet(FormFieldSet):
+    def __init__(self, app, name):
+        super(ShowableFieldSet, self).__init__(app, name)
+
 class ScalarField(FormField):
     def __init__(self, app, name, input):
         super(ScalarField, self).__init__(app, name)
@@ -383,6 +344,13 @@
     def set(self, session, value):
         return self.input.set(session, value)
 
+    def check(self, session):
+        value = self.get(session)
+
+        if value in ("", None) and self.required:
+            error = MissingValueError(self)
+            self.form.errors.add(session, error)
+
     def render_inputs(self, session, *args):
         return self.input.render(session)
 
@@ -414,17 +382,17 @@
         self.input = IntegerInput(app, "input")
         self.add_child(self.input)
 
-    def do_validate(self, session, errors):
-        val = self.get(session)
-        try:
-            val = int(val)
-        except:
-            if val:
-                error = FormError("A Numeric Value is Expected")
-                errors.append(error)
-            else:
-                self.set(session, self.input.param.get_default(session))
+    def check(self, session):
+        value = self.get(session)
 
+        if value:
+            try:
+                value = int(value)
+            except:
+                title = self.render_title(session)
+                message = "The '%s' field must be a number" % title
+                self.form.errors.append(FormError(message))
+
 # XXX make this use a RadioInputSet instead?
 class RadioField(FormField):
     def __init__(self, app, name, param):
@@ -530,11 +498,11 @@
         self.add_parameter(self.return_url)
 
         self.cancel_button = self.Cancel(app, "cancel")
-        self.cancel_button.set_tab_index(201)
+        self.cancel_button.tab_index = 201
         self.add_button(self.cancel_button)
 
         self.submit_button = self.Submit(app, "submit")
-        self.submit_button.set_tab_index(200)
+        self.submit_button.tab_index = 200
         self.add_button(self.submit_button)
 
     def submit(self, session):
@@ -558,7 +526,7 @@
     # XXX get rid of this?
     def process_return(self, session):
         url = self.return_url.get(session)
-        self.page.set_redirect_url(session, url)
+        self.page.redirect.set(session, url)
 
     def process_cancel(self, session):
         self.process_return(session)

Modified: mgmt/trunk/wooly/python/wooly/forms.strings
===================================================================
--- mgmt/trunk/wooly/python/wooly/forms.strings	2009-10-03 21:11:21 UTC (rev 3665)
+++ mgmt/trunk/wooly/python/wooly/forms.strings	2009-10-05 15:58:23 UTC (rev 3666)
@@ -155,6 +155,41 @@
   <tbody>{fields}</tbody>
 </table>
 
+[ShowableFieldSet.css]
+div.ShowableFieldSet > a {
+    margin: 2em 0;
+}
+
+div.ShowableFieldSet > table {
+    display: none;
+}
+
+[ShowableFieldSet.javascript]
+(function() {
+    wooly.toggleFieldDisplay = function(id) {
+        elem = $(id);
+        a = elem.getFirst("a");
+        table = elem.getFirst("table");
+
+        if (table.getStyle("display") === "table") {
+             table.setStyle("display", "none");
+             a.set("text", "Show extra fields");
+        } else {
+             table.setStyle("display", "table");
+             a.set("text", "Hide extra fields");
+        }
+    }
+}())
+
+[ShowableFieldSet.html]
+<div id="{id}" class="ShowableFieldSet">
+  <a onclick="wooly.toggleFieldDisplay('{id}');">Show extra fields</a>
+
+  <table class="FormFieldSet">
+    <tbody>{fields}</tbody>
+  </table>
+</div>
+
 [RadioFieldOption.html]
 <div>
   <input type="radio" name="{name}" id="{id}" value="{value}"

Modified: mgmt/trunk/wooly/python/wooly/server.py
===================================================================
--- mgmt/trunk/wooly/python/wooly/server.py	2009-10-03 21:11:21 UTC (rev 3665)
+++ mgmt/trunk/wooly/python/wooly/server.py	2009-10-05 15:58:23 UTC (rev 3666)
@@ -124,9 +124,6 @@
         except KeyError:
             pass
 
-        # XXX set this on page instead
-        session.set_origin(env.get("HTTP_REFERER"))
-
         for key, value in env.iteritems():
             if key.startswith("HTTP_"):
                 name = key[5:].lower()



More information about the rhmessaging-commits mailing list