django-publicauth / publicauth / backends /

Full commit
offline 71953ab 

from django.utils.translation import ugettext as _
from django.contrib.auth.models import User
from django.contrib import auth
from django.conf import settings as global_settings

from annoying.exceptions import Redirect

from publicauth.models import PublicID
from publicauth.utils import str_to_class
from publicauth import settings

class BaseBackend(object):

    PROFILE_MAPPING = property(lambda self: getattr(global_settings, "%s_PROFILE_MAPPING" % self.provider.upper(), {}))

    def __init__(self, provider):
        self.provider = provider
        self._identity = None

    def set_identity(self, identity):
        self._identity = identity

    def get_identity(self):
        return self._identity

    def begin(self, request, data):

    def complete(self, request):
        Login user if its identity already exists,
        Create new user in case that no extra fields are required
        and user with such identity doesnt exists.
        Merge accounts if user already logged in and identity is new.
    def attach_account(self, request, user):
        Attach PublicID account to regular django 
        account and then login user.
        PublicID.objects.create(user=user, identity=self.get_identity(), provider=self.provider)
        request.flash['success'] =  _('OpenId record was added to your account')
        auth.authenticate(identity=self.get_identity(), provider=self.provider)
        auth.login(request, user)
        raise Redirect(global_settings.LOGIN_REDIRECT_URL)

    def login_user(self, request):
        if settings.PUBLICID_ACTIVATION_REQUIRED and not request.user.is_active:
            request.flash['error'] =  _('Your account is not activated. Please activate it first.')
            raise Redirect("/")
        user = auth.authenticate(identity=self.get_identity(), provider=self.provider)
        if user:
            request.flash['success'] =  _('You have successfully authenticated')
            auth.login(request, user)
            raise Redirect(global_settings.LOGIN_REDIRECT_URL)

    def set_profile_fields(self, request, extra):
        Try to fetch extra data from provider, if this data is enough
        to validate EXTRA_FORM then call save method of form class and 
        login user.
        data = {}

        for field in self.PROFILE_MAPPING:
            data.update(self.extract_data(extra, field))

        form = str_to_class(settings.PUBLICID_EXTRA_FORM)(data, fields=self.PROFILE_MAPPING)
        if form.is_valid():
  , self.provider)
            user = auth.authenticate(identity=self.get_identity(), provider=self.provider)
            if user:
                auth.login(request, user)
                    redirect_url = request.session['next_url']
                    del request.session['next_url']
                except KeyError:
                    redirect_url = global_settings.LOGIN_REDIRECT_URL
                raise Redirect(redirect_url)
            return data

    def extract_data(self, data, field):
            return {self.PROFILE_MAPPING[field][0]: data.get(field, '')}
        except AttributeError:
            return {self.PROFILE_MAPPING[field][0]: ''}

    def validate_response(self, request):