]> rtime.felk.cvut.cz Git - coffee/coffee-flask.git/blob - app.py
Plot x axis labels in local variable
[coffee/coffee-flask.git] / app.py
1 from flask import Flask, render_template, send_file, request, session, redirect, url_for, make_response
2 from flask_cors import CORS
3
4 import numpy as np
5 import matplotlib
6 matplotlib.use('Agg')
7 import matplotlib.pyplot as plt
8 from io import BytesIO
9
10 import coffee_db as db
11 import time
12 from datetime import date, timedelta
13
14 db.init_db()
15 app = Flask(__name__)
16 CORS(app, supports_credentials=True)
17 app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
18
19 @app.route('/')
20 def hello():
21     if "uid" in session:
22         uid = session["uid"];
23         return render_template('hello.html', name=db.get_name(uid))
24     return render_template('hello.html')
25
26 @app.route('/login', methods=["POST"])
27 @app.route('/login/<uid>')
28 def login(uid=None):
29     if request.method == "POST":
30         uid = request.data.decode("utf-8")
31     if uid is not None:
32         db.add_user(uid)
33         session["uid"] = uid;
34     return redirect(url_for('user'))
35
36 @app.route('/logout')
37 def logout():
38     session.pop('uid', None)
39     return redirect(url_for('user'))
40
41 @app.route('/user')
42 def user():
43     if "uid" in session:
44         uid = session["uid"];
45         return render_template('user.html',
46                 name=db.get_name(uid),
47                 flavors=db.flavors(),
48                 count=db.coffee_count(uid, 0),
49                 stamp=time.time()
50                 )
51     return render_template('user.html')
52
53 @app.route('/user/rename')
54 def user_rename():
55     name = request.args.get("name")
56     if name and "uid" in session:
57         uid = session["uid"];
58         db.name_user(uid, name)
59     return redirect(url_for('user'))
60
61 @app.route("/coffee/graph_flavors")
62 def coffee_graph_flavors():
63     b = BytesIO()
64     if "uid" in session:
65         uid = session["uid"]
66         flavors, counts = zip(*db.coffee_flavors(uid))
67     else:
68         flavors, counts = zip(*db.coffee_flavors())
69     fig = plt.figure(figsize=(3,3))
70     ax = fig.add_subplot(111)
71     ax.set_aspect(1)
72     ax.pie(counts)
73     ax.legend(flavors)
74     ax.set_title("Your taste")
75     fig.savefig(b, format="svg", bbox_inches="tight")
76     b.seek(0)
77     return send_file(b, mimetype="image/svg+xml")
78
79 @app.route("/coffee/graph_history")
80 def coffee_graph_history():
81     b = BytesIO()
82     if "uid" in session:
83         uid = session["uid"]
84         hist = db.coffee_history(uid)
85     else:
86         hist = db.coffee_history()
87     if hist == []:
88         days = tuple()
89         counts = tuple()
90     else:
91         days, counts = zip(*hist)
92     fig = plt.figure(figsize=(4,3))
93     ax = fig.add_subplot(111)
94     xdays = [i.strftime("%a") for i in [
95         date.today() - timedelta(j - 1) for j in
96         range(len(days), 0, -1)]]
97     xdays[-1] = "TDY"
98     xdays[-2] = "YDA"
99     ax.set_xticks(range(len(days)))
100     ax.set_xticklabels(xdays)
101     ax.bar(range(len(days)), counts)
102     ax.set_title("Your week")
103     fig.savefig(b, format="svg", bbox_inches="tight")
104     b.seek(0)
105     plt.close(fig)
106     return send_file(b, mimetype="image/svg+xml")
107
108 @app.route("/coffee/add", methods=["POST"])
109 def coffee_add():
110     if request.method == "POST":
111         json = request.json
112         if json and "uid" in session:
113             db.add_coffee(session["uid"], json["flavor"], json["time"])
114     return redirect(url_for('user'))
115
116 @app.route("/coffee/count")
117 def coffee_count():
118     start = request.args.get("start")
119     stop = request.args.get("stop")
120     return str(db.coffee_count(session.get("uid"), start, stop))
121
122 @app.route('/js')
123 def js():
124     response = make_response(render_template('main.js'))
125     response.headers['Content-Type'] = "text/javascript"
126     return response
127
128 @app.route("/log", methods=["POST"])
129 def log():
130     if request.method == "POST":
131         data = request.data.decode("utf-8")
132         print(data)
133         return data
134     return "nope"