# HG changeset patch # User Björn Ricks # Date 1393853444 -3600 # Node ID 45d97d47a9fe1fe6f9fdcb4e2f73b0cd854ddfa7 # Parent bc12acbff1436e036d3b4ceaebe49361de17d60a 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. diff -r bc12acbff143 -r 45d97d47a9fe getan/template.py --- /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 +# +# 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)