]> git.ipfire.org Git - people/ms/westferry.git/commitdiff
Implement some default form handler
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 5 Dec 2021 14:58:49 +0000 (14:58 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 5 Dec 2021 14:58:49 +0000 (14:58 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/templates/modules/forms/index.html
src/westferry/handlers/base.py
src/westferry/handlers/demo.py
src/westferry/ui/forms.py
src/westferry/ui/tabs.py

index 34e7c3df26df45fb08769ffc2ec7bf7f18991810..0b0cbcbc1223efbd5f917ac712de407d2af273b7 100644 (file)
@@ -1,6 +1,13 @@
 <form method="{{ form.method }}" action="{{ form.action }}">
        {% raw xsrf_form_html() %}
 
+       {#
+               Add the form ID so that we can find which form has been submitted
+       #}
+       {% if form.id %}
+               <input type="hidden" name="form" value="{{ form.id }}">
+       {% end %}
+
        {% module FormElements(form.elements) %}
 
        <button type="submit" class="primary button">{{ form.submit_text or _("Submit") }}</button>
index 222767148f86098cf3a0713c8b290a9e077e54d4..774d9f23aedb6c1bf27a5c122aa7211fd0d534fc 100644 (file)
@@ -95,3 +95,18 @@ class BaseHandler(tornado.web.RequestHandler, metaclass=HandlerRegistration):
        def get(self):
                # Render the default view
                self.render("default.html")
+
+       def post(self):
+               """
+                       This is the default handler which will find the correct form
+                       and execute it.
+               """
+               form_id = self.get_argument("form")
+
+               # Find the form
+               form = self.tabs.get_form(form_id)
+               if not form:
+                       raise tornado.web.HTTPError(400, "Could not find form with ID '%s'" % form_id)
+
+               # Execute the form action
+               form.execute()
index b99031109c016b5b246357613958caf92f24b614..820ab51b139e77b0cb6935c9d927d17c2fea60d5 100644 (file)
@@ -60,7 +60,7 @@ class DemoFormsHandler(DemoBaseHandler):
                tab = self.tabs.add_tab("example-1", _("Example 1"))
 
                # Add a form to the tab
-               form = tab.add_form()
+               form = tab.add_form("example-1")
                form.submit_text = _("Order")
 
                # First name
index 6f2f787ac59fda199e348e58277837779725ad53..abd85456ff9cddf40effc4429a3384bcc01b35cb 100644 (file)
 #                                                                             #
 ###############################################################################
 
+import logging
+
 from . import base
 
+log = logging.getLogger(__name__)
+
 class Form(object):
-       def __init__(self, handler, method="POST", action="",
+       def __init__(self, handler, id, method="POST", action="",
                        form=None, label=None, help=None, disabled=False):
                self.handler = handler
+               self.id = id
                self.method = method
                self.action = action
                self.form = form
@@ -63,10 +68,25 @@ class Form(object):
 
                return ret
 
+       def execute(self):
+               """
+                       Executes the form action
+               """
+               log.debug("Executing form %s" % self)
+
+               # Export all form data
+               data = self.export()
+
+               # Log everything
+               for key in data:
+                       log.debug("  %-24s : %s" % (key, data[key]))
+
+               # TODO handle callback
+
        # Sub-Forms
 
        def _add_subform(self, cls, *args, **kwargs):
-               form = cls(self.handler, *args, form=self, **kwargs)
+               form = cls(self.handler, self.id, *args, form=self, **kwargs)
                self.elements.append(form)
 
                return form
index 5db68003012dbd1e65afd891c7631f6e77f0b267..d4b94568bbea89839198594864cc11ef5ab6ecd7 100644 (file)
@@ -60,6 +60,16 @@ class Tabs(object):
                # Return the new tab
                return tab
 
+       def get_form(self, id):
+               """
+                       Returns the form with a matching ID
+               """
+               for tab in self:
+                       for item in tab.items:
+                               if isinstance(item, forms.Form):
+                                       if item.id == id:
+                                               return item
+
 
 class Tab(object):
        def __init__(self, handler, id, title):