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

Added static typing to CompositeUser

parent ddbc8beb
No related branches found
No related tags found
No related merge requests found
import csv
from typing import ClassVar, Collection, Dict, Set, List
from api.canvas_classes import CanvasUser from api.canvas_classes import CanvasUser
from api.canvas_classes import CanvasCourse from api.canvas_classes import CanvasCourse
from api.gitlab_classes import GitlabUser from api.gitlab_classes import GitlabUser
from course import Course from course import Course
import csv
NO_PARTNERING_LIST_MAXIMUM = 10 NO_PARTNERING_LIST_MAXIMUM = 10
class CompositeUser: class CompositeUser:
instances = {} canvas_user: CanvasUser
gitlab_user: GitlabUser
def __init__(self, student_dictionary, graylist, blacklist): sortable_name: str
self.canvas_user = None readable_name: str
self.gitlab_user = None NUID: int
self.sortable_name = student_dictionary['SortableName'] canvas_username: str
self.readable_name = student_dictionary['ReadableName'] gitlab_username: str
self.NUID = int(student_dictionary['NUID']) canvas_email: str
self.canvas_username = student_dictionary['CanvasUsername'] gitlab_email: str
self.gitlab_username = student_dictionary['GitlabUsername'] graylist: Set[str]
self.canvas_email = student_dictionary['CanvasEmail'] blacklist: Set[str]
self.gitlab_email = student_dictionary['GitlabEmail'] candidate_teammates: Set[str]
self.graylist = set(graylist) instances: ClassVar[Dict[str, "CompositeUser"]] = {}
self.blacklist = set(blacklist)
self.candidate_teammates = None def __init__(self, student_dictionary: Dict[str, str], graylist: Collection[str], blacklist: Collection[str]):
self.canvas_user: CanvasUser = None
self.gitlab_user: GitlabUser = None
self.sortable_name: str = student_dictionary['SortableName']
self.readable_name: str = student_dictionary['ReadableName']
self.NUID: int = int(student_dictionary['NUID'])
self.canvas_username: str = student_dictionary['CanvasUsername']
self.gitlab_username: str = student_dictionary['GitlabUsername']
self.canvas_email: str = student_dictionary['CanvasEmail']
self.gitlab_email: str = student_dictionary['GitlabEmail']
self.graylist: Set[str] = set(graylist)
self.blacklist: Set[str] = set(blacklist)
self.candidate_teammates: Set[str] = None
CompositeUser.instances[self.canvas_email] = self CompositeUser.instances[self.canvas_email] = self
CompositeUser.instances[self.gitlab_email] = self CompositeUser.instances[self.gitlab_email] = self
CompositeUser.instances[self.canvas_username] = self CompositeUser.instances[self.canvas_username] = self
CompositeUser.instances[self.gitlab_username] = self CompositeUser.instances[self.gitlab_username] = self
def get_canvas_user(self): def get_canvas_user(self) -> CanvasUser:
if self.canvas_user is None: if self.canvas_user is None:
self.canvas_user = CanvasUser(self.NUID) # n.b., can retrieve own user but not arbitrary user self.canvas_user = CanvasUser(self.NUID) # n.b., can retrieve own user but not arbitrary user
return self.canvas_user return self.canvas_user
def get_gitlab_user(self): def get_gitlab_user(self) -> GitlabUser:
if self.gitlab_user is None: if self.gitlab_user is None:
self.gitlab_user = GitlabUser(self.gitlab_username) self.gitlab_user = GitlabUser(self.gitlab_username)
return self.gitlab_user return self.gitlab_user
def tentatively_pair_with(self, username): def tentatively_pair_with(self, username: str) -> None:
self.candidate_teammates = {username} self.candidate_teammates = {username}
def tentatively_team_with(self, usernames): def tentatively_team_with(self, usernames: Collection[str]) -> None:
self.candidate_teammates = set(usernames) self.candidate_teammates = set(usernames)
def commit_team(self): def commit_team(self) -> None: # TODO: Will want to re-visit this based on tracking by project
self.graylist = self.graylist.union(self.candidate_teammates) self.graylist = self.graylist.union(self.candidate_teammates)
def discard_team(self): def discard_team(self) -> None:
self.candidate_teammates = None self.candidate_teammates = None
def has_blacklist(self): def has_blacklist(self) -> bool:
return len(self.blacklist) > 0 return len(self.blacklist) > 0
def is_blacklist_compatible(self, other): def is_blacklist_compatible(self, other: "CompositeUser") -> bool:
return other not in self.blacklist and self not in other.blacklist return other.get_canvas_user().get_name() not in self.blacklist and \
self.get_canvas_user().get_name() not in other.blacklist
def is_graylist_compatible(self, other): def is_graylist_compatible(self, other: "CompositeUser") -> bool:
return other not in self.graylist and self not in other.graylist return other.get_canvas_user().get_name() not in self.graylist and \
self.get_canvas_user().get_name() not in other.graylist
def __repr__(self): def __repr__(self) -> str:
if self.canvas_email == self.gitlab_email: if self.canvas_email == self.gitlab_email:
return f'{self.readable_name}, gitlab @{self.gitlab_username}, email <{self.canvas_email}>' return f'{self.readable_name}, gitlab @{self.gitlab_username}, email <{self.canvas_email}>'
else: else:
return f'{self.readable_name}, gitlab @{self.gitlab_username},' \ return f'{self.readable_name}, gitlab @{self.gitlab_username},' \
f' email <{self.canvas_email}> <{self.gitlab_email}>' f' email <{self.canvas_email}> <{self.gitlab_email}>'
def __eq__(self, other): def __eq__(self, other: "CompositeUser") -> bool:
if isinstance(other, CompositeUser): # if isinstance(other, CompositeUser):
return self.canvas_username() == other.canvas_username() return self.canvas_username == other.canvas_username
else: # else:
return False # return False
def __ne__(self, other): def __ne__(self, other: "CompositeUser") -> bool:
return not self.__eq__(other) return not self.__eq__(other)
def __hash__(self) -> int: def __hash__(self) -> int:
return hash(self.canvas_username) return hash(self.canvas_username)
@staticmethod @staticmethod
def get_user(username_or_email): def get_user(username_or_email: str) -> "CompositeUser":
return CompositeUser.instances[username_or_email] return CompositeUser.instances[username_or_email]
# TODO: Will want to re-visit these based on tracking graylist by project...
@staticmethod @staticmethod
def read_student_csv(filename): def read_student_csv(filename: str) -> Set["CompositeUser"]:
students = set() students: Set[CompositeUser] = set()
with open(filename, mode='r') as csv_file: with open(filename, mode='r') as csv_file:
csv_reader = csv.DictReader(csv_file) csv_reader = csv.DictReader(csv_file)
for csv_student in csv_reader: for csv_student in csv_reader:
graylist = set() graylist: Set[str] = set()
blacklist = set() blacklist: Set[str] = set()
for count in range(NO_PARTNERING_LIST_MAXIMUM): for count in range(NO_PARTNERING_LIST_MAXIMUM):
former_partner = csv_student[f'Graylist{count}'] former_partner: str = csv_student[f'Graylist{count}']
undesired_partner = csv_student[f'Blacklist{count}'] undesired_partner: str = csv_student[f'Blacklist{count}']
if former_partner != "": if former_partner != "":
graylist.add(former_partner) graylist.add(former_partner)
if undesired_partner != "": if undesired_partner != "":
blacklist.add(undesired_partner) blacklist.add(undesired_partner)
student = CompositeUser(csv_student, graylist, blacklist) student = CompositeUser(csv_student, graylist, blacklist)
students.add(student) students.add(student)
canvas_students = CanvasCourse(Course.canvas_course_id).get_students() canvas_students: List[CanvasUser] = CanvasCourse(Course.canvas_course_id).get_students()
for canvas_student in canvas_students: for canvas_student in canvas_students:
composite_student = list(filter(lambda s: s.canvas_username == canvas_student.get_username(), students))[0] composite_student = list(filter(lambda s: s.canvas_username == canvas_student.get_username(), students))[0]
composite_student.canvas_user = canvas_student composite_student.canvas_user = canvas_student
return students return students
@staticmethod @staticmethod
def write_student_csv(students, filename): def write_student_csv(students: Set["CompositeUser"], filename: str) -> None:
with open(filename, mode='w') as csv_file: with open(filename, mode='w') as csv_file:
fieldnames = ['SortableName', 'ReadableName', 'NUID', fieldnames = ['SortableName', 'ReadableName', 'NUID',
'CanvasUsername', 'CanvasEmail', 'CanvasUsername', 'CanvasEmail',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment