-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
128 lines (105 loc) · 4.04 KB
/
app.py
File metadata and controls
128 lines (105 loc) · 4.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
from flask import Flask, request, render_template, send_file, jsonify, session
from flask_triangle import Triangle
from flask_socketio import SocketIO, emit
from flask_pymongo import PyMongo
from flask_uuid import FlaskUUID
from uuid import uuid4
from pymongo import MongoClient
import random as rand
from itertools import product
import json, os
from EpsilonGreedy import EpsilonGreedy
from UCB import UCB
from IteratingBandit import IteratingBandit
from operator import itemgetter
# Create app and PyMongo DB
app = Flask(__name__)
Triangle(app)
socketio = SocketIO(app)
flask_uuid = FlaskUUID()
flask_uuid.init_app(app)
# Set MongoDB details
client = MongoClient('localhost:27017')
# DB for registering user behaviour
db = client.ClickData
# DB for registering user ratings
db_ratings = client.RatingData
# Set app secret (for sessions).
app.secret_key = os.urandom(24)
# Layout features and options
layouts = ["grid", "list"]
font_sizes = ["small", "large"]
colour_schemes = ["dark", "light"]
features = [layouts, font_sizes, colour_schemes]
# Initialise bandit algorithm
# bandit = UCB(features)
# Bandit used for user rating - iterates through all of the versions in order
bandit = IteratingBandit(features)
@app.route("/")
def index():
session['uid'] = uuid4()
return render_template('index.html', layout=generate_layout())
@app.route("/registerClick", methods=['POST'])
def registerClick():
try:
session['clicks'] += 1
print 'clicks: ', session['clicks']
# Update MongoDB entry
# db.Clicks.update_one({'session_id': session['uid']},{'$set': {'clicks': session['clicks']}}, upsert=False)
# bandit.updateValue(session['layoutType'], session['clicks'])
return jsonify(status='OK',message='Incremented clicks successfully')
except Exception,e:
return jsonify(status='ERROR',message=str(e))
@app.route("/registerTime", methods=['POST'])
def registerTime():
# try:
json_data = request.json['time']
session['time'] = convert_to_seconds(json_data)
print 'clicks: ', session['clicks']
reward = {'clicks': session['clicks'], 'time': session['time']}
print reward
# Update Bandit knowledge
# !! Commented out for the Interating Bandit for the user rating system
# bandit.updateValue(session['layoutType'], reward)
return jsonify(status='OK',message='Registered time successfully')
# Register user rating
@app.route("/rating", methods=['POST'])
def rating():
rating = request.json['rating']
version = request.json['version']
bandit.updateCount(session['layoutType'])
db_ratings.Ratings.insert_one({'layout': version['layout'], 'font_size': version['fontSize'], 'colour_scheme': version['colourScheme'], 'rating': rating})
return jsonify(status='OK', message='Registered rating successfully')
# DASHBOARD functions
@app.route("/dashboard")
def dashboard():
return render_template('dashboard.html')
@app.route("/getVersions", methods=['GET'])
def getVersions():
versions = db.Clicks.find()
map_versions = []
for i, v in enumerate(versions):
map_versions.append({'title': 'Version ' + str(i + 1), 'percentage': round(v.get("percentage"), 2),'thumbnail': 'static/dashboard/images/previews/version' + str(i+1) + '.png', 'number': i})
map_versions = sorted(map_versions, key=itemgetter('percentage'), reverse=True)
# print map_versions
return jsonify(map_versions)
def generate_layout():
# get all feature combinations
versions = list(product(features[0], features[1], features[2]))
if db.Clicks.count() == 0:
for v in versions:
db.Clicks.insert_one({'layout': v[0], 'colour_scheme': v[2], 'font_size': v[1], 'count': 0, 'value': 0.0, 'clicks': 0, 'time': 0, 'percentage': 0.0})
# Register session variables
session['layoutType'] = bandit.getVersion()
layout = session['layoutType'].get('layout')
colour_scheme = session['layoutType'].get('colourScheme')
font_size = session['layoutType'].get('fontSize')
session['clicks'] = 0
session['time'] = 0
print "layout type: ", session['layoutType']
return session['layoutType']
def convert_to_seconds(time):
dif = time / 1000
return abs(dif)
if __name__ == "__main__":
app.run(host='0.0.0.0', debug=True, threaded=True)