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