[Getan-commits] [PATCH 06 of 16] Allow to load one project and specific entries from the Backend

Wald Commits scm-commit at wald.intevation.org
Mon Mar 3 15:00:37 CET 2014


# HG changeset patch
# User Björn Ricks <bjoern.ricks at intevation.de>
# Date 1393853084 -3600
# Node ID b5dc92631561298ef95842aef98b5ad7a1a8ecb8
# Parent  f581752317fd9e6db32915fffdf36325731d6160
Allow to load one project and specific entries from the Backend

Add a backend method load_project to allow loading of one project from the
database. Also extend load_entries method to load only entries from a specific
year or calendar week.

diff -r f581752317fd -r b5dc92631561 getan/backend.py
--- a/getan/backend.py	Mon Mar 03 14:22:30 2014 +0100
+++ b/getan/backend.py	Mon Mar 03 14:24:44 2014 +0100
@@ -54,6 +54,17 @@
     WHERE active
 '''
 
+LOAD_ACTIVE_PROJECT = '''
+SELECT id, key, description, total
+FROM projects LEFT JOIN
+(SELECT
+    project_id,
+    sum(strftime('%s', stop_time) - strftime('%s', start_time)) AS total
+    FROM entries
+    GROUP BY project_id) ON project_id = id
+    WHERE active and key = :project_id
+'''
+
 LOAD_PROJECT_ENTRIES = '''
 SELECT
     id,
@@ -70,6 +81,64 @@
 DESC
 '''
 
+LOAD_PROJECT_ENTRIES_YEAR = '''
+SELECT
+    id,
+    project_id,
+    start_time as "[timestamp]",
+    stop_time  as "[timestamp]",
+    'no description' AS description
+FROM entries
+WHERE
+    project_id = :project_id AND
+    (description IS NULL or length(description) = 0)
+GROUP BY round(julianday(start_time))
+UNION
+SELECT
+    id,
+    project_id,
+    start_time as "[timestamp]",
+    stop_time  as "[timestamp]",
+    description
+FROM entries
+WHERE
+    project_id = :project_id AND
+    (strftime('%Y', start_time) ) = :year AND
+    description IS NOT NULL AND length(description) > 0
+'''
+
+LOAD_PROJECT_ENTRIES_WEEK = '''
+SELECT
+    id,
+    project_id,
+    start_time as "[timestamp]",
+    stop_time  as "[timestamp]",
+    'no description' AS description
+FROM entries
+WHERE
+    project_id = :project_id AND
+    (strftime('%Y', start_time) ) = :year AND
+    (description IS NULL or length(description) = 0)
+    AND (strftime('%W', start_time) = :week
+    OR strftime('%W', stop_time) = :week)
+GROUP BY round(julianday(start_time))
+UNION
+SELECT
+    id,
+    project_id,
+    start_time as "[timestamp]",
+    stop_time  as "[timestamp]",
+    description
+FROM entries
+WHERE
+    project_id = :project_id AND
+    (strftime('%Y', start_time) ) = :year AND
+    description IS NOT NULL AND length(description) > 0
+    AND (strftime('%W', start_time) = :week
+    OR strftime('%W', stop_time) = :week)
+ORDER BY start_time
+'''
+
 INSERT_PROJECT_ENTRY = '''
 INSERT INTO entries (project_id, start_time, stop_time, description)
 VALUES(?,?,?,?)
@@ -154,14 +223,47 @@
         finally:
             close(cur)
 
-    def load_entries(self, project_id):
+    def load_project(self, key):
+        logger.debug("load active projects from database.")
+        cur = None
+        try:
+            cur = self.con.cursor()
+            cur.execute(LOAD_ACTIVE_PROJECT, {"project_id": key})
+            row = cur.fetchone()
+            if not row:
+                raise InvalidProjectKeyError("Project with key %s not "
+                                             "found." % key)
+            # check key
+            if not row[1]:
+                raise InvalidProjectKeyError("Project with id %s needs "
+                                             "a key" % row[0])
+            return Project(self, *row)
+
+        finally:
+            close(cur)
+
+    def load_entries(self, project_id, year=None, week=None):
         """ Loads all entries that belong to a specific project """
         logger.debug("load entries that belong to project %s" % project_id)
         cur = None
+
+        if week and isinstance(week, int):
+            week = "%02d" % (week)
+
         try:
             cur = self.con.cursor()
-            cur.execute(LOAD_PROJECT_ENTRIES,
-                        {"project_id": project_id})
+
+            if year is None and week is None:
+                cur.execute(LOAD_PROJECT_ENTRIES,
+                            {"project_id": project_id})
+            elif week is None:
+                cur.execute(LOAD_PROJECT_ENTRIES_YEAR,
+                            {'project_id': project_id, 'year': str(year)})
+            else:
+                cur.execute(LOAD_PROJECT_ENTRIES_WEEK,
+                            {'project_id': project_id,
+                             'week': week,
+                             'year': str(year)})
 
             entries = []
             while True:


More information about the Getan-commits mailing list