Mercurial > getan > getan
view getan/template.py @ 389:9a0dba03d16c
Add list of all entries to the template context
This allows to render output for entries without having to iterate over the
projects.
author | Björn Ricks <bjoern.ricks@intevation.de> |
---|---|
date | Mon, 26 Jan 2015 14:08:44 +0100 |
parents | a805aaed97dd |
children | cc56bc1fd56b |
line wrap: on
line source
# -*- 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 "%d:%02d" % (h, m) def date_format(d): return d.strftime("%d.%m.%Y") def duration(entries): total = timedelta(0) for entry in entries: total += entry.get_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, empty_projects=True): 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 env.filters["duration"] = duration 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) if not empty_projects: projects = [project for project in projects if project.entries] entries = [] for project in projects: entries.extend(project.entries) context = dict() context["entries"] = entries 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"] = duration(entries) context["today"] = date.today() return template.render(context)