factory/apps/opm/serializers.py

158 lines
5.2 KiB
Python

from apps.hrm.models import Certificate
from apps.opm.models import GasCheck, Operation, Opl, OplCate, OplCert, OplWorker
from apps.system.serializers import DictSerializer, DictSimpleSerializer
from apps.utils.serializers import CustomModelSerializer
from apps.utils.constants import EXCLUDE_FIELDS
from rest_framework import serializers
from django.db import transaction
from rest_framework.exceptions import ParseError
class OplCateCreateUpdateSerializer(CustomModelSerializer):
class Meta:
model = OplCate
exclude = EXCLUDE_FIELDS
class OplCateSerializer(CustomModelSerializer):
class Meta:
model = OplCate
fields = '__all__'
class OplCateDetailSerializer(CustomModelSerializer):
measure_options_ = DictSimpleSerializer(source='measure_options', read_only=True, many=True)
risk_options_ = DictSimpleSerializer(source='risk_options', read_only=True, many=True)
close_options_ = DictSimpleSerializer(source='close_options', read_only=True, many=True)
class Meta:
model = OplCate
fields = '__all__'
class OperationCreateUpdateSerializer(CustomModelSerializer):
class Meta:
model = Operation
exclude = EXCLUDE_FIELDS + ['number']
class OperationSerializer(CustomModelSerializer):
class Meta:
model = Operation
fields = "__all__"
class OplWorkerCreateSerializer(CustomModelSerializer):
certificates = serializers.PrimaryKeyRelatedField(label='证书ID', many=True, queryset=Certificate.objects.all())
class Meta:
model = OplWorker
fields = ['worker', 'duty', 'certificates', 'opl']
def create(self, validated_data):
opl = validated_data['opl']
if opl.ticket:
raise ParseError('许可证已处理不可新增')
certificates = validated_data.pop('certificates')
if OplWorker.objects.filter(worker=validated_data['worker'], opl=validated_data['opl']).exists():
raise ParseError('该成员已加入')
with transaction.atomic():
oplw = super().create(validated_data)
for x in certificates:
oplc = OplCert.objects.filter(opl_worker=oplw, certificate=x).first()
if oplc:
pass
else:
oplc = OplCert()
oplc.opl_worker = oplw
oplc.certificate = x
for f in Certificate._meta.fields:
if f.name not in ['id']:
setattr(oplc, f.name, getattr(x, f.name, None))
oplc.save()
return oplw
class OplWorkerUpdateSerializer(CustomModelSerializer):
certificates = serializers.PrimaryKeyRelatedField(label='证书ID', many=True, queryset=Certificate.objects.all())
class Meta:
model = OplWorker
fields = ['duty', 'certificates']
def update(self, instance, validated_data):
certificates = validated_data.pop('certificates')
with transaction.atomic():
oplw = super().update(instance, validated_data)
for x in certificates:
oplc = OplCert.objects.filter(opl_worker=oplw, certificate=x).first()
if oplc:
pass
else:
oplc = OplCert()
oplc.opl_worker = oplw
oplc.certificate = x
for f in Certificate._meta.fields:
if f.name not in ['id']:
setattr(oplc, f.name, getattr(x, f.name, None))
oplc.save()
return oplw
class OplWorkerSerializer():
class Meta:
model = OplWorker
fields = '__all__'
class GasCheckCreateUpdateSerializer(CustomModelSerializer):
class Meta:
model = GasCheck
exclude = EXCLUDE_FIELDS
def create(self, validated_data):
opl = validated_data['opl']
if opl.ticket:
raise ParseError('许可证已处理不可新增')
return super().create(validated_data)
class GasCheckSerializer(CustomModelSerializer):
class Meta:
model = GasCheck
fields = '__all__'
class OplCreateUpdateSerializer(CustomModelSerializer):
id = serializers.CharField(read_only=True)
class Meta:
model = Opl
fields = ['id', 'operation', 'level', 'cate', 'start_time', 'end_time',
'dept_do', 'charger', 'monitor', 'work_time', 'work_type',
'accept_time', 'power', 'power_to', 'power_from',
'power_end_time', 'power_start_time', 'power_days',
'other_risk', 'other_emr', 'escape_route',
'risks_checked', 'measures_checked', 'create_imgs']
def create(self, validated_data):
operation = validated_data['operation']
if operation.state == Operation.OP_CLOSE:
raise ParseError('作业已关闭不可创建许可')
return super().create(validated_data)
class OplSerializer(CustomModelSerializer):
cate_name = serializers.CharField(source='cate.name', read_only=True)
class Meta:
model = Opl
fields = '__all__'
class OplCloseSerializer(CustomModelSerializer):
class Meta:
model = Opl
fields = ['close_imgs', 'close_note', 'close_dos', 'close_desc']