application_access_token.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. # coding=utf-8
  2. """
  3. @project: MaxKB
  4. @Author:虎虎
  5. @file: application_access_token.py
  6. @date:2025/6/9 17:49
  7. @desc:
  8. """
  9. import hashlib
  10. import uuid_utils.compat as uuid
  11. from django.core.cache import cache
  12. from django.db.models import QuerySet
  13. from django.utils.translation import gettext_lazy as _
  14. from rest_framework import serializers
  15. from application.models import ApplicationAccessToken, Application
  16. from common.constants.cache_version import Cache_Version
  17. from common.database_model_manage.database_model_manage import DatabaseModelManage
  18. from common.exception.app_exception import AppApiException
  19. class AccessTokenEditSerializer(serializers.Serializer):
  20. access_token_reset = serializers.BooleanField(required=False,
  21. label=_("Reset Token"))
  22. is_active = serializers.BooleanField(required=False, label=_("Is it enabled"))
  23. access_num = serializers.IntegerField(required=False, max_value=10000000,
  24. min_value=0,
  25. label=_("Number of visits"))
  26. white_active = serializers.BooleanField(required=False,
  27. label=_("Whether to enable whitelist"))
  28. white_list = serializers.ListSerializer(required=False, child=serializers.CharField(required=True,
  29. label=_("Whitelist")),
  30. label=_("Whitelist")),
  31. show_source = serializers.BooleanField(required=False,
  32. label=_("Whether to display knowledge sources"))
  33. show_exec = serializers.BooleanField(required=False,
  34. label=_("Display execution details"))
  35. language = serializers.CharField(required=False, allow_blank=True, allow_null=True,
  36. label=_("language"))
  37. authentication = serializers.BooleanField(default=False, label="Do you need authentication")
  38. authentication_value = serializers.JSONField(required=False, label="Certified value", default=dict)
  39. class AccessTokenSerializer(serializers.Serializer):
  40. application_id = serializers.UUIDField(required=True, label=_("Application ID"))
  41. workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
  42. def is_valid(self, *, raise_exception=False):
  43. super().is_valid(raise_exception=True)
  44. workspace_id = self.data.get('workspace_id')
  45. query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
  46. if workspace_id:
  47. query_set = query_set.filter(workspace_id=workspace_id)
  48. if not query_set.exists():
  49. raise AppApiException(500, _('Application id does not exist'))
  50. def edit(self, instance):
  51. self.is_valid(raise_exception=True)
  52. AccessTokenEditSerializer(data=instance).is_valid(raise_exception=True)
  53. application_access_token = QuerySet(ApplicationAccessToken).get(
  54. application_id=self.data.get('application_id'))
  55. if 'is_active' in instance:
  56. application_access_token.is_active = instance.get("is_active")
  57. if 'access_token_reset' in instance and instance.get('access_token_reset'):
  58. application_access_token.access_token = hashlib.md5(str(uuid.uuid7()).encode()).hexdigest()[8:24]
  59. if 'access_num' in instance and instance.get('access_num') is not None:
  60. application_access_token.access_num = instance.get("access_num")
  61. if 'white_active' in instance and instance.get('white_active') is not None:
  62. application_access_token.white_active = instance.get("white_active")
  63. if 'white_list' in instance and instance.get('white_list') is not None:
  64. application_access_token.white_list = instance.get('white_list')
  65. if 'show_source' in instance and instance.get('show_source') is not None:
  66. application_access_token.show_source = instance.get('show_source')
  67. if 'show_exec' in instance and instance.get('show_exec') is not None:
  68. application_access_token.show_exec = instance.get('show_exec')
  69. if 'language' in instance and instance.get('language') is not None:
  70. application_access_token.language = instance.get('language')
  71. if 'language' not in instance or instance.get('language') is None:
  72. application_access_token.language = None
  73. application_access_token.save()
  74. license_is_valid = cache.get(Cache_Version.SYSTEM.get_key(key='license_is_valid'),
  75. version=Cache_Version.SYSTEM.get_version())
  76. if license_is_valid:
  77. if instance.get('authentication') is not None and instance.get(
  78. 'authentication_value') is not None:
  79. application_access_token.authentication = instance.get('authentication')
  80. application_access_token.authentication_value = instance.get('authentication_value')
  81. application_access_token.save()
  82. return self.one(with_valid=False)
  83. def one(self, with_valid=True):
  84. if with_valid:
  85. self.is_valid(raise_exception=True)
  86. application_id = self.data.get("application_id")
  87. application_access_token = QuerySet(ApplicationAccessToken).filter(
  88. application_id=application_id).first()
  89. if application_access_token is None:
  90. application_access_token = ApplicationAccessToken(application_id=application_id,
  91. access_token=hashlib.md5(
  92. str(uuid.uuid7()).encode()).hexdigest()[
  93. 8:24], is_active=True)
  94. application_access_token.save()
  95. other = {}
  96. license_is_valid = cache.get(Cache_Version.SYSTEM.get_key(key='license_is_valid'),
  97. version=Cache_Version.SYSTEM.get_version())
  98. if license_is_valid:
  99. other = {'authentication': application_access_token.authentication,
  100. 'authentication_value': application_access_token.authentication_value}
  101. return {'application_id': application_access_token.application_id,
  102. 'access_token': application_access_token.access_token,
  103. "is_active": application_access_token.is_active,
  104. 'access_num': application_access_token.access_num,
  105. 'white_active': application_access_token.white_active,
  106. 'white_list': application_access_token.white_list,
  107. 'show_source': application_access_token.show_source,
  108. 'show_exec': application_access_token.show_exec,
  109. 'language': application_access_token.language,
  110. **other,
  111. }