tickets.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from rest_framework import generics, permissions, status
  2. from rest_framework.response import Response
  3. from rest_framework_api_key.permissions import HasAPIKey
  4. from django.contrib.auth import get_user_model
  5. from tickets.api.v2.serializers.tickets import TicketSerializer
  6. from tickets.models import Ticket
  7. User = get_user_model()
  8. class TicketUpdateAPIView(generics.UpdateAPIView):
  9. """
  10. API для частичного обновления тикета
  11. """
  12. queryset = Ticket.objects.all()
  13. serializer_class = TicketSerializer
  14. permission_classes = [
  15. permissions.IsAuthenticated | HasAPIKey
  16. ]
  17. def perform_update(self, serializer):
  18. if 'assignin' in serializer.validated_data:
  19. assignin = serializer.validated_data['assignin']
  20. if isinstance(assignin, int):
  21. try:
  22. user = User.objects.get(id=assignin)
  23. serializer.instance.assigned_to = user
  24. except User.DoesNotExist:
  25. return Response(
  26. {"detail": "Пользователь с таким ID не существует."},
  27. status=status.HTTP_404_NOT_FOUND
  28. )
  29. elif isinstance(assignin, str):
  30. match assignin:
  31. case "anyone":
  32. user = self.get_user_for_assigned_to(serializer.instance)
  33. serializer.instance.assigned_to = user
  34. case _:
  35. return Response(
  36. {"detail": "Некорректное значение для 'assigned_to'."},
  37. status=status.HTTP_400_BAD_REQUEST
  38. )
  39. serializer.save()
  40. return Response(serializer.data)
  41. def get_user_for_assigned_to(self, ticket: Ticket):
  42. return User.objects.filter(groups__name=ticket.ticket_list.group.name, is_active=True).first()
  43. class TicketListAPIView(generics.ListAPIView):
  44. """
  45. API для получения списка тикетов
  46. """
  47. queryset = Ticket.objects.all()
  48. serializer_class = TicketSerializer
  49. permission_classes = [
  50. permissions.IsAuthenticated | HasAPIKey
  51. ]
  52. filterset_fields = (
  53. 'title',
  54. 'ticket_list',
  55. 'ticket_type',
  56. 'status',
  57. 'created_by',
  58. 'assigned_to',
  59. )