diff --git a/apps/application/models/application_api_key.py b/apps/application/models/application_api_key.py index a605bb00183..06c9e4b522a 100644 --- a/apps/application/models/application_api_key.py +++ b/apps/application/models/application_api_key.py @@ -20,6 +20,8 @@ class ApplicationApiKey(AppModelMixin): , default=list) expire_time = models.DateTimeField(verbose_name="过期时间", default=timezone.now) is_permanent = models.BooleanField(default=True, verbose_name="是否永久") + user = models.ForeignKey("users.User", on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True, + verbose_name="创建用户") class Meta: db_table = "application_api_key" diff --git a/apps/application/serializers/application_api_key.py b/apps/application/serializers/application_api_key.py index 88b4a5591ad..b0818e6f0a0 100644 --- a/apps/application/serializers/application_api_key.py +++ b/apps/application/serializers/application_api_key.py @@ -1,6 +1,7 @@ import hashlib import uuid_utils.compat as uuid +from django.core.exceptions import ObjectDoesNotExist from django.db.models import QuerySet from django.utils import timezone from django.utils.translation import gettext_lazy as _ @@ -14,10 +15,26 @@ class ApplicationKeySerializerModel(serializers.ModelSerializer): + user = serializers.SerializerMethodField() + class Meta: model = ApplicationApiKey fields = "__all__" + @staticmethod + def get_user(obj): + if not obj.user_id: + return None + try: + user = obj.user + except ObjectDoesNotExist: + return None + return { + "id": obj.user_id, + "username": user.username, + "nick_name": user.nick_name, + } + class EditApplicationKeySerializer(serializers.Serializer): is_active = serializers.BooleanField(required=False, label=_("Availability")) @@ -36,6 +53,7 @@ class EditApplicationKeySerializer(serializers.Serializer): class ApplicationKeySerializer(serializers.Serializer): workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID")) application_id = serializers.UUIDField(required=True, label=_('application id')) + user_id = serializers.UUIDField(required=False, allow_null=True, label=_('user id')) order_by = serializers.CharField(required=False, label=_('order by'), allow_null=True, allow_blank=True) def is_valid(self, *, raise_exception=False): @@ -51,10 +69,12 @@ def generate(self, with_valid=True): if with_valid: self.is_valid(raise_exception=True) application_id = self.data.get("application_id") + user_id = self.data.get("user_id") secret_key = 'agent-' + hashlib.md5(str(uuid.uuid7()).encode()).hexdigest() application_api_key = ApplicationApiKey(id=uuid.uuid7(), secret_key=secret_key, - application_id=application_id) + application_id=application_id, + user_id=user_id) application_api_key.save() return ApplicationKeySerializerModel(application_api_key).data @@ -62,7 +82,7 @@ def page(self, current_page: int, page_size: int, with_valid=True): if with_valid: self.is_valid(raise_exception=True) application_id = self.data.get("application_id") - query_set = QuerySet(ApplicationApiKey).filter(application_id=application_id) + query_set = QuerySet(ApplicationApiKey).filter(application_id=application_id).select_related('user') order_by = '-create_time' if self.data.get('order_by') is None or self.data.get( 'order_by') == '' else self.data.get('order_by') query_set = query_set.order_by(order_by) diff --git a/apps/application/views/application_api_key.py b/apps/application/views/application_api_key.py index 213c8fe7221..63a1fa98bf8 100644 --- a/apps/application/views/application_api_key.py +++ b/apps/application/views/application_api_key.py @@ -49,7 +49,8 @@ class ApplicationKey(APIView): def post(self, request: Request, workspace_id: str, application_id: str): return result.success(ApplicationKeySerializer( data={'application_id': application_id, - 'workspace_id': workspace_id}).generate()) + 'workspace_id': workspace_id, + 'user_id': request.user.id}).generate()) class Page(APIView): authentication_classes = [TokenAuth] diff --git a/ui/src/views/application-overview/component/APIKeyDialog.vue b/ui/src/views/application-overview/component/APIKeyDialog.vue index 0c7ceb0cf5a..585fb07dfdc 100644 --- a/ui/src/views/application-overview/component/APIKeyDialog.vue +++ b/ui/src/views/application-overview/component/APIKeyDialog.vue @@ -81,6 +81,11 @@ + + +