factory/apps/hrm/serializers.py

151 lines
5.1 KiB
Python
Executable File

from apps.hrm.errors import PHONE_F_WRONG
from rest_framework.serializers import ModelSerializer
from rest_framework import serializers
from apps.hrm.services import HrmService
from apps.utils.serializers import CustomModelSerializer
from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE
from apps.utils.tools import rannum
from apps.hrm.models import Certificate, ClockRecord, Employee, NotWorkRemark
from apps.system.serializers import DeptSimpleSerializer, UserSimpleSerializer
from django.db import transaction
from apps.third.clients import dhClient
from apps.third.tapis import dhapis
import re
from datetime import datetime
from django.conf import settings
class EmployeeSimpleSerializer(CustomModelSerializer):
belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True)
post_name = serializers.CharField(source='post.name', read_only=True)
class Meta:
model = Employee
fields = ['id', 'type', 'name', 'belong_dept', 'belong_dept_name', 'post', 'post_name', 'photo']
class EmployeeBaseSerializer(CustomModelSerializer):
def save(self, **kwargs):
if self.validated_data.get('user', None):
user = self.validated_data['user']
self.validated_data['name'] = user.name
self.validated_data['belong_dept'] = user.belong_dept
return super().save(**kwargs)
def phone_check(phone):
re_phone = r'^1[358]\d{9}$|^147\d{8}$|^176\d{8}$'
if not re.match(re_phone, phone):
raise serializers.ValidationError(**PHONE_F_WRONG)
return phone
class EmployeeImproveSerializer(CustomModelSerializer):
class Meta:
model = Employee
fields = ['phone', 'number', 'photo', 'id_number']
class EmployeeCreateUpdateSerializer(EmployeeBaseSerializer):
phone = serializers.CharField(label="手机号")
class Meta:
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},
}
@transaction.atomic
def create(self, validated_data):
instance = super().create(validated_data)
if instance.user: # 同步更新账户里的手机号
user = instance.user
user.phone = instance.phone
user.save()
if settings.DAHUA_ENABLED and dhClient:
dahua_data = HrmService.sync_dahua_employee(ep=instance)
third_info = instance.third_info
third_info.update(dahua_data)
instance.third_info = third_info
instance.save()
return instance
def update(self, instance, validated_data):
old_photo = instance.photo
instance = super().update(instance, validated_data)
if instance.user: # 同步更新账户里的手机号
user = instance.user
user.phone = instance.phone
user.save()
if settings.DAHUA_ENABLED and dhClient:
dahua_data = HrmService.sync_dahua_employee(ep=instance, old_photo=old_photo)
third_info = instance.third_info
third_info.update(dahua_data)
instance.third_info = third_info
instance.save()
return instance
class ChannelAuthoritySerializer(serializers.Serializer):
pks = serializers.ListField(child=serializers.CharField(max_length=20), label="员工ID列表")
channels = serializers.ListField(child=serializers.CharField(max_length=20), label="门通道ID列表")
class EmployeeSerializer(EmployeeBaseSerializer):
belong_dept_ = DeptSimpleSerializer(source='belong_dept', read_only=True)
belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True)
post_name = serializers.CharField(source='post.name', read_only=True)
blt_ = serializers.SerializerMethodField()
class Meta:
model = Employee
fields = '__all__'
read_only_fields = ['is_atwork', 'last_check_time', 'not_work_remark']
def get_blt_(self, obj):
if hasattr(obj, 'tdevice'):
from apps.third.serializers import TDeviceSimpleSerializer
return TDeviceSimpleSerializer(instance=obj.tdevice).data
return
class EmployeeNotWorkRemarkSerializer(ModelSerializer):
class Meta:
model = Employee
fields = ['not_work_remark']
class ClockRecordListSerializer(serializers.ModelSerializer):
create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
class Meta:
model = ClockRecord
fields = '__all__'
class NotWorkRemarkListSerializer(serializers.ModelSerializer):
class Meta:
model = NotWorkRemark
fields = '__all__'
class CertificateCreateUpdateSerializer(CustomModelSerializer):
class Meta:
model = Certificate
exclude = EXCLUDE_FIELDS
class CertificateSerializer(CustomModelSerializer):
employee_name = serializers.CharField(source='employee.name', read_only=True)
class Meta:
model = Certificate
fields = '__all__'