From f2d0ea9910a06caaa3d9070b2e879840d84ed8ab Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Mon, 29 Dec 2025 20:24:12 +0100 Subject: [PATCH] Added field and variable parsing to partials --- nomadnet/ui/textui/Browser.py | 59 +++++++++++++++++++++++++++++- nomadnet/ui/textui/MicronParser.py | 12 +++--- 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/nomadnet/ui/textui/Browser.py b/nomadnet/ui/textui/Browser.py index eda957b..545a826 100644 --- a/nomadnet/ui/textui/Browser.py +++ b/nomadnet/ui/textui/Browser.py @@ -578,12 +578,69 @@ class Browser: if partial["link"] and partial["link"].status == RNS.Link.ACTIVE and partial["request_id"] == None: RNS.log(f"Sending request for partial: {partial_destination_hash} / {path}", RNS.LOG_EXTREME) - receipt = partial["link"].request(path, data = None, response_callback = self.partial_received, + receipt = partial["link"].request(path, data=self.__get_partial_request_data(partial), response_callback = self.partial_received, failed_callback = self.partial_failed, progress_callback = self.partial_progressed) if receipt: partial["request_id"] = receipt.request_id else: RNS.log(f"Partial request failed", RNS.LOG_ERROR) + def __get_partial_request_data(self, partial): + request_data = None + if partial["fields"] != None: + link_data = partial["fields"] + link_fields = [] + request_data = {} + all_fields = True if "*" in link_data else False + + for e in link_data: + if "=" in e: + c = e.split("=") + if len(c) == 2: + request_data["var_"+str(c[0])] = str(c[1]) + else: + link_fields.append(e) + + def recurse_down(w): + if isinstance(w, list): + for t in w: + recurse_down(t) + elif isinstance(w, tuple): + for t in w: + recurse_down(t) + elif hasattr(w, "contents"): + recurse_down(w.contents) + elif hasattr(w, "original_widget"): + recurse_down(w.original_widget) + elif hasattr(w, "_original_widget"): + recurse_down(w._original_widget) + else: + if hasattr(w, "field_name") and (all_fields or w.field_name in link_fields): + field_key = "field_" + w.field_name + if isinstance(w, urwid.Edit): + request_data[field_key] = w.edit_text + elif isinstance(w, urwid.RadioButton): + if w.state: + user_data = getattr(w, "field_value", None) + if user_data is not None: + request_data[field_key] = user_data + elif isinstance(w, urwid.CheckBox): + user_data = getattr(w, "field_value", "1") + if w.state: + existing_value = request_data.get(field_key, '') + if existing_value: + # Concatenate the new value with the existing one + request_data[field_key] = existing_value + ',' + user_data + else: + # Initialize the field with the current value + request_data[field_key] = user_data + else: + pass # do nothing if checkbox is not check + + recurse_down(self.attr_maps) + RNS.log("Including request data: "+str(request_data), RNS.LOG_DEBUG) + + return request_data + def start_partial_updater(self): if not self.updater_running: self.update_partials() diff --git a/nomadnet/ui/textui/MicronParser.py b/nomadnet/ui/textui/MicronParser.py index 6f42a44..7ca715e 100644 --- a/nomadnet/ui/textui/MicronParser.py +++ b/nomadnet/ui/textui/MicronParser.py @@ -102,11 +102,10 @@ def parse_partial(line): partial_url = partial_components[0] partial_refresh = float(partial_components[1]) partial_fields = "" - # TODO: Implement fields and parameters for partials - # elif len(partial_components) == 3: - # partial_url = partial_components[0] - # partial_refresh = float(partial_components[1]) - # partial_fields = partial_components[2] + elif len(partial_components) == 3: + partial_url = partial_components[0] + partial_refresh = float(partial_components[1]) + partial_fields = partial_components[2] else: partial_url = "" partial_fields = "" @@ -114,6 +113,9 @@ def parse_partial(line): if partial_refresh and partial_refresh < 1: partial_refresh = None + pf = partial_fields.split("|") + if len(pf) > 0: partial_fields = pf + if len(partial_url): pile = urwid.Pile([urwid.Text(f"⧖")]) partial_descriptor = "|".join(partial_components)