123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- # coding=utf-8
- from functools import wraps
- from django.conf import settings
- from django.http import Http404
- from social_core.utils import setting_name, module_member, get_strategy
- from social_core.exceptions import MissingBackend
- from social_core.backends.utils import get_backend
- from .compat import reverse
- BACKENDS = settings.AUTHENTICATION_BACKENDS
- STRATEGY = getattr(settings, setting_name('STRATEGY'),
- 'social_django.strategy.DjangoStrategy')
- STORAGE = getattr(settings, setting_name('STORAGE'),
- 'social_django.models.DjangoStorage')
- Strategy = module_member(STRATEGY)
- Storage = module_member(STORAGE)
- def load_strategy(request=None):
- return get_strategy(STRATEGY, STORAGE, request)
- def load_backend(strategy, name, redirect_uri):
- Backend = get_backend(BACKENDS, name)
- return Backend(strategy, redirect_uri)
- def psa(redirect_uri=None, load_strategy=load_strategy):
- def decorator(func):
- @wraps(func)
- def wrapper(request, backend, *args, **kwargs):
- uri = redirect_uri
- if uri and not uri.startswith('/'):
- uri = reverse(redirect_uri, args=(backend,))
- request.social_strategy = load_strategy(request)
- # backward compatibility in attribute name, only if not already
- # defined
- if not hasattr(request, 'strategy'):
- request.strategy = request.social_strategy
- try:
- request.backend = load_backend(request.social_strategy,
- backend, uri)
- except MissingBackend:
- raise Http404('Backend not found')
- return func(request, backend, *args, **kwargs)
- return wrapper
- return decorator
|