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)
예제 #3
0
 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)
예제 #12
0
 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)