Jun 29 - Implement auto reminder 45 min before user's shift end if not finish checking websites
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user