-
Notifications
You must be signed in to change notification settings - Fork 0
/
bhg.py
executable file
·98 lines (82 loc) · 3.57 KB
/
bhg.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import argparse
from appy.pod.renderer import Renderer
from collections import namedtuple
import datetime as dt
import random
parser = argparse.ArgumentParser()
parser.add_argument("-n", "--name", required=True, help="Your first name")
parser.add_argument("-l", "--lastname", required=True, help="Your last name")
parser.add_argument("-d", "--division", required=True, help="Your division")
parser.add_argument("-b", "--begin", required=True, help="From wich date to begin (DD.MM.YYYY)")
parser.add_argument("-e", "--end", required=True, help="Stop at this date (DD.MM.YYYY)")
parser.add_argument("-i", "--input", required=True, help="Input file with activities")
parser.add_argument("-s", "--start-with", default=1, type=int, help="Start numbering with this number")
parser.add_argument("-w", "--work-hours", default=8.0, type=float, help="How many hours you work per day")
parser.add_argument("-t", "--template", required=True, help="Template file")
args = parser.parse_args()
Activity = namedtuple("Activity", "name duration weight filler")
months = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]
def parse(line):
if line.startswith("#"):
return None
items = line.rstrip().split(";")
if len(items) < 4:
return None
return Activity(
name = items[0],
duration = float(items[1]),
weight = int(items[2]),
filler = items[3] == "1")
activities = []
with open(args.input, "r") as f:
for line in f:
activity = parse(line)
if activity is not None:
activities += [activity] * activity.weight
def select_activity(activities, hours_to_fill, already_done):
l = [a for a in activities if a not in already_done and a.duration <= hours_to_fill and not a.filler]
return random.choice(l)
def select_filler(activities, hours_to_fill, already_done):
l = [a for a in activities if a not in already_done and a.duration <= hours_to_fill and a.filler]
return random.choice(l)
begin = dt.datetime.strptime(args.begin, "%d.%m.%Y")
end = dt.datetime.strptime(args.end, "%d.%m.%Y")
def save_week(begin, end, month, number, days):
renderer = Renderer(args.template, {
'days': days,
'begin': begin,
'end': end,
'month': months[month-1],
'number': number,
'name': args.name,
'year': begin.year,
'lastname': args.lastname,
'division': args.division
}, "%s-%s.odt" % (begin, end))
renderer.run()
weekdays = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag"]
def main():
week = args.start_with
days = []
for i in range((end - begin).days + 1):
day = (begin + dt.timedelta(days=i)).date()
if day.weekday() in [5,6]:
continue
hours_worked = 0
done = []
while hours_worked < args.work_hours:
activity = select_activity(activities, args.work_hours - hours_worked, done)
if activity is None:
activity = select_filler(activities, args.work_hours - hours_worked, done)
done.append(activity)
hours_worked += activity.duration
days.append({"name": weekdays[day.weekday()], "date": day.strftime("%d.%m.%Y"), "activities": done, "hours_worked": hours_worked})
if day.weekday() == 4:
week_begin = day - dt.timedelta(days=4)
save_week(week_begin, day, week_begin.month, week, days)
week += 1
days = []
if __name__ == '__main__':
main()