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']
23 fn = f'../assessments/{course}/{course}.csv'
25 if button_value == 'absent':
31 write_to_file(student_name, fn,
33 assessment=button_value)
35 return 'Received feedback from ' + student_name + ': ' + button_value
37 @app.route("/coldcaller/<course>", methods=['POST','GET'])
38 def coldcaller(course):
39 if course not in ["com_304","com_411","com_674"]:
42 students = pd.read_csv(f'../assessments/{course}/{course}_students.csv').Name
44 out_fn = f'../assessments/{course}/{course}.csv'
45 caller = Caller(out_fn, students, weight)
46 if request.method == "POST":
47 student = caller.get_random_student()
48 return render_template('cold_caller.html', student=student)
50 @app.route("/shuffler", methods=['POST','GET'])
52 course = request.args.get('course')
54 student_list = pd.read_csv(f'../assessments/{course}/{course}_students.csv').Name
55 except FileNotFoundError:
59 return render_template('shuffler.html', result=student_list)
61 @app.route("/make_groups", methods=['POST','GET'])
63 course = request.args.get('course')
64 group_size = int(request.args.get('group_size'))
67 student_list = pd.read_csv(f'../assessments/{course}/{course}_students.csv').Name
68 except FileNotFoundError:
72 print(range(0,len(student_list)//group_size + 1, group_size))
75 for i in range(0,len(student_list), group_size):
76 result.append((j, student_list[i:i+group_size]))
78 return render_template('group_maker.html', result=result)
84 def __init__(self, out_fn, students, weight = 2):
87 self.students = students
88 self.last_chosen = None
89 self.today = datetime.now().date()
90 self.weights_dict = self.get_weights()
92 def get_weights(self):
93 times_called = self.get_times_called()
95 for student in self.students:
97 curr_tc = times_called[student]
100 student_weight = (1/self.weight) ** curr_tc
101 weights_dict[student] = student_weight
105 def get_times_called(self):
107 df = pd.read_csv(self.fn)
109 self.last_chosen = df.name.iloc[-1]
110 df.date = pd.to_datetime(df.date).dt.date
111 times_called = df[(df.answered.isin(['T','TRUE']))|(df.date==self.today)].groupby('name').size()
112 self.absent_today = df.loc[(df.date==self.today) & (df.answered.isin(['F', 'FALSE'])), 'name']
113 except FileNotFoundError or IndexError:
114 times_called = pd.DataFrame()
117 def update_weight(self, student):
118 self.weights_dict[student] /= self.weight
120 def get_random_student(self, can_repeat=False):
122 curr_weights = {k:v for k,v in self.weights_dict.items() if k != self.last_chosen}
124 curr_weights = self.weights_dict
125 for student in set(self.absent_today):
126 print(curr_weights.keys())
127 print(student in curr_weights)
128 if student != self.last_chosen:
129 del curr_weights[student]
130 rand_student = choices(list(curr_weights.keys()), weights=list(curr_weights.values()), k=1)[0]
131 print(f"Weight of {rand_student}: {curr_weights[rand_student]}")
132 self.update_weight(rand_student)
135 def write_to_file(student, fn, answered, assessment):
136 if not os.path.exists(fn):
137 with open(fn, 'w') as f:
138 f.write(','.join(['name', 'date', 'answered', 'assessment']))
140 with open(fn, 'a') as f:
141 out_csv = csv.writer(f)
142 out_csv.writerow([student,datetime.now().date(),answered,assessment])