feat: 函数库添加权限
This commit is contained in:
parent
56853a140d
commit
c2217aa19e
@ -609,7 +609,8 @@ class ApplicationSerializer(serializers.Serializer):
|
||||
if with_valid:
|
||||
self.is_valid(raise_exception=True)
|
||||
application = QuerySet(Application).filter(id=self.data.get("application_id")).first()
|
||||
return FunctionLibSerializer.Query(data={'user_id': application.user_id}).list(with_valid=True)
|
||||
return FunctionLibSerializer.Query(data={'user_id': application.user_id, 'is_active': True}).list(
|
||||
with_valid=True)
|
||||
|
||||
def get_function_lib(self, function_lib_id, with_valid=True):
|
||||
if with_valid:
|
||||
|
||||
@ -0,0 +1,23 @@
|
||||
# Generated by Django 4.2.15 on 2024-09-14 11:23
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('function_lib', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='functionlib',
|
||||
name='is_active',
|
||||
field=models.BooleanField(default=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='functionlib',
|
||||
name='permission_type',
|
||||
field=models.CharField(choices=[('PUBLIC', '公开'), ('PRIVATE', '私有')], default='PRIVATE', max_length=20, verbose_name='权限类型'),
|
||||
),
|
||||
]
|
||||
@ -15,6 +15,11 @@ from common.mixins.app_model_mixin import AppModelMixin
|
||||
from users.models import User
|
||||
|
||||
|
||||
class PermissionType(models.TextChoices):
|
||||
PUBLIC = "PUBLIC", '公开'
|
||||
PRIVATE = "PRIVATE", "私有"
|
||||
|
||||
|
||||
class FunctionLib(AppModelMixin):
|
||||
id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid1, editable=False, verbose_name="主键id")
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户id")
|
||||
@ -24,6 +29,9 @@ class FunctionLib(AppModelMixin):
|
||||
input_field_list = ArrayField(verbose_name="输入字段列表",
|
||||
base_field=models.JSONField(verbose_name="输入字段", default=dict)
|
||||
, default=list)
|
||||
is_active = models.BooleanField(default=True)
|
||||
permission_type = models.CharField(max_length=20, verbose_name='权限类型', choices=PermissionType.choices,
|
||||
default=PermissionType.PRIVATE)
|
||||
|
||||
class Meta:
|
||||
db_table = "function_lib"
|
||||
|
||||
@ -11,7 +11,7 @@ import re
|
||||
import uuid
|
||||
|
||||
from django.core import validators
|
||||
from django.db.models import QuerySet
|
||||
from django.db.models import QuerySet, Q
|
||||
from rest_framework import serializers
|
||||
|
||||
from common.db.search import page_search
|
||||
@ -27,7 +27,7 @@ function_executor = FunctionExecutor(CONFIG.get('SANDBOX'))
|
||||
class FunctionLibModelSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = FunctionLib
|
||||
fields = ['id', 'name', 'desc', 'code', 'input_field_list',
|
||||
fields = ['id', 'name', 'desc', 'code', 'input_field_list', 'permission_type', 'is_active',
|
||||
'create_time', 'update_time']
|
||||
|
||||
|
||||
@ -68,6 +68,8 @@ class EditFunctionLib(serializers.Serializer):
|
||||
|
||||
input_field_list = FunctionLibInputField(required=False, many=True)
|
||||
|
||||
is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.char('是否可用'))
|
||||
|
||||
|
||||
class CreateFunctionLib(serializers.Serializer):
|
||||
name = serializers.CharField(required=True, error_messages=ErrMessage.char("函数名称"))
|
||||
@ -79,6 +81,12 @@ class CreateFunctionLib(serializers.Serializer):
|
||||
|
||||
input_field_list = FunctionLibInputField(required=True, many=True)
|
||||
|
||||
permission_type = serializers.CharField(required=True, error_messages=ErrMessage.char("权限"), validators=[
|
||||
validators.RegexValidator(regex=re.compile("^PUBLIC|PRIVATE$"),
|
||||
message="权限只支持PUBLIC|PRIVATE", code=500)
|
||||
])
|
||||
is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.char('是否可用'))
|
||||
|
||||
|
||||
class FunctionLibSerializer(serializers.Serializer):
|
||||
class Query(serializers.Serializer):
|
||||
@ -87,15 +95,19 @@ class FunctionLibSerializer(serializers.Serializer):
|
||||
|
||||
desc = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
||||
error_messages=ErrMessage.char("函数描述"))
|
||||
is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.char("是否可用"))
|
||||
|
||||
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
||||
|
||||
def get_query_set(self):
|
||||
query_set = QuerySet(FunctionLib).filter(user_id=self.data.get('user_id'))
|
||||
query_set = QuerySet(FunctionLib).filter(
|
||||
(Q(user_id=self.data.get('user_id')) | Q(permission_type='PUBLIC')))
|
||||
if self.data.get('name') is not None:
|
||||
query_set = query_set.filter(name__contains=self.data.get('name'))
|
||||
if self.data.get('desc') is not None:
|
||||
query_set = query_set.filter(desc__contains=self.data.get('desc'))
|
||||
if self.data.get('is_active') is not None:
|
||||
query_set = query_set.filter(is_active=self.data.get('is_active'))
|
||||
query_set = query_set.order_by("-create_time")
|
||||
return query_set
|
||||
|
||||
@ -120,7 +132,9 @@ class FunctionLibSerializer(serializers.Serializer):
|
||||
function_lib = FunctionLib(id=uuid.uuid1(), name=instance.get('name'), desc=instance.get('desc'),
|
||||
code=instance.get('code'),
|
||||
user_id=self.data.get('user_id'),
|
||||
input_field_list=instance.get('input_field_list'))
|
||||
input_field_list=instance.get('input_field_list'),
|
||||
permission_type=instance.get('permission_type'),
|
||||
is_active=instance.get('is_active', True))
|
||||
function_lib.save()
|
||||
return FunctionLibModelSerializer(function_lib).data
|
||||
|
||||
@ -193,7 +207,7 @@ class FunctionLibSerializer(serializers.Serializer):
|
||||
if with_valid:
|
||||
self.is_valid(raise_exception=True)
|
||||
EditFunctionLib(data=instance).is_valid(raise_exception=True)
|
||||
edit_field_list = ['name', 'desc', 'code', 'input_field_list']
|
||||
edit_field_list = ['name', 'desc', 'code', 'input_field_list', 'permission_type', 'is_active']
|
||||
edit_dict = {field: instance.get(field) for field in edit_field_list if (
|
||||
field in instance and instance.get(field) is not None)}
|
||||
QuerySet(FunctionLib).filter(id=self.data.get('id')).update(**edit_dict)
|
||||
|
||||
@ -103,6 +103,8 @@ class FunctionLibApi(ApiMixin):
|
||||
'name': openapi.Schema(type=openapi.TYPE_STRING, title="函数名称", description="函数名称"),
|
||||
'desc': openapi.Schema(type=openapi.TYPE_STRING, title="函数描述", description="函数描述"),
|
||||
'code': openapi.Schema(type=openapi.TYPE_STRING, title="函数内容", description="函数内容"),
|
||||
'permission_type': openapi.Schema(type=openapi.TYPE_STRING, title="权限", description="权限"),
|
||||
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否可用", description="是否可用"),
|
||||
'input_field_list': openapi.Schema(type=openapi.TYPE_ARRAY,
|
||||
description="输入变量列表",
|
||||
items=openapi.Schema(type=openapi.TYPE_OBJECT,
|
||||
@ -135,11 +137,13 @@ class FunctionLibApi(ApiMixin):
|
||||
def get_request_body_api():
|
||||
return openapi.Schema(
|
||||
type=openapi.TYPE_OBJECT,
|
||||
required=['name', 'code', 'input_field_list'],
|
||||
required=['name', 'code', 'input_field_list', 'permission_type'],
|
||||
properties={
|
||||
'name': openapi.Schema(type=openapi.TYPE_STRING, title="函数名称", description="函数名称"),
|
||||
'desc': openapi.Schema(type=openapi.TYPE_STRING, title="函数描述", description="函数描述"),
|
||||
'code': openapi.Schema(type=openapi.TYPE_STRING, title="函数内容", description="函数内容"),
|
||||
'permission_type': openapi.Schema(type=openapi.TYPE_STRING, title="权限", description="权限"),
|
||||
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否可用", description="是否可用"),
|
||||
'input_field_list': openapi.Schema(type=openapi.TYPE_ARRAY,
|
||||
description="输入变量列表",
|
||||
items=openapi.Schema(type=openapi.TYPE_OBJECT,
|
||||
|
||||
@ -3,6 +3,7 @@ interface functionLibData {
|
||||
name: String
|
||||
desc: String
|
||||
code?: String
|
||||
permission_type: 'PRIVATE' | 'PUBLIC'
|
||||
input_field_list?: Array<any>
|
||||
}
|
||||
|
||||
|
||||
@ -33,6 +33,32 @@
|
||||
@blur="form.desc = form.desc.trim()"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item prop="permission_type" :rules="form.permission_type">
|
||||
<template #label>
|
||||
<span>权限</span>
|
||||
</template>
|
||||
|
||||
<el-radio-group v-model="form.permission_type" class="card__radio">
|
||||
<el-row :gutter="16">
|
||||
<template v-for="(value, key) of PermissionType" :key="key">
|
||||
<el-col :span="12">
|
||||
<el-card
|
||||
shadow="never"
|
||||
class="mb-16"
|
||||
:class="form.permission_type === key ? 'active' : ''"
|
||||
>
|
||||
<el-radio :value="key" size="large">
|
||||
<p class="mb-4">{{ value }}</p>
|
||||
<el-text type="info">
|
||||
{{ PermissionDesc[key] }}
|
||||
</el-text>
|
||||
</el-radio>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</template>
|
||||
</el-row>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="flex-between">
|
||||
<h4 class="title-decoration-1 mb-16">
|
||||
@ -137,7 +163,7 @@ import functionLibApi from '@/api/function-lib'
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import { MsgSuccess, MsgConfirm } from '@/utils/message'
|
||||
import { cloneDeep } from 'lodash'
|
||||
|
||||
import { PermissionType, PermissionDesc } from '@/enums/model'
|
||||
const props = defineProps({
|
||||
title: String
|
||||
})
|
||||
@ -158,7 +184,8 @@ const form = ref<functionLibData>({
|
||||
name: '',
|
||||
desc: '',
|
||||
code: '',
|
||||
input_field_list: []
|
||||
input_field_list: [],
|
||||
permission_type: 'PRIVATE'
|
||||
})
|
||||
|
||||
const dialogVisible = ref(false)
|
||||
@ -173,7 +200,8 @@ watch(visible, (bool) => {
|
||||
name: '',
|
||||
desc: '',
|
||||
code: '',
|
||||
input_field_list: []
|
||||
input_field_list: [],
|
||||
permission_type: 'PRIVATE'
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
Loading…
Reference in New Issue
Block a user