src/cm/notifications.py
author gibus
Wed, 11 Sep 2013 23:13:01 +0200
changeset 532 0bad3613f59d
parent 273 05d59fd34d00
child 564 dc415eb33a3f
permissions -rw-r--r--
Reverse to YUI 3.0.0 since with YUI.3.10.3, comment content including words 'paragraph' or 'section' do not show up on Firefox, this is weird and has to be investigated.
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
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
    subject = _('Notification:') + " " + activity.printable_data(html=False, link=False)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
    message = render_to_string('email/activity_notification.txt',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
                                   { 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
                                     'activity' : activity,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
                                     'notification' : notification,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
                                     'SITE_URL' : settings.SITE_URL,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
                                     'CONF' : ApplicationConfiguration,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
                                      })
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
    send_mail(subject, message, ApplicationConfiguration['email_from'], [email], fail_silently=True)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
    
7
548c727b8dc2 FIX: unicode (and commenting) in notification logging
raph
parents: 0
diff changeset
    71
    #logging.debug(u"Notification sent [%s] => %s" %(activity,notification.user) if notification.user else u"sending (email) %s => %s" %(activity,notification.email))