]>
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
= env
.get_template('teilnehmerliste.tex')
206 for vor
, nach
, nick
, hochschule
, betrag
, bezahlt
, shirtsize
, zippersize
, dochned
, comment
in \
207 conn
.execute("SELECT vorname, nachname, namensschild, hochschule, betrag, bezahlt, tshirt, zipper, dochned, orga_comment FROM teilnehmer ORDER BY UPPER(nachname) ASC"):
209 vor
= vor
.decode('utf8')
210 nach
= nach
.decode('utf8')
211 nick
= nick
.decode('utf8')
212 hochschule
= hochschule
.decode('utf8')
213 ## betrag ist schon int
214 ## bezahlt ist schon int
215 shirtsize
= shirtsize
.decode('utf8')
216 if re
.match("kein", shirtsize
, flags
=re
.IGNORECASE
):
219 zippersize
= zippersize
.decode('utf8')
220 if re
.match("kein", zippersize
, flags
=re
.IGNORECASE
):
224 if dochned
== "false":
228 comment
= comment
.decode('utf8')
230 teilnehmer
.append({'vorname': vor
, 'nachname': nach
,
231 'hochschule': hochschule
, 'nick': nick
, 'betrag': betrag
, 'bezahlt':
232 bezahlt
, 'shirtsize': shirtsize
, 'zippersize': zippersize
,
233 'will_attend': will_attend
, 'comment': comment
})
236 with
open(os
.path
.join(outdir
, "teilnehmerliste.tex"), 'w') as out
:
237 out
.write(template
.render(teilnehmer
=teilnehmer
).encode('utf-8'))
241 def create_bmbf_list(outdir
= 'output'):
242 template
= env
.get_template('bmbf-unterschriftenliste.tex')
247 for vor
, nach
, hochschule
in \
248 conn
.execute("SELECT vorname, nachname, hochschule FROM teilnehmer ORDER BY UPPER(nachname) ASC"):
250 vor
= vor
.decode('utf8')
251 nach
= nach
.decode('utf8')
252 hochschule
= hochschule
.decode('utf8')
254 teilnehmer
.append({'vorname': vor
, 'nachname': nach
, 'num': i
, 'hochschule': hochschule
})
258 with
open(os
.path
.join(outdir
, "bmbf-unterschriftenliste.tex"), 'w') as out
:
259 out
.write(template
.render(teilnehmer
=teilnehmer
).encode('utf-8'))
263 parser
= argparse
.ArgumentParser(description
="Ultimate Teilnehmertool")
266 group
= parser
.add_mutually_exclusive_group(required
=True)
267 group
.add_argument('--importcsv', action
='store_true',
268 help='Importiere neue Teilnehmer aus CSV')
269 group
.add_argument('--nametag', action
='store_true',
270 help='Generiere Nametags')
271 group
.add_argument('--email', action
='store_true',
272 help='Generiere E-Mails mit Überweisungsinformationen')
273 group
.add_argument('--pay', action
='store_true',
274 help='Speichere Zahlungseingang')
275 group
.add_argument('--remind', action
='store_true',
276 help='Generiere Zahlungsaufforderungserinnerung')
277 group
.add_argument('--bmbf', action
='store_true',
278 help='Generiere BMBF-Unterschriftenliste')
279 group
.add_argument('--liste', action
='store_true',
280 help='Generiere Teilnehmerübersichtsliste')
281 group
.add_argument('--helfer', action
='store_true',
282 help='Generiere Helfer-Nametags aus helfer.csv')
285 parser
.add_argument('--db', default
='teilnehmer.sqlite',
286 help='Teilnehmerdatenbank')
287 parser
.add_argument('-i', '--input',
289 parser
.add_argument('-o', '--output', default
='output',
290 help='Ausgabeverzeichnis')
292 args
= parser
.parse_args()
295 conn
= sqlite3
.connect(args
.db
)
296 conn
.text_factory
= str
297 conn
.row_factory
= sqlite3
.Row
298 conn
.execute('pragma encoding = "UTF-8";')
300 if args
.nametag
or args
.email
or args
.pay
or args
.remind
or args
.bmbf
or \
301 args
.liste
or args
.helfer
:
303 if not os
.path
.exists(args
.output
):
304 os
.mkdir(args
.output
)
307 create_nametag(args
.output
)
309 create_mail(args
.output
)
311 mark_pay(args
.output
)
313 create_remind(args
.output
)
315 create_bmbf_list(args
.output
)
317 create_teilnehmer_list(args
.output
)
320 create_helfer_nametags(args
.input, args
.output
)
324 import_teilnehmer(args
.input)
326 if __name__
== '__main__':
329 # vim: set expandtab :