diff --git a/src/api/main.py b/src/api/main.py index 0dfea57..5c803ed 100644 --- a/src/api/main.py +++ b/src/api/main.py @@ -10,7 +10,7 @@ Benutzernamen im Remote-User-Header mitschickt.""" import json import logging import secrets -from datetime import date, datetime +from datetime import datetime from urllib.parse import quote_plus from fastapi import Depends, FastAPI, Query, Request @@ -424,7 +424,6 @@ def admin_test_send( if not is_admin: return RedirectResponse(url="/", status_code=303) - target = date(2026, 8, 6) try: Config.validate_mailer() except RuntimeError as exc: @@ -453,9 +452,22 @@ def admin_test_send( status_code=400, ) - sent_count = 0 - errors = [] with db.get_connection() as conn: + target = db.get_most_common_birthday(conn) + if target is None: + return templates.TemplateResponse( + "admin.html", + { + "request": request, + "current_user": current_user, + "show_all": request.session.get("show_all", False), + "error": "Keine Kontakte mit Geburtstag in der Datenbank", + }, + status_code=400, + ) + + sent_count = 0 + errors = [] for account in mail_accounts: birthdays = fetch_todays_birthdays_for_account(conn, account.name, target) if not birthdays: diff --git a/src/api/templates/admin.html b/src/api/templates/admin.html index cb262ce..006ef8c 100644 --- a/src/api/templates/admin.html +++ b/src/api/templates/admin.html @@ -227,10 +227,10 @@
E-Mail-Test
- +
- Sendet eine Test-Geburtstagsmail an die im Account hinterlegte Adresse (birthday_mail_to) mit allen Kontakten, die am 6. August Geburtstag haben. Das Layout entspricht der täglichen Geburtstagsmail. + Sendet eine Test-Geburtstagsmail an die im Account hinterlegte Adresse (birthday_mail_to) mit allen Kontakten, die am beliebtesten Geburtstag haben. Das Layout entspricht der täglichen Geburtstagsmail.
diff --git a/src/db.py b/src/db.py index af1b69d..1aedc80 100644 --- a/src/db.py +++ b/src/db.py @@ -5,7 +5,7 @@ import logging import os import uuid from contextlib import contextmanager -from datetime import datetime, timezone +from datetime import date, datetime, timezone import pymysql from pymysql.cursors import DictCursor @@ -231,6 +231,22 @@ def search_contacts_without_social(conn, account: str | None) -> list[dict]: return cur.fetchall() +def get_most_common_birthday(conn) -> date | None: + with conn.cursor() as cur: + cur.execute( + """SELECT MONTH(birthday) AS m, DAY(birthday) AS d, COUNT(*) AS cnt + FROM contacts + WHERE birthday IS NOT NULL + GROUP BY m, d + ORDER BY cnt DESC + LIMIT 1""" + ) + row = cur.fetchone() + if not row: + return None + return date(datetime.now().year, row["m"], row["d"]) + + def get_upcoming_birthdays(conn, account: str | None, days: int = 7) -> list[dict]: where_clause, params = _account_filter_clause(account) today = datetime.now(Config.TIMEZONE).date()