Example #1
0
def send_digest(team_id, for_date, for_project_managers=False):
    """
    Sends digest for the given date to all active members and silent
    recipients of the team.

    Arguments:
        `team`: `Team` object
        `for_date`: A `datetime.datetime` instance in UTC
        `for_project_managers`: Boolean; whether to send only to Project Manager members
    """

    # TODO: create decorator for this repeating pattern: try...except
    try:
        team = Team.objects.get(id=team_id, is_active=True)
    except Team.DoesNotExist:
        logger.exception(
            "Active team with %s ID does not exist." % team_id)
        return

    team_updates = team.get_updates(for_date)

    if team_updates:
        ph_tz = pytz.timezone('Asia/Manila')
        update_for_date = for_date.astimezone(ph_tz).strftime('%a, %b %d %Y')
        context = {
            'members_and_updates': team.get_updates(for_date),
            'team': team,
            'date': update_for_date,
            'domain': get_domain_name(),
        }
        text_body = render_to_string('updates/emails/digest.txt', context)
        html_body = render_to_string('updates/emails/digest.html', context)

        # Prepare email
        from_email = 'Digestus Digest <{email}>'.format(email=team.email)
        subject = 'Digest for {team} for {date}'.format(team=team.name,
                                                        date=update_for_date)
        msg = EmailMultiAlternatives(
            subject=subject,
            body=text_body,
            from_email=from_email,
            to=team.get_recipients(for_project_managers),
        )
        msg.auto_text = True
        msg.preserve_recipients = True
        msg.auto_text = False
        msg.auto_html = False
        msg.attach_alternative(html_body, 'text/html')
        msg.content_subtype = 'html'
        msg.subaccount = team.subaccount_id

        try:
            msg.send()
        except Exception as e:
            logger.exception(
                'Digest sending failed for team with ID: %s. Retrying in 5 minutes.' % team_id)
            send_digest.retry(
                args=[team_id, for_date, for_project_managers],
                exc=e,
                countdown=300,
                max_retries=5,
            )
    else:
        error_msg = 'Team %s has no active members. Sending of digest aborted.' % team.name
        logger.error(error_msg)
Example #2
0
def emit_reminders(vosae_event_id):
    from organizer.models import CalendarList, VosaeEvent
    from notification import models as notifications
    try:
        vosae_event = VosaeEvent.objects.get(id=vosae_event_id)
    except:
        # Event retrieval failed (maybe deleted in the meantime)
        return None
    calendar_lists = CalendarList.objects.filter(calendar=vosae_event.calendar)

    reminders = {'EMAIL': {}, 'POPUP': set([])}
    # Event reminders
    for method in set([
            reminder.method for reminder in vosae_event.reminders.overrides
            if reminder.minutes == vosae_event.next_reminder.threshold
    ]):
        if method == 'EMAIL':
            vosae_users = [
                calendar_list.vosae_user for calendar_list in calendar_lists
            ]
            for vosae_user in vosae_users:
                user_lang = vosae_user.get_language()
                if not user_lang in reminders['EMAIL']:
                    reminders['EMAIL'][user_lang] = set([])
                reminders['EMAIL'][user_lang].update([vosae_user.email])
        elif method == 'POPUP':
            reminders['POPUP'].update([
                unicode(calendar_list.vosae_user.id)
                for calendar_list in calendar_lists
            ])

    # Default reminders
    if vosae_event.reminders.use_default:
        for calendar_list in calendar_lists:
            for method in set([
                    reminder.method for reminder in calendar_list.reminders
                    if reminder.minutes == vosae_event.next_reminder.threshold
            ]):
                if method == 'EMAIL':
                    user_lang = calendar_list.vosae_user.get_language()
                    if not user_lang in reminders['EMAIL']:
                        reminders['EMAIL'][user_lang] = set([])
                    reminders['EMAIL'][user_lang].update(
                        [calendar_list.vosae_user.email])
                elif method == 'POPUP':
                    reminders['POPUP'].update(
                        [unicode(calendar_list.vosae_user.id)])

    # Prefill context
    timezone = vosae_event.get_start_timezone()
    start = vosae_event._get_next_occurrence(
        after=vosae_event.next_reminder.at).astimezone(timezone)
    context = {
        'vosae_event':
        vosae_event,
        'start':
        start.replace(tzinfo=None),
        'timezone':
        start.tzname(),
        'event_url':
        u'{0}/{1}/organizer/event/{2}'.format(settings.WEB_ENDPOINT,
                                              vosae_event.tenant.slug,
                                              unicode(vosae_event.id))
    }

    # Schedule next reminder
    vosae_event._set_next_reminder()
    vosae_event.update(set__next_reminder=vosae_event.next_reminder)
    vosae_event.check_immediate_reminders_emit()

    # Saves notifications
    for recipient in reminders['POPUP']:
        notifications.EventReminder(tenant=vosae_event.tenant,
                                    recipient=DBRef('vosae_user',
                                                    ObjectId(recipient)),
                                    vosae_event=vosae_event,
                                    occurs_at=start,
                                    summary=vosae_event.summary).save()

    # Send mails
    connection = get_connection()
    for language, emails in reminders['EMAIL'].items():
        with respect_language(language):
            plaintext_context = Context(
                autoescape=False)  # HTML escaping not appropriate in plaintext
            subject = render_to_string(
                'organizer/emails/organizer_reminder_subject.txt', context,
                plaintext_context)
            subject = ''.join(subject.splitlines())
            text_body = render_to_string(
                'organizer/emails/organizer_reminder_content.txt', context,
                plaintext_context)
            html_body = render_to_string(
                'organizer/emails/organizer_reminder_content.html', context)

            message = EmailMultiAlternatives(
                subject, text_body, cc=emails, connection=connection
            )  # Mandrill doesn't support BCC so we have to use CC without preserving recipients
            message.attach_alternative(html_body, "text/html")
            message.preserve_recipients = False  # Useful for Mandrill
            message.send()
Example #3
0
def emit_reminders(vosae_event_id):
    from organizer.models import CalendarList, VosaeEvent
    from notification import models as notifications
    try:
        vosae_event = VosaeEvent.objects.get(id=vosae_event_id)
    except:
        # Event retrieval failed (maybe deleted in the meantime)
        return None
    calendar_lists = CalendarList.objects.filter(calendar=vosae_event.calendar)

    reminders = {
        'EMAIL': {},
        'POPUP': set([])
    }
    # Event reminders
    for method in set([reminder.method for reminder in vosae_event.reminders.overrides if reminder.minutes == vosae_event.next_reminder.threshold]):
        if method == 'EMAIL':
            vosae_users = [calendar_list.vosae_user for calendar_list in calendar_lists]
            for vosae_user in vosae_users:
                user_lang = vosae_user.get_language()
                if not user_lang in reminders['EMAIL']:
                    reminders['EMAIL'][user_lang] = set([])
                reminders['EMAIL'][user_lang].update([vosae_user.email])
        elif method == 'POPUP':
            reminders['POPUP'].update([unicode(calendar_list.vosae_user.id) for calendar_list in calendar_lists])

    # Default reminders
    if vosae_event.reminders.use_default:
        for calendar_list in calendar_lists:
            for method in set([reminder.method for reminder in calendar_list.reminders if reminder.minutes == vosae_event.next_reminder.threshold]):
                if method == 'EMAIL':
                    user_lang = calendar_list.vosae_user.get_language()
                    if not user_lang in reminders['EMAIL']:
                        reminders['EMAIL'][user_lang] = set([])
                    reminders['EMAIL'][user_lang].update([calendar_list.vosae_user.email])
                elif method == 'POPUP':
                    reminders['POPUP'].update([unicode(calendar_list.vosae_user.id)])

    # Prefill context
    timezone = vosae_event.get_start_timezone()
    start = vosae_event._get_next_occurrence(after=vosae_event.next_reminder.at).astimezone(timezone)
    context = {
        'vosae_event': vosae_event,
        'start': start.replace(tzinfo=None),
        'timezone': start.tzname(),
        'event_url': u'{0}/{1}/organizer/event/{2}'.format(settings.WEB_ENDPOINT, vosae_event.tenant.slug, unicode(vosae_event.id))
    }

    # Schedule next reminder
    vosae_event._set_next_reminder()
    vosae_event.update(set__next_reminder=vosae_event.next_reminder)
    vosae_event.check_immediate_reminders_emit()

    # Saves notifications
    for recipient in reminders['POPUP']:
        notifications.EventReminder(
            tenant=vosae_event.tenant,
            recipient=DBRef('vosae_user', ObjectId(recipient)),
            vosae_event=vosae_event,
            occurs_at=start,
            summary=vosae_event.summary
        ).save()

    # Send mails
    connection = get_connection()
    for language, emails in reminders['EMAIL'].items():
        with respect_language(language):
            plaintext_context = Context(autoescape=False)  # HTML escaping not appropriate in plaintext
            subject = render_to_string('organizer/emails/organizer_reminder_subject.txt', context, plaintext_context)
            subject = ''.join(subject.splitlines())
            text_body = render_to_string('organizer/emails/organizer_reminder_content.txt', context, plaintext_context)
            html_body = render_to_string('organizer/emails/organizer_reminder_content.html', context)

            message = EmailMultiAlternatives(subject, text_body, cc=emails, connection=connection) # Mandrill doesn't support BCC so we have to use CC without preserving recipients
            message.attach_alternative(html_body, "text/html")
            message.preserve_recipients = False # Useful for Mandrill
            message.send()