from rest_framework import exceptions, serializers from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin from apps.mtm.models import RecordFormField from apps.qm.export import exprot_test_record from apps.qm.serializers import StandardCreateUpdateSerializer, StandardSerializer, TestItemCreateUpdateSerializer, TestItemSerializer, TestRecordCreateSerializer, TestRecordDetailSerializer, TestRecordListSerializer, TestRecordUpdateSerializer from apps.qm.models import Standard, TestItem, TestRecord, TestRecordItem from django.shortcuts import render from rest_framework.viewsets import GenericViewSet, ModelViewSet from apps.system.mixins import CreateUpdateModelAMixin from rest_framework.exceptions import APIException from rest_framework.response import Response from rest_framework import status from django.db import transaction from rest_framework.decorators import action from apps.wpm.models import WProduct from apps.wpm.services import WpmService from rest_framework.exceptions import ParseError # Create your views here. class StandardViewSet(CreateUpdateModelAMixin, ModelViewSet): """ 标准规范-增删改查 """ perms_map = {'*': '*'} queryset = Standard.objects.select_related('file').all() serializer_class = StandardSerializer search_fields = ['name', 'number'] filterset_fields = [] ordering_fields = ['number'] ordering = ['id'] def get_serializer_class(self): if self.action in ['create', 'update']: return StandardCreateUpdateSerializer return StandardSerializer class TestItemViewSet(CreateUpdateModelAMixin, ModelViewSet): """ 检验项目增删改查 """ perms_map = {'*': '*'} queryset = TestItem.objects.select_related('standard').all() serializer_class = TestItemSerializer search_fields = ['name', 'standard__name', 'standard__number'] filterset_fields = ['standard'] ordering_fields = ['id'] ordering = ['id'] def get_serializer_class(self): if self.action in ['create', 'update']: return TestItemCreateUpdateSerializer return TestItemSerializer class TestRecordViewSet(ListModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet): """ 检验记录 """ perms_map = {'get': '*', 'put':'testrecord_update', 'delete':'testrecord_delete'} queryset = TestRecord.objects.select_related('fifo_item', 'form').prefetch_related('item_test_record').all() serializer_class = TestRecordListSerializer filterset_fields = ['wproduct', 'material', 'step', 'subproduction_plan', 'fifo_item', 'origin_test', 'type'] ordering = ['-id'] def get_serializer_class(self): if self.action == 'list': return TestRecordListSerializer elif self.action == 'retrieve': return TestRecordDetailSerializer elif self.action == 'update': return TestRecordUpdateSerializer return super().get_serializer_class() def update(self, request, *args, **kwargs): obj = self.get_object() if obj.is_submited and obj.is_midtesting is False: raise exceptions.APIException('该记录已提交不可编辑') return super().update(request, *args, **kwargs) def destroy(self, request, *args, **kwargs): obj = self.get_object() if obj.is_submited: raise exceptions.APIException('该记录已提交不可删除') WpmService.add_wproduct_flow_log(obj.wproduct, 'test_delete') return super().destroy(request, *args, **kwargs) @action(methods=['post'], detail=True, perms_map={'post':'testrecord_submit'}, serializer_class=serializers.Serializer) def submit(self, request, pk=None): obj = self.get_object() if obj.is_submited and obj.is_midtesting is False: raise exceptions.APIException('该记录已提交') # 校验是否有未填项目 if obj.type != TestRecord.TEST_PROCESS_RE and obj.is_midtesting is False: items_not = TestRecordItem.objects.filter(field_value__isnull=True, is_hidden=False, test_record=obj) if items_not.exists(): raise exceptions.APIException('存在未填写项目:'+ ','.join(list(items_not.values_list('form_field__field_name', flat=True)))) with transaction.atomic(): obj.is_submited=True obj.update_by = request.user obj.save() if obj.wproduct: WpmService.update_wproduct_by_test(obj, request.user) # 这里已经做了日志记录和进度计算 return Response() @action(methods=['get'], detail=True, perms_map={'get':'*'}, serializer_class=serializers.Serializer) def export(self, request, pk=None): """ 按模板导出 """ instance = self.get_object() # tm = instance.form.export_template tm = '/media/default/tmp.docx' if tm: path = exprot_test_record(tr=instance, tm=tm) return Response({'path':path}) raise ParseError('未配置导出模板') # def create(self, request, *args, **kwargs): # serializer = self.get_serializer(data=request.data) # serializer.is_valid(raise_exception=True) # vdata = serializer.validated_data # record_data = vdata.pop('record_data') # if 'is_testok' not in vdata: # raise APIException('未填写检验结论') # with transaction.atomic(): # obj = serializer.save(create_by = self.request.user) # tris = [] # for m in record_data: # 保存记录详情 # form_field = m['form_field'] # m['field_name'] = form_field.field_name # m['field_key'] = form_field.field_key # m['field_type'] = form_field.field_type # m['field_value'] = m['field_value'] # m['sort'] = form_field.sort # m['need_judge'] = form_field.need_judge # m['is_testok'] = m['is_testok'] if 'is_testok' in m else True # m['test_record'] = obj # tris.append(TestRecordItem(**m)) # TestRecordItem.objects.bulk_create(tris) # # 如果检验合格 # if obj.fifo_item: # obj.fifo_item.is_testok = True if obj.is_testok else False # obj.fifo_item.is_tested = True # obj.fifo_item.save() # return Response(status=status.HTTP_201_CREATED)