]> git.siccegge.de Git - teilnehmertool.git/blob - teilnehmertool.py
Keine T-Shirts/Zipper mehr im CSV
[teilnehmertool.git] / teilnehmertool.py
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 import argparse
5 import sqlite3
6 import datetime
7 import csv
8 import string
9 import jinja2
10 import os
11 import os.path
12
13 conn = None
14
15
16 env = jinja2.Environment(loader=jinja2.FileSystemLoader('templates', encoding='utf-8'))
17
18 def import_teilnehmer(input):
19 ids = set([ i[0] for i in conn.execute('SELECT id FROM teilnehmer').fetchall() ])
20
21 with open(input) as f:
22 reader = csv.reader(f, delimiter=';', quotechar='"')
23 for row in reader:
24 if row[0] == '#':
25 continue
26 if not int(row[0]) in ids:
27 print "Importing %s" % (row, )
28 conn.execute("INSERT INTO teilnehmer VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
29 row[:-2] + ['Kein T-Shirt', 'Kein Pulli'] + row[-2:] + [0, 0, 0])
30
31 conn.commit()
32
33 def mark_pay(outdir):
34 betrag = int(raw_input("Betrag: "))
35
36 template = env.get_template('eingangsbestaetigung.eml')
37
38 while True:
39 uid = raw_input("User: ")
40 if uid == "":
41 break
42 uid = int(uid)
43 vorname, nachname, email, bezahlt = \
44 conn.execute("SELECT vorname, nachname, email, bezahlt FROM teilnehmer WHERE id = ?", [uid]).fetchone()
45
46 if bezahlt == betrag:
47 continue
48
49 conn.execute("UPDATE teilnehmer SET bezahlt = ? WHERE id = ?", [betrag, uid])
50
51
52 with open(os.path.join(outdir, email), 'w') as f:
53 f.write(template.render(vorname=vorname.decode('utf-8'),
54 nachname=nachname.decode('utf-8'),
55 email=email.decode('utf-8'),
56 betrag=betrag).encode('utf-8'))
57
58 conn.commit()
59
60 def create_mail(outdir='output'):
61 def gen_rechnung(tshirt, zipper):
62 preis = 25
63 kosten = u""
64 kosten += u"%s | %s\n" % (u" Konferenzbeitrag".ljust(30), "25.00")
65 kosten += u"%s | %s\n" % ((u" T-Shirt (Größe %s)" % tshirt).ljust(30), " 0.00")
66 if zipper != 'Kein Pulli':
67 kosten += u"%s | %s\n" % ((u" Kapuzenzipper (Größe %s)" % zipper).ljust(30), "25.00")
68 preis += 25
69 kosten += ' '*2 + 29*'-' + '+' + 6*'-' + '\n'
70 kosten += u"%s | %s\n" % (u" Summe".ljust(30), "%2d.00" % preis)
71
72 return kosten, preis
73
74 def gen_token(id, vorname, nachname):
75 return u"%s-%s-%s" % (id, nachname.decode('utf-8').upper(), vorname.decode('utf-8').upper())
76
77 template = env.get_template('teilnehmerbeitrag.eml')
78
79 for id, vorname, nachname, email, tshirt, zipper in \
80 conn.execute("SELECT id, vorname, nachname, email, tshirt, zipper FROM teilnehmer WHERE emailsent = 0"):
81
82 rechnung, preis = gen_rechnung(tshirt, zipper)
83
84 with open(os.path.join(outdir, email), 'w') as f:
85 f.write(template.render(vorname=vorname.decode('utf-8'),
86 nachname=nachname.decode('utf-8'),
87 email=email.decode('utf-8'),
88 token=gen_token(id, vorname, nachname),
89 rechnung=rechnung).encode('utf-8'))
90
91 conn.execute("UPDATE teilnehmer set emailsent = ?, betrag = ? WHERE id = ?", [datetime.datetime.now().isoformat(),
92 preis, id])
93 conn.commit()
94
95 def create_remind(outdir='output'):
96 def gen_rechnung(tshirt, zipper):
97 preis = 25
98 kosten = u""
99 kosten += u"%s | %s\n" % (u" Konferenzbeitrag".ljust(30), "25.00")
100 kosten += u"%s | %s\n" % ((u" T-Shirt (Größe %s)" % tshirt).ljust(30), " 0.00")
101 if zipper != 'Kein Pulli':
102 kosten += u"%s | %s\n" % ((u" Kapuzenzipper (Größe %s)" % zipper).ljust(30), "25.00")
103 preis += 25
104 kosten += ' '*2 + 29*'-' + '+' + 6*'-' + '\n'
105 kosten += u"%s | %s\n" % (u" Summe".ljust(30), "%2d.00" % preis)
106
107 return kosten, preis
108
109 def gen_token(id, vorname, nachname):
110 return u"%s-%s-%s" % (id, nachname.decode('utf-8').upper(), vorname.decode('utf-8').upper())
111
112 template = env.get_template('erinnerung.eml')
113
114 for id, vorname, nachname, email, tshirt, zipper in \
115 conn.execute("SELECT id, vorname, nachname, email, tshirt, zipper FROM teilnehmer " +
116 "WHERE bezahlt < 25 AND datetime(emailsent) < datetime(?)",
117 [(datetime.datetime.now() - datetime.timedelta(14)).isoformat()]):
118
119 rechnung, preis = gen_rechnung(tshirt, zipper)
120
121 with open(os.path.join(outdir, email), 'w') as f:
122 f.write(template.render(vorname=vorname.decode('utf-8'),
123 nachname=nachname.decode('utf-8'),
124 email=email.decode('utf-8'),
125 token=gen_token(id, vorname, nachname),
126 rechnung=rechnung).encode('utf-8'))
127
128 conn.execute("UPDATE teilnehmer set emailsent = ?, betrag = ? WHERE id = ?", [datetime.datetime.now().isoformat(),
129 preis, id])
130 conn.commit()
131
132 def create_nametag(outdir='output'):
133 template = env.get_template('nametag.svg')
134
135 for vorname, nachname, namensschild, hochschule in \
136 conn.execute("SELECT vorname, nachname, namensschild, hochschule FROM teilnehmer"):
137
138 with open(os.path.join(outdir, "%s.svg" % namensschild), 'w') as f:
139 f.write(template.render(name=u"%s %s" % (vorname.decode('utf-8'),
140 nachname.decode('utf-8')),
141 nick=namensschild.decode('utf-8'),
142 uni1=hochschule.decode('utf-8')).encode('utf-8'))
143
144 def create_bmbf_list(outdir = 'output'):
145 template = env.get_template('bmbf-unterschriftenliste.tex')
146
147
148 teilnehmer = []
149 i = 1
150 for vor, nach, hochschule in \
151 conn.execute("SELECT vorname, nachname, hochschule FROM teilnehmer ORDER BY UPPER(nachname) ASC"):
152
153 vor = vor.decode('utf8')
154 nach = nach.decode('utf8')
155 hochschule = hochschule.decode('utf8')
156
157 teilnehmer.append({'vorname': vor, 'nachname': nach, 'num': i, 'hochschule': hochschule})
158 i = i+1
159
160
161 with open(os.path.join(outdir, "bmbf-unterschriftenliste.tex"), 'w') as out:
162 out.write(template.render(teilnehmer=teilnehmer).encode('utf-8'))
163
164
165 def main():
166 parser = argparse.ArgumentParser(description="Ultimate Teilnehmertool")
167
168 # Modus
169 group = parser.add_mutually_exclusive_group(required=True)
170 group.add_argument('--importcsv', action='store_true',
171 help='Importiere neue Teilnehmer aus CSV')
172 group.add_argument('--nametag', action='store_true',
173 help='Generiere Nametags')
174 group.add_argument('--email', action='store_true',
175 help='Generiere E-Mails mit Überweisungsinformationen')
176 group.add_argument('--pay', action='store_true',
177 help='Speichere Zahlungseingang')
178 group.add_argument('--remind', action='store_true',
179 help='Generiere Zahlungsaufforderungserinnerung')
180 group.add_argument('--bmbf', action='store_true',
181 help='Generiere BMBF-Unterschriftenliste')
182
183 # Argumente
184 parser.add_argument('--db', default='teilnehmer.sqlite',
185 help='Teilnehmerdatenbank')
186 parser.add_argument('-i', '--input',
187 help='Eingabedatei')
188 parser.add_argument('-o', '--output', default='output',
189 help='Ausgabeverzeichnis')
190
191 args = parser.parse_args()
192
193 global conn
194 conn = sqlite3.connect(args.db)
195 conn.text_factory = str
196 conn.row_factory = sqlite3.Row
197 conn.execute('pragma encoding = "UTF-8";')
198
199 if args.nametag or args.email or args.pay or args.remind or args.bmbf:
200 assert(args.output)
201 if not os.path.exists(args.output):
202 os.mkdir(args.output)
203
204 if args.nametag:
205 create_nametag(args.output)
206 elif args.email:
207 create_mail(args.output)
208 elif args.pay:
209 mark_pay(args.output)
210 elif args.remind:
211 create_remind(args.output)
212 elif args.bmbf:
213 create_bmbf_list(args.output)
214
215 elif args.importcsv:
216 assert(args.input)
217 import_teilnehmer(args.input)
218
219 if __name__ == '__main__':
220 main()
221
222 # vim: set expandtab :