diff -r 000000000000 -r 40c8f766c9b8 src/cm/notifications.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cm/notifications.py Mon Nov 23 15:14:29 2009 +0100 @@ -0,0 +1,71 @@ +from cm.models import Activity, Text, Notification, Comment, ApplicationConfiguration +from datetime import datetime, timedelta +from django.contrib.auth.models import User +from django.db.models import Q, signals +from django.utils.translation import ugettext as _ +from django.template.loader import render_to_string +from time import mktime +from django.conf import settings +from cm.utils.mail import send_mail +import django.dispatch +import logging + + +class FakeRequest(object): + def __init__(self, user): + self.user = user + +def notify(sender, **kwargs): + from cm.security import get_viewable_comments, has_perm + allready_notified = set() # avoid sending multiple notifications to same user + + activity = kwargs['instance'] + if activity.type in Activity.VIEWABLE_ACTIVITIES.get('view_users'): # user activity: only viewed by managers + notifications = Notification.objects.filter(text=None) + for notification in notifications: + if notification.user: + from cm.security import user_has_perm # import here! + if user_has_perm(notification.user, 'can_manage_workspace'): + send_notification(activity, notification) + allready_notified.add(notification.user) + elif activity.type in Activity.VIEWABLE_ACTIVITIES.get('view_comments'): + notifications = Notification.objects.filter(Q(text=activity.text) | Q(text=None)) + for notification in notifications: + viewable = get_viewable_comments(FakeRequest(notification.user), + Comment.objects.filter(id__in = [activity.comment.id]), + text=activity.text) + if viewable and \ + ((notification.type == 'own' and activity.comment.top_comment().user == notification.user) or + (notification.type != 'own')): + if not notification.user in allready_notified: + send_notification(activity, notification) + allready_notified.add(notification.user) + elif activity.type in Activity.VIEWABLE_ACTIVITIES.get('view_texts'): + notifications = Notification.objects.filter(Q(text=activity.text) | Q(text=None)) + for notification in notifications: + if notification.user: + from cm.security import user_has_perm # import here! + if user_has_perm(notification.user, 'can_view_text', text=activity.text) and not notification.user in allready_notified: + send_notification(activity, notification) + allready_notified.add(notification.user) + else: + if has_perm(None, 'can_view_text', text=activity.text) and not notification.email in allready_notified: + send_notification(activity, notification) + allready_notified.add(notification.email) + +signals.post_save.connect(notify, sender=Activity) + +def send_notification(activity, notification): + email = notification.user.email if notification.user else notification.email + subject = _('Notification:') + " " + activity.printable_data(html=False, link=False) + message = render_to_string('email/activity_notification.txt', + { + 'activity' : activity, + 'notification' : notification, + 'SITE_URL' : settings.SITE_URL, + 'CONF' : ApplicationConfiguration, + }) + + send_mail(subject, message, ApplicationConfiguration['email_from'], [email], fail_silently=True) + + logging.debug("Notification sent [%s] => %s" %(activity,notification.user) if notification.user else "sending (email) %s => %s" %(activity,notification.email))