Skip to content
This repository has been archived by the owner on Jan 24, 2020. It is now read-only.

Use a setting for User model class. #1

Merged
merged 3 commits into from
Aug 13, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
build/
MANIFEST
dist/
dist/
.ropeproject/
3 changes: 3 additions & 0 deletions federated_login/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,6 @@
# @todo look if signals can provide the same flexibility
FL_USER_FACTORY = getattr(settings, 'FL_USER_FACTORY',
'federated_login.auth.user_factory')

FL_USER_CLASS = getattr(settings, 'FL_USER_CLASS',
'django.contrib.auth.models.User')
34 changes: 22 additions & 12 deletions federated_login/auth/backends.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
from django.contrib.auth.models import User
# -*- coding: utf-8 -*-
from openid.extensions import ax
from django.core.exceptions import ValidationError

from openid.extensions import ax
from federated_login import FL_CREATE_USERS, FL_USER_FACTORY
from federated_login import FL_CREATE_USERS, FL_USER_FACTORY, FL_USER_CLASS

__all__ = ['EmailBackend']

module, func_name = FL_USER_CLASS.rsplit('.', 1)
module = __import__(module, fromlist=[module])
UserClass = getattr(module, func_name)


class EmailBackend(object):
"""
Authenticate users based on a remotely verified e-mail address.
Expand All @@ -14,37 +19,42 @@ class EmailBackend(object):
remote users will be allowed to login. Optionally it can create a new
user if the e-mail address is verified but not listed.
"""

def authenticate(self, openid_response, **kwargs):
try:
fetch_res = ax.FetchResponse.fromSuccessResponse(openid_response)
email = fetch_res.getSingle('http://axschema.org/contact/email')
except AttributeError:
raise ValidationError, 'Did not receive email from the provider'
raise ValidationError('Did not receive email from the provider')

try:
return User.objects.get(email=email)
except User.DoesNotExist, err:
return UserClass.objects.get(email=email)
except UserClass.DoesNotExist:
if not FL_CREATE_USERS:
raise err
raise

first_name = fetch_res.getSingle('http://axschema.org/namePerson/first')
last_name = fetch_res.getSingle('http://axschema.org/namePerson/last')

return create_user(email=email,
first_name=fetch_res.getSingle('http://axschema.org/namePerson/first'),
last_name=fetch_res.getSingle('http://axschema.org/namePerson/last'))
first_name=first_name,
last_name=last_name)

def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return UserClass.objects.get(pk=user_id)
except UserClass.DoesNotExist:
return None


def create_user(first_name, last_name, **kwargs):
"""
Generates a username from the first and last name and returns the user
created by called user factory.
"""
username = '%s.%s' % (first_name[0].lower(), last_name.lower())
suffix = 1
while User.objects.filter(username=username).count() > 0:
while UserClass.objects.filter(username=username).count() > 0:
username = '%s.%s.%s' % (first_name[0].lower(), last_name.lower(),
suffix)
suffix += 1
Expand Down
10 changes: 8 additions & 2 deletions federated_login/auth/user_factory.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
from django.contrib.auth.models import User
# -*- coding: utf-8 -*-
from federated_login import FL_USER_CLASS

module, func_name = FL_USER_CLASS.rsplit('.', 1)
module = __import__(module, fromlist=[module])
UserClass = getattr(module, func_name)


def user_factory(**kwargs):
"""
Returns a new user with the given arguments.
"""
return User.objects.create(**kwargs)
return UserClass.objects.create(**kwargs)
3 changes: 2 additions & 1 deletion federated_login/urls.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.conf.urls.defaults import patterns, url
from django.conf import settings

urlpatterns = patterns('federated_login.views',
url(r'^sign-in/$', 'login', name='fl_login'),
url(r'^%s$' % settings.LOGIN_URL.lstrip('/'), 'login', name='fl_login'),
url(r'^identity/$', 'identity', name='fl_identity')
)