From 3c703270a7cced9c9667c77cb865fdaa4c7752d8 Mon Sep 17 00:00:00 2001 From: Fenris Wolf Date: Mon, 6 Oct 2025 18:07:29 +0200 Subject: [PATCH] [add] invitation functions --- source/backend.py | 59 ++++++++++++--------- source/main.py | 131 +++++++++++++++++++++++++++++++++++----------- 2 files changed, 136 insertions(+), 54 deletions(-) diff --git a/source/backend.py b/source/backend.py index ce554d0..0112779 100644 --- a/source/backend.py +++ b/source/backend.py @@ -29,6 +29,7 @@ def backend_api_call_generic( "with_session_key": (not (session_key is None)), "http_method": http_method, "path": action_path, + "data": data, } ) target = string_coin( @@ -127,9 +128,19 @@ def backend_api_call_wrapped( ) +def backend_api_call_group_list( +): + return backend_api_call_wrapped( + False, + "GET", + "/group/list", + None + ) + + def backend_api_call_session_end( ): - return backend_api_call_generic( + return backend_api_call_wrapped( True, "DELETE", "/session/end", @@ -178,35 +189,35 @@ def backend_api_call_invitation_create( email_address_value, groups_changeable, groups_value, - expiry + expiry, + options = None ): - print({ - "name_changeable": name_changeable, - "name_value": name_value, - "label_changeable": label_changeable, - "label_value": label_value, - "email_address_changeable": email_address_changeable, - "email_address_value": email_address_value, - "groups_changeable": groups_changeable, - "groups_value": groups_value, - "expiry": expiry, - }) - return None - return backend_api_call_wrapped( + options = ( + { + "send_immediatly": True, + } + | + (options or {}) + ) + result = backend_api_call_wrapped( True, "POST", "/invitation/create", { - "name_changeable": name_changeable, - "name_value": name_value, - "label_changeable": label_changeable, - "label_value": label_value, - "email_address_changeable": email_address_changeable, - "email_address_value": email_address_value, - "groups_changeable": groups_changeable, - "groups_value": groups_value, - "expiry": expiry, + "data": { + "name_changeable": name_changeable, + "name_value": name_value, + "label_changeable": label_changeable, + "label_value": label_value, + "email_address_changeable": email_address_changeable, + "email_address_value": email_address_value, + "groups_changeable": groups_changeable, + "groups_value": groups_value, + "expiry": expiry, + }, + "send_immediatly": options["send_immediatly"], } ) + return result diff --git a/source/main.py b/source/main.py index daf5dba..11f9601 100644 --- a/source/main.py +++ b/source/main.py @@ -27,10 +27,11 @@ def main(): "member-list", "member-read", "member-delete", - "invite", + "invite-single", + "invite-mass", ], metavar = "", - help = "auszuführende Aktion; Optionen: 'conf-schema' : JSON-Schema der Konfiguration ausgeben | 'conf-expose' : vervollständigte Konfiguration ausgegeben | 'member-list' : Liste der Mitglieder ausgeben | 'member-read' : Daten eines Mitglieds ausgeben | 'member-delete' : einer Mitglieder-Datensatz löschen | 'invite' : Einladung erstellen", + help = "auszuführende Aktion; Optionen: 'conf-schema' : JSON-Schema der Konfiguration ausgeben | 'conf-expose' : vervollständigte Konfiguration ausgegeben | 'member-list' : Liste der Mitglieder ausgeben | 'member-read' : Daten eines Mitglieds ausgeben | 'member-delete' : einer Mitglieder-Datensatz löschen | 'invite-single' : einzelne Einladung erstellen | 'invite-mass' : Massen-Einladungen erstellen", ) argument_parser.add_argument( "-c", @@ -41,6 +42,15 @@ def main(): metavar = "", help = "Pfad zur Konfigurations-Datei", ) + argument_parser.add_argument( + "-d", + "--data-path", + type = str, + dest = "data_path", + default = None, + metavar = "", + help = "Pfad zu Daten für Massen-Einladung", + ) argument_parser.add_argument( "-i", "--id", @@ -50,12 +60,6 @@ def main(): metavar = "", help = "ID des Mitglieds", ) - argument_parser.add_argument( - "-N", - "--fixed-name", - dest = "fixed_name", - action = 'store_true', - ) argument_parser.add_argument( "-n", "--name", @@ -66,10 +70,11 @@ def main(): help = "Anmelde-Name des Mitglieds; Leerzeichen sind durch '_' zu ersetzen", ) argument_parser.add_argument( - "-L", - "--fixed-label", - dest = "fixed_label", + "-N", + "--fixed-name", + dest = "fixed_name", action = 'store_true', + help = "ob der Anmelde-Name einer Einladung geändert werden kann", ) argument_parser.add_argument( "-l", @@ -81,10 +86,11 @@ def main(): help = "Anzeige-Name des Mitglieds", ) argument_parser.add_argument( - "-E", - "--fixed-email-address", - dest = "fixed_email_address", + "-L", + "--fixed-label", + dest = "fixed_label", action = 'store_true', + help = "ob der Anzeige-Name einer Einladung geändert werden kann", ) argument_parser.add_argument( "-e", @@ -96,10 +102,11 @@ def main(): help = "E-Mail-Adresse des Mitglieds", ) argument_parser.add_argument( - "-G", - "--fixed-groups", - dest = "fixed_groups", + "-E", + "--fixed-email-address", + dest = "fixed_email_address", action = 'store_true', + help = "ob der E-Mail-Adresse einer Einladung geändert werden kann", ) argument_parser.add_argument( "-g", @@ -110,6 +117,13 @@ def main(): metavar = "", help = "Gruppen, zu welchen das Mitglied hinzugefügt werden soll, als Komma-getrennte Liste", ) + argument_parser.add_argument( + "-G", + "--fixed-groups", + dest = "fixed_groups", + action = 'store_true', + help = "ob die Gruppen einer Einladung geändert werden kann", + ) argument_parser.add_argument( "-x", "--expiry", @@ -119,6 +133,13 @@ def main(): metavar = "", help = "UNIX-Timestamp des Ablaufdatums der Einladung", ) + argument_parser.add_argument( + "-s", + "--send", + dest = "send", + action = 'store_true', + help = "ob eine Einladung nach Einarbeitung ins Backend an die angegebene E-Mail-Adresse gesendet werden soll", + ) args = argument_parser.parse_args() ## conf @@ -139,19 +160,42 @@ def main(): ) ## exec + groups = convey( + backend_api_call_group_list(), + [ + lambda x: map( + lambda entry: (entry["preview"]["name"], entry["id"], ), + x + ), + dict, + ] + ) data = { "id": args.id, "name_changeable": (not args.fixed_name), - "name_value": args.name.replace("_", " "), + "name_value": args.name, "label_changeable": (not args.fixed_label), - "label_value": args.label, + "label_value": ( + None + if (args.label is None) else + args.label.replace("_", " ") + ), "email_address_changeable": (not args.fixed_email_address), "email_address_value": args.email_address, "groups_changeable": (not args.fixed_groups), - "groups_value": ([] if (args.groups is None) else args.groups.split(",")), + "groups_value": ( + [] + if (args.groups is None) else + convey( + args.groups.split(","), + [ + lambda x: map(lambda group_name: groups[group_name], x), + list, + ] + ) + ), "expiry": args.expiry, } - _sys.stderr.write(_json.dumps(data) + "\n") if (args.action == "conf-schema"): _sys.stdout.write(_json.dumps(conf_schema(), indent = "\t") + "\n") elif (args.action == "conf-expose"): @@ -193,15 +237,11 @@ def main(): member_id = backend_api_call_member_delete( data["id"] ) - elif (args.action == "invite"): + elif (args.action == "invite-single"): if ( (data["name_value"] is None) or (data["label_value"] is None) - or - (data["email_address_value"] is None) - or - (data["groups_value"] is None) ): log_error( "mandatory_parameters_missing", @@ -209,13 +249,11 @@ def main(): "parameters": [ "name", "label", - "email_address", - "groups", ] } ) else: - link = backend_api_call_invitation_create( + result = backend_api_call_invitation_create( data["name_changeable"], data["name_value"], data["label_changeable"], @@ -224,8 +262,40 @@ def main(): data["email_address_value"], data["groups_changeable"], data["groups_value"], - data["expiry"] + data["expiry"], + { + "send_immediatly": args.send, + } ) + key = result["key"] + url = result["url"] + _sys.stdout.write(url + "\n") + elif (args.action == "invite-mass"): + invitation_data = _json.loads(file_text_read(args.data_path)) + for entry in invitation_data: + result = backend_api_call_invitation_create( + entry.get("name_changeable", True), + entry["name_value"], + entry.get("label_changeable", True), + entry["label_value"], + entry.get("email_address_changeable", True), + entry["email_address_value"], + entry.get("groups_changeable", True), + convey( + entry.get("groups_value", []), + [ + lambda x: map(lambda group_name: groups[group_name], x), + list, + ] + ), + # todo: assign default? + entry.get("expiry", None), + { + "send_immediatly": args.send, + } + ) + # _sys.stdout.write(result["url"] + "\n") + # todo: delay else: raise NotImplementedError() @@ -235,3 +305,4 @@ try: except ValueError as error: _sys.stderr.write(str(error) + "\n") _sys.exit(1) +