aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/eval_moodle_grades.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/scripts/eval_moodle_grades.py b/scripts/eval_moodle_grades.py
new file mode 100755
index 00000000..50480e74
--- /dev/null
+++ b/scripts/eval_moodle_grades.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+"""Evaluate grades from a moodle activity grades csv export"""
+
+import argparse
+import csv
+from datetime import datetime
+import locale
+
+# Example: Donnerstag, 16. Oktober 2025
+MOODLE_DATE_FORMAT = '%A, %d. %B %Y, %H:%M'
+
+
+def main():
+ """Entry point loading grades and evaluating them"""
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--points",
+ help="The maximum amount of points for the grades",
+ type=int,
+ default=3)
+ parser.add_argument("--scale",
+ help="The scale of the grades",
+ default="0-10")
+ parser.add_argument("--locale",
+ help="The locale to use",
+ default="de_DE.utf8")
+ parser.add_argument("grades", help="The csv file containing the grades")
+ args = parser.parse_args()
+
+ locale.setlocale(locale.LC_ALL, args.locale)
+
+ scale = args.scale.split('-')
+ scale = (int(scale[0]), int(scale[1]))
+
+ with open(args.grades, 'r', encoding='utf-8') as grades_files:
+ grades_reader = csv.reader(grades_files)
+ next(grades_reader) # skip headers
+ grades_data = list(grades_reader)
+
+ grades = {}
+ # Collect all first attempts
+ for grade in grades_data:
+ student = grade[1]
+ if grade[5] != '' and (not student in grades or datetime.strptime(
+ grades[student][0], MOODLE_DATE_FORMAT) > datetime.strptime(
+ grade[0], MOODLE_DATE_FORMAT)):
+ grades[student] = grade
+
+ results = [float(grade[5].replace(',', '.')) for grade in grades.values()]
+ mean = sum(results) / len(results)
+
+ print(f'mean: {mean} -> {args.points*(mean-scale[0])/scale[1]}')
+
+
+if __name__ == '__main__':
+ main()