--- /dev/null
+#!/usr/bin/env python
+
+import pandas as pd
+from random import choices, shuffle
+from datetime import datetime
+import csv
+import os
+from flask import Flask, render_template, request, abort
+
+app = Flask(__name__)
+
+@app.route("/")
+def hello_world():
+ return "<p>Hello, Test!</p>"
+
+
+@app.route('/response_quality', methods=['POST'])
+def response_quality():
+ student_name = request.form['studentName']
+ button_value = request.form['buttonValue']
+ course = request.form['course']
+
+ fn = f'../assessments/{course}/{course}.csv'
+
+ if button_value == 'absent':
+ answered = 'F'
+ button_value = ''
+ else:
+ answered = 'T'
+
+ write_to_file(student_name, fn,
+ answered=answered,
+ assessment=button_value)
+
+ return 'Received feedback from ' + student_name + ': ' + button_value
+
+@app.route("/coldcaller/<course>", methods=['POST','GET'])
+def coldcaller(course):
+ if course not in ["com_304","com_411","com_674"]:
+ abort(404)
+ weight = 2
+ students = pd.read_csv(f'../assessments/{course}/{course}_students.csv').Name
+ student = ''
+ out_fn = f'../assessments/{course}/{course}.csv'
+ caller = Caller(out_fn, students, weight)
+ if request.method == "POST":
+ student = caller.get_random_student()
+ return render_template('cold_caller.html', student=student)
+
+@app.route("/shuffler", methods=['POST','GET'])
+def shuffler():
+ course = request.args.get('course')
+ try:
+ student_list = pd.read_csv(f'../assessments/{course}/{course}_students.csv').Name
+ except FileNotFoundError:
+ abort(404)
+ shuffle(student_list)
+ print(student_list)
+ return render_template('shuffler.html', result=student_list)
+
+@app.route("/make_groups", methods=['POST','GET'])
+def make_groups():
+ course = request.args.get('course')
+ group_size = int(request.args.get('group_size'))
+ print('running')
+ try:
+ student_list = pd.read_csv(f'../assessments/{course}/{course}_students.csv').Name
+ except FileNotFoundError:
+ abort(404)
+ shuffle(student_list)
+ print(student_list)
+ print(range(0,len(student_list)//group_size + 1, group_size))
+ result = []
+ j = 1
+ for i in range(0,len(student_list), group_size):
+ result.append((j, student_list[i:i+group_size]))
+ j += 1
+ return render_template('group_maker.html', result=result)
+
+
+
+class Caller:
+
+ def __init__(self, out_fn, students, weight = 2):
+ self.weight = weight
+ self.fn = out_fn
+ self.students = students
+ self.last_chosen = None
+ self.today = datetime.now().date()
+ self.weights_dict = self.get_weights()
+
+ def get_weights(self):
+ times_called = self.get_times_called()
+ weights_dict = {}
+ for student in self.students:
+ try:
+ curr_tc = times_called[student]
+ except KeyError:
+ curr_tc = 0
+ student_weight = (1/self.weight) ** curr_tc
+ weights_dict[student] = student_weight
+ return weights_dict
+
+
+ def get_times_called(self):
+ try:
+ df = pd.read_csv(self.fn)
+ if len(df) > 0:
+ self.last_chosen = df.name.iloc[-1]
+ df.date = pd.to_datetime(df.date).dt.date
+ times_called = df[(df.answered.isin(['T','TRUE']))|(df.date==self.today)].groupby('name').size()
+ self.absent_today = df.loc[(df.date==self.today) & (df.answered.isin(['F', 'FALSE'])), 'name']
+ except FileNotFoundError or IndexError:
+ times_called = pd.DataFrame()
+ return times_called
+
+ def update_weight(self, student):
+ self.weights_dict[student] /= self.weight
+
+ def get_random_student(self, can_repeat=False):
+ if not can_repeat:
+ curr_weights = {k:v for k,v in self.weights_dict.items() if k != self.last_chosen}
+ else:
+ curr_weights = self.weights_dict
+ for student in set(self.absent_today):
+ print(curr_weights.keys())
+ print(student in curr_weights)
+ if student != self.last_chosen:
+ del curr_weights[student]
+ rand_student = choices(list(curr_weights.keys()), weights=list(curr_weights.values()), k=1)[0]
+ print(f"Weight of {rand_student}: {curr_weights[rand_student]}")
+ self.update_weight(rand_student)
+ return(rand_student)
+
+def write_to_file(student, fn, answered, assessment):
+ if not os.path.exists(fn):
+ with open(fn, 'w') as f:
+ f.write(','.join(['name', 'date', 'answered', 'assessment']))
+ f.write('\n')
+ with open(fn, 'a') as f:
+ out_csv = csv.writer(f)
+ out_csv.writerow([student,datetime.now().date(),answered,assessment])
+
+