diff options
Diffstat (limited to 'scripts/eval_moodle_grades.py')
| -rwxr-xr-x | scripts/eval_moodle_grades.py | 55 |
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() |
