"""Celery task: welcome email on school onboarding.""" import logging from app.worker import celery_app logger = logging.getLogger(__name__) @celery_app.task(name="onboarding.send_welcome_email") def send_welcome_email(school_id: str): """Send welcome email with license key to new school.""" import os from sqlalchemy import create_engine, select from sqlalchemy.orm import sessionmaker from app.models.school import School from app.models.license import License from app.services.email import send_email db_url = os.getenv("DATABASE_URL", "postgresql://postgres:postgres@db:5432/taptrack_hub") engine = create_engine(db_url.replace("postgresql+asyncpg://", "postgresql://"), pool_pre_ping=True) db = sessionmaker(bind=engine)() try: school = db.get(School, school_id) if not school: return lic = db.execute(select(License).where(License.school_id == school_id)).scalar_one_or_none() email_to = school.billing_email or school.contact_email if not email_to: logger.warning("No email for school %s — skipping welcome", school.name) return hub_url = os.getenv("HUB_BASE_URL", "http://localhost:8090") license_key = lic.key if lic else "Contact support to get your license key" plain = ( f"Welcome to TapTrack Hub!\n\n" f"Your school '{school.name}' has been registered.\n\n" f"License Key: {license_key}\n\n" f"Setup instructions:\n" f"1. Log in to TapTrack Hub: {hub_url}/login\n" f"2. Enter your license key in TapTrack's Hub settings\n" f"3. Restart the TapTrack service\n\n" f"Support: support@taptrack.io\n\nTapTrack Hub Team" ) send_email( to=email_to, subject=f"Welcome to TapTrack Hub — {school.name}", body=plain, email_type="welcome", school_id=school.id, ) logger.info("Welcome email sent to %s for school %s", email_to, school.name) except Exception as e: logger.error("send_welcome_email error for %s: %s", school_id, e) finally: db.close() engine.dispose()