From 89c5369ad9bbefda1053caa99b9dca4e06f18f28 Mon Sep 17 00:00:00 2001 From: Benjamin Mako Hill Date: Wed, 5 Jan 2022 17:52:29 +0900 Subject: [PATCH] work to build a much better manual version of the script one thing that is clear to me is that the preferred name logic should really be removed entirely from the coldcall.py program and moved into the coldcall.py file. I'm currently ignoring that functionality in the coldcallbot-manual.py but I haven't yet fully removed it from the other. --- coldcall.py | 22 ++++++++++++-------- coldcallbot-manual.py | 48 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 56 insertions(+), 14 deletions(-) diff --git a/coldcall.py b/coldcall.py index 1ba96a5..cc5504b 100644 --- a/coldcall.py +++ b/coldcall.py @@ -10,7 +10,7 @@ import os.path import re class ColdCall(): - def __init__ (self, record_attendance=True): + def __init__ (self, record_attendance=True, preferred_name_field=None): self.today = str(datetime.date(datetime.now())) # how much less likely should it be that a student is called upon? self.weight = 2 @@ -20,8 +20,12 @@ class ColdCall(): self.__fn_studentinfo = "data/student_information.tsv" self.__fn_daily_calllist = f"data/call_list-{self.today}.tsv" self.__fn_daily_attendance = f"data/attendance-{self.today}.tsv" + self.__preferred_name_field = preferred_name_field - self.preferred_names = self.__get_preferred_names() + if preferred_name_field != None: + self.preferred_names = self.__get_preferred_names() + else: + self.preferred_names = None def __load_prev_questions(self): previous_questions = defaultdict(int) @@ -42,7 +46,7 @@ class ColdCall(): preferred_names = {} with open(self.__fn_studentinfo, 'r') as f: for row in DictReader(f, delimiter="\t"): - preferred_names[row["Your username on the class Teams server"]] = row["Name you'd like to go by in class"] + row["Your UW student number"] = row[self.__preferred_name_field] return(preferred_names) @@ -52,7 +56,7 @@ class ColdCall(): else: return None - def __select_student_from_list (self, students_present): + def select_student_from_list(self, students_present): prev_questions = self.__load_prev_questions() # created a weighted list by starting out with everybody 1 @@ -67,7 +71,7 @@ class ColdCall(): # print(weights) # DEBUG LINE return choices(list(weights.keys()), weights=list(weights.values()), k=1)[0] - def __record_attendance(self, students_present): + def record_attendance(self, students_present): # if it's the first one of the day, write it out if not os.path.exists(self.__fn_daily_attendance): with open(self.__fn_daily_attendance, "w") as f: @@ -79,7 +83,7 @@ class ColdCall(): ",".join(students_present)]), file=f) - def __record_coldcall(self, selected_student): + def record_coldcall(self, selected_student): # if it's the first one of the day, write it out if not os.path.exists(self.__fn_daily_calllist): with open(self.__fn_daily_calllist, "w") as f: @@ -91,12 +95,12 @@ class ColdCall(): "MISSING", "MISSING"]), file=f) def coldcall(self, students_present): - selected_student = self.__select_student_from_list(students_present) + selected_student = self.select_student_from_list(students_present) # record the called-upon student in the right place if self.record_attendance: - self.__record_attendance(students_present) - self.__record_coldcall(selected_student) + self.record_attendance(students_present) + self.record_coldcall(selected_student) preferred_name = self.__get_preferred_name(selected_student) if preferred_name: diff --git a/coldcallbot-manual.py b/coldcallbot-manual.py index a4268ea..6c128ba 100755 --- a/coldcallbot-manual.py +++ b/coldcallbot-manual.py @@ -1,15 +1,53 @@ #!/usr/bin/env python3 from coldcall import ColdCall -import re +from datetime import datetime +from csv import DictReader + +current_time = datetime.today() ## create the coldcall object -cc = ColdCall(record_attendance=False) +cc = ColdCall(record_attendance=False, preferred_name_field="Name you'd like to go by in class") + +def get_missing(d=current_time): + date_string = f'{d.month}/{d.day}/{d.year}' + with open("data/absence_poll_data.tsv", 'r') as f: + for row in DictReader(f, delimiter="\t"): + if row["Date of class session you will be absent"] == date_string: + yield(row["Your UW student number"]) + +full_names = {} +registered_students = [] +with open("data/2022_winter_COM_481_A_students.csv", 'r') as f: + for row in DictReader(f, delimiter=","): + student_no = row["StudentNo"].strip() + registered_students.append(student_no) + full_names[student_no] = f"{row['FirstName']} {row['LastName']}" +## print("Registered:", registered_students) -student_list = cc.preferred_names +missing_today = [x for x in get_missing(current_time)] +## print("Missing Today: ", missing_today) -# print out 100 students +preferred_names = {} +with open("data/student_information.tsv", 'r') as f: + for row in DictReader(f, delimiter="\t"): + preferred_names[row["Your UW student number"]] = row["Name you'd like to go by in class"] +## print("Preferred names:", preferred_names) + +students_present = [s for s in registered_students if s not in missing_today] +## print("Students present:", students_present) for i in range(100): - print(f"{i + 1}. {cc.coldcall(student_list)} [ ] [ ]\n") + selected_student = cc.select_student_from_list(students_present) + + try: + preferred_name = preferred_names[selected_student] + except KeyError: + preferred_name = "MISSING PREFERRED NAME" + + print(f"{i + 1}.", + preferred_name, "::", + selected_student, "::", + full_names[selected_student]) + cc.record_coldcall(selected_student) -- 2.39.5