You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

542 lines
15 KiB
Python

import copy
import datetime
import json
import os
import random
import re
from decimal import Decimal
from django.db.models import F
from rest_framework import serializers
from django_filters.rest_framework import FilterSet
import django_filters
from app import consts, shortuuid
from app.models import AuthUser, ServerModel, AlgModelModel, ModelClassificationModel, EnterpriseModel, \
EnterpriseDeviceModel, DeviceClassificationModel, WarningStatisticsModel, EnterpriseNodeModel, ComputeConfigModel, \
ModelVersionModel, EnterpriseAlertDeviceModel, ModelHubModel, EnterpriseBusiModelModel, \
EnterpriseBusiModelNodeModel, EnterpriseBusiModelNodeDeviceModel, ServerLogModel, FilesModel, MessageModel, \
WorkshopModel, WorkshopDeviceModel
import logging
logger = logging.getLogger('mylogger')
def md5_validate(v: str) -> bool:
md5_pattern = re.compile(r'^[a-fA-F0-9]{32}$')
# 匹配字符串
if md5_pattern.match(v):
return True
return False
class AuthUserSerializer(serializers.ModelSerializer):
class Meta:
model = AuthUser
fields = ["id", "username", "avatar", "is_superuser", "date_joined", "gender", "phone_number", "status", "note"]
def to_representation(self, instance):
ret = super().to_representation(instance)
ret["gender_ch"] = instance.get_gender_display()
return ret
class ServerSerializer(serializers.ModelSerializer):
class Meta:
model = ServerModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
ret["state"] = consts.device_status_map.get(ret["status"], None)
# TODO 暂时模拟服务器使用情况
ret["cpu"] = random.randint(20, 30)
ret["mem"] = random.randint(20, 30)
ret["storage"] = random.randint(20, 30)
ret["gpu"] = random.randint(20, 30)
return ret
def to_internal_value(self, data):
if not (data.get("suid") or data.get("id")):
suid = shortuuid.ShortUUID().random(10)
data["suid"] = suid
ret = super().to_internal_value(data)
return ret
class ServerLogSerializer(serializers.ModelSerializer):
class Meta:
model = ServerLogModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
return ret
class EnterpriseSerializer(serializers.ModelSerializer):
class Meta:
model = EnterpriseModel
# fields = "__all__"
exclude = ["pwd"]
def to_representation(self, instance):
ret = super().to_representation(instance)
ret["industry"] = consts.industry_map.get(ret["industry"], None)
# ret["valid_data"] = f"{ret.pop('start_valid_date')}至{ret.pop('end_valid_date')}"
return ret
def to_internal_value(self, data):
if not (data.get("suid") or data.get("id")):
suid = shortuuid.ShortUUID().random(10)
data["suid"] = suid
# 有效期无需更新
else:
data.pop("start_valid_date", None)
data.pop("end_valid_date", None)
ret = super().to_internal_value(data)
return ret
class EnterpriseBusiModelSerializer(serializers.ModelSerializer):
class Meta:
model = EnterpriseBusiModelModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
ret["basemodel_list"] = json.loads(ret.pop("base_models", "{}"))
# node_id_list
all_node_id_list = EnterpriseBusiModelNodeModel.objects.filter(busi_model_id=instance.id).all().values("node_id")
node_ids = list()
for node_id in all_node_id_list:
node_ids.append(node_id.get("node_id"))
all_node_objs = EnterpriseNodeModel.objects.filter(id__in=node_ids).all().annotate(node_id=F('id'), node_name=F('name')).values("node_id", "node_name")
ret["link_node_list"] = all_node_objs
return ret
def to_internal_value(self, data):
data = self.insert_busi_model(data)
all_fields = self.get_fields()
filtered_data = {key: value for key, value in data.items() if key in all_fields}
ret = super().to_internal_value(filtered_data)
return ret
def insert_busi_model(self, data):
if not data.get("entity_suid"):
entity_obj = EnterpriseModel.objects.filter(id=data.get("entity_id")).last()
entity_suid = entity_obj.suid if entity_obj else ""
data['entity_suid'] = entity_suid
if not (data.get("suid") or data.get("id")):
data['suid'] = shortuuid.ShortUUID().random(10)
base_model_ids = [int(model_id) for model_id in data['basemodel_ids'].split(',')]
logging.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")
logging.info(base_model_ids)
base_model = []
for base_model_id in base_model_ids:
base_model_info = AlgModelModel.objects.filter(id=base_model_id).get()
logging.info("#####################")
logging.info(base_model_info)
base_model.append({
'id': base_model_id,
'suid': base_model_info.suid,
'name': base_model_info.name,
})
data['base_models'] = json.dumps(base_model, ensure_ascii=False)
new_data = copy.copy(data)
return new_data
class EnterpriseBusiModelNodeSerializer(serializers.ModelSerializer):
class Meta:
model = EnterpriseBusiModelNodeModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
return ret
def to_internal_value(self, data):
ret = super().to_internal_value(data)
return ret
class EnterpriseBusiModelNodeDeviceSerializer(serializers.ModelSerializer):
class Meta:
model = EnterpriseBusiModelNodeDeviceModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
return ret
def to_internal_value(self, data):
if not (data.get("suid") or data.get("id")):
suid = shortuuid.ShortUUID().random(10)
data["suid"] = suid
ret = super().to_internal_value(data)
return ret
class AlgModelSerializer(serializers.ModelSerializer):
class Meta:
model = AlgModelModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
model_class = ModelClassificationModel.objects.filter(id=instance.classification).get()
except:
model_class = None
ret["classification_name"] = model_class.name if model_class else None
ret["model_type"] = consts.model_type_map[instance.model_type]
ret["update_time"] = str(instance.update_time)
return ret
def to_internal_value(self, data):
if not (data.get("suid") or data.get("id")):
suid = shortuuid.ShortUUID().random(10)
data["suid"] = suid
ret = super().to_internal_value(data)
return ret
class ModelClassificationSerializer(serializers.ModelSerializer):
class Meta:
model = ModelClassificationModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
return ret
class ModelVersionSerializer(serializers.ModelSerializer):
class Meta:
model = ModelVersionModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
return ret
def to_internal_value(self, data):
if not md5_validate(data.get("model_file")):
raise Exception("模型文件格式错误")
config_file = data.get("config_file")
if config_file and not md5_validate(config_file):
raise Exception("模型配置文件格式错误")
status = data.get("status")
# 删除时更新模型的版本
if status:
AlgModelModel.objects.filter(id=data.get("model_id")).update(default_version="")
ret = super().to_internal_value(data)
return ret
class ModelHubSerializer(serializers.ModelSerializer):
class Meta:
model = ModelHubModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
return ret
class EnterpriseDeviceSerializer(serializers.ModelSerializer):
class Meta:
model = EnterpriseDeviceModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
##TODO 设备状态
# ret["state"] = None
try:
classification_obj = DeviceClassificationModel.objects.filter(id=ret["classification"]).get()
except:
classification_obj = None
ret["classification"] = classification_obj.name if classification_obj else None
ret["is_cam"] = "摄像" in classification_obj.name if classification_obj else False
return ret
def to_internal_value(self, data):
if not (data.get("suid") or data.get("id")):
suid = shortuuid.ShortUUID().random(10)
data["suid"] = suid
ret = super().to_internal_value(data)
return ret
class EnterpriseAlertDeviceSerializer(serializers.ModelSerializer):
class Meta:
model = EnterpriseAlertDeviceModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
return ret
class DeviceClassificationSerializer(serializers.ModelSerializer):
class Meta:
model = DeviceClassificationModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
return ret
def to_internal_value(self, data):
if not (data.get("suid") or data.get("id")):
suid = shortuuid.ShortUUID().random(10)
data["suid"] = suid
ret = super().to_internal_value(data)
return ret
class WarningStatisticsSerializer(serializers.ModelSerializer):
class Meta:
model = WarningStatisticsModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
node_obj = EnterpriseNodeModel.objects.filter(id=instance.node_id).get()
except:
node_obj = None
ret["node_name"] = node_obj.name if node_obj else ""
return ret
class EnterpriseNodeListSerializer(serializers.ListSerializer):
@property
def data_with_children(self):
data = super().data
for single in data:
children = EnterpriseNodeModel.objects.filter(parent=single.get("id")).all()
if children:
single["children"] = EnterpriseNodeSerializer(children, many=True).data_with_children
else:
single["children"] = []
return data
class EnterpriseNodeSerializer(serializers.ModelSerializer):
class Meta:
model = EnterpriseNodeModel
fields = "__all__"
list_serializer_class = EnterpriseNodeListSerializer
def to_representation(self, instance):
ret = super().to_representation(instance)
# children = EnterpriseNodeModel.objects.filter(parent=instance.id).all()
#
# if children:
# ret["children"] = EnterpriseNodeSerializer(children, many=True).data
return ret
def to_internal_value(self, data):
if not (data.get("suid") or data.get("id")):
suid = shortuuid.ShortUUID().random(10)
data["suid"] = suid
ret = super().to_internal_value(data)
return ret
@property
def data_with_children(self):
data = super().data
children = EnterpriseNodeModel.objects.filter(parent=data.get("id")).all()
if children:
data["children"] = EnterpriseNodeSerializer(children, many=True).data_with_children
else:
data["children"] = []
return data
class ComputeConfigSerializer(serializers.ModelSerializer):
class Meta:
model = ComputeConfigModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
ret["percentage"] = f"{100 * instance.percentage}%"
try:
model_obj = AlgModelModel.objects.filter(id=instance.model_id).get()
except:
model_obj = None
ret["name"] = model_obj.name if model_obj else None
return ret
def to_internal_value(self, data):
percentage = data.get("percentage")
if isinstance(percentage, str) and percentage.endswith("%"):
data["percentage"] = (Decimal(percentage.strip("%")) / Decimal('100.0')).quantize(Decimal('0.00'))
ret = super().to_internal_value(data)
return ret
class FilesSerializer(serializers.ModelSerializer):
class Meta:
model = FilesModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
return ret
def to_internal_value(self, data):
ret = super().to_internal_value(data)
return ret
class MessageSerializer(serializers.ModelSerializer):
class Meta:
model = MessageModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
return ret
def to_internal_value(self, data):
ret = super().to_internal_value(data)
return ret
class WorkshopSerializer(serializers.ModelSerializer):
class Meta:
model = WorkshopModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
ret["picture"] = ret["picture"].replace("127.0.0.1", os.getenv("SERVER_IP", "192.168.10.21:8000"))
return ret
def to_internal_value(self, data):
ret = super().to_internal_value(data)
return ret
class WorkshopDeviceSerializer(serializers.ModelSerializer):
class Meta:
model = WorkshopDeviceModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
device_obj = EnterpriseDeviceModel.objects.filter(id=instance.device_id).get()
except:
device_obj = None
ret["device_name"] = device_obj.name if device_obj else None
try:
workshop_obj = WorkshopModel.objects.filter(id=instance.workshop_id).get()
except:
workshop_obj = None
ret["workshop_name"] = workshop_obj.name if workshop_obj else None
return ret
def to_internal_value(self, data):
ret = super().to_internal_value(data)
return ret