from apps.utils.serializers import CustomModelSerializer from apps.bi.models import Dataset, DatasetRecord from apps.utils.constants import EXCLUDE_FIELDS from rest_framework import serializers from apps.bi.services import check_sql_safe class DatasetCreateUpdateSerializer(CustomModelSerializer): class Meta: model = Dataset exclude = EXCLUDE_FIELDS def validate(self, attrs): sql_query = attrs.get('sql_query', '') if sql_query: check_sql_safe(sql_query) return attrs class DatasetSerializer(CustomModelSerializer): description = serializers.CharField( label="适用场景与统计口径", help_text="说明该数据集适合回答的问题、指标口径、参数格式和返回字段含义", required=False, allow_blank=True, ) default_param = serializers.JSONField( label="默认查询参数", help_text="执行时可覆盖的参数及默认值;内部 SQL 片段参数应保留默认值", required=False, ) test_param = serializers.JSONField( label="测试查询参数", help_text="数据集维护时使用的示例参数,普通查询优先参考 description", required=False, ) class Meta: model = Dataset fields = '__all__' class DatasetListResponseSerializer(serializers.Serializer): count = serializers.IntegerField(label="数据集总数") next = serializers.URLField(required=False, allow_null=True) previous = serializers.URLField(required=False, allow_null=True) results = DatasetSerializer(many=True) class DatasetRecordSerializer(CustomModelSerializer): class Meta: model = DatasetRecord fields = '__all__' # class ReportSerializer(CustomModelSerializer): # class Meta: # model = Report # fields = '__all__' # read_only_fields = EXCLUDE_FIELDS class DataExecSerializer(serializers.Serializer): query = serializers.JSONField( label="查询字典参数", help_text="按所选数据集 description/default_param 声明的业务参数填写", required=False, allow_null=True, ) is_test = serializers.BooleanField( label='是否测试', help_text="普通业务查询固定为 false", default=False ) raise_exception = serializers.BooleanField( label='是否直接报错', help_text="建议为 true,便于修正缺失或非法参数", default=True )