Mercurial > getan > getan
annotate getan/template.py @ 372:a805aaed97dd
Add current date to getan template context
author | Björn Ricks <bjoern.ricks@intevation.de> |
---|---|
date | Mon, 10 Mar 2014 09:23:08 +0100 |
parents | f4dcfbede99b |
children | 9a0dba03d16c |
rev | line source |
---|---|
356
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
1 # -*- coding: utf-8 -*- |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
2 # |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
3 # (c) 2014 by Björn Ricks <bjoern.ricks@intevation.de> |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
4 # |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
5 # This is Free Software licensed under the terms of GPLv3 or later. |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
6 # For details see LICENSE coming with the source of 'getan'. |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
7 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
8 import os.path |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
9 import sys |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
10 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
11 from datetime import date, datetime, timedelta |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
12 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
13 from jinja2 import Environment, ChoiceLoader, FileSystemLoader, PackageLoader |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
14 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
15 from getan.backend import Backend, DEFAULT_DATABASE |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
16 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
17 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
18 def human_time(delta): |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
19 days = delta.days |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
20 seconds = days * 3600 * 24 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
21 s = seconds + delta.seconds |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
22 h = s / 3600 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
23 m = (s % 3600) / 60 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
24 if (s % 60) >= 30: |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
25 m += 1 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
26 if m == 60: |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
27 m = 0 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
28 h += 1 |
370
f4dcfbede99b
Move justification of human_time to templates (only for zeiterfassung)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
360
diff
changeset
|
29 return "%d:%02d" % (h, m) |
356
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
30 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
31 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
32 def date_format(d): |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
33 return d.strftime("%d.%m.%Y") |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
34 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
35 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
36 def total_time(projects): |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
37 total = timedelta(0) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
38 for proj in projects: |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
39 total += proj.get_total_duration() |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
40 return total |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
41 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
42 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
43 def unix_week(week, year=None): |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
44 """Convert iso week to unix week |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
45 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
46 For unix week see man date "%W" |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
47 Args: |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
48 week: Week number as int to convert |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
49 year: Year as int. If year is none the current year is used. |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
50 """ |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
51 if not year: |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
52 year = datetime.now().year |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
53 firstday = date(year, 1, 4) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
54 isoweek = firstday.isocalendar()[1] |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
55 unixweek = int(firstday.strftime("%W")) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
56 diff = isoweek - unixweek |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
57 return week - diff |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
58 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
59 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
60 def render(template, database=None, year=None, week=None, project=None, |
360
1b190fa27482
Allow to render only projects with entries in templates
Björn Ricks <bjoern.ricks@intevation.de>
parents:
356
diff
changeset
|
61 user=None, empty_projects=True): |
356
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
62 if not user: |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
63 user = os.getenv("USER") |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
64 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
65 if not database: |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
66 if os.path.isfile(DEFAULT_DATABASE): |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
67 database = os.path.abspath(DEFAULT_DATABASE) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
68 else: |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
69 database = os.path.expanduser(os.path.join("~", ".getan", |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
70 DEFAULT_DATABASE)) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
71 if not os.path.isfile(database): |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
72 print >> sys.stderr, "'%s' does not exist or is not a file." % database |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
73 sys.exit(1) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
74 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
75 u_week = None |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
76 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
77 c_year = int(date.today().strftime("%Y")) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
78 c_week = datetime.now().isocalendar()[1] |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
79 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
80 if week is not None and year is None: |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
81 year = c_year |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
82 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
83 if not os.path.isfile(database): |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
84 print >> sys.stderr, "'%s' does not exist or is not a file." % database |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
85 sys.exit(1) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
86 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
87 loader = ChoiceLoader([FileSystemLoader(os.path.expanduser(os.path.join( |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
88 "~", ".getan", "templates"))), |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
89 PackageLoader("getan")]) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
90 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
91 env = Environment(loader=loader) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
92 env.filters["human_time"] = human_time |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
93 env.filters["date_format"] = date_format |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
94 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
95 template_name = template or "wochenbericht" |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
96 template = env.get_template(template_name) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
97 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
98 backend = Backend(database) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
99 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
100 if not project: |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
101 projects = backend.load_projects() |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
102 else: |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
103 project = backend.load_project(project) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
104 projects = [project] |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
105 |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
106 if year is not None or week is not None: |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
107 u_week = "%02d" % unix_week(week, year) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
108 for project in projects: |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
109 project.load_entries(year, u_week) |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
110 |
360
1b190fa27482
Allow to render only projects with entries in templates
Björn Ricks <bjoern.ricks@intevation.de>
parents:
356
diff
changeset
|
111 if not empty_projects: |
1b190fa27482
Allow to render only projects with entries in templates
Björn Ricks <bjoern.ricks@intevation.de>
parents:
356
diff
changeset
|
112 projects = [project for project in projects if project.entries] |
1b190fa27482
Allow to render only projects with entries in templates
Björn Ricks <bjoern.ricks@intevation.de>
parents:
356
diff
changeset
|
113 |
356
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
114 context = dict() |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
115 context["project"] = project |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
116 context["projects"] = projects |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
117 context["user"] = user |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
118 context["database"] = database |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
119 context["year"] = year |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
120 context["week"] = week |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
121 context["current_week"] = c_week |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
122 context["current_year"] = c_year |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
123 context["unix_week"] = u_week |
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
124 context["total_time"] = total_time(projects) |
372
a805aaed97dd
Add current date to getan template context
Björn Ricks <bjoern.ricks@intevation.de>
parents:
370
diff
changeset
|
125 context["today"] = date.today() |
356
45d97d47a9fe
Add a template module to getan
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
126 return template.render(context) |