from django.shortcuts import render from rest_framework.mixins import ListModelMixin, UpdateModelMixin from rest_framework.decorators import action from django.db import transaction from rest_framework.response import Response from rest_framework.exceptions import ParseError from rest_framework.mixins import DestroyModelMixin, UpdateModelMixin, ListModelMixin from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.wpm.models import SfLog, StLog, StSfLog from apps.wpm.serializers import SfLogSerializer, StLogSerializer, StSfLogSerializer from apps.wpm.filters import SfLogFilter from apps.mtm.models import Material # Create your views here. class StLogViewSet(ListModelMixin, CustomGenericViewSet): """ list:停机记录 停机记录 """ perms_map = {'get': '*'} queryset = StLog.objects.all() serializer_class = StLogSerializer select_related_fields = ['mgroup'] filterset_fields = ['mgroup'] ordering = ['-start_time'] class SfLogViewSet(UpdateModelMixin, ListModelMixin, DestroyModelMixin, CustomGenericViewSet): """ list:值班记录 值班记录 """ perms_map = {'get': '*', 'put': 'sflog.update', 'delete': 'sflog.delete'} queryset = SfLog.objects.all() serializer_class = SfLogSerializer select_related_fields = ['mgroup', 'shift', 'team', 'leader'] filterset_class = SfLogFilter search_fields = ['note'] ordering = ['-start_time'] # 此处需要进行修改 # @transaction.atomic # def perform_create(self, serializer): # ins = serializer.save() # # 查看并比对停机记录 # stls = StLog.objects.filter(mroup=ins.mgroup) # stls_ = (stls.filter(start_time__gte=ins.start_time, start_time__lt=ins.end_time)| # stls.exclude(end_time=None).filter(start_time__lte=ins.start_time, end_time__gt=ins.end_time)| # stls.exclude(end_time=None).filter(end_time__gte=ins.start_time, end_time__lt=ins.end_time)) # for i in stls_: # StSfLog.objects.get_or_create(stlog=i, sflog=ins, defaults={'stlog': i, 'sflog': ins}) # stsflog = StSfLog.objects.filter(stlog=i).order_by('-sflog__start_time').first() # if stsflog: # stsflog.is_current_down = True # stsflog.save() # # 计算能耗 # from apps.enm.tasks import cal_sflog_en_val # cal_sflog_en_val.delay(ins.id) @action(methods=['get'], detail=True, perms_map={'get': '*'}) def init_test(self, request, pk=None): """ 初始化检测录入 初始化检测录入 """ from apps.qm.models import QuaStat, TestItem from apps.qm.serializers import QuaStatSerializer obj = self.get_object() test_materials = Material.objects.filter(id__in=obj.mgroup.test_materials).order_by('sort', '-create_time') for material in test_materials: testitems = TestItem.objects.filter(id__in=material.testitems).order_by('sort', '-create_time') for testitem in testitems: params = {'material': material, 'testitem': testitem, 'sflog': obj} params_default = params.update({'create_by': request.user, 'belong_dept': obj.mgroup.belong_dept}) QuaStat.objects.get_or_create(**params, defaults=params_default) qs = QuaStat.objects.filter(sflog=obj).order_by('material__sort', 'material__create_time', 'testitem__sort', 'testitem__create_time') sr = QuaStatSerializer(instance=qs, many=True) return Response(sr.data) class StSfLogViewSet(ListModelMixin, UpdateModelMixin, CustomGenericViewSet): """ list:值班停机关系 值班停机关系 """ perms_map = {'get': '*', 'put': 'sflog.update'} queryset = StSfLog.objects.all() serializer_class = StSfLogSerializer select_related_fields = ['stlog', 'sflog'] filterset_fields = ['stlog', 'sflog'] search_fields = ['reason'] def filter_queryset(self, queryset): params = self.request.query_params if 'stlog' not in params or 'sflog' not in params: raise ParseError('请指定所属停机或值班记录') return super().filter_queryset(queryset)