Jun 29 - Implement auto reminder 45 min before user's shift end if not finish checking websites

This commit is contained in:
2026-06-29 17:03:07 -04:00
parent 176e19213c
commit 56a256633b
4 changed files with 59 additions and 7 deletions
+44 -2
View File
@@ -17,6 +17,46 @@ logging.basicConfig(
logger = logging.getLogger("app")
def _run_reminder_job():
"""Background job: send shift-incomplete reminders if within the reminder window."""
from routes.admin_shifts import do_send_incomplete_reminders
try:
result = do_send_incomplete_reminders(triggered_by_user_id=None)
if result["sent"] > 0:
logger.info(f"[scheduler] Shift reminders sent: {result}")
except Exception as e:
logger.error(f"[scheduler] Shift reminder job error: {e}")
def _start_scheduler():
"""
Start a background scheduler that fires shift-incomplete reminder emails
every 5 minutes. Guards against double-start in Flask's debug reloader.
Uses daemon threads so the process exits cleanly even if the scheduler is running.
"""
if os.environ.get("WERKZEUG_RUN_MAIN") == "false":
# Flask reloader: skip in the parent monitor process; the child sets WERKZEUG_RUN_MAIN=true
return
try:
from apscheduler.schedulers.background import BackgroundScheduler
import atexit
scheduler = BackgroundScheduler(daemon=True)
scheduler.add_job(
func=_run_reminder_job,
trigger="interval",
minutes=5,
id="shift_incomplete_reminders",
max_instances=1,
misfire_grace_time=120,
)
scheduler.start()
atexit.register(lambda: scheduler.shutdown(wait=False))
logger.info("[scheduler] Background scheduler started — shift reminders every 5 min.")
except Exception as e:
logger.error(f"[scheduler] Failed to start background scheduler: {e}")
def create_app():
app = Flask(__name__)
@@ -73,10 +113,12 @@ def create_app():
if not os.environ.get("CRON_SECRET"):
logger.warning(
"CRON_SECRET not set in .env — the /internal/cron/* endpoints are "
"disabled. Set CRON_SECRET to enable automated shift reminders."
"CRON_SECRET not set in .env — the /internal/cron/* endpoints are disabled."
)
# ── Background scheduler: automatic shift-incomplete reminders ────────────
_start_scheduler()
# ── CSRF protection (Flask-WTF) ────────────────────────────────────────────
from flask_wtf.csrf import CSRFProtect
CSRFProtect(app)