diff --git a/htdocs/css/admin.css b/htdocs/css/admin.css index 4c153de..d948451 100644 --- a/htdocs/css/admin.css +++ b/htdocs/css/admin.css @@ -10,3 +10,7 @@ body { background-color: #2e2e2e; color: #DDD; } + +.buttons { + text-align: right; +} diff --git a/owrx/controllers/settings.py b/owrx/controllers/settings.py index 77268d3..dcbe5ec 100644 --- a/owrx/controllers/settings.py +++ b/owrx/controllers/settings.py @@ -1,6 +1,10 @@ from abc import ABC, abstractmethod from .admin import AdminController from owrx.config import Config +from urllib.parse import parse_qs +import logging + +logger = logging.getLogger(__name__) class Input(ABC): @@ -31,6 +35,9 @@ class Input(ABC): def render(self, config): return self.bootstrap_decorate(self.render_input(config[self.id])) + def validate(self, data): + return {self.id: data[self.id][0]} if self.id in data else {} + class TextInput(Input): def render_input(self, value): @@ -69,9 +76,24 @@ class SettingsController(AdminController): def render_form(self): config = Config.get() inputs = "".join([i.render(config) for i in SettingsController.inputs]) - return "
{inputs}
".format(inputs=inputs) + return """ +
+ {inputs} +
+ +
+
+ """.format(inputs=inputs) def template_variables(self): variables = super().template_variables() variables["form"] = self.render_form() return variables + + def processFormData(self): + data = parse_qs(self.get_body().decode("utf-8")) + data = {k: v for i in SettingsController.inputs for k, v in i.validate(data).items()} + config = Config.get() + for k, v in data.items(): + config[k] = v + self.send_redirect("/admin") diff --git a/owrx/http.py b/owrx/http.py index 2863243..7e8d104 100644 --- a/owrx/http.py +++ b/owrx/http.py @@ -101,6 +101,7 @@ class Router(object): StaticRoute("/api/features", ApiController), StaticRoute("/metrics", MetricsController), StaticRoute("/admin", SettingsController), + StaticRoute("/admin", SettingsController, method="POST", options={"action": "processFormData"}), StaticRoute("/login", SessionController, options={"action": "loginAction"}), StaticRoute("/login", SessionController, method="POST", options={"action": "processLoginAction"}), StaticRoute("/logout", SessionController, options={"action": "logoutAction"}),