From 6493fb86c10731bd64c9d12f43d1780d272d1cf9 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Fri, 27 Mar 2020 01:14:38 +0100 Subject: [PATCH] add sdr.hu settings --- htdocs/admin.html | 7 +-- owrx/connection.py | 1 + owrx/controllers/settings.py | 91 ++++++++++++++++++++++++++++-------- 3 files changed, 74 insertions(+), 25 deletions(-) diff --git a/htdocs/admin.html b/htdocs/admin.html index acddb4b..b7310f6 100644 --- a/htdocs/admin.html +++ b/htdocs/admin.html @@ -13,11 +13,6 @@ ${header}

Settings

-
-

- General Settings -

- ${form} -
+ ${sections} \ No newline at end of file diff --git a/owrx/connection.py b/owrx/connection.py index b0d6dc9..75b89f4 100644 --- a/owrx/connection.py +++ b/owrx/connection.py @@ -112,6 +112,7 @@ class OpenWebRxReceiverClient(Client): receiver_info["locator"] = Locator.fromCoordinates(receiver_info["receiver_gps"]) self.write_receiver_details(receiver_info) + # TODO unsubscribe receiver_details.wire(send_receiver_info) send_receiver_info() diff --git a/owrx/controllers/settings.py b/owrx/controllers/settings.py index dcbe5ec..7b26601 100644 --- a/owrx/controllers/settings.py +++ b/owrx/controllers/settings.py @@ -35,7 +35,7 @@ class Input(ABC): def render(self, config): return self.bootstrap_decorate(self.render_input(config[self.id])) - def validate(self, data): + def parse(self, data): return {self.id: data[self.id][0]} if self.id in data else {} @@ -59,40 +59,93 @@ class TextAreaInput(Input): """.format(id=self.id, classes=self.input_classes(), value=value) +class CheckboxInput(Input): + def __init__(self, id, label, checkboxText, infotext=None): + super().__init__(id, label, infotext=infotext) + self.checkboxText = checkboxText + + def render_input(self, value): + return """ +
+ + +
+ """.format(id=self.id, classes=self.input_classes(), checked="checked" if value else "", checkboxText=self.checkboxText) + + def input_classes(self): + return " ".join(["form-check", "form-control-sm"]) + + def parse(self, data): + return {self.id: self.id in data and data[self.id][0] == "on"} + + +class Section(object): + def __init__(self, title, *inputs): + self.title = title + self.inputs = inputs + + def render_inputs(self): + config = Config.get() + return "".join([i.render(config) for i in self.inputs]) + + def render(self): + return """ +
+

+ {title} +

+ {inputs} +
+ """.format(title=self.title, inputs=self.render_inputs()) + + def parse(self, data): + return {k: v for i in self.inputs for k, v in i.parse(data).items()} + + class SettingsController(AdminController): - inputs = [ - TextInput("receiver_name", "Receiver name"), - TextInput("receiver_location", "Receiver location"), - TextInput("receiver_asl", "Receiver elevation", infotext="Elevation in meters above mean see level"), - TextInput("receiver_admin", "Receiver admin"), - LocationInput("receiver_gps", "Receiver coordinates"), - TextInput("photo_title", "Photo title"), - TextAreaInput("photo_desc", "Photo description") + sections = [ + Section( + "General Settings", + TextInput("receiver_name", "Receiver name"), + TextInput("receiver_location", "Receiver location"), + TextInput("receiver_asl", "Receiver elevation", infotext="Elevation in meters above mean see level"), + TextInput("receiver_admin", "Receiver admin"), + LocationInput("receiver_gps", "Receiver coordinates"), + TextInput("photo_title", "Photo title"), + TextAreaInput("photo_desc", "Photo description"), + ), + Section( + "sdr.hu", + TextInput("sdrhu_key", "sdr.hu key", infotext="Please obtain your personal key on sdr.hu"), + CheckboxInput("sdrhu_public_listing", "List on sdr.hu", "List msy receiver on sdr.hu"), + TextInput("server_hostname", "Hostname"), + ), ] - def indexAction(self): - self.serve_template("admin.html", **self.template_variables()) - - def render_form(self): - config = Config.get() - inputs = "".join([i.render(config) for i in SettingsController.inputs]) + def render_sections(self): + sections = "".join(section.render() for section in SettingsController.sections) return """
- {inputs} + {sections}
- """.format(inputs=inputs) + """.format(sections=sections) + + def indexAction(self): + self.serve_template("admin.html", **self.template_variables()) def template_variables(self): variables = super().template_variables() - variables["form"] = self.render_form() + variables["sections"] = self.render_sections() 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()} + data = {k: v for i in SettingsController.sections for k, v in i.parse(data).items()} config = Config.get() for k, v in data.items(): config[k] = v