feat: 函数库添加权限
This commit is contained in:
parent
56853a140d
commit
c2217aa19e
@ -609,7 +609,8 @@ class ApplicationSerializer(serializers.Serializer):
|
|||||||
if with_valid:
|
if with_valid:
|
||||||
self.is_valid(raise_exception=True)
|
self.is_valid(raise_exception=True)
|
||||||
application = QuerySet(Application).filter(id=self.data.get("application_id")).first()
|
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):
|
def get_function_lib(self, function_lib_id, with_valid=True):
|
||||||
if with_valid:
|
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
|
from users.models import User
|
||||||
|
|
||||||
|
|
||||||
|
class PermissionType(models.TextChoices):
|
||||||
|
PUBLIC = "PUBLIC", '公开'
|
||||||
|
PRIVATE = "PRIVATE", "私有"
|
||||||
|
|
||||||
|
|
||||||
class FunctionLib(AppModelMixin):
|
class FunctionLib(AppModelMixin):
|
||||||
id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid1, editable=False, verbose_name="主键id")
|
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")
|
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户id")
|
||||||
@ -24,6 +29,9 @@ class FunctionLib(AppModelMixin):
|
|||||||
input_field_list = ArrayField(verbose_name="输入字段列表",
|
input_field_list = ArrayField(verbose_name="输入字段列表",
|
||||||
base_field=models.JSONField(verbose_name="输入字段", default=dict)
|
base_field=models.JSONField(verbose_name="输入字段", default=dict)
|
||||||
, default=list)
|
, 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:
|
class Meta:
|
||||||
db_table = "function_lib"
|
db_table = "function_lib"
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import re
|
|||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from django.core import validators
|
from django.core import validators
|
||||||
from django.db.models import QuerySet
|
from django.db.models import QuerySet, Q
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from common.db.search import page_search
|
from common.db.search import page_search
|
||||||
@ -27,7 +27,7 @@ function_executor = FunctionExecutor(CONFIG.get('SANDBOX'))
|
|||||||
class FunctionLibModelSerializer(serializers.ModelSerializer):
|
class FunctionLibModelSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = FunctionLib
|
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']
|
'create_time', 'update_time']
|
||||||
|
|
||||||
|
|
||||||
@ -68,6 +68,8 @@ class EditFunctionLib(serializers.Serializer):
|
|||||||
|
|
||||||
input_field_list = FunctionLibInputField(required=False, many=True)
|
input_field_list = FunctionLibInputField(required=False, many=True)
|
||||||
|
|
||||||
|
is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.char('是否可用'))
|
||||||
|
|
||||||
|
|
||||||
class CreateFunctionLib(serializers.Serializer):
|
class CreateFunctionLib(serializers.Serializer):
|
||||||
name = serializers.CharField(required=True, error_messages=ErrMessage.char("函数名称"))
|
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)
|
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 FunctionLibSerializer(serializers.Serializer):
|
||||||
class Query(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,
|
desc = serializers.CharField(required=False, allow_null=True, allow_blank=True,
|
||||||
error_messages=ErrMessage.char("函数描述"))
|
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"))
|
user_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("用户id"))
|
||||||
|
|
||||||
def get_query_set(self):
|
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:
|
if self.data.get('name') is not None:
|
||||||
query_set = query_set.filter(name__contains=self.data.get('name'))
|
query_set = query_set.filter(name__contains=self.data.get('name'))
|
||||||
if self.data.get('desc') is not None:
|
if self.data.get('desc') is not None:
|
||||||
query_set = query_set.filter(desc__contains=self.data.get('desc'))
|
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")
|
query_set = query_set.order_by("-create_time")
|
||||||
return query_set
|
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'),
|
function_lib = FunctionLib(id=uuid.uuid1(), name=instance.get('name'), desc=instance.get('desc'),
|
||||||
code=instance.get('code'),
|
code=instance.get('code'),
|
||||||
user_id=self.data.get('user_id'),
|
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()
|
function_lib.save()
|
||||||
return FunctionLibModelSerializer(function_lib).data
|
return FunctionLibModelSerializer(function_lib).data
|
||||||
|
|
||||||
@ -193,7 +207,7 @@ class FunctionLibSerializer(serializers.Serializer):
|
|||||||
if with_valid:
|
if with_valid:
|
||||||
self.is_valid(raise_exception=True)
|
self.is_valid(raise_exception=True)
|
||||||
EditFunctionLib(data=instance).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 (
|
edit_dict = {field: instance.get(field) for field in edit_field_list if (
|
||||||
field in instance and instance.get(field) is not None)}
|
field in instance and instance.get(field) is not None)}
|
||||||
QuerySet(FunctionLib).filter(id=self.data.get('id')).update(**edit_dict)
|
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="函数名称"),
|
'name': openapi.Schema(type=openapi.TYPE_STRING, title="函数名称", description="函数名称"),
|
||||||
'desc': 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="函数内容"),
|
'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,
|
'input_field_list': openapi.Schema(type=openapi.TYPE_ARRAY,
|
||||||
description="输入变量列表",
|
description="输入变量列表",
|
||||||
items=openapi.Schema(type=openapi.TYPE_OBJECT,
|
items=openapi.Schema(type=openapi.TYPE_OBJECT,
|
||||||
@ -135,11 +137,13 @@ class FunctionLibApi(ApiMixin):
|
|||||||
def get_request_body_api():
|
def get_request_body_api():
|
||||||
return openapi.Schema(
|
return openapi.Schema(
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=['name', 'code', 'input_field_list'],
|
required=['name', 'code', 'input_field_list', 'permission_type'],
|
||||||
properties={
|
properties={
|
||||||
'name': openapi.Schema(type=openapi.TYPE_STRING, title="函数名称", description="函数名称"),
|
'name': openapi.Schema(type=openapi.TYPE_STRING, title="函数名称", description="函数名称"),
|
||||||
'desc': 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="函数内容"),
|
'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,
|
'input_field_list': openapi.Schema(type=openapi.TYPE_ARRAY,
|
||||||
description="输入变量列表",
|
description="输入变量列表",
|
||||||
items=openapi.Schema(type=openapi.TYPE_OBJECT,
|
items=openapi.Schema(type=openapi.TYPE_OBJECT,
|
||||||
|
|||||||
@ -3,6 +3,7 @@ interface functionLibData {
|
|||||||
name: String
|
name: String
|
||||||
desc: String
|
desc: String
|
||||||
code?: String
|
code?: String
|
||||||
|
permission_type: 'PRIVATE' | 'PUBLIC'
|
||||||
input_field_list?: Array<any>
|
input_field_list?: Array<any>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -33,6 +33,32 @@
|
|||||||
@blur="form.desc = form.desc.trim()"
|
@blur="form.desc = form.desc.trim()"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</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>
|
</el-form>
|
||||||
<div class="flex-between">
|
<div class="flex-between">
|
||||||
<h4 class="title-decoration-1 mb-16">
|
<h4 class="title-decoration-1 mb-16">
|
||||||
@ -137,7 +163,7 @@ import functionLibApi from '@/api/function-lib'
|
|||||||
import type { FormInstance } from 'element-plus'
|
import type { FormInstance } from 'element-plus'
|
||||||
import { MsgSuccess, MsgConfirm } from '@/utils/message'
|
import { MsgSuccess, MsgConfirm } from '@/utils/message'
|
||||||
import { cloneDeep } from 'lodash'
|
import { cloneDeep } from 'lodash'
|
||||||
|
import { PermissionType, PermissionDesc } from '@/enums/model'
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
title: String
|
title: String
|
||||||
})
|
})
|
||||||
@ -158,7 +184,8 @@ const form = ref<functionLibData>({
|
|||||||
name: '',
|
name: '',
|
||||||
desc: '',
|
desc: '',
|
||||||
code: '',
|
code: '',
|
||||||
input_field_list: []
|
input_field_list: [],
|
||||||
|
permission_type: 'PRIVATE'
|
||||||
})
|
})
|
||||||
|
|
||||||
const dialogVisible = ref(false)
|
const dialogVisible = ref(false)
|
||||||
@ -173,7 +200,8 @@ watch(visible, (bool) => {
|
|||||||
name: '',
|
name: '',
|
||||||
desc: '',
|
desc: '',
|
||||||
code: '',
|
code: '',
|
||||||
input_field_list: []
|
input_field_list: [],
|
||||||
|
permission_type: 'PRIVATE'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user