~mgedmin/gtimelog/ehabkost-integration

« back to all changes in this revision

Viewing changes to scripts/today.py

  • Committer: mg
  • Date: 2008-04-22 16:43:53 UTC
  • Revision ID: svn-v4:097e82c0-97e3-0310-a93d-98bb3a55b02b::90
Restructure the source tree: move everything essential into src/ and everything
obsolete into scripts/.  Make 'python setup.py test' run the test-suite.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/python
 
2
 
 
3
import re
 
4
import os
 
5
import sys
 
6
import getopt
 
7
import datetime
 
8
 
 
9
def read_timelog(filename):
 
10
    return file(filename)
 
11
 
 
12
def todays_entries(today, lines):
 
13
    # assume "day turnover" at 2 am
 
14
    min = datetime.datetime.combine(today, datetime.time(2, 0))
 
15
    max = min + datetime.timedelta(1)
 
16
    for line in lines:
 
17
        time = line.split(': ', 1)[0]
 
18
        try:
 
19
            time = parse_datetime(time)
 
20
        except ValueError:
 
21
            pass
 
22
        else:
 
23
            if min <= time < max:
 
24
                yield line
 
25
 
 
26
def parse_date(dt):
 
27
    m = re.match(r'^(\d+)-(\d+)-(\d+)$', dt)
 
28
    if not m:
 
29
        raise ValueError('bad date: ', dt)
 
30
    year, month, day = map(int, m.groups())
 
31
    return datetime.date(year, month, day)
 
32
 
 
33
def parse_datetime(dt):
 
34
    m = re.match(r'^(\d+)-(\d+)-(\d+) (\d+):(\d+)$', dt)
 
35
    if not m:
 
36
        raise ValueError('bad date time: ', dt)
 
37
    year, month, day, hour, min = map(int, m.groups())
 
38
    return datetime.datetime(year, month, day, hour, min)
 
39
 
 
40
def calculate_diffs(lines):
 
41
    last_time = None
 
42
    for line in lines:
 
43
        time, action = line.split(': ', 1)
 
44
        time = parse_datetime(time)
 
45
        if last_time is None:
 
46
            delta = None
 
47
        else:
 
48
            delta = time - last_time
 
49
        yield last_time, time, delta, action.strip()
 
50
        last_time = time
 
51
 
 
52
def format_time(t):
 
53
    h, m = divmod(t, 60)
 
54
    if h and m:
 
55
        return '%d hour%s %d min' % (h, h != 1 and "s" or "", m)
 
56
    elif h:
 
57
        return '%d hour%s' % (h, h != 1 and "s" or "")
 
58
    else:
 
59
        return '%d min' % m
 
60
 
 
61
def print_diff(last_time, time, delta, action):
 
62
    time = time.strftime('%H:%M')
 
63
    if delta is None:
 
64
        delta = ""
 
65
    else:
 
66
        delta = format_time(delta.seconds / 60)
 
67
 
 
68
    # format 1
 
69
    ## print "%s%15s  %s" % (time, delta, action)
 
70
 
 
71
    # format 2
 
72
    action = action[:1].title() + action[1:]
 
73
    if not delta:
 
74
        print "%s at %s\n" % (action, time)
 
75
    else:
 
76
        print "%-62s  %s" % (action, delta)
 
77
 
 
78
def print_diffs(iter):
 
79
    first_time = None
 
80
    time = None
 
81
    total_time = total_slack = datetime.timedelta(0)
 
82
    for last_time, time, delta, action in iter:
 
83
        if first_time is None:
 
84
            first_time = time
 
85
        print_diff(last_time, time, delta, action)
 
86
        if delta is not None:
 
87
            if '**' in action:
 
88
                total_slack += delta
 
89
            else:
 
90
                total_time += delta
 
91
    return first_time, time, total_time, total_slack
 
92
 
 
93
 
 
94
def main(argv=sys.argv):
 
95
    filename = 'timelog.txt'
 
96
    opts, args = getopt.getopt(argv[1:], 'hf:', ['help'])
 
97
    for k, v in opts:
 
98
        if k == '-f':
 
99
            filename = v
 
100
    if len(args) > 1:
 
101
        print >> sys.stderr, "too many arguments"
 
102
    elif len(args) == 1:
 
103
        if args[0] == 'yesterday':
 
104
            today = datetime.date.today() - datetime.timedelta(1)
 
105
        else:
 
106
            today = parse_date(args[0])
 
107
    else:
 
108
        if os.path.basename(argv[0]).replace('.py', '') == 'yesterday':
 
109
            today = datetime.date.today() - datetime.timedelta(1)
 
110
        else:
 
111
            today = datetime.date.today()
 
112
 
 
113
    title = "Today, %s" % today.strftime('%Y-%m-%d')
 
114
    print title
 
115
    print "-" * len(title)
 
116
    chain = read_timelog(filename)
 
117
    chain = todays_entries(today, chain)
 
118
    chain = calculate_diffs(chain)
 
119
    first_time, last_time, total_time, total_slack = print_diffs(chain)
 
120
 
 
121
    now = datetime.datetime.now()
 
122
    print ""
 
123
    print "Total work done: %s" % format_time(total_time.seconds / 60)
 
124
    print "Time spent slacking: %s" % format_time(total_slack.seconds / 60)
 
125
    print ""
 
126
    print "Time now: %s" % now.strftime('%H:%M')
 
127
    if last_time is not None:
 
128
        delta = now - last_time
 
129
        print "Time since last entry: %s" % format_time(delta.seconds / 60)
 
130
        delta = now - first_time
 
131
        print "Time since first entry: %s" % format_time(delta.seconds / 60)
 
132
        est_end_of_work = last_time + datetime.timedelta(hours=8) - total_time
 
133
        delta = est_end_of_work - now
 
134
        print "Time left at work: %s (til %s)" % (
 
135
                format_time(delta.seconds / 60),
 
136
                est_end_of_work.strftime("%H:%M"))
 
137
 
 
138
 
 
139
if __name__ == '__main__':
 
140
    main()