user_group_view.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. # coding=utf-8
  2. """
  3. 用户组视图
  4. 基于 system_manage.UserGroup 提供批量授权 API
  5. """
  6. from django.utils.translation import gettext as _
  7. from rest_framework.request import Request
  8. from rest_framework.views import APIView
  9. from common.auth import TokenAuth
  10. from common.exception.app_exception import AppApiException
  11. from common.result import result
  12. from system_manage.models.chat_user import UserGroup, UserGroupRelation, ResourceChatUserGroupAuthorize
  13. from users.models.user import User
  14. class UserGroupView(APIView):
  15. """用户组管理"""
  16. authentication_classes = [TokenAuth]
  17. class List(APIView):
  18. """获取用户组列表"""
  19. authentication_classes = [TokenAuth]
  20. def get(self, request: Request, workspace_id: str):
  21. groups = UserGroup.objects.all()
  22. data = [{
  23. 'id': str(g.id),
  24. 'name': g.name,
  25. 'member_count': UserGroupRelation.objects.filter(group=g).count(),
  26. 'auth_count': ResourceChatUserGroupAuthorize.objects.filter(user_group=g).count(),
  27. } for g in groups]
  28. return result.success(data)
  29. class Create(APIView):
  30. """创建用户组"""
  31. authentication_classes = [TokenAuth]
  32. def post(self, request: Request, workspace_id: str):
  33. name = request.data.get('name', '')
  34. if not name:
  35. raise AppApiException(400, _('用户组名称不能为空'))
  36. if UserGroup.objects.filter(name=name).exists():
  37. raise AppApiException(400, _('用户组名称已存在'))
  38. group = UserGroup.objects.create(name=name)
  39. return result.success({
  40. 'id': str(group.id),
  41. 'name': group.name,
  42. })
  43. class Operate(APIView):
  44. """用户组操作(获取/更新/删除)"""
  45. authentication_classes = [TokenAuth]
  46. def get(self, request: Request, workspace_id: str, group_id: str):
  47. try:
  48. group = UserGroup.objects.get(id=group_id)
  49. except UserGroup.DoesNotExist:
  50. raise AppApiException(404, _('用户组不存在'))
  51. # 获取成员列表
  52. relations = UserGroupRelation.objects.filter(group=group)
  53. member_list = [{
  54. 'id': str(r.user_id),
  55. 'username': r.user.username if r.user else '',
  56. 'nick_name': r.user.nick_name if r.user else '',
  57. } for r in relations if r.user]
  58. # 获取授权列表
  59. auths = ResourceChatUserGroupAuthorize.objects.filter(user_group=group)
  60. auth_list = [{
  61. 'id': str(a.id),
  62. 'resource_type': a.resource_type,
  63. 'resource_id': str(a.resource_id),
  64. 'is_auth': a.is_auth,
  65. } for a in auths]
  66. return result.success({
  67. 'id': str(group.id),
  68. 'name': group.name,
  69. 'members': member_list,
  70. 'authorizations': auth_list,
  71. })
  72. def put(self, request: Request, workspace_id: str, group_id: str):
  73. try:
  74. group = UserGroup.objects.get(id=group_id)
  75. except UserGroup.DoesNotExist:
  76. raise AppApiException(404, _('用户组不存在'))
  77. name = request.data.get('name')
  78. if name is not None:
  79. if UserGroup.objects.filter(name=name).exclude(id=group_id).exists():
  80. raise AppApiException(400, _('用户组名称已存在'))
  81. group.name = name
  82. group.save()
  83. return result.success({
  84. 'id': str(group.id),
  85. 'name': group.name,
  86. })
  87. def delete(self, request: Request, workspace_id: str, group_id: str):
  88. try:
  89. group = UserGroup.objects.get(id=group_id)
  90. except UserGroup.DoesNotExist:
  91. raise AppApiException(404, _('用户组不存在'))
  92. # 删除关联数据
  93. UserGroupRelation.objects.filter(group=group).delete()
  94. ResourceChatUserGroupAuthorize.objects.filter(user_group=group).delete()
  95. group.delete()
  96. return result.success(True)
  97. class BatchAddMembers(APIView):
  98. """批量添加用户组成员"""
  99. authentication_classes = [TokenAuth]
  100. def post(self, request: Request, workspace_id: str, group_id: str):
  101. try:
  102. group = UserGroup.objects.get(id=group_id)
  103. except UserGroup.DoesNotExist:
  104. raise AppApiException(404, _('用户组不存在'))
  105. user_ids = request.data.get('user_ids', [])
  106. if not user_ids:
  107. raise AppApiException(400, _('用户ID列表不能为空'))
  108. added_count = 0
  109. for user_id in user_ids:
  110. try:
  111. user = User.objects.get(id=user_id)
  112. _, created = UserGroupRelation.objects.get_or_create(
  113. group=group,
  114. user=user
  115. )
  116. if created:
  117. added_count += 1
  118. except User.DoesNotExist:
  119. continue
  120. return result.success({'added_count': added_count})
  121. class BatchRemoveMembers(APIView):
  122. """批量移除用户组成员"""
  123. authentication_classes = [TokenAuth]
  124. def post(self, request: Request, workspace_id: str, group_id: str):
  125. try:
  126. group = UserGroup.objects.get(id=group_id)
  127. except UserGroup.DoesNotExist:
  128. raise AppApiException(404, _('用户组不存在'))
  129. user_ids = request.data.get('user_ids', [])
  130. if not user_ids:
  131. raise AppApiException(400, _('用户ID列表不能为空'))
  132. removed_count = UserGroupRelation.objects.filter(
  133. group=group,
  134. user_id__in=user_ids
  135. ).delete()[0]
  136. return result.success({'removed_count': removed_count})
  137. class BatchAuthorize(APIView):
  138. """批量授权用户组资源"""
  139. authentication_classes = [TokenAuth]
  140. def post(self, request: Request, workspace_id: str, group_id: str):
  141. try:
  142. group = UserGroup.objects.get(id=group_id)
  143. except UserGroup.DoesNotExist:
  144. raise AppApiException(404, _('用户组不存在'))
  145. authorizations = request.data.get('authorizations', [])
  146. if not authorizations:
  147. raise AppApiException(400, _('授权列表不能为空'))
  148. added_count = 0
  149. for auth in authorizations:
  150. resource_type = auth.get('resource_type')
  151. resource_id = auth.get('resource_id')
  152. is_auth = auth.get('is_auth', True)
  153. if not resource_type or not resource_id:
  154. continue
  155. _, created = ResourceChatUserGroupAuthorize.objects.update_or_create(
  156. user_group=group,
  157. resource_type=resource_type,
  158. resource_id=resource_id,
  159. defaults={
  160. 'workspace_id': workspace_id,
  161. 'is_auth': is_auth
  162. }
  163. )
  164. if created:
  165. added_count += 1
  166. return result.success({'added_count': added_count})
  167. class BatchRevokeAuthorization(APIView):
  168. """批量撤销用户组授权"""
  169. authentication_classes = [TokenAuth]
  170. def post(self, request: Request, workspace_id: str, group_id: str):
  171. try:
  172. group = UserGroup.objects.get(id=group_id)
  173. except UserGroup.DoesNotExist:
  174. raise AppApiException(404, _('用户组不存在'))
  175. auth_ids = request.data.get('auth_ids', [])
  176. if not auth_ids:
  177. raise AppApiException(400, _('授权ID列表不能为空'))
  178. removed_count = ResourceChatUserGroupAuthorize.objects.filter(
  179. user_group=group,
  180. id__in=auth_ids
  181. ).delete()[0]
  182. return result.success({'removed_count': removed_count})