1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-13 22:01:06 +00:00

Refactor send notices command

This commit is contained in:
zhengxie
2014-05-15 17:54:40 +08:00
parent cb2e8078a3
commit fef858cc74
3 changed files with 144 additions and 126 deletions

View File

@@ -1,22 +1,24 @@
# encoding: utf-8 # encoding: utf-8
import datetime import datetime
import logging import logging
import string
import simplejson as json import simplejson as json
import os import os
import re
from django.utils.http import urlquote 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.core.urlresolvers import reverse
from django.utils.html import escape
import seaserv import seaserv
from seaserv import seafile_api from seaserv import seafile_api
from seahub.base.models import CommandsLastCheck from seahub.base.models import CommandsLastCheck
from seahub.notifications.models import UserNotification 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 import seahub.settings as settings
from seahub.avatar.util import get_primary_avatar, get_default_avatar_url from seahub.avatar.templatetags.avatar_tags import avatar
from django.template import Context, loader from seahub.base.templatetags.seahub_tags import email2nickname
# Get an instance of a logger # Get an instance of a logger
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -33,15 +35,98 @@ class Command(BaseCommand):
self.do_action() self.do_action()
logger.debug('Finish sending user notices.\n') 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) def format_priv_file_share_msg(self, notice):
if avatar: d = json.loads(notice.detail)
avatar_url = avatar.avatar_url(size) priv_share_token = d['priv_share_token']
else: notice.priv_shared_file_url = reverse('view_priv_shared_file',
avatar_url = get_default_avatar_url() 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): def do_action(self):
now = datetime.datetime.now() now = datetime.datetime.now()
@@ -66,119 +151,56 @@ class Command(BaseCommand):
email_ctx = {} email_ctx = {}
for notice in unseen_notices: 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 email_ctx[notice.to_user] += 1
else: else:
email_ctx[notice.to_user] = 1 email_ctx[notice.to_user] = 1
for to_user, count in email_ctx.items(): for to_user, count in email_ctx.items():
notices = [] notices = []
for notice in unseen_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]) elif notice.is_grpmsg_reply():
notice.priv_shared_file_from = d['share_from'] notice = self.format_grpmsg_reply(notice)
notice.priv_shared_file_name = d['file_name']
notice.priv_shared_file_from_avatar_url = self.get_avatar_url(d['share_from'])
if notice.msg_type == "user_message": elif notice.is_repo_share_msg():
notice.user_msg_from_avatar_url = self.get_avatar_url(notice.detail) 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": elif notice.is_group_join_request():
d = json.loads(notice.detail) notice = self.format_group_join_request(notice)
group_id = d['group_id'] notices.append(notice)
group = seaserv.get_group(int(group_id))
if group is None:
notice.delete()
notice.group_url = reverse('group_discuss', args=[group.id]) if not notices:
notice.group_msg_from = d['msg_from'] continue
notice.group_name = group.group_name
notice.group_msg_from_avatar_url = self.get_avatar_url(d['msg_from'])
if notice.msg_type == "grpmsg_reply": subject = subjects[1] if count > 1 else subjects[0]
d = json.loads(notice.detail) 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') try:
notice.group_msg_reply_from = d['reply_from'] send_html_email(subject, 'notifications/notice_email.html', c,
notice.group_msg_reply_from_avatar_url = self.get_avatar_url(d['reply_from']) None, [to_user])
if notice.msg_type == "repo_share":
d = json.loads(notice.detail)
repo_id = d['repo_id'] logger.info('Successfully sent email to %s' % to_user)
repo = seafile_api.get_repo(repo_id) except Exception as e:
if repo is None: logger.error('Failed to send email to %s, error detail: %s' % (to_user, e))
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

View File

@@ -463,8 +463,7 @@ class UserNotification(models.Model):
- `self`: - `self`:
""" """
d = json.loads(self.detail) d = json.loads(self.detail)
share_from = d['share_from'] share_from = email2nickname(d['share_from'])
share_from = email2nickname(share_from)
repo_id = d['repo_id'] repo_id = d['repo_id']
repo = seafile_api.get_repo(repo_id) repo = seafile_api.get_repo(repo_id)
@@ -486,8 +485,7 @@ class UserNotification(models.Model):
- `self`: - `self`:
""" """
d = json.loads(self.detail) d = json.loads(self.detail)
share_from = d['share_from'] share_from = email2nickname(d['share_from'])
share_from = email2nickname(share_from)
file_name = d['file_name'] file_name = d['file_name']
priv_share_token = d['priv_share_token'] priv_share_token = d['priv_share_token']
@@ -531,7 +529,6 @@ class UserNotification(models.Model):
return None return None
msg_from = d.get('msg_from') msg_from = d.get('msg_from')
msg_from = email2nickname(msg_from)
if msg_from is None: if msg_from is None:
msg = _(u"<a href='%(href)s'>%(group_name)s</a> has new discussion") % { msg = _(u"<a href='%(href)s'>%(group_name)s</a> has new discussion") % {
@@ -540,7 +537,7 @@ class UserNotification(models.Model):
else: else:
msg = _(u"%(user)s posted a new discussion in <a href='%(href)s'>%(group_name)s</a>") % { msg = _(u"%(user)s posted a new discussion in <a href='%(href)s'>%(group_name)s</a>") % {
'href': reverse('group_discuss', args=[group.id]), 'href': reverse('group_discuss', args=[group.id]),
'user': escape(msg_from), 'user': escape(email2nickname(msg_from)),
'group_name': group.group_name} 'group_name': group.group_name}
return msg return msg
@@ -558,7 +555,6 @@ class UserNotification(models.Model):
msg_id = d.get('msg_id') msg_id = d.get('msg_id')
reply_from = d.get('reply_from') reply_from = d.get('reply_from')
reply_from = email2nickname(reply_from)
if reply_from is None: if reply_from is None:
msg = _(u"One <a href='%(href)s'>group discussion</a> has new reply") % { msg = _(u"One <a href='%(href)s'>group discussion</a> has new reply") % {
@@ -566,7 +562,7 @@ class UserNotification(models.Model):
} }
else: else:
msg = _(u"%(user)s replied your <a href='%(href)s'>group discussion</a>") % { msg = _(u"%(user)s replied your <a href='%(href)s'>group discussion</a>") % {
'user': escape(reply_from), 'user': escape(email2nickname(reply_from)),
'href': reverse('msg_reply_new') 'href': reverse('msg_reply_new')
} }
return msg return msg

View File

@@ -1,11 +1,11 @@
{% extends 'email_base.html' %} {% extends 'email_base.html' %}
{% load i18n seahub_tags avatar_tags%} {% load i18n seahub_tags %}
{% block email_con %} {% block email_con %}
{% autoescape off %} {% autoescape off %}
<p style="color:#121214;font-size:14px;">Hi, <img src="{{ url_base }}{{ avatar_url }}" alt="" />{% blocktrans with name=to_user|email2nickname %}{{ name }}{% endblocktrans %}</p> <p style="color:#121214;font-size:14px;">Hi, {{ avatar_url }} {% blocktrans with name=to_user|email2nickname %}{{ name }}{% endblocktrans %}</p>
<p style="font-size:14px;color:#434144;"> <p style="font-size:14px;color:#434144;">
{% blocktrans count num=notice_count %} {% blocktrans count num=notice_count %}
@@ -25,37 +25,37 @@ You've got {{num}} new notices on {{ site_name }}:
{% for notice in notices %} {% for notice in notices %}
{% if notice.is_group_msg %} {% if notice.is_group_msg %}
<tr > <tr >
<td><img src="{{ service_url }}{{notice.group_msg_from_avatar_url}}" alt="" />{{notice.group_msg_from|email2nickname}} posted a new discussion in <a href='{{service_url}}{{notice.group_url}}'>{{notice.group_name}}</a></td> <td>{{notice.group_msg_from_avatar_url}} {{notice.group_msg_from}} posted a new discussion in <a href='{{url_base}}{{notice.group_url}}'>{{notice.group_name}}</a>.</td>
<td>{{ notice.timestamp }}</td> <td>{{ notice.timestamp }}</td>
</tr> </tr>
{% elif notice.is_grpmsg_reply %} {% elif notice.is_grpmsg_reply %}
<tr > <tr >
<td><img src="{{ service_url }}{{notice.group_msg_reply_from_avatar_url}}" alt="" />{{notice.group_msg_reply_from|email2nickname}} replied your<a href='{{service_url}}{{notice.group_msg_reply_url}}'>group discussion</a></td> <td>{{notice.group_msg_reply_from_avatar_url}} {{notice.group_msg_reply_from}} replied your<a href='{{url_base}}{{notice.group_msg_reply_url}}'>group discussion</a>.</td>
<td>{{ notice.timestamp }}</td> <td>{{ notice.timestamp }}</td>
</tr> </tr>
{% elif notice.is_repo_share_msg %} {% elif notice.is_repo_share_msg %}
<tr > <tr >
<td><img src="{{ service_url }}{{notice.repo_share_from_avatar_url}}" alt="" />{{notice.repo_share_from|email2nickname}} has shared a library named <a href='{{service_url}}{{notice.repo_url}}'>{{notice.repo_name}}</a> to you.</td> <td>{{notice.repo_share_from_avatar_url}} {{notice.repo_share_from}} has shared a library named <a href='{{url_base}}{{notice.repo_url}}'>{{notice.repo_name}}</a> to you.</td>
<td>{{ notice.timestamp }}</td> <td>{{ notice.timestamp }}</td>
</tr> </tr>
{% elif notice.is_priv_file_share_msg %} {% elif notice.is_priv_file_share_msg %}
<tr > <tr >
<td><img src="{{ service_url }}{{notice.priv_shared_file_from_avatar_url}}" alt="" />{{notice.priv_shared_file_from|email2nickname}} has shared a file named <a href='{{service_url}}{{notice.priv_shared_file_url}}'>{{notice.priv_shared_file_name}}</a> to you.</td> <td>{{notice.priv_shared_file_from_avatar_url}} {{notice.priv_shared_file_from}} has shared a file named <a href='{{url_base}}{{notice.priv_shared_file_url}}'>{{notice.priv_shared_file_name}}</a> to you.</td>
<td>{{ notice.timestamp }}</td> <td>{{ notice.timestamp }}</td>
</tr> </tr>
{% elif notice.is_user_message %} {% elif notice.is_user_message %}
<tr > <tr >
<td> You have received a <a href='{{ service_url }}{{notice.user_msg_url}}'>new message</a> from <img src="{{ service_url }}{{notice.user_msg_from_avatar_url}}" alt="" />{{notice.detail|email2nickname}}.</td> <td> You have received a <a href='{{ url_base }}{{notice.user_msg_url}}'>new message</a> from {{notice.user_msg_from_avatar_url}} {{notice.user_msg_from}}.</td>
<td>{{ notice.timestamp }}</td> <td>{{ notice.timestamp }}</td>
</tr> </tr>
{% elif notice.is_file_uploaded_msg %} {% elif notice.is_file_uploaded_msg %}
<tr > <tr >
<td>A file named <a href='{{service_url}}{{notice.uploaded_file_link}}'>{{notice.uploaded_file_name}}</a> is uploaded to your folder <a href='{{service_url}}{{notice.uploaded_folder_link}}'>{{notice.uploaded_folder_name}}</a></td> <td>A file named <a href='{{url_base}}{{notice.uploaded_file_link}}'>{{notice.uploaded_file_name}}</a> is uploaded to your folder <a href='{{url_base}}{{notice.uploaded_folder_link}}'>{{notice.uploaded_folder_name}}</a>.</td>
<td>{{ notice.timestamp }}</td> <td>{{ notice.timestamp }}</td>
</tr> </tr>
{% elif notice.is_group_join_request %} {% elif notice.is_group_join_request %}
<tr > <tr >
<td>User <a href='{{service_url}}{{notice.grpjoin_user_profile_url}}'>{{notice.grpjoin_username}}</a> has asked to join group <a href='{{service_url}}{{notice.grpjoin_group_url}}'>{{notice.grpjoin_group_name}}</a>, verification message: {{notice.grpjoin_request_msg}}</td> <td>User <a href='{{url_base}}{{notice.grpjoin_user_profile_url}}'>{{notice.grpjoin_username}}</a> has asked to join group <a href='{{url_base}}{{notice.grpjoin_group_url}}'>{{notice.grpjoin_group_name}}</a>, verification message: {{notice.grpjoin_request_msg}}.</td>
<td>{{ notice.timestamp }}</td> <td>{{ notice.timestamp }}</td>
</tr> </tr>
{% endif %} {% endif %}