# coding:utf-8 import datetime from rest_framework import serializers from utils.supervisord_utils import SupervisordUtils from drf_spectacular.utils import extend_schema_field from drf_spectacular.types import OpenApiTypes class ProcessListSerializer(serializers.Serializer): pid = serializers.IntegerField(help_text='进程id', default=1) name = serializers.CharField(help_text="进程名称", default="nginx") start_time = serializers.DateTimeField(help_text="启动时间", default="2020-03-06 20:54:00") state_name = serializers.CharField(label="运行状态", help_text="当运行状态不等于RUNNING时候,停止按钮设置为不可点击状态", default="RUNNING") description = serializers.CharField(help_text="描述信息", default="Exited too quickly (process log may have details)") def to_representation(self, instance): start_date = datetime.datetime.fromtimestamp(instance['start']) start_time = start_date.strftime('%Y-%m-%d %H:%M:%S') state_name = instance['statename'] description = instance['description'] pid = -1 if state_name == 'RUNNING': pid = instance['pid'] now = datetime.datetime.fromtimestamp(instance['now']) diff_date = now - start_date description = '已运行 ' + str(diff_date).replace('days', '天') return { "pid": pid, "name": instance['name'], "start_time": start_time, "state_name": instance['statename'], "description": description } class ProcessDetailDeleteSerializer(serializers.Serializer): name = serializers.CharField(required=True, help_text="进程名称", error_messages={ 'required': '参数必须存在', 'blank': '进程名称不能为空', }) def validate_name(self, value): if not SupervisordUtils().is_exists(value): raise serializers.ValidationError('{}进程不存在'.format(value)) class ProcessDetailPutSerializer(ProcessDetailDeleteSerializer): action = serializers.CharField(label="操作方式", required=True, help_text="stop 表示停止,restart 表示重启") def validate_action(self, value): if value not in ['stop', 'restart']: raise serializers.ValidationError('仅支持stop或restart')