192 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Python
		
	
	
	
| from apps.hrm.models import Certificate, Employee
 | |
| from apps.hrm.serializers import phone_check
 | |
| from apps.rpm.models import Rcertificate, Remployee, Rfile, Rparty, Rpjcertificate, Rpjfile, 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, type='rparty')
 | |
|         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(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):
 | |
|     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', '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},
 | |
|         # }
 | |
| 
 | |
| 
 | |
| 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, 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')
 | |
|         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, 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():
 | |
|             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__'
 | |
| 
 | |
| 
 | |
| class RpjfileSerializer(CustomModelSerializer):
 | |
|     class Meta:
 | |
|         model = Rpjfile
 | |
|         fields = '__all__'
 | |
| 
 | |
| 
 | |
| class RpjfileUpdateSerializer(CustomModelSerializer):
 | |
|     class Meta:
 | |
|         model = Rpjfile
 | |
|         fields = ['files']
 |