From fdcae3e48c3491f0d2c2d8382e8092cd3fbf57cd Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Thu, 14 Nov 2024 17:52:39 +0100 Subject: [PATCH 01/15] BA-1808 [BE] Add .distinct() when filtering profiles --- baseapp-auth/baseapp_auth/graphql/object_types.py | 2 +- baseapp-profiles/baseapp_profiles/managers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/baseapp-auth/baseapp_auth/graphql/object_types.py b/baseapp-auth/baseapp_auth/graphql/object_types.py index 0d4ea0b6..2426a2c3 100644 --- a/baseapp-auth/baseapp_auth/graphql/object_types.py +++ b/baseapp-auth/baseapp_auth/graphql/object_types.py @@ -49,7 +49,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-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: From 20d2f0ba96c37d7d7992dbcf12ab96135d6d5439 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Thu, 14 Nov 2024 17:53:20 +0100 Subject: [PATCH 02/15] BA-1808 [BE] add profile key to user serializer --- .../rest_framework/users/serializers.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py index e057c3b1..274ae179 100644 --- a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py +++ b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py @@ -1,3 +1,5 @@ +import swapper + from datetime import timedelta from baseapp_auth.utils.referral_utils import get_user_referral_model, use_referrals @@ -14,21 +16,29 @@ 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 ProfileSerializer(ModelSerializer): + url_path = serializers.SlugField(required=False) + + class Meta: + model = Profile + fields = ("id", "name", "image", "url_path") + class UserBaseSerializer(ModelSerializer): - name = serializers.CharField(required=False, allow_blank=True, source="first_name") - avatar = AvatarField(required=False, allow_null=True) + profile = ProfileSerializer(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 +46,6 @@ class Meta: "is_new_email_confirmed", "referral_code", "referred_by_code", - "avatar", - "name", "phone_number", "preferred_language", ) From 60c05e01d57aa97e96ba5eb1d4474ad79a0d8b33 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Thu, 21 Nov 2024 17:56:26 -0500 Subject: [PATCH 03/15] BA-1808 pass context to claim serializer This allows the claim serializer to convert the profile image urls into absolute urls. --- .../baseapp_auth/rest_framework/jwt/serializers.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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 From a2fc37312863e80395bbd3d5cc88fa29671cdf12 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Thu, 21 Nov 2024 17:57:14 -0500 Subject: [PATCH 04/15] BA-1808 Pass profile image also in small resolution --- baseapp-auth/baseapp_auth/rest_framework/users/serializers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py index 274ae179..171aacb4 100644 --- a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py +++ b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py @@ -4,6 +4,7 @@ from baseapp_auth.utils.referral_utils import get_user_referral_model, use_referrals 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 @@ -22,6 +23,7 @@ class ProfileSerializer(ModelSerializer): url_path = serializers.SlugField(required=False) + image = ThumbnailImageField(required=False, sizes={"small": (100,100)}) class Meta: model = Profile From db60f95837fc9b1f3b5910e22cdbc21c25d0a686 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Mon, 25 Nov 2024 15:03:08 -0500 Subject: [PATCH 05/15] BA-1808 Serialize profile id as relay id --- .../rest_framework/users/serializers.py | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py index 171aacb4..20766b21 100644 --- a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py +++ b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py @@ -3,6 +3,7 @@ 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 @@ -21,17 +22,32 @@ from baseapp_auth.password_validators import apply_password_validators -class ProfileSerializer(ModelSerializer): - url_path = serializers.SlugField(required=False) - image = ThumbnailImageField(required=False, sizes={"small": (100,100)}) +class JWTProfileSerializer(serializers.ModelSerializer): + """ + Serializes minimal profile data that will be attached to the JWT token as claim + """ + url_path = serializers.SerializerMethodField() # serializers.SlugField(required=False) + id = serializers.SerializerMethodField() + image = ThumbnailImageField(required=False, sizes={"url": (100,100)}) class Meta: model = Profile fields = ("id", "name", "image", "url_path") + def get_url_path(self, profile): + return { 'path': profile.url_path.path} + + def get_id(self, profile): + return get_obj_relay_id(profile) + + def to_representation(self, instance): + data = super().to_representation(instance) + data['image'].pop('full_size') + return data + class UserBaseSerializer(ModelSerializer): - profile = ProfileSerializer(read_only=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) From 4301d0279d75ffe9d9040ab76efec3901217d694 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Wed, 27 Nov 2024 10:26:53 -0500 Subject: [PATCH 06/15] BA-1808 Change JWT profile serializer to simplify data structure --- .../rest_framework/users/serializers.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py index 20766b21..ba2d30bb 100644 --- a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py +++ b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py @@ -22,27 +22,26 @@ 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.SerializerMethodField() # serializers.SlugField(required=False) + url_path = serializers.SlugField(required=False) id = serializers.SerializerMethodField() - image = ThumbnailImageField(required=False, sizes={"url": (100,100)}) + image = ThumbnailImageField(required=False, sizes={"small": (100,100)}) class Meta: model = Profile fields = ("id", "name", "image", "url_path") - def get_url_path(self, profile): - return { 'path': profile.url_path.path} - def get_id(self, profile): return get_obj_relay_id(profile) - def to_representation(self, instance): - data = super().to_representation(instance) - data['image'].pop('full_size') + def to_representation(self, profile): + data = super().to_representation(profile) + if (data['image'] != None): + data['image'] = data['image']['small'] return data From 006163d3f52c869b660fa8c43bd6e223921d3d70 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Thu, 28 Nov 2024 13:46:38 -0500 Subject: [PATCH 07/15] BA-1808 Fix typo --- baseapp-auth/baseapp_auth/rest_framework/users/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py index ba2d30bb..bf2b1f4f 100644 --- a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py +++ b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py @@ -40,7 +40,7 @@ def get_id(self, profile): def to_representation(self, profile): data = super().to_representation(profile) - if (data['image'] != None): + if data['image'] is not None: data['image'] = data['image']['small'] return data From 6b08d9e427a5401be3940cf212434e552de60674 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Tue, 3 Dec 2024 14:05:09 -0500 Subject: [PATCH 08/15] BA-1808 Fix integration tests --- .../rest_framework/users/serializers.py | 4 ++- .../tests/integration/test_login.py | 2 +- .../tests/integration/test_users.py | 27 +++++++++++++++---- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py index bf2b1f4f..f98556bb 100644 --- a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py +++ b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py @@ -27,7 +27,7 @@ class JWTProfileSerializer(serializers.ModelSerializer): """ Serializes minimal profile data that will be attached to the JWT token as claim """ - url_path = serializers.SlugField(required=False) + url_path = serializers.SlugField(required=False, allow_null=True) id = serializers.SerializerMethodField() image = ThumbnailImageField(required=False, sizes={"small": (100,100)}) @@ -47,6 +47,7 @@ def to_representation(self, profile): class UserBaseSerializer(ModelSerializer): profile = JWTProfileSerializer(read_only=True) + avatar = AvatarField(required=False, allow_null=True, write_only=True) email_verification_required = serializers.SerializerMethodField() referral_code = serializers.SerializerMethodField() referred_by_code = serializers.CharField(required=False, allow_blank=True, write_only=True) @@ -55,6 +56,7 @@ class Meta: model = User fields = ( "id", + "avatar", "profile", "email", "is_email_verified", diff --git a/baseapp-auth/baseapp_auth/tests/integration/test_login.py b/baseapp-auth/baseapp_auth/tests/integration/test_login.py index 02f7b3b8..94cf0108 100644 --- a/baseapp-auth/baseapp_auth/tests/integration/test_login.py +++ b/baseapp-auth/baseapp_auth/tests/integration/test_login.py @@ -134,7 +134,7 @@ def test_jwt_token_contains_user_data(self, client, data): assert validated_token["id"] == user.id assert validated_token["email"] == user.email - assert validated_token["name"] == user.first_name + assert validated_token["profile"]["name"] == user.first_name + " " + user.last_name class TestLoginMfaAuthToken(TestLoginBase): diff --git a/baseapp-auth/baseapp_auth/tests/integration/test_users.py b/baseapp-auth/baseapp_auth/tests/integration/test_users.py index 32bd9327..dcba6e97 100644 --- a/baseapp-auth/baseapp_auth/tests/integration/test_users.py +++ b/baseapp-auth/baseapp_auth/tests/integration/test_users.py @@ -42,28 +42,45 @@ def test_object_keys_for_own_user(self, user_client): h.responseOk(r) expected = { "id", + "profile", "email", "is_email_verified", "email_verification_required", "new_email", "is_new_email_confirmed", "referral_code", - "avatar", - "name", "phone_number", "preferred_language", } actual = set(r.data.keys()) assert expected == actual + profile_expected = { + "id", + "name", + "image", + "url_path" + } + profile_actual = set(r.data["profile"].keys()) + assert profile_expected == profile_actual + def test_object_keys_for_other_user(self, user_client): user = UserFactory() r = user_client.get(self.reverse(kwargs={"pk": user.pk})) h.responseOk(r) - expected = {"id", "avatar", "name", "phone_number"} + expected = {"id", "profile", "phone_number"} actual = set(r.data.keys()) assert expected == actual + profile_expected = { + "id", + "name", + "image", + "url_path" + } + profile_actual = set(r.data["profile"].keys()) + assert profile_expected == profile_actual + class TestUsersUpdate(ApiMixin): view_name = "users-detail" @@ -138,7 +155,7 @@ def test_can_upload_avatar(self, user_client, image_base64): r = user_client.patch(self.reverse(kwargs={"pk": user_client.user.pk}), data) h.responseOk(r) user_client.user.profile.refresh_from_db() - assert user_client.user.profile.image is not None + assert bool(user_client.user.profile.image) is True def test_can_clear_avatar(self, user_client, image_djangofile): user_client.user.profile.image = image_djangofile @@ -167,7 +184,7 @@ def test_can_search(self, user_client): r = user_client.get(self.reverse(query_params={"q": "John Smith"})) h.responseOk(r) assert len(r.data["results"]) == 1 - assert r.data["results"][0]["name"] == "John" + assert r.data["results"][0]["profile"]["name"] == "John Smith" class TestUsersMe(ApiMixin): From 352011d3fc1b50beb1d91044128e88caf3fb2dfd Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Tue, 3 Dec 2024 14:11:24 -0500 Subject: [PATCH 09/15] update package version --- baseapp-auth/setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/baseapp-auth/setup.cfg b/baseapp-auth/setup.cfg index 5e1b1b37..b8f24f95 100644 --- a/baseapp-auth/setup.cfg +++ b/baseapp-auth/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = baseapp_auth -version = 0.4.9 +version = 0.4.10 description = BaseApp Auth long_description = file: README.md url = https://github.com/silverlogic/baseapp-backend From e34eea7f44ff878bfe565608cec36a4d2dea1fb0 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Tue, 3 Dec 2024 14:27:03 -0500 Subject: [PATCH 10/15] BA-1808 Remove whitespace --- baseapp-auth/baseapp_auth/rest_framework/users/serializers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py index f98556bb..8641bafe 100644 --- a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py +++ b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py @@ -28,7 +28,7 @@ class JWTProfileSerializer(serializers.ModelSerializer): Serializes minimal profile data that will be attached to the JWT token as claim """ url_path = serializers.SlugField(required=False, allow_null=True) - id = serializers.SerializerMethodField() + id = serializers.SerializerMethodField() image = ThumbnailImageField(required=False, sizes={"small": (100,100)}) class Meta: @@ -51,7 +51,7 @@ class UserBaseSerializer(ModelSerializer): 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 = ( From 72265298e6b833096dfd14bc694c279623b502b8 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Tue, 3 Dec 2024 14:38:10 -0500 Subject: [PATCH 11/15] BA-1808 Sort inputs, black --- .../rest_framework/users/serializers.py | 12 ++++++------ .../baseapp_auth/tests/integration/test_users.py | 14 ++------------ 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py index 8641bafe..1b5e7e99 100644 --- a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py +++ b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py @@ -1,11 +1,10 @@ -import swapper - from datetime import timedelta +import swapper 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_core.rest_framework.serializers import ModelSerializer 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 @@ -27,9 +26,10 @@ class JWTProfileSerializer(serializers.ModelSerializer): """ Serializes minimal profile data that will be attached to the JWT token as claim """ + url_path = serializers.SlugField(required=False, allow_null=True) id = serializers.SerializerMethodField() - image = ThumbnailImageField(required=False, sizes={"small": (100,100)}) + image = ThumbnailImageField(required=False, sizes={"small": (100, 100)}) class Meta: model = Profile @@ -40,8 +40,8 @@ def get_id(self, profile): def to_representation(self, profile): data = super().to_representation(profile) - if data['image'] is not None: - data['image'] = data['image']['small'] + if data["image"] is not None: + data["image"] = data["image"]["small"] return data diff --git a/baseapp-auth/baseapp_auth/tests/integration/test_users.py b/baseapp-auth/baseapp_auth/tests/integration/test_users.py index dcba6e97..032cb333 100644 --- a/baseapp-auth/baseapp_auth/tests/integration/test_users.py +++ b/baseapp-auth/baseapp_auth/tests/integration/test_users.py @@ -55,12 +55,7 @@ def test_object_keys_for_own_user(self, user_client): actual = set(r.data.keys()) assert expected == actual - profile_expected = { - "id", - "name", - "image", - "url_path" - } + profile_expected = {"id", "name", "image", "url_path"} profile_actual = set(r.data["profile"].keys()) assert profile_expected == profile_actual @@ -72,12 +67,7 @@ def test_object_keys_for_other_user(self, user_client): actual = set(r.data.keys()) assert expected == actual - profile_expected = { - "id", - "name", - "image", - "url_path" - } + profile_expected = {"id", "name", "image", "url_path"} profile_actual = set(r.data["profile"].keys()) assert profile_expected == profile_actual From 1e24e0d4de29e3f64e786fb88298a2a74ce6bb1c Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Thu, 5 Dec 2024 10:39:32 -0500 Subject: [PATCH 12/15] BA-1808 Revert change of get_token and serialize url_path explicitly --- .../baseapp_auth/rest_framework/jwt/serializers.py | 7 ++++--- .../baseapp_auth/rest_framework/users/serializers.py | 8 +++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/baseapp-auth/baseapp_auth/rest_framework/jwt/serializers.py b/baseapp-auth/baseapp_auth/rest_framework/jwt/serializers.py index eef80b0f..ee07c6a7 100644 --- a/baseapp-auth/baseapp_auth/rest_framework/jwt/serializers.py +++ b/baseapp-auth/baseapp_auth/rest_framework/jwt/serializers.py @@ -26,12 +26,13 @@ def get_claim_serializer_class(cls): class BaseJwtLoginSerializer( CustomClaimSerializerMixin, LoginPasswordExpirationMixin, TokenObtainPairSerializer ): - def get_token(self, user): + @classmethod + def get_token(cls, user): token = super().get_token(user) # Add custom claims - if self._claim_serializer_class: - data = self.get_claim_serializer_class()(user, context=self.context).data + if cls._claim_serializer_class: + data = cls.get_claim_serializer_class()(user).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 1b5e7e99..780cae64 100644 --- a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py +++ b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py @@ -27,8 +27,8 @@ class JWTProfileSerializer(serializers.ModelSerializer): Serializes minimal profile data that will be attached to the JWT token as claim """ - url_path = serializers.SlugField(required=False, allow_null=True) id = serializers.SerializerMethodField() + url_path = serializers.SerializerMethodField() image = ThumbnailImageField(required=False, sizes={"small": (100, 100)}) class Meta: @@ -38,6 +38,12 @@ class Meta: def get_id(self, profile): return get_obj_relay_id(profile) + def get_url_path(self, profile): + if hasattr(profile, 'url_path'): + return profile.url_path.path + else: + return None + def to_representation(self, profile): data = super().to_representation(profile) if data["image"] is not None: From 71249169716d54bdcc915a738fc311433b947844 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Thu, 5 Dec 2024 14:08:14 -0500 Subject: [PATCH 13/15] BA-1808 Profile serializer --- .../baseapp_auth/rest_framework/users/serializers.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py index 780cae64..174a198a 100644 --- a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py +++ b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py @@ -39,10 +39,8 @@ def get_id(self, profile): return get_obj_relay_id(profile) def get_url_path(self, profile): - if hasattr(profile, 'url_path'): - return profile.url_path.path - else: - return None + path_obj = getattr(profile, 'url_path', None) + return getattr(path_obj, 'path', None) def to_representation(self, profile): data = super().to_representation(profile) From 0ad92c72e9f6295603a16638d7fc943817aeb1e1 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Thu, 5 Dec 2024 16:49:38 -0500 Subject: [PATCH 14/15] BA-1808 Black --- baseapp-auth/baseapp_auth/rest_framework/users/serializers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py index 174a198a..0c72d508 100644 --- a/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py +++ b/baseapp-auth/baseapp_auth/rest_framework/users/serializers.py @@ -39,8 +39,8 @@ def get_id(self, profile): return get_obj_relay_id(profile) def get_url_path(self, profile): - path_obj = getattr(profile, 'url_path', None) - return getattr(path_obj, 'path', None) + path_obj = getattr(profile, "url_path", None) + return getattr(path_obj, "path", None) def to_representation(self, profile): data = super().to_representation(profile) From 7e693542b7917543fd6b7d5d609211618a67a892 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Thu, 5 Dec 2024 17:27:09 -0500 Subject: [PATCH 15/15] BA-1809 Bump profile version after rebasing --- baseapp-profiles/setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/baseapp-profiles/setup.cfg b/baseapp-profiles/setup.cfg index 5a69b252..8bf8f17e 100644 --- a/baseapp-profiles/setup.cfg +++ b/baseapp-profiles/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = baseapp_profiles -version = 0.3.2 +version = 0.3.3 description = BaseApp Profiles long_description = file: README.md long_description_content_type = text/markdown