]>
git.siccegge.de Git - teilnehmertool.git/blob - teilnehmertool.py
0408eb22ed886723ac792b4c7cb20c74736fd1b2
2 # -*- coding: utf-8 -*-
17 env
= jinja2
.Environment(loader
=jinja2
.FileSystemLoader('templates', encoding
='utf-8'))
20 ## jinja2 TeX espaping from http://flask.pocoo.org/snippets/55/
22 (re
.compile(r
'\\'), r
'\\textbackslash'),
23 (re
.compile(r
'([{}_#%&$])'), r
'\\\1'),
24 (re
.compile(r
'~'), r
'\~{}'),
25 (re
.compile(r
'\^'), r
'\^{}'),
26 (re
.compile(r
'"'), r
"''"),
27 (re
.compile(r
'\.\.\.+'), r
'\\ldots'),
30 def escape_tex(value
):
32 for pattern
, replacement
in LATEX_SUBS
:
33 newval
= pattern
.sub(replacement
, newval
)
36 env
.filters
['escape_tex'] = escape_tex
39 def import_teilnehmer(input):
40 ids
= set([ i
[0] for i
in conn
.execute('SELECT id FROM teilnehmer').fetchall() ])
42 with
open(input) as f
:
43 reader
= csv
.reader(f
, delimiter
=';', quotechar
='"')
47 if not int(row
[0]) in ids
:
48 print "Importing %s" % (row
, )
49 conn
.execute("INSERT INTO teilnehmer VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
50 row
[:-2] + ['Kein T-Shirt', 'Kein Pulli'] + row
[-2:] + [0, 0, 0])
55 betrag
= int(raw_input("Betrag: "))
57 template
= env
.get_template('eingangsbestaetigung.eml')
60 uid
= raw_input("User: ")
64 vorname
, nachname
, email
, bezahlt
= \
65 conn
.execute("SELECT vorname, nachname, email, bezahlt FROM teilnehmer WHERE id = ?", [uid
]).fetchone()
70 conn
.execute("UPDATE teilnehmer SET bezahlt = ? WHERE id = ?", [betrag
, uid
])
73 with
open(os
.path
.join(outdir
, email
), 'w') as f
:
74 f
.write(template
.render(vorname
=vorname
.decode('utf-8'),
75 nachname
=nachname
.decode('utf-8'),
76 email
=email
.decode('utf-8'),
77 betrag
=betrag
).encode('utf-8'))
81 def create_mail(outdir
='output'):
82 def gen_rechnung(tshirt
, zipper
):
85 kosten
+= u
"%s | %s\n" % (u
" Konferenzbeitrag".ljust(30), "25.00")
86 kosten
+= u
"%s | %s\n" % ((u
" T-Shirt (Größe %s)" % tshirt
).ljust(30), " 0.00")
87 if zipper
!= 'Kein Pulli':
88 kosten
+= u
"%s | %s\n" % ((u
" Kapuzenzipper (Größe %s)" % zipper
).ljust(30), "25.00")
90 kosten
+= ' '*2 + 29*'-' + '+' + 6*'-' + '\n'
91 kosten
+= u
"%s | %s\n" % (u
" Summe".ljust(30), "%2d.00" % preis
)
95 def gen_token(id, vorname
, nachname
):
96 return u
"%s-%s-%s" % (id, nachname
.decode('utf-8').upper(), vorname
.decode('utf-8').upper())
98 template
= env
.get_template('teilnehmerbeitrag.eml')
100 for id, vorname
, nachname
, email
, tshirt
, zipper
in \
101 conn
.execute("SELECT id, vorname, nachname, email, tshirt, zipper FROM teilnehmer WHERE emailsent = 0"):
103 rechnung
, preis
= gen_rechnung(tshirt
, zipper
)
105 with
open(os
.path
.join(outdir
, email
), 'w') as f
:
106 f
.write(template
.render(vorname
=vorname
.decode('utf-8'),
107 nachname
=nachname
.decode('utf-8'),
108 email
=email
.decode('utf-8'),
109 token
=gen_token(id, vorname
, nachname
),
110 rechnung
=rechnung
).encode('utf-8'))
112 conn
.execute("UPDATE teilnehmer set emailsent = ?, betrag = ? WHERE id = ?", [datetime
.datetime
.now().isoformat(),
116 def create_remind(outdir
='output'):
117 def gen_rechnung(tshirt
, zipper
):
120 kosten
+= u
"%s | %s\n" % (u
" Konferenzbeitrag".ljust(30), "25.00")
121 kosten
+= u
"%s | %s\n" % ((u
" T-Shirt (Größe %s)" % tshirt
).ljust(30), " 0.00")
122 if zipper
!= 'Kein Pulli':
123 kosten
+= u
"%s | %s\n" % ((u
" Kapuzenzipper (Größe %s)" % zipper
).ljust(30), "25.00")
125 kosten
+= ' '*2 + 29*'-' + '+' + 6*'-' + '\n'
126 kosten
+= u
"%s | %s\n" % (u
" Summe".ljust(30), "%2d.00" % preis
)
130 def gen_token(id, vorname
, nachname
):
131 return u
"%s-%s-%s" % (id, nachname
.decode('utf-8').upper(), vorname
.decode('utf-8').upper())
133 template
= env
.get_template('erinnerung.eml')
135 for id, vorname
, nachname
, email
, tshirt
, zipper
in \
136 conn
.execute("SELECT id, vorname, nachname, email, tshirt, zipper FROM teilnehmer " +
137 "WHERE bezahlt < 25 AND datetime(emailsent) < datetime(?)",
138 [(datetime
.datetime
.now() - datetime
.timedelta(14)).isoformat()]):
140 rechnung
, preis
= gen_rechnung(tshirt
, zipper
)
142 with
open(os
.path
.join(outdir
, email
), 'w') as f
:
143 f
.write(template
.render(vorname
=vorname
.decode('utf-8'),
144 nachname
=nachname
.decode('utf-8'),
145 email
=email
.decode('utf-8'),
146 token
=gen_token(id, vorname
, nachname
),
147 rechnung
=rechnung
).encode('utf-8'))
149 conn
.execute("UPDATE teilnehmer set emailsent = ?, betrag = ? WHERE id = ?", [datetime
.datetime
.now().isoformat(),
153 def create_nametag(outdir
='output'):
154 template
= env
.get_template('nametag.svg')
156 for vorname
, nachname
, namensschild
, hochschule
in \
157 conn
.execute("SELECT vorname, nachname, namensschild, hochschule FROM teilnehmer"):
159 with
open(os
.path
.join(outdir
, "%s.svg" % namensschild
), 'w') as f
:
160 f
.write(template
.render(name
=u
"%s %s" % (vorname
.decode('utf-8'),
161 nachname
.decode('utf-8')),
162 nick
=namensschild
.decode('utf-8'),
163 uni1
=hochschule
.decode('utf-8')).encode('utf-8'))
167 def create_teilnehmer_list(outdir
= 'output'):
168 template
= env
.get_template('teilnehmerliste.tex')
172 for vor
, nach
, nick
, hochschule
, betrag
, bezahlt
, shirtsize
, zippersize
in \
173 conn
.execute("SELECT vorname, nachname, namensschild, hochschule, betrag, bezahlt, tshirt, zipper FROM teilnehmer ORDER BY UPPER(nachname) ASC"):
175 vor
= vor
.decode('utf8')
176 nach
= nach
.decode('utf8')
177 nick
= nick
.decode('utf8')
178 hochschule
= hochschule
.decode('utf8')
179 ## betrag ist schon int
180 ## bezahlt ist schon int
181 shirtsize
= shirtsize
.decode('utf8')
182 if re
.match("kein", shirtsize
, flags
=re
.IGNORECASE
):
185 zippersize
= zippersize
.decode('utf8')
186 if re
.match("kein", zippersize
, flags
=re
.IGNORECASE
):
189 teilnehmer
.append({'vorname': vor
, 'nachname': nach
, 'num': i
,
190 'hochschule': hochschule
, 'nick': nick
, 'betrag': betrag
, 'bezahlt':
191 bezahlt
, 'shirtsize': shirtsize
, 'zippersize': zippersize
})
195 with
open(os
.path
.join(outdir
, "teilnehmerliste.tex"), 'w') as out
:
196 out
.write(template
.render(teilnehmer
=teilnehmer
).encode('utf-8'))
200 def create_bmbf_list(outdir
= 'output'):
201 template
= env
.get_template('bmbf-unterschriftenliste.tex')
206 for vor
, nach
, hochschule
in \
207 conn
.execute("SELECT vorname, nachname, hochschule FROM teilnehmer ORDER BY UPPER(nachname) ASC"):
209 vor
= vor
.decode('utf8')
210 nach
= nach
.decode('utf8')
211 hochschule
= hochschule
.decode('utf8')
213 teilnehmer
.append({'vorname': vor
, 'nachname': nach
, 'num': i
, 'hochschule': hochschule
})
217 with
open(os
.path
.join(outdir
, "bmbf-unterschriftenliste.tex"), 'w') as out
:
218 out
.write(template
.render(teilnehmer
=teilnehmer
).encode('utf-8'))
222 parser
= argparse
.ArgumentParser(description
="Ultimate Teilnehmertool")
225 group
= parser
.add_mutually_exclusive_group(required
=True)
226 group
.add_argument('--importcsv', action
='store_true',
227 help='Importiere neue Teilnehmer aus CSV')
228 group
.add_argument('--nametag', action
='store_true',
229 help='Generiere Nametags')
230 group
.add_argument('--email', action
='store_true',
231 help='Generiere E-Mails mit Überweisungsinformationen')
232 group
.add_argument('--pay', action
='store_true',
233 help='Speichere Zahlungseingang')
234 group
.add_argument('--remind', action
='store_true',
235 help='Generiere Zahlungsaufforderungserinnerung')
236 group
.add_argument('--bmbf', action
='store_true',
237 help='Generiere BMBF-Unterschriftenliste')
238 group
.add_argument('--liste', action
='store_true',
239 help='Generiere Teilnehmerübersichtsliste')
242 parser
.add_argument('--db', default
='teilnehmer.sqlite',
243 help='Teilnehmerdatenbank')
244 parser
.add_argument('-i', '--input',
246 parser
.add_argument('-o', '--output', default
='output',
247 help='Ausgabeverzeichnis')
249 args
= parser
.parse_args()
252 conn
= sqlite3
.connect(args
.db
)
253 conn
.text_factory
= str
254 conn
.row_factory
= sqlite3
.Row
255 conn
.execute('pragma encoding = "UTF-8";')
257 if args
.nametag
or args
.email
or args
.pay
or args
.remind
or args
.bmbf
or args
.liste
:
259 if not os
.path
.exists(args
.output
):
260 os
.mkdir(args
.output
)
263 create_nametag(args
.output
)
265 create_mail(args
.output
)
267 mark_pay(args
.output
)
269 create_remind(args
.output
)
271 create_bmbf_list(args
.output
)
273 create_teilnehmer_list(args
.output
)
277 import_teilnehmer(args
.input)
279 if __name__
== '__main__':
282 # vim: set expandtab :