From d58953d10d4a24e73b7ce548d61ac72328dafb67 Mon Sep 17 00:00:00 2001 From: Cassowary Date: Thu, 15 Feb 2024 15:40:51 -0800 Subject: [PATCH] Update to handle multiple files at a time, and also coerce integers into integers --- export_mailman2_settings.py | 90 ++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 31 deletions(-) diff --git a/export_mailman2_settings.py b/export_mailman2_settings.py index c3914ec..c790fa6 100644 --- a/export_mailman2_settings.py +++ b/export_mailman2_settings.py @@ -1,47 +1,75 @@ import argparse import json import sys + from bs4 import BeautifulSoup from mailman.utilities.importer import NAME_MAPPINGS -parser = argparse.ArgumentParser( - prog=sys.argv[0], description="Munge Mailman config data" -) +KEYFILTER = ('submit') -parser.add_argument("file", type=argparse.FileType('r', encoding='utf-8')) - -args = parser.parse_args() - -data_clean = {} - -soup = BeautifulSoup(args.file.read(), 'html.parser') - -for field in soup.find_all('textarea'): - name = NAME_MAPPINGS.get(field['name'], field['name']) - - if 'msg' in name: - continue - - data_clean[name] = [l for l in field.get_text().split('\n') if l != ""] +def msg(*args, **kwargs): + print(*args, file=sys.stderr, **kwargs) -for field in soup.find_all('input'): - if field['type'] == 'hidden': - continue +def get_form_data(htmlfile): + data_clean = {} - if field['type'] == 'RADIO': - if 'checked' not in field.attrs: + soup = BeautifulSoup(htmlfile.read(), 'html.parser') + + for field in soup.find_all('textarea'): + name = NAME_MAPPINGS.get(field['name'], field['name']) + + if 'msg' in name: continue - name = NAME_MAPPINGS.get(field['name'], field['name']) + data_clean[name] = [l for l in field.get_text().split('\n') if l != ""] - if 'msg' in name: - continue - try: - data_clean[name] = field['value'] - except KeyError: - data_clean[name] = "" + for field in soup.find_all('input'): + if field['type'].lower() in ('hidden', 'submit'): + continue -print(json.dumps(data_clean)) + if field['type'].lower() == 'radio': + if 'checked' not in field.attrs: + continue + + name = NAME_MAPPINGS.get(field['name'], field['name']) + + if 'msg' in name: + continue + + try: + value = field['value'] + try: + value = int(value) + except ValueError: + ... + except KeyError: + value = '' + + data_clean[name] = value + + return data_clean + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + prog=sys.argv[0], description="Munge Mailman config data" + ) + parser.add_argument("config", help="A list of files (named specifically) to import as configurations", + nargs='+', + action="append") + args = parser.parse_args() + + globalconfig = {} + for page in args.config[0]: + msg(page) + with open(page) as inf: + result = get_form_data(inf) + for key, value in result.items(): + if key in globalconfig: + msg(f"warning - duplicate key {key}") + else: + globalconfig[key] = value + print(json.dumps(globalconfig))