From 5a983f384ff108f19391546f611aee93a85fed18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20R=C3=B6del?= Date: Tue, 16 May 2023 10:31:53 +0200 Subject: [PATCH] Add form export script --- .gitignore | 2 ++ playground/coderdojo.py | 80 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 playground/coderdojo.py diff --git a/.gitignore b/.gitignore index eaefc8c..b9763da 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,6 @@ _site/ # Private environments in the HTTP playground folder /playground/*.private.env.json + +coderdojo.csv /httpd.dev.conf diff --git a/playground/coderdojo.py b/playground/coderdojo.py new file mode 100644 index 0000000..6a2f13c --- /dev/null +++ b/playground/coderdojo.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python + +import csv +import getpass +import sys + +import requests + +BASE_URL = "https://ticket.z31.it/api/v1" + +session = requests.Session() +session.headers.update({ + "Authorization": f"Token token={getpass.getpass(prompt='Zammad-Token eingeben: ')}" +}) + +if __name__ == "__main__": + ticket_ids = [] + + print("Suche nach aktuellen CoderDojo-Anmeldungen…", file=sys.stderr) + has_more = True + page = 1 + page_size = 50 + while has_more: + response = session.get( + f"{BASE_URL}/tickets/search", + params={ + "query": 'tags:"Kontaktformular – CoderDojo-Anmeldung"', + "page": str(page), + "per_page": page_size, + } + ) + response.raise_for_status() + + ticket_dict = response.json().get("assets", {}).get("Ticket", {}) + for ticket in ticket_dict.values(): + if ticket["close_at"] is not None: + continue + + assert isinstance(ticket["title"], str) + if not ticket["title"].endswith(" – CoderDojo-Anmeldung"): + continue + + assert isinstance(ticket["article_ids"], list) + if len(ticket["article_ids"]) < 2: + continue + + assert isinstance(ticket["id"], int) + ticket_ids.append(ticket["id"]) + + page += 1 + has_more = len(ticket_dict) == page_size + + print(f"{len(ticket_ids)} Anmeldung(en) gefunden. Hole jetzt die Details…", file=sys.stderr) + + fieldnames = [] + rows = [] + for ticket_id in ticket_ids: + row = {} + + response = session.get(f"{BASE_URL}/ticket_articles/by_ticket/{ticket_id}") + response.raise_for_status() + articles = response.json() + assert len(articles) >= 2 + + row.update({"Nachricht": articles[0].get("body", "")}) + for line in articles[1].get("body", "").split("\n"): + key, value = line.split(": ", 1) + row.update({key: value}) + if key not in fieldnames: + fieldnames.append(key) + + rows.append(row) + + if "Nachricht" not in fieldnames: + fieldnames.append("Nachricht") + writer = csv.DictWriter(sys.stdout, fieldnames=fieldnames) + writer.writeheader() + for row in rows: + writer.writerow(row) + sys.stdout.flush()