Skip to content
Snippets Groups Projects
Commit 0a199808 authored by Christopher Bohn's avatar Christopher Bohn :thinking:
Browse files

Writes CSV file with new partner assignments

parent 6569535c
No related branches found
No related tags found
No related merge requests found
...@@ -22,8 +22,11 @@ class CompositeUser: ...@@ -22,8 +22,11 @@ class CompositeUser:
graylist: Dict[str, Set[str]] graylist: Dict[str, Set[str]]
blacklist: Set[str] blacklist: Set[str]
candidate_teammates: 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"]] = {} 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]): def __init__(self, student_dictionary: Dict[str, str], graylist: Dict[str, Set[str]], blacklist: Collection[str]):
self.canvas_user: CanvasUser = None self.canvas_user: CanvasUser = None
...@@ -102,8 +105,9 @@ class CompositeUser: ...@@ -102,8 +105,9 @@ class CompositeUser:
else: else:
print(f'Weird. {other}\'s partners for {assignment} ' print(f'Weird. {other}\'s partners for {assignment} '
f'are recorded as a {other.graylist[assignment].__class__}') f'are recorded as a {other.graylist[assignment].__class__}')
return other.get_canvas_user().get_username() not in my_past_partners and \ i_am_okay = other.get_canvas_user().get_username() not in my_past_partners
self.get_canvas_user().get_username() not in your_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: def __repr__(self) -> str:
if self.canvas_email == self.gitlab_email: if self.canvas_email == self.gitlab_email:
...@@ -139,7 +143,7 @@ class CompositeUser: ...@@ -139,7 +143,7 @@ class CompositeUser:
def string_to_set(the_string: str) -> Set[str]: def string_to_set(the_string: str) -> Set[str]:
return set(the_string.split()) 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(), student_dictionary = {'SortableName': self.sortable_name.strip(),
'ReadableName': self.readable_name.strip(), 'ReadableName': self.readable_name.strip(),
'NUID': self.NUID, 'NUID': self.NUID,
...@@ -148,7 +152,8 @@ class CompositeUser: ...@@ -148,7 +152,8 @@ class CompositeUser:
'GitlabUsername': self.gitlab_username, 'GitlabUsername': self.gitlab_username,
'GitlabEmail': self.gitlab_email, 'GitlabEmail': self.gitlab_email,
'Blacklist': CompositeUser.set_to_string(self.blacklist)} '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 return student_dictionary
# TODO: add CompositeUser.from_dict(Dict[str, str]) -> CompositeUser # TODO: add CompositeUser.from_dict(Dict[str, str]) -> CompositeUser
...@@ -161,8 +166,7 @@ class CompositeUser: ...@@ -161,8 +166,7 @@ class CompositeUser:
for csv_student in csv_reader: for csv_student in csv_reader:
blacklist: Set[str] = CompositeUser.string_to_set(csv_student['Blacklist']) blacklist: Set[str] = CompositeUser.string_to_set(csv_student['Blacklist'])
graylist: Dict[str, Set[str]] = {} graylist: Dict[str, Set[str]] = {}
handled_fields = {'SortableName', 'ReadableName', 'NUID', 'CanvasUsername', 'CanvasEmail', handled_fields = set(CompositeUser.basic_fields)
'GitlabUsername', 'GitlabEmail', 'Blacklist'} # TODO: remove duplication
for field in set(csv_student.keys()) - handled_fields: for field in set(csv_student.keys()) - handled_fields:
graylist[field] = CompositeUser.string_to_set(csv_student[field]) graylist[field] = CompositeUser.string_to_set(csv_student[field])
student = CompositeUser(csv_student, graylist, blacklist) student = CompositeUser(csv_student, graylist, blacklist)
...@@ -175,16 +179,14 @@ class CompositeUser: ...@@ -175,16 +179,14 @@ class CompositeUser:
@staticmethod @staticmethod
def write_student_csv(students: Set["CompositeUser"], filename: str) -> None: def write_student_csv(students: Set["CompositeUser"], filename: str) -> None:
fieldnames = ['SortableName', 'ReadableName', 'NUID', fieldnames = list(CompositeUser.basic_fields)
'CanvasUsername', 'CanvasEmail',
'GitlabUsername', 'GitlabEmail', 'Blacklist']
random_student = students.pop() random_student = students.pop()
student_assignments = random_student.graylist.keys() student_assignments = random_student.graylist.keys()
students.add(random_student) students.add(random_student)
fieldnames.extend(sorted(student_assignments)) fieldnames.extend(sorted(student_assignments))
with open(filename, mode='w') as csv_file: with open(filename, mode='w') as csv_file:
fieldnames.extend(CompositeUser.assignments) # fieldnames.extend(CompositeUser.assignments)
writer = csv.DictWriter(csv_file, fieldnames=fieldnames) writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader() writer.writeheader()
for student in students: for student in list(sorted(students, key=lambda s: s.sortable_name)):
writer.writerow(student.to_dict()) writer.writerow(student.to_dict(student_assignments))
import random import random
import subprocess import subprocess
from math import ceil, log10 # from math import ceil, log10
from typing import Tuple from typing import Tuple
from api.canvas_classes import * from api.canvas_classes import *
...@@ -11,13 +11,13 @@ from course import Course ...@@ -11,13 +11,13 @@ from course import Course
# TODO: assign_partners for arbitrarily-sized teams # TODO: assign_partners for arbitrarily-sized teams
def create_pairs(groupset_name: str = 'Unknown Assignment') -> \ 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 filename: str
students: Set[CompositeUser] students: Set[CompositeUser]
file_not_found = True file_not_found = True
while file_not_found: while file_not_found:
try: 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) students = CompositeUser.read_student_csv(filename)
file_not_found = False file_not_found = False
except FileNotFoundError: except FileNotFoundError:
...@@ -135,10 +135,15 @@ def create_pairs(groupset_name: str = 'Unknown Assignment') -> \ ...@@ -135,10 +135,15 @@ def create_pairs(groupset_name: str = 'Unknown Assignment') -> \
for student in pair[1:]: for student in pair[1:]:
if student is not None: if student is not None:
student.assign_partners(groupset_name, usernames - {student.canvas_username}) 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' filename = f'{assignment_number}-pairs.md'
with open(filename, mode='w') as pair_file: with open(filename, mode='w') as pair_file:
pair_file.write(f'# PARTNERS FOR ASSIGNMENT {assignment_number}\n\n') pair_file.write(f'# PARTNERS FOR ASSIGNMENT {assignment_number}\n\n')
...@@ -190,10 +195,15 @@ def create_groups(assignment_number, student_pairs): ...@@ -190,10 +195,15 @@ def create_groups(assignment_number, student_pairs):
if __name__ == '__main__': if __name__ == '__main__':
groupset: str = input('Please provide the name of the student groupset: ') groupset: str = input('Please provide the name of the student groupset: ')
partners: List[Tuple[int, CompositeUser, CompositeUser, Optional[CompositeUser]]] = create_pairs(groupset) student_set: Set[CompositeUser]
zero_padding = ceil(log10(len(partners))) partners: List[Tuple[int, CompositeUser, CompositeUser, Optional[CompositeUser]]]
for partner in partners: # noinspection PyRedeclaration
print(f'{groupset} {str(partner[0]).zfill(zero_padding)}: {partner[1]}\t{partner[2]}\t{partner[3]}') 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' assignment = '28'
pairs = create_pairs('2019-08.csv') pairs = create_pairs('2019-08.csv')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment