287 lines
10 KiB
Python
287 lines
10 KiB
Python
|
|
from apps.hrm.models import Employee
|
|
from apps.rpm.models import Rcertificate, Remployee, Rfile, Rparty, Rpjcertificate, Rpjfile, Rpjmember, Rpj
|
|
from apps.system.models import Dept
|
|
from apps.system.services import sync_dahua_dept
|
|
from apps.utils.constants import EXCLUDE_FIELDS
|
|
from apps.utils.fields import MyFilePathField
|
|
from apps.utils.serializers import CustomModelSerializer
|
|
from apps.system.serializers import DictSerializer, DictSimpleSerializer, FileSerializer
|
|
from rest_framework import serializers
|
|
from rest_framework.exceptions import ParseError
|
|
from django.db import transaction
|
|
from apps.third.clients import dhClient
|
|
from apps.third.tapis import dhapis
|
|
from apps.wf.serializers import TicketSimpleSerializer
|
|
|
|
|
|
class RpartyCreateUpdateSerializer(CustomModelSerializer):
|
|
class Meta:
|
|
model = Rparty
|
|
fields = ['name', 'number', 'lawer', 'contacter', 'phone', 'email',
|
|
'description', 'belong_dept', 'address']
|
|
extra_kwargs = {
|
|
'belong_dept': {'required': True}
|
|
}
|
|
|
|
def create(self, validated_data):
|
|
instance = super().create(validated_data)
|
|
with transaction.atomic():
|
|
dept = Dept.objects.create(name=instance.name,
|
|
parent=instance.belong_dept, type='rparty')
|
|
sync_dahua_dept(dept)
|
|
instance.dept = dept
|
|
instance.save()
|
|
return instance
|
|
|
|
def update(self, instance, validated_data):
|
|
instance = super().update(instance, validated_data)
|
|
with transaction.atomic():
|
|
dept = instance.dept
|
|
dept.name = instance.name
|
|
dept.parent = instance.belong_dept # 重新规划归属部门
|
|
dept.save()
|
|
sync_dahua_dept(dept)
|
|
return instance
|
|
|
|
|
|
class RpartySerializer(CustomModelSerializer):
|
|
admin_username = serializers.CharField(source='admin.username', read_only=True)
|
|
belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True)
|
|
|
|
class Meta:
|
|
model = Rparty
|
|
fields = '__all__'
|
|
|
|
|
|
class RpartySimpleSerializer(CustomModelSerializer):
|
|
class Meta:
|
|
model = Rparty
|
|
fields = ['id', 'name']
|
|
|
|
|
|
class RpartyAssignSerializer(serializers.Serializer):
|
|
name = serializers.CharField(label="姓名")
|
|
phone = serializers.CharField(label="手机号")
|
|
username = serializers.CharField(label="账号")
|
|
|
|
|
|
class RfileListSerializer(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 Meta:
|
|
model = Rfile
|
|
fields = '__all__'
|
|
|
|
|
|
class RpjCreateUpdateSerializer(CustomModelSerializer):
|
|
rparty = serializers.PrimaryKeyRelatedField(queryset=Rparty.objects.all(), required=False)
|
|
belong_dept = serializers.PrimaryKeyRelatedField(queryset=Dept.objects.all(), required=False)
|
|
|
|
class Meta:
|
|
model = Rpj
|
|
fields = ['id', 'name', 'contract_number', 'type', 'come_time', 'leave_time', 'belong_dept', 'rparty']
|
|
|
|
|
|
class RpjListSerializer(CustomModelSerializer):
|
|
rparty_name = serializers.CharField(source='rparty.name', read_only=True)
|
|
belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True)
|
|
create_by_name = serializers.CharField(source='create_by.name', read_only=True)
|
|
ticket_ = TicketSimpleSerializer(source='ticket', read_only=True)
|
|
|
|
class Meta:
|
|
model = Rpj
|
|
fields = '__all__'
|
|
|
|
|
|
# class RemployeeCreateSerializer(CustomModelSerializer):
|
|
# phone = serializers.CharField(label="手机号", validators=[])
|
|
# rparty = serializers.PrimaryKeyRelatedField(queryset=Rparty.objects.all(), label='相关方ID', required=False)
|
|
|
|
# class Meta:
|
|
# model = Remployee
|
|
# fields = ['name', 'phone', 'photo', 'id_number', 'rparty']
|
|
# # 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},
|
|
# # }
|
|
|
|
# def create(self, validated_data):
|
|
# with transaction.atomic():
|
|
# # 校验上传的证件照
|
|
# dhClient.request(**dhapis['person_img_upload'], file_path_rela=validated_data['photo'])
|
|
# return super().create(validated_data)
|
|
|
|
class RemployeeCreateSerializer(CustomModelSerializer):
|
|
rparty = serializers.PrimaryKeyRelatedField(queryset=Rparty.objects.all(), label='相关方ID', required=False)
|
|
|
|
class Meta:
|
|
model = Remployee
|
|
fields = ['name', 'phone', 'photo', 'id_number', 'rparty']
|
|
|
|
def create(self, validated_data):
|
|
with transaction.atomic():
|
|
dhClient.request(**dhapis['person_img_upload'], file_path_rela=validated_data['photo'])
|
|
return super().create(validated_data)
|
|
|
|
|
|
class RemployeeUpdateSerializer(CustomModelSerializer):
|
|
class Meta:
|
|
model = Remployee
|
|
fields = ['phone', 'photo']
|
|
|
|
def update(self, instance, validated_data):
|
|
with transaction.atomic():
|
|
dhClient.request(**dhapis['person_img_upload'], file_path_rela=validated_data['photo'])
|
|
return super().update(instance, validated_data)
|
|
|
|
|
|
class RemployeeSerializer(CustomModelSerializer):
|
|
rparty_name = serializers.CharField(source='rparty.name', read_only=True)
|
|
photo_f = MyFilePathField(source='photo', read_only=True)
|
|
|
|
class Meta:
|
|
model = Remployee
|
|
fields = '__all__'
|
|
|
|
|
|
class RcertificateCreateUpdateSerializer(CustomModelSerializer):
|
|
class Meta:
|
|
model = Rcertificate
|
|
exclude = EXCLUDE_FIELDS + ['certificate']
|
|
|
|
|
|
class RcertificateSerializer(CustomModelSerializer):
|
|
remployee_name = serializers.CharField(source='remployee.name', read_only=True)
|
|
rparty_name = serializers.CharField(source='rparty.name', read_only=True)
|
|
file_f = MyFilePathField(source='file', read_only=True)
|
|
|
|
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, queryset=Rcertificate.objects.all())
|
|
|
|
class Meta:
|
|
model = Rpjmember
|
|
fields = ['remployee', 'rpj', 'duty', 'is_manager', 'rcertificates']
|
|
|
|
def create(self, validated_data):
|
|
rpj = validated_data['rpj']
|
|
if rpj.state != Rpj.RPJ_CREATE:
|
|
raise ParseError('成员非创建状态不可新增')
|
|
rcertificates = validated_data.pop('rcertificates')
|
|
remployee = validated_data['remployee']
|
|
if remployee.phone and remployee.photo and remployee.id_number:
|
|
pass
|
|
else:
|
|
raise ParseError('该成员信息不全请补充')
|
|
if Rpjmember.objects.filter(remployee=remployee, rpj=validated_data['rpj']).exists():
|
|
raise ParseError('该成员已选择')
|
|
with transaction.atomic():
|
|
ins = super().create(validated_data)
|
|
for x in rcertificates:
|
|
rpjc = Rpjcertificate.objects.filter(rpj_member=ins, rcertificate=x).first()
|
|
if rpjc:
|
|
pass
|
|
else:
|
|
rpjc = Rpjcertificate()
|
|
rpjc.rpj_member = ins
|
|
rpjc.rcertificate = x
|
|
# for i in ['name', 'number', 'type', 'issue_date', 'expiration_date', 'review_date', 'file']:
|
|
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=ins.id).update(is_manager=False)
|
|
return ins
|
|
|
|
|
|
class RpjmemberUpdateSerializer(CustomModelSerializer):
|
|
rcertificates = serializers.PrimaryKeyRelatedField(label='证书ID', many=True, queryset=Rcertificate.objects.all())
|
|
|
|
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():
|
|
ins = super().update(instance, validated_data)
|
|
for x in rcertificates:
|
|
rpjc = Rpjcertificate.objects.filter(rpj_member=ins, rcertificate=x).first()
|
|
if rpjc:
|
|
pass
|
|
else:
|
|
rpjc = Rpjcertificate()
|
|
rpjc.rpj_member = ins
|
|
rpjc.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=ins.id).update(is_manager=False)
|
|
return ins
|
|
|
|
|
|
class RpjcertificateSerializer(CustomModelSerializer):
|
|
file_f = MyFilePathField(source='file', read_only=True)
|
|
|
|
class Meta:
|
|
model = Rpjcertificate
|
|
fields = ['rcertificate', 'name', 'type', 'number', 'issue_date',
|
|
'expiration_date', 'review_date', 'file', 'file_f']
|
|
|
|
|
|
class RpjmemberSerializer(CustomModelSerializer):
|
|
remployee_ = RemployeeSerializer(source='remployee', read_only=True)
|
|
rcertificates_ = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Rpjmember
|
|
fields = '__all__'
|
|
|
|
def get_rcertificates_(self, obj):
|
|
cs = Rpjcertificate.objects.filter(rpj_member=obj)
|
|
return RpjcertificateSerializer(instance=cs, many=True).data
|
|
|
|
|
|
class RpjfileSerializer(CustomModelSerializer):
|
|
file_cate_ = DictSimpleSerializer(source='file_cate', read_only=True)
|
|
files_ = FileSerializer(source='files', read_only=True, many=True)
|
|
|
|
class Meta:
|
|
model = Rpjfile
|
|
fields = '__all__'
|
|
|
|
|
|
class RpjfileUpdateSerializer(CustomModelSerializer):
|
|
class Meta:
|
|
model = Rpjfile
|
|
fields = ['files']
|