local_periodic_tasks.py 2.68 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 29 30 31 32 33 34
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

logger = logging.getLogger(__name__)


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

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

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