Compare commits

...

3 Commits

Author SHA1 Message Date
Peter J. Holzer 31bc47340d Announce status changes to all voters 2025-01-27 00:43:28 +01:00
Peter J. Holzer 44e06659b3 Merge branch 'range' 2025-01-26 22:49:22 +01:00
Peter J. Holzer be014dfb27 Allow null preferences 2025-01-26 22:48:32 +01:00
2 changed files with 92 additions and 3 deletions

82
announce_status_change Executable file
View File

@ -0,0 +1,82 @@
#!/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"<meeat.{new_news.id}@hjp.at>"
if last_news:
emsg["In-Reply-To"] = f"<meeat.{last_news.id}@hjp.at>"
emsg.set_content(msg)
mta = smtplib.SMTP(host="localhost")
mta.send_message(emsg)

View File

@ -2,6 +2,7 @@ table meet
column meet id serial primary key
column meet title text not null
column meet key text unique
column meet active boolean default true
table date
column date id serial primary key
@ -30,14 +31,20 @@ column bod keychange timestamptz default now()
table date_vote
column date_vote date int not null references date
column date_vote bod int not null references bod
column date_vote preference float4 not null
column date_vote preference float4
table time_vote
column time_vote time int not null references time
column time_vote bod int not null references bod
column time_vote preference float4 not null
column time_vote preference float4
table place_vote
column place_vote place int not null references place
column place_vote bod int not null references bod
column place_vote preference float4 not null
column place_vote preference float4
table news
column news id serial primary key
column news meet int references meet not null
column news ts timestamptz not null default now()
column news content text not null