404 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			404 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| 
 | |
| 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 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, PostRole,
 | |
|                      Role, User, UserPost)
 | |
| from rest_framework.exceptions import ParseError
 | |
| from django.db import transaction
 | |
| from apps.third.tapis import dhapis
 | |
| from rest_framework.validators import UniqueValidator
 | |
| from django.conf import settings
 | |
| # from django_q.models import Task as QTask, Schedule as QSchedule
 | |
| 
 | |
| 
 | |
| # class QScheduleSerializer(CustomModelSerializer):
 | |
| #     success = serializers.SerializerMethodField()
 | |
| 
 | |
| #     class Meta:
 | |
| #         model = QSchedule
 | |
| #         fields = '__all__'
 | |
| 
 | |
| #     def get_success(self, obj):
 | |
| #         return obj.success()
 | |
| 
 | |
| 
 | |
| # class QTaskResultSerializer(CustomModelSerializer):
 | |
| #     args = serializers.SerializerMethodField()
 | |
| #     kwargs = serializers.SerializerMethodField()
 | |
| #     result = serializers.SerializerMethodField()
 | |
| 
 | |
| #     class Meta:
 | |
| #         model = QTask
 | |
| #         fields = '__all__'
 | |
| 
 | |
| #     def get_args(self, obj):
 | |
| #         return obj.args
 | |
| 
 | |
| #     def get_kwargs(self, obj):
 | |
| #         return obj.kwargs
 | |
| 
 | |
| #     def get_result(self, obj):
 | |
| #         return obj.result
 | |
| 
 | |
| class TaskRunSerializer(serializers.Serializer):
 | |
|     sync = serializers.BooleanField(default=True)
 | |
| 
 | |
| 
 | |
| 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 PTaskResultSerializer(CustomModelSerializer):
 | |
|     class Meta:
 | |
|         model = TaskResult
 | |
|         fields = '__all__'
 | |
| 
 | |
| 
 | |
| 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 DictSimpleSerializer(CustomModelSerializer):
 | |
|     class Meta:
 | |
|         model = Dictionary
 | |
|         fields = ['id', 'name', 'code']
 | |
| 
 | |
| 
 | |
| 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):
 | |
|     """
 | |
|     组织架构序列化
 | |
|     """
 | |
|     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 settings.DAHUA_ENABLED:
 | |
|             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 settings.DAHUA_ENABLED 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 settings.DAHUA_ENABLED 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', 'phone']
 | |
| 
 | |
|     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', 'phone']
 | |
| 
 | |
| 
 | |
| class PasswordChangeSerializer(serializers.Serializer):
 | |
|     old_password = serializers.CharField(label="原密码")
 | |
|     new_password1 = serializers.CharField(label="新密码1")
 | |
|     new_password2 = serializers.CharField(label="新密码2")
 | |
| 
 | |
| 
 | |
| 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
 | |
| 
 | |
|     def create(self, validated_data):
 | |
|         return super().create(validated_data)
 | |
| 
 | |
| 
 | |
| class PostRoleSerializer(CustomModelSerializer):
 | |
|     """
 | |
|     岗位-角色序列化
 | |
|     """
 | |
|     post_ = PostSimpleSerializer(source='post', read_only=True)
 | |
|     role_ = RoleSimpleSerializer(source='role', read_only=True)
 | |
| 
 | |
|     class Meta:
 | |
|         model = PostRole
 | |
|         fields = '__all__'
 | |
| 
 | |
| 
 | |
| class PostRoleCreateSerializer(CustomModelSerializer):
 | |
|     """
 | |
|     岗位-角色创建序列化
 | |
|     """
 | |
|     class Meta:
 | |
|         model = PostRole
 | |
|         fields = ['post', 'role', 'data_range']
 | |
| 
 | |
| 
 | |
| class UserInfoSerializer(CustomModelSerializer):
 | |
|     posts_ = UserPostSerializer(source='post', read_only=True)
 | |
| 
 | |
|     class Meta:
 | |
|         model = User
 | |
|         fields = ['id', 'username', 'name', 'posts_', 'avatar']
 |