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')
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, })
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