From 73f0f1212dad5ba4c10cd89a351326d0f7971535 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 11 May 2025 12:55:33 -0700 Subject: [PATCH] Fixhancement: better handle removed social apps in profile (#9876) --- src/documents/tests/test_api_profile.py | 30 +++++++++++++++++++++++++ src/paperless/serialisers.py | 8 +++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/documents/tests/test_api_profile.py b/src/documents/tests/test_api_profile.py index 1075a0af8..8475459a2 100644 --- a/src/documents/tests/test_api_profile.py +++ b/src/documents/tests/test_api_profile.py @@ -136,6 +136,36 @@ class TestApiProfile(DirectoriesMixin, APITestCase): ], ) + def test_profile_w_social_removed_app(self): + """ + GIVEN: + - Configured user and setup social account + - Social app has been removed + WHEN: + - API call is made to get profile + THEN: + - Profile is returned with "Unknown App" as name + """ + self.setupSocialAccount() + + # Remove the social app + SocialApp.objects.get(provider_id="keycloak-test").delete() + + response = self.client.get(self.ENDPOINT) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + self.assertEqual( + response.data["social_accounts"], + [ + { + "id": 1, + "provider": "keycloak-test", + "name": "Unknown App", + }, + ], + ) + def test_update_profile(self): """ GIVEN: diff --git a/src/paperless/serialisers.py b/src/paperless/serialisers.py index dd315f4db..9943a76ee 100644 --- a/src/paperless/serialisers.py +++ b/src/paperless/serialisers.py @@ -4,6 +4,7 @@ from allauth.mfa.adapter import get_adapter as get_mfa_adapter from allauth.mfa.models import Authenticator from allauth.mfa.totp.internal.auth import TOTP from allauth.socialaccount.models import SocialAccount +from allauth.socialaccount.models import SocialApp from django.contrib.auth.models import Group from django.contrib.auth.models import Permission from django.contrib.auth.models import User @@ -146,8 +147,11 @@ class SocialAccountSerializer(serializers.ModelSerializer): "name", ) - def get_name(self, obj) -> str: - return obj.get_provider_account().to_str() + def get_name(self, obj: SocialAccount) -> str: + try: + return obj.get_provider_account().to_str() + except SocialApp.DoesNotExist: + return "Unknown App" class ProfileSerializer(serializers.ModelSerializer):