4 from random import choices, shuffle
5 from datetime import datetime
8 from flask import Flask, render_template, request, abort
14 return "<p>Hello, Test!</p>"
17 @app.route('/response_quality', methods=['POST'])
18 def response_quality():
19 student_name = request.form['studentName']
20 button_value = request.form['buttonValue']
21 course = request.form['course']
24 fn = f'../assessments/{course}/{course}.csv'
26 if button_value == 'absent':
32 if button_value != 'get_next':
33 write_to_file(student_name, fn,
35 assessment=button_value)
36 student = coldcall_student(course)
37 print(f'Sending {student}')
40 @app.route("/coldcaller/<course>", methods=['POST','GET'])
41 def coldcaller(course):
42 public = request.args.get('public')
44 if request.method == "POST":
45 student = coldcall_student(course)
50 return render_template('cold_caller.html', student=student, public=public)
52 def coldcall_student(course):
53 if course not in ["com_304","com_411","com_674", "amap"]:
56 students = pd.read_csv(f'../assessments/{course}/{course}_students.csv').Name
57 out_fn = f'../assessments/{course}/{course}.csv'
58 caller = Caller(out_fn, students, weight)
59 student = caller.get_random_student()
62 @app.route("/shuffler", methods=['POST','GET'])
64 course = request.args.get('course')
66 student_list = pd.read_csv(f'../assessments/{course}/{course}_students.csv').Name
67 except FileNotFoundError:
71 return render_template('shuffler.html', result=student_list)
73 @app.route("/make_groups", methods=['POST','GET'])
75 course = request.args.get('course')
76 group_size = int(request.args.get('group_size'))
79 student_list = pd.read_csv(f'../assessments/{course}/{course}_students.csv').Name
80 except FileNotFoundError:
84 print(range(0,len(student_list)//group_size + 1, group_size))
87 for i in range(0,len(student_list), group_size):
88 result.append((j, student_list[i:i+group_size]))
90 return render_template('group_maker.html', result=result)
96 def __init__(self, out_fn, students, weight = 2):
99 self.students = students
100 self.last_chosen = None
101 self.today = datetime.now().date()
102 self.weights_dict = self.get_weights()
104 def get_weights(self):
105 times_called = self.get_times_called()
107 for student in self.students:
109 curr_tc = times_called[student]
112 student_weight = (1/self.weight) ** curr_tc
113 weights_dict[student] = student_weight
117 def get_times_called(self):
119 df = pd.read_csv(self.fn)
121 self.last_chosen = df.name.iloc[-1]
122 df.date = pd.to_datetime(df.date).dt.date
123 times_called = df[(df.answered.isin(['T','TRUE']))|(df.date==self.today)].groupby('name').size()
124 self.absent_today = df.loc[(df.date==self.today) & (df.answered.isin(['F', 'FALSE'])), 'name']
125 except FileNotFoundError or IndexError:
126 times_called = pd.DataFrame()
127 self.absent_today = pd.DataFrame()
130 def update_weight(self, student):
131 self.weights_dict[student] /= self.weight
133 def get_random_student(self, can_repeat=False):
135 curr_weights = {k:v for k,v in self.weights_dict.items() if k != self.last_chosen}
137 curr_weights = self.weights_dict
138 for student in set(self.absent_today):
139 if student != self.last_chosen:
140 del curr_weights[student]
141 rand_student = choices(list(curr_weights.keys()), weights=list(curr_weights.values()), k=1)[0]
142 print(f"Weight of {rand_student}: {curr_weights[rand_student]}")
143 self.update_weight(rand_student)
146 def write_to_file(student, fn, answered, assessment):
147 if not os.path.exists(fn):
148 with open(fn, 'w') as f:
149 f.write(','.join(['name', 'date', 'answered', 'assessment']))
151 with open(fn, 'a') as f:
152 out_csv = csv.writer(f)
153 out_csv.writerow([student,datetime.now().date(),answered,assessment])