Support for "human" days



Hi,

I've discussed the possibility of using a more "human" definition of
days (wake up time 'till bed time) instead of midnight to midnight.
This involves letting the user pick an hour and thus let him treat
late night activity to be "yesterday".

Initial patch is attached so you can try this out. It removes some
ugly activity splitting logic, some heuristics and seems to work
pretty nice so far ;)

-- 
Patryk Zawadzki
From b98ac33e98600730f55e0633a769700c64f53ff8 Mon Sep 17 00:00:00 2001
From: Patryk Zawadzki <patrys pld-linux org>
Date: Tue, 2 Jun 2009 19:41:12 +0200
Subject: [PATCH] Initial support for human days

---
 hamster/db.py    |   65 ++++++++++--------------------------------------------
 hamster/stats.py |    4 +-
 2 files changed, 14 insertions(+), 55 deletions(-)

diff --git a/hamster/db.py b/hamster/db.py
index b430894..a732406 100644
--- a/hamster/db.py
+++ b/hamster/db.py
@@ -356,13 +356,17 @@ class Storage(hamster.storage.Storage):
                      FROM facts a
                 LEFT JOIN activities b ON a.activity_id = b.id
                 LEFT JOIN categories c on b.category_id = c.id
-                    WHERE (date(a.start_time) >= ? and date(a.start_time) <= ?)
-                       OR (date(a.end_time) >= ? and date(a.end_time) <= ?)
+                    WHERE a.start_time >= ? and a.start_time <= ?
                  ORDER BY a.start_time
         """
         end_date = end_date or date
+
+        #FIXME: add preference to set that
+        split_time = dt.time(5, 30)
+        datetime_from = dt.datetime.combine(date, split_time)
+        datetime_to = dt.datetime.combine(end_date, split_time) + dt.timedelta(days = 1)
         
-        facts = self.fetchall(query, (_("Unsorted"), date, end_date, date, end_date))
+        facts = self.fetchall(query, (_("Unsorted"), datetime_from, datetime_to))
         res = []
 
         today = dt.date.today()
@@ -376,28 +380,9 @@ class Storage(hamster.storage.Storage):
                                    or abs(end_date-today).days < 2:
             last_activity = self.__get_last_activity()
 
-        # deal with late-night workers!
-        if not facts and date == today:
-            # no facts today?! let's get last fact of yesterday
-            if last_activity:
-                # last fact has not finished, we think that it is still ongoing
-                f = dict(
-                    id = last_activity["id"],
-                    start_time = dt.datetime.combine(date, dt.time(0,0)),
-                    end_time = now,
-                    description = last_activity["description"],
-                    name = last_activity["name"],
-                    activity_id = last_activity["activity_id"],
-                    category = last_activity["category"],
-                    category_id = last_activity["category_id"],
-                    delta = now - dt.datetime.combine(date, dt.time(0,0))
-                )
-            
-                return [f]
-
-
         for fact in facts:
-            fact_start_date = fact["start_time"].date()
+            fact_start_date = fact["start_time"].date() \
+                + dt.timedelta(-1 if fact["start_time"].time() < split_time else 0)
             if fact["end_time"]:
                 fact_end_date = fact["end_time"].date()
             else:
@@ -406,6 +391,7 @@ class Storage(hamster.storage.Storage):
             f = dict(
                 id = fact["id"],
                 start_time = fact["start_time"],
+                date = fact_start_date,
                 end_time = fact["end_time"],
                 description = fact["description"],
                 name = fact["name"],
@@ -415,40 +401,13 @@ class Storage(hamster.storage.Storage):
             )
             
             if not fact_end_date:
-                if fact_start_date == today and fact["start_time"] < now:
+                if f["id"] == last_activity["id"] and fact["start_time"] < now:
                     # today, present
-                    f["delta"] = now -  fact["start_time"]
-                elif last_activity and fact_start_date == yesterday and f["id"] == last_activity["id"]:
-                    # last fact and it is in yesterday - split it!
-                    #first yesterday until midnight
-                    f["end_time"] = dt.datetime.combine(today, dt.time(0,0))
-                    f["delta"] = f["end_time"] - f["start_time"]
-                    res.append(f)
-                    
-                    #and now today until now
-                    f = copy.copy(f)
-                    f["start_time"] = dt.datetime.combine(today, dt.time(0, 0))
-                    f["end_time"] = now
-                    f["delta"] = f["end_time"] - f["start_time"]
+                    f["delta"] = now - fact["start_time"]
                 else:
                     f["delta"] = None
 
                 res.append(f)
-            elif fact_start_date != fact_end_date:
-                # check if maybe we have to split activity in two
-                if date <= fact["start_time"].date()  <= end_date:
-                    start_fact = copy.copy(f)
-                    start_fact["end_time"] = dt.datetime.combine(f["end_time"],
-                                                                 dt.time(0, 0))
-                    start_fact["delta"] = start_fact["end_time"] - start_fact["start_time"]
-                    res.append(start_fact)
-
-                if date <= fact["end_time"].date()  <= end_date:
-                    end_fact = copy.copy(f)
-                    end_fact["start_time"] = dt.datetime.combine(f["end_time"],
-                                                                 dt.time(0, 0))
-                    end_fact["delta"] = end_fact["end_time"] - end_fact["start_time"]
-                    res.append(end_fact)
             else:
                 #else is we have end date and it is the same date
                 f["delta"] = fact["end_time"] - fact["start_time"]
diff --git a/hamster/stats.py b/hamster/stats.py
index f96077a..755a348 100644
--- a/hamster/stats.py
+++ b/hamster/stats.py
@@ -247,7 +247,7 @@ class StatsViewer(object):
                 
 
         for fact in facts:
-            start_date = fact["start_time"].date()
+            start_date = fact["date"]
 
             duration = None
             if fact["delta"]:
@@ -302,7 +302,7 @@ class StatsViewer(object):
         #now we do the counting
         for fact in facts:
             duration = None
-            start_date = fact['start_time'].date()
+            start_date = fact['date']
             
             if fact["end_time"]: # not set if just started
                 delta = fact["end_time"] - fact["start_time"]
-- 
1.6.3.1



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]