tickets.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from rest_framework import generics, permissions, status
  2. from rest_framework.decorators import api_view, permission_classes
  3. from rest_framework.response import Response
  4. from rest_framework_api_key.permissions import HasAPIKey
  5. from django.contrib.auth.models import Group
  6. from django.contrib.auth import get_user_model
  7. from tickets.api.v2.serializers.tickets import TicketSerializer
  8. from tickets.models import Ticket
  9. import random
  10. class TicketPatchAPIView(generics.UpdateAPIView):
  11. """
  12. API для частичного обновления тикета
  13. """
  14. queryset = Ticket.objects.all()
  15. serializer_class = TicketSerializer
  16. permission_classes = [
  17. permissions.IsAuthenticated | HasAPIKey
  18. ]
  19. class TicketListAPIView(generics.ListAPIView):
  20. """
  21. API для получения списка тикетов
  22. """
  23. queryset = Ticket.objects.all()
  24. serializer_class = TicketSerializer
  25. permission_classes = [
  26. permissions.IsAuthenticated | HasAPIKey
  27. ]
  28. filterset_fields = (
  29. 'title',
  30. 'ticket_list',
  31. 'ticket_type',
  32. 'status',
  33. 'created_by',
  34. 'assigned_to',
  35. )
  36. # TODO: add to redoc
  37. @api_view(['PATCH'])
  38. @permission_classes([permissions.IsAuthenticated | HasAPIKey])
  39. def ticket_assigin_someone_user(request, pk):
  40. try:
  41. ticket = Ticket.objects.get(pk=pk)
  42. except Ticket.DoesNotExist:
  43. return Response({"error": "Тикет не найден"}, status=status.HTTP_404_NOT_FOUND)
  44. users = ticket.ticket_list.group.user_set.all()
  45. if not users:
  46. return Response(
  47. {"error": "Нет доступных пользователей для назначения"},
  48. status=status.HTTP_400_BAD_REQUEST
  49. )
  50. # TODO: Сделать алгоритм выбора пользователя по каким-нибудь параметрам
  51. # Например по количеству уже назначенных тикетов:
  52. # Выбрать пользователя, у кого меньше всего тикетов назначено
  53. random_user = random.choice(users)
  54. ticket.assigned_to = random_user
  55. ticket.save()
  56. return Response({
  57. "id": ticket.id,
  58. "assigned_to": random_user.username,
  59. "status": "Назначение обновлено"
  60. }, status=status.HTTP_200_OK)