def perform_destroy(self, instance: Community) -> None: # type: ignore request: Request = self.request # type: ignore description = str(request.data.get('description')) with transaction.atomic(): NoticeManager.create_notice_C_D(related_community=instance, description=description) instance.delete()
def post(self, request, pk): community = get_object_or_404(Community, pk=pk, valid=True) serializer = CommunityJoinSerializer(data=request.data) user_status = community.get_member_status(request.user) if serializer.is_valid(): # fixme: put following validation logic into serializer # maybe serializers.SerializerMethodField() is useful here? with transaction.atomic(): admin = community.admins.filter(id=request.user.pk) if not admin: if serializer.validated_data['join']: if user_status['member']: raise NotAcceptable( f'你目前已经为社团成员 ({"正式" if user_status["valid"] else "待审核"})' ) NoticeManager.create_notice_C_AA( request.user, community) community.members.add(request.user) else: if user_status['member']: if request.user != community.owner: community.members.remove(request.user) else: raise NotAcceptable('社团所有者无法直接退出社团。') else: raise NotAcceptable('你不是此社团成员!') return Response(community.get_member_status(request.user)) else: raise NotAcceptable('社团的管理员用户无法直接修改自己的加入状态。') return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def perform_create(self, serializer): with transaction.atomic(): activity = serializer.save() if not activity.related_community.admins.filter(id=self.request.user.id).exists(): if not self.request.user.is_superuser: raise PermissionDenied mail_sent = self.request.data.get('mail', False) NoticeManager.create_notice_C_AN(activity, subtype=0, if_send_mail=mail_sent)
def deny(self, request, *args, **kwargs): invitation = self.get_object() with transaction.atomic(): NoticeManager.create_notice_C_AP( related_user=invitation.user, related_community=invitation.community, subtype=0) invitation.delete() return Response(status=status.HTTP_204_NO_CONTENT)
def perform_create(self, serializer): with transaction.atomic(): community = serializer.save(creator=self.request.user, owner=self.request.user) community.admins.add(self.request.user) community.members.add(self.request.user, through_defaults={'valid': True}) NoticeManager.create_notice_S_CA( related_user=self.request.user, description=f'用户 {self.request.user} 申请创建社团 {community.name}')
def accept(self, request, *args, **kwargs): invitation = self.get_object() community = invitation.community with transaction.atomic(): community.members.add(invitation.user, through_defaults={'valid': True}) NoticeManager.create_notice_C_AP( related_user=invitation.user, related_community=invitation.community, subtype=3) invitation.delete() return Response(status=status.HTTP_204_NO_CONTENT)
def perform_update(self, serializer): with transaction.atomic(): status = serializer.validated_data['valid'] community = self.get_object() owner = community.owner name = community.name serializer.save() NoticeManager.create_notice_CA( related_user=owner, related_community=community, subtype=0, description=f'你的社团 {name} {"目前已经审核通过" if status else "未通过审核。"}' )
def post(self, request, pk, user_id): community = get_object_or_404(Community, pk=pk, valid=True) self.check_object_permissions(request, community) with transaction.atomic(): user_list = get_community_non_members_list(community).values_list( 'id', flat=True) if user_id in user_list: user = User.objects.get(id=user_id) Invitation.objects.create(user=user, community=community) NoticeManager.create_notice_PC(related_user=user, related_community=community, subtype=0) return Response(status=status.HTTP_200_OK) else: raise NotAcceptable('此用户不在可邀请列表中。')
def delete(self, request, pk, user_id): community = get_object_or_404(Community, pk=pk, valid=True) self.check_object_permissions(request, community) with transaction.atomic(): if community.members.filter(id=user_id): user = User.objects.get(id=user_id) if community.owner != user and community.is_admin( user) is False: community.members.remove(user) NoticeManager.create_notice_PC(related_user=user, related_community=community, subtype=2) return Response(status=status.HTTP_204_NO_CONTENT) else: raise NotAcceptable('无法踢出所有者和管理员。') else: raise NotAcceptable('此用户不在此社团中。')
def post(self, request, pk, user_id, action): community = get_object_or_404(Community, pk=pk, valid=True) self.check_object_permissions(request, community) with transaction.atomic(): if community.members.filter(id=user_id): user = User.objects.get(id=user_id) admin_status = community.is_admin(user) if action == 'set' and admin_status is False: community.admins.add(user) elif action == 'unset' and admin_status is True: community.admins.remove(user) NoticeManager.create_notice_PC(related_user=user, related_community=community, subtype=1) else: raise NotAcceptable('错误的操作。') else: raise NotAcceptable('此用户不在此社团中。') return Response(status=status.HTTP_200_OK)
def post(self, request, pk, user_id, action): community = get_object_or_404(Community, pk=pk, valid=True) self.check_object_permissions(request, community) if community.members.filter(id=user_id, membership__valid=True): raise NotAcceptable('此成员已经通过审核。') elif not community.members.filter(id=user_id): raise NotAcceptable('此成员不在审核列表上。') member = community.membership_set.get(user_id=user_id) related_user = community.members.get(id=user_id) subtype_ca = 1 subtype_c_ap = 2 with transaction.atomic(): if action == 'allow': description = '加入社团请求被通过。' NoticeManager.create_notice_CA(related_user, community, subtype_ca, description) NoticeManager.create_notice_C_AP(related_user, community, subtype_c_ap) member.valid = True member.save() elif action == 'deny': description = '加入社团请求被拒绝。' NoticeManager.create_notice_CA(related_user, community, subtype_ca, description) member.delete() else: raise NotAcceptable('错误的操作。') return Response(status=status.HTTP_200_OK)
def perform_update(self, serializer): with transaction.atomic(): activity = serializer.save() mail_sent = self.request.data.get('mail', False) NoticeManager.create_notice_C_AN(activity, subtype=1, if_send_mail=mail_sent)