diff --git a/seahub/notifications/management/commands/send_notices.py b/seahub/notifications/management/commands/send_notices.py index d2d82b4793..a25a865dee 100644 --- a/seahub/notifications/management/commands/send_notices.py +++ b/seahub/notifications/management/commands/send_notices.py @@ -1,22 +1,24 @@ # encoding: utf-8 import datetime import logging -import string import simplejson as json import os +import re from django.utils.http import urlquote -from django.core.management.base import BaseCommand, CommandError +from django.core.management.base import BaseCommand from django.core.urlresolvers import reverse +from django.utils.html import escape import seaserv from seaserv import seafile_api from seahub.base.models import CommandsLastCheck from seahub.notifications.models import UserNotification -from seahub.utils import send_html_email, get_service_url +from seahub.utils import send_html_email, get_service_url, \ + get_site_scheme_and_netloc import seahub.settings as settings -from seahub.avatar.util import get_primary_avatar, get_default_avatar_url -from django.template import Context, loader +from seahub.avatar.templatetags.avatar_tags import avatar +from seahub.base.templatetags.seahub_tags import email2nickname # Get an instance of a logger logger = logging.getLogger(__name__) @@ -33,15 +35,98 @@ class Command(BaseCommand): self.do_action() logger.debug('Finish sending user notices.\n') - def get_avatar_url(self, user, size=20): + def get_avatar_url(self, username, default_size=20): + img_tag = avatar(username, default_size) + pattern = r'src="(.*)"' + repl = r'src="%s\1"' % get_site_scheme_and_netloc() + return re.sub(pattern, repl, img_tag) - avatar = get_primary_avatar(user, size) - if avatar: - avatar_url = avatar.avatar_url(size) - else: - avatar_url = get_default_avatar_url() + def format_priv_file_share_msg(self, notice): + d = json.loads(notice.detail) + priv_share_token = d['priv_share_token'] + notice.priv_shared_file_url = reverse('view_priv_shared_file', + args=[priv_share_token]) + notice.priv_shared_file_from = escape(email2nickname(d['share_from'])) + notice.priv_shared_file_name = d['file_name'] + notice.priv_shared_file_from_avatar_url = self.get_avatar_url(d['share_from']) - return avatar_url + return notice + + def format_user_message(self, notice): + notice.user_msg_from = escape(email2nickname(notice.detail)) + notice.user_msg_from_avatar_url = self.get_avatar_url(notice.detail) + notice.user_msg_url = reverse('user_msg_list', args=[notice.detail]) + return notice + + def format_group_message(self, notice): + d = json.loads(notice.detail) + group_id = d['group_id'] + group = seaserv.get_group(int(group_id)) + if group is None: + notice.delete() + + notice.group_url = reverse('group_discuss', args=[group.id]) + notice.group_msg_from = escape(email2nickname(d['msg_from'])) + notice.group_name = group.group_name + notice.group_msg_from_avatar_url = self.get_avatar_url(d['msg_from']) + return notice + + def format_grpmsg_reply(self, notice): + d = json.loads(notice.detail) + + notice.group_msg_reply_url = reverse('msg_reply_new') + notice.group_msg_reply_from = escape(email2nickname(d['reply_from'])) + notice.group_msg_reply_from_avatar_url = self.get_avatar_url(d['reply_from']) + return notice + + def format_repo_share_msg(self, notice): + d = json.loads(notice.detail) + + repo_id = d['repo_id'] + repo = seafile_api.get_repo(repo_id) + if repo is None: + notice.delete() + + notice.repo_url = reverse('repo', args=[repo.id]) + notice.repo_share_from = escape(email2nickname(d['share_from'])) + notice.repo_name = repo.name + notice.repo_share_from_avatar_url = self.get_avatar_url(d['share_from']) + return notice + + def format_file_uploaded_msg(self, notice): + d = json.loads(notice.detail) + + file_name = d['file_name'] + repo_id = d['repo_id'] + uploaded_to = d['uploaded_to'].rstrip('/') + file_path = uploaded_to + '/' + file_name + file_link = reverse('repo_view_file', args=[repo_id]) + '?p=' + urlquote(file_path) + folder_link = reverse('repo', args=[repo_id]) + '?p=' + urlquote(uploaded_to) + folder_name = os.path.basename(uploaded_to) + + notice.uploaded_file_link = file_link + notice.uploaded_file_name = file_name + notice.uploaded_folder_link = folder_link + notice.uploaded_folder_name = folder_name + return notice + + def format_group_join_request(self, notice): + d = json.loads(notice.detail) + username = d['username'] + group_id = d['group_id'] + join_request_msg = d['join_request_msg'] + + group = seaserv.get_group(group_id) + if group is None: + notice.delete() + + notice.grpjoin_user_profile_url = reverse('user_profile', + args=[username]) + notice.grpjoin_group_url = reverse('group_members', args=[group_id]) + notice.grpjoin_username = username + notice.grpjoin_group_name = group.group_name, + notice.grpjoin_request_msg = join_request_msg, + return notice def do_action(self): now = datetime.datetime.now() @@ -66,119 +151,56 @@ class Command(BaseCommand): email_ctx = {} for notice in unseen_notices: - if email_ctx.has_key(notice.to_user): + if notice.to_user in email_ctx: email_ctx[notice.to_user] += 1 else: email_ctx[notice.to_user] = 1 for to_user, count in email_ctx.items(): - notices = [] for notice in unseen_notices: - if notice.to_user == to_user: + if notice.to_user != to_user: + continue - if notice.msg_type == "priv_file_share": + if notice.is_priv_file_share_msg(): + notice = self.format_priv_file_share_msg(notice) - d = json.loads(notice.detail) + elif notice.is_user_message(): + notice = self.format_user_message(notice) - priv_share_token = d['priv_share_token'] + elif notice.is_group_msg(): + notice = self.format_group_message(notice) - notice.priv_shared_file_url = reverse('view_priv_shared_file', args=[priv_share_token]) - notice.priv_shared_file_from = d['share_from'] - notice.priv_shared_file_name = d['file_name'] - notice.priv_shared_file_from_avatar_url = self.get_avatar_url(d['share_from']) + elif notice.is_grpmsg_reply(): + notice = self.format_grpmsg_reply(notice) - if notice.msg_type == "user_message": - notice.user_msg_from_avatar_url = self.get_avatar_url(notice.detail) + elif notice.is_repo_share_msg(): + notice = self.format_repo_share_msg(notice) - notice.user_msg_url = reverse('user_msg_list', args=[notice.detail]) + elif notice.is_file_uploaded_msg(): + notice = self.format_file_uploaded_msg(notice) - if notice.msg_type == "group_msg": - d = json.loads(notice.detail) + elif notice.is_group_join_request(): + notice = self.format_group_join_request(notice) - group_id = d['group_id'] - group = seaserv.get_group(int(group_id)) - if group is None: - notice.delete() + notices.append(notice) - notice.group_url = reverse('group_discuss', args=[group.id]) - notice.group_msg_from = d['msg_from'] - notice.group_name = group.group_name - notice.group_msg_from_avatar_url = self.get_avatar_url(d['msg_from']) + if not notices: + continue - if notice.msg_type == "grpmsg_reply": - d = json.loads(notice.detail) + subject = subjects[1] if count > 1 else subjects[0] + c = { + 'to_user': to_user, + 'notice_count': count, + 'notices': notices, + 'avatar_url': self.get_avatar_url(to_user), + 'service_url': get_service_url(), + } - notice.group_msg_reply_url = reverse('msg_reply_new') - notice.group_msg_reply_from = d['reply_from'] - notice.group_msg_reply_from_avatar_url = self.get_avatar_url(d['reply_from']) - - if notice.msg_type == "repo_share": - d = json.loads(notice.detail) + try: + send_html_email(subject, 'notifications/notice_email.html', c, + None, [to_user]) - repo_id = d['repo_id'] - repo = seafile_api.get_repo(repo_id) - if repo is None: - notice.delete() - - notice.repo_url = reverse('repo', args=[repo.id]) - notice.repo_share_from = d['share_from'] - notice.repo_name = repo.name - notice.repo_share_from_avatar_url = self.get_avatar_url(d['share_from']) - - if notice.msg_type == "file_uploaded": - d = json.loads(notice.detail) - - file_name = d['file_name'] - repo_id = d['repo_id'] - uploaded_to = d['uploaded_to'].rstrip('/') - file_path = uploaded_to + '/' + file_name - file_link = reverse('repo_view_file', args=[repo_id]) + '?p=' + urlquote(file_path) - folder_link = reverse('repo', args=[repo_id]) + '?p=' + urlquote(uploaded_to) - folder_name = os.path.basename(uploaded_to) - - notice.uploaded_file_link = file_link - notice.uploaded_file_name = file_name - notice.uploaded_folder_link = folder_link - notice.uploaded_folder_name = folder_name - - if notice.msg_type == "group_join_request": - d = json.loads(notice.detail) - - username = d['username'] - group_id = d['group_id'] - join_request_msg = d['join_request_msg'] - - group = seaserv.get_group(group_id) - if group is None: - notice.delete() - - notice.grpjoin_user_profile_url = reverse('user_profile', args=[username]), - notice.grpjoin_group_url = reverse('group_members', args=[group_id]) - notice.grpjoin_username = username - notice.grpjoin_group_name = group.group_name, - notice.grpjoin_request_msg = join_request_msg, - - notices.append(notice) - - if notices: - subject = subjects[1] if count > 1 else subjects[0] - avatar_url = self.get_avatar_url(to_user) - service_url = get_service_url() - c = { - 'to_user': to_user, - 'notice_count': count, - 'notices': notices, - 'avatar_url': avatar_url, - 'service_url': service_url, - } - - try: - send_html_email(subject, 'notifications/notice_email.html', c, - settings.DEFAULT_FROM_EMAIL, [to_user]) - - logger.info('Successfully sent email to %s' % to_user) - except Exception, e: - logger.error('Failed to send email to %s, error detail: %s' % (to_user, e)) - else: - return None + logger.info('Successfully sent email to %s' % to_user) + except Exception as e: + logger.error('Failed to send email to %s, error detail: %s' % (to_user, e)) diff --git a/seahub/notifications/models.py b/seahub/notifications/models.py index f751df5102..81e19f63cd 100644 --- a/seahub/notifications/models.py +++ b/seahub/notifications/models.py @@ -463,8 +463,7 @@ class UserNotification(models.Model): - `self`: """ d = json.loads(self.detail) - share_from = d['share_from'] - share_from = email2nickname(share_from) + share_from = email2nickname(d['share_from']) repo_id = d['repo_id'] repo = seafile_api.get_repo(repo_id) @@ -486,8 +485,7 @@ class UserNotification(models.Model): - `self`: """ d = json.loads(self.detail) - share_from = d['share_from'] - share_from = email2nickname(share_from) + share_from = email2nickname(d['share_from']) file_name = d['file_name'] priv_share_token = d['priv_share_token'] @@ -531,7 +529,6 @@ class UserNotification(models.Model): return None msg_from = d.get('msg_from') - msg_from = email2nickname(msg_from) if msg_from is None: msg = _(u"%(group_name)s has new discussion") % { @@ -540,7 +537,7 @@ class UserNotification(models.Model): else: msg = _(u"%(user)s posted a new discussion in %(group_name)s") % { 'href': reverse('group_discuss', args=[group.id]), - 'user': escape(msg_from), + 'user': escape(email2nickname(msg_from)), 'group_name': group.group_name} return msg @@ -558,7 +555,6 @@ class UserNotification(models.Model): msg_id = d.get('msg_id') reply_from = d.get('reply_from') - reply_from = email2nickname(reply_from) if reply_from is None: msg = _(u"One group discussion has new reply") % { @@ -566,7 +562,7 @@ class UserNotification(models.Model): } else: msg = _(u"%(user)s replied your group discussion") % { - 'user': escape(reply_from), + 'user': escape(email2nickname(reply_from)), 'href': reverse('msg_reply_new') } return msg diff --git a/seahub/notifications/templates/notifications/notice_email.html b/seahub/notifications/templates/notifications/notice_email.html index 939fa6cc98..3ec1a79fe9 100644 --- a/seahub/notifications/templates/notifications/notice_email.html +++ b/seahub/notifications/templates/notifications/notice_email.html @@ -1,11 +1,11 @@ {% extends 'email_base.html' %} -{% load i18n seahub_tags avatar_tags%} +{% load i18n seahub_tags %} {% block email_con %} {% autoescape off %} -

Hi, {% blocktrans with name=to_user|email2nickname %}{{ name }}{% endblocktrans %}

+

Hi, {{ avatar_url }} {% blocktrans with name=to_user|email2nickname %}{{ name }}{% endblocktrans %}

{% blocktrans count num=notice_count %} @@ -25,37 +25,37 @@ You've got {{num}} new notices on {{ site_name }}: {% for notice in notices %} {% if notice.is_group_msg %} - {{notice.group_msg_from|email2nickname}} posted a new discussion in {{notice.group_name}} + {{notice.group_msg_from_avatar_url}} {{notice.group_msg_from}} posted a new discussion in {{notice.group_name}}. {{ notice.timestamp }} {% elif notice.is_grpmsg_reply %} - {{notice.group_msg_reply_from|email2nickname}} replied yourgroup discussion + {{notice.group_msg_reply_from_avatar_url}} {{notice.group_msg_reply_from}} replied yourgroup discussion. {{ notice.timestamp }} {% elif notice.is_repo_share_msg %} - {{notice.repo_share_from|email2nickname}} has shared a library named {{notice.repo_name}} to you. + {{notice.repo_share_from_avatar_url}} {{notice.repo_share_from}} has shared a library named {{notice.repo_name}} to you. {{ notice.timestamp }} {% elif notice.is_priv_file_share_msg %} - {{notice.priv_shared_file_from|email2nickname}} has shared a file named {{notice.priv_shared_file_name}} to you. + {{notice.priv_shared_file_from_avatar_url}} {{notice.priv_shared_file_from}} has shared a file named {{notice.priv_shared_file_name}} to you. {{ notice.timestamp }} {% elif notice.is_user_message %} - You have received a new message from {{notice.detail|email2nickname}}. + You have received a new message from {{notice.user_msg_from_avatar_url}} {{notice.user_msg_from}}. {{ notice.timestamp }} {% elif notice.is_file_uploaded_msg %} - A file named {{notice.uploaded_file_name}} is uploaded to your folder {{notice.uploaded_folder_name}} + A file named {{notice.uploaded_file_name}} is uploaded to your folder {{notice.uploaded_folder_name}}. {{ notice.timestamp }} {% elif notice.is_group_join_request %} - User {{notice.grpjoin_username}} has asked to join group {{notice.grpjoin_group_name}}, verification message: {{notice.grpjoin_request_msg}} + User {{notice.grpjoin_username}} has asked to join group {{notice.grpjoin_group_name}}, verification message: {{notice.grpjoin_request_msg}}. {{ notice.timestamp }} {% endif %}