]> rtime.felk.cvut.cz Git - hubacji1/coffee-getter.git/blob - cbdb.py
Add top drinks ut
[hubacji1/coffee-getter.git] / cbdb.py
1 # -*- coding: utf-8 -*-
2 """Database access."""
3 from sqlite3 import connect
4
5 class FileNotSetError(ValueError):
6     pass
7
8 class ArgCountError(ValueError):
9     pass
10
11 class Db:
12     def __init__(self, dbpath=False):
13         if dbpath:
14             self.con = connect(dbpath)
15         else:
16             self.con = None
17             raise FileNotSetError("Database file must be set")
18         self.cur = self.con.cursor()
19         return None
20
21     def __del__(self):
22         if self.con:
23             self.con.close()
24
25     def getTopMateDrinkers(self):
26         """Return list of pairs of name, count for Mate drinkers."""
27         users = {}
28         que = """
29             SELECT count(*), users.name FROM coffees
30             INNER JOIN users ON coffees.id = users.id
31             WHERE flavor = 'Club-Mate 0,5 l'
32             AND coffees.time BETWEEN
33                 datetime('now', 'localtime', '-7 days') AND
34                 datetime('now', 'localtime')
35             GROUP BY coffees.id
36         """
37         for (cnt, un) in self.cur.execute(que):
38             users[un] = cnt * 0.5
39         que = """
40             SELECT count(*), users.name FROM coffees
41             INNER JOIN users ON coffees.id = users.id
42             WHERE flavor = 'Club-Mate 0,33 l'
43             AND coffees.time BETWEEN
44                 datetime('now', 'localtime', '-7 days') AND
45                 datetime('now', 'localtime')
46             GROUP BY coffees.id
47         """
48         for (cnt, un) in self.cur.execute(que):
49             if un in users:
50                 users[un] += cnt * 0.33
51             else:
52                 users[un] = cnt * 0.33
53         top = []
54         for (un, cnt) in users.items():
55             top.append((un, cnt))
56         top.sort(key=lambda x: (x[1], x[0]), reverse=True)
57         return top
58
59     def get_top_tea_drinkers(self):
60         """Return list of pairs of name, count for tea drinkers."""
61         q = """
62
63         SELECT count(*), users.name FROM coffees
64         INNER JOIN users ON coffees.id = users.id
65         WHERE flavor = 'tea'
66         AND coffees.time BETWEEN
67             datetime('now', 'localtime', '-7 days') AND
68             datetime('now', 'localtime')
69         GROUP BY coffees.id
70
71         """
72         top = []
73         for (cnt, un) in self.cur.execute(q):
74             top.append((un, cnt))
75         top.sort(key=lambda x: (x[1], x[0]), reverse=True)
76         return top
77
78     def getDrunkSum(self, *args, **kwargs):
79         """Return list of drunken ``flavor`` from ``dtf`` to ``dtt``.
80
81         Keyword arguments:
82         flavor -- The flavor of beverage.
83         dtf -- Date and time *from*.
84         dtt -- Date and time *to*.
85         """
86         if not ((len(args) == 3 and len(kwargs) == 0) or
87                 (len(args) == 0 and len(kwargs) == 3)):
88             raise ArgCountError("3 arguments needed: flavor, from, and to")
89         if args:
90             flavor = args[0]
91             dtf = args[1]
92             dtt = args[2]
93         elif kwargs:
94             flavor = kwargs["flavor"]
95             dtf = kwargs["dtf"]
96             dtt = kwargs["dtt"]
97         flavors = flavor.split(";")
98         que = """
99             SELECT count(*), users.name FROM coffees
100             INNER JOIN users ON coffees.id = users.id
101         """
102         for f in flavors:
103             if f is flavors[0]:
104                 que += "WHERE flavor = '{}'".format(f)
105             else:
106                 que += "OR flavor = '{}'".format(f)
107         que += """
108             AND coffees.time BETWEEN
109                 datetime('{}', 'localtime') AND
110                 datetime('{}', 'localtime')
111             GROUP BY coffees.id
112         """.format(dtf, dtt)
113         drunk = []
114         for (cnt, un) in self.cur.execute(que):
115             drunk.append((un, cnt))
116         return drunk
117
118     def getDrunkList(self, *args, **kwargs):
119         """Return dict of lists of drunken ``flavor`` from ``dtf`` to ``dtt``.
120
121         Keyword arguments:
122         flavor -- The flavor of beverage.
123         dtf -- Date and time *from*.
124         dtt -- Date and time *to*.
125         """
126         if not ((len(args) == 3 and len(kwargs) == 0) or
127                 (len(args) == 0 and len(kwargs) == 3)):
128             raise ArgCountError("3 arguments needed: flavor, from, and to")
129         if args:
130             flavor = args[0]
131             dtf = args[1]
132             dtt = args[2]
133         elif kwargs:
134             flavor = kwargs["flavor"]
135             dtf = kwargs["dtf"]
136             dtt = kwargs["dtt"]
137         flavors = flavor.split(";")
138         drunk = {}
139         i = 0
140         for f in flavors:
141             que = """
142                 SELECT count(*), users.name FROM coffees
143                 INNER JOIN users ON coffees.id = users.id
144                 WHERE flavor = '{}'
145                 AND coffees.time BETWEEN
146                     datetime('{}', 'localtime') AND
147                     datetime('{}', 'localtime')
148                 GROUP BY coffees.id
149             """.format(f, dtf, dtt)
150             for (cnt, un) in self.cur.execute(que):
151                 if not un in drunk:
152                     drunk[un] = [0 for j in range(i)]
153                 drunk[un].append(cnt)
154             i += 1
155         return drunk