From 76c596157759d8341413c82de88290554ed2dba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=B0=B8=E5=BC=BA?= <11704063+s-yongqiang@user.noreply.gitee.com> Date: Mon, 19 May 2025 10:26:20 +0800 Subject: [PATCH 1/4] update org group member api --- seahub/organizations/api/group_members.py | 138 ++++++++++++++++++++-- 1 file changed, 131 insertions(+), 7 deletions(-) diff --git a/seahub/organizations/api/group_members.py b/seahub/organizations/api/group_members.py index c4bbf275ad..c374e794f2 100644 --- a/seahub/organizations/api/group_members.py +++ b/seahub/organizations/api/group_members.py @@ -4,8 +4,9 @@ import logging from rest_framework.authentication import SessionAuthentication from rest_framework.views import APIView from rest_framework import status +from rest_framework.response import Response -from seaserv import ccnet_api +from seaserv import ccnet_api, seafile_api from seahub.api2.utils import api_error from seahub.organizations.views import get_org_id_by_group @@ -16,6 +17,13 @@ from seahub.api2.endpoints.admin.group_members import AdminGroupMembers as SysAd from seahub.api2.endpoints.admin.group_members import AdminGroupMember as SysAdminGroupMember from seahub.organizations.api.permissions import IsOrgAdmin from seahub.organizations.api.utils import check_org_admin +from seahub.base.accounts import User +from seahub.group.utils import is_group_member, get_group_member_info +from seahub.base.templatetags.seahub_tags import email2nickname + +from seahub.group.signals import add_user_to_group +from seahub.admin_log.signals import admin_operation +from seahub.admin_log.models import GROUP_MEMBER_ADD, GROUP_MEMBER_DELETE logger = logging.getLogger(__name__) @@ -63,11 +71,65 @@ class AdminGroupMembers(APIView): # permission check group_id = int(group_id) - if get_org_id_by_group(group_id) != org_id: + group = ccnet_api.get_group(group_id) + if not group or get_org_id_by_group(group_id) != org_id: error_msg = 'Group %s not found.' % group_id return api_error(status.HTTP_404_NOT_FOUND, error_msg) + + emails = request.POST.getlist('email', '') + if not emails: + error_msg = 'Email invalid.' + return api_error(status.HTTP_400_BAD_REQUEST, error_msg) + result = {} + result['failed'] = [] + result['success'] = [] + emails_need_add = [] - return SysAdminGroupMembers().post(request, group_id) + for email in emails: + try: + User.objects.get(email=email) + except User.DoesNotExist: + result['failed'].append({ + 'email': email, + 'error_msg': 'User %s not found.' % email + }) + continue + + if is_group_member(group_id, email, in_structure=False): + result['failed'].append({ + 'email': email, + 'error_msg': 'User %s is already a group member.' % email2nickname(email) + }) + continue + + emails_need_add.append(email) + # Add user to group. + for email in emails_need_add: + try: + ccnet_api.group_add_member(group_id, group.creator_name, email) + member_info = get_group_member_info(request, group_id, email) + result['success'].append(member_info) + except Exception as e: + logger.error(e) + result['failed'].append({ + 'email': email, + 'error_msg': 'Internal Server Error' + }) + + add_user_to_group.send(sender=None, + group_staff=request.user.username, + group_id=group_id, + added_user=email) + + admin_op_detail = { + 'id': group_id, + 'name': group.group_name, + 'user': email + } + admin_operation.send(sender=None, admin_name=request.user.username, + operation=GROUP_MEMBER_ADD, detail=admin_op_detail) + + return Response(result) class AdminGroupMember(APIView): @@ -91,11 +153,43 @@ class AdminGroupMember(APIView): # permission check group_id = int(group_id) - if get_org_id_by_group(group_id) != org_id: + group = ccnet_api.get_group(group_id) + if not group or get_org_id_by_group(group_id) != org_id: error_msg = 'Group %s not found.' % group_id return api_error(status.HTTP_404_NOT_FOUND, error_msg) - return SysAdminGroupMember().put(request, group_id, email, format) + try: + User.objects.get(email=email) + except User.DoesNotExist: + error_msg = 'User %s not found.' % email + return api_error(status.HTTP_404_NOT_FOUND, error_msg) + + try: + if not is_group_member(group_id, email): + error_msg = 'Email %s invalid.' % email + return api_error(status.HTTP_400_BAD_REQUEST, error_msg) + except Exception as e: + logger.error(e) + error_msg = 'Internal Server Error' + return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) + + is_admin = request.data.get('is_admin', '') + try: + # set/unset a specific group member as admin + if is_admin.lower() == 'true': + ccnet_api.group_set_admin(group_id, email) + elif is_admin.lower() == 'false': + ccnet_api.group_unset_admin(group_id, email) + else: + error_msg = 'is_admin invalid.' + return api_error(status.HTTP_400_BAD_REQUEST, error_msg) + except Exception as e: + logger.error(e) + error_msg = 'Internal Server Error' + return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) + + member_info = get_group_member_info(request, group_id, email) + return Response(member_info) @check_org_admin def delete(self, request, org_id, group_id, email, format=None): @@ -112,8 +206,38 @@ class AdminGroupMember(APIView): # permission check group_id = int(group_id) - if get_org_id_by_group(group_id) != org_id: + group = ccnet_api.get_group(group_id) + if not group or get_org_id_by_group(group_id) != org_id: error_msg = 'Group %s not found.' % group_id return api_error(status.HTTP_404_NOT_FOUND, error_msg) + + if group.creator_name == email: + error_msg = '%s is group owner, can not be removed.' % email + return api_error(status.HTTP_403_FORBIDDEN, error_msg) - return SysAdminGroupMember().delete(request, group_id, email, format) + # delete member from group + try: + if not is_group_member(group_id, email): + return Response({'success': True}) + except Exception as e: + logger.error(e) + error_msg = 'Internal Server Error' + return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) + + try: + ccnet_api.group_remove_member(group_id, group.creator_name, email) + # remove repo-group share info of all 'email' owned repos + seafile_api.remove_group_repos_by_owner(group_id, email) + admin_op_detail = { + 'id': group_id, + 'name': group.group_name, + 'user': email + } + admin_operation.send(sender=None, admin_name=request.user.username, + operation=GROUP_MEMBER_DELETE, detail=admin_op_detail) + except Exception as e: + logger.error(e) + error_msg = 'Internal Server Error' + return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) + + return Response({'success': True}) From ebcdafb231ea5db1919104b12ef2a3e60922222d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=B0=B8=E5=BC=BA?= <11704063+s-yongqiang@user.noreply.gitee.com> Date: Wed, 21 May 2025 14:44:19 +0800 Subject: [PATCH 2/4] update org get dep members --- seahub/organizations/api/group_members.py | 42 +++++++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/seahub/organizations/api/group_members.py b/seahub/organizations/api/group_members.py index c374e794f2..36f17b7078 100644 --- a/seahub/organizations/api/group_members.py +++ b/seahub/organizations/api/group_members.py @@ -18,7 +18,7 @@ from seahub.api2.endpoints.admin.group_members import AdminGroupMember as SysAdm from seahub.organizations.api.permissions import IsOrgAdmin from seahub.organizations.api.utils import check_org_admin from seahub.base.accounts import User -from seahub.group.utils import is_group_member, get_group_member_info +from seahub.group.utils import is_group_member, get_group_member_info, get_group_members_info from seahub.base.templatetags.seahub_tags import email2nickname from seahub.group.signals import add_user_to_group @@ -49,11 +49,47 @@ class AdminGroupMembers(APIView): # permission check group_id = int(group_id) - if get_org_id_by_group(group_id) != org_id: + group = ccnet_api.get_group(group_id) + if not group or get_org_id_by_group(group_id) != org_id: error_msg = 'Group %s not found.' % group_id return api_error(status.HTTP_404_NOT_FOUND, error_msg) - return SysAdminGroupMembers().get(request, group_id, format) + try: + page = int(request.GET.get('page', '1')) + per_page = int(request.GET.get('per_page', '100')) + except ValueError: + page = 1 + per_page = 100 + + start = (page - 1) * per_page + limit = per_page + 1 + + try: + members = ccnet_api.get_group_members(group_id, start, limit) + except Exception as e: + logger.error(e) + error_msg = 'Internal Server Error' + return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) + + if len(members) > per_page: + members = members[:per_page] + has_next_page = True + else: + has_next_page = False + + + member_usernames = [m.user_name for m in members] + members_info = get_group_members_info(group_id, member_usernames) + group_members = { + 'group_id': group_id, + 'group_name': group.group_name, + 'members': members_info, + 'page_info': { + 'has_next_page': has_next_page, + 'current_page': page + } + } + return Response(group_members) @check_org_admin def post(self, request, org_id, group_id): From cee2ad24897f8df41bf31e8d7cf9fdbc85ae3778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=B0=B8=E5=BC=BA?= <11704063+s-yongqiang@user.noreply.gitee.com> Date: Wed, 21 May 2025 15:38:28 +0800 Subject: [PATCH 3/4] remove org admin op record --- seahub/organizations/api/group_members.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/seahub/organizations/api/group_members.py b/seahub/organizations/api/group_members.py index 36f17b7078..fc26dd23be 100644 --- a/seahub/organizations/api/group_members.py +++ b/seahub/organizations/api/group_members.py @@ -22,8 +22,6 @@ from seahub.group.utils import is_group_member, get_group_member_info, get_group from seahub.base.templatetags.seahub_tags import email2nickname from seahub.group.signals import add_user_to_group -from seahub.admin_log.signals import admin_operation -from seahub.admin_log.models import GROUP_MEMBER_ADD, GROUP_MEMBER_DELETE logger = logging.getLogger(__name__) @@ -157,14 +155,6 @@ class AdminGroupMembers(APIView): group_id=group_id, added_user=email) - admin_op_detail = { - 'id': group_id, - 'name': group.group_name, - 'user': email - } - admin_operation.send(sender=None, admin_name=request.user.username, - operation=GROUP_MEMBER_ADD, detail=admin_op_detail) - return Response(result) @@ -264,13 +254,6 @@ class AdminGroupMember(APIView): ccnet_api.group_remove_member(group_id, group.creator_name, email) # remove repo-group share info of all 'email' owned repos seafile_api.remove_group_repos_by_owner(group_id, email) - admin_op_detail = { - 'id': group_id, - 'name': group.group_name, - 'user': email - } - admin_operation.send(sender=None, admin_name=request.user.username, - operation=GROUP_MEMBER_DELETE, detail=admin_op_detail) except Exception as e: logger.error(e) error_msg = 'Internal Server Error' From c9ed89c0dc071f2c1e9d76d390077433ce80a828 Mon Sep 17 00:00:00 2001 From: r350178982 <32759763+r350178982@users.noreply.github.com> Date: Wed, 21 May 2025 16:14:06 +0800 Subject: [PATCH 4/4] remove-useless-code --- seahub/organizations/api/group_members.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/seahub/organizations/api/group_members.py b/seahub/organizations/api/group_members.py index fc26dd23be..25ee53a738 100644 --- a/seahub/organizations/api/group_members.py +++ b/seahub/organizations/api/group_members.py @@ -13,8 +13,6 @@ from seahub.organizations.views import get_org_id_by_group from seahub.api2.authentication import TokenAuthentication from seahub.api2.throttling import UserRateThrottle from seahub.api2.permissions import IsProVersion -from seahub.api2.endpoints.admin.group_members import AdminGroupMembers as SysAdminGroupMembers -from seahub.api2.endpoints.admin.group_members import AdminGroupMember as SysAdminGroupMember from seahub.organizations.api.permissions import IsOrgAdmin from seahub.organizations.api.utils import check_org_admin from seahub.base.accounts import User