factory/apps/rpm/serializers.py

176 lines
6.1 KiB
Python

from apps.hrm.models import Certificate, Employee
from apps.hrm.serializers import phone_check
from apps.rpm.models import Rcertificate, Remployee, Rparty, Rpjcertificate, Rpjmember, Rpj
from apps.system.models import Dept
from apps.utils.constants import EXCLUDE_FIELDS
from apps.utils.serializers import CustomModelSerializer
from apps.system.serializers import DictSerializer, FileSerializer
from rest_framework import serializers
from rest_framework.exceptions import ParseError
from django.db import transaction
class RpartyCreateUpdateSerializer(CustomModelSerializer):
class Meta:
model = Rparty
fields = ['name', 'number', 'lawer', 'contacter', 'phone', 'email',
'description', 'belong_dept']
extra_kwargs = {
'belong_dept': {'required': True}
}
def create(self, validated_data):
instance = super().create(validated_data)
dept = Dept.objects.create(name=instance.name,
parent=instance.belong_dept)
instance.dept = dept
instance.save()
return instance
def update(self, instance, validated_data):
instance = super().update(instance, validated_data)
dept = instance.dept
dept.name = instance.name
dept.parent = instance.belong_dept
dept.save()
return instance
class RpartySerializer(CustomModelSerializer):
class Meta:
model = Rparty
fields = '__all__'
class RpartySimpleSerializer(CustomModelSerializer):
class Meta:
model = Rparty
fields = ['id', 'name']
class RpartyAssignSerializer(serializers.Serializer):
username = serializers.CharField('用户名')
class RpartyFileListSerializer(CustomModelSerializer):
rparty_ = RpartySimpleSerializer(source='rparty', read_only=True)
file_cate_ = DictSerializer(source='file_cate', read_only=True)
files_ = FileSerializer(source='files', many=True, read_only=True)
class RpjCreateUpdateSerializer(CustomModelSerializer):
class Meta:
model = Rpj
fields = ['name', 'contract_number', 'type', 'come_time', 'leave_time', 'belong_dept', 'rparty']
class RpjListSerializer(CustomModelSerializer):
class Meta:
model = Rpj
fields = '__all__'
class RemployeeCreateSerializer(CustomModelSerializer):
phone = serializers.CharField(label="手机号", validators=[phone_check])
rparty = serializers.PrimaryKeyRelatedField(queryset=Rparty.objects.all(), label='相关方ID', required=False)
class Meta:
model = Remployee
fields = ['name', 'phone', 'photo', 'id_number']
# model = Employee
# exclude = EXCLUDE_FIELDS + ['is_atwork', 'last_check_time',
# 'not_work_remark', 'third_info', 'type']
# extra_kwargs = {
# 'phone': {'required': True},
# 'number': {'required': True},
# 'photo': {'required': True},
# 'id_number': {'required': True},
# }
class RemployeeSerializer(CustomModelSerializer):
class Meta:
model = Remployee
fields = '__all__'
class RcertificateCreateUpdateSerializer(CustomModelSerializer):
class Meta:
model = Rcertificate
exclude = EXCLUDE_FIELDS + ['certificate']
class RcertificateSerializer(CustomModelSerializer):
class Meta:
model = Rcertificate
fields = '__all__'
class RpjmemberCreatesSerializer(CustomModelSerializer):
employees = serializers.PrimaryKeyRelatedField(
queryset=Employee.objects.filter(type='remployee'),
many=True, label='员工ID列表'
)
class Meta:
model = Rpjmember
fields = ['employees', 'Rpj']
class RpjmemberCreateSerializer(CustomModelSerializer):
rcertificates = serializers.PrimaryKeyRelatedField(label='证书ID', many=True)
class Meta:
model = Rpjmember
fields = ['employee', 'rpj', 'duty', 'is_manager']
def create(self, validated_data):
rpj = validated_data['rpj']
if rpj.state != Rpj.RPJ_CREATE:
raise ParseError('成员非创建状态不可新增')
rcertificates = validated_data.pop('rcertificates')
if Rpjmember.objects.filter(remployee=validated_data['remployee'], rpj=validated_data['rpj']).exists():
raise ParseError('该成员已选择')
with transaction.atomic():
ins = super().create(validated_data)
for x in rcertificates:
rpjc, _ = Rpjcertificate.objects.get_or_create(rpj_member=ins, rcertificate=x,
defaults={'rpj_member': ins, 'rcertificate': x})
for f in Rcertificate._meta.fields:
if f.name not in ['id']:
setattr(rpjc, f.name, getattr(x, f.name, None))
rpjc.save()
if ins.is_manager:
Rpjmember.objects.exclude(id__in=ins.id).update(is_manager=False)
return ins
class RpjmemberUpdateSerializer(CustomModelSerializer):
rcertificates = serializers.PrimaryKeyRelatedField(label='证书ID', many=True)
class Meta:
model = Rpjmember
fields = ['duty', 'is_manager', 'rcertificates']
def update(self, instance, validated_data):
rpj = validated_data['rpj']
if rpj.state != Rpj.RPJ_CREATE:
raise ParseError('成员非创建状态不可修改')
rcertificates = validated_data.pop('rcertificates')
with transaction.atomic():
instance = super().update(instance, validated_data)
for x in rcertificates:
rpjc, _ = Rpjcertificate.objects.get_or_create(rpj_member=instance, rcertificate=x,
defaults={'rpj_member': instance, 'rcertificate': x})
for f in Rcertificate._meta.fields:
if f.name not in ['id']:
setattr(rpjc, f.name, getattr(x, f.name, None))
rpjc.save()
return instance
class RpjmemberSerializer(CustomModelSerializer):
class Meta:
model = Rpjmember
fields = '__all__'