Ejemplo n.º 1
0
def dispatchInvitation(invitation: Invitation) -> bool:
    """
    Sends an email to an invitee
    """
    try:
        assert not invitation.mailed and not invitation.fulfilled
    except AssertionError:
        logger.warning(f"Invitation for {invitation.email} was not sent: "
                       "Already fulfilled!")
        return False

    if invitation.refkey is None:
        invitation.refkey = referralKeygen(invitation.email)
        invitation.save()

    if invitation.customemail and invitation.customsig:
        et = EmailTemplate(
            subject=settings.DEFAULT_EMAIL_TITLE,
            headline="Conflict Cartographer",
            message=invitation.customemail,
            signature=invitation.customsig,
        )
    else:
        try:
            et = EmailTemplate.objects.get(active=True, email_type="inv")
        except EmailTemplate.DoesNotExist:
            et = EmailTemplate.objects.create(
                active=True,
                subject=settings.DEFAULT_EMAIL_TITLE,
                email_type="inv")

    html = renderEmailTemplate(et, {"link": invitation.invitationLink()})
    plaintext = re.sub("\[[^\)]+", invitation.invitationLink(), et.message)

    call = {
        "subject": et.subject,
        "message": plaintext,
        "html_message": html,
        "from_email": settings.EMAIL_FROM_ADDRESS,
        "recipient_list": [invitation.email]
    }

    try:
        mail.send_mail(**call)
    except ConnectionRefusedError:
        logger.error("Failed to send email to %s, connection refused!",
                     invitation.email)
        return False
    else:
        logger.info("Sent email to %s", invitation.email)
        invitation.mailed = True
        invitation.save()
        return True