diff --git a/apps/users/api/user.py b/apps/users/api/user.py index 8cc3b6105..122f9e7fa 100644 --- a/apps/users/api/user.py +++ b/apps/users/api/user.py @@ -10,7 +10,7 @@ from rest_framework_bulk.generics import BulkModelViewSet from common.api import CommonApiMixin, SuggestionMixin from common.drf.filters import AttrRulesFilterBackend -from common.utils import get_logger +from common.utils import get_logger, is_uuid from orgs.utils import current_org, tmp_to_root_org from rbac.models import Role, RoleBinding from rbac.permissions import RBACPermission @@ -52,6 +52,12 @@ class UserViewSet(CommonApiMixin, UserQuerysetMixin, SuggestionMixin, BulkModelV 'bulk_remove': 'users.remove_user', } + def get_object(self): + pk = self.kwargs.get(self.lookup_field) + if not is_uuid(pk): + return self.get_queryset().get(username=pk) + return super().get_object() + def allow_bulk_destroy(self, qs, filtered): is_valid = filtered.count() < qs.count() if not is_valid: diff --git a/apps/users/models/user/_auth.py b/apps/users/models/user/_auth.py index 0dd5f165b..66b429b3c 100644 --- a/apps/users/models/user/_auth.py +++ b/apps/users/models/user/_auth.py @@ -146,6 +146,11 @@ class AuthMixin: def can_create_ssh_key(self): return self.ssh_keys.count() < settings.TERMINAL_SSH_KEY_LIMIT_COUNT + @lazyproperty + def has_public_keys(self): + count = self.ssh_keys.filter(is_active=True).count() + return count > 0 + def can_update_password(self): return self.is_local diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index e494234c9..8256e00bf 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -394,9 +394,13 @@ class UserRetrieveSerializer(UserSerializer): login_confirm_settings = serializers.PrimaryKeyRelatedField( read_only=True, source="login_confirm_setting.reviewers", many=True ) + has_public_keys = serializers.BooleanField( + label=_("Has public keys"), + read_only=True, + ) class Meta(UserSerializer.Meta): - fields = UserSerializer.Meta.fields + ["login_confirm_settings"] + fields = UserSerializer.Meta.fields + ["login_confirm_settings", "has_public_keys"] class SmsUserSerializer(serializers.ModelSerializer):