notice/apps/projects/views.py

79 lines
3.0 KiB
Python

import logging
from rest_framework.decorators import action
from rest_framework.viewsets import ModelViewSet
from rest_framework import permissions
from .models import Projects
from . import serializers
from rest_framework import filters
from interfaces.models import Interfaces
from testcases.models import TestCases
from testsuites.models import TestSuites
from configures.models import Configures
from utils.mixins import GetDataMinxin
logger = logging.getLogger("mytest")
class ProjectViewSet(ModelViewSet, GetDataMinxin):
queryset = Projects.objects.all()
serializer_class = serializers.ProjectModelSerializer
filter_backends = [filters.SearchFilter, filters.OrderingFilter]
search_fields = ['id', 'name', 'leader']
ordering_fields = ['name', 'leader']
permission_classes = [permissions.IsAuthenticated]
def list(self, request, *args, **kwargs):
response = super().list(request, *args, **kwargs)
for item in response.data["results"]:
interfaces = Interfaces.objects.filter(project_id=item["id"])
item["interfaces"] = interfaces.count()
item["testsuits"] = TestSuites.objects.filter(project_id=item["id"]).count()
# ---------------------- 方式一 ----------------------
# item["testcases"] = 0
# item["configures"] = 0
# for interface in interfaces:
# item["testcases"] += TestCases.objects.filter(interface_id=interface.id).count()
# item["configures"] += Configures.objects.filter(interface_id=interface.id).count()
# ---------------------- 方式二 ----------------------
item["testcases"] = TestCases.objects.filter(interface__project_id=item["id"]).count()
item["configures"] = Configures.objects.filter(interface__project_id=item["id"]).count()
return response
@action(detail=False)
def names(self, request, *args, **kwargs):
"""获取所有项目的名称"""
response = super().list(request, *args, **kwargs)
return response
@action(detail=True)
def interfaces(self, request, *args, **kwargs):
"""获取项目下的接口信息"""
# response = self.retrieve(request, *args, **kwargs)
# response.data = response.data.get('interfaces')
# logger.error(response.data)
# return response
return self.get_data_by_ation(request, *args, **kwargs)
def get_serializer_class(self):
if self.action == "names":
return serializers.NamesProjectSerializer
elif self.action == "interfaces":
return serializers.InterfacesProjectSerializer
else:
return super().get_serializer_class()
def filter_queryset(self, queryset):
if self.action == "names":
return queryset
else:
return super().filter_queryset(queryset)
def paginate_queryset(self, queryset):
if self.action == "names":
return
else:
return super().paginate_queryset(queryset)