from django.shortcuts import render from apps.enm.models import Mpoint, Mgroup, Team, MpLog, SfLog, StLog, StSfLog from apps.utils.viewsets import CustomModelViewSet, GenericViewSet from rest_framework.mixins import ListModelMixin, UpdateModelMixin from apps.enm.serializers import MpointSerializer, TeamSerializer, MgroupSerializer, MpLogSerializer, SfLogSerializer, StLogSerializer, StSfLogSerializer from rest_framework.exceptions import ParseError from django.db import transaction from django.db.models import Q class MgroupViewSet(CustomModelViewSet): """ list:测点集 测点集 """ queryset = Mgroup.objects.all() serializer_class = MgroupSerializer select_related_fields = ['create_by', 'belong_dept'] filterset_fields = ['belong_dept'] search_fields = ['number'] class TeamViewSet(CustomModelViewSet): """ list:班组 班组 """ queryset = Team.objects.all() serializer_class = TeamSerializer select_related_fields = ['belong_dept', 'leader'] filterset_fields = ['belong_dept'] search_fields = ['name'] class MpointViewSet(CustomModelViewSet): """ list:测点 测点 """ queryset = Mpoint.objects.all() serializer_class = MpointSerializer select_related_fields = ['create_by', 'belong_dept', 'ep_monitored', 'ep_belong', 'mgroup'] filterset_fields = ['belong_dept', 'ep_monitored', 'ep_belong', 'mgroup'] search_fields = ['number', 'code'] class MpLogViewSet(ListModelMixin, GenericViewSet): """ list:测点原始记录 测点原始记录 """ queryset = MpLog.objects.all() serializer_class = MpLogSerializer select_related_fields = ['mpoint'] filterset_fields = ['mpoint'] class StLogViewSet(ListModelMixin, GenericViewSet): """ list:停机记录 停机记录 """ queryset = StLog.objects.all() serializer_class = StLogSerializer select_related_fields = ['mgroup'] filterset_fields = ['mgroup'] ordering = ['-start_time'] class SfLogViewSet(CustomModelViewSet): """ list:值班记录 值班记录 """ queryset = SfLog.objects.all() serializer_class = SfLogSerializer select_related_fields = ['mgroup', 'shift', 'team', 'leader'] filterset_fields = ['mgroup', 'shift', 'team', 'leader', 'team__belong_dept'] search_fields = ['note'] @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() class StSfLogViewSet(ListModelMixin, UpdateModelMixin, GenericViewSet): """ list:值班停机关系 值班停机关系 """ 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)