From a071718db6ca67daefb3245a6eb0395c293d002e Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Sun, 4 Dec 2022 19:31:25 +0100 Subject: [PATCH] first try getting info from DUO --- slic/utils/duo.py | 88 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 slic/utils/duo.py diff --git a/slic/utils/duo.py b/slic/utils/duo.py new file mode 100644 index 00000000..11d992b3 --- /dev/null +++ b/slic/utils/duo.py @@ -0,0 +1,88 @@ +import requests +from getpass import getpass +from slic.utils import DotDir, pickle, unpickle + + +class Secrets: + + def __init__(self, fname="secrets"): + dot = DotDir() + self.f = PickledDict(dot(fname)) + + def set(self, name): + try: + secret = getpass(prompt=f"Please enter the secret \"{name}\": ") + except KeyboardInterrupt: + print() + else: + self.f.set(name, secret) + + def get(self, name): + return self.f.get(name) + + + +class PickledDict: + #TODO: should actually work like a dict + + def __init__(self, fname): + self.fname = fname + + def get(self, key): + d = self._load() + return d[key] + + def set(self, key, value): + d = self._load() + d[key] = value + pickle(d, self.fname) + + def _load(self): + try: + return unpickle(self.fname) + except FileNotFoundError: + return {} + + + + + +URL = "https://duo.psi.ch/duo/api.php/v1/PGroupAttributes/getProposalInfos/" + +KEY = Secrets().get("duo") + + +def get_pgroup_proposer_and_title(p): + data = get_pgroup(p) + return extract_from_proposal(data) + + +def get_pgroup(p): + url = URL + p + headers = {"x-api-secret": KEY} + resp = requests.get(url, headers=headers).json() + assert len(resp) == 1 + return resp[0] + + +def extract_from_proposal(data): + firstname = data["firstname"].strip() + lastname = data["lastname"].strip() + name = f"{firstname} {lastname}" + + pi_firstname = data["pi_firstname"].strip() + pi_lastname = data["pi_lastname"].strip() + pi_name = f"{pi_firstname} {pi_lastname}" + + if name != pi_name: + name = f"{name} | {pi_name}" + + title = data["title"].strip() + proposal = data["proposal"].strip() + + title = f"{title} ({proposal})" + + return name, title + + +