1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-09 10:50:24 +00:00

Add Notification after user share permission changed (#5923)

* update

* remove spaces

* Update notice-item.js

* add-notice-after-CANCEL-the-sharing-perms-to-user

* update-func-names
This commit is contained in:
Ranjiwei
2024-02-23 14:38:19 +08:00
committed by GitHub
parent 426585a801
commit 8a7850a7dc
5 changed files with 217 additions and 2 deletions

View File

@@ -20,6 +20,8 @@ const MSG_TYPE_DRAFT_REVIEWER = 'draft_reviewer';
const MSG_TYPE_REPO_MONITOR = 'repo_monitor'; const MSG_TYPE_REPO_MONITOR = 'repo_monitor';
const MSG_TYPE_DELETED_FILES = 'deleted_files'; const MSG_TYPE_DELETED_FILES = 'deleted_files';
const MSG_TYPE_SAML_SSO_FAILED = 'saml_sso_failed'; const MSG_TYPE_SAML_SSO_FAILED = 'saml_sso_failed';
const MSG_TYPE_REPO_SHARE_PERM_CHANGE = 'repo_share_perm_change';
const MSG_TYPE_REPO_SHARE_PERM_DELETE = 'repo_share_perm_delete';
class NoticeItem extends React.Component { class NoticeItem extends React.Component {
@@ -79,6 +81,56 @@ class NoticeItem extends React.Component {
return {avatar_url, notice}; return {avatar_url, notice};
} }
if (noticeType === MSG_TYPE_REPO_SHARE_PERM_CHANGE) {
let avatar_url = detail.share_from_user_avatar_url;
let shareFrom = detail.share_from_user_name;
let permission = detail.permission;
let repoName = detail.repo_name;
let repoUrl = siteRoot + 'library/' + detail.repo_id + '/' + repoName + '/';
let path = detail.path;
let notice = '';
// 1. handle translate
if (path === '/') { // share repo
notice = gettext('{share_from} has changed the permission of library {repo_link} to {permission}.');
} else { // share folder
notice = gettext('{share_from} has changed the permission of folder {repo_link} to {permission}.');
}
// 2. handle xss(cross-site scripting)
notice = notice.replace('{share_from}', shareFrom);
notice = notice.replace('{repo_link}', `{tagA}${repoName}{/tagA}`);
notice = notice.replace('{permission}', permission);
notice = Utils.HTMLescape(notice);
// 3. add jump link
notice = notice.replace('{tagA}', `<a href='${Utils.encodePath(repoUrl)}'>`);
notice = notice.replace('{/tagA}', '</a>');
return {avatar_url, notice};
}
if (noticeType === MSG_TYPE_REPO_SHARE_PERM_DELETE) {
let avatar_url = detail.share_from_user_avatar_url;
let shareFrom = detail.share_from_user_name;
let repoName = detail.repo_name;
let path = detail.path;
let notice = '';
// 1. handle translate
if (path === '/') { // share repo
notice = gettext('{share_from} has cancelled the sharing of library {repo_name}.');
} else { // share folder
notice = gettext('{share_from} has cancelled the sharing of folder {repo_name}.');
}
// 2. handle xss(cross-site scripting)
notice = notice.replace('{share_from}', shareFrom);
notice = notice.replace('{repo_name}', repoName);
notice = Utils.HTMLescape(notice);
return {avatar_url, notice};
}
if (noticeType === MSG_TYPE_REPO_SHARE_TO_GROUP) { if (noticeType === MSG_TYPE_REPO_SHARE_TO_GROUP) {
let avatar_url = detail.share_from_user_avatar_url; let avatar_url = detail.share_from_user_avatar_url;

View File

@@ -32,7 +32,8 @@ from seahub.share.utils import is_repo_admin, share_dir_to_user, \
check_group_share_out_permission, normalize_custom_permission_name check_group_share_out_permission, normalize_custom_permission_name
from seahub.utils import (is_org_context, is_valid_username, from seahub.utils import (is_org_context, is_valid_username,
send_perm_audit_msg) send_perm_audit_msg)
from seahub.share.signals import share_repo_to_user_successful, share_repo_to_group_successful from seahub.share.signals import share_repo_to_user_successful, share_repo_to_group_successful, \
change_repo_perm_successful, delete_repo_perm_successful
from seahub.constants import PERMISSION_READ, PERMISSION_READ_WRITE, \ from seahub.constants import PERMISSION_READ, PERMISSION_READ_WRITE, \
PERMISSION_ADMIN PERMISSION_ADMIN
from seahub.utils.repo import get_available_repo_perms from seahub.utils.repo import get_available_repo_perms
@@ -260,6 +261,19 @@ class DirSharedItemsEndpoint(APIView):
update_user_dir_permission(repo_id, path, repo_owner, shared_to, permission) update_user_dir_permission(repo_id, path, repo_owner, shared_to, permission)
org_id = None
if is_org_context(request):
org_id = request.user.org.org_id
change_repo_perm_successful.send(
sender=None,
from_user=username,
to_user=shared_to,
repo=repo,
path=path,
permission=permission,
org_id=org_id
)
send_perm_audit_msg('modify-repo-perm', username, shared_to, send_perm_audit_msg('modify-repo-perm', username, shared_to,
repo_id, path, permission) repo_id, path, permission)
@@ -544,6 +558,18 @@ class DirSharedItemsEndpoint(APIView):
if path == '/': if path == '/':
ExtraSharePermission.objects.delete_share_permission(repo_id, ExtraSharePermission.objects.delete_share_permission(repo_id,
shared_to) shared_to)
org_id = None
if is_org_context(request):
org_id = request.user.org.org_id
delete_repo_perm_successful.send(
sender=None,
from_user=username,
to_user=shared_to,
repo=repo,
path=path,
org_id=org_id
)
send_perm_audit_msg('delete-repo-perm', username, shared_to, send_perm_audit_msg('delete-repo-perm', username, shared_to,
repo_id, path, permission) repo_id, path, permission)

View File

@@ -67,6 +67,8 @@ MSG_TYPE_GROUP_JOIN_REQUEST = 'group_join_request'
MSG_TYPE_ADD_USER_TO_GROUP = 'add_user_to_group' MSG_TYPE_ADD_USER_TO_GROUP = 'add_user_to_group'
MSG_TYPE_FILE_UPLOADED = 'file_uploaded' MSG_TYPE_FILE_UPLOADED = 'file_uploaded'
MSG_TYPE_REPO_SHARE = 'repo_share' MSG_TYPE_REPO_SHARE = 'repo_share'
MSG_TYPE_REPO_SHARE_PERM_CHANGE = 'repo_share_perm_change'
MSG_TYPE_REPO_SHARE_PERM_DELETE = 'repo_share_perm_delete'
MSG_TYPE_REPO_SHARE_TO_GROUP = 'repo_share_to_group' MSG_TYPE_REPO_SHARE_TO_GROUP = 'repo_share_to_group'
MSG_TYPE_USER_MESSAGE = 'user_message' MSG_TYPE_USER_MESSAGE = 'user_message'
MSG_TYPE_FILE_COMMENT = 'file_comment' MSG_TYPE_FILE_COMMENT = 'file_comment'
@@ -90,6 +92,14 @@ def repo_share_msg_to_json(share_from, repo_id, path, org_id):
return json.dumps({'share_from': share_from, 'repo_id': repo_id, return json.dumps({'share_from': share_from, 'repo_id': repo_id,
'path': path, 'org_id': org_id}) 'path': path, 'org_id': org_id})
def repo_share_perm_change_msg_to_json(share_from, repo_id, path, org_id, perm):
return json.dumps({'share_from': share_from, 'repo_id': repo_id,
'path': path, 'org_id': org_id, 'permission': perm})
def repo_share_perm_delete_msg_to_json(share_from, repo_id, path, org_id):
return json.dumps({'share_from': share_from, 'repo_id': repo_id,
'path': path, 'org_id': org_id})
def repo_share_to_group_msg_to_json(share_from, repo_id, group_id, path, org_id): def repo_share_to_group_msg_to_json(share_from, repo_id, group_id, path, org_id):
return json.dumps({'share_from': share_from, 'repo_id': repo_id, return json.dumps({'share_from': share_from, 'repo_id': repo_id,
'group_id': group_id, 'path': path, 'org_id': org_id}) 'group_id': group_id, 'path': path, 'org_id': org_id})
@@ -266,6 +276,13 @@ class UserNotificationManager(models.Manager):
return self._add_user_notification(to_user, return self._add_user_notification(to_user,
MSG_TYPE_REPO_SHARE, detail) MSG_TYPE_REPO_SHARE, detail)
def add_repo_share_perm_change_msg(self, to_user, detail):
return self._add_user_notification(to_user, MSG_TYPE_REPO_SHARE_PERM_CHANGE, detail)
def add_repo_share_perm_delete_msg(self, to_user, detail):
return self._add_user_notification(to_user, MSG_TYPE_REPO_SHARE_PERM_DELETE, detail)
def add_repo_share_to_group_msg(self, to_user, detail): def add_repo_share_to_group_msg(self, to_user, detail):
"""Notify ``to_user`` that others shared a repo to group. """Notify ``to_user`` that others shared a repo to group.
@@ -369,6 +386,12 @@ class UserNotification(models.Model):
""" """
return self.msg_type == MSG_TYPE_REPO_SHARE return self.msg_type == MSG_TYPE_REPO_SHARE
def is_repo_share_perm_change_msg(self):
return self.msg_type == MSG_TYPE_REPO_SHARE_PERM_CHANGE
def is_repo_share_perm_delete_msg(self):
return self.msg_type == MSG_TYPE_REPO_SHARE_PERM_DELETE
def is_repo_share_to_group_msg(self): def is_repo_share_to_group_msg(self):
""" """
@@ -790,7 +813,7 @@ from django.dispatch import receiver
from seahub.signals import upload_file_successful, comment_file_successful, repo_transfer from seahub.signals import upload_file_successful, comment_file_successful, repo_transfer
from seahub.group.signals import group_join_request, add_user_to_group from seahub.group.signals import group_join_request, add_user_to_group
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 share_repo_to_group_successful, change_repo_perm_successful, delete_repo_perm_successful
from seahub.invitations.signals import accept_guest_invitation_successful from seahub.invitations.signals import accept_guest_invitation_successful
from seahub.drafts.signals import comment_draft_successful, \ from seahub.drafts.signals import comment_draft_successful, \
request_reviewer_successful request_reviewer_successful
@@ -828,6 +851,34 @@ def add_share_repo_msg_cb(sender, **kwargs):
detail = repo_share_msg_to_json(from_user, repo.id, path, org_id) detail = repo_share_msg_to_json(from_user, repo.id, path, org_id)
UserNotification.objects.add_repo_share_msg(to_user, detail) UserNotification.objects.add_repo_share_msg(to_user, detail)
@receiver(change_repo_perm_successful)
def add_modify_share_repo_msg_cb(sender, **kwargs):
from_user = kwargs.get('from_user', None)
to_user = kwargs.get('to_user', None)
repo = kwargs.get('repo', None)
path = kwargs.get('path', None)
org_id = kwargs.get('org_id', None)
permission = kwargs.get('permission', None)
assert from_user and to_user and repo and path and permission is not None, 'Arguments error'
detail = repo_share_perm_change_msg_to_json(from_user, repo.id, path, org_id, permission)
UserNotification.objects.add_repo_share_perm_change_msg(to_user, detail)
@receiver(delete_repo_perm_successful)
def add_delete_share_repo_msg_cb(sender, **kwargs):
from_user = kwargs.get('from_user', None)
to_user = kwargs.get('to_user', None)
repo = kwargs.get('repo', None)
path = kwargs.get('path', None)
org_id = kwargs.get('org_id', None)
assert from_user and to_user and repo and path is not None, 'Arguments error'
detail = repo_share_perm_delete_msg_to_json(from_user, repo.id, path, org_id)
UserNotification.objects.add_repo_share_perm_delete_msg(to_user, detail)
@receiver(share_repo_to_group_successful) @receiver(share_repo_to_group_successful)
def add_share_repo_to_group_msg_cb(sender, **kwargs): def add_share_repo_to_group_msg_cb(sender, **kwargs):
"""Notify group member when others share repos to group. """Notify group member when others share repos to group.

View File

@@ -7,10 +7,13 @@ from django.utils.html import escape
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from seaserv import ccnet_api, seafile_api from seaserv import ccnet_api, seafile_api
from seahub.constants import CUSTOM_PERMISSION_PREFIX
from seahub.notifications.models import Notification from seahub.notifications.models import Notification
from seahub.notifications.settings import NOTIFICATION_CACHE_TIMEOUT from seahub.notifications.settings import NOTIFICATION_CACHE_TIMEOUT
from seahub.avatar.templatetags.avatar_tags import api_avatar_url from seahub.avatar.templatetags.avatar_tags import api_avatar_url
from seahub.base.templatetags.seahub_tags import email2nickname, email2contact_email from seahub.base.templatetags.seahub_tags import email2nickname, email2contact_email
from seahub.share.models import CustomSharePermissions
from seahub.utils import get_service_url from seahub.utils import get_service_url
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -61,6 +64,87 @@ def update_notice_detail(request, notices):
except Exception as e: except Exception as e:
logger.error(e) logger.error(e)
elif notice.is_repo_share_perm_change_msg():
try:
d = json.loads(notice.detail)
repo_id = d['repo_id']
path = d.get('path', '/')
org_id = d.get('org_id', None)
permission = d.get('permission', None)
if CUSTOM_PERMISSION_PREFIX in permission:
custom_permission_id = permission.split('-')[1]
try:
csp = CustomSharePermissions.objects.get(id=int(custom_permission_id))
permission = csp.name
except Exception as e:
logger.error(e)
permission = ''
if path == '/':
repo = seafile_api.get_repo(repo_id)
else:
if org_id:
owner = seafile_api.get_org_repo_owner(repo_id)
repo = seafile_api.get_org_virtual_repo(
org_id, repo_id, path, owner)
else:
owner = seafile_api.get_repo_owner(repo_id)
repo = seafile_api.get_virtual_repo(repo_id, path, owner)
if repo is None:
notice.detail = None
else:
d.pop('org_id', None)
share_from_user_email = d.pop('share_from')
url, is_default, date_uploaded = api_avatar_url(share_from_user_email, 32)
d['repo_name'] = repo.name
d['repo_id'] = repo.id
d['share_from_user_name'] = email2nickname(share_from_user_email)
d['share_from_user_email'] = share_from_user_email
d['share_from_user_contact_email'] = email2contact_email(share_from_user_email)
d['share_from_user_avatar_url'] = url
d['permission'] = permission
notice.detail = d
except Exception as e:
logger.error(e)
elif notice.is_repo_share_perm_delete_msg():
try:
d = json.loads(notice.detail)
repo_id = d['repo_id']
path = d.get('path', '/')
org_id = d.get('org_id', None)
if path == '/':
repo = seafile_api.get_repo(repo_id)
else:
if org_id:
owner = seafile_api.get_org_repo_owner(repo_id)
repo = seafile_api.get_org_virtual_repo(
org_id, repo_id, path, owner)
else:
owner = seafile_api.get_repo_owner(repo_id)
repo = seafile_api.get_virtual_repo(repo_id, path, owner)
if repo is None:
notice.detail = None
else:
d.pop('org_id', None)
share_from_user_email = d.pop('share_from')
url, is_default, date_uploaded = api_avatar_url(share_from_user_email, 32)
d['repo_name'] = repo.name
d['repo_id'] = repo.id
d['share_from_user_name'] = email2nickname(share_from_user_email)
d['share_from_user_email'] = share_from_user_email
d['share_from_user_contact_email'] = email2contact_email(share_from_user_email)
d['share_from_user_avatar_url'] = url
notice.detail = d
except Exception as e:
logger.error(e)
elif notice.is_repo_share_to_group_msg(): elif notice.is_repo_share_to_group_msg():
try: try:
d = json.loads(notice.detail) d = json.loads(notice.detail)

View File

@@ -3,3 +3,5 @@ from django.dispatch import Signal
share_repo_to_user_successful = Signal() share_repo_to_user_successful = Signal()
share_repo_to_group_successful = Signal() share_repo_to_group_successful = Signal()
change_repo_perm_successful = Signal()
delete_repo_perm_successful = Signal()