#!/usr/bin/env python3 import argparse import csv import random import sys parser = argparse.ArgumentParser(description="Creates a CSV file to upload on MarkUs Graders tab") parser.add_argument("start_map", help="The CSV starting mapping downloaded from MarkUs Graders tab.") parser.add_argument("marking_counts", help="A CSV file of how many submissions each grader should mark") parser.add_argument("--ignore-start-mapping", action="store_true", help="Ignore mappings already in the start_map") args = parser.parse_args() # Students who still need a grader students_to_assign = [] # Students who already have a grader students_with_grader = [] # Check the starting map to get a list of students that still need a grader with open(args.start_map, 'r') as f: for row in csv.reader(f): if len(row) == 1 or args.ignore_start_mapping: students_to_assign.append(row[0].strip()) else: students_with_grader.append(row) marker_list = [] # read markinglist with open(args.marking_counts, 'r') as f: for row in csv.reader(f): marker_list.extend([row[0].strip()] * int(row[1].strip())) random.seed() random.shuffle(marker_list) if len(students_to_assign) != len(marker_list): print("Counting Error:") print(f"There are {len(students_to_assign)} students/groups that have to be assigned to TAs.") print(f"But the sum of the numbers in {args.marking_counts} is {len(marker_list)}") sys.exit(1) for r in students_with_grader: print(','.join(r)) for student, marker in zip(students_to_assign, marker_list): print(f"{student},{marker}")