diff --git a/baseapp-auth/baseapp_auth/graphql/object_types.py b/baseapp-auth/baseapp_auth/graphql/object_types.py index e7ee733f..a9d77807 100644 --- a/baseapp-auth/baseapp_auth/graphql/object_types.py +++ b/baseapp-auth/baseapp_auth/graphql/object_types.py @@ -48,7 +48,7 @@ def resolve_profiles(self, info): return Profile.objects.none() return Profile.objects.filter( Q(owner_id=info.context.user.id) | Q(members__user_id=info.context.user.id) - ) + ).distinct() interfaces += (UserProfiles, ProfileInterface) diff --git a/baseapp-auth/baseapp_auth/rest_framework/jwt/serializers.py b/baseapp-auth/baseapp_auth/rest_framework/jwt/serializers.py index ee07c6a7..eef80b0f 100644 --- a/baseapp-auth/baseapp_auth/rest_framework/jwt/serializers.py +++ b/baseapp-auth/baseapp_auth/rest_framework/jwt/serializers.py @@ -26,13 +26,12 @@ def get_claim_serializer_class(cls): class BaseJwtLoginSerializer( CustomClaimSerializerMixin, LoginPasswordExpirationMixin, TokenObtainPairSerializer ): - @classmethod - def get_token(cls, user): + def get_token(self, user): token = super().get_token(user) # Add custom claims - if cls._claim_serializer_class: - data = cls.get_claim_serializer_class()(user).data + if self._claim_serializer_class: + data = self.get_claim_serializer_class()(user, context=self.context).data for key, value in data.items(): token[key] = value diff --git a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py index e057c3b1..ba2d30bb 100644 --- a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py +++ b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py @@ -1,7 +1,11 @@ +import swapper + from datetime import timedelta from baseapp_auth.utils.referral_utils import get_user_referral_model, use_referrals +from baseapp_core.graphql import get_obj_relay_id from baseapp_core.rest_framework.serializers import ModelSerializer +from baseapp_core.rest_framework.fields import ThumbnailImageField from baseapp_referrals.utils import get_referral_code, get_user_from_referral_code from constance import config from django.contrib.auth import get_user_model @@ -14,21 +18,44 @@ from .fields import AvatarField User = get_user_model() +Profile = swapper.load_model("baseapp_profiles", "Profile") from baseapp_auth.password_validators import apply_password_validators +class JWTProfileSerializer(serializers.ModelSerializer): + """ + Serializes minimal profile data that will be attached to the JWT token as claim + """ + url_path = serializers.SlugField(required=False) + id = serializers.SerializerMethodField() + image = ThumbnailImageField(required=False, sizes={"small": (100,100)}) + + class Meta: + model = Profile + fields = ("id", "name", "image", "url_path") + + def get_id(self, profile): + return get_obj_relay_id(profile) + + def to_representation(self, profile): + data = super().to_representation(profile) + if (data['image'] != None): + data['image'] = data['image']['small'] + return data + + class UserBaseSerializer(ModelSerializer): - name = serializers.CharField(required=False, allow_blank=True, source="first_name") - avatar = AvatarField(required=False, allow_null=True) + profile = JWTProfileSerializer(read_only=True) email_verification_required = serializers.SerializerMethodField() referral_code = serializers.SerializerMethodField() referred_by_code = serializers.CharField(required=False, allow_blank=True, write_only=True) - + class Meta: model = User fields = ( "id", + "profile", "email", "is_email_verified", "email_verification_required", @@ -36,8 +63,6 @@ class Meta: "is_new_email_confirmed", "referral_code", "referred_by_code", - "avatar", - "name", "phone_number", "preferred_language", ) diff --git a/baseapp-profiles/baseapp_profiles/managers.py b/baseapp-profiles/baseapp_profiles/managers.py index d6cf1347..aff95e85 100644 --- a/baseapp-profiles/baseapp_profiles/managers.py +++ b/baseapp-profiles/baseapp_profiles/managers.py @@ -3,7 +3,7 @@ class ProfileManager(models.Manager): def filter_user_profiles(self, user): - return self.filter(models.Q(members__user=user) | models.Q(owner=user)) + return self.filter(models.Q(members__user=user) | models.Q(owner=user)).distinct() def get_if_member(self, user, **kwargs): if user.is_superuser: