feat: 应用 ApiKey 开关

This commit is contained in:
shaohuzhang1 2023-12-08 13:58:21 +08:00
parent 18dc8a0cfb
commit 44a88f647b
6 changed files with 77 additions and 8 deletions

View File

@ -0,0 +1,26 @@
# Generated by Django 4.1.10 on 2023-12-08 05:51
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('application', '0007_application_api_key_is_active_alter_application_desc_and_more'),
]
operations = [
migrations.RemoveField(
model_name='application',
name='api_key_is_active',
),
migrations.RemoveField(
model_name='application',
name='status',
),
migrations.AddField(
model_name='applicationapikey',
name='is_active',
field=models.BooleanField(default=True, verbose_name='是否开启'),
),
]

View File

@ -20,7 +20,7 @@ class ApplicationApiKey(AppModelMixin):
secret_key = models.CharField(max_length=1024, verbose_name="秘钥", unique=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户id")
application = models.ForeignKey(Application, on_delete=models.CASCADE, verbose_name="应用id")
is_active = models.BooleanField(default=True, verbose_name="是否开启")
class Meta:
db_table = "application_api_key"

View File

@ -25,10 +25,8 @@ class Application(AppModelMixin):
prologue = models.CharField(max_length=1024, verbose_name="开场白", default="")
example = ArrayField(verbose_name="示例列表", base_field=models.CharField(max_length=256, blank=True))
dialogue_number = models.IntegerField(default=0, verbose_name="会话数量")
status = models.BooleanField(default=True, verbose_name="是否发布")
user = models.ForeignKey(User, on_delete=models.DO_NOTHING)
model = models.ForeignKey(Model, on_delete=models.DO_NOTHING, db_constraint=False)
api_key_is_active = models.BooleanField(verbose_name="api_key是否可用", default=True)
class Meta:
db_table = "application"

View File

@ -133,8 +133,6 @@ class ApplicationSerializer(serializers.Serializer):
prologue = serializers.CharField(required=False)
example = serializers.ListSerializer(required=False, child=serializers.CharField(required=True))
dataset_id_list = serializers.ListSerializer(required=False, child=serializers.UUIDField(required=True))
status = serializers.BooleanField(required=False)
api_key_is_active = serializers.BooleanField(required=False)
def is_valid(self, *, user_id=None, raise_exception=False):
super().is_valid(raise_exception=True)
@ -355,6 +353,9 @@ class ApplicationSerializer(serializers.Serializer):
application_api_key in
QuerySet(ApplicationApiKey).filter(user_id=user_id, application_id=application_id)]
class Edit(serializers.Serializer):
is_active = serializers.BooleanField(required=False)
class Operate(serializers.Serializer):
application_id = serializers.UUIDField(required=True)
@ -367,3 +368,19 @@ class ApplicationSerializer(serializers.Serializer):
application_id = self.data.get('application_id')
QuerySet(ApplicationApiKey).filter(id=api_key_id,
application_id=application_id).delete()
def edit(self, instance, with_valid=True):
if with_valid:
self.is_valid(raise_exception=True)
ApplicationSerializer.Edit(data=instance).is_valid(raise_exception=True)
if 'is_active' in instance and instance.get('is_active') is not None:
api_key_id = self.data.get("api_key_id")
application_id = self.data.get('application_id')
application_api_key = QuerySet(ApplicationApiKey).filter(id=api_key_id,
application_id=application_id).first()
if application_api_key is None:
raise AppApiException(500, '不存在')
application_api_key.is_active = instance.get('is_active')
application_api_key.save()

View File

@ -91,6 +91,18 @@ class ApplicationApi(ApiMixin):
description='应用api_key id')
]
@staticmethod
def get_request_body_api():
return openapi.Schema(
type=openapi.TYPE_OBJECT,
required=[],
properties={
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否激活",
description="是否激活"),
}
)
class AccessToken(ApiMixin):
@staticmethod
def get_request_params_api():
@ -134,9 +146,6 @@ class ApplicationApi(ApiMixin):
'dataset_id_list': openapi.Schema(type=openapi.TYPE_ARRAY,
items=openapi.Schema(type=openapi.TYPE_STRING),
title="关联数据集Id列表", description="关联数据集Id列表"),
'status': openapi.Schema(type=openapi.TYPE_BOOLEAN, title='状态', description="状态"),
'api_key_is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title='api_key是否可用',
default=True)
}
)

View File

@ -77,6 +77,25 @@ class Application(APIView):
class Operate(APIView):
authentication_classes = [TokenAuth]
@action(methods=['PUT'], detail=False)
@swagger_auto_schema(operation_summary="修改应用API_KEY",
operation_id="修改应用API_KEY",
tags=['应用/API_KEY'],
manual_parameters=ApplicationApi.ApiKey.Operate.get_request_params_api(),
request_body=ApplicationApi.ApiKey.Operate.get_request_body_api())
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
dynamic_tag=keywords.get('application_id'))],
compare=CompareConstants.AND), lambda r, k: Permission(group=Group.APPLICATION, operate=Operate.DELETE,
dynamic_tag=k.get('application_id')),
compare=CompareConstants.AND)
def put(self, request: Request, application_id: str, api_key_id: str):
return result.success(
ApplicationSerializer.ApplicationKeySerializer.Operate(
data={'application_id': application_id, 'user_id': request.user.id,
'api_key_id': api_key_id}).edit(request.data))
@action(methods=['DELETE'], detail=False)
@swagger_auto_schema(operation_summary="删除应用API_KEY",
operation_id="删除应用API_KEY",