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:
@@ -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))
|
||||
|
@@ -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
|
||||
|
@@ -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 %}
|
||||
|
Reference in New Issue
Block a user