Advertisement
Guest User

Untitled

a guest
May 13th, 2021
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.95 KB | None | 0 0
  1. class TaskViewSet(viewsets.ModelViewSet):
  2.     """Операции с задачами."""
  3.     queryset = Task.objects.filter(status=1).select_related('category',
  4.                                                             'owner')
  5.  
  6.     @action(detail=True, methods=['POST'])
  7.     def create_answer(self, request, pk=None):
  8.         """Создание отклика."""
  9.         task = self.get_object()
  10.         if task.answers.filter(owner=self.request.user).exists():
  11.             # Если пользователь уже откликался на данную задачу
  12.             return Response(data={
  13.                 'message': 'Вы уже откликались на эту задачу.'
  14.             })
  15.         serializer = AnswerSerializer(data=request.data)
  16.         serializer.is_valid(raise_exception=True)
  17.         serializer.save(
  18.             task=task,
  19.             owner=self.request.user,
  20.         )
  21.         return Response(data={
  22.                 'message': 'Ваш отклик успешно отправлен.'
  23.         }, status=status.HTTP_201_CREATED)
  24.  
  25.     def get_object(self):
  26.         """Получение заказа для подробного отображения."""
  27.         return Task.objects.select_related(
  28.             'owner',
  29.             'category'
  30.         ).prefetch_related(
  31.             'answers__owner'
  32.         ).get(pk=self.kwargs['pk'])
  33.  
  34.     def get_permissions(self):
  35.         """Устанавливаем уровни доступа для действий с заказами."""
  36.         if self.action == 'create':
  37.             # Разрешаем создавать задачу только авторизованным пользователям
  38.             permission_classes = [permissions.IsAuthenticated]
  39.         elif self.action == 'create_answer':
  40.             # Запрещаем владельцу откликаться на свою задачу
  41.             permission_classes = [IsNotOwner]
  42.         elif self.action in ['destroy', 'update']:
  43.             # Разрешаем редактировать или удалять задачу только владельцу
  44.             permission_classes = [IsOwner]
  45.         else:
  46.             permission_classes = [permissions.AllowAny]
  47.         return [permission() for permission in permission_classes]
  48.  
  49.     def get_serializer(self, *args, **kwargs):
  50.         """Устанавливаем serializer в зависимости от действия."""
  51.         if self.action == 'retrieve':
  52.             if args[0].owner == self.request.user:
  53.                 return TaskForOwnerSerializer(*args, **kwargs)
  54.         elif self.action == 'create_answer':
  55.             return AnswerSerializer(*args, **kwargs)
  56.         return TaskSerializer(*args, **kwargs)
  57.  
  58.     def perform_create(self, serializer):
  59.         """Создаем задачу от лица авторизованного пользователя."""
  60.         serializer.save(owner=self.request.user)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement