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"""
@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)
"""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)