forked from nelhage/iron-blogger
-
Notifications
You must be signed in to change notification settings - Fork 1
/
render.py
executable file
·136 lines (114 loc) · 3.55 KB
/
render.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/usr/bin/python
import yaml
from dateutil.parser import parse
import datetime
import dateutil.tz as tz
import sys
import os
import os.path
import subprocess
import re
from mako.template import Template
from config import *
def get_balance(acct):
balance_cmd_tmp = BALANCE_CMD
balance_cmd_tmp.append(acct)
p = subprocess.Popen(balance_cmd_tmp,
stdout=subprocess.PIPE)
(out, _) = p.communicate()
return float(re.sub(r'\s*(\d+)\s+.*', r'\1', out))
def get_debts():
p = subprocess.Popen(DEBTS_CMD,
stdout=subprocess.PIPE)
(out, _) = p.communicate()
debts = []
for line in out.split("\n"):
if not line: continue
(val, acct) = line.split()
user = acct[len("Pool:Owed:"):]
if not user: continue
val = float(re.sub(r'(\D)?(\d+)$', r'\2', val))
debts.append((user, val))
return debts
def to_week_num(date):
return (parse(date, default=START) - START).days / 7
def parse_skip(rec):
spec = rec.get('skip', [])
out = []
for s in spec:
if isinstance(s, list):
out.append(map(to_week_num, s))
else:
out.append(to_week_num(s))
return out
def should_skip(skips, week):
for e in skips:
if e == week:
return True
if isinstance(e, list) and e[0] <= week and e[1] > week:
return True
return False
def render_template(path, week=None, **kwargs):
with open('out/report.yml') as r:
report = yaml.safe_load(r)
with open('bloggers.yml') as f:
users = yaml.safe_load(f)
if week:
week = parse(week, default=START)
else:
week = START
week = (week - START).days / 7
week_start = START + (week * datetime.timedelta(7))
week_end = START + ((week + 1) * datetime.timedelta(7))
good = []
lame = []
skip = []
userlist = []
punted = []
class User(object):
pass
for (un, rec) in users.items():
u = User()
u.username = un
u.links = rec['links']
u.start = rec['start']
u.end = rec.get('end')
u.skip = parse_skip(rec)
u.weeks = report.get(un, [])
userlist.append(u)
# create a subset of punted users
if u.end:
punted.append(u)
def user_key(u):
return (u.start, u.username)
userlist.sort(key=user_key)
punted.sort(key=user_key)
for u in userlist:
user_start = datetime.datetime(*(u.start.timetuple()[:6]))
if u.end and datetime.datetime(*(u.end.timetuple()[:6])) <= week_start:
continue
if should_skip(u.skip, week):
pass
elif user_start > week_start:
skip.append(u)
elif len(u.weeks) <= week or not u.weeks[week]:
lame.append(u)
else:
good.append(u)
debts = get_debts()
return Template(filename=path, input_encoding='utf-8',
output_encoding='utf-8',
default_filters=['decode.utf8']).render(
week=week, week_start=week_start,week_end=week_end,
good=good, lame=lame, skip=skip, userlist=userlist,
pool=get_balance('Pool'), paid=get_balance('Pool:Paid'),
debts=debts, punted=punted, currency=CURRENCY, fine=FINE_SIZE,
**kwargs)
if __name__ == '__main__':
if len(sys.argv) < 2:
print >>sys.stderr, "Usage: %s TEMPLATE [WEEK]"
sys.exit(1)
template = sys.argv[1]
week = None
if len(sys.argv) > 2: week = sys.argv[2]
print render_template(template, week)