[c_selection.js] If safari_mobile, get current selection from a previously created global variable
[c_sync.js] ref where the safari_mobile global is used
[c_text_view_comments.js] if safari_mobile update selection also on selectionChange event
[text_view_comments.html] if safari_mobile store a clone of the current selection on each selectionChange
set layout width to 99% to improve display
factorize safari mobile detection code
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, active=True).exclude(type='own')
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), active=True)
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.user != notification.user 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), active=True).exclude(type='own')
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(u"Notification sent [%s] => %s" %(activity,notification.user) if notification.user else u"sending (email) %s => %s" %(activity,notification.email))