feat: 函数库添加权限

This commit is contained in:
shaohuzhang1 2024-09-14 15:30:22 +08:00 committed by wangdan-fit2cloud
parent 56853a140d
commit c2217aa19e
7 changed files with 89 additions and 10 deletions

View File

@ -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:

View File

@ -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='权限类型'),
),
]

View File

@ -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"

View File

@ -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)

View File

@ -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,

View File

@ -3,6 +3,7 @@ interface functionLibData {
name: String
desc: String
code?: String
permission_type: 'PRIVATE' | 'PUBLIC'
input_field_list?: Array<any>
}

View File

@ -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'
}
}
})