]> rtime.felk.cvut.cz Git - hubacji1/coffee-getter.git/commitdiff
Merge branch 'feature/drunk-list'
authorJiri Vlasak <hubacji1@fel.cvut.cz>
Thu, 4 Apr 2019 06:18:01 +0000 (08:18 +0200)
committerJiri Vlasak <hubacji1@fel.cvut.cz>
Thu, 4 Apr 2019 06:18:01 +0000 (08:18 +0200)
CHANGELOG.md
cbdb.py
cbgetter.py
run/drunk_sum.py
ut/test_db.py
ut/test_getter.py

index 3a47cd6d011897a1d8e659ba84bb088dabf00c92..75df2043a61cad452381a1ef9a8d25540a9217af 100644 (file)
@@ -11,6 +11,7 @@ The format is based on [Keep a Changelog][] and this project adheres to
 ### Added
 - Support for multiple drinks in `drunk_sum` runnable.
 - Sum all the coffees by one command.
+- Get drunk sums of some *flavors* in specified time period as list.
 
 ## 0.2.1 - 2019-04-03
 ### Fixed
diff --git a/cbdb.py b/cbdb.py
index 9cf9f7ca878c44a3e9553521af63c063fcd8eb58..c4741e059ed1a98ebbc6eefdd5e42fb9554519da 100644 (file)
--- a/cbdb.py
+++ b/cbdb.py
@@ -95,3 +95,40 @@ class Db:
         for (cnt, un) in self.cur.execute(que):
             drunk.append((un, cnt))
         return drunk
+
+    def getDrunkList(self, *args, **kwargs):
+        """Return dict of lists of drunken ``flavor`` from ``dtf`` to ``dtt``.
+
+        Keyword arguments:
+        flavor -- The flavor of beverage.
+        dtf -- Date and time *from*.
+        dtt -- Date and time *to*.
+        """
+        if not ((len(args) == 3 and len(kwargs) == 0) or
+                (len(args) == 0 and len(kwargs) == 3)):
+            raise ArgCountError("3 arguments needed: flavor, from, and to")
+        if args:
+            flavor = args[0]
+            dtf = args[1]
+            dtt = args[2]
+        elif kwargs:
+            flavor = kwargs["flavor"]
+            dtf = kwargs["dtf"]
+            dtt = kwargs["dtt"]
+        flavors = flavor.split(";")
+        drunk = {}
+        for f in flavors:
+            que = """
+                SELECT count(*), users.name FROM coffees
+                INNER JOIN users ON coffees.id = users.id
+                WHERE flavor = '{}'
+                AND coffees.time BETWEEN
+                    datetime('{}', 'localtime') AND
+                    datetime('{}', 'localtime')
+                GROUP BY coffees.id
+            """.format(f, dtf, dtt)
+            for (cnt, un) in self.cur.execute(que):
+                if not un in drunk:
+                    drunk[un] = []
+                drunk[un].append(cnt)
+        return drunk
index fce31bfc2bb01cbd4bd6ba17cdeab6230bcac9de..b837f8910c817c487fa96180628b24186075fe6f 100644 (file)
@@ -131,3 +131,30 @@ class CoffeebotGetter:
             self.msg += "{}: {}\n".format(un, cnt)
         self.msg += "---"
         return
+
+    def loadDrunkList(self, *args, **kwargs):
+        """Get list of drunken ``flavor`` from ``dtf`` to ``dtt``, update msg.
+
+        Keyword arguments:
+        flavor -- The flavor of beverage.
+        dtf -- Date and time *from*.
+        dtt -- Date and time *to*.
+        """
+        self.top = self.db.getDrunkSum(*args, **kwargs)
+        d = self.db.getDrunkList(*args, **kwargs)
+        if args:
+            flavor = args[0]
+            dtf = args[1]
+            dtt = args[2]
+        elif kwargs:
+            flavor = kwargs["flavor"]
+            dtf = kwargs["dtf"]
+            dtt = kwargs["dtt"]
+        self.msg = "{} drunk from {} to {}:\n".format(flavor, dtf, dtt)
+        for (un, l) in d.items():
+            self.msg += "{}: ".format(un)
+            for cnt in l[:-1]:
+                self.msg += "{}, ".format(cnt)
+            self.msg += "{}\n".format(l[-1])
+        self.msg += "---"
+        return
index ef683fcd249f75b934e61f830cbf3c43b1afa9de..44da8e737aecb37931dbf740d6e995fa35f72e67 100755 (executable)
@@ -23,7 +23,9 @@ if __name__ == "__main__":
         ))
         exit(1)
     g = CoffeebotGetter()
-    if argv[1] in SS:
+    if ";" in argv[1]:
+        g.loadDrunkList(argv[1], argv[2], argv[3])
+    elif argv[1] in SS:
         g.loadDrunkSum(SS[argv[1]], argv[2], argv[3])
     else:
         g.loadDrunkSum(argv[1], argv[2], argv[3])
index 17dc3e925758ed9f24c517414c0e447659979712..f059c2ba0a1184a7662360e9c0b776d26f976012 100644 (file)
@@ -75,6 +75,7 @@ INSERT INTO coffees (id, flavor, time) VALUES
 ('3333', 'espresso lungo', datetime('now', 'localtime', '-99 seconds')),
 ('3333', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-99 seconds')),
 ('3333', 'espresso lungo', datetime('now', 'localtime', '-95 second')),
+('3333', 'Club-Mate 0,5 l', datetime('now', 'localtime', '-95 second')),
 ('3333', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-95 second'));
     """)
     con.close()
@@ -113,8 +114,8 @@ class TopMateDrinkers(TestCase):
                 top,
                 [
                     ("tester", 4*0.5 + 4*0.33),
+                    ("clone", 0.5 + 2*0.33),
                     ("newer", 2*0.33),
-                    ("clone", 2*0.33),
                 ]
             )
         finally:
@@ -211,6 +212,7 @@ class DrunkSum(TestCase):
             drunk = db.getDrunkSum("Club-Mate 0,5 l", self.lwstr, self.tdystr)
             self.assertEqual(drunk, [
                 ("tester", 4),
+                ("clone", 1),
             ])
         finally:
             delete_test_db(TESTDB_FILENAME)
@@ -243,7 +245,24 @@ class DrunkSum(TestCase):
             self.assertEqual(drunk, [
                 ("tester", 8),
                 ("newer", 2),
-                ("clone", 2),
+                ("clone", 3),
             ])
         finally:
             delete_test_db(TESTDB_FILENAME)
+
+    def test_all_mate_list(self):
+        create_test_db(TESTDB_FILENAME)
+        try:
+            db = Db(TESTDB_FILENAME)
+            drunk = db.getDrunkList(
+                "Club-Mate 0,5 l;Club-Mate 0,33 l",
+                self.lwstr,
+                self.tdystr
+            )
+            self.assertEqual(drunk, {
+                "tester": [4, 4],
+                "newer": [2],
+                "clone": [1, 2],
+            })
+        finally:
+            delete_test_db(TESTDB_FILENAME)
index 1d61f7d5193a9710e293ec27fb030a5295abb1c0..0324dabfcd39648f36e2b8a6a7371a3ed7c051a1 100644 (file)
@@ -86,3 +86,19 @@ class DrunkSum(TestCase):
             g.loadDrunkSum,
             ["espresso", "lungo", "2010-10-20", "2020-10-20"]
         )
+
+class DrunkList(TestCase):
+    def test_nof_args(self):
+        g = CoffeebotGetter()
+        self.assertRaises(ArgCountError, g.loadDrunkList)
+        self.assertRaises(ArgCountError, g.loadDrunkList, ["espresso"])
+        self.assertRaises(
+            ArgCountError,
+            g.loadDrunkList,
+            ["espresso", "2010-10-20"]
+        )
+        self.assertRaises(
+            ArgCountError,
+            g.loadDrunkList,
+            ["espresso", "lungo", "2010-10-20", "2020-10-20"]
+        )