]> rtime.felk.cvut.cz Git - coffee/coffee-flask.git/blob - coffee_db.py
Add support for another beverages (namely club mate)
[coffee/coffee-flask.git] / coffee_db.py
1 import sqlite3
2 import os
3
4 dbdir = os.path.dirname(__file__)
5 dbdef = os.path.join(dbdir, "coffee_db.sql")
6 dbfile = os.path.join(dbdir, "coffee.db")
7
8 def open_db():
9     conn = sqlite3.connect(dbfile)
10     c = conn.cursor()
11     return conn, c
12
13 def close_db(conn):
14     conn.commit()
15     conn.close()
16
17 def init_db():
18     conn, c = open_db()
19     with open(dbdef, "r") as f:
20         c.executescript(f.read())
21     close_db(conn)
22
23 def add_user(uid):
24     conn, c = open_db()
25     c.execute("insert or ignore into users (id) values (?)", (uid,))
26     close_db(conn)
27
28 def get_name(uid):
29     conn, c = open_db()
30     for name, in c.execute("select name from users where id = ?",(uid,)):
31         close_db(conn)
32         return name
33     close_db(conn)
34     return None
35
36
37 def name_user(uid, name):
38     conn, c = open_db()
39     c.execute("update users set name = ? where id = ?", (name, uid))
40     close_db(conn)
41
42 def list_users():
43     conn, c = open_db()
44     for row in c.execute("select * from users"):
45         print(row)
46     close_db(conn)
47
48
49 def add_coffee(uid, flavor, time=None):
50     conn, c = open_db()
51     if time is None:
52         c.execute("insert into coffees (id, flavor) values (?,?)", (uid,flavor))
53     else:
54         c.execute("insert or ignore into coffees (id, flavor, time) values (?,?,?)", (uid, flavor, time))
55     close_db(conn)
56
57 def flavors():
58     conn, c = open_db()
59     res = list(c.execute("select distinct name, ord from flavors"))
60     close_db(conn)
61     return res
62
63 def coffee_flavors(uid=None, days=0, start=0):
64     """Returns flavor statistics for team/user during selected period/since beginning.
65
66     days -- number of days for computation
67     start -- shift size from the current time
68
69     When 'days' is not given or 0 return statistics since the beginning.
70
71     e.g. (7, 7) returns statistics for 7 days, 7 days ago.
72     """
73
74     conn, c = open_db()
75
76     query = ""
77     variables = list()
78
79     if days is not None and days != 0:
80         query += " where date(time) between date('now', 'localtime', '-"+ str(days+start-1) +" days') and date('now', 'localtime', '-"+ str(start) +" days')"
81
82         if uid is not None:
83             query += " and id = ?"
84             variables.append(uid)
85     elif uid is not None:
86         query += " where id = ?"
87         variables.append(uid)
88
89     res = list(c.execute("""
90         select f.name, count(c.flavor) from flavors f
91         left join (select * from coffees
92         """+query+""") c
93         on f.name=c.flavor group by f.name
94         order by f.ord asc
95         """, variables))
96
97     close_db(conn)
98     return res
99
100 def coffee_history(uid=None):
101     conn, c = open_db()
102
103     if uid is None:
104         res = list(c.execute("""
105             select strftime('%s', ds.d),count(c.flavor),c.flavor from
106             (select num,date('now', 'localtime', -num || ' days') as d from days) ds
107             left join
108             (select time,flavor from coffees) c
109             on d = date(c.time) group by d, c.flavor
110             """))
111     else:
112         res = list(c.execute(
113             """
114             select strftime('%s', ds.d),count(c.flavor),c.flavor from
115             (select num,date('now', 'localtime', -num || ' days') as d from days) ds
116             left join
117             (select date(time, 'localtime') as time,flavor from coffees where id = ?) c
118             on d = date(c.time) group by d, c.flavor
119             """
120             , (uid,)))
121
122     close_db(conn)
123     return res
124
125 def coffee_count(uid=None, start=None, stop=None):
126     conn, c = open_db()
127
128     args = []
129     clauses = []
130
131     if uid is not None:
132         clauses.append("id = ?")
133         args.append(uid)
134
135     if start is not None:
136         clauses.append("date(time, 'localtime') >= date('now', 'localtime', '-%d days')" % int(start))
137
138     if stop is not None:
139         clauses.append("date(time, 'localtime') <= date('now', 'localtime', '-%d days')" % int(stop))
140
141     for count, in c.execute(
142             "select count(*) from coffees where " +
143             " and ".join(clauses)
144             , args):
145         res = count
146
147     if not res:
148         res = "0"
149
150     return res