From 3e27f0e7c825fe35199a442baff8c9436359626b Mon Sep 17 00:00:00 2001 From: hexiaonan-800 Date: Tue, 27 Oct 2026 10:50:23 +0800 Subject: [PATCH] feat: application api key remark --- .../0017_applicationapikey_remark.py | 17 ++++ .../application/models/application_api_key.py | 7 +- .../serializers/application_api_key.py | 90 ++++++++++--------- 3 files changed, 69 insertions(+), 45 deletions(-) create mode 100644 apps/application/migrations/0017_applicationapikey_remark.py diff --git a/apps/application/migrations/0017_applicationapikey_remark.py b/apps/application/migrations/0017_applicationapikey_remark.py new file mode 100644 index 00000000000..0d82f935526 --- /dev/null +++ b/apps/application/migrations/0017_applicationapikey_remark.py @@ -0,0 +1,17 @@ +# Generated by Django 6.1.2 on 2026-10-27 02:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("application", "0016_v3_upgrade"), + ] + + operations = [ + migrations.AddField( + model_name="applicationapikey", + name="remark", + field=models.CharField(blank=True, default="", max_length=256, verbose_name="备注"), + ), + ] diff --git a/apps/application/models/application_api_key.py b/apps/application/models/application_api_key.py index a605bb00183..1fcecafd545 100644 --- a/apps/application/models/application_api_key.py +++ b/apps/application/models/application_api_key.py @@ -15,11 +15,12 @@ class ApplicationApiKey(AppModelMixin): application = models.ForeignKey(Application, on_delete=models.CASCADE, verbose_name="应用id") is_active = models.BooleanField(default=True, verbose_name="是否开启") allow_cross_domain = models.BooleanField(default=False, verbose_name="是否允许跨域") - cross_domain_list = ArrayField(verbose_name="跨域列表", - base_field=models.CharField(max_length=128, blank=True) - , default=list) + cross_domain_list = ArrayField( + verbose_name="跨域列表", base_field=models.CharField(max_length=128, blank=True), default=list + ) expire_time = models.DateTimeField(verbose_name="过期时间", default=timezone.now) is_permanent = models.BooleanField(default=True, verbose_name="是否永久") + remark = models.CharField(max_length=256, verbose_name="备注", blank=True, default="") 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..2603e46b634 100644 --- a/apps/application/serializers/application_api_key.py +++ b/apps/application/serializers/application_api_key.py @@ -22,39 +22,38 @@ class Meta: class EditApplicationKeySerializer(serializers.Serializer): is_active = serializers.BooleanField(required=False, label=_("Availability")) - allow_cross_domain = serializers.BooleanField(required=False, - label=_("Is cross-domain allowed")) + allow_cross_domain = serializers.BooleanField(required=False, label=_("Is cross-domain allowed")) - cross_domain_list = serializers.ListSerializer(required=False, - child=serializers.CharField(required=True, - label=_("Cross-domain address")), - label=_("Cross-domain list")) + cross_domain_list = serializers.ListSerializer( + required=False, + child=serializers.CharField(required=True, label=_("Cross-domain address")), + label=_("Cross-domain list"), + ) is_permanent = serializers.BooleanField(required=False, label=_("Is permanent")) expire_time = serializers.DateTimeField(required=False, allow_null=True, label=_("Expiration time")) + remark = serializers.CharField(required=False, label=_("Remark")) 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')) - order_by = serializers.CharField(required=False, label=_('order by'), allow_null=True, allow_blank=True) + application_id = serializers.UUIDField(required=True, label=_("application id")) + order_by = serializers.CharField(required=False, label=_("order by"), allow_null=True, allow_blank=True) def is_valid(self, *, raise_exception=False): super().is_valid(raise_exception=True) - workspace_id = self.data.get('workspace_id') - query_set = QuerySet(Application).filter(id=self.data.get('application_id')) + workspace_id = self.data.get("workspace_id") + query_set = QuerySet(Application).filter(id=self.data.get("application_id")) if workspace_id: query_set = query_set.filter(workspace_id=workspace_id) if not query_set.exists(): - raise AppApiException(500, _('Application id does not exist')) + raise AppApiException(500, _("Application id does not exist")) def generate(self, with_valid=True): if with_valid: self.is_valid(raise_exception=True) application_id = self.data.get("application_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) + 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_api_key.save() return ApplicationKeySerializerModel(application_api_key).data @@ -63,34 +62,38 @@ def page(self, current_page: int, page_size: int, with_valid=True): self.is_valid(raise_exception=True) application_id = self.data.get("application_id") query_set = QuerySet(ApplicationApiKey).filter(application_id=application_id) - order_by = '-create_time' if self.data.get('order_by') is None or self.data.get( - 'order_by') == '' else self.data.get('order_by') + 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) - return page_search(current_page, page_size, - query_set, - post_records_handler=lambda u: ApplicationKeySerializerModel(u).data) + return page_search( + current_page, page_size, query_set, post_records_handler=lambda u: ApplicationKeySerializerModel(u).data + ) class Operate(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')) - api_key_id = serializers.UUIDField(required=True, label=_('ApiKeyId')) + application_id = serializers.UUIDField(required=True, label=_("application id")) + api_key_id = serializers.UUIDField(required=True, label=_("ApiKeyId")) def is_valid(self, *, raise_exception=False): super().is_valid(raise_exception=True) - workspace_id = self.data.get('workspace_id') - query_set = QuerySet(Application).filter(id=self.data.get('application_id')) + workspace_id = self.data.get("workspace_id") + query_set = QuerySet(Application).filter(id=self.data.get("application_id")) if workspace_id: query_set = query_set.filter(workspace_id=workspace_id) if not query_set.exists(): - raise AppApiException(500, _('Application id does not exist')) + raise AppApiException(500, _("Application id does not exist")) def delete(self, with_valid=True): if with_valid: self.is_valid(raise_exception=True) 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() + application_id = self.data.get("application_id") + application_api_key = ( + QuerySet(ApplicationApiKey).filter(id=api_key_id, application_id=application_id).first() + ) del_application_api_key(application_api_key.secret_key) application_api_key.delete() @@ -99,24 +102,27 @@ def edit(self, instance, with_valid=True): self.is_valid(raise_exception=True) EditApplicationKeySerializer(data=instance).is_valid(raise_exception=True) 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() + 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, _('APIKey does not exist')) - if 'is_active' in instance and instance.get('is_active') is not None: - application_api_key.is_active = instance.get('is_active') - if 'allow_cross_domain' in instance and instance.get('allow_cross_domain') is not None: - application_api_key.allow_cross_domain = instance.get('allow_cross_domain') - if 'cross_domain_list' in instance and instance.get('cross_domain_list') is not None: - application_api_key.cross_domain_list = instance.get('cross_domain_list') - if 'is_permanent' in instance and instance.get('is_permanent') is not None: - application_api_key.is_permanent = instance.get('is_permanent') + raise AppApiException(500, _("APIKey does not exist")) + if "is_active" in instance and instance.get("is_active") is not None: + application_api_key.is_active = instance.get("is_active") + if "allow_cross_domain" in instance and instance.get("allow_cross_domain") is not None: + application_api_key.allow_cross_domain = instance.get("allow_cross_domain") + if "cross_domain_list" in instance and instance.get("cross_domain_list") is not None: + application_api_key.cross_domain_list = instance.get("cross_domain_list") + if "is_permanent" in instance and instance.get("is_permanent") is not None: + application_api_key.is_permanent = instance.get("is_permanent") if not application_api_key.is_permanent: - application_api_key.expire_time = instance.get('expire_time') + application_api_key.expire_time = instance.get("expire_time") else: application_api_key.expire_time = timezone.now() + if "remark" in instance and instance.get("remark") is not None: + application_api_key.remark = instance.get("remark") application_api_key.save() # 写入缓存 - get_application_api_key('Bearer ' + application_api_key.secret_key, False) + get_application_api_key("Bearer " + application_api_key.secret_key, False) return True