mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-26 07:22:34 +00:00
notice group member when share library to group
This commit is contained in:
@@ -17,7 +17,8 @@ from seahub.api2.throttling import UserRateThrottle
|
||||
from seahub.api2.utils import api_error
|
||||
from seahub.base.templatetags.seahub_tags import email2nickname
|
||||
from seahub.base.accounts import User
|
||||
from seahub.share.signals import share_repo_to_user_successful
|
||||
from seahub.share.signals import share_repo_to_user_successful, \
|
||||
share_repo_to_group_successful
|
||||
from seahub.utils import (is_org_context, is_valid_username,
|
||||
send_perm_audit_msg)
|
||||
|
||||
@@ -345,6 +346,9 @@ class DirSharedItemsEndpoint(APIView):
|
||||
seafile_api.set_group_repo(shared_repo.repo_id, gid,
|
||||
username, permission)
|
||||
|
||||
share_repo_to_group_successful.send(sender=None,
|
||||
from_user=username, group_id=gid, repo=shared_repo)
|
||||
|
||||
result['success'].append({
|
||||
"share_type": "group",
|
||||
"group_info": {
|
||||
|
@@ -22,7 +22,7 @@ from django.contrib.auth.hashers import check_password
|
||||
from django.contrib.sites.models import RequestSite
|
||||
from django.db import IntegrityError
|
||||
from django.db.models import F, Q
|
||||
from django.http import HttpResponse, Http404
|
||||
from django.http import HttpResponse
|
||||
from django.template import RequestContext
|
||||
from django.template.loader import render_to_string
|
||||
from django.template.defaultfilters import filesizeformat
|
||||
@@ -40,31 +40,24 @@ from .utils import get_diff_details, \
|
||||
api_repo_user_folder_perm_check, api_repo_setting_permission_check, \
|
||||
api_repo_group_folder_perm_check
|
||||
|
||||
from seahub.avatar.settings import AVATAR_DEFAULT_SIZE
|
||||
from seahub.avatar.templatetags.avatar_tags import api_avatar_url, avatar
|
||||
from seahub.avatar.templatetags.group_avatar_tags import api_grp_avatar_url, \
|
||||
grp_avatar
|
||||
from seahub.base.accounts import User
|
||||
from seahub.base.models import FileDiscuss, UserStarredFiles, DeviceToken
|
||||
from seahub.base.models import UserStarredFiles, DeviceToken
|
||||
from seahub.base.templatetags.seahub_tags import email2nickname, \
|
||||
translate_commit_desc, translate_seahub_time, translate_commit_desc_escape
|
||||
from seahub.group.models import GroupMessage, MessageReply, MessageAttachment
|
||||
from seahub.group.signals import grpmsg_added
|
||||
from seahub.group.views import group_check, remove_group_common, \
|
||||
translate_seahub_time, translate_commit_desc_escape
|
||||
from seahub.group.views import remove_group_common, \
|
||||
rename_group_with_new_name, is_group_staff
|
||||
from seahub.group.utils import BadGroupNameError, ConflictGroupNameError, \
|
||||
validate_group_name
|
||||
from seahub.thumbnail.utils import generate_thumbnail
|
||||
from seahub.message.models import UserMessage
|
||||
from seahub.notifications.models import UserNotification
|
||||
from seahub.options.models import UserOptions
|
||||
from seahub.contacts.models import Contact
|
||||
from seahub.profile.models import Profile, DetailedProfile
|
||||
from seahub.shortcuts import get_first_object_or_none
|
||||
from seahub.signals import (repo_created, repo_deleted)
|
||||
from seahub.share.models import FileShare, OrgFileShare, UploadLinkShare
|
||||
from seahub.share.signals import share_repo_to_user_successful
|
||||
from seahub.share.views import list_shared_repos
|
||||
from seahub.utils import gen_file_get_url, gen_token, gen_file_upload_url, \
|
||||
check_filename_with_rename, is_valid_username, EVENTS_ENABLED, \
|
||||
get_user_events, EMPTY_SHA1, get_ccnet_server_addr_port, is_pro_version, \
|
||||
@@ -75,11 +68,11 @@ from seahub.utils import gen_file_get_url, gen_token, gen_file_upload_url, \
|
||||
from seahub.utils.devices import get_user_devices, do_unlink_device
|
||||
from seahub.utils.repo import get_sub_repo_abbrev_origin_path
|
||||
from seahub.utils.star import star_file, unstar_file
|
||||
from seahub.utils.file_types import IMAGE, DOCUMENT
|
||||
from seahub.utils.file_types import DOCUMENT
|
||||
from seahub.utils.file_size import get_file_size_unit
|
||||
from seahub.utils.timeutils import utc_to_local, datetime_to_isoformat_timestr
|
||||
from seahub.views import validate_owner, is_registered_user, check_file_lock, \
|
||||
group_events_data, get_diff, create_default_library, get_owned_repo_list, \
|
||||
from seahub.views import is_registered_user, check_file_lock, \
|
||||
group_events_data, get_diff, create_default_library, \
|
||||
list_inner_pub_repos, get_virtual_repos_by_owner, \
|
||||
check_folder_permission
|
||||
from seahub.views.ajax import get_share_in_repo_list, get_groups_by_user, \
|
||||
@@ -93,7 +86,7 @@ if HAS_OFFICE_CONVERTER:
|
||||
import seahub.settings as settings
|
||||
from seahub.settings import THUMBNAIL_EXTENSION, THUMBNAIL_ROOT, \
|
||||
ENABLE_GLOBAL_ADDRESSBOOK, FILE_LOCK_EXPIRATION_DAYS, \
|
||||
ENABLE_THUMBNAIL, ENABLE_SUB_LIBRARY, ENABLE_FOLDER_PERM
|
||||
ENABLE_THUMBNAIL, ENABLE_FOLDER_PERM
|
||||
try:
|
||||
from seahub.settings import CLOUD_MODE
|
||||
except ImportError:
|
||||
@@ -119,15 +112,14 @@ except ImportError:
|
||||
|
||||
from pysearpc import SearpcError, SearpcObjEncoder
|
||||
import seaserv
|
||||
from seaserv import seafserv_rpc, seafserv_threaded_rpc, \
|
||||
from seaserv import seafserv_threaded_rpc, \
|
||||
get_personal_groups_by_user, get_session_info, is_personal_repo, \
|
||||
get_repo, check_permission, get_commits, is_passwd_set,\
|
||||
list_personal_repos_by_owner, check_quota, \
|
||||
list_share_repos, get_group_repos_by_owner, get_group_repoids, \
|
||||
check_quota, list_share_repos, get_group_repos_by_owner, get_group_repoids, \
|
||||
list_inner_pub_repos_by_owner, is_group_user, \
|
||||
remove_share, unshare_group_repo, unset_inner_pub_repo, get_group, \
|
||||
remove_share, unset_inner_pub_repo, get_group, \
|
||||
get_commit, get_file_id_by_path, MAX_DOWNLOAD_DIR_SIZE, edit_repo, \
|
||||
ccnet_threaded_rpc, get_personal_groups, seafile_api, check_group_staff, \
|
||||
ccnet_threaded_rpc, get_personal_groups, seafile_api, \
|
||||
create_org, ccnet_api
|
||||
|
||||
from constance import config
|
||||
|
@@ -13,7 +13,7 @@ from django.utils import translation
|
||||
from django.utils.translation import ugettext as _
|
||||
|
||||
import seaserv
|
||||
from seaserv import seafile_api
|
||||
from seaserv import seafile_api, ccnet_api
|
||||
from seahub.base.models import CommandsLastCheck
|
||||
from seahub.notifications.models import UserNotification
|
||||
from seahub.utils import send_html_email, get_service_url, \
|
||||
@@ -83,9 +83,7 @@ class Command(BaseCommand):
|
||||
d = notice.group_message_detail_to_dict()
|
||||
group_id = d['group_id']
|
||||
message = d['message']
|
||||
group = seaserv.get_group(int(group_id))
|
||||
if group is None:
|
||||
notice.delete()
|
||||
group = ccnet_api.get_group(int(group_id))
|
||||
|
||||
notice.group_url = reverse('group_discuss', args=[group.id])
|
||||
notice.notice_from = escape(email2nickname(d['msg_from']))
|
||||
@@ -96,16 +94,31 @@ class Command(BaseCommand):
|
||||
|
||||
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("view_common_lib_dir", args=[repo_id, ''])
|
||||
notice.notice_from = escape(email2nickname(d['share_from']))
|
||||
notice.repo_name = repo.name
|
||||
notice.avatar_src = self.get_avatar_src(d['share_from'])
|
||||
|
||||
return notice
|
||||
|
||||
def format_repo_share_to_group_msg(self, notice):
|
||||
d = json.loads(notice.detail)
|
||||
|
||||
repo_id = d['repo_id']
|
||||
repo = seafile_api.get_repo(repo_id)
|
||||
group_id = d['group_id']
|
||||
group = ccnet_api.get_group(group_id)
|
||||
|
||||
notice.repo_url = reverse("view_common_lib_dir", args=[repo_id, ''])
|
||||
notice.notice_from = escape(email2nickname(d['share_from']))
|
||||
notice.repo_name = repo.name
|
||||
notice.avatar_src = self.get_avatar_src(d['share_from'])
|
||||
notice.group_url = reverse("group_info", args=[group.id])
|
||||
notice.group_name = group.group_name
|
||||
|
||||
return notice
|
||||
|
||||
def format_file_uploaded_msg(self, notice):
|
||||
@@ -132,9 +145,7 @@ class Command(BaseCommand):
|
||||
group_id = d['group_id']
|
||||
join_request_msg = d['join_request_msg']
|
||||
|
||||
group = seaserv.get_group(group_id)
|
||||
if group is None:
|
||||
notice.delete()
|
||||
group = ccnet_api.get_group(group_id)
|
||||
|
||||
notice.grpjoin_user_profile_url = reverse('user_profile',
|
||||
args=[username])
|
||||
@@ -150,9 +161,7 @@ class Command(BaseCommand):
|
||||
group_staff = d['group_staff']
|
||||
group_id = d['group_id']
|
||||
|
||||
group = seaserv.get_group(group_id)
|
||||
if group is None:
|
||||
notice.delete()
|
||||
group = ccnet_api.get_group(group_id)
|
||||
|
||||
notice.notice_from = group_staff
|
||||
notice.avatar_src = self.get_avatar_src(group_staff)
|
||||
@@ -208,6 +217,22 @@ class Command(BaseCommand):
|
||||
for notice in unseen_notices:
|
||||
logger.info('Processing unseen notice: [%s]' % (notice))
|
||||
|
||||
d = json.loads(notice.detail)
|
||||
|
||||
repo_id = d.get('repo_id', None)
|
||||
group_id = d.get('group_id', None)
|
||||
try:
|
||||
if repo_id and not seafile_api.get_repo(repo_id):
|
||||
notice.delete()
|
||||
continue
|
||||
|
||||
if group_id and not ccnet_api.get_group(group_id):
|
||||
notice.delete()
|
||||
continue
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
continue
|
||||
|
||||
if notice.to_user != to_user:
|
||||
continue
|
||||
|
||||
@@ -220,6 +245,9 @@ class Command(BaseCommand):
|
||||
elif notice.is_repo_share_msg():
|
||||
notice = self.format_repo_share_msg(notice)
|
||||
|
||||
elif notice.is_repo_share_to_group_msg():
|
||||
notice = self.format_repo_share_to_group_msg(notice)
|
||||
|
||||
elif notice.is_file_uploaded_msg():
|
||||
notice = self.format_file_uploaded_msg(notice)
|
||||
|
||||
|
@@ -5,14 +5,12 @@ import json
|
||||
import logging
|
||||
|
||||
from django.db import models
|
||||
from django.db.models.signals import post_save
|
||||
from django.forms import ModelForm, Textarea
|
||||
from django.utils.http import urlquote
|
||||
from django.utils.html import escape
|
||||
from django.utils.translation import ugettext as _
|
||||
|
||||
import seaserv
|
||||
from seaserv import seafile_api
|
||||
from seaserv import seafile_api, ccnet_api
|
||||
|
||||
from seahub.base.fields import LowerCaseCharField
|
||||
from seahub.base.templatetags.seahub_tags import email2nickname
|
||||
@@ -42,6 +40,7 @@ MSG_TYPE_GROUP_JOIN_REQUEST = 'group_join_request'
|
||||
MSG_TYPE_ADD_USER_TO_GROUP = 'add_user_to_group'
|
||||
MSG_TYPE_FILE_UPLOADED = 'file_uploaded'
|
||||
MSG_TYPE_REPO_SHARE = 'repo_share'
|
||||
MSG_TYPE_REPO_SHARE_TO_GROUP = 'repo_share_to_group'
|
||||
MSG_TYPE_USER_MESSAGE = 'user_message'
|
||||
|
||||
def file_uploaded_msg_to_json(file_name, repo_id, uploaded_to):
|
||||
@@ -53,6 +52,9 @@ def file_uploaded_msg_to_json(file_name, repo_id, uploaded_to):
|
||||
def repo_share_msg_to_json(share_from, repo_id):
|
||||
return json.dumps({'share_from': share_from, 'repo_id': repo_id})
|
||||
|
||||
def repo_share_to_group_msg_to_json(share_from, repo_id, group_id):
|
||||
return json.dumps({'share_from': share_from, 'repo_id': repo_id, 'group_id': group_id})
|
||||
|
||||
def group_msg_to_json(group_id, msg_from, message):
|
||||
return json.dumps({'group_id': group_id, 'msg_from': msg_from,
|
||||
'message': message})
|
||||
@@ -226,6 +228,17 @@ class UserNotificationManager(models.Manager):
|
||||
return self._add_user_notification(to_user,
|
||||
MSG_TYPE_REPO_SHARE, detail)
|
||||
|
||||
def add_repo_share_to_group_msg(self, to_user, detail):
|
||||
"""Notify ``to_user`` that others shared a repo to group.
|
||||
|
||||
Arguments:
|
||||
- `self`:
|
||||
- `to_user`:
|
||||
- `detail`:
|
||||
"""
|
||||
return self._add_user_notification(to_user,
|
||||
MSG_TYPE_REPO_SHARE_TO_GROUP, detail)
|
||||
|
||||
def add_user_message(self, to_user, detail):
|
||||
"""Notify ``to_user`` that others sent a message to him/her.
|
||||
|
||||
@@ -293,6 +306,14 @@ class UserNotification(models.Model):
|
||||
"""
|
||||
return self.msg_type == MSG_TYPE_REPO_SHARE
|
||||
|
||||
def is_repo_share_to_group_msg(self):
|
||||
"""
|
||||
|
||||
Arguments:
|
||||
- `self`:
|
||||
"""
|
||||
return self.msg_type == MSG_TYPE_REPO_SHARE_TO_GROUP
|
||||
|
||||
def is_user_message(self):
|
||||
"""
|
||||
|
||||
@@ -439,6 +460,44 @@ class UserNotification(models.Model):
|
||||
'href': reverse('view_common_lib_dir', args=[repo.id, '']),
|
||||
'repo_name': escape(repo.name),
|
||||
}
|
||||
|
||||
return msg
|
||||
|
||||
def format_repo_share_to_group_msg(self):
|
||||
"""
|
||||
|
||||
Arguments:
|
||||
- `self`:
|
||||
"""
|
||||
try:
|
||||
d = json.loads(self.detail)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
return _(u"Internal error")
|
||||
|
||||
share_from = email2nickname(d['share_from'])
|
||||
repo_id = d['repo_id']
|
||||
group_id = d['group_id']
|
||||
|
||||
try:
|
||||
repo = seafile_api.get_repo(repo_id)
|
||||
group = ccnet_api.get_group(group_id)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
return None
|
||||
|
||||
if not repo or not group:
|
||||
self.delete()
|
||||
return None
|
||||
|
||||
msg = _(u"%(user)s has shared a library named <a href='%(repo_href)s'>%(repo_name)s</a> to group <a href='%(group_href)s'>%(group_name)s</a>.") % {
|
||||
'user': escape(share_from),
|
||||
'repo_href': reverse('view_common_lib_dir', args=[repo.id, '']),
|
||||
'repo_name': escape(repo.name),
|
||||
'group_href': reverse('group_info', args=[group.id]),
|
||||
'group_name': escape(group.group_name),
|
||||
}
|
||||
|
||||
return msg
|
||||
|
||||
def format_user_message_title(self):
|
||||
@@ -450,6 +509,7 @@ class UserNotification(models.Model):
|
||||
try:
|
||||
d = self.user_message_detail_to_dict()
|
||||
except self.InvalidDetailError as e:
|
||||
logger.error(e)
|
||||
return _(u"Internal error")
|
||||
|
||||
msg_from = d.get('msg_from')
|
||||
@@ -470,6 +530,7 @@ class UserNotification(models.Model):
|
||||
try:
|
||||
d = self.user_message_detail_to_dict()
|
||||
except self.InvalidDetailError as e:
|
||||
logger.error(e)
|
||||
return _(u"Internal error")
|
||||
|
||||
message = d.get('message')
|
||||
@@ -487,10 +548,11 @@ class UserNotification(models.Model):
|
||||
try:
|
||||
d = self.group_message_detail_to_dict()
|
||||
except self.InvalidDetailError as e:
|
||||
logger.error(e)
|
||||
return _(u"Internal error")
|
||||
|
||||
group_id = d.get('group_id')
|
||||
group = seaserv.get_group(group_id)
|
||||
group = ccnet_api.get_group(group_id)
|
||||
if group is None:
|
||||
self.delete()
|
||||
return None
|
||||
@@ -517,6 +579,7 @@ class UserNotification(models.Model):
|
||||
try:
|
||||
d = self.group_message_detail_to_dict()
|
||||
except self.InvalidDetailError as e:
|
||||
logger.error(e)
|
||||
return _(u"Internal error")
|
||||
|
||||
message = d.get('message')
|
||||
@@ -541,7 +604,7 @@ class UserNotification(models.Model):
|
||||
group_id = d['group_id']
|
||||
join_request_msg = d['join_request_msg']
|
||||
|
||||
group = seaserv.get_group(group_id)
|
||||
group = ccnet_api.get_group(group_id)
|
||||
if group is None:
|
||||
self.delete()
|
||||
return None
|
||||
@@ -570,7 +633,7 @@ class UserNotification(models.Model):
|
||||
group_staff = d['group_staff']
|
||||
group_id = d['group_id']
|
||||
|
||||
group = seaserv.get_group(group_id)
|
||||
group = ccnet_api.get_group(group_id)
|
||||
if group is None:
|
||||
self.delete()
|
||||
return None
|
||||
@@ -588,10 +651,9 @@ from django.core.urlresolvers import reverse
|
||||
from django.dispatch import receiver
|
||||
|
||||
from seahub.signals import upload_file_successful
|
||||
from seahub.group.models import GroupMessage, MessageReply
|
||||
from seahub.group.signals import grpmsg_added, group_join_request, add_user_to_group
|
||||
from seahub.share.signals import share_repo_to_user_successful
|
||||
from seahub.message.models import UserMessage
|
||||
from seahub.share.signals import share_repo_to_user_successful, \
|
||||
share_repo_to_group_successful
|
||||
from seahub.message.signals import user_message_sent
|
||||
|
||||
@receiver(upload_file_successful)
|
||||
@@ -606,24 +668,6 @@ def add_upload_file_msg_cb(sender, **kwargs):
|
||||
|
||||
filename = os.path.basename(file_path)
|
||||
folder_path = os.path.dirname(file_path)
|
||||
folder_name = os.path.basename(folder_path)
|
||||
|
||||
detail = file_uploaded_msg_to_json(filename, repo_id, folder_path)
|
||||
UserNotification.objects.add_file_uploaded_msg(owner, detail)
|
||||
|
||||
@receiver(upload_file_successful)
|
||||
def add_upload_file_msg_cb(sender, **kwargs):
|
||||
"""Notify repo owner when others upload files to his/her folder from shared link.
|
||||
"""
|
||||
repo_id = kwargs.get('repo_id', None)
|
||||
file_path = kwargs.get('file_path', None)
|
||||
owner = kwargs.get('owner', None)
|
||||
|
||||
assert repo_id and file_path and owner is not None, 'Arguments error'
|
||||
|
||||
filename = os.path.basename(file_path)
|
||||
folder_path = os.path.dirname(file_path)
|
||||
folder_name = os.path.basename(folder_path)
|
||||
|
||||
detail = file_uploaded_msg_to_json(filename, repo_id, folder_path)
|
||||
UserNotification.objects.add_file_uploaded_msg(owner, detail)
|
||||
@@ -641,6 +685,24 @@ def add_share_repo_msg_cb(sender, **kwargs):
|
||||
detail = repo_share_msg_to_json(from_user, repo.id)
|
||||
UserNotification.objects.add_repo_share_msg(to_user, detail)
|
||||
|
||||
@receiver(share_repo_to_group_successful)
|
||||
def add_share_repo_to_group_msg_cb(sender, **kwargs):
|
||||
"""Notify group member when others share repos to group.
|
||||
"""
|
||||
from_user = kwargs.get('from_user', None)
|
||||
group_id = kwargs.get('group_id', None)
|
||||
repo = kwargs.get('repo', None)
|
||||
|
||||
assert from_user and group_id and repo is not None, 'Arguments error'
|
||||
|
||||
members = ccnet_api.get_group_members(int(group_id))
|
||||
for member in members:
|
||||
to_user = member.user_name
|
||||
if to_user == from_user:
|
||||
continue
|
||||
detail = repo_share_to_group_msg_to_json(from_user, repo.id, group_id)
|
||||
UserNotification.objects.add_repo_share_to_group_msg(to_user, detail)
|
||||
|
||||
@receiver(user_message_sent)
|
||||
def add_user_message_cb(sender, **kwargs):
|
||||
"""Notify user when he/she got a new mesaage.
|
||||
|
@@ -32,6 +32,9 @@ You've got {{num}} new notices on {{ site_name }}:
|
||||
{% elif notice.is_repo_share_msg %}
|
||||
<p style="line-height:1.5; margin:.2em 10px .2em 0;">{% blocktrans with user=notice.notice_from lib_url=notice.repo_url lib_name=notice.repo_name%}{{user}} has shared a library named <a href="{{url_base}}{{lib_url}}">{{lib_name}}</a> to you.{% endblocktrans %}</p>
|
||||
|
||||
{% elif notice.is_repo_share_to_group_msg %}
|
||||
<p style="line-height:1.5; margin:.2em 10px .2em 0;">{% blocktrans with user=notice.notice_from lib_url=notice.repo_url lib_name=notice.repo_name group_url=notice.group_url group_name=notice.group_name %}{{user}} has shared a library named <a href="{{url_base}}{{lib_url}}">{{lib_name}}</a> to <a href="{{url_base}}{{group_url}}">{{group_name}}</a>.{% endblocktrans %}</p>
|
||||
|
||||
{% elif notice.is_user_message %}
|
||||
<p style="line-height:1.5; margin:.2em 10px .2em 0;">{% blocktrans with msg_url=notice.user_msg_url user=notice.notice_from %}You have received a <a href="{{ url_base }}{{msg_url}}">new message</a> from {{user}}.{% endblocktrans %}</p>
|
||||
{% if notice.user_msg %}
|
||||
|
@@ -32,6 +32,9 @@
|
||||
{% elif notice.is_repo_share_msg %}
|
||||
<p class="brief">{{ notice.format_repo_share_msg|safe }}</p>
|
||||
|
||||
{% elif notice.is_repo_share_to_group_msg %}
|
||||
<p class="brief">{{ notice.format_repo_share_to_group_msg|safe }}</p>
|
||||
|
||||
{% elif notice.is_group_join_request %}
|
||||
<p class="brief">{{ notice.format_group_join_request|safe }}</p>
|
||||
{% endif %}
|
||||
|
@@ -163,6 +163,14 @@ def add_notice_from_info(notices):
|
||||
logger.error(e)
|
||||
notice.default_avatar_url = default_avatar_url
|
||||
|
||||
elif notice.is_repo_share_to_group_msg():
|
||||
try:
|
||||
d = json.loads(notice.detail)
|
||||
notice.msg_from = d['share_from']
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
notice.default_avatar_url = default_avatar_url
|
||||
|
||||
elif notice.is_group_join_request():
|
||||
try:
|
||||
d = json.loads(notice.detail)
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import django.dispatch
|
||||
|
||||
share_repo_to_user_successful = django.dispatch.Signal(providing_args=["from_user", "to_user", "repo"])
|
||||
share_repo_to_group_successful = django.dispatch.Signal(providing_args=["from_user", "group_id", "repo"])
|
||||
|
@@ -30,6 +30,9 @@
|
||||
{% elif notice.is_repo_share_msg %}
|
||||
<p class="brief">{{ notice.format_repo_share_msg|safe }}</p>
|
||||
|
||||
{% elif notice.is_repo_share_to_group_msg %}
|
||||
<p class="brief">{{ notice.format_repo_share_to_group_msg|safe }}</p>
|
||||
|
||||
{% elif notice.is_group_join_request %}
|
||||
<p class="brief">{{ notice.format_group_join_request|safe }}</p>
|
||||
|
||||
|
Reference in New Issue
Block a user