From 02c3521dd11791489ed2aa9ce9861eb68826c6ab Mon Sep 17 00:00:00 2001 From: olivierdalang Date: Wed, 21 Apr 2021 17:02:14 +0200 Subject: [PATCH] Useraccount is not guaranteed to exist (e.g. teams) --- docker-app/qfieldcloud/core/permissions_utils.py | 6 +++--- docker-app/qfieldcloud/core/serializers.py | 12 ++++++++---- docker-app/qfieldcloud/core/views/auth_views.py | 5 ++++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/docker-app/qfieldcloud/core/permissions_utils.py b/docker-app/qfieldcloud/core/permissions_utils.py index 7d89c58f9..3a293153c 100644 --- a/docker-app/qfieldcloud/core/permissions_utils.py +++ b/docker-app/qfieldcloud/core/permissions_utils.py @@ -374,7 +374,7 @@ def can_become_collaborator(user: QfcUser, project: Project) -> bool: def can_read_geodb(user: QfcUser, profile: QfcUser) -> bool: - if not profile.useraccount.is_geodb_enabled: + if not hasattr(profile, "useraccount") or not profile.useraccount.is_geodb_enabled: return False if can_update_user(user, profile): @@ -384,7 +384,7 @@ def can_read_geodb(user: QfcUser, profile: QfcUser) -> bool: def can_create_geodb(user: QfcUser, profile: QfcUser) -> bool: - if not profile.useraccount.is_geodb_enabled: + if not hasattr(profile, "useraccount") or not profile.useraccount.is_geodb_enabled: return False if profile.has_geodb: @@ -397,7 +397,7 @@ def can_create_geodb(user: QfcUser, profile: QfcUser) -> bool: def can_delete_geodb(user: QfcUser, profile: QfcUser) -> bool: - if not profile.useraccount.is_geodb_enabled: + if not hasattr(profile, "useraccount") or not profile.useraccount.is_geodb_enabled: return False if not profile.has_geodb: diff --git a/docker-app/qfieldcloud/core/serializers.py b/docker-app/qfieldcloud/core/serializers.py index 3a64c1ce5..947bd8df7 100644 --- a/docker-app/qfieldcloud/core/serializers.py +++ b/docker-app/qfieldcloud/core/serializers.py @@ -66,7 +66,7 @@ class CompleteUserSerializer(serializers.ModelSerializer): avatar_url = serializers.SerializerMethodField() def get_avatar_url(self, obj): - return obj.useraccount.avatar_url + return obj.useraccount.avatar_url if hasattr(obj, "useraccount") else None class Meta: model = User @@ -86,7 +86,7 @@ class PublicInfoUserSerializer(serializers.ModelSerializer): avatar_url = serializers.SerializerMethodField() def get_avatar_url(self, obj): - return obj.useraccount.avatar_url + return obj.useraccount.avatar_url if hasattr(obj, "useraccount") else None class Meta: model = User @@ -100,7 +100,7 @@ class OrganizationSerializer(serializers.ModelSerializer): avatar_url = serializers.SerializerMethodField() def get_avatar_url(self, obj): - return obj.useraccount.avatar_url + return obj.useraccount.avatar_url if hasattr(obj, "useraccount") else None class Meta: model = Organization @@ -142,7 +142,11 @@ def get_email(self, obj): return obj.user.email def get_avatar_url(self, obj): - return obj.user.useraccount.avatar_url + return ( + obj.user.useraccount.avatar_url + if hasattr(obj.user, "useraccount") + else None + ) class Meta: model = Token diff --git a/docker-app/qfieldcloud/core/views/auth_views.py b/docker-app/qfieldcloud/core/views/auth_views.py index c6ba51fb7..b8332edf7 100644 --- a/docker-app/qfieldcloud/core/views/auth_views.py +++ b/docker-app/qfieldcloud/core/views/auth_views.py @@ -11,11 +11,14 @@ def post(self, request, *args, **kwargs): serializer.is_valid(raise_exception=True) user = serializer.validated_data["user"] token, created = Token.objects.get_or_create(user=user) + avatar_url = ( + user.useraccount.avatar_url if hasattr(user, "useraccount") else None + ) return Response( { "token": token.key, "username": user.username, "email": user.email, - "avatar_url": user.useraccount.avatar_url, + "avatar_url": avatar_url, } )