]> rtime.felk.cvut.cz Git - hubacji1/coffee-getter.git/blob - cbdb.py
Merge branch 'release/0.3.0'
[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 getDrunkSum(self, *args, **kwargs):
60         """Return list of drunken ``flavor`` from ``dtf`` to ``dtt``.
61
62         Keyword arguments:
63         flavor -- The flavor of beverage.
64         dtf -- Date and time *from*.
65         dtt -- Date and time *to*.
66         """
67         if not ((len(args) == 3 and len(kwargs) == 0) or
68                 (len(args) == 0 and len(kwargs) == 3)):
69             raise ArgCountError("3 arguments needed: flavor, from, and to")
70         if args:
71             flavor = args[0]
72             dtf = args[1]
73             dtt = args[2]
74         elif kwargs:
75             flavor = kwargs["flavor"]
76             dtf = kwargs["dtf"]
77             dtt = kwargs["dtt"]
78         flavors = flavor.split(";")
79         que = """
80             SELECT count(*), users.name FROM coffees
81             INNER JOIN users ON coffees.id = users.id
82         """
83         for f in flavors:
84             if f is flavors[0]:
85                 que += "WHERE flavor = '{}'".format(f)
86             else:
87                 que += "OR flavor = '{}'".format(f)
88         que += """
89             AND coffees.time BETWEEN
90                 datetime('{}', 'localtime') AND
91                 datetime('{}', 'localtime')
92             GROUP BY coffees.id
93         """.format(dtf, dtt)
94         drunk = []
95         for (cnt, un) in self.cur.execute(que):
96             drunk.append((un, cnt))
97         return drunk
98
99     def getDrunkList(self, *args, **kwargs):
100         """Return dict of lists of drunken ``flavor`` from ``dtf`` to ``dtt``.
101
102         Keyword arguments:
103         flavor -- The flavor of beverage.
104         dtf -- Date and time *from*.
105         dtt -- Date and time *to*.
106         """
107         if not ((len(args) == 3 and len(kwargs) == 0) or
108                 (len(args) == 0 and len(kwargs) == 3)):
109             raise ArgCountError("3 arguments needed: flavor, from, and to")
110         if args:
111             flavor = args[0]
112             dtf = args[1]
113             dtt = args[2]
114         elif kwargs:
115             flavor = kwargs["flavor"]
116             dtf = kwargs["dtf"]
117             dtt = kwargs["dtt"]
118         flavors = flavor.split(";")
119         drunk = {}
120         for f in flavors:
121             que = """
122                 SELECT count(*), users.name FROM coffees
123                 INNER JOIN users ON coffees.id = users.id
124                 WHERE flavor = '{}'
125                 AND coffees.time BETWEEN
126                     datetime('{}', 'localtime') AND
127                     datetime('{}', 'localtime')
128                 GROUP BY coffees.id
129             """.format(f, dtf, dtt)
130             for (cnt, un) in self.cur.execute(que):
131                 if not un in drunk:
132                     drunk[un] = []
133                 drunk[un].append(cnt)
134         return drunk