changeset 356:45d97d47a9fe

Add a template module to getan The module will use jinja2 to render different getan evaluations. Finally this will replace the zeiterfassung.py, getan-eval.py and other hardcoded script content.
author Björn Ricks <bjoern.ricks@intevation.de>
date Mon, 03 Mar 2014 14:30:44 +0100
parents bc12acbff143
children f13dc9fd62d5
files getan/template.py
diffstat 1 files changed, 122 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/getan/template.py	Mon Mar 03 14:30:44 2014 +0100
@@ -0,0 +1,122 @@
+# -*- coding: utf-8 -*-
+#
+# (c) 2014 by Björn Ricks <bjoern.ricks@intevation.de>
+#
+# This is Free Software licensed under the terms of GPLv3 or later.
+# For details see LICENSE coming with the source of 'getan'.
+
+import os.path
+import sys
+
+from datetime import date, datetime, timedelta
+
+from jinja2 import Environment, ChoiceLoader, FileSystemLoader, PackageLoader
+
+from getan.backend import Backend, DEFAULT_DATABASE
+
+
+def human_time(delta):
+    days = delta.days
+    seconds = days * 3600 * 24
+    s = seconds + delta.seconds
+    h = s / 3600
+    m = (s % 3600) / 60
+    if (s % 60) >= 30:
+        m += 1
+        if m == 60:
+            m = 0
+            h += 1
+    return "%2d:%02d" % (h, m)
+
+
+def date_format(d):
+    return d.strftime("%d.%m.%Y")
+
+
+def total_time(projects):
+    total = timedelta(0)
+    for proj in projects:
+        total += proj.get_total_duration()
+    return total
+
+
+def unix_week(week, year=None):
+    """Convert iso week to unix week
+
+    For unix week see man date "%W"
+    Args:
+        week: Week number as int to convert
+        year: Year as int. If year is none the current year is used.
+    """
+    if not year:
+        year = datetime.now().year
+    firstday = date(year, 1, 4)
+    isoweek = firstday.isocalendar()[1]
+    unixweek = int(firstday.strftime("%W"))
+    diff = isoweek - unixweek
+    return week - diff
+
+
+def render(template, database=None, year=None, week=None, project=None,
+           user=None):
+    if not user:
+        user = os.getenv("USER")
+
+    if not database:
+        if os.path.isfile(DEFAULT_DATABASE):
+            database = os.path.abspath(DEFAULT_DATABASE)
+        else:
+            database = os.path.expanduser(os.path.join("~", ".getan",
+                                                       DEFAULT_DATABASE))
+    if not os.path.isfile(database):
+        print >> sys.stderr, "'%s' does not exist or is not a file." % database
+        sys.exit(1)
+
+    u_week = None
+
+    c_year = int(date.today().strftime("%Y"))
+    c_week = datetime.now().isocalendar()[1]
+
+    if week is not None and year is None:
+        year = c_year
+
+    if not os.path.isfile(database):
+        print >> sys.stderr, "'%s' does not exist or is not a file." % database
+        sys.exit(1)
+
+    loader = ChoiceLoader([FileSystemLoader(os.path.expanduser(os.path.join(
+        "~", ".getan", "templates"))),
+        PackageLoader("getan")])
+
+    env = Environment(loader=loader)
+    env.filters["human_time"] = human_time
+    env.filters["date_format"] = date_format
+
+    template_name = template or "wochenbericht"
+    template = env.get_template(template_name)
+
+    backend = Backend(database)
+
+    if not project:
+        projects = backend.load_projects()
+    else:
+        project = backend.load_project(project)
+        projects = [project]
+
+    if year is not None or week is not None:
+        u_week = "%02d" % unix_week(week, year)
+        for project in projects:
+            project.load_entries(year, u_week)
+
+    context = dict()
+    context["project"] = project
+    context["projects"] = projects
+    context["user"] = user
+    context["database"] = database
+    context["year"] = year
+    context["week"] = week
+    context["current_week"] = c_week
+    context["current_year"] = c_year
+    context["unix_week"] = u_week
+    context["total_time"] = total_time(projects)
+    return template.render(context)
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)