コード例 #1
0
ファイル: api.py プロジェクト: aliiae/foldoverstories
 def get_queryset(self) -> QueryType[User]:
     room_title = self.kwargs['room_title']
     room = get_object_or_404(Room, room_title=room_title)
     room_users = room.users.annotate(
         texts_count=Count('texts', filter=Q(texts__room=room)))
     Room.calculate_current_turn_user(room_title,
                                      self.request.user)  # recalculate
     return room_users.all().order_by('membership__id')
コード例 #2
0
    def perform_create(self, serializer: TextsFullSerializer):
        room = self.room
        if room.is_finished:
            raise PermissionDenied(detail='Story is finished')
        request_user = self.request.user
        request_membership = get_user_room_membership(request_user, room)
        if request_membership.status == Membership.STOPPED:
            raise PermissionDenied(detail='User has finished')

        current_turn_user: User = Room.calculate_current_turn_user(self.room_title, request_user)
        request_membership.refresh_from_db()
        if request_membership.status != Membership.CAN_WRITE:
            raise PermissionDenied(detail=self._wrong_turn_error_detail(current_turn_user))

        serializer.save(author=request_user, room=room)
        room.save()  # to update the modification timestamp
        _ = Room.calculate_current_turn_user(self.room_title, self.request.user)  # recalculate
        send_channel_message(self.room_title, {
            'type': WEBSOCKET_MSG_ADD_TEXT,
            'room_title': self.room_title,
            'username': request_user.username,
        })
コード例 #3
0
 def get_queryset(self) -> QueryType[Text]:
     """Returns a queryset with a single record: the last, most recent text."""
     room = self.room
     if room.is_finished:
         raise PermissionDenied(detail='Story is finished')
     is_new_user: bool = self.request.user not in room.users.all()
     queryset_with_last_text = Text.objects.filter(room=room).reverse()[:1]
     if is_new_user:  # new users & guests can view anything
         return queryset_with_last_text
     user_membership = get_user_room_membership(self.request.user, room)
     if user_membership.status == Membership.STOPPED:
         raise PermissionDenied(detail='Left room')
     current_turn_user = Room.calculate_current_turn_user(self.room_title, self.request.user)
     user_membership.refresh_from_db()
     if user_membership.status != Membership.CAN_WRITE:
         raise PermissionDenied(detail=self._wrong_turn_error_detail(current_turn_user))
     return queryset_with_last_text