Files
InviteMe/app/tasks.py
T
2026-09-01 11:03:25 +03:00

51 lines
2.0 KiB
Python

import logging
from rq import get_current_job
logger = logging.getLogger(__name__)
def send_event_invitations(event_id, initiated_by_id=None):
from app import create_app
app = create_app()
with app.app_context():
return send_event_invitations_in_context(event_id, initiated_by_id)
def send_event_invitations_in_context(event_id, initiated_by_id=None):
from app import db
from app.models import AuditLog, Event, Guest, User
from app.services.email_service import send_invitation
from app.services.qr_service import generate_qr_for_guest
event = db.session.get(Event, event_id)
if not event:
raise RuntimeError(f"Мероприятие {event_id} не найдено")
guests = Guest.query.filter_by(event_id=event.id, is_active=True, invitation_sent=False).order_by(Guest.id).all()
total = len(guests)
sent = failed = 0
job = get_current_job()
for processed, guest in enumerate(guests, start=1):
if not guest.qr_filename:
generate_qr_for_guest(guest)
try:
send_invitation(guest)
sent += 1
except Exception as exc:
failed += 1
logger.warning("Invitation delivery failed for guest %s: %s", guest.id, exc)
db.session.commit()
if job:
job.meta.update({"event_id": event.id, "total": total, "processed": processed, "sent": sent, "failed": failed})
job.save_meta()
initiator = db.session.get(User, initiated_by_id) if initiated_by_id else None
db.session.add(AuditLog(
user_id=initiator.id if initiator else None,
username=initiator.username if initiator else "system",
action="event_send_invitations", target_type="event", target_id=str(event.id),
details=f"Фоновая рассылка завершена: отправлено {sent}, ошибок {failed}",
))
db.session.commit()
return {"event_id": event.id, "total": total, "sent": sent, "failed": failed}