17
0

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.
This commit is contained in:
Benjamin Mako Hill 2022-01-05 17:52:29 +09:00
parent 92e65de771
commit 89c5369ad9
2 changed files with 56 additions and 14 deletions

View File

@ -10,7 +10,7 @@ import os.path
import re import re
class ColdCall(): 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())) self.today = str(datetime.date(datetime.now()))
# how much less likely should it be that a student is called upon? # how much less likely should it be that a student is called upon?
self.weight = 2 self.weight = 2
@ -20,8 +20,12 @@ class ColdCall():
self.__fn_studentinfo = "data/student_information.tsv" self.__fn_studentinfo = "data/student_information.tsv"
self.__fn_daily_calllist = f"data/call_list-{self.today}.tsv" self.__fn_daily_calllist = f"data/call_list-{self.today}.tsv"
self.__fn_daily_attendance = f"data/attendance-{self.today}.tsv" self.__fn_daily_attendance = f"data/attendance-{self.today}.tsv"
self.__preferred_name_field = preferred_name_field
if preferred_name_field != None:
self.preferred_names = self.__get_preferred_names() self.preferred_names = self.__get_preferred_names()
else:
self.preferred_names = None
def __load_prev_questions(self): def __load_prev_questions(self):
previous_questions = defaultdict(int) previous_questions = defaultdict(int)
@ -42,7 +46,7 @@ class ColdCall():
preferred_names = {} preferred_names = {}
with open(self.__fn_studentinfo, 'r') as f: with open(self.__fn_studentinfo, 'r') as f:
for row in DictReader(f, delimiter="\t"): 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) return(preferred_names)
@ -52,7 +56,7 @@ class ColdCall():
else: else:
return None return None
def __select_student_from_list (self, students_present): def select_student_from_list(self, students_present):
prev_questions = self.__load_prev_questions() prev_questions = self.__load_prev_questions()
# created a weighted list by starting out with everybody 1 # created a weighted list by starting out with everybody 1
@ -67,7 +71,7 @@ class ColdCall():
# print(weights) # DEBUG LINE # print(weights) # DEBUG LINE
return choices(list(weights.keys()), weights=list(weights.values()), k=1)[0] 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 it's the first one of the day, write it out
if not os.path.exists(self.__fn_daily_attendance): if not os.path.exists(self.__fn_daily_attendance):
with open(self.__fn_daily_attendance, "w") as f: with open(self.__fn_daily_attendance, "w") as f:
@ -79,7 +83,7 @@ class ColdCall():
",".join(students_present)]), ",".join(students_present)]),
file=f) 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 it's the first one of the day, write it out
if not os.path.exists(self.__fn_daily_calllist): if not os.path.exists(self.__fn_daily_calllist):
with open(self.__fn_daily_calllist, "w") as f: with open(self.__fn_daily_calllist, "w") as f:
@ -91,12 +95,12 @@ class ColdCall():
"MISSING", "MISSING"]), file=f) "MISSING", "MISSING"]), file=f)
def coldcall(self, students_present): 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 # record the called-upon student in the right place
if self.record_attendance: if self.record_attendance:
self.__record_attendance(students_present) self.record_attendance(students_present)
self.__record_coldcall(selected_student) self.record_coldcall(selected_student)
preferred_name = self.__get_preferred_name(selected_student) preferred_name = self.__get_preferred_name(selected_student)
if preferred_name: if preferred_name:

View File

@ -1,15 +1,53 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from coldcall import ColdCall from coldcall import ColdCall
import re from datetime import datetime
from csv import DictReader
current_time = datetime.today()
## create the coldcall object ## 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")
student_list = cc.preferred_names 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"])
# print out 100 students 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)
missing_today = [x for x in get_missing(current_time)]
## print("Missing Today: ", missing_today)
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): 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)