309 lines
7.1 KiB
Python
309 lines
7.1 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import typing as _typing
|
|
import sys as _sys
|
|
import os as _os
|
|
import json as _json
|
|
import argparse as _argparse
|
|
|
|
from log import *
|
|
from conf import *
|
|
from backend import *
|
|
|
|
|
|
def main():
|
|
## args
|
|
argument_parser = _argparse.ArgumentParser(
|
|
prog = "mondvogel",
|
|
description = "CLI-Client-Programm für Espe",
|
|
formatter_class = _argparse.ArgumentDefaultsHelpFormatter
|
|
)
|
|
argument_parser.add_argument(
|
|
type = str,
|
|
dest = "action",
|
|
choices = [
|
|
"conf-schema",
|
|
"conf-expose",
|
|
"member-list",
|
|
"member-read",
|
|
"member-delete",
|
|
"invite-single",
|
|
"invite-mass",
|
|
],
|
|
metavar = "<action>",
|
|
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",
|
|
"--conf-path",
|
|
type = str,
|
|
dest = "conf_path",
|
|
default = _os.path.join(_os.path.expanduser("~"), ".mondvogel", "conf.json"),
|
|
metavar = "<conf-path>",
|
|
help = "Pfad zur Konfigurations-Datei",
|
|
)
|
|
argument_parser.add_argument(
|
|
"-d",
|
|
"--data-path",
|
|
type = str,
|
|
dest = "data_path",
|
|
default = None,
|
|
metavar = "<data-path>",
|
|
help = "Pfad zu Daten für Massen-Einladung",
|
|
)
|
|
argument_parser.add_argument(
|
|
"-i",
|
|
"--id",
|
|
type = int,
|
|
dest = "id",
|
|
default = None,
|
|
metavar = "<id>",
|
|
help = "ID des Mitglieds",
|
|
)
|
|
argument_parser.add_argument(
|
|
"-n",
|
|
"--name",
|
|
type = str,
|
|
dest = "name",
|
|
default = None,
|
|
metavar = "<name>",
|
|
help = "Anmelde-Name des Mitglieds; Leerzeichen sind durch '_' zu ersetzen",
|
|
)
|
|
argument_parser.add_argument(
|
|
"-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",
|
|
"--label",
|
|
type = str,
|
|
dest = "label",
|
|
default = None,
|
|
metavar = "<label>",
|
|
help = "Anzeige-Name des Mitglieds",
|
|
)
|
|
argument_parser.add_argument(
|
|
"-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",
|
|
"--email-address",
|
|
type = str,
|
|
dest = "email_address",
|
|
default = None,
|
|
metavar = "<email-address>",
|
|
help = "E-Mail-Adresse des Mitglieds",
|
|
)
|
|
argument_parser.add_argument(
|
|
"-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",
|
|
"--groups",
|
|
type = str,
|
|
dest = "groups",
|
|
default = None,
|
|
metavar = "<groups>",
|
|
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",
|
|
type = int,
|
|
dest = "expiry",
|
|
default = None,
|
|
metavar = "<expiry>",
|
|
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
|
|
conf_load(args.conf_path)
|
|
log_add_output(
|
|
{
|
|
"format": conf_get()["log"]["format"],
|
|
"min_level": (
|
|
{
|
|
"error": enum_log_level.ERROR,
|
|
"warning": enum_log_level.WARNING,
|
|
"notice": enum_log_level.NOTICE,
|
|
"info": enum_log_level.INFO,
|
|
"debug": enum_log_level.DEBUG,
|
|
}[conf_get()["log"]["min_level"]]
|
|
),
|
|
}
|
|
)
|
|
|
|
## 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,
|
|
"label_changeable": (not args.fixed_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
|
|
convey(
|
|
args.groups.split(","),
|
|
[
|
|
lambda x: map(lambda group_name: groups[group_name], x),
|
|
list,
|
|
]
|
|
)
|
|
),
|
|
"expiry": args.expiry,
|
|
}
|
|
if (args.action == "conf-schema"):
|
|
_sys.stdout.write(_json.dumps(conf_schema(), indent = "\t") + "\n")
|
|
elif (args.action == "conf-expose"):
|
|
_sys.stdout.write(_json.dumps(conf_get(), indent = "\t") + "\n")
|
|
elif (args.action == "member-list"):
|
|
data = backend_api_call_member_list(
|
|
)
|
|
_sys.stdout.write(_json.dumps(data, indent = "\t") + "\n")
|
|
elif (args.action == "member-read"):
|
|
if (
|
|
(data["id"] is None)
|
|
):
|
|
log_error(
|
|
"mandatory_parameters_missing",
|
|
{
|
|
"parameters": [
|
|
"id",
|
|
]
|
|
}
|
|
)
|
|
else:
|
|
data = backend_api_call_member_read(
|
|
data["id"]
|
|
)
|
|
_sys.stdout.write(_json.dumps(data, indent = "\t") + "\n")
|
|
elif (args.action == "member-delete"):
|
|
if (
|
|
(data["id"] is None)
|
|
):
|
|
log_error(
|
|
"mandatory_parameters_missing",
|
|
{
|
|
"parameters": [
|
|
"id",
|
|
]
|
|
}
|
|
)
|
|
else:
|
|
member_id = backend_api_call_member_delete(
|
|
data["id"]
|
|
)
|
|
elif (args.action == "invite-single"):
|
|
if (
|
|
(data["name_value"] is None)
|
|
or
|
|
(data["label_value"] is None)
|
|
):
|
|
log_error(
|
|
"mandatory_parameters_missing",
|
|
{
|
|
"parameters": [
|
|
"name",
|
|
"label",
|
|
]
|
|
}
|
|
)
|
|
else:
|
|
result = backend_api_call_invitation_create(
|
|
data["name_changeable"],
|
|
data["name_value"],
|
|
data["label_changeable"],
|
|
data["label_value"],
|
|
data["email_address_changeable"],
|
|
data["email_address_value"],
|
|
data["groups_changeable"],
|
|
data["groups_value"],
|
|
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()
|
|
|
|
|
|
try:
|
|
main()
|
|
except ValueError as error:
|
|
_sys.stderr.write(str(error) + "\n")
|
|
_sys.exit(1)
|
|
|