from numpy import True_ 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, DictSimpleSerializer, 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', 'address'] 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): 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): 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): rparty_name = serializers.CharField(source='rparty.name', read_only=True) belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True) 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): remployee_name = serializers.CharField(source='remployee.name', read_only=True) rparty_name = serializers.CharField(source='rparty.name', 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') 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.filter(rpj_member=ins, rcertificate=x).first() if rpjc: pass else: rpjc = Rpjcertificate() rpjc.rpj_member = ins rpjc.rcertificate = x for f in Rpjcertificate._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(): 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 Rpjcertificate._meta.fields: if f.name not in ['id']: setattr(rpjc, f.name, getattr(x, f.name, None)) rpjc.save() return ins 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 cs.values('certificate', 'name', 'type', 'number', 'issue_date', 'expiration_date', 'review_date', 'file') 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']