]> git.siccegge.de Git - teilnehmertool.git/blob - teilnehmertool.py
Add helfercsv to strichliste
[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 import re
13 import sys
14
15 import csv
16
17 conn = None
18
19
20 env = jinja2.Environment(loader=jinja2.FileSystemLoader('templates', encoding='utf-8'))
21
22
23 ## jinja2 TeX espaping from http://flask.pocoo.org/snippets/55/
24 LATEX_SUBS = [
25 (re.compile(r'\\'), r'\\textbackslash{}'),
26 (re.compile(r'([{}_#%&$])'), r'\\\1'),
27 (re.compile(r'~'), r'\~{}'),
28 (re.compile(r'\^'), r'\^{}'),
29 (re.compile(r'"'), r"''"),
30 (re.compile(r'\.\.\.+'), r'\\ldots'),
31 ]
32
33 def escape_tex(value):
34 newval = value
35 for pattern, replacement in LATEX_SUBS:
36 newval = pattern.sub(replacement, newval)
37 return newval
38
39 env.filters['escape_tex'] = escape_tex
40
41
42 ## dont judge me. i don't see any good way sadly
43 VERANSTALTUNGSLEITER = {
44 }
45
46 def is_veranstaltungsleiter(row):
47 if VERANSTALTUNGSLEITER.has_key(row['username']):
48 return True
49 return False
50
51
52 def create_helfer_nametags(csvpath, outdir='helfer_nametags'):
53 template = env.get_template('nametag.svg')
54
55 with open(csvpath, 'r') as csvfile:
56 csvreader = csv.DictReader(csvfile, delimiter=',', quotechar='"')
57 uni = "FAU Erlangen"
58
59 for row in csvreader:
60 if is_veranstaltungsleiter(row):
61 nick = "%s %s" % (VERANSTALTUNGSLEITER[row['username']][0], VERANSTALTUNGSLEITER[row['username']][1])
62 with open(os.path.join(outdir, "%s.svg" % nick), 'w') as f:
63 f.write(template.render(nick=nick.decode('utf-8'), uni1=uni.decode('utf-8')).encode('utf-8'))
64 nick = "%s" % (row['username'])
65
66 with open(os.path.join(outdir, "%s.svg" % nick), 'w') as f:
67 f.write(template.render(nick=nick.decode('utf-8'), uni1=uni.decode('utf-8')).encode('utf-8'))
68
69
70 def import_teilnehmer(input):
71 ids = set([ i[0] for i in conn.execute('SELECT id FROM teilnehmer').fetchall() ])
72
73 with open(input) as f:
74 reader = csv.reader(f, delimiter=';', quotechar='"')
75 for row in reader:
76 if row[0] == '#':
77 continue
78 if not int(row[0]) in ids:
79 print "Importing %s" % (row, )
80 conn.execute("INSERT INTO teilnehmer VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
81 row[:-2] + ['Kein T-Shirt', 'Kein Pulli'] + row[-2:] + [0, 0, 0, "", "false"])
82
83 conn.commit()
84
85 def mark_pay(outdir):
86 betrag = int(raw_input("Betrag: "))
87
88 template = env.get_template('eingangsbestaetigung.eml')
89
90 while True:
91 uid = raw_input("User: ")
92 if uid == "":
93 break
94 uid = int(uid)
95 vorname, nachname, email, bezahlt = \
96 conn.execute("SELECT vorname, nachname, email, bezahlt FROM teilnehmer WHERE id = ?", [uid]).fetchone()
97
98 if bezahlt == betrag:
99 continue
100
101 conn.execute("UPDATE teilnehmer SET bezahlt = ? WHERE id = ?", [betrag, uid])
102
103
104 with open(os.path.join(outdir, email), 'w') as f:
105 f.write(template.render(vorname=vorname.decode('utf-8'),
106 nachname=nachname.decode('utf-8'),
107 email=email.decode('utf-8'),
108 betrag=betrag).encode('utf-8'))
109
110 conn.commit()
111
112 def create_mail(outdir='output'):
113 def gen_rechnung(tshirt, zipper):
114 preis = 25
115 kosten = u""
116 kosten += u"%s | %s\n" % (u" Konferenzbeitrag".ljust(30), "25.00")
117 kosten += u"%s | %s\n" % ((u" T-Shirt (Größe %s)" % tshirt).ljust(30), " 0.00")
118 if zipper != 'Kein Pulli':
119 kosten += u"%s | %s\n" % ((u" Kapuzenzipper (Größe %s)" % zipper).ljust(30), "25.00")
120 preis += 25
121 kosten += ' '*2 + 29*'-' + '+' + 6*'-' + '\n'
122 kosten += u"%s | %s\n" % (u" Summe".ljust(30), "%2d.00" % preis)
123
124 return kosten, preis
125
126 def gen_token(id, vorname, nachname):
127 return u"%s-%s-%s" % (id, nachname.decode('utf-8').upper(), vorname.decode('utf-8').upper())
128
129 template = env.get_template('teilnehmerbeitrag.eml')
130
131 for id, vorname, nachname, email, tshirt, zipper in \
132 conn.execute("SELECT id, vorname, nachname, email, tshirt, zipper FROM teilnehmer WHERE emailsent = 0"):
133
134 rechnung, preis = gen_rechnung(tshirt, zipper)
135
136 with open(os.path.join(outdir, email), 'w') as f:
137 f.write(template.render(vorname=vorname.decode('utf-8'),
138 nachname=nachname.decode('utf-8'),
139 email=email.decode('utf-8'),
140 token=gen_token(id, vorname, nachname),
141 rechnung=rechnung).encode('utf-8'))
142
143 conn.execute("UPDATE teilnehmer set emailsent = ?, betrag = ? WHERE id = ?", [datetime.datetime.now().isoformat(),
144 preis, id])
145 conn.commit()
146
147 def create_remind(outdir='output'):
148 def gen_rechnung(tshirt, zipper):
149 preis = 25
150 kosten = u""
151 kosten += u"%s | %s\n" % (u" Konferenzbeitrag".ljust(30), "25.00")
152 kosten += u"%s | %s\n" % ((u" T-Shirt (Größe %s)" % tshirt).ljust(30), " 0.00")
153 if zipper != 'Kein Pulli':
154 kosten += u"%s | %s\n" % ((u" Kapuzenzipper (Größe %s)" % zipper).ljust(30), "25.00")
155 preis += 25
156 kosten += ' '*2 + 29*'-' + '+' + 6*'-' + '\n'
157 kosten += u"%s | %s\n" % (u" Summe".ljust(30), "%2d.00" % preis)
158
159 return kosten, preis
160
161 def gen_token(id, vorname, nachname):
162 return u"%s-%s-%s" % (id, nachname.decode('utf-8').upper(), vorname.decode('utf-8').upper())
163
164 template = env.get_template('erinnerung.eml')
165
166 for id, vorname, nachname, email, tshirt, zipper in \
167 conn.execute("SELECT id, vorname, nachname, email, tshirt, zipper FROM teilnehmer " +
168 "WHERE bezahlt < 25 AND datetime(emailsent) < datetime(?)",
169 [(datetime.datetime.now() - datetime.timedelta(14)).isoformat()]):
170
171 rechnung, preis = gen_rechnung(tshirt, zipper)
172
173 with open(os.path.join(outdir, email), 'w') as f:
174 f.write(template.render(vorname=vorname.decode('utf-8'),
175 nachname=nachname.decode('utf-8'),
176 email=email.decode('utf-8'),
177 token=gen_token(id, vorname, nachname),
178 rechnung=rechnung).encode('utf-8'))
179
180 conn.execute("UPDATE teilnehmer set emailsent = ?, betrag = ? WHERE id = ?", [datetime.datetime.now().isoformat(),
181 preis, id])
182 conn.commit()
183
184
185 def create_nametag(outdir='output'):
186 template = env.get_template('nametag.svg')
187
188 for teiln_id, vorname, nachname, namensschild, hochschule, dochned in \
189 conn.execute("SELECT id, vorname, nachname, namensschild, hochschule, dochned FROM teilnehmer"):
190
191 if dochned != "false":
192 print >> sys.stderr, "not generating %s %s (id %s), because abgemeldet" % (vorname, nachname, teiln_id)
193 continue
194
195 with open(os.path.join(outdir, "%s.svg" % teiln_id), 'w') as f:
196 f.write(template.render(name=u"%s %s" % (vorname.decode('utf-8'),
197 nachname.decode('utf-8')),
198 nick=namensschild.decode('utf-8'),
199 uni1=hochschule.decode('utf-8')).encode('utf-8'))
200
201
202 def create_teilnehmer_list(outdir = 'output', only_quittung=False):
203 template_full = env.get_template('teilnehmerliste.tex')
204 template_pack = env.get_template('packliste.tex')
205 template_quittung = env.get_template('quittung.tex')
206 template_strichliste = env.get_template('strichliste.tex')
207
208 if os.path.exists('helfer.csv'):
209 with open('helfer.csv', 'r') as csvfile:
210 csvreader = csv.DictReader(cvspath, delimiter=',', quotechar='"')
211 uni = "FAU Erlangen"
212
213 helfer = [ row['username'] for row in cvsreader ]
214 else:
215 print "Kein helfer.csv gefunden"
216 helfer = []
217
218
219 i = 0
220 teilnehmer = []
221 for vor, nach, nick, hochschule, betrag, bezahlt, shirtsize, zippersize, dochned, comment in \
222 conn.execute("SELECT vorname, nachname, namensschild, hochschule, betrag, bezahlt, tshirt, zipper, dochned, orga_comment FROM teilnehmer ORDER BY UPPER(hochschule) ASC, UPPER(namensschild) ASC"):
223
224 vor = vor.decode('utf8')
225 nach = nach.decode('utf8')
226 nick = nick.decode('utf8')
227 hochschule = hochschule.decode('utf8')
228 ## betrag ist schon int
229 ## bezahlt ist schon int
230 shirtsize = shirtsize.decode('utf8')
231 if re.match("kein", shirtsize, flags=re.IGNORECASE):
232 shirtsize = ""
233
234 zippersize = zippersize.decode('utf8')
235 if re.match("kein", zippersize, flags=re.IGNORECASE):
236 zippersize = ""
237
238 ## string to bool..
239 if dochned == "false":
240 will_attend = True
241 else:
242 will_attend = False
243
244 comment = comment.decode('utf8')
245
246 teilnehmer.append({'vorname': vor, 'nachname': nach,
247 'hochschule': hochschule, 'nick': nick, 'betrag': betrag, 'bezahlt':
248 bezahlt, 'shirtsize': shirtsize, 'zippersize': zippersize,
249 'will_attend': will_attend, 'comment': comment})
250
251 if will_attend:
252 with open(os.path.join(outdir, ("%03d_quittung_%s_%s.tex" % (i, vor.replace(" ", "_"), nach.replace(" ", "_")))), 'w') as out:
253 out.write(template_quittung.render(vorname=vor, nachname=nach, uni=hochschule).encode('utf-8'))
254
255 i = i+1
256
257 ## gibt schlimmere hacks..
258 if only_quittung:
259 return
260
261 with open(os.path.join(outdir, "teilnehmerliste.tex"), 'w') as out:
262 out.write(template_full.render(teilnehmer=teilnehmer).encode('utf-8'))
263
264 with open(os.path.join(outdir, "packliste.tex"), 'w') as out:
265 out.write(template_pack.render(teilnehmer=teilnehmer).encode('utf-8'))
266
267 with open(os.path.join(outdir, "teilnehmer-strichliste.tex"), 'w') as out:
268 out.write(template_strichliste.render(teilnehmer=teilnehmer, helfer=helfer).encode('utf-8'))
269
270
271 def create_teilnehmer_quittungen(output='quittungen'):
272 create_teilnehmer_list(output, only_quittung=True)
273
274
275 def create_bmbf_list(outdir = 'output'):
276 template = env.get_template('bmbf-unterschriftenliste.tex')
277
278
279 teilnehmer = []
280 i = 1
281 for vor, nach, hochschule, dochned in \
282 conn.execute("SELECT vorname, nachname, hochschule, dochned FROM teilnehmer ORDER BY UPPER(nachname) ASC, UPPER (vorname) ASC"):
283
284 vor = vor.decode('utf8')
285 nach = nach.decode('utf8')
286 hochschule = hochschule.decode('utf8')
287
288 if dochned != "false":
289 continue
290
291 if hochschule == "Privat" :
292 continue
293
294 teilnehmer.append({'vorname': vor, 'nachname': nach, 'num': i, 'hochschule': hochschule})
295 i = i+1
296
297
298 with open(os.path.join(outdir, "bmbf-unterschriftenliste.tex"), 'w') as out:
299 out.write(template.render(teilnehmer=teilnehmer).encode('utf-8'))
300
301
302 def list_teilnehmer_ids():
303 for tid, dochned in conn.execute("SELECT id, dochned FROM teilnehmer ORDER BY id ASC"):
304 if dochned == "false":
305 print tid
306
307
308 def main():
309 parser = argparse.ArgumentParser(description="Ultimate Teilnehmertool")
310
311 # Modus
312 group = parser.add_mutually_exclusive_group(required=True)
313 group.add_argument('--importcsv', action='store_true',
314 help='Importiere neue Teilnehmer aus CSV')
315 group.add_argument('--nametag', action='store_true',
316 help='Generiere Nametags')
317 group.add_argument('--email', action='store_true',
318 help='Generiere E-Mails mit Überweisungsinformationen')
319 group.add_argument('--pay', action='store_true',
320 help='Speichere Zahlungseingang')
321 group.add_argument('--remind', action='store_true',
322 help='Generiere Zahlungsaufforderungserinnerung')
323 group.add_argument('--bmbf', action='store_true',
324 help='Generiere BMBF-Unterschriftenliste')
325 group.add_argument('--liste', action='store_true',
326 help='Generiere Teilnehmerübersichtsliste')
327 group.add_argument('--helfer', action='store_true',
328 help='Generiere Helfer-Nametags aus helfer.csv')
329 group.add_argument('--quittungen', action='store_true',
330 help='Generiere Quittungen für Teilnehmer')
331 group.add_argument('--ids', action='store_true',
332 help='Liste alle Teilnehmerids auf, die sich nicht abgemeldet haben')
333
334 # Argumente
335 parser.add_argument('--db', default='teilnehmer.sqlite',
336 help='Teilnehmerdatenbank')
337 parser.add_argument('-i', '--input',
338 help='Eingabedatei')
339 parser.add_argument('-o', '--output', default='output',
340 help='Ausgabeverzeichnis')
341
342 args = parser.parse_args()
343
344 global conn
345 conn = sqlite3.connect(args.db)
346 conn.text_factory = str
347 conn.row_factory = sqlite3.Row
348 conn.execute('pragma encoding = "UTF-8";')
349
350 if args.nametag or args.email or args.pay or args.remind or args.bmbf or \
351 args.liste or args.helfer or args.quittungen or args.ids:
352 assert(args.output)
353 if not os.path.exists(args.output):
354 os.mkdir(args.output)
355
356 if args.nametag:
357 create_nametag(args.output)
358 elif args.email:
359 create_mail(args.output)
360 elif args.pay:
361 mark_pay(args.output)
362 elif args.remind:
363 create_remind(args.output)
364 elif args.bmbf:
365 create_bmbf_list(args.output)
366 elif args.liste:
367 create_teilnehmer_list(args.output)
368 elif args.helfer:
369 assert(args.input)
370 create_helfer_nametags(args.input, args.output)
371 elif args.quittungen:
372 create_teilnehmer_quittungen(args.output)
373 elif args.ids:
374 list_teilnehmer_ids()
375
376 elif args.importcsv:
377 assert(args.input)
378 import_teilnehmer(args.input)
379
380 if __name__ == '__main__':
381 main()
382
383 # vim: set expandtab :