application_api_key.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import hashlib
  2. import uuid_utils.compat as uuid
  3. from django.db.models import QuerySet
  4. from django.utils import timezone
  5. from django.utils.translation import gettext_lazy as _
  6. from rest_framework import serializers
  7. from application.models import Application
  8. from application.models.application_api_key import ApplicationApiKey
  9. from common.cache_data.application_api_key_cache import get_application_api_key, del_application_api_key
  10. from common.db.search import page_search
  11. from common.exception.app_exception import AppApiException
  12. class ApplicationKeySerializerModel(serializers.ModelSerializer):
  13. class Meta:
  14. model = ApplicationApiKey
  15. fields = "__all__"
  16. class EditApplicationKeySerializer(serializers.Serializer):
  17. is_active = serializers.BooleanField(required=False, label=_("Availability"))
  18. allow_cross_domain = serializers.BooleanField(required=False,
  19. label=_("Is cross-domain allowed"))
  20. cross_domain_list = serializers.ListSerializer(required=False,
  21. child=serializers.CharField(required=True,
  22. label=_("Cross-domain address")),
  23. label=_("Cross-domain list"))
  24. is_permanent = serializers.BooleanField(required=False, label=_("Is permanent"))
  25. expire_time = serializers.DateTimeField(required=False, allow_null=True, label=_("Expiration time"))
  26. class ApplicationKeySerializer(serializers.Serializer):
  27. workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
  28. application_id = serializers.UUIDField(required=True, label=_('application id'))
  29. order_by = serializers.CharField(required=False, label=_('order by'), allow_null=True, allow_blank=True)
  30. def is_valid(self, *, raise_exception=False):
  31. super().is_valid(raise_exception=True)
  32. workspace_id = self.data.get('workspace_id')
  33. query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
  34. if workspace_id:
  35. query_set = query_set.filter(workspace_id=workspace_id)
  36. if not query_set.exists():
  37. raise AppApiException(500, _('Application id does not exist'))
  38. def generate(self, with_valid=True):
  39. if with_valid:
  40. self.is_valid(raise_exception=True)
  41. application_id = self.data.get("application_id")
  42. secret_key = 'agent-' + hashlib.md5(str(uuid.uuid7()).encode()).hexdigest()
  43. application_api_key = ApplicationApiKey(id=uuid.uuid7(),
  44. secret_key=secret_key,
  45. application_id=application_id)
  46. application_api_key.save()
  47. return ApplicationKeySerializerModel(application_api_key).data
  48. def page(self, current_page: int, page_size: int, with_valid=True):
  49. if with_valid:
  50. self.is_valid(raise_exception=True)
  51. application_id = self.data.get("application_id")
  52. query_set = QuerySet(ApplicationApiKey).filter(application_id=application_id)
  53. order_by = '-create_time' if self.data.get('order_by') is None or self.data.get(
  54. 'order_by') == '' else self.data.get('order_by')
  55. query_set = query_set.order_by(order_by)
  56. return page_search(current_page, page_size,
  57. query_set,
  58. post_records_handler=lambda u: ApplicationKeySerializerModel(u).data)
  59. class Operate(serializers.Serializer):
  60. workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
  61. application_id = serializers.UUIDField(required=True, label=_('application id'))
  62. api_key_id = serializers.UUIDField(required=True, label=_('ApiKeyId'))
  63. def is_valid(self, *, raise_exception=False):
  64. super().is_valid(raise_exception=True)
  65. workspace_id = self.data.get('workspace_id')
  66. query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
  67. if workspace_id:
  68. query_set = query_set.filter(workspace_id=workspace_id)
  69. if not query_set.exists():
  70. raise AppApiException(500, _('Application id does not exist'))
  71. def delete(self, with_valid=True):
  72. if with_valid:
  73. self.is_valid(raise_exception=True)
  74. api_key_id = self.data.get("api_key_id")
  75. application_id = self.data.get('application_id')
  76. application_api_key = QuerySet(ApplicationApiKey).filter(id=api_key_id,
  77. application_id=application_id).first()
  78. del_application_api_key(application_api_key.secret_key)
  79. application_api_key.delete()
  80. def edit(self, instance, with_valid=True):
  81. if with_valid:
  82. self.is_valid(raise_exception=True)
  83. EditApplicationKeySerializer(data=instance).is_valid(raise_exception=True)
  84. api_key_id = self.data.get("api_key_id")
  85. application_id = self.data.get('application_id')
  86. application_api_key = QuerySet(ApplicationApiKey).filter(id=api_key_id,
  87. application_id=application_id).first()
  88. if application_api_key is None:
  89. raise AppApiException(500, _('APIKey does not exist'))
  90. if 'is_active' in instance and instance.get('is_active') is not None:
  91. application_api_key.is_active = instance.get('is_active')
  92. if 'allow_cross_domain' in instance and instance.get('allow_cross_domain') is not None:
  93. application_api_key.allow_cross_domain = instance.get('allow_cross_domain')
  94. if 'cross_domain_list' in instance and instance.get('cross_domain_list') is not None:
  95. application_api_key.cross_domain_list = instance.get('cross_domain_list')
  96. if 'is_permanent' in instance and instance.get('is_permanent') is not None:
  97. application_api_key.is_permanent = instance.get('is_permanent')
  98. if not application_api_key.is_permanent:
  99. application_api_key.expire_time = instance.get('expire_time')
  100. else:
  101. application_api_key.expire_time = timezone.now()
  102. application_api_key.save()
  103. # 写入缓存
  104. get_application_api_key('Bearer ' + application_api_key.secret_key, False)
  105. return True