# coding=utf-8 import json from rest_framework import serializers from apps.tenant.employee.models import Employee from utils.exceptions import CustomError from apps.account.models import User class EmployeeSerializer(serializers.ModelSerializer): gender_text = serializers.CharField(source='get_gender_display', read_only=True) status_text = serializers.CharField(source='get_status_display', read_only=True) create_time = serializers.DateTimeField(source='user.date_joined', read_only=True) username = serializers.CharField(source='user.username', read_only=True) position_text = serializers.CharField(source='position.name', read_only=True) area_text = serializers.SerializerMethodField() department_text = serializers.CharField(source='department.name', read_only=True) area = serializers.SerializerMethodField() group_ids = serializers.PrimaryKeyRelatedField(source='user.groups', many=True, read_only=True) groups = serializers.SerializerMethodField() forbid_baoxiu_text = serializers.SerializerMethodField() type_text = serializers.CharField(source='get_type_display', read_only=True) def get_area_text(self, obj): if obj.department: return obj.department.area.name return '' def get_area(self, obj): if obj.department: return obj.department.area.id return '' def get_forbid_baoxiu_text(self, obj): if obj.forbid_baoxiu: return u'是' return u'否' def get_groups(self, obj): return ','.join(obj.user.groups.values_list('display_name', flat=True)) class Meta: model = Employee fields = '__all__' def create(self, validated_data): username = self.initial_data['tel'] # 判断用户是否已经注册登陆过 password = None if self.initial_data['password']: password = self.initial_data['password'] user = User.objects.filter(username=username).first() if not user: # 创建user实例 is_active = 1 if self.initial_data['status'] != '4' else 0 user = User.objects.create_tenant(username, password, is_active=is_active) validated_data['user'] = user validated_data['create_user'] = self.context['request'].user validated_data['tenant'] = self.context['request'].user.employee.tenant validated_data['type'] = Employee.EMPLOYEE try: instance = super(EmployeeSerializer, self).create(validated_data) except Exception as e: if e.args[0] == 1062: raise CustomError(u'该手机号已被游客或者其他员工使用,请检查!') groups = self.context['request'].data.get('groups', None) if groups: groups = json.loads(groups) else: groups = [] for group in groups: instance.user.groups.add(group) return instance def update(self, instance, validated_data): instance.user.groups.clear() groups = self.context['request'].data.get('groups', None) if groups: groups = json.loads(groups) else: groups = [] for group in groups: instance.user.groups.add(group) if instance.tenant != self.context['request'].user.employee.tenant: raise CustomError(u'禁止跨租户操作!') username = self.initial_data['tel'] if username and self.initial_data['password'].strip() != '': if instance.user: user = { 'username': username, 'password': self.initial_data['password'], 'is_active': 1 if self.initial_data['status'] != '4' else 0, 'type':2, } instance.user.update_item(user) else: is_active = 1 if self.initial_data['status'] != '4' else 0 user = User.objects.create_tenant(username, self.initial_data['password'], is_active=is_active) validated_data['user'] = user instance = super(EmployeeSerializer, self).update(instance, validated_data) return instance