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
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))

View File

@@ -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"<a href='%(href)s'>%(group_name)s</a> has new discussion") % {
@@ -540,7 +537,7 @@ class UserNotification(models.Model):
else:
msg = _(u"%(user)s posted a new discussion in <a href='%(href)s'>%(group_name)s</a>") % {
'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 <a href='%(href)s'>group discussion</a> has new reply") % {
@@ -566,7 +562,7 @@ class UserNotification(models.Model):
}
else:
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')
}
return msg

View File

@@ -1,11 +1,11 @@
{% extends 'email_base.html' %}
{% load i18n seahub_tags avatar_tags%}
{% load i18n seahub_tags %}
{% block email_con %}
{% 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;">
{% 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 %}
<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>
</tr>
{% elif notice.is_grpmsg_reply %}
<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>
</tr>
{% elif notice.is_repo_share_msg %}
<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>
</tr>
{% elif notice.is_priv_file_share_msg %}
<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>
</tr>
{% elif notice.is_user_message %}
<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>
</tr>
{% elif notice.is_file_uploaded_msg %}
<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>
</tr>
{% elif notice.is_group_join_request %}
<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>
</tr>
{% endif %}