#!/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 "

Hello, Test!

" @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/", 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])