]> code.communitydata.science - coldcallbot-discord.git/blobdiff - flask_app/app.py
added flask app from jeremy
[coldcallbot-discord.git] / flask_app / app.py
diff --git a/flask_app/app.py b/flask_app/app.py
new file mode 100644 (file)
index 0000000..c113e45
--- /dev/null
@@ -0,0 +1,144 @@
+#!/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])
+
+

Community Data Science Collective || Want to submit a patch?