From 99e642fa8ca9977e02753d2e1f7225f3793d449b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mat=C3=ADas=20Aguirre?= Date: Fri, 30 Dec 2011 15:56:53 -0200 Subject: [PATCH] Pipeline call cleanups --- social_auth/backends/__init__.py | 60 ++++++++++++++++---------------- social_auth/views.py | 13 ++++--- 2 files changed, 38 insertions(+), 35 deletions(-) diff --git a/social_auth/backends/__init__.py b/social_auth/backends/__init__.py index 83713ca..5008388 100644 --- a/social_auth/backends/__init__.py +++ b/social_auth/backends/__init__.py @@ -105,46 +105,46 @@ class SocialAuthBackend(ModelBackend): response = kwargs.get('response') details = self.get_user_details(response) uid = self.get_user_id(details, response) - user = kwargs.get('user') - request = kwargs.get('request') - - # Pipeline: - # Arguments: - # request, backend, social_user, uid, response, details - # user, is_new, args, kwargs - kwargs = kwargs.copy() - kwargs.update({ - 'backend': self, - 'request': request, - 'uid': uid, - 'user': user, - 'social_user': None, - 'response': response, - 'details': details, - 'is_new': False, - }) - for name in PIPELINE: + + out = self.pipeline(PIPELINE, backend=self, uid=uid, + social_user=None, details=details, + is_new=False, *args, **kwargs) + if not isinstance(out, dict): + return out + + social_user = out.get('social_user') + if social_user: + # define user.social_user attribute to track current social + # account + user = social_user.user + user.social_user = social_user + user.is_new = kwargs.get('is_new') + return user + + def pipeline(self, pipeline, request, *args, **kwargs): + """Pipeline""" + out = kwargs.copy() + + for name in pipeline: mod_name, func_name = name.rsplit('.', 1) try: mod = import_module(mod_name) except ImportError: logger.exception('Error importing pipeline %s', name) else: - pipeline = getattr(mod, func_name, None) - if callable(pipeline): + func = getattr(mod, func_name, None) + + if callable(func): try: - kwargs.update(pipeline(*args, **kwargs) or {}) + result = func(*args, **out) or {} except StopPipeline: break - social_user = kwargs.get('social_user') - if social_user: - # define user.social_user attribute to track current social - # account - user = social_user.user - user.social_user = social_user - user.is_new = kwargs.get('is_new') - return user + if isinstance(result, dict): + out.update(result) + else: + return result + return out def extra_data(self, user, uid, response, details): """Return default blank user extra data""" diff --git a/social_auth/views.py b/social_auth/views.py index d1f049e..6367f14 100644 --- a/social_auth/views.py +++ b/social_auth/views.py @@ -107,12 +107,16 @@ def associate(request, backend): @dsa_view() def associate_complete(request, backend, *args, **kwargs): """Authentication complete process""" - if auth_complete(request, backend, request.user, *args, **kwargs): + user = auth_complete(request, backend, request.user, *args, **kwargs) + + if not user: + url = LOGIN_ERROR_URL + elif isinstance(user, HttpResponse): + return user + else: url = NEW_ASSOCIATION_REDIRECT if NEW_ASSOCIATION_REDIRECT else \ request.session.pop(REDIRECT_FIELD_NAME, '') or \ DEFAULT_REDIRECT - else: - url = LOGIN_ERROR_URL return HttpResponseRedirect(url) @@ -191,5 +195,4 @@ def auth_complete(request, backend, user=None, *args, **kwargs): """Complete auth process. Return authenticated user or None.""" if user and not user.is_authenticated(): user = None - kwargs.update({'user': user, 'request': request}) - return backend.auth_complete(*args, **kwargs) + return backend.auth_complete(user=user, request=request, *args, **kwargs) -- 2.39.5