Browse Source

add routes ticket in dbsynced

blezz-tech 23 hours ago
parent
commit
4d08705566
4 changed files with 108 additions and 0 deletions
  1. 31 0
      api/v2/serializers/tickets.py
  2. 1 0
      api/v2/views/__init__.py
  3. 69 0
      api/v2/views/tickets.py
  4. 7 0
      urls.py

+ 31 - 0
api/v2/serializers/tickets.py

@@ -0,0 +1,31 @@
+from rest_framework import serializers
+from tickets.models import Ticket
+
+class TicketSerializer(serializers.ModelSerializer):
+    available_statuses = serializers.SerializerMethodField()
+
+
+    def get_available_statuses(self, obj):
+        return obj.get_available_statuses()
+
+
+    def validate_status(self, status):
+        valid_statuses = self.get_available_statuses(self.instance)
+        if not valid_statuses or status not in valid_statuses:
+            raise serializers.ValidationError("Invalid value for the status field")
+        return status
+
+
+    def validate_assignin(self, value):
+        if not isinstance(value, (int, str)):
+            raise serializers.ValidationError("Некорректный тип данных для 'assigned_to'.")
+        if isinstance(value, str) and value not in ["anyone"]:
+            raise serializers.ValidationError("Некорректное значение для 'assigned_to'.")
+        return value
+
+
+    class Meta():
+        model = Ticket
+        fields = "__all__"
+        ref_name = "TicketSerializer_v2"
+

+ 1 - 0
api/v2/views/__init__.py

@@ -0,0 +1 @@
+from .tickets import *

+ 69 - 0
api/v2/views/tickets.py

@@ -0,0 +1,69 @@
+from rest_framework import generics, permissions, status
+from rest_framework.response import Response
+from rest_framework_api_key.permissions import HasAPIKey
+from django.contrib.auth import get_user_model
+from tickets.api.v2.serializers.tickets import TicketSerializer
+from tickets.models import Ticket
+
+User = get_user_model()
+class TicketUpdateAPIView(generics.UpdateAPIView):
+    """
+    API для частичного обновления тикета
+    """
+
+    queryset = Ticket.objects.all()
+    serializer_class = TicketSerializer
+    permission_classes = [
+        permissions.IsAuthenticated | HasAPIKey
+    ]
+
+    def perform_update(self, serializer):
+        if 'assignin' in serializer.validated_data:
+            assignin = serializer.validated_data['assignin']
+            
+            if isinstance(assignin, int):
+                try:
+                    user = User.objects.get(id=assignin)
+                    serializer.instance.assigned_to = user
+                except User.DoesNotExist:
+                    return Response(
+                        {"detail": "Пользователь с таким ID не существует."},
+                        status=status.HTTP_404_NOT_FOUND
+                    )
+            elif isinstance(assignin, str):
+                match assignin:
+                    case "anyone":
+                        user = self.get_user_for_assigned_to(serializer.instance)
+                        serializer.instance.assigned_to = user
+                    case _:
+                        return Response(
+                            {"detail": "Некорректное значение для 'assigned_to'."},
+                            status=status.HTTP_400_BAD_REQUEST
+                        )
+        
+        serializer.save()
+        return Response(serializer.data)
+
+    def get_user_for_assigned_to(self, ticket: Ticket):
+        return User.objects.filter(groups__name=ticket.ticket_list.group.name, is_active=True).first()
+
+
+class TicketListAPIView(generics.ListAPIView):
+    """
+    API для получения списка тикетов
+    """
+
+    queryset = Ticket.objects.all()
+    serializer_class = TicketSerializer
+    permission_classes = [
+        permissions.IsAuthenticated | HasAPIKey
+    ]
+    filterset_fields = (
+        'title',
+        'ticket_list',
+        'ticket_type',
+        'status',
+        'created_by',
+        'assigned_to',
+    )
+

+ 7 - 0
urls.py

@@ -2,6 +2,7 @@ from django.urls import path, include
 from rest_framework import routers
 
 from dbsynce.apiviews import *
+import dbsynce.api.v2.views as apiviews_2
 
 router = routers.DefaultRouter()
 router.register(r'client', ClientMVS)
@@ -15,6 +16,12 @@ router.register(r'resource', ResourceMVS)
 router.register(r'service', ServiceMVS)
 router.register(r'service_category', ServiceCategoryMVS)
 
+urlpatterns_api_v2 = [
+    path('ticket/<int:pk>', apiviews_2.TicketUpdateAPIView.as_view()),
+    path('ticket/', apiviews_2.TicketListAPIView.as_view()),
+]
+
 urlpatterns = [
     path('api/', include(router.urls), name="dbsynced"),
+    path('api/v2/', include(urlpatterns_api_v2))
 ]