#!/usr/bin/python3 import datetime import email.message import smtplib import psycopg import config min_distance = datetime.timedelta(minutes=60) def simple_sum(meet_id, kind): q = \ f""" select k.*, sum(preference) as preference from {kind} k join {kind}_vote v on k.id = v.{kind} where k.meet = %s group by k.id order by preference desc """ csr.execute(q, (meet_id,)) return csr.fetchall() db = psycopg.connect(dbname=config.dbname, user=config.dbuser) csr = db.cursor(row_factory=psycopg.rows.namedtuple_row) csr.execute("select * from meet where active") for meet in csr.fetchall(): csr.execute( """ select distinct email, short from date_vote join date on date_vote.date = date.id join bod on date_vote.bod = bod.id where meet = %s order by email """, (meet.id,)) voters = csr.fetchall() dates = simple_sum(meet.id, "date") times = simple_sum(meet.id, "time") places = simple_sum(meet.id, "place") msg = "Aktueller Favorit:\n\n" \ f" {dates[0].date}, {times[0].time}\n" \ f" im {places[0].name}\n\n\n" \ "Abgestimmt haben:\n\n" for v in voters: msg += f" * {v.email}\n" csr.execute( """ select *, now() - ts as age from news where meet = %s order by ts desc limit 1 """, (meet.id,)) last_news = csr.fetchone() if not last_news or last_news.content != msg and last_news.age >= min_distance: print(msg) csr.execute( """ insert into news(meet, ts, content) values(%s, now(), %s) returning id """, (meet.id, msg)) new_news = csr.fetchone() db.commit() emsg = email.message.EmailMessage() emsg["From"] ="noreply@hjp.at" emsg["To"] = ", ".join(v.email for v in voters) emsg["Subject"] = "Neuer Zwischenstand: " + meet.title emsg["Message-ID"] = f"" if last_news: emsg["In-Reply-To"] = f"" emsg.set_content(msg) mta = smtplib.SMTP(host="localhost") mta.send_message(emsg)