From f43a6b8d585b6c1669d7071b2e97670a287ac032 Mon Sep 17 00:00:00 2001 From: Nikolay Golub Date: Thu, 23 Jul 2015 22:22:39 +0300 Subject: [PATCH] move SocialAccount population to the separate method in the SocialLoginSerializer. It makes easier to get the correct signup for custom user models, because application can subclass SocialLoginSeriaLizer and add required fields to the instance. --- rest_auth/registration/serializers.py | 41 ++++++++++++++++++--------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/rest_auth/registration/serializers.py b/rest_auth/registration/serializers.py index e3c69ff..6e0d090 100644 --- a/rest_auth/registration/serializers.py +++ b/rest_auth/registration/serializers.py @@ -5,36 +5,49 @@ from allauth.socialaccount.helpers import complete_social_login class SocialLoginSerializer(serializers.Serializer): - access_token = serializers.CharField(required=True) + def _get_request(self): + request = self.context.get('request') + if not isinstance(request, HttpRequest): + request = request._request + return request + + def get_social_account(self, adapter, app, token, response): + """ + + :param adapter: allauth.socialaccount Adapter subclass. Usually OAuthAdapter or Auth2Adapter + :param app: `allauth.socialaccount.SocialApp` instance + :param token: `allauth.socialaccount.SocialToken` instance + :param response: Provider's response for OAuth1. Not used in the + :return: :return: A populated instance of the `allauth.socialaccount.SocialLogin` instance + """ + request = self._get_request() + social_login = adapter.complete_login(request, app, token, response=response) + social_login.token = token + return social_login + def validate(self, attrs): access_token = attrs.get('access_token') view = self.context.get('view') - request = self.context.get('request') - if not isinstance(request, HttpRequest): - request = request._request + request = self._get_request() if not view: raise serializers.ValidationError( 'View is not defined, pass it as a context variable' ) - self.adapter_class = getattr(view, 'adapter_class', None) - - if not self.adapter_class: + adapter_class = getattr(view, 'adapter_class', None) + if not adapter_class: raise serializers.ValidationError('Define adapter_class in view') - self.adapter = self.adapter_class() - app = self.adapter.get_provider().get_app(request) - token = self.adapter.parse_token({'access_token': access_token}) + adapter = adapter_class() + app = adapter.get_provider().get_app(request) + token = adapter.parse_token({'access_token': access_token}) token.app = app try: - login = self.adapter.complete_login(request, app, token, - response=access_token) - - login.token = token + login = self.get_social_account(adapter, app, token, access_token) complete_social_login(request, login) except HTTPError: raise serializers.ValidationError('Incorrect value')