import json import re from django_celery_beat.models import PeriodicTask, CrontabSchedule, IntervalSchedule from rest_framework import serializers from django_celery_results.models import TaskResult from apps.system.errors import ROLE_CODE_EXIST, ROLE_NAME_EXIST, USERNAME_EXIST from apps.utils.serializers import CustomModelSerializer from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE from .models import (Dictionary, DictType, File, Dept, Permission, Post, Role, User, UserPost) from rest_framework.exceptions import ParseError, APIException from django.db import transaction from apps.third.tapis import dhapis from rest_framework.validators import UniqueValidator from django.contrib.auth.hashers import make_password class IntervalSerializer(CustomModelSerializer): class Meta: model = IntervalSchedule fields = '__all__' class CrontabSerializer(CustomModelSerializer): class Meta: model = CrontabSchedule exclude = ['timezone'] class PTaskCreateUpdateSerializer(CustomModelSerializer): class Meta: model = PeriodicTask fields = ['name', 'task', 'interval', 'crontab', 'args', 'kwargs'] class PTaskSerializer(CustomModelSerializer): interval_ = IntervalSerializer(source='interval', read_only=True) crontab_ = CrontabSerializer(source='crontab', read_only=True) schedule = serializers.SerializerMethodField() timetype = serializers.SerializerMethodField() class Meta: model = PeriodicTask fields = '__all__' def get_schedule(self, obj): if obj.interval: return obj.interval.__str__() elif obj.crontab: return obj.crontab.__str__() return '' def get_timetype(self, obj): if obj.interval: return 'interval' elif obj.crontab: return 'crontab' return 'interval' class FileSerializer(CustomModelSerializer): class Meta: model = File fields = "__all__" class DictTypeSerializer(CustomModelSerializer): """ 数据字典类型序列化 """ class Meta: model = DictType fields = '__all__' class DictTypeCreateUpdateSerializer(CustomModelSerializer): class Meta: model = DictType fields = ['name', 'code', 'parent'] class DictSerializer(CustomModelSerializer): """ 数据字典序列化 """ class Meta: model = Dictionary fields = '__all__' class DictCreateUpdateSerializer(CustomModelSerializer): """ 数据字典序列化 """ class Meta: model = Dictionary exclude = EXCLUDE_FIELDS class PostSerializer(CustomModelSerializer): """ 岗位序列化 """ class Meta: model = Post fields = '__all__' class PostCreateUpdateSerializer(CustomModelSerializer): """ 岗位序列化 """ class Meta: model = Post exclude = EXCLUDE_FIELDS class PostSimpleSerializer(CustomModelSerializer): class Meta: model = Post fields = ['id', 'name', 'code'] class RoleSerializer(CustomModelSerializer): """ 角色序列化 """ class Meta: model = Role fields = '__all__' class RoleSimpleSerializer(CustomModelSerializer): class Meta: model = Role fields = ['id', 'name', 'code'] class RoleCreateUpdateSerializer(CustomModelSerializer): """ 角色序列化 """ name = serializers.CharField(label="名称", validators=[ UniqueValidator(queryset=Role.objects.all(), message='已存在相同名称的角色')]) code = serializers.CharField(label="标识", validators=[ UniqueValidator(queryset=Role.objects.all(), message='已存在相同标识的角色')]) class Meta: model = Role exclude = EXCLUDE_FIELDS class PermissionSerializer(serializers.ModelSerializer): """ 权限序列化 """ class Meta: model = Permission fields = '__all__' class PermissionCreateUpdateSerializer(serializers.ModelSerializer): """ 权限序列化 """ class Meta: model = Permission exclude = EXCLUDE_FIELDS_BASE class DeptSimpleSerializer(CustomModelSerializer): class Meta: model = Dept fields = ['id', 'name', 'type'] class DeptSerializer(CustomModelSerializer): """ 组织架构序列化 """ type = serializers.ChoiceField( choices=Dept.dept_type_choices, default='部门') class Meta: model = Dept fields = '__all__' class DeptCreateUpdateSerializer(CustomModelSerializer): """ 部门序列化 """ parent = serializers.PrimaryKeyRelatedField(queryset = Dept.objects.all(), required=True) class Meta: model = Dept exclude = EXCLUDE_FIELDS + ['third_info'] @transaction.atomic def create(self, validated_data): from apps.third.clients import dhClient if dhClient: data = { "parentId":1, "name":validated_data['name'], "service":"ehs" } _, res = dhClient.request(**dhapis['dept_create'],json=data) third_info = {'dh_id':str(res['id'])} validated_data['third_info'] = third_info return super().create(validated_data) @transaction.atomic def update(self, instance, validated_data): from apps.third.clients import dhClient third_info = instance.third_info if dhClient and not third_info.get('dh_id', False): # 如果dh_id 不存在 data = { "parentId":1, "name":validated_data['name'], "service":"ehs" } _, res = dhClient.request(**dhapis['dept_create'],json=data) third_info['dh_id'] = res['id'] instance.third_info = third_info instance.save() elif instance.name != validated_data.get('name', ''): if dhClient and instance.third_info.get('dh_id', False): data = { "id":instance.third_info['dh_id'], "parentId":1, "name":validated_data['name'] } dhClient.request(**dhapis['dept_update'],json=data) return super().update(instance, validated_data) class UserSimpleSerializer(CustomModelSerializer): class Meta: model = User fields = ['id', 'username', 'name'] class UserListSerializer(CustomModelSerializer): """ 用户列表序列化 """ belong_dept_ = DeptSimpleSerializer(source='belong_dept', read_only=True) posts_ = PostSimpleSerializer(source='posts', many=True) class Meta: model = User exclude = ['password'] # def phone_check(phone): # re_phone = '^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 # def phone_exist(phone): # if User.objects.filter(phone=phone).exists(): # raise serializers.ValidationError(**PHONE_EXIST) def user_exist(username): if User.objects.filter(username=username).exists(): raise serializers.ValidationError(**USERNAME_EXIST) return username class UserUpdateSerializer(CustomModelSerializer): """ 用户编辑序列化 """ class Meta: model = User fields = ['username', 'name', 'avatar', 'is_active'] def update(self, instance, validated_data): if User.objects.filter(username=validated_data['username'] ).exclude(id=instance.id).exists(): raise ParseError(**USERNAME_EXIST) return super().update(instance, validated_data) class UserCreateSerializer(CustomModelSerializer): """ 创建用户序列化 """ username = serializers.CharField(required=True, validators=[user_exist]) class Meta: model = User fields = ['username', 'name', 'avatar', 'is_active'] class PasswordChangeSerializer(serializers.Serializer): old_password = serializers.CharField(label="原密码") new_password1 = serializers.CharField(label="新密码1") new_password2 = serializers.CharField(label="新密码2") class PTaskResultSerializer(CustomModelSerializer): class Meta: model = TaskResult fields = '__all__' class UserPostSerializer(CustomModelSerializer): """ 用户-岗位序列化 """ user_ = UserSimpleSerializer(source='user', read_only=True) post_ = PostSimpleSerializer(source='post', read_only=True) dept_ = DeptSimpleSerializer(source='dept', read_only=True) class Meta: model = UserPost fields = '__all__' class UserPostCreateSerializer(CustomModelSerializer): class Meta: model = UserPost exclude = EXCLUDE_FIELDS_BASE class UserInfoSerializer(CustomModelSerializer): posts_ = UserPostSerializer(source='post', read_only=True) class Meta: model = User fields = ['id', 'username', 'name', 'posts_', 'avatar']