diff --git a/api/composite_user.py b/api/composite_user.py index 7036ff6f29cffbb78a116be2b8439b84f92565dd..44fa8ca839136a3a37e6ff3e5420ff9020e62be5 100644 --- a/api/composite_user.py +++ b/api/composite_user.py @@ -22,8 +22,11 @@ class CompositeUser: graylist: Dict[str, Set[str]] blacklist: Set[str] candidate_teammates: Set[str] - assignments: ClassVar[List[str]] = [] # TODO: make use of this!! + # assignments: ClassVar[List[str]] = [] # TODO: make use of this!! instances: ClassVar[Dict[str, "CompositeUser"]] = {} + basic_fields = ['SortableName', 'ReadableName', 'NUID', + 'CanvasUsername', 'CanvasEmail', + 'GitlabUsername', 'GitlabEmail', 'Blacklist'] def __init__(self, student_dictionary: Dict[str, str], graylist: Dict[str, Set[str]], blacklist: Collection[str]): self.canvas_user: CanvasUser = None @@ -102,8 +105,9 @@ class CompositeUser: else: print(f'Weird. {other}\'s partners for {assignment} ' f'are recorded as a {other.graylist[assignment].__class__}') - return other.get_canvas_user().get_username() not in my_past_partners and \ - self.get_canvas_user().get_username() not in your_past_partners + i_am_okay = other.get_canvas_user().get_username() not in my_past_partners + you_are_okay = self.get_canvas_user().get_username() not in your_past_partners + return i_am_okay and you_are_okay def __repr__(self) -> str: if self.canvas_email == self.gitlab_email: @@ -139,7 +143,7 @@ class CompositeUser: def string_to_set(the_string: str) -> Set[str]: return set(the_string.split()) - def to_dict(self) -> Dict[str, str]: + def to_dict(self, assignments) -> Dict[str, str]: student_dictionary = {'SortableName': self.sortable_name.strip(), 'ReadableName': self.readable_name.strip(), 'NUID': self.NUID, @@ -148,7 +152,8 @@ class CompositeUser: 'GitlabUsername': self.gitlab_username, 'GitlabEmail': self.gitlab_email, 'Blacklist': CompositeUser.set_to_string(self.blacklist)} - # TODO: add assignments + for assignment in assignments: + student_dictionary[assignment] = CompositeUser.set_to_string(self.graylist[assignment]) return student_dictionary # TODO: add CompositeUser.from_dict(Dict[str, str]) -> CompositeUser @@ -161,8 +166,7 @@ class CompositeUser: for csv_student in csv_reader: blacklist: Set[str] = CompositeUser.string_to_set(csv_student['Blacklist']) graylist: Dict[str, Set[str]] = {} - handled_fields = {'SortableName', 'ReadableName', 'NUID', 'CanvasUsername', 'CanvasEmail', - 'GitlabUsername', 'GitlabEmail', 'Blacklist'} # TODO: remove duplication + handled_fields = set(CompositeUser.basic_fields) for field in set(csv_student.keys()) - handled_fields: graylist[field] = CompositeUser.string_to_set(csv_student[field]) student = CompositeUser(csv_student, graylist, blacklist) @@ -175,16 +179,14 @@ class CompositeUser: @staticmethod def write_student_csv(students: Set["CompositeUser"], filename: str) -> None: - fieldnames = ['SortableName', 'ReadableName', 'NUID', - 'CanvasUsername', 'CanvasEmail', - 'GitlabUsername', 'GitlabEmail', 'Blacklist'] + fieldnames = list(CompositeUser.basic_fields) random_student = students.pop() student_assignments = random_student.graylist.keys() students.add(random_student) fieldnames.extend(sorted(student_assignments)) with open(filename, mode='w') as csv_file: - fieldnames.extend(CompositeUser.assignments) + # fieldnames.extend(CompositeUser.assignments) writer = csv.DictWriter(csv_file, fieldnames=fieldnames) writer.writeheader() - for student in students: - writer.writerow(student.to_dict()) + for student in list(sorted(students, key=lambda s: s.sortable_name)): + writer.writerow(student.to_dict(student_assignments)) diff --git a/prep_assignment.py b/prep_assignment.py index ec07f678a7573b783a16f2d45e49a44320ba3ee4..fddf03047e420084261d07fc0433e321156e7395 100644 --- a/prep_assignment.py +++ b/prep_assignment.py @@ -1,6 +1,6 @@ import random import subprocess -from math import ceil, log10 +# from math import ceil, log10 from typing import Tuple from api.canvas_classes import * @@ -11,13 +11,13 @@ from course import Course # TODO: assign_partners for arbitrarily-sized teams def create_pairs(groupset_name: str = 'Unknown Assignment') -> \ - List[Tuple[int, CompositeUser, CompositeUser, Optional[CompositeUser]]]: + Tuple[Set[CompositeUser], List[Tuple[int, CompositeUser, CompositeUser, Optional[CompositeUser]]]]: filename: str students: Set[CompositeUser] file_not_found = True while file_not_found: try: - filename = input('Please provide the name of the file with existing student matches: ') + filename = input('Please provide the name of the existing student roster file: ') students = CompositeUser.read_student_csv(filename) file_not_found = False except FileNotFoundError: @@ -72,7 +72,7 @@ def create_pairs(groupset_name: str = 'Unknown Assignment') -> \ if student in preassigned_students: preassigned_students.remove(student) elif confirmation.upper()[0] == 'N': - print('We\'re not accepting NO for an answer yet. Goodbye.') # TODO: accept NO for an answer + print('We\'re not accepting NO for an answer yet. Goodbye.') # TODO: accept NO for an answer exit(1) else: print('Aborting.') @@ -135,10 +135,15 @@ def create_pairs(groupset_name: str = 'Unknown Assignment') -> \ for student in pair[1:]: if student is not None: student.assign_partners(groupset_name, usernames - {student.canvas_username}) - return student_pairs + return students, student_pairs -def save_pairs(assignment_number, student_pairs): +def save_student_roster(students: Set[CompositeUser]): + filename = input('Please provide the name of the new student roster file: ') + CompositeUser.write_student_csv(students, filename) + + +def create_contact_list(assignment_number, student_pairs): filename = f'{assignment_number}-pairs.md' with open(filename, mode='w') as pair_file: pair_file.write(f'# PARTNERS FOR ASSIGNMENT {assignment_number}\n\n') @@ -190,10 +195,15 @@ def create_groups(assignment_number, student_pairs): if __name__ == '__main__': groupset: str = input('Please provide the name of the student groupset: ') - partners: List[Tuple[int, CompositeUser, CompositeUser, Optional[CompositeUser]]] = create_pairs(groupset) - zero_padding = ceil(log10(len(partners))) - for partner in partners: - print(f'{groupset} {str(partner[0]).zfill(zero_padding)}: {partner[1]}\t{partner[2]}\t{partner[3]}') + student_set: Set[CompositeUser] + partners: List[Tuple[int, CompositeUser, CompositeUser, Optional[CompositeUser]]] + # noinspection PyRedeclaration + student_set, partners = create_pairs(groupset) + print() + save_student_roster(student_set) + # zero_padding = ceil(log10(len(partners))) + # for partner in partners: + # print(f'{groupset} {str(partner[0]).zfill(zero_padding)}: {partner[1]}\t{partner[2]}\t{partner[3]}') """ assignment = '28' pairs = create_pairs('2019-08.csv')