factory/apps/enp/views.py

153 lines
5.4 KiB
Python

from django.shortcuts import render
from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet, ListModelMixin
from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin
from .serializers import DrainSerializer, DrainEquipSerializer, DrainEquipEnvSerializer, VehicleAccessSerializer, EnvDataSerializer, EnvDataExportSerializer, CarWashSerializer, Drain2Serializer
from .models import Drain, DrainEquip, VehicleAccess, EnvData, CarWash
from rest_framework.decorators import action
from apps.utils.sql import query_all_dict
from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi
from rest_framework.response import Response
from django.db.models import Count, Case, When, IntegerField
# Create your views here.
class DrainViewSet(CustomModelViewSet):
"""
list: 排口/污染源
排口/污染源
"""
queryset = Drain.objects.all()
serializer_class = DrainSerializer
filterset_fields = ['type', 'cate', 'mgroup', 'level']
select_related_fields = ['mgroup']
def get_serializer_class(self):
has_equipdata = self.request.query_params.get('has_equipdata', 'no')
if self.request.method == 'GET' and has_equipdata == 'yes':
return Drain2Serializer
return super().get_serializer_class()
@swagger_auto_schema(manual_parameters=[
openapi.Parameter(name="has_equipdata", in_=openapi.IN_QUERY, description="Include equip data in the response",
type=openapi.TYPE_STRING, enum=["yes", "no"], required=False),
openapi.Parameter(name="query", in_=openapi.IN_QUERY, description="定制返回数据",
type=openapi.TYPE_STRING, required=False),
])
def list(self, request, *args, **kwargs):
return super().list(request, *args, **kwargs)
@action(methods=['get'], detail=False, perms_map={'get': '*'})
def count_cate(self, request, *args, **kwargs):
"""排口分类数量
排口分类数量
"""
queryset = self.filter_queryset(self.get_queryset())
result = queryset.aggregate(
count=Count('id'),
count_product=Count(
Case(When(cate='product', then=1), output_field=IntegerField())),
count_mtrans=Count(
Case(When(cate='mtrans', then=1), output_field=IntegerField())),
count_mstore=Count(
Case(When(cate='mstore', then=1), output_field=IntegerField())),
)
json_result = {
'count': result['count'],
'count_product': result['count_product'],
'count_mtrans': result['count_mtrans'],
'count_mstore': result['count_mstore']
}
return Response(json_result)
class DrainEquipViewSet(ListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin, CustomGenericViewSet):
"""
list: 排口/设备关系
排口/设备关系
"""
perms_map = {'get': '*', 'post:': 'drain.update', 'delete': 'drain.update'}
queryset = DrainEquip.objects.all()
serializer_class = DrainEquipSerializer
select_related_fields = ['equipment', 'drain']
filterset_fields = ['drain', 'equipment',
'drain__mgroup', 'equipment__mgroup', 'drain__type', 'equipment__type']
def get_serializer_class(self):
has_envdata = self.request.query_params.get('has_envdata', 'no')
if self.request.method == 'GET' and has_envdata == 'yes':
return DrainEquipEnvSerializer
return super().get_serializer_class()
@swagger_auto_schema(manual_parameters=[
openapi.Parameter(name="has_envdata", in_=openapi.IN_QUERY, description="Include environmental data in the response",
type=openapi.TYPE_STRING, enum=["yes", "no"], required=False),
])
def list(self, request, *args, **kwargs):
return super().list(request, *args, **kwargs)
class VehicleAccessViewSet(ListModelMixin, CustomGenericViewSet):
"""
list: 车辆出入记录
车辆出入记录
"""
perms_map = {'get': '*'}
queryset = VehicleAccess.objects.all()
serializer_class = VehicleAccessSerializer
filterset_fields = {
"vehicle_number": ['icontains'],
"emission_standard": ['exact', 'in'],
"type": ['exact', 'in'],
"is_new_energy": ["exact"],
"access_time": ['gte', 'lte', 'year', 'month', 'day', 'quarter', 'week']
}
class EnvDataViewSet(ListModelMixin, CustomGenericViewSet):
"""
list: 环保时序数据
环保时序数据
"""
perms_map = {'get': '*'}
queryset = EnvData.objects.all()
serializer_class = EnvDataSerializer
filterset_fields = {
"time": ['exact', 'gte', 'lte', 'year', 'month', 'day'],
"equipment": ['exact'],
}
ordering_fields = ['time']
ordering = ['-time']
@action(methods=['post'], detail=False, perms_map={'post': '*'},
serializer_class=EnvDataExportSerializer)
def export_excel(self, request, *args, **kwargs):
"""导出Excel
导出Excel
"""
return Response()
class CarWashViewSet(ListModelMixin, CustomGenericViewSet):
"""
list: 洗车记录
洗车记录
"""
perms_map = {'get': '*'}
queryset = CarWash.objects.all()
serializer_class = CarWashSerializer
select_related_fields = ['station']
filterset_fields = {
"station": ['exact'],
"start_time": ['exact', 'gte', 'lte', 'year', 'month', 'day'],
}
ordering = ['-start_time']