205 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
| import re
 | |
| 
 | |
| from django_celery_beat.models import PeriodicTask, CrontabSchedule, IntervalSchedule
 | |
| from rest_framework import serializers
 | |
| 
 | |
| from .models import (Dict, DictType, File, Organization, Permission, Position,
 | |
|                      Role, User)
 | |
| from utils.mixins import DynamicFieldsSerializerMixin
 | |
| 
 | |
| class IntervalSerializer(serializers.ModelSerializer):
 | |
|     class Meta:
 | |
|         model = IntervalSchedule
 | |
|         fields = '__all__'
 | |
| 
 | |
| class CrontabSerializer(serializers.ModelSerializer):
 | |
|     class Meta:
 | |
|         model = CrontabSchedule
 | |
|         exclude = ['timezone']
 | |
| 
 | |
| class PTaskCreateUpdateSerializer(serializers.ModelSerializer):
 | |
|     class Meta:
 | |
|         model = PeriodicTask
 | |
|         fields = ['name', 'task', 'interval', 'crontab', 'args', 'kwargs']
 | |
| 
 | |
| class PTaskSerializer(serializers.ModelSerializer):
 | |
|     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__'
 | |
|     @staticmethod
 | |
|     def setup_eager_loading(queryset):
 | |
|         """ Perform necessary eager loading of data. """
 | |
|         queryset = queryset.select_related('interval','crontab')
 | |
|         return queryset
 | |
|     
 | |
|     def get_schedule(self, obj):
 | |
|         if obj.interval:
 | |
|             return obj.interval.__str__()
 | |
|         if obj.crontab:
 | |
|             return obj.crontab.__str__()
 | |
|         return ''
 | |
|     
 | |
|     def get_timetype(self, obj):
 | |
|         if obj.interval:
 | |
|             return 'interval'
 | |
|         if obj.crontab:
 | |
|             return 'crontab'
 | |
|         return 'interval'
 | |
| 
 | |
| class FileSimpleSerializer(serializers.ModelSerializer):
 | |
|     class Meta:
 | |
|         model =File
 | |
|         fields = ['id', 'name', 'file', 'path']
 | |
| 
 | |
| class FileSerializer(serializers.ModelSerializer):
 | |
|     class Meta:
 | |
|         model = File
 | |
|         fields = "__all__"
 | |
| 
 | |
| class DictTypeSerializer(serializers.ModelSerializer):
 | |
|     """
 | |
|     数据字典类型序列化
 | |
|     """
 | |
|     class Meta:
 | |
|         model = DictType
 | |
|         fields = '__all__'
 | |
| 
 | |
| 
 | |
| class DictSerializer(serializers.ModelSerializer):
 | |
|     """
 | |
|     数据字典序列化
 | |
|     """
 | |
|     class Meta:
 | |
|         model = Dict
 | |
|         fields = '__all__'
 | |
| 
 | |
| 
 | |
| class PositionSerializer(serializers.ModelSerializer):
 | |
|     """
 | |
|     岗位序列化
 | |
|     """
 | |
|     class Meta:
 | |
|         model = Position
 | |
|         fields = '__all__'
 | |
| 
 | |
| 
 | |
| class RoleSerializer(serializers.ModelSerializer):
 | |
|     """
 | |
|     角色序列化
 | |
|     """
 | |
|     class Meta:
 | |
|         model = Role
 | |
|         fields = '__all__'
 | |
| 
 | |
| 
 | |
| class PermissionSerializer(serializers.ModelSerializer):
 | |
|     """
 | |
|     权限序列化
 | |
|     """
 | |
|     class Meta:
 | |
|         model = Permission
 | |
|         fields = '__all__'
 | |
| 
 | |
| 
 | |
| class OrganizationSerializer(serializers.ModelSerializer):
 | |
|     """
 | |
|     组织架构序列化
 | |
|     """
 | |
|     type = serializers.ChoiceField(
 | |
|         choices=Organization.organization_type_choices, default='部门')
 | |
| 
 | |
|     class Meta:
 | |
|         model = Organization
 | |
|         fields = '__all__'
 | |
| 
 | |
| class OrganizationSimpleSerializer(serializers.ModelSerializer):
 | |
|     class Meta:
 | |
|         model = Organization
 | |
|         fields = ['id', 'name']
 | |
| 
 | |
| class UserSimpleSerializer(serializers.ModelSerializer):
 | |
|     class Meta:
 | |
|         model = User
 | |
|         fields = ['id', 'username', 'name']
 | |
| 
 | |
| # class UserStandardSerializer(serializers.ModelSerializer):
 | |
| #     dept_name = serializers.StringRelatedField(source='dept')
 | |
| #     class Meta:
 | |
| #         model = User
 | |
| #         fields = ['id', 'username', 'name', 'is_active', 'dept_name', 'dept']
 | |
|     
 | |
| 
 | |
| class UserListSerializer(DynamicFieldsSerializerMixin, serializers.ModelSerializer):
 | |
|     """
 | |
|     用户列表序列化
 | |
|     """
 | |
|     dept_name = serializers.StringRelatedField(source='dept')
 | |
|     roles_name = serializers.StringRelatedField(source='roles', many=True)
 | |
|     class Meta:
 | |
|         model = User
 | |
|         fields = ['id', 'name', 'phone', 'email', 'position',
 | |
|                   'username', 'is_active', 'date_joined', 
 | |
|                   'dept_name', 'dept', 'roles', 'avatar', 
 | |
|                   'roles_name', 'is_atwork']
 | |
| 
 | |
|     @staticmethod
 | |
|     def setup_eager_loading(queryset):
 | |
|         """ Perform necessary eager loading of data. """
 | |
|         queryset = queryset.select_related('superior','dept')
 | |
|         queryset = queryset.prefetch_related('roles',)
 | |
|         return queryset
 | |
|     
 | |
|     def get_field_names(self, declared_fields, info):
 | |
|         if hasattr(self.Meta.model, 'employee_user'):
 | |
|             self.Meta.fields.append('employee_user')
 | |
|         return super().get_field_names(declared_fields, info)
 | |
| 
 | |
| class UserModifySerializer(serializers.ModelSerializer):
 | |
|     """
 | |
|     用户编辑序列化
 | |
|     """
 | |
|     phone = serializers.CharField(max_length=11, read_only=True)
 | |
| 
 | |
|     class Meta:
 | |
|         model = User
 | |
|         fields = ['id', 'username', 'name', 'phone', 'email', 'dept',
 | |
|                   'position', 'avatar', 'is_active', 'roles', 'is_superuser']
 | |
| 
 | |
|     def validate_phone(self, phone):
 | |
|         re_phone = '^1[358]\d{9}$|^147\d{8}$|^176\d{8}$'
 | |
|         if not re.match(re_phone, phone):
 | |
|             raise serializers.ValidationError('手机号码不合法')
 | |
|         return phone
 | |
| 
 | |
| 
 | |
| class UserCreateSerializer(serializers.ModelSerializer):
 | |
|     """
 | |
|     创建用户序列化
 | |
|     """
 | |
|     username = serializers.CharField(required=True)
 | |
|     phone = serializers.CharField(max_length=11, read_only=True)
 | |
| 
 | |
|     class Meta:
 | |
|         model = User
 | |
|         fields = ['id', 'username', 'name', 'phone', 'email', 'dept',
 | |
|                   'position', 'avatar', 'is_active', 'roles']
 | |
| 
 | |
|     def validate_username(self, username):
 | |
|         if User.objects.filter(username=username):
 | |
|             raise serializers.ValidationError(username + ' 账号已存在')
 | |
|         return username
 | |
| 
 | |
|     def validate_phone(self, phone):
 | |
|         re_phone = '^1[358]\d{9}$|^147\d{8}$|^176\d{8}$'
 | |
|         if not re.match(re_phone, phone):
 | |
|             raise serializers.ValidationError('手机号码不合法')
 | |
|         if User.objects.filter(phone=phone):
 | |
|             raise serializers.ValidationError('手机号已经被注册')
 | |
|         return phone
 | |
| 
 | |
| 
 |