116 lines
4.2 KiB
Python
116 lines
4.2 KiB
Python
from apps.qm.models import QuaStat, TestItem, Ftest, FtestItem, Ptest
|
|
from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE
|
|
from apps.utils.serializers import CustomModelSerializer
|
|
from rest_framework import serializers
|
|
from apps.system.models import Dept, Dictionary
|
|
from apps.wpm.models import SfLog
|
|
from django.db import transaction
|
|
|
|
|
|
class TestItemSerializer(CustomModelSerializer):
|
|
class Meta:
|
|
model = TestItem
|
|
fields = '__all__'
|
|
read_only_fields = EXCLUDE_FIELDS
|
|
|
|
|
|
class QuaStatSerializer(CustomModelSerializer):
|
|
sflog = serializers.PrimaryKeyRelatedField(
|
|
label="值班记录", queryset=SfLog.objects.all(), required=True)
|
|
belong_dept_name = serializers.CharField(
|
|
source='belong_dept.name', read_only=True)
|
|
material_name = serializers.CharField(
|
|
source='material.name', read_only=True)
|
|
testitem_name = serializers.CharField(
|
|
source='testitem.name', read_only=True)
|
|
|
|
class Meta:
|
|
model = QuaStat
|
|
fields = '__all__'
|
|
read_only_fields = EXCLUDE_FIELDS + ['belong_dept']
|
|
extra_kwargs = {'val_avg': {'required': True, 'allow_null': False}, 'num_test': {
|
|
'required': True, 'allow_null': False}, 'num_ok': {'required': True, 'allow_null': False}}
|
|
|
|
def validate(self, attrs):
|
|
attrs['rate_pass'] = attrs['num_ok']/attrs['num_test']
|
|
attrs['belong_dept'] = attrs['sflog'].mgroup.belong_dept
|
|
return attrs
|
|
|
|
|
|
class QuaStatUpdateSerializer(CustomModelSerializer):
|
|
belong_dept_name = serializers.CharField(
|
|
source='belong_dept.name', read_only=True)
|
|
material_name = serializers.CharField(
|
|
source='material.name', read_only=True)
|
|
testitem_name = serializers.CharField(
|
|
source='testitem.name', read_only=True)
|
|
|
|
class Meta:
|
|
model = QuaStat
|
|
fields = '__all__'
|
|
read_only_fields = EXCLUDE_FIELDS + \
|
|
['belong_dept', 'sflog', 'material', 'testitem']
|
|
extra_kwargs = {'val_avg': {'required': True, 'allow_null': False}, 'num_test': {
|
|
'required': True, 'allow_null': False}, 'num_ok': {'required': True, 'allow_null': False}}
|
|
|
|
def validate(self, attrs):
|
|
attrs['rate_pass'] = attrs['num_ok']/attrs['num_test']
|
|
return super().validate(attrs)
|
|
|
|
|
|
class FtestItemSerializer(CustomModelSerializer):
|
|
testitem_name = serializers.CharField(
|
|
source='testitem.name', read_only=True)
|
|
testitem_description = serializers.CharField(
|
|
source='testitem.description', read_only=True)
|
|
|
|
class Meta:
|
|
model = FtestItem
|
|
fields = '__all__'
|
|
read_only_fields = EXCLUDE_FIELDS_BASE
|
|
|
|
|
|
class FtestSerializer(CustomModelSerializer):
|
|
belong_dept = serializers.PrimaryKeyRelatedField(
|
|
required=True, queryset=Dept.objects.all())
|
|
test_user_name = serializers.CharField(
|
|
source='test_user.name', read_only=True)
|
|
check_user_name = serializers.CharField(
|
|
source='check_user.name', read_only=True)
|
|
ftestitems = FtestItemSerializer(label='检验明细', many=True)
|
|
|
|
class Meta:
|
|
model = Ftest
|
|
fields = '__all__'
|
|
read_only_fields = EXCLUDE_FIELDS
|
|
|
|
def create(self, validated_data):
|
|
ftestitems = validated_data.pop('ftestitems', [])
|
|
with transaction.atomic():
|
|
instance = super().create(validated_data)
|
|
for item in ftestitems:
|
|
FtestItem.objects.create(ftest=instance, **item)
|
|
return instance
|
|
|
|
def update(self, instance, validated_data):
|
|
ftestitems = validated_data.pop('ftestitems', [])
|
|
with transaction.atomic():
|
|
instance = super().update(instance, validated_data)
|
|
for item in ftestitems:
|
|
id = item.get('id', None)
|
|
if id:
|
|
ftestitem = FtestItem.objects.get(id=id)
|
|
ftestitem.test_val = item['test_val']
|
|
ftestitem.check_val = item['check_val']
|
|
ftestitem.save()
|
|
return instance
|
|
|
|
|
|
class PtestSerializer(CustomModelSerializer):
|
|
testitem_name = serializers.CharField(
|
|
source='testitem.name', read_only=True)
|
|
|
|
class Meta:
|
|
model = Ptest
|
|
fields = '__all__'
|