X-Git-Url: https://git.siccegge.de//index.cgi?a=blobdiff_plain;f=teilnehmertool.py;h=0408eb22ed886723ac792b4c7cb20c74736fd1b2;hb=f4ea1e680e265a8df411b3e2a81a924aee6c529c;hp=1547678c2ba04b9ddf0163072231fa56607565a0;hpb=cf3c08ec207422fdd3f6198f68f2013a5e65c76f;p=teilnehmertool.git diff --git a/teilnehmertool.py b/teilnehmertool.py old mode 100644 new mode 100755 index 1547678..0408eb2 --- a/teilnehmertool.py +++ b/teilnehmertool.py @@ -1,18 +1,84 @@ #!/usr/bin/python # -*- coding: utf-8 -*- +import argparse import sqlite3 +import datetime +import csv import string import jinja2 import os import os.path +import re -conn = sqlite3.connect('teilnehmer.sqlite') -conn.text_factory = str +conn = None -env = jinja2.Environment(loader=jinja2.FileSystemLoader('templates')) -def create_mail(): +env = jinja2.Environment(loader=jinja2.FileSystemLoader('templates', encoding='utf-8')) + + +## jinja2 TeX espaping from http://flask.pocoo.org/snippets/55/ +LATEX_SUBS = [ + (re.compile(r'\\'), r'\\textbackslash'), + (re.compile(r'([{}_#%&$])'), r'\\\1'), + (re.compile(r'~'), r'\~{}'), + (re.compile(r'\^'), r'\^{}'), + (re.compile(r'"'), r"''"), + (re.compile(r'\.\.\.+'), r'\\ldots'), +] + +def escape_tex(value): + newval = value + for pattern, replacement in LATEX_SUBS: + newval = pattern.sub(replacement, newval) + return newval + +env.filters['escape_tex'] = escape_tex + + +def import_teilnehmer(input): + ids = set([ i[0] for i in conn.execute('SELECT id FROM teilnehmer').fetchall() ]) + + with open(input) as f: + reader = csv.reader(f, delimiter=';', quotechar='"') + for row in reader: + if row[0] == '#': + continue + if not int(row[0]) in ids: + print "Importing %s" % (row, ) + conn.execute("INSERT INTO teilnehmer VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + row[:-2] + ['Kein T-Shirt', 'Kein Pulli'] + row[-2:] + [0, 0, 0]) + + conn.commit() + +def mark_pay(outdir): + betrag = int(raw_input("Betrag: ")) + + template = env.get_template('eingangsbestaetigung.eml') + + while True: + uid = raw_input("User: ") + if uid == "": + break + uid = int(uid) + vorname, nachname, email, bezahlt = \ + conn.execute("SELECT vorname, nachname, email, bezahlt FROM teilnehmer WHERE id = ?", [uid]).fetchone() + + if bezahlt == betrag: + continue + + conn.execute("UPDATE teilnehmer SET bezahlt = ? WHERE id = ?", [betrag, uid]) + + + with open(os.path.join(outdir, email), 'w') as f: + f.write(template.render(vorname=vorname.decode('utf-8'), + nachname=nachname.decode('utf-8'), + email=email.decode('utf-8'), + betrag=betrag).encode('utf-8')) + + conn.commit() + +def create_mail(outdir='output'): def gen_rechnung(tshirt, zipper): preis = 25 kosten = u"" @@ -24,27 +90,193 @@ def create_mail(): kosten += ' '*2 + 29*'-' + '+' + 6*'-' + '\n' kosten += u"%s | %s\n" % (u" Summe".ljust(30), "%2d.00" % preis) - return kosten + return kosten, preis def gen_token(id, vorname, nachname): return u"%s-%s-%s" % (id, nachname.decode('utf-8').upper(), vorname.decode('utf-8').upper()) - if not os.path.exists('output'): - os.mkdir('output') - template = env.get_template('teilnehmerbeitrag.eml') for id, vorname, nachname, email, tshirt, zipper in \ conn.execute("SELECT id, vorname, nachname, email, tshirt, zipper FROM teilnehmer WHERE emailsent = 0"): - with open(os.path.join('output', email), 'w') as f: + rechnung, preis = gen_rechnung(tshirt, zipper) + + with open(os.path.join(outdir, email), 'w') as f: + f.write(template.render(vorname=vorname.decode('utf-8'), + nachname=nachname.decode('utf-8'), + email=email.decode('utf-8'), + token=gen_token(id, vorname, nachname), + rechnung=rechnung).encode('utf-8')) + + conn.execute("UPDATE teilnehmer set emailsent = ?, betrag = ? WHERE id = ?", [datetime.datetime.now().isoformat(), + preis, id]) + conn.commit() + +def create_remind(outdir='output'): + def gen_rechnung(tshirt, zipper): + preis = 25 + kosten = u"" + kosten += u"%s | %s\n" % (u" Konferenzbeitrag".ljust(30), "25.00") + kosten += u"%s | %s\n" % ((u" T-Shirt (Größe %s)" % tshirt).ljust(30), " 0.00") + if zipper != 'Kein Pulli': + kosten += u"%s | %s\n" % ((u" Kapuzenzipper (Größe %s)" % zipper).ljust(30), "25.00") + preis += 25 + kosten += ' '*2 + 29*'-' + '+' + 6*'-' + '\n' + kosten += u"%s | %s\n" % (u" Summe".ljust(30), "%2d.00" % preis) + + return kosten, preis + + def gen_token(id, vorname, nachname): + return u"%s-%s-%s" % (id, nachname.decode('utf-8').upper(), vorname.decode('utf-8').upper()) + + template = env.get_template('erinnerung.eml') + + for id, vorname, nachname, email, tshirt, zipper in \ + conn.execute("SELECT id, vorname, nachname, email, tshirt, zipper FROM teilnehmer " + + "WHERE bezahlt < 25 AND datetime(emailsent) < datetime(?)", + [(datetime.datetime.now() - datetime.timedelta(14)).isoformat()]): + + rechnung, preis = gen_rechnung(tshirt, zipper) + + with open(os.path.join(outdir, email), 'w') as f: f.write(template.render(vorname=vorname.decode('utf-8'), nachname=nachname.decode('utf-8'), email=email.decode('utf-8'), token=gen_token(id, vorname, nachname), - rechnung=gen_rechnung(tshirt, zipper)).encode('utf-8')) + rechnung=rechnung).encode('utf-8')) + + conn.execute("UPDATE teilnehmer set emailsent = ?, betrag = ? WHERE id = ?", [datetime.datetime.now().isoformat(), + preis, id]) + conn.commit() + +def create_nametag(outdir='output'): + template = env.get_template('nametag.svg') + + for vorname, nachname, namensschild, hochschule in \ + conn.execute("SELECT vorname, nachname, namensschild, hochschule FROM teilnehmer"): + + with open(os.path.join(outdir, "%s.svg" % namensschild), 'w') as f: + f.write(template.render(name=u"%s %s" % (vorname.decode('utf-8'), + nachname.decode('utf-8')), + nick=namensschild.decode('utf-8'), + uni1=hochschule.decode('utf-8')).encode('utf-8')) + + + +def create_teilnehmer_list(outdir = 'output'): + template = env.get_template('teilnehmerliste.tex') + + teilnehmer = [] + i = 1 + for vor, nach, nick, hochschule, betrag, bezahlt, shirtsize, zippersize in \ + conn.execute("SELECT vorname, nachname, namensschild, hochschule, betrag, bezahlt, tshirt, zipper FROM teilnehmer ORDER BY UPPER(nachname) ASC"): + + vor = vor.decode('utf8') + nach = nach.decode('utf8') + nick = nick.decode('utf8') + hochschule = hochschule.decode('utf8') + ## betrag ist schon int + ## bezahlt ist schon int + shirtsize = shirtsize.decode('utf8') + if re.match("kein", shirtsize, flags=re.IGNORECASE): + shirtsize = "" + + zippersize = zippersize.decode('utf8') + if re.match("kein", zippersize, flags=re.IGNORECASE): + zippersize = "" + + teilnehmer.append({'vorname': vor, 'nachname': nach, 'num': i, + 'hochschule': hochschule, 'nick': nick, 'betrag': betrag, 'bezahlt': + bezahlt, 'shirtsize': shirtsize, 'zippersize': zippersize}) + i = i+1 + + with open(os.path.join(outdir, "teilnehmerliste.tex"), 'w') as out: + out.write(template.render(teilnehmer=teilnehmer).encode('utf-8')) + + + +def create_bmbf_list(outdir = 'output'): + template = env.get_template('bmbf-unterschriftenliste.tex') + + + teilnehmer = [] + i = 1 + for vor, nach, hochschule in \ + conn.execute("SELECT vorname, nachname, hochschule FROM teilnehmer ORDER BY UPPER(nachname) ASC"): + + vor = vor.decode('utf8') + nach = nach.decode('utf8') + hochschule = hochschule.decode('utf8') + + teilnehmer.append({'vorname': vor, 'nachname': nach, 'num': i, 'hochschule': hochschule}) + i = i+1 + + + with open(os.path.join(outdir, "bmbf-unterschriftenliste.tex"), 'w') as out: + out.write(template.render(teilnehmer=teilnehmer).encode('utf-8')) + + +def main(): + parser = argparse.ArgumentParser(description="Ultimate Teilnehmertool") + + # Modus + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('--importcsv', action='store_true', + help='Importiere neue Teilnehmer aus CSV') + group.add_argument('--nametag', action='store_true', + help='Generiere Nametags') + group.add_argument('--email', action='store_true', + help='Generiere E-Mails mit Überweisungsinformationen') + group.add_argument('--pay', action='store_true', + help='Speichere Zahlungseingang') + group.add_argument('--remind', action='store_true', + help='Generiere Zahlungsaufforderungserinnerung') + group.add_argument('--bmbf', action='store_true', + help='Generiere BMBF-Unterschriftenliste') + group.add_argument('--liste', action='store_true', + help='Generiere Teilnehmerübersichtsliste') + + # Argumente + parser.add_argument('--db', default='teilnehmer.sqlite', + help='Teilnehmerdatenbank') + parser.add_argument('-i', '--input', + help='Eingabedatei') + parser.add_argument('-o', '--output', default='output', + help='Ausgabeverzeichnis') + + args = parser.parse_args() + + global conn + conn = sqlite3.connect(args.db) + conn.text_factory = str + conn.row_factory = sqlite3.Row + conn.execute('pragma encoding = "UTF-8";') + + if args.nametag or args.email or args.pay or args.remind or args.bmbf or args.liste: + assert(args.output) + if not os.path.exists(args.output): + os.mkdir(args.output) + + if args.nametag: + create_nametag(args.output) + elif args.email: + create_mail(args.output) + elif args.pay: + mark_pay(args.output) + elif args.remind: + create_remind(args.output) + elif args.bmbf: + create_bmbf_list(args.output) + elif args.liste: + create_teilnehmer_list(args.output) + + elif args.importcsv: + assert(args.input) + import_teilnehmer(args.input) if __name__ == '__main__': - create_mail() - + main() + +# vim: set expandtab :