From edf0b75a16951734bb04e3ab5de1b16eef016339 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sun, 5 Dec 2021 14:58:49 +0000 Subject: [PATCH] Implement some default form handler Signed-off-by: Michael Tremer --- src/templates/modules/forms/index.html | 7 +++++++ src/westferry/handlers/base.py | 15 +++++++++++++++ src/westferry/handlers/demo.py | 2 +- src/westferry/ui/forms.py | 24 ++++++++++++++++++++++-- src/westferry/ui/tabs.py | 10 ++++++++++ 5 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/templates/modules/forms/index.html b/src/templates/modules/forms/index.html index 34e7c3d..0b0cbcb 100644 --- a/src/templates/modules/forms/index.html +++ b/src/templates/modules/forms/index.html @@ -1,6 +1,13 @@
{% raw xsrf_form_html() %} + {# + Add the form ID so that we can find which form has been submitted + #} + {% if form.id %} + + {% end %} + {% module FormElements(form.elements) %} diff --git a/src/westferry/handlers/base.py b/src/westferry/handlers/base.py index 2227671..774d9f2 100644 --- a/src/westferry/handlers/base.py +++ b/src/westferry/handlers/base.py @@ -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() diff --git a/src/westferry/handlers/demo.py b/src/westferry/handlers/demo.py index b990311..820ab51 100644 --- a/src/westferry/handlers/demo.py +++ b/src/westferry/handlers/demo.py @@ -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 diff --git a/src/westferry/ui/forms.py b/src/westferry/ui/forms.py index 6f2f787..abd8545 100644 --- a/src/westferry/ui/forms.py +++ b/src/westferry/ui/forms.py @@ -19,12 +19,17 @@ # # ############################################################################### +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 diff --git a/src/westferry/ui/tabs.py b/src/westferry/ui/tabs.py index 5db6800..d4b9456 100644 --- a/src/westferry/ui/tabs.py +++ b/src/westferry/ui/tabs.py @@ -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): -- 2.47.3