#!/usr/bin/env python3 # Konvertiere IServ-Gruppenlisten in Moodle-Importdateien # 2022-2024 by Daniel Spittank, daniel.spittank@gymsedan.de # Lizenz: GPLv3 # Importe from pprint import pprint import csv # Schuljahr schuljahr='24' categoryid='2' # Gruppenfilter filter_gruppen_entfernen = ['11','12','13','14','15','16','17','18','19','20','21','22','23'] gruppen_vorgeben = True filter_gruppen_ausschliesslich = [ 'Klasse_08C', 'Klasse_08C_PK', 'Kurs_10_IFR2', 'Kurs_09_IFR2', 'Kurs_EF_IF_G1', 'Kurs_EF_IF_G2', 'Kurs_Q2_IF_G1', 'Kurs_Q2_IF_G2', 'Klasse_09A_E5', 'Klasse_09B_E5', 'Klasse_09C_E5', 'Kurs_07_ER1', 'Kurs_09_ER1', 'Kurs_10_ER1', 'Kurs_Q1_ER_G1', 'Klasse_06A_IF' ] # Ergebnisspeicher members = [] maxkurse = 0 allekurse = [] # Kollegium einlesen with open('Export_Kollegium.csv', 'r', encoding='utf-8-sig') as f: # CSV einlesen cr = csv.DictReader(f, delimiter=',', lineterminator='\n') for row in cr: # Person erstellen p = { 'firstname' : row['Vorname'], 'lastname' : row['Nachname'], 'username' : row['Account'], 'email' : row['E-Mail-Adresse'], 'profile_field_Klasse' : 'Kollegium', 'profile_field_Lehrer_in' : '1', 'idnumber' : row['Klasse/Information'], #row['Import-ID'] 'password': 'oauth2' } # Gruppen der Person laden gt = row['Alle Gruppen'].split(',') # Gruppen filtern if gruppen_vorgeben: gruppen = list(filter(lambda g: g in filter_gruppen_ausschliesslich, gt)) else: gruppen = list(filter(lambda g: g.startswith('Kurs_') or g.startswith('Klasse_') and not any(fg in g for fg in filter_gruppen_entfernen), gt)) # Gruppen ins Format von Moodle bringen und Gruppen sammeln for i, g in enumerate(gruppen): p['course' + str(i+1)] = schuljahr + '_' + g p['role' + str(i+1)] = 'editingteacher' # Kurse sammeln if g not in allekurse: allekurse.append(g) # Anzahl der maximalen Gruppen pro Person merken maxkurse = max(maxkurse, len(gruppen)) # Person zur Liste hinzfügen members.append(p) # SuS einlesen with open('Export_SuS.csv', 'r', encoding='utf-8-sig') as f: # CSV einlesen cr = csv.DictReader(f, delimiter=',', lineterminator='\n') for row in cr: # Person erstellen p = { 'firstname' : row['Vorname'], 'lastname' : row['Nachname'], 'username' : row['Account'], 'email' : row['E-Mail-Adresse'], 'profile_field_Klasse' : row['Klasse/Information'], 'profile_field_Lehrer_in' : '0', 'idnumber' : row['Import-ID'], 'password': 'oauth2' } # Gruppen der Person laden gt = row['Alle Gruppen'].split(',') # Gruppen filtern if gruppen_vorgeben: gruppen = list(filter(lambda g: g in filter_gruppen_ausschliesslich, gt)) else: gruppen = list(filter(lambda g: g.startswith('Kurs_') or g.startswith('Klasse_') and not any(fg in g for fg in filter_gruppen_entfernen), gt)) # Gruppen ins Format von Moodle bringen und Gruppen sammeln for i, g in enumerate(gruppen): p['course' + str(i+1)] = schuljahr + '_' + g p['role' + str(i+1)] = 'student' # Kurse sammeln if g not in allekurse: allekurse.append(g) maxkurse = max(maxkurse, len(gruppen)) # Person zur Liste hinzfügen members.append(p) # Moodle-Importdatei für User schreiben with open('Import_Users.csv', 'w', encoding='utf-8-sig') as f: # CSV DictWriter anlegen fieldnames = [ 'username', 'firstname', 'lastname', 'email', 'profile_field_Klasse', 'profile_field_Lehrer_in', 'idnumber', 'password'] for i in range(1,maxkurse+1): fieldnames.append("course" + str(i)) fieldnames.append("role" + str(i)) cw = csv.DictWriter(f, delimiter=';', fieldnames=fieldnames) # Datei schreiben cw.writeheader() for p in members: cw.writerow(p) # Moodle-Importdatei für Kurse schreiben with open('Import_Courses.csv', 'w', encoding='utf-8-sig') as f: # CSV DictWriter anlegen fieldnames = [ 'shortname', 'fullname', 'category', 'visible'] cw = csv.DictWriter(f, delimiter=';', fieldnames=fieldnames) # Datei schreiben cw.writeheader() for c in allekurse: cw.writerow({ 'shortname' : schuljahr + '_' + c, 'fullname' : schuljahr + '_' + c, 'category' : categoryid, 'visible' : '1' })