From 64012df977e4b0fb5815f6ab43321e6905dce313 Mon Sep 17 00:00:00 2001
From: Tim Schubert <tim.schubert@tu-bs.de>
Date: Tue, 20 Mar 2018 11:29:30 +0100
Subject: [PATCH] Parse groups and users from exported CSV

---
 groupimporter.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 71 insertions(+)
 create mode 100644 groupimporter.py

diff --git a/groupimporter.py b/groupimporter.py
new file mode 100644
index 0000000..756b0b9
--- /dev/null
+++ b/groupimporter.py
@@ -0,0 +1,71 @@
+import csv
+import argparse
+
+from mimetypes import guess_type
+
+
+def group_name(longname):
+    """Use the group number (located at start of group name)"""
+
+    if longname in ['keine Teilnahme an den Übungen', 'keiner Funktion oder Gruppe zugeordnet', 'Gruppe']:
+        return None
+    else:
+        return longname.split(' ')[0]
+
+
+def parse_groups_csv(csvfile, encoding='utf-8'):
+    """Reads the names of the groups from CSV file and yields the group names
+    """
+
+    with open(csvfile, 'r', encoding=encoding) as lines:
+        """ Get distinct values from first column (groups)"""
+
+        reader = csv.reader(lines, delimiter=';', quotechar='"')
+        zipped = list(zip(*reader))
+
+        for groupname in set(zipped[0]):
+            short_name = group_name(groupname)
+
+            """Discard groups that are None"""
+            if short_name:
+                yield(short_name)
+
+
+def parse_users_csv(csvfile, encoding='utf-8'):
+    """Reads user information from a CSV file and yields each user as a dict"""
+
+    with open(csvfile, 'r', encoding=encoding) as lines:
+        reader = csv.DictReader(lines, delimiter=';', quotechar='"')
+
+        for line in reader:
+            yield line['Nutzernamen'], line['E-Mail'], group_name(line['Gruppe'])
+
+
+if __name__ == '__main__':
+
+    parser = argparse.ArgumentParser(description='Import groups and users from data source')
+    parser.add_argument('course', type=str, nargs=1, help='name of the course')
+    parser.add_argument('source', type=str, nargs=1, help='data source')
+    parser.add_argument('--encoding', type=str, nargs=1, help='encoding of source')
+
+    args = parser.parse_args()
+
+    type, _ = guess_type(args.source[0])
+
+    print(type)
+
+    if type == 'text/csv':
+
+        groupnames = parse_groups_csv(args.source[0], args.encoding[0])
+
+        for group in groupnames:
+            print(args.course[0] + ' ' + group)
+
+        users = parse_users_csv(args.source[0], args.encoding[0])
+
+        for user in users:
+            print(user)
+
+    elif type == None:
+
+        print('MIME type not recognized')