local_periodic_tasks.py 2.92 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# Copyright 2014 Budapest University of Technology and Economics (BME IK)
#
# This file is part of CIRCLE Cloud.
#
# CIRCLE is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# CIRCLE is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along
# with CIRCLE.  If not, see <http://www.gnu.org/licenses/>.

import logging
from django.conf import settings
from django.core.mail import send_mail
21 22
from django.core.urlresolvers import reverse
from django.db.models import Q
23 24 25 26 27 28
from django.template.loader import render_to_string
from django.utils import timezone
from django.utils.translation import ungettext, override

from manager.mancelery import celery
from ..models import Notification
29
from ..views import UnsubscribeFormView
30 31 32 33 34 35

logger = logging.getLogger(__name__)


@celery.task(ignore_result=True)
def send_email_notifications():
36 37 38
    q = Q(status=Notification.STATUS.new) & (
        Q(valid_until__lt=timezone.now()) | Q(valid_until=None))
    from_email = settings.DEFAULT_FROM_EMAIL
39

40 41 42 43 44 45
    recipients = {}
    for i in Notification.objects.filter(q):
        recipients.setdefault(i.to, [])
        recipients[i.to].append(i)

    for user, msgs in recipients.iteritems():
46 47
        if (not user.profile or not user.email or not
                user.profile.email_notifications):
48
            logger.debug("%s gets no notifications", unicode(user))
49
            continue
50
        with override(user.profile.preferred_language):
51
            context = {'user': user.profile, 'messages': msgs,
52 53
                       'url': (settings.DJANGO_URL.rstrip("/") +
                               reverse("dashboard.views.notifications")),
54 55 56
                       'unsub': (settings.DJANGO_URL.rstrip("/") + reverse(
                           "dashboard.views.unsubscribe",
                           args=[UnsubscribeFormView.get_token(user)])),
57
                       'site': settings.COMPANY_NAME}
58 59 60
            subject = settings.EMAIL_SUBJECT_PREFIX + ungettext(
                "%d new notification",
                "%d new notifications", len(msgs)) % len(msgs)
61 62 63 64 65
            body = render_to_string('dashboard/notifications/email.txt',
                                    context)
        try:
            send_mail(subject, body, from_email, (user.email, ))
        except:
66
            logger.error("Failed to send mail to %s", user, exc_info=True)
67
        else:
68
            logger.info("Delivered notifications %s",
69 70 71 72
                        " ".join(unicode(i.pk) for i in msgs))
            for i in msgs:
                i.status = i.STATUS.delivered
                i.save()