src/cm/notifications.py
author Simon Descarpentries <sid@sopinspace.com>
Tue, 06 May 2014 13:52:01 +0200
changeset 651 9bbc657f6837
parent 564 dc415eb33a3f
permissions -rw-r--r--
Replace DISABLE_TRACKING and TRACKING_HTML by a TRACKING_ID variable in configuration files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
from cm.models import Activity, Text, Notification, Comment, ApplicationConfiguration
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
from datetime import datetime, timedelta
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
from django.contrib.auth.models import User
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
from django.db.models import Q, signals
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
from django.utils.translation import ugettext as _
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
from django.template.loader import render_to_string
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
from time import mktime
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
from django.conf import settings
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
from cm.utils.mail import send_mail
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
import django.dispatch
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
import logging
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
class FakeRequest(object):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
    def __init__(self, user):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
        self.user = user
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
def notify(sender, **kwargs):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
    from cm.security import get_viewable_comments, has_perm
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
    allready_notified = set() # avoid sending multiple notifications to same user
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
    activity = kwargs['instance']
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
    if activity.type in Activity.VIEWABLE_ACTIVITIES.get('view_users'): # user activity: only viewed by managers
272
1671766692e5 fix notification bug
raph
parents: 267
diff changeset
    24
        notifications = Notification.objects.filter(text=None, active=True).exclude(type='own')
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
        for notification in notifications:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
            if notification.user:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
                from cm.security import user_has_perm # import here!
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
                if user_has_perm(notification.user, 'can_manage_workspace'):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
                    send_notification(activity, notification)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
                    allready_notified.add(notification.user)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
    elif activity.type in Activity.VIEWABLE_ACTIVITIES.get('view_comments'):
53
3be33d57ab11 do not send notifications after desactivation
raph
parents: 7
diff changeset
    32
        notifications = Notification.objects.filter(Q(text=activity.text) | Q(text=None), active=True)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
        for notification in notifications:            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
            viewable = get_viewable_comments(FakeRequest(notification.user),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
                                             Comment.objects.filter(id__in = [activity.comment.id]),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
                                             text=activity.text)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
            if viewable and \
267
526d9178e290 do not send notifications for comments user created himself
raph
parents: 53
diff changeset
    38
                ((notification.type == 'own' and activity.comment.user != notification.user and activity.comment.top_comment().user == notification.user) or
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
                 (notification.type != 'own')):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
                if not notification.user in allready_notified:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
                    send_notification(activity, notification)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
                    allready_notified.add(notification.user)            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
    elif activity.type in Activity.VIEWABLE_ACTIVITIES.get('view_texts'):
272
1671766692e5 fix notification bug
raph
parents: 267
diff changeset
    44
        notifications = Notification.objects.filter(Q(text=activity.text) | Q(text=None), active=True).exclude(type='own')
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
        for notification in notifications:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
            if notification.user:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
                from cm.security import user_has_perm # import here!
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
                if user_has_perm(notification.user, 'can_view_text', text=activity.text) and not notification.user in allready_notified:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
                    send_notification(activity, notification)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
                    allready_notified.add(notification.user)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
            else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
                if has_perm(None, 'can_view_text', text=activity.text) and not notification.email in allready_notified:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
                    send_notification(activity, notification)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
                    allready_notified.add(notification.email)                
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
signals.post_save.connect(notify, sender=Activity)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
def send_notification(activity, notification):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
    email = notification.user.email if notification.user else notification.email
564
dc415eb33a3f Fix error sending notification to no email.
gibus
parents: 273
diff changeset
    60
    if email:
dc415eb33a3f Fix error sending notification to no email.
gibus
parents: 273
diff changeset
    61
      subject = _('Notification:') + " " + activity.printable_data(html=False, link=False)
dc415eb33a3f Fix error sending notification to no email.
gibus
parents: 273
diff changeset
    62
      message = render_to_string('email/activity_notification.txt',
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
                                   { 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
                                     'activity' : activity,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
                                     'notification' : notification,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
                                     'SITE_URL' : settings.SITE_URL,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
                                     'CONF' : ApplicationConfiguration,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
                                      })
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
    
564
dc415eb33a3f Fix error sending notification to no email.
gibus
parents: 273
diff changeset
    70
      send_mail(subject, message, ApplicationConfiguration['email_from'], [email], fail_silently=True)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
    
564
dc415eb33a3f Fix error sending notification to no email.
gibus
parents: 273
diff changeset
    72
      #logging.debug(u"Notification sent [%s] => %s" %(activity,notification.user) if notification.user else u"sending (email) %s => %s" %(activity,notification.email))