]>
git.siccegge.de Git - teilnehmertool.git/blob - teilnehmertool.py
2 # -*- coding: utf-8 -*-
20 env
= jinja2
.Environment(loader
=jinja2
.FileSystemLoader('templates', encoding
='utf-8'))
23 ## jinja2 TeX espaping from http://flask.pocoo.org/snippets/55/
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'),
33 def escape_tex(value
):
35 for pattern
, replacement
in LATEX_SUBS
:
36 newval
= pattern
.sub(replacement
, newval
)
39 env
.filters
['escape_tex'] = escape_tex
42 ## dont judge me. i don't see any good way sadly
43 VERANSTALTUNGSLEITER
= {
46 def is_veranstaltungsleiter(row
):
47 if VERANSTALTUNGSLEITER
.has_key(row
['username']):
52 def create_helfer_nametags(csvpath
, outdir
='helfer_nametags'):
53 template
= env
.get_template('nametag.svg')
55 with
open(csvpath
, 'r') as csvfile
:
56 csvreader
= csv
.DictReader(csvfile
, delimiter
=',', quotechar
='"')
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'])
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'))
70 def import_teilnehmer(input):
71 ids
= set([ i
[0] for i
in conn
.execute('SELECT id FROM teilnehmer').fetchall() ])
73 with
open(input) as f
:
74 reader
= csv
.reader(f
, delimiter
=';', quotechar
='"')
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"])
86 betrag
= int(raw_input("Betrag: "))
88 template
= env
.get_template('eingangsbestaetigung.eml')
91 uid
= raw_input("User: ")
95 vorname
, nachname
, email
, bezahlt
= \
96 conn
.execute("SELECT vorname, nachname, email, bezahlt FROM teilnehmer WHERE id = ?", [uid
]).fetchone()
101 conn
.execute("UPDATE teilnehmer SET bezahlt = ? WHERE id = ?", [betrag
, uid
])
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'))
112 def create_mail(outdir
='output'):
113 def gen_rechnung(tshirt
, zipper
):
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")
121 kosten
+= ' '*2 + 29*'-' + '+' + 6*'-' + '\n'
122 kosten
+= u
"%s | %s\n" % (u
" Summe".ljust(30), "%2d.00" % preis
)
126 def gen_token(id, vorname
, nachname
):
127 return u
"%s-%s-%s" % (id, nachname
.decode('utf-8').upper(), vorname
.decode('utf-8').upper())
129 template
= env
.get_template('teilnehmerbeitrag.eml')
131 for id, vorname
, nachname
, email
, tshirt
, zipper
in \
132 conn
.execute("SELECT id, vorname, nachname, email, tshirt, zipper FROM teilnehmer WHERE emailsent = 0"):
134 rechnung
, preis
= gen_rechnung(tshirt
, zipper
)
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'))
143 conn
.execute("UPDATE teilnehmer set emailsent = ?, betrag = ? WHERE id = ?", [datetime
.datetime
.now().isoformat(),
147 def create_remind(outdir
='output'):
148 def gen_rechnung(tshirt
, zipper
):
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")
156 kosten
+= ' '*2 + 29*'-' + '+' + 6*'-' + '\n'
157 kosten
+= u
"%s | %s\n" % (u
" Summe".ljust(30), "%2d.00" % preis
)
161 def gen_token(id, vorname
, nachname
):
162 return u
"%s-%s-%s" % (id, nachname
.decode('utf-8').upper(), vorname
.decode('utf-8').upper())
164 template
= env
.get_template('erinnerung.eml')
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()]):
171 rechnung
, preis
= gen_rechnung(tshirt
, zipper
)
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'))
180 conn
.execute("UPDATE teilnehmer set emailsent = ?, betrag = ? WHERE id = ?", [datetime
.datetime
.now().isoformat(),
185 def create_nametag(outdir
='output'):
186 template
= env
.get_template('nametag.svg')
188 for teiln_id
, vorname
, nachname
, namensschild
, hochschule
, dochned
in \
189 conn
.execute("SELECT id, vorname, nachname, namensschild, hochschule, dochned FROM teilnehmer"):
191 if dochned
!= "false":
192 print >> sys
.stderr
, "not generating %s %s (id %s), because abgemeldet" % (vorname
, nachname
, teiln_id
)
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'))
202 def create_teilnehmer_list(outdir
= 'output'):
203 template_full
= env
.get_template('teilnehmerliste.tex')
204 template_pack
= env
.get_template('packliste.tex')
205 template_quittung
= env
.get_template('quittung.tex')
209 for vor
, nach
, nick
, hochschule
, betrag
, bezahlt
, shirtsize
, zippersize
, dochned
, comment
in \
210 conn
.execute("SELECT vorname, nachname, namensschild, hochschule, betrag, bezahlt, tshirt, zipper, dochned, orga_comment FROM teilnehmer ORDER BY UPPER(hochschule) ASC, UPPER(nachname) ASC"):
212 vor
= vor
.decode('utf8')
213 nach
= nach
.decode('utf8')
214 nick
= nick
.decode('utf8')
215 hochschule
= hochschule
.decode('utf8')
216 ## betrag ist schon int
217 ## bezahlt ist schon int
218 shirtsize
= shirtsize
.decode('utf8')
219 if re
.match("kein", shirtsize
, flags
=re
.IGNORECASE
):
222 zippersize
= zippersize
.decode('utf8')
223 if re
.match("kein", zippersize
, flags
=re
.IGNORECASE
):
227 if dochned
== "false":
232 comment
= comment
.decode('utf8')
234 teilnehmer
.append({'vorname': vor
, 'nachname': nach
,
235 'hochschule': hochschule
, 'nick': nick
, 'betrag': betrag
, 'bezahlt':
236 bezahlt
, 'shirtsize': shirtsize
, 'zippersize': zippersize
,
237 'will_attend': will_attend
, 'comment': comment
})
240 with
open(os
.path
.join(outdir
, ("%03d_quittung_%s_%s.tex" % (i
, vor
, nach
))), 'w') as out
:
241 out
.write(template_quittung
.render(vorname
=vor
, nachname
=nach
).encode('utf-8'))
246 with
open(os
.path
.join(outdir
, "teilnehmerliste.tex"), 'w') as out
:
247 out
.write(template_full
.render(teilnehmer
=teilnehmer
).encode('utf-8'))
249 with
open(os
.path
.join(outdir
, "packliste.tex"), 'w') as out
:
250 out
.write(template_pack
.render(teilnehmer
=teilnehmer
).encode('utf-8'))
254 def create_bmbf_list(outdir
= 'output'):
255 template
= env
.get_template('bmbf-unterschriftenliste.tex')
260 for vor
, nach
, hochschule
in \
261 conn
.execute("SELECT vorname, nachname, hochschule FROM teilnehmer ORDER BY UPPER(nachname) ASC"):
263 vor
= vor
.decode('utf8')
264 nach
= nach
.decode('utf8')
265 hochschule
= hochschule
.decode('utf8')
267 teilnehmer
.append({'vorname': vor
, 'nachname': nach
, 'num': i
, 'hochschule': hochschule
})
271 with
open(os
.path
.join(outdir
, "bmbf-unterschriftenliste.tex"), 'w') as out
:
272 out
.write(template
.render(teilnehmer
=teilnehmer
).encode('utf-8'))
275 def list_teilnehmer_ids():
276 for tid
, dochned
in conn
.execute("SELECT id, dochned FROM teilnehmer ORDER BY id ASC"):
277 if dochned
== "false":
282 parser
= argparse
.ArgumentParser(description
="Ultimate Teilnehmertool")
285 group
= parser
.add_mutually_exclusive_group(required
=True)
286 group
.add_argument('--importcsv', action
='store_true',
287 help='Importiere neue Teilnehmer aus CSV')
288 group
.add_argument('--nametag', action
='store_true',
289 help='Generiere Nametags')
290 group
.add_argument('--email', action
='store_true',
291 help='Generiere E-Mails mit Überweisungsinformationen')
292 group
.add_argument('--pay', action
='store_true',
293 help='Speichere Zahlungseingang')
294 group
.add_argument('--remind', action
='store_true',
295 help='Generiere Zahlungsaufforderungserinnerung')
296 group
.add_argument('--bmbf', action
='store_true',
297 help='Generiere BMBF-Unterschriftenliste')
298 group
.add_argument('--liste', action
='store_true',
299 help='Generiere Teilnehmerübersichtsliste')
300 group
.add_argument('--helfer', action
='store_true',
301 help='Generiere Helfer-Nametags aus helfer.csv')
302 group
.add_argument('--quittungen', action
='store_true',
303 help='Generiere Quittungen für Teilnehmer')
304 group
.add_argument('--ids', action
='store_true',
305 help='Liste alle Teilnehmerids auf, die sich nicht abgemeldet haben')
308 parser
.add_argument('--db', default
='teilnehmer.sqlite',
309 help='Teilnehmerdatenbank')
310 parser
.add_argument('-i', '--input',
312 parser
.add_argument('-o', '--output', default
='output',
313 help='Ausgabeverzeichnis')
315 args
= parser
.parse_args()
318 conn
= sqlite3
.connect(args
.db
)
319 conn
.text_factory
= str
320 conn
.row_factory
= sqlite3
.Row
321 conn
.execute('pragma encoding = "UTF-8";')
323 if args
.nametag
or args
.email
or args
.pay
or args
.remind
or args
.bmbf
or \
324 args
.liste
or args
.helfer
or args
.quittungen
or args
.ids
:
326 if not os
.path
.exists(args
.output
):
327 os
.mkdir(args
.output
)
330 create_nametag(args
.output
)
332 create_mail(args
.output
)
334 mark_pay(args
.output
)
336 create_remind(args
.output
)
338 create_bmbf_list(args
.output
)
340 create_teilnehmer_list(args
.output
)
343 create_helfer_nametags(args
.input, args
.output
)
344 elif args
.quittungen
:
345 create_teilnehmer_quittungen(args
.output
)
347 list_teilnehmer_ids()
351 import_teilnehmer(args
.input)
353 if __name__
== '__main__':
356 # vim: set expandtab :