Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class TaskViewSet(viewsets.ModelViewSet):
- """Операции с задачами."""
- queryset = Task.objects.filter(status=1).select_related('category',
- 'owner')
- @action(detail=True, methods=['POST'])
- def create_answer(self, request, pk=None):
- """Создание отклика."""
- task = self.get_object()
- if task.answers.filter(owner=self.request.user).exists():
- # Если пользователь уже откликался на данную задачу
- return Response(data={
- 'message': 'Вы уже откликались на эту задачу.'
- })
- serializer = AnswerSerializer(data=request.data)
- serializer.is_valid(raise_exception=True)
- serializer.save(
- task=task,
- owner=self.request.user,
- )
- return Response(data={
- 'message': 'Ваш отклик успешно отправлен.'
- }, status=status.HTTP_201_CREATED)
- def get_object(self):
- """Получение заказа для подробного отображения."""
- return Task.objects.select_related(
- 'owner',
- 'category'
- ).prefetch_related(
- 'answers__owner'
- ).get(pk=self.kwargs['pk'])
- def get_permissions(self):
- """Устанавливаем уровни доступа для действий с заказами."""
- if self.action == 'create':
- # Разрешаем создавать задачу только авторизованным пользователям
- permission_classes = [permissions.IsAuthenticated]
- elif self.action == 'create_answer':
- # Запрещаем владельцу откликаться на свою задачу
- permission_classes = [IsNotOwner]
- elif self.action in ['destroy', 'update']:
- # Разрешаем редактировать или удалять задачу только владельцу
- permission_classes = [IsOwner]
- else:
- permission_classes = [permissions.AllowAny]
- return [permission() for permission in permission_classes]
- def get_serializer(self, *args, **kwargs):
- """Устанавливаем serializer в зависимости от действия."""
- if self.action == 'retrieve':
- if args[0].owner == self.request.user:
- return TaskForOwnerSerializer(*args, **kwargs)
- elif self.action == 'create_answer':
- return AnswerSerializer(*args, **kwargs)
- return TaskSerializer(*args, **kwargs)
- def perform_create(self, serializer):
- """Создаем задачу от лица авторизованного пользователя."""
- serializer.save(owner=self.request.user)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement