Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions apps/application/migrations/0017_applicationapikey_remark.py
Original file line number Diff line number Diff line change
@@ -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="备注"),
),
]
7 changes: 4 additions & 3 deletions apps/application/models/application_api_key.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
90 changes: 48 additions & 42 deletions apps/application/serializers/application_api_key.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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()

Expand All @@ -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
Loading