]> rtime.felk.cvut.cz Git - hubacji1/coffee-getter.git/blob - cbdb.py
Update changelog
[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         que = """
79             SELECT count(*), users.name FROM coffees
80             INNER JOIN users ON coffees.id = users.id
81             WHERE flavor = '{}'
82             AND coffees.time BETWEEN
83                 datetime('{}', 'localtime') AND
84                 datetime('{}', 'localtime')
85             GROUP BY coffees.id
86         """.format(flavor, dtf, dtt)
87         drunk = []
88         for (cnt, un) in self.cur.execute(que):
89             drunk.append((un, cnt))
90         return drunk